@ -1,5 +1,6 @@
using ErsatzTV.Core.FFmpeg ;
using ErsatzTV.Core.FFmpeg ;
using ErsatzTV.Core.Interfaces.FFmpeg ;
using ErsatzTV.Core.Interfaces.FFmpeg ;
using ErsatzTV.FFmpeg.OutputFormat ;
using Microsoft.Extensions.Logging ;
using Microsoft.Extensions.Logging ;
using NSubstitute ;
using NSubstitute ;
using NUnit.Framework ;
using NUnit.Framework ;
@ -25,7 +26,7 @@ public class HlsPlaylistFilterTests
var start = new DateTimeOffset ( 2 0 2 1 , 1 0 , 9 , 8 , 0 , 0 , TimeSpan . FromHours ( - 5 ) ) ;
var start = new DateTimeOffset ( 2 0 2 1 , 1 0 , 9 , 8 , 0 , 0 , TimeSpan . FromHours ( - 5 ) ) ;
string [ ] input = NormalizeLineEndings (
string [ ] input = NormalizeLineEndings (
@ "#EXTM3U
@ "#EXTM3U
# EXT - X - VERSION : 6
# EXT - X - VERSION : 7
# EXT - X - TARGETDURATION : 4
# EXT - X - TARGETDURATION : 4
# EXT - X - MEDIA - SEQUENCE : 1 1 3 7
# EXT - X - MEDIA - SEQUENCE : 1 1 3 7
# EXT - X - INDEPENDENT - SEGMENTS
# EXT - X - INDEPENDENT - SEGMENTS
@ -40,14 +41,19 @@ live001138.ts
# EXT - X - PROGRAM - DATE - TIME : 2 0 2 1 - 1 0 - 0 8 T08 : 3 4 : 5 7.320 - 0 5 0 0
# EXT - X - PROGRAM - DATE - TIME : 2 0 2 1 - 1 0 - 0 8 T08 : 3 4 : 5 7.320 - 0 5 0 0
live001139 . ts ").Split(Environment.NewLine);
live001139 . ts ").Split(Environment.NewLine);
TrimPlaylistResult result = _ hlsPlaylistFilter . TrimPlaylist ( start , start . AddSeconds ( - 3 0 ) , input ) ;
TrimPlaylistResult result = _ hlsPlaylistFilter . TrimPlaylist (
OutputFormatKind . Hls ,
start ,
start . AddSeconds ( - 3 0 ) ,
[] ,
input ) ;
result . PlaylistStart . ShouldBe ( start ) ;
result . PlaylistStart . ShouldBe ( start ) ;
result . Sequence . ShouldBe ( 1 1 3 7 ) ;
result . Sequence . ShouldBe ( 1 1 3 7 ) ;
result . Playlist . ShouldBe (
result . Playlist . ShouldBe (
NormalizeLineEndings (
NormalizeLineEndings (
@ "#EXTM3U
@ "#EXTM3U
# EXT - X - VERSION : 6
# EXT - X - VERSION : 7
# EXT - X - TARGETDURATION : 4
# EXT - X - TARGETDURATION : 4
# EXT - X - MEDIA - SEQUENCE : 1 1 3 7
# EXT - X - MEDIA - SEQUENCE : 1 1 3 7
# EXT - X - DISCONTINUITY - SEQUENCE : 1
# EXT - X - DISCONTINUITY - SEQUENCE : 1
@ -70,7 +76,7 @@ live001139.ts
var start = new DateTimeOffset ( 2 0 2 1 , 1 0 , 9 , 8 , 0 , 0 , TimeSpan . FromHours ( - 5 ) ) ;
var start = new DateTimeOffset ( 2 0 2 1 , 1 0 , 9 , 8 , 0 , 0 , TimeSpan . FromHours ( - 5 ) ) ;
string [ ] input = NormalizeLineEndings (
string [ ] input = NormalizeLineEndings (
@ "#EXTM3U
@ "#EXTM3U
# EXT - X - VERSION : 6
# EXT - X - VERSION : 7
# EXT - X - TARGETDURATION : 4
# EXT - X - TARGETDURATION : 4
# EXT - X - MEDIA - SEQUENCE : 1 1 3 7
# EXT - X - MEDIA - SEQUENCE : 1 1 3 7
# EXT - X - INDEPENDENT - SEGMENTS
# EXT - X - INDEPENDENT - SEGMENTS
@ -85,14 +91,20 @@ live001138.ts
# EXT - X - PROGRAM - DATE - TIME : 2 0 2 1 - 1 0 - 0 8 T08 : 3 4 : 5 7.320 - 0 5 0 0
# EXT - X - PROGRAM - DATE - TIME : 2 0 2 1 - 1 0 - 0 8 T08 : 3 4 : 5 7.320 - 0 5 0 0
live001139 . ts ").Split(Environment.NewLine);
live001139 . ts ").Split(Environment.NewLine);
TrimPlaylistResult result = _ hlsPlaylistFilter . TrimPlaylist ( start , start . AddSeconds ( - 3 0 ) , input , 2 ) ;
TrimPlaylistResult result = _ hlsPlaylistFilter . TrimPlaylist (
OutputFormatKind . Hls ,
start ,
start . AddSeconds ( - 3 0 ) ,
[] ,
input ,
2 ) ;
result . PlaylistStart . ShouldBe ( start ) ;
result . PlaylistStart . ShouldBe ( start ) ;
result . Sequence . ShouldBe ( 1 1 3 7 ) ;
result . Sequence . ShouldBe ( 1 1 3 7 ) ;
result . Playlist . ShouldBe (
result . Playlist . ShouldBe (
NormalizeLineEndings (
NormalizeLineEndings (
@ "#EXTM3U
@ "#EXTM3U
# EXT - X - VERSION : 6
# EXT - X - VERSION : 7
# EXT - X - TARGETDURATION : 4
# EXT - X - TARGETDURATION : 4
# EXT - X - MEDIA - SEQUENCE : 1 1 3 7
# EXT - X - MEDIA - SEQUENCE : 1 1 3 7
# EXT - X - DISCONTINUITY - SEQUENCE : 1
# EXT - X - DISCONTINUITY - SEQUENCE : 1
@ -112,7 +124,7 @@ live001138.ts
var start = new DateTimeOffset ( 2 0 2 1 , 1 0 , 9 , 8 , 0 , 0 , TimeSpan . FromHours ( - 5 ) ) ;
var start = new DateTimeOffset ( 2 0 2 1 , 1 0 , 9 , 8 , 0 , 0 , TimeSpan . FromHours ( - 5 ) ) ;
string [ ] input = NormalizeLineEndings (
string [ ] input = NormalizeLineEndings (
@ "#EXTM3U
@ "#EXTM3U
# EXT - X - VERSION : 6
# EXT - X - VERSION : 7
# EXT - X - TARGETDURATION : 4
# EXT - X - TARGETDURATION : 4
# EXT - X - MEDIA - SEQUENCE : 1 1 3 7
# EXT - X - MEDIA - SEQUENCE : 1 1 3 7
# EXT - X - INDEPENDENT - SEGMENTS
# EXT - X - INDEPENDENT - SEGMENTS
@ -128,8 +140,10 @@ live001138.ts
live001139 . ts ").Split(Environment.NewLine);
live001139 . ts ").Split(Environment.NewLine);
TrimPlaylistResult result = _ hlsPlaylistFilter . TrimPlaylist (
TrimPlaylistResult result = _ hlsPlaylistFilter . TrimPlaylist (
OutputFormatKind . Hls ,
start ,
start ,
start . AddSeconds ( - 3 0 ) ,
start . AddSeconds ( - 3 0 ) ,
[] ,
input ,
input ,
int . MaxValue ,
int . MaxValue ,
true ) ;
true ) ;
@ -139,7 +153,7 @@ live001139.ts").Split(Environment.NewLine);
result . Playlist . ShouldBe (
result . Playlist . ShouldBe (
NormalizeLineEndings (
NormalizeLineEndings (
@ "#EXTM3U
@ "#EXTM3U
# EXT - X - VERSION : 6
# EXT - X - VERSION : 7
# EXT - X - TARGETDURATION : 4
# EXT - X - TARGETDURATION : 4
# EXT - X - MEDIA - SEQUENCE : 1 1 3 7
# EXT - X - MEDIA - SEQUENCE : 1 1 3 7
# EXT - X - DISCONTINUITY - SEQUENCE : 1
# EXT - X - DISCONTINUITY - SEQUENCE : 1
@ -163,7 +177,7 @@ live001139.ts
var start = new DateTimeOffset ( 2 0 2 1 , 1 0 , 9 , 8 , 0 , 0 , TimeSpan . FromHours ( - 5 ) ) ;
var start = new DateTimeOffset ( 2 0 2 1 , 1 0 , 9 , 8 , 0 , 0 , TimeSpan . FromHours ( - 5 ) ) ;
string [ ] input = NormalizeLineEndings (
string [ ] input = NormalizeLineEndings (
@ "#EXTM3U
@ "#EXTM3U
# EXT - X - VERSION : 6
# EXT - X - VERSION : 7
# EXT - X - TARGETDURATION : 4
# EXT - X - TARGETDURATION : 4
# EXT - X - MEDIA - SEQUENCE : 1 1 3 7
# EXT - X - MEDIA - SEQUENCE : 1 1 3 7
# EXT - X - INDEPENDENT - SEGMENTS
# EXT - X - INDEPENDENT - SEGMENTS
@ -178,14 +192,20 @@ live001138.ts
# EXT - X - PROGRAM - DATE - TIME : 2 0 2 1 - 1 0 - 0 8 T08 : 3 4 : 5 7.320 - 0 5 0 0
# EXT - X - PROGRAM - DATE - TIME : 2 0 2 1 - 1 0 - 0 8 T08 : 3 4 : 5 7.320 - 0 5 0 0
live001139 . ts ").Split(Environment.NewLine);
live001139 . ts ").Split(Environment.NewLine);
TrimPlaylistResult result = _ hlsPlaylistFilter . TrimPlaylist ( start , start . AddSeconds ( 6 ) , input , 1 ) ;
TrimPlaylistResult result = _ hlsPlaylistFilter . TrimPlaylist (
OutputFormatKind . Hls ,
start ,
start . AddSeconds ( 6 ) ,
[] ,
input ,
1 ) ;
result . PlaylistStart . ShouldBe ( start . AddSeconds ( 8 ) ) ;
result . PlaylistStart . ShouldBe ( start . AddSeconds ( 8 ) ) ;
result . Sequence . ShouldBe ( 1 1 3 9 ) ;
result . Sequence . ShouldBe ( 1 1 3 9 ) ;
result . Playlist . ShouldBe (
result . Playlist . ShouldBe (
NormalizeLineEndings (
NormalizeLineEndings (
@ "#EXTM3U
@ "#EXTM3U
# EXT - X - VERSION : 6
# EXT - X - VERSION : 7
# EXT - X - TARGETDURATION : 4
# EXT - X - TARGETDURATION : 4
# EXT - X - MEDIA - SEQUENCE : 1 1 3 9
# EXT - X - MEDIA - SEQUENCE : 1 1 3 9
# EXT - X - DISCONTINUITY - SEQUENCE : 1
# EXT - X - DISCONTINUITY - SEQUENCE : 1
@ -202,7 +222,7 @@ live001139.ts
var start = new DateTimeOffset ( 2 0 2 1 , 1 0 , 9 , 8 , 0 , 0 , TimeSpan . FromHours ( - 5 ) ) ;
var start = new DateTimeOffset ( 2 0 2 1 , 1 0 , 9 , 8 , 0 , 0 , TimeSpan . FromHours ( - 5 ) ) ;
string [ ] input = NormalizeLineEndings (
string [ ] input = NormalizeLineEndings (
@ "#EXTM3U
@ "#EXTM3U
# EXT - X - VERSION : 6
# EXT - X - VERSION : 7
# EXT - X - TARGETDURATION : 4
# EXT - X - TARGETDURATION : 4
# EXT - X - MEDIA - SEQUENCE : 1 1 3 7
# EXT - X - MEDIA - SEQUENCE : 1 1 3 7
# EXT - X - INDEPENDENT - SEGMENTS
# EXT - X - INDEPENDENT - SEGMENTS
@ -218,14 +238,19 @@ live001138.ts
# EXT - X - PROGRAM - DATE - TIME : 2 0 2 1 - 1 0 - 0 8 T08 : 3 4 : 5 7.320 - 0 5 0 0
# EXT - X - PROGRAM - DATE - TIME : 2 0 2 1 - 1 0 - 0 8 T08 : 3 4 : 5 7.320 - 0 5 0 0
live001139 . ts ").Split(Environment.NewLine);
live001139 . ts ").Split(Environment.NewLine);
TrimPlaylistResult result = _ hlsPlaylistFilter . TrimPlaylist ( start , start . AddSeconds ( 6 ) , input ) ;
TrimPlaylistResult result = _ hlsPlaylistFilter . TrimPlaylist (
OutputFormatKind . Hls ,
start ,
start . AddSeconds ( 6 ) ,
[] ,
input ) ;
result . PlaylistStart . ShouldBe ( start ) ;
result . PlaylistStart . ShouldBe ( start ) ;
result . Sequence . ShouldBe ( 1 1 3 7 ) ;
result . Sequence . ShouldBe ( 1 1 3 7 ) ;
result . Playlist . ShouldBe (
result . Playlist . ShouldBe (
NormalizeLineEndings (
NormalizeLineEndings (
@ "#EXTM3U
@ "#EXTM3U
# EXT - X - VERSION : 6
# EXT - X - VERSION : 7
# EXT - X - TARGETDURATION : 4
# EXT - X - TARGETDURATION : 4
# EXT - X - MEDIA - SEQUENCE : 1 1 3 7
# EXT - X - MEDIA - SEQUENCE : 1 1 3 7
# EXT - X - DISCONTINUITY - SEQUENCE : 1
# EXT - X - DISCONTINUITY - SEQUENCE : 1
@ -249,7 +274,7 @@ live001139.ts
var start = new DateTimeOffset ( 2 0 2 2 , 5 , 2 5 , 2 0 , 8 , 0 , TimeSpan . FromHours ( - 5 ) ) ;
var start = new DateTimeOffset ( 2 0 2 2 , 5 , 2 5 , 2 0 , 8 , 0 , TimeSpan . FromHours ( - 5 ) ) ;
string [ ] input = NormalizeLineEndings (
string [ ] input = NormalizeLineEndings (
@ "#EXTM3U
@ "#EXTM3U
# EXT - X - VERSION : 6
# EXT - X - VERSION : 7
# EXT - X - TARGETDURATION : 4
# EXT - X - TARGETDURATION : 4
# EXT - X - MEDIA - SEQUENCE : 0
# EXT - X - MEDIA - SEQUENCE : 0
# EXT - X - DISCONTINUITY
# EXT - X - DISCONTINUITY
@ -506,14 +531,19 @@ live000081.ts
# EXT - X - PROGRAM - DATE - TIME : 2 0 2 2 - 0 5 - 2 5 T20 : 1 3 : 2 6.007 - 0 5 0 0
# EXT - X - PROGRAM - DATE - TIME : 2 0 2 2 - 0 5 - 2 5 T20 : 1 3 : 2 6.007 - 0 5 0 0
live000082 . ts ").Split(Environment.NewLine);
live000082 . ts ").Split(Environment.NewLine);
TrimPlaylistResult result = _ hlsPlaylistFilter . TrimPlaylist ( start , start . AddSeconds ( 2 2 0 ) , input ) ;
TrimPlaylistResult result = _ hlsPlaylistFilter . TrimPlaylist (
OutputFormatKind . Hls ,
start ,
start . AddSeconds ( 2 2 0 ) ,
[] ,
input ) ;
// result.PlaylistStart.ShouldBe(start);
// result.PlaylistStart.ShouldBe(start);
result . Sequence . ShouldBe ( 5 6 ) ;
result . Sequence . ShouldBe ( 5 6 ) ;
result . Playlist . ShouldBe (
result . Playlist . ShouldBe (
NormalizeLineEndings (
NormalizeLineEndings (
@ "#EXTM3U
@ "#EXTM3U
# EXT - X - VERSION : 6
# EXT - X - VERSION : 7
# EXT - X - TARGETDURATION : 4
# EXT - X - TARGETDURATION : 4
# EXT - X - MEDIA - SEQUENCE : 5 6
# EXT - X - MEDIA - SEQUENCE : 5 6
# EXT - X - DISCONTINUITY - SEQUENCE : 2
# EXT - X - DISCONTINUITY - SEQUENCE : 2
@ -557,7 +587,7 @@ live000065.ts
var start = new DateTimeOffset ( 2 0 2 5 , 9 , 1 7 , 1 0 , 1 1 , 5 , 3 1 , TimeSpan . FromHours ( - 5 ) ) ;
var start = new DateTimeOffset ( 2 0 2 5 , 9 , 1 7 , 1 0 , 1 1 , 5 , 3 1 , TimeSpan . FromHours ( - 5 ) ) ;
string [ ] input = NormalizeLineEndings (
string [ ] input = NormalizeLineEndings (
@ "#EXTM3U
@ "#EXTM3U
# EXT - X - VERSION : 6
# EXT - X - VERSION : 7
# EXT - X - TARGETDURATION : 4
# EXT - X - TARGETDURATION : 4
# EXT - X - MEDIA - SEQUENCE : 4 6
# EXT - X - MEDIA - SEQUENCE : 4 6
# EXT - X - DISCONTINUITY - SEQUENCE : 2
# EXT - X - DISCONTINUITY - SEQUENCE : 2
@ -577,13 +607,19 @@ live000048.ts
// filter 'live000046.ts'
// filter 'live000046.ts'
var filterBefore = start . AddSeconds ( 2 ) ;
var filterBefore = start . AddSeconds ( 2 ) ;
TrimPlaylistResult result = _ hlsPlaylistFilter . TrimPlaylist ( start , filterBefore , input , 2 ) ;
TrimPlaylistResult result = _ hlsPlaylistFilter . TrimPlaylist (
OutputFormatKind . Hls ,
start ,
filterBefore ,
[] ,
input ,
2 ) ;
result . Sequence . ShouldBe ( 4 7 ) ;
result . Sequence . ShouldBe ( 4 7 ) ;
string expectedPlaylist = NormalizeLineEndings (
string expectedPlaylist = NormalizeLineEndings (
@ "#EXTM3U
@ "#EXTM3U
# EXT - X - VERSION : 6
# EXT - X - VERSION : 7
# EXT - X - TARGETDURATION : 4
# EXT - X - TARGETDURATION : 4
# EXT - X - MEDIA - SEQUENCE : 4 7
# EXT - X - MEDIA - SEQUENCE : 4 7
# EXT - X - DISCONTINUITY - SEQUENCE : 3
# EXT - X - DISCONTINUITY - SEQUENCE : 3