| 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) | |||||
| } | |||||
| } |