| @@ -0,0 +1,88 @@ | |||
| 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) | |||
| } | |||
| } | |||