From e76eabfd62919b48caa6a3825f89e3e56c4525af Mon Sep 17 00:00:00 2001 From: Kubo Ryosuke Date: Wed, 18 Dec 2024 12:08:13 +0900 Subject: [PATCH] Add Media Playlist methods --- master_playlist_tags.go | 8 ++++---- media_playlist_tags.go | 31 +++++++++++++++++++++++++++++++ media_playlist_tags_test.go | 17 +++++++++++++++++ 3 files changed, 52 insertions(+), 4 deletions(-) diff --git a/master_playlist_tags.go b/master_playlist_tags.go index acf024a..02cf867 100644 --- a/master_playlist_tags.go +++ b/master_playlist_tags.go @@ -10,10 +10,10 @@ import ( type MediaType string const ( - MediaTypeAudio = "AUDIO" - MediaTypeVideo = "VIDEO" - MediaTypeSubtitles = "SUBTITLES" - MediaTypeClosedCaptions = "CLOSED-CAPTIONS" + MediaTypeAudio MediaType = "AUDIO" + MediaTypeVideo MediaType = "VIDEO" + MediaTypeSubtitles MediaType = "SUBTITLES" + MediaTypeClosedCaptions MediaType = "CLOSED-CAPTIONS" ) // StreamInfAttrs represents the attributes of the EXT-X-STREAM-INF tag. diff --git a/media_playlist_tags.go b/media_playlist_tags.go index dbd57dc..1c041bd 100644 --- a/media_playlist_tags.go +++ b/media_playlist_tags.go @@ -8,6 +8,13 @@ import ( "time" ) +type MediaPlaylistType string + +const ( + MediaPlaylistTypeEvent MediaPlaylistType = "EVENT" + MediaPlaylistTypeVOD MediaPlaylistType = "VOD" +) + // MediaPlaylistTags represents the tags of a media playlist. type MediaPlaylistTags Tags @@ -57,6 +64,30 @@ func (tags MediaPlaylistTags) TargetDuration() int { return duration } +// SetTargetDuration sets the value of the EXT-X-TARGETDURATION tag. +func (tags MediaPlaylistTags) SetTargetDuration(duration int) { + tags[TagExtXTargetDuration] = []string{strconv.Itoa(duration)} +} + +// PlaylistType returns the value of the EXT-X-PLAYLIST-TYPE tag. +func (tags MediaPlaylistTags) PlaylistType() MediaPlaylistType { + values, ok := tags[TagExtXPlaylistType] + if !ok || len(values) == 0 { + return "" + } + return MediaPlaylistType(values[0]) +} + +// SetPlaylistType sets the value of the EXT-X-PLAYLIST-TYPE tag. +func (tags MediaPlaylistTags) SetPlaylistType(playlistType MediaPlaylistType) { + tags[TagExtXPlaylistType] = []string{string(playlistType)} +} + +// RemovePlaylistType removes the EXT-X-PLAYLIST-TYPE tag. +func (tags MediaPlaylistTags) RemovePlaylistType() { + delete(tags, TagExtXPlaylistType) +} + // MediaSequence returns the value of the EXT-X-MEDIA-SEQUENCE tag. func (tags MediaPlaylistTags) MediaSequence() int64 { values, ok := tags[TagExtXMediaSequence] diff --git a/media_playlist_tags_test.go b/media_playlist_tags_test.go index 0b8eb0c..ff16ecb 100644 --- a/media_playlist_tags_test.go +++ b/media_playlist_tags_test.go @@ -13,19 +13,36 @@ func TestMediaPlaylistTags(t *testing.T) { tags := MediaPlaylistTags{ "EXT-X-VERSION": []string{"4"}, "EXT-X-TARGETDURATION": []string{"12"}, + "EXT-X-PLAYLIST-TYPE": []string{"VOD"}, "EXT-X-MEDIA-SEQUENCE": []string{"12345"}, "EXT-X-DISCONTINUITY-SEQUENCE": []string{"123"}, } assert.Equal(t, int(4), tags.Version()) assert.Equal(t, 12, tags.TargetDuration()) + assert.Equal(t, MediaPlaylistTypeVOD, tags.PlaylistType()) assert.Equal(t, int64(12345), tags.MediaSequence()) assert.Equal(t, int64(123), tags.DiscontinuitySequence()) }) t.Run("setters", func(t *testing.T) { tags := make(MediaPlaylistTags) + tags.SetPlaylistType(MediaPlaylistTypeEvent) tags.SetMediaSequence(12345) tags.SetDiscontinuitySequence(123) + assert.Equal(t, MediaPlaylistTags{ + "EXT-X-PLAYLIST-TYPE": []string{"EVENT"}, + "EXT-X-MEDIA-SEQUENCE": []string{"12345"}, + "EXT-X-DISCONTINUITY-SEQUENCE": []string{"123"}, + }, tags) + }) + + t.Run("removers", func(t *testing.T) { + tags := MediaPlaylistTags{ + "EXT-X-PLAYLIST-TYPE": []string{"EVENT"}, + "EXT-X-MEDIA-SEQUENCE": []string{"12345"}, + "EXT-X-DISCONTINUITY-SEQUENCE": []string{"123"}, + } + tags.RemovePlaylistType() assert.Equal(t, MediaPlaylistTags{ "EXT-X-MEDIA-SEQUENCE": []string{"12345"}, "EXT-X-DISCONTINUITY-SEQUENCE": []string{"123"},