From ac81b4e3ca061180d566760bc2f6f8abe8a79c94 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Thu, 27 Mar 2014 00:02:45 -0400 Subject: [PATCH] estimate content length for xbox 360 --- .../BaseProgressiveStreamingService.cs | 44 ++++++++++++++++--- 1 file changed, 39 insertions(+), 5 deletions(-) diff --git a/MediaBrowser.Api/Playback/Progressive/BaseProgressiveStreamingService.cs b/MediaBrowser.Api/Playback/Progressive/BaseProgressiveStreamingService.cs index dad8a51bd7..78b3f29481 100644 --- a/MediaBrowser.Api/Playback/Progressive/BaseProgressiveStreamingService.cs +++ b/MediaBrowser.Api/Playback/Progressive/BaseProgressiveStreamingService.cs @@ -26,7 +26,8 @@ namespace MediaBrowser.Api.Playback.Progressive protected readonly IImageProcessor ImageProcessor; protected readonly IHttpClient HttpClient; - protected BaseProgressiveStreamingService(IServerConfigurationManager serverConfig, IUserManager userManager, ILibraryManager libraryManager, IIsoManager isoManager, IMediaEncoder mediaEncoder, IDtoService dtoService, IFileSystem fileSystem, IItemRepository itemRepository, ILiveTvManager liveTvManager, IEncodingManager encodingManager, IDlnaManager dlnaManager, IHttpClient httpClient, IImageProcessor imageProcessor) : base(serverConfig, userManager, libraryManager, isoManager, mediaEncoder, dtoService, fileSystem, itemRepository, liveTvManager, encodingManager, dlnaManager) + protected BaseProgressiveStreamingService(IServerConfigurationManager serverConfig, IUserManager userManager, ILibraryManager libraryManager, IIsoManager isoManager, IMediaEncoder mediaEncoder, IDtoService dtoService, IFileSystem fileSystem, IItemRepository itemRepository, ILiveTvManager liveTvManager, IEncodingManager encodingManager, IDlnaManager dlnaManager, IHttpClient httpClient, IImageProcessor imageProcessor) + : base(serverConfig, userManager, libraryManager, isoManager, mediaEncoder, dtoService, fileSystem, itemRepository, liveTvManager, encodingManager, dlnaManager) { HttpClient = httpClient; ImageProcessor = imageProcessor; @@ -216,18 +217,30 @@ namespace MediaBrowser.Api.Playback.Progressive var contentType = state.GetMimeType(outputPath); + var contentLength = state.EstimateContentLength ? GetEstimatedContentLength(state) : null; + + if (contentLength.HasValue) + { + responseHeaders["Content-Length"] = contentLength.Value.ToString(UsCulture); + } + // Headers only if (isHeadRequest) { var streamResult = ResultFactory.GetResult(new byte[] { }, contentType, responseHeaders); - var hasOptions = streamResult as IHasOptions; - if (hasOptions != null) + + if (!contentLength.HasValue) { - if (hasOptions.Options.ContainsKey("Content-Length")) + var hasOptions = streamResult as IHasOptions; + if (hasOptions != null) { - hasOptions.Options.Remove("Content-Length"); + if (hasOptions.Options.ContainsKey("Content-Length")) + { + hasOptions.Options.Remove("Content-Length"); + } } } + return streamResult; } @@ -252,5 +265,26 @@ namespace MediaBrowser.Api.Playback.Progressive return result; } + + private long? GetEstimatedContentLength(StreamState state) + { + var totalBitrate = 0; + + if (state.Request.AudioBitRate.HasValue) + { + totalBitrate += state.Request.AudioBitRate.Value; + } + if (state.VideoRequest != null && state.VideoRequest.VideoBitRate.HasValue) + { + totalBitrate += state.VideoRequest.VideoBitRate.Value; + } + + if (totalBitrate > 0 && state.RunTimeTicks.HasValue) + { + return Convert.ToInt64(totalBitrate * TimeSpan.FromTicks(state.RunTimeTicks.Value).TotalSeconds); + } + + return null; + } } }