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