79 lines
1.6 KiB
Go
79 lines
1.6 KiB
Go
package media
|
|
|
|
import (
|
|
"encoding/json"
|
|
"log"
|
|
"m3u8-downloader/pkg/constants"
|
|
"os"
|
|
"sort"
|
|
)
|
|
|
|
type ManifestWriter struct {
|
|
ManifestPath string
|
|
Segments []ManifestItem
|
|
Index map[string]*ManifestItem
|
|
}
|
|
|
|
type ManifestItem struct {
|
|
SeqNo string `json:"seqNo"`
|
|
Resolution string `json:"resolution"`
|
|
}
|
|
|
|
func NewManifestWriter(eventName string) *ManifestWriter {
|
|
return &ManifestWriter{
|
|
ManifestPath: constants.ManifestPath + "/" + eventName + ".json",
|
|
Segments: make([]ManifestItem, 0),
|
|
Index: make(map[string]*ManifestItem),
|
|
}
|
|
}
|
|
|
|
func (m *ManifestWriter) AddOrUpdateSegment(seqNo string, resolution string) {
|
|
if m.Index == nil {
|
|
m.Index = make(map[string]*ManifestItem)
|
|
}
|
|
|
|
if m.Segments == nil {
|
|
m.Segments = make([]ManifestItem, 0)
|
|
}
|
|
|
|
if existing, ok := m.Index[seqNo]; ok {
|
|
if resolution > existing.Resolution {
|
|
existing.Resolution = resolution
|
|
}
|
|
return
|
|
} else {
|
|
item := ManifestItem{
|
|
SeqNo: seqNo,
|
|
Resolution: resolution,
|
|
}
|
|
m.Segments = append(m.Segments, item)
|
|
m.Index[seqNo] = &item
|
|
}
|
|
}
|
|
|
|
func (m *ManifestWriter) WriteManifest() {
|
|
sort.Slice(m.Segments, func(i, j int) bool {
|
|
return m.Segments[i].SeqNo < m.Segments[j].SeqNo
|
|
})
|
|
|
|
data, err := json.MarshalIndent(m.Segments, "", " ")
|
|
if err != nil {
|
|
log.Printf("Failed to marshal manifest: %v", err)
|
|
return
|
|
}
|
|
|
|
file, err := os.Create(m.ManifestPath)
|
|
if err != nil {
|
|
log.Printf("Failed to create manifest file: %v", err)
|
|
return
|
|
}
|
|
|
|
defer file.Close()
|
|
|
|
_, err = file.Write(data)
|
|
if err != nil {
|
|
log.Printf("Failed to write manifest file: %v", err)
|
|
return
|
|
}
|
|
}
|