|
@@ -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;
|
|
|
+ }
|
|
|
}
|
|
|
}
|