|
|
|
@ -30,8 +30,6 @@ namespace MediaBrowser.Api.Playback
|
|
|
|
|
/// </summary>
|
|
|
|
|
public abstract class BaseStreamingService : BaseApiService
|
|
|
|
|
{
|
|
|
|
|
protected static readonly CultureInfo UsCulture = CultureInfo.ReadOnly(new CultureInfo("en-US"));
|
|
|
|
|
|
|
|
|
|
protected virtual bool EnableOutputInSubFolder => false;
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
@ -418,55 +416,55 @@ namespace MediaBrowser.Api.Playback
|
|
|
|
|
{
|
|
|
|
|
if (videoRequest != null)
|
|
|
|
|
{
|
|
|
|
|
videoRequest.AudioStreamIndex = int.Parse(val, UsCulture);
|
|
|
|
|
videoRequest.AudioStreamIndex = int.Parse(val, CultureInfo.InvariantCulture);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else if (i == 7)
|
|
|
|
|
{
|
|
|
|
|
if (videoRequest != null)
|
|
|
|
|
{
|
|
|
|
|
videoRequest.SubtitleStreamIndex = int.Parse(val, UsCulture);
|
|
|
|
|
videoRequest.SubtitleStreamIndex = int.Parse(val, CultureInfo.InvariantCulture);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else if (i == 8)
|
|
|
|
|
{
|
|
|
|
|
if (videoRequest != null)
|
|
|
|
|
{
|
|
|
|
|
videoRequest.VideoBitRate = int.Parse(val, UsCulture);
|
|
|
|
|
videoRequest.VideoBitRate = int.Parse(val, CultureInfo.InvariantCulture);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else if (i == 9)
|
|
|
|
|
{
|
|
|
|
|
request.AudioBitRate = int.Parse(val, UsCulture);
|
|
|
|
|
request.AudioBitRate = int.Parse(val, CultureInfo.InvariantCulture);
|
|
|
|
|
}
|
|
|
|
|
else if (i == 10)
|
|
|
|
|
{
|
|
|
|
|
request.MaxAudioChannels = int.Parse(val, UsCulture);
|
|
|
|
|
request.MaxAudioChannels = int.Parse(val, CultureInfo.InvariantCulture);
|
|
|
|
|
}
|
|
|
|
|
else if (i == 11)
|
|
|
|
|
{
|
|
|
|
|
if (videoRequest != null)
|
|
|
|
|
{
|
|
|
|
|
videoRequest.MaxFramerate = float.Parse(val, UsCulture);
|
|
|
|
|
videoRequest.MaxFramerate = float.Parse(val, CultureInfo.InvariantCulture);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else if (i == 12)
|
|
|
|
|
{
|
|
|
|
|
if (videoRequest != null)
|
|
|
|
|
{
|
|
|
|
|
videoRequest.MaxWidth = int.Parse(val, UsCulture);
|
|
|
|
|
videoRequest.MaxWidth = int.Parse(val, CultureInfo.InvariantCulture);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else if (i == 13)
|
|
|
|
|
{
|
|
|
|
|
if (videoRequest != null)
|
|
|
|
|
{
|
|
|
|
|
videoRequest.MaxHeight = int.Parse(val, UsCulture);
|
|
|
|
|
videoRequest.MaxHeight = int.Parse(val, CultureInfo.InvariantCulture);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else if (i == 14)
|
|
|
|
|
{
|
|
|
|
|
request.StartTimeTicks = long.Parse(val, UsCulture);
|
|
|
|
|
request.StartTimeTicks = long.Parse(val, CultureInfo.InvariantCulture);
|
|
|
|
|
}
|
|
|
|
|
else if (i == 15)
|
|
|
|
|
{
|
|
|
|
@ -479,14 +477,14 @@ namespace MediaBrowser.Api.Playback
|
|
|
|
|
{
|
|
|
|
|
if (videoRequest != null)
|
|
|
|
|
{
|
|
|
|
|
videoRequest.MaxRefFrames = int.Parse(val, UsCulture);
|
|
|
|
|
videoRequest.MaxRefFrames = int.Parse(val, CultureInfo.InvariantCulture);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else if (i == 17)
|
|
|
|
|
{
|
|
|
|
|
if (videoRequest != null)
|
|
|
|
|
{
|
|
|
|
|
videoRequest.MaxVideoBitDepth = int.Parse(val, UsCulture);
|
|
|
|
|
videoRequest.MaxVideoBitDepth = int.Parse(val, CultureInfo.InvariantCulture);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else if (i == 18)
|
|
|
|
@ -535,7 +533,7 @@ namespace MediaBrowser.Api.Playback
|
|
|
|
|
}
|
|
|
|
|
else if (i == 26)
|
|
|
|
|
{
|
|
|
|
|
request.TranscodingMaxAudioChannels = int.Parse(val, UsCulture);
|
|
|
|
|
request.TranscodingMaxAudioChannels = int.Parse(val, CultureInfo.InvariantCulture);
|
|
|
|
|
}
|
|
|
|
|
else if (i == 27)
|
|
|
|
|
{
|
|
|
|
@ -640,7 +638,7 @@ namespace MediaBrowser.Api.Playback
|
|
|
|
|
if (value.IndexOf(':') == -1)
|
|
|
|
|
{
|
|
|
|
|
// Parses npt times in the format of '417.33'
|
|
|
|
|
if (double.TryParse(value, NumberStyles.Any, UsCulture, out var seconds))
|
|
|
|
|
if (double.TryParse(value, NumberStyles.Any, CultureInfo.InvariantCulture, out var seconds))
|
|
|
|
|
{
|
|
|
|
|
return TimeSpan.FromSeconds(seconds).Ticks;
|
|
|
|
|
}
|
|
|
|
@ -655,7 +653,7 @@ namespace MediaBrowser.Api.Playback
|
|
|
|
|
|
|
|
|
|
foreach (var time in tokens)
|
|
|
|
|
{
|
|
|
|
|
if (double.TryParse(time, NumberStyles.Any, UsCulture, out var digit))
|
|
|
|
|
if (double.TryParse(time, NumberStyles.Any, CultureInfo.InvariantCulture, out var digit))
|
|
|
|
|
{
|
|
|
|
|
secondsSum += digit * timeFactor;
|
|
|
|
|
}
|
|
|
|
@ -1027,8 +1025,8 @@ namespace MediaBrowser.Api.Playback
|
|
|
|
|
|
|
|
|
|
private void AddTimeSeekResponseHeaders(StreamState state, IDictionary<string, string> responseHeaders)
|
|
|
|
|
{
|
|
|
|
|
var runtimeSeconds = TimeSpan.FromTicks(state.RunTimeTicks.Value).TotalSeconds.ToString(UsCulture);
|
|
|
|
|
var startSeconds = TimeSpan.FromTicks(state.Request.StartTimeTicks ?? 0).TotalSeconds.ToString(UsCulture);
|
|
|
|
|
var runtimeSeconds = TimeSpan.FromTicks(state.RunTimeTicks.Value).TotalSeconds.ToString(CultureInfo.InvariantCulture);
|
|
|
|
|
var startSeconds = TimeSpan.FromTicks(state.Request.StartTimeTicks ?? 0).TotalSeconds.ToString(CultureInfo.InvariantCulture);
|
|
|
|
|
|
|
|
|
|
responseHeaders["TimeSeekRange.dlna.org"] = string.Format("npt={0}-{1}/{1}", startSeconds, runtimeSeconds);
|
|
|
|
|
responseHeaders["X-AvailableSeekRange"] = string.Format("1 npt={0}-{1}", startSeconds, runtimeSeconds);
|
|
|
|
|