From b3de0249d8b97e305b064a45f6113d5b0d39f3bb Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Sat, 18 Jul 2015 14:07:03 -0400 Subject: replace channel tabs --- .../HttpServer/RangeRequestWriter.cs | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) (limited to 'MediaBrowser.Server.Implementations/HttpServer/RangeRequestWriter.cs') diff --git a/MediaBrowser.Server.Implementations/HttpServer/RangeRequestWriter.cs b/MediaBrowser.Server.Implementations/HttpServer/RangeRequestWriter.cs index 8c72f9e7e..322114112 100644 --- a/MediaBrowser.Server.Implementations/HttpServer/RangeRequestWriter.cs +++ b/MediaBrowser.Server.Implementations/HttpServer/RangeRequestWriter.cs @@ -1,4 +1,5 @@ -using ServiceStack.Web; +using MediaBrowser.Model.Logging; +using ServiceStack.Web; using System; using System.Collections.Generic; using System.Globalization; @@ -25,6 +26,7 @@ namespace MediaBrowser.Server.Implementations.HttpServer private long TotalContentLength { get; set; } public Action OnComplete { get; set; } + private readonly ILogger _logger; /// /// The _options @@ -61,7 +63,7 @@ namespace MediaBrowser.Server.Implementations.HttpServer /// The source. /// Type of the content. /// if set to true [is head request]. - public RangeRequestWriter(string rangeHeader, Stream source, string contentType, bool isHeadRequest) + public RangeRequestWriter(string rangeHeader, Stream source, string contentType, bool isHeadRequest, ILogger logger) { if (string.IsNullOrEmpty(contentType)) { @@ -71,6 +73,7 @@ namespace MediaBrowser.Server.Implementations.HttpServer RangeHeader = rangeHeader; SourceStream = source; IsHeadRequest = isHeadRequest; + this._logger = logger; ContentType = contentType; Options["Content-Type"] = contentType; @@ -188,10 +191,15 @@ namespace MediaBrowser.Server.Implementations.HttpServer } else { - CopyToInternal(source, responseStream, Convert.ToInt32(RangeLength)); + CopyToInternal(source, responseStream, RangeLength); } } } + catch (Exception ex) + { + _logger.ErrorException("Error in range request writer", ex); + throw; + } finally { if (OnComplete != null) @@ -201,7 +209,7 @@ namespace MediaBrowser.Server.Implementations.HttpServer } } - private void CopyToInternal(Stream source, Stream destination, int copyLength) + private void CopyToInternal(Stream source, Stream destination, long copyLength) { const int bufferSize = 81920; var array = new byte[bufferSize]; @@ -210,7 +218,7 @@ namespace MediaBrowser.Server.Implementations.HttpServer { var bytesToCopy = Math.Min(count, copyLength); - destination.Write(array, 0, bytesToCopy); + destination.Write(array, 0, Convert.ToInt32(bytesToCopy)); copyLength -= bytesToCopy; -- cgit v1.2.3 From a7b25c065c831804c701c44f30b277c9c7689ac3 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Fri, 31 Jul 2015 16:38:08 -0400 Subject: update stream buffering --- MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs | 72 +++------------------- .../Progressive/ProgressiveStreamWriter.cs | 5 +- MediaBrowser.Controller/Entities/TV/Episode.cs | 2 +- .../HttpServer/RangeRequestWriter.cs | 13 ++-- .../HttpServer/StreamWriter.cs | 5 +- .../LiveTv/EmbyTV/EmbyTV.cs | 2 +- 6 files changed, 27 insertions(+), 72 deletions(-) (limited to 'MediaBrowser.Server.Implementations/HttpServer/RangeRequestWriter.cs') diff --git a/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs b/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs index 305547e41..8ee508c4d 100644 --- a/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs +++ b/MediaBrowser.Api/Playback/Hls/DynamicHlsService.cs @@ -210,8 +210,6 @@ namespace MediaBrowser.Api.Playback.Hls { ApiEntryPoint.Instance.KillTranscodingJobs(request.DeviceId, request.PlaySessionId, p => false); - await ReadSegmentLengths(playlistPath).ConfigureAwait(false); - if (currentTranscodingIndex.HasValue) { DeleteLastFile(playlistPath, segmentExtension, 0); @@ -255,55 +253,8 @@ namespace MediaBrowser.Api.Playback.Hls return await GetSegmentResult(playlistPath, segmentPath, requestedIndex, segmentLength, job, cancellationToken).ConfigureAwait(false); } - private static readonly ConcurrentDictionary SegmentLengths = new ConcurrentDictionary(StringComparer.OrdinalIgnoreCase); - private async Task ReadSegmentLengths(string playlist) - { - try - { - using (var fileStream = GetPlaylistFileStream(playlist)) - { - using (var reader = new StreamReader(fileStream)) - { - double duration = -1; - - while (!reader.EndOfStream) - { - var text = await reader.ReadLineAsync().ConfigureAwait(false); - - if (text.StartsWith("#EXTINF", StringComparison.OrdinalIgnoreCase)) - { - var parts = text.Split(new[] { ':' }, 2); - if (parts.Length == 2) - { - var time = parts[1].Trim(new[] { ',' }).Trim(); - double timeValue; - if (double.TryParse(time, NumberStyles.Any, CultureInfo.InvariantCulture, out timeValue)) - { - duration = timeValue; - continue; - } - } - } - else if (duration != -1) - { - SegmentLengths.AddOrUpdate(text, duration, (k, v) => duration); - Logger.Debug("Added segment length of {0} for {1}", duration, text); - } - - duration = -1; - } - } - } - } - catch (DirectoryNotFoundException) - { - - } - catch (FileNotFoundException) - { - - } - } + // 256k + private const int BufferSize = 262144; private long GetSeekPositionTicks(StreamState state, string playlist, int requestedIndex) { @@ -455,21 +406,18 @@ namespace MediaBrowser.Api.Playback.Hls { using (var fileStream = GetPlaylistFileStream(playlistPath)) { - using (var reader = new StreamReader(fileStream)) + using (var reader = new StreamReader(fileStream, Encoding.UTF8, true, BufferSize)) { - while (!reader.EndOfStream) - { - var text = await reader.ReadLineAsync().ConfigureAwait(false); + var text = await reader.ReadToEndAsync().ConfigureAwait(false); - // If it appears in the playlist, it's done - if (text.IndexOf(segmentFilename, StringComparison.OrdinalIgnoreCase) != -1) + // If it appears in the playlist, it's done + if (text.IndexOf(segmentFilename, StringComparison.OrdinalIgnoreCase) != -1) + { + if (File.Exists(segmentPath)) { - if (File.Exists(segmentPath)) - { - return GetSegmentResult(segmentPath, segmentIndex, segmentLength, transcodingJob); - } - break; + return GetSegmentResult(segmentPath, segmentIndex, segmentLength, transcodingJob); } + //break; } } } diff --git a/MediaBrowser.Api/Playback/Progressive/ProgressiveStreamWriter.cs b/MediaBrowser.Api/Playback/Progressive/ProgressiveStreamWriter.cs index 6a3443f35..adedd9461 100644 --- a/MediaBrowser.Api/Playback/Progressive/ProgressiveStreamWriter.cs +++ b/MediaBrowser.Api/Playback/Progressive/ProgressiveStreamWriter.cs @@ -91,6 +91,9 @@ namespace MediaBrowser.Api.Playback.Progressive private readonly IFileSystem _fileSystem; private readonly TranscodingJob _job; + // 256k + private const int BufferSize = 262144; + private long _bytesWritten = 0; public ProgressiveFileCopier(IFileSystem fileSystem, TranscodingJob job) @@ -108,7 +111,7 @@ namespace MediaBrowser.Api.Playback.Progressive { while (eofCount < 15) { - CopyToInternal(fs, outputStream, 81920); + CopyToInternal(fs, outputStream, BufferSize); var fsPosition = fs.Position; diff --git a/MediaBrowser.Controller/Entities/TV/Episode.cs b/MediaBrowser.Controller/Entities/TV/Episode.cs index 8f5b8f6cf..5163c3de4 100644 --- a/MediaBrowser.Controller/Entities/TV/Episode.cs +++ b/MediaBrowser.Controller/Entities/TV/Episode.cs @@ -150,7 +150,7 @@ namespace MediaBrowser.Controller.Entities.TV { var series = Series; - if (ParentIndexNumber.HasValue) + if (series != null && ParentIndexNumber.HasValue) { var findNumber = ParentIndexNumber.Value; diff --git a/MediaBrowser.Server.Implementations/HttpServer/RangeRequestWriter.cs b/MediaBrowser.Server.Implementations/HttpServer/RangeRequestWriter.cs index 322114112..f20487733 100644 --- a/MediaBrowser.Server.Implementations/HttpServer/RangeRequestWriter.cs +++ b/MediaBrowser.Server.Implementations/HttpServer/RangeRequestWriter.cs @@ -28,6 +28,9 @@ namespace MediaBrowser.Server.Implementations.HttpServer public Action OnComplete { get; set; } private readonly ILogger _logger; + // 256k + private const int BufferSize = 262144; + /// /// The _options /// @@ -187,7 +190,7 @@ namespace MediaBrowser.Server.Implementations.HttpServer // If the requested range is "0-", we can optimize by just doing a stream copy if (RangeEnd >= TotalContentLength - 1) { - source.CopyTo(responseStream); + source.CopyTo(responseStream, BufferSize); } else { @@ -211,8 +214,7 @@ namespace MediaBrowser.Server.Implementations.HttpServer private void CopyToInternal(Stream source, Stream destination, long copyLength) { - const int bufferSize = 81920; - var array = new byte[bufferSize]; + var array = new byte[BufferSize]; int count; while ((count = source.Read(array, 0, array.Length)) != 0) { @@ -249,7 +251,7 @@ namespace MediaBrowser.Server.Implementations.HttpServer // If the requested range is "0-", we can optimize by just doing a stream copy if (RangeEnd >= TotalContentLength - 1) { - await source.CopyToAsync(responseStream).ConfigureAwait(false); + await source.CopyToAsync(responseStream, BufferSize).ConfigureAwait(false); } else { @@ -268,8 +270,7 @@ namespace MediaBrowser.Server.Implementations.HttpServer private async Task CopyToAsyncInternal(Stream source, Stream destination, int copyLength, CancellationToken cancellationToken) { - const int bufferSize = 81920; - var array = new byte[bufferSize]; + var array = new byte[BufferSize]; int count; while ((count = await source.ReadAsync(array, 0, array.Length, cancellationToken).ConfigureAwait(false)) != 0) { diff --git a/MediaBrowser.Server.Implementations/HttpServer/StreamWriter.cs b/MediaBrowser.Server.Implementations/HttpServer/StreamWriter.cs index fe662542e..daa5b86d9 100644 --- a/MediaBrowser.Server.Implementations/HttpServer/StreamWriter.cs +++ b/MediaBrowser.Server.Implementations/HttpServer/StreamWriter.cs @@ -81,6 +81,9 @@ namespace MediaBrowser.Server.Implementations.HttpServer WriteToInternal(responseStream); } + // 256k + private const int BufferSize = 262144; + /// /// Writes to async. /// @@ -92,7 +95,7 @@ namespace MediaBrowser.Server.Implementations.HttpServer { using (var src = SourceStream) { - src.CopyTo(responseStream); + src.CopyTo(responseStream, BufferSize); } } catch (Exception ex) diff --git a/MediaBrowser.Server.Implementations/LiveTv/EmbyTV/EmbyTV.cs b/MediaBrowser.Server.Implementations/LiveTv/EmbyTV/EmbyTV.cs index c323f8e0d..4430b9455 100644 --- a/MediaBrowser.Server.Implementations/LiveTv/EmbyTV/EmbyTV.cs +++ b/MediaBrowser.Server.Implementations/LiveTv/EmbyTV/EmbyTV.cs @@ -525,7 +525,7 @@ namespace MediaBrowser.Server.Implementations.LiveTv.EmbyTV { using (var output = File.Open(recordPath, FileMode.Create, FileAccess.Write, FileShare.Read)) { - await response.Content.CopyToAsync(output, 4096, linkedToken); + await response.Content.CopyToAsync(output, 131072, linkedToken); } } -- cgit v1.2.3 From d1fd921280b7441f0a5462eb63352fbe86f14165 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Fri, 14 Aug 2015 21:10:07 -0400 Subject: update plugin page --- MediaBrowser.Server.Implementations/HttpServer/RangeRequestWriter.cs | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'MediaBrowser.Server.Implementations/HttpServer/RangeRequestWriter.cs') diff --git a/MediaBrowser.Server.Implementations/HttpServer/RangeRequestWriter.cs b/MediaBrowser.Server.Implementations/HttpServer/RangeRequestWriter.cs index f20487733..a5c69317b 100644 --- a/MediaBrowser.Server.Implementations/HttpServer/RangeRequestWriter.cs +++ b/MediaBrowser.Server.Implementations/HttpServer/RangeRequestWriter.cs @@ -198,6 +198,10 @@ namespace MediaBrowser.Server.Implementations.HttpServer } } } + catch (IOException ex) + { + throw; + } catch (Exception ex) { _logger.ErrorException("Error in range request writer", ex); -- cgit v1.2.3 From 30c8937e36734ee9070830b974f34cb494b378fa Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Tue, 1 Sep 2015 02:22:46 -0400 Subject: removed pagebeforeshowready --- .../HttpServer/RangeRequestWriter.cs | 56 ---------------------- .../MediaBrowser.WebDashboard.csproj | 6 +++ 2 files changed, 6 insertions(+), 56 deletions(-) (limited to 'MediaBrowser.Server.Implementations/HttpServer/RangeRequestWriter.cs') diff --git a/MediaBrowser.Server.Implementations/HttpServer/RangeRequestWriter.cs b/MediaBrowser.Server.Implementations/HttpServer/RangeRequestWriter.cs index a5c69317b..9106fa059 100644 --- a/MediaBrowser.Server.Implementations/HttpServer/RangeRequestWriter.cs +++ b/MediaBrowser.Server.Implementations/HttpServer/RangeRequestWriter.cs @@ -235,62 +235,6 @@ namespace MediaBrowser.Server.Implementations.HttpServer } } - /// - /// Writes to async. - /// - /// The response stream. - /// Task. - private async Task WriteToAsync(Stream responseStream) - { - try - { - // Headers only - if (IsHeadRequest) - { - return; - } - - using (var source = SourceStream) - { - // If the requested range is "0-", we can optimize by just doing a stream copy - if (RangeEnd >= TotalContentLength - 1) - { - await source.CopyToAsync(responseStream, BufferSize).ConfigureAwait(false); - } - else - { - await CopyToAsyncInternal(source, responseStream, Convert.ToInt32(RangeLength), CancellationToken.None).ConfigureAwait(false); - } - } - } - finally - { - if (OnComplete != null) - { - OnComplete(); - } - } - } - - private async Task CopyToAsyncInternal(Stream source, Stream destination, int copyLength, CancellationToken cancellationToken) - { - var array = new byte[BufferSize]; - int count; - while ((count = await source.ReadAsync(array, 0, array.Length, cancellationToken).ConfigureAwait(false)) != 0) - { - var bytesToCopy = Math.Min(count, copyLength); - - await destination.WriteAsync(array, 0, bytesToCopy, cancellationToken).ConfigureAwait(false); - - copyLength -= bytesToCopy; - - if (copyLength <= 0) - { - break; - } - } - } - public string ContentType { get; set; } public IRequest RequestContext { get; set; } diff --git a/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj b/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj index bbdc702af..6fdcb393c 100644 --- a/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj +++ b/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj @@ -324,6 +324,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest @@ -2664,6 +2667,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest -- cgit v1.2.3