streaming

Media streaming and broadcast systems in Go
Log | Files | Refs | README | LICENSE

commit 3faffc6a916cf7e63b45d795ef3c1d1be5441407
parent 896f60249033051fe531557d83031f3d0e2fa1c1
Author: Oliver Lowe <o@olowe.co>
Date:   Fri,  4 Jul 2025 22:05:53 +1000

m3u8: keep Rendition writing validation separate from Encode

Consistent with the rest of playlist fields.

While here delete duplicate Map writing function

Diffstat:
Mm3u8/write.go | 38++++++++++++++++++--------------------
1 file changed, 18 insertions(+), 20 deletions(-)

diff --git a/m3u8/write.go b/m3u8/write.go @@ -31,23 +31,9 @@ func Encode(w io.Writer, p *Playlist) error { } for _, r := range p.Media { - if r.Name == "" { - return fmt.Errorf("empty name") + if _, err := writeRendition(w, r); err != nil { + return fmt.Errorf("rendition %s: %w", r.Name, err) } - rname := fmt.Sprintf("rendition %s", r.Name) - if r.Type > MediaClosedCaptions { - return fmt.Errorf("%s: unknown type %s", rname, r.Type) - } - if r.Group == "" { - return fmt.Errorf("%s: empty group", rname) - } - if r.Type != MediaClosedCaptions && r.InstreamID != nil { - return fmt.Errorf("%s: instream-id set but type is %s", rname, r.Type) - } - if r.Type == MediaClosedCaptions && r.InstreamID == nil { - return fmt.Errorf("%s: nil instream-id", rname) - } - fmt.Fprintln(w, r) } for i, v := range p.Variants { @@ -84,6 +70,7 @@ func writeDateRange(w io.Writer, dr *DateRange) error { } else if dr.Start.IsZero() { return fmt.Errorf("zero start time") } + var attrs []string attrs = append(attrs, fmt.Sprintf("ID=%q", dr.ID)) attrs = append(attrs, fmt.Sprintf("START-DATE=%q", dr.Start.Format(rfc3339Milli))) @@ -125,11 +112,22 @@ func writeDateRange(w io.Writer, dr *DateRange) error { return err } -func writeMap(w io.Writer, m Map) (n int, err error) { - if m.ByteRange != [2]int{0, 0} { - return fmt.Fprintf(w, "%s:URI=%q,BYTERANGE=%s\n", tagMap, m.URI, m.ByteRange) +func writeRendition(w io.Writer, r Rendition) (n int, err error) { + if r.Name == "" { + return 0, fmt.Errorf("empty name") + } else if r.Group == "" { + return 0, fmt.Errorf("empty group") + } + + if r.Type > MediaClosedCaptions { + return 0, fmt.Errorf("unknown type %s", r.Type) + } + if r.Type != MediaClosedCaptions && r.InstreamID != nil { + return 0, fmt.Errorf("instream-id set but type is %s", r.Type) + } else if r.Type == MediaClosedCaptions && r.InstreamID == nil { + return 0, fmt.Errorf("nil instream-id") } - return fmt.Fprintf(w, "%s:URI=%q\n", tagMap, m.URI) + return fmt.Fprintln(w, r) } func writeSessionData(w io.Writer, sd SessionData) (n int, err error) {