package main import ( "bufio" "encoding/json" "flag" "fmt" "log" "net/http" "net/url" "os" "path" "strings" "github.com/grafov/m3u8" ) 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) } }