mirror of
https://github.com/jellyfin/jellyfin.git
synced 2025-12-24 09:44:47 +03:00
rework live stream handling
This commit is contained in:
@@ -87,7 +87,8 @@ namespace MediaBrowser.Api.Playback.Hls
|
||||
|
||||
if (!FileSystem.FileExists(playlist))
|
||||
{
|
||||
await ApiEntryPoint.Instance.TranscodingStartLock.WaitAsync(cancellationTokenSource.Token).ConfigureAwait(false);
|
||||
var transcodingLock = ApiEntryPoint.Instance.GetTranscodingLock(playlist);
|
||||
await transcodingLock.WaitAsync(cancellationTokenSource.Token).ConfigureAwait(false);
|
||||
try
|
||||
{
|
||||
if (!FileSystem.FileExists(playlist))
|
||||
@@ -104,13 +105,13 @@ namespace MediaBrowser.Api.Playback.Hls
|
||||
throw;
|
||||
}
|
||||
|
||||
var waitForSegments = state.SegmentLength >= 10 ? 2 : (state.SegmentLength > 3 || !isLive ? 3 : 4);
|
||||
var waitForSegments = state.SegmentLength >= 10 ? 2 : (state.SegmentLength > 3 || !isLive ? 3 : 3);
|
||||
await WaitForMinimumSegmentCount(playlist, waitForSegments, cancellationTokenSource.Token).ConfigureAwait(false);
|
||||
}
|
||||
}
|
||||
finally
|
||||
{
|
||||
ApiEntryPoint.Instance.TranscodingStartLock.Release();
|
||||
transcodingLock.Release();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -182,32 +183,41 @@ namespace MediaBrowser.Api.Playback.Hls
|
||||
{
|
||||
Logger.Debug("Waiting for {0} segments in {1}", segmentCount, playlist);
|
||||
|
||||
while (true)
|
||||
while (!cancellationToken.IsCancellationRequested)
|
||||
{
|
||||
// Need to use FileShare.ReadWrite because we're reading the file at the same time it's being written
|
||||
using (var fileStream = GetPlaylistFileStream(playlist))
|
||||
try
|
||||
{
|
||||
using (var reader = new StreamReader(fileStream))
|
||||
// Need to use FileShare.ReadWrite because we're reading the file at the same time it's being written
|
||||
using (var fileStream = GetPlaylistFileStream(playlist))
|
||||
{
|
||||
var count = 0;
|
||||
|
||||
while (!reader.EndOfStream)
|
||||
using (var reader = new StreamReader(fileStream))
|
||||
{
|
||||
var line = await reader.ReadLineAsync().ConfigureAwait(false);
|
||||
var count = 0;
|
||||
|
||||
if (line.IndexOf("#EXTINF:", StringComparison.OrdinalIgnoreCase) != -1)
|
||||
while (!reader.EndOfStream)
|
||||
{
|
||||
count++;
|
||||
if (count >= segmentCount)
|
||||
var line = await reader.ReadLineAsync().ConfigureAwait(false);
|
||||
|
||||
if (line.IndexOf("#EXTINF:", StringComparison.OrdinalIgnoreCase) != -1)
|
||||
{
|
||||
Logger.Debug("Finished waiting for {0} segments in {1}", segmentCount, playlist);
|
||||
return;
|
||||
count++;
|
||||
if (count >= segmentCount)
|
||||
{
|
||||
Logger.Debug("Finished waiting for {0} segments in {1}", segmentCount, playlist);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
await Task.Delay(100, cancellationToken).ConfigureAwait(false);
|
||||
}
|
||||
await Task.Delay(100, cancellationToken).ConfigureAwait(false);
|
||||
}
|
||||
}
|
||||
catch (IOException)
|
||||
{
|
||||
// May get an error if the file is locked
|
||||
}
|
||||
|
||||
await Task.Delay(50, cancellationToken).ConfigureAwait(false);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user