m3u8d/m3u8.go

72 lines
1.4 KiB
Go
Raw Normal View History

2023-05-15 01:26:38 +00:00
package m3u8d
import (
"strconv"
"strings"
)
type EncryptInfo struct {
Method string
Key []byte
Iv []byte
}
type M3u8Content struct {
PartList []M3u8Part `json:",omitempty"`
TsList []string `json:",omitempty"`
}
type M3u8Part struct {
Tag string `json:",omitempty"`
TextFull string `json:",omitempty"`
KeyValue map[string]string `json:",omitempty"`
}
func (info M3u8Content) GetPart(tag string) M3u8Part {
for _, one := range info.PartList {
if one.Tag == tag {
return one
}
}
return M3u8Part{}
}
func M3u8Parse(content string) (info M3u8Content) {
for _, line := range splitLineWithTrimSpace(content) {
if strings.HasPrefix(line, "#") == false {
continue
}
tmp := strings.SplitN(line, ":", 2)
if len(tmp) < 2 {
info.PartList = append(info.PartList, M3u8Part{
Tag: tmp[0],
})
continue
}
var p M3u8Part
p.Tag = tmp[0]
p.TextFull = strings.TrimSpace(tmp[1])
for _, kv := range strings.Split(tmp[1], ",") {
data := strings.SplitN(kv, "=", 2)
if len(data) < 2 {
continue
}
key := data[0]
value := strings.TrimSpace(data[1])
if strings.HasPrefix(value, "\"") {
var err error
value, err = strconv.Unquote(value)
if err != nil {
continue
}
}
if p.KeyValue == nil {
p.KeyValue = map[string]string{}
}
p.KeyValue[key] = value
}
info.PartList = append(info.PartList, p)
}
return info
}