|
|
|
@ -1,4 +1,5 @@ |
|
|
|
using ErsatzTV.Core; |
|
|
|
using System.Diagnostics; |
|
|
|
|
|
|
|
using ErsatzTV.Core; |
|
|
|
using ErsatzTV.Core.Domain; |
|
|
|
using ErsatzTV.Core.Domain; |
|
|
|
using ErsatzTV.Core.Errors; |
|
|
|
using ErsatzTV.Core.Errors; |
|
|
|
using ErsatzTV.Core.FFmpeg; |
|
|
|
using ErsatzTV.Core.FFmpeg; |
|
|
|
@ -78,26 +79,48 @@ public class StartFFmpegSessionHandler : IRequestHandler<StartFFmpegSession, Eit |
|
|
|
IHlsSessionWorker worker, |
|
|
|
IHlsSessionWorker worker, |
|
|
|
CancellationToken cancellationToken) |
|
|
|
CancellationToken cancellationToken) |
|
|
|
{ |
|
|
|
{ |
|
|
|
DateTimeOffset start = DateTimeOffset.Now; |
|
|
|
var sw = Stopwatch.StartNew(); |
|
|
|
DateTimeOffset finish = start.AddSeconds(8); |
|
|
|
try |
|
|
|
|
|
|
|
|
|
|
|
while (!File.Exists(playlistFileName)) |
|
|
|
|
|
|
|
{ |
|
|
|
{ |
|
|
|
await Task.Delay(TimeSpan.FromMilliseconds(100), cancellationToken); |
|
|
|
DateTimeOffset start = DateTimeOffset.Now; |
|
|
|
} |
|
|
|
DateTimeOffset finish = start.AddSeconds(8); |
|
|
|
|
|
|
|
|
|
|
|
var segmentCount = 0; |
|
|
|
_logger.LogDebug("Waiting for playlist to exist"); |
|
|
|
while (DateTimeOffset.Now < finish && segmentCount < initialSegmentCount) |
|
|
|
while (!File.Exists(playlistFileName)) |
|
|
|
{ |
|
|
|
{ |
|
|
|
await Task.Delay(TimeSpan.FromMilliseconds(200), cancellationToken); |
|
|
|
await Task.Delay(TimeSpan.FromMilliseconds(100), cancellationToken); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
DateTimeOffset now = DateTimeOffset.Now.AddSeconds(-30); |
|
|
|
_logger.LogDebug("Playlist exists"); |
|
|
|
Option<TrimPlaylistResult> maybeResult = await worker.TrimPlaylist(now, cancellationToken); |
|
|
|
|
|
|
|
foreach (TrimPlaylistResult result in maybeResult) |
|
|
|
var segmentCount = 0; |
|
|
|
|
|
|
|
var lastSegmentCount = -1; |
|
|
|
|
|
|
|
while (DateTimeOffset.Now < finish && segmentCount < initialSegmentCount) |
|
|
|
{ |
|
|
|
{ |
|
|
|
segmentCount = result.SegmentCount; |
|
|
|
if (segmentCount != lastSegmentCount) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
lastSegmentCount = segmentCount; |
|
|
|
|
|
|
|
_logger.LogDebug( |
|
|
|
|
|
|
|
"Segment count {SegmentCount} of {InitialSegmentCount}", |
|
|
|
|
|
|
|
segmentCount, |
|
|
|
|
|
|
|
initialSegmentCount); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
await Task.Delay(TimeSpan.FromMilliseconds(200), cancellationToken); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
DateTimeOffset now = DateTimeOffset.Now.AddSeconds(-30); |
|
|
|
|
|
|
|
Option<TrimPlaylistResult> maybeResult = await worker.TrimPlaylist(now, cancellationToken); |
|
|
|
|
|
|
|
foreach (TrimPlaylistResult result in maybeResult) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
segmentCount = result.SegmentCount; |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
finally |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
sw.Stop(); |
|
|
|
|
|
|
|
_logger.LogDebug("WaitForPlaylistSegments took {Duration}", sw.Elapsed); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private Task<Validation<BaseError, Unit>> Validate(StartFFmpegSession request) => |
|
|
|
private Task<Validation<BaseError, Unit>> Validate(StartFFmpegSession request) => |
|
|
|
|