diff --git a/reader.go b/reader.go index 86134762..615bd93c 100644 --- a/reader.go +++ b/reader.go @@ -325,6 +325,8 @@ func decodeLineOfMasterPlaylist(p *MasterPlaylist, state *decodingState, line st alt.Forced = v case "CHARACTERISTICS": alt.Characteristics = v + case "CHANNELS": + alt.Channels = v case "SUBTITLES": alt.Subtitles = v case "URI": diff --git a/structure.go b/structure.go index ea0d5c85..b105d597 100644 --- a/structure.go +++ b/structure.go @@ -193,6 +193,7 @@ type Alternative struct { Autoselect string Forced string Characteristics string + Channels string Subtitles string } diff --git a/writer.go b/writer.go index ae736067..dff31ce9 100644 --- a/writer.go +++ b/writer.go @@ -145,6 +145,11 @@ func (p *MasterPlaylist) Encode() *bytes.Buffer { p.buf.WriteString(alt.Characteristics) p.buf.WriteRune('"') } + if alt.Channels != "" { + p.buf.WriteString(",CHANNELS=\"") + p.buf.WriteString(alt.Channels) + p.buf.WriteRune('"') + } if alt.Subtitles != "" { p.buf.WriteString(",SUBTITLES=\"") p.buf.WriteString(alt.Subtitles) diff --git a/writer_test.go b/writer_test.go index bfa2a798..25a0b6ca 100644 --- a/writer_test.go +++ b/writer_test.go @@ -777,6 +777,7 @@ func TestNewMasterPlaylistWithAlternatives(t *testing.T) { Name: "main", Default: true, Autoselect: "YES", + Channels: "2", Language: "english", } p, e := NewMediaPlaylist(3, 5) @@ -794,7 +795,7 @@ func TestNewMasterPlaylistWithAlternatives(t *testing.T) { if m.ver != 4 { t.Fatalf("Expected version 4, actual, %d", m.ver) } - expected := `#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="audio",NAME="main",DEFAULT=YES,AUTOSELECT=YES,LANGUAGE="english",URI="800/rendition.m3u8"` + expected := `#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="audio",NAME="main",DEFAULT=YES,AUTOSELECT=YES,LANGUAGE="english",CHANNELS="2",URI="800/rendition.m3u8"` if !strings.Contains(m.String(), expected) { t.Fatalf("Master playlist did not contain: %s\nMaster Playlist:\n%v", expected, m.String()) }