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