您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. package main
  2. import (
  3. "bufio"
  4. "encoding/json"
  5. "flag"
  6. "fmt"
  7. "log"
  8. "net/http"
  9. "net/url"
  10. "os"
  11. "path"
  12. "strings"
  13. "github.com/grafov/m3u8"
  14. )
  15. const baseScheme = "http"
  16. type m3u8Json struct {
  17. master *m3u8.MasterPlaylist
  18. playlist []*m3u8.MediaPlaylist
  19. }
  20. func main() {
  21. isUrl := false
  22. var data *bufio.Reader
  23. var baseUrl string
  24. var outputJson m3u8Json
  25. flag.Parse()
  26. inputs := flag.Args()
  27. if len(inputs) != 1 {
  28. log.Fatal("Only 1 input is allowed")
  29. }
  30. input := inputs[0]
  31. u, err := url.Parse(input)
  32. if err != nil {
  33. log.Fatal("not a valid URL")
  34. }
  35. if strings.Contains(u.Scheme, baseScheme) {
  36. isUrl = true
  37. }
  38. if !isUrl {
  39. f, err := os.Open("playlist.m3u8")
  40. if err != nil {
  41. log.Fatal(err)
  42. }
  43. fmt.Println("ok")
  44. data = bufio.NewReader(f)
  45. fmt.Println("ok2")
  46. } else {
  47. baseUrl = fmt.Sprintf("%v://%v%v", u.Scheme, u.Host, path.Dir(u.EscapedPath()))
  48. r, err := http.Get(u.String())
  49. if err != nil {
  50. log.Fatal(err)
  51. }
  52. data = bufio.NewReader(r.Body)
  53. }
  54. p, listType, err := m3u8.DecodeFrom(data, true)
  55. if err != nil {
  56. log.Fatal(err)
  57. }
  58. switch listType {
  59. case m3u8.MEDIA:
  60. mediapl := p.(*m3u8.MediaPlaylist)
  61. fmt.Printf("%+v\n", mediapl)
  62. output, err := json.MarshalIndent(mediapl, "", " ")
  63. if err != nil {
  64. log.Fatal(err)
  65. }
  66. fmt.Printf("%s", output)
  67. case m3u8.MASTER:
  68. outputJson.master = p.(*m3u8.MasterPlaylist)
  69. fmt.Printf("%+v\n", outputJson.master)
  70. for _, entry := range outputJson.master.Variants {
  71. fmt.Println(entry.Resolution)
  72. if isUrl {
  73. fmt.Printf("%v/%v\n", baseUrl, entry.URI)
  74. }
  75. }
  76. output, err := json.MarshalIndent(outputJson.master, "", " ")
  77. if err != nil {
  78. log.Fatal(err)
  79. }
  80. fmt.Printf("%s", output)
  81. }
  82. }