From 07382336ca1cfd641c20b71947be0bd8deec02af Mon Sep 17 00:00:00 2001 From: Ivan Egorov Date: Wed, 25 Nov 2020 14:27:20 +0300 Subject: [PATCH 1/4] increase playlist size from 1024 to 8*1024; --- reader.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reader.go b/reader.go index b19324eb..ce6d3e47 100644 --- a/reader.go +++ b/reader.go @@ -193,7 +193,7 @@ func decode(buf *bytes.Buffer, strict bool, customDecoders []CustomDecoder) (Pla wv := new(WV) master = NewMasterPlaylist() - media, err = NewMediaPlaylist(8, 1024) // Winsize for VoD will become 0, capacity auto extends + media, err = NewMediaPlaylist(8, 8*1024) // Winsize for VoD will become 0, capacity auto extends if err != nil { return nil, 0, fmt.Errorf("Create media playlist failed: %s", err) } From f7a65fe9701f6db1b3009646bbf077421116d623 Mon Sep 17 00:00:00 2001 From: Ivan Egorov Date: Wed, 25 Nov 2020 14:34:13 +0300 Subject: [PATCH 2/4] Add channels attribute to Alternative. Represents EXT-X-MEDIA CHANNELS attribute. --- structure.go | 1 + writer.go | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/structure.go b/structure.go index eb5d01a2..7a8d9380 100644 --- a/structure.go +++ b/structure.go @@ -193,6 +193,7 @@ type Alternative struct { Language string Name string Default bool + Channels string Autoselect string Forced string Characteristics string diff --git a/writer.go b/writer.go index dec3690c..e2819e07 100644 --- a/writer.go +++ b/writer.go @@ -126,6 +126,11 @@ func (p *MasterPlaylist) Encode() *bytes.Buffer { } else { p.buf.WriteString("NO") } + if alt.Channels != "" { + p.buf.WriteString(",CHANNELS=\"") + p.buf.WriteString(alt.Channels) + p.buf.WriteRune('"') + } if alt.Autoselect != "" { p.buf.WriteString(",AUTOSELECT=") p.buf.WriteString(alt.Autoselect) From 180dc61506ccc92d7743bc99952a3c855999273b Mon Sep 17 00:00:00 2001 From: Ivan Egorov Date: Wed, 25 Nov 2020 14:36:34 +0300 Subject: [PATCH 3/4] Increase power of altKey via URI; use-case: two different eng subtitles tracks; --- writer.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/writer.go b/writer.go index e2819e07..f2008db8 100644 --- a/writer.go +++ b/writer.go @@ -99,7 +99,7 @@ func (p *MasterPlaylist) Encode() *bytes.Buffer { if pl.Alternatives != nil { for _, alt := range pl.Alternatives { // Make sure that we only write out an alternative once - altKey := fmt.Sprintf("%s-%s-%s-%s", alt.Type, alt.GroupId, alt.Name, alt.Language) + altKey := fmt.Sprintf("%s-%s-%s-%s-%s", alt.Type, alt.GroupId, alt.Name, alt.Language, alt.URI) if altsWritten[altKey] { continue } From db489eacdbe7cd5e53e19e59a7ac8103d862bb60 Mon Sep 17 00:00:00 2001 From: Ivan Egorov Date: Wed, 25 Nov 2020 14:37:49 +0300 Subject: [PATCH 4/4] use map[]struct{} instead of map[]bool for altsWritten as set implementation; --- writer.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/writer.go b/writer.go index f2008db8..8f191183 100644 --- a/writer.go +++ b/writer.go @@ -93,17 +93,17 @@ func (p *MasterPlaylist) Encode() *bytes.Buffer { } } - var altsWritten = make(map[string]bool) + var altsWritten = make(map[string]struct{}) for _, pl := range p.Variants { if pl.Alternatives != nil { for _, alt := range pl.Alternatives { // Make sure that we only write out an alternative once altKey := fmt.Sprintf("%s-%s-%s-%s-%s", alt.Type, alt.GroupId, alt.Name, alt.Language, alt.URI) - if altsWritten[altKey] { + if _, alreadyWritten := altsWritten[altKey]; alreadyWritten { continue } - altsWritten[altKey] = true + altsWritten[altKey] = struct{}{} p.buf.WriteString("#EXT-X-MEDIA:") if alt.Type != "" {