package main import "fmt" import "os" import "github.com/grafov/m3u8" import "bufio" import "encoding/json" import "net/url" import "net/http" import "flag" import "log" import "strings" import "path" const baseScheme = "http" type m3u8Json struct { master *m3u8.MasterPlaylist playlist []*m3u8.MediaPlaylist } func main() { isUrl := false var data *bufio.Reader var baseUrl string var outputJson m3u8Json flag.Parse() inputs := flag.Args() if len(inputs) != 1 { log.Fatal("Only 1 input is allowed") } input := inputs[0] u, err := url.Parse(input) if err != nil { log.Fatal("not a valid URL") } if strings.Contains(u.Scheme, baseScheme) { isUrl = true } if ! isUrl { f, err := os.Open("playlist.m3u8") if err!= nil { log.Fatal(err) } fmt.Println("ok") data = bufio.NewReader(f) fmt.Println("ok2") } else { baseUrl = fmt.Sprintf("%v://%v%v",u.Scheme,u.Host,path.Dir(u.EscapedPath())) r, err := http.Get(u.String()) if err != nil { log.Fatal(err) } data = bufio.NewReader(r.Body) } p, listType, err := m3u8.DecodeFrom(data, true) if err != nil { log.Fatal(err) } switch listType { case m3u8.MEDIA: mediapl := p.(*m3u8.MediaPlaylist) fmt.Printf("%+v\n", mediapl) output, err := json.MarshalIndent(mediapl,""," ") if err != nil { log.Fatal(err) } fmt.Printf("%s",output) case m3u8.MASTER: outputJson.master = p.(*m3u8.MasterPlaylist) fmt.Printf("%+v\n", outputJson.master) for _, entry := range outputJson.master.Variants { fmt.Println(entry.Resolution) if isUrl { fmt.Printf("%v/%v\n",baseUrl,entry.URI) } } output, err := json.MarshalIndent(outputJson.master,""," ") if err != nil { log.Fatal(err) } fmt.Printf("%s",output) } }