You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

main.go 1.7KB

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