From b783f317febcb545f79de116124d9a95c8384b64 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sat, 19 Aug 2017 18:37:15 -0400 Subject: update live stream management --- .../LiveTv/EmbyTV/DirectRecorder.cs | 4 +- .../LiveTv/TunerHosts/MulticastStream.cs | 46 +++++----------- .../LiveTv/TunerHosts/QueueStream.cs | 62 ++-------------------- MediaBrowser.XbmcMetadata/Parsers/BaseNfoParser.cs | 4 +- Nuget/MediaBrowser.Common.nuspec | 2 +- Nuget/MediaBrowser.Server.Core.nuspec | 4 +- 6 files changed, 24 insertions(+), 98 deletions(-) diff --git a/Emby.Server.Implementations/LiveTv/EmbyTV/DirectRecorder.cs b/Emby.Server.Implementations/LiveTv/EmbyTV/DirectRecorder.cs index 2a2e1886f..8aef37115 100644 --- a/Emby.Server.Implementations/LiveTv/EmbyTV/DirectRecorder.cs +++ b/Emby.Server.Implementations/LiveTv/EmbyTV/DirectRecorder.cs @@ -49,8 +49,8 @@ namespace Emby.Server.Implementations.LiveTv.EmbyTV _logger.Info("Copying recording stream to file {0}", targetFile); // The media source if infinite so we need to handle stopping ourselves - var durationToken = new CancellationTokenSource(duration); - cancellationToken = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, durationToken.Token).Token; + //var durationToken = new CancellationTokenSource(duration); + //cancellationToken = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, durationToken.Token).Token; await directStreamProvider.CopyToAsync(output, cancellationToken).ConfigureAwait(false); } diff --git a/Emby.Server.Implementations/LiveTv/TunerHosts/MulticastStream.cs b/Emby.Server.Implementations/LiveTv/TunerHosts/MulticastStream.cs index 567f4ce20..45a0c348e 100644 --- a/Emby.Server.Implementations/LiveTv/TunerHosts/MulticastStream.cs +++ b/Emby.Server.Implementations/LiveTv/TunerHosts/MulticastStream.cs @@ -39,21 +39,9 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts if (bytesRead > 0) { - var allStreams = _outputStreams.ToList(); - - //if (allStreams.Count == 1) - //{ - // allStreams[0].Value.Write(buffer, 0, bytesRead); - //} - //else + foreach (var stream in _outputStreams) { - //byte[] copy = new byte[bytesRead]; - //Buffer.BlockCopy(buffer, 0, copy, 0, bytesRead); - - foreach (var stream in allStreams) - { - stream.Value.Queue(buffer, 0, bytesRead); - } + stream.Value.Queue(buffer, 0, bytesRead); } if (onStarted != null) @@ -73,27 +61,21 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts public Task CopyToAsync(Stream stream, CancellationToken cancellationToken) { - var result = new QueueStream(stream, _logger) - { - OnFinished = OnFinished - }; - - _outputStreams.TryAdd(result.Id, result); + var queueStream = new QueueStream(stream, _logger); - result.Start(cancellationToken); + _outputStreams.TryAdd(queueStream.Id, queueStream); - return result.TaskCompletion.Task; - } - - public void RemoveOutputStream(QueueStream stream) - { - QueueStream removed; - _outputStreams.TryRemove(stream.Id, out removed); - } + try + { + queueStream.Start(cancellationToken); + } + finally + { + _outputStreams.TryRemove(queueStream.Id, out queueStream); + GC.Collect(); + } - private void OnFinished(QueueStream queueStream) - { - RemoveOutputStream(queueStream); + return Task.FromResult(true); } } } diff --git a/Emby.Server.Implementations/LiveTv/TunerHosts/QueueStream.cs b/Emby.Server.Implementations/LiveTv/TunerHosts/QueueStream.cs index f1ec8d5af..07a4daa87 100644 --- a/Emby.Server.Implementations/LiveTv/TunerHosts/QueueStream.cs +++ b/Emby.Server.Implementations/LiveTv/TunerHosts/QueueStream.cs @@ -14,9 +14,7 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts { private readonly Stream _outputStream; private readonly BlockingCollection> _queue = new BlockingCollection>(); - public TaskCompletionSource TaskCompletion { get; private set; } - public Action OnFinished { get; set; } private readonly ILogger _logger; public Guid Id = Guid.NewGuid(); @@ -24,7 +22,6 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts { _outputStream = outputStream; _logger = logger; - TaskCompletion = new TaskCompletionSource(); } public void Queue(byte[] bytes, int offset, int count) @@ -34,68 +31,15 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts public void Start(CancellationToken cancellationToken) { - Task.Run(() => StartInternal(cancellationToken)); - } - - private void OnClosed() - { - GC.Collect(); - if (OnFinished != null) - { - OnFinished(this); - } - } - - public void Write(byte[] bytes, int offset, int count) - { - //return _outputStream.WriteAsync(bytes, offset, count, cancellationToken); - - try - { - _outputStream.Write(bytes, offset, count); - } - catch (OperationCanceledException) - { - _logger.Debug("QueueStream cancelled"); - TaskCompletion.TrySetCanceled(); - OnClosed(); - } - catch (Exception ex) - { - _logger.ErrorException("Error in QueueStream", ex); - TaskCompletion.TrySetException(ex); - OnClosed(); - } - } - - private void StartInternal(CancellationToken cancellationToken) - { - try + while (true) { - while (true) + foreach (var result in _queue.GetConsumingEnumerable()) { cancellationToken.ThrowIfCancellationRequested(); - foreach (var result in _queue.GetConsumingEnumerable()) - { - _outputStream.Write(result.Item1, result.Item2, result.Item3); - } + _outputStream.Write(result.Item1, result.Item2, result.Item3); } } - catch (OperationCanceledException) - { - _logger.Debug("QueueStream cancelled"); - TaskCompletion.TrySetCanceled(); - } - catch (Exception ex) - { - _logger.ErrorException("Error in QueueStream", ex); - TaskCompletion.TrySetException(ex); - } - finally - { - OnClosed(); - } } } } diff --git a/MediaBrowser.XbmcMetadata/Parsers/BaseNfoParser.cs b/MediaBrowser.XbmcMetadata/Parsers/BaseNfoParser.cs index 789d840b8..c1c2e7d9d 100644 --- a/MediaBrowser.XbmcMetadata/Parsers/BaseNfoParser.cs +++ b/MediaBrowser.XbmcMetadata/Parsers/BaseNfoParser.cs @@ -253,7 +253,7 @@ namespace MediaBrowser.XbmcMetadata.Parsers int value; if (!string.IsNullOrWhiteSpace(tmdbId) && int.TryParse(tmdbId, NumberStyles.Any, CultureInfo.InvariantCulture, out value)) { - item.SetProviderId(MetadataProviders.Tmdb, tmdbId); + item.SetProviderId(MetadataProviders.Tmdb, value.ToString(_usCulture)); } } @@ -269,7 +269,7 @@ namespace MediaBrowser.XbmcMetadata.Parsers int value; if (!string.IsNullOrWhiteSpace(tvdbId) && int.TryParse(tvdbId, NumberStyles.Any, CultureInfo.InvariantCulture, out value)) { - item.SetProviderId(MetadataProviders.Tvdb, tvdbId); + item.SetProviderId(MetadataProviders.Tvdb, value.ToString(_usCulture)); } } } diff --git a/Nuget/MediaBrowser.Common.nuspec b/Nuget/MediaBrowser.Common.nuspec index 94c00a602..a86735bca 100644 --- a/Nuget/MediaBrowser.Common.nuspec +++ b/Nuget/MediaBrowser.Common.nuspec @@ -2,7 +2,7 @@ MediaBrowser.Common - 3.0.734 + 3.0.735 Emby.Common Emby Team ebr,Luke,scottisafool diff --git a/Nuget/MediaBrowser.Server.Core.nuspec b/Nuget/MediaBrowser.Server.Core.nuspec index 99c9af095..3b9c0c83b 100644 --- a/Nuget/MediaBrowser.Server.Core.nuspec +++ b/Nuget/MediaBrowser.Server.Core.nuspec @@ -2,7 +2,7 @@ MediaBrowser.Server.Core - 3.0.734 + 3.0.735 Emby.Server.Core Emby Team ebr,Luke,scottisafool @@ -12,7 +12,7 @@ Contains core components required to build plugins for Emby Server. Copyright © Emby 2013 - + -- cgit v1.2.3