|
|
@ -137,7 +137,9 @@ namespace MediaBrowser.Api.Playback
|
|
|
|
var ext = outputFileExtension.ToLowerInvariant();
|
|
|
|
var ext = outputFileExtension.ToLowerInvariant();
|
|
|
|
var folder = ServerConfigurationManager.GetTranscodePath();
|
|
|
|
var folder = ServerConfigurationManager.GetTranscodePath();
|
|
|
|
|
|
|
|
|
|
|
|
return EnableOutputInSubFolder ? Path.Combine(folder, filename, filename + ext) : Path.Combine(folder, filename + ext);
|
|
|
|
return EnableOutputInSubFolder
|
|
|
|
|
|
|
|
? Path.Combine(folder, filename, filename + ext)
|
|
|
|
|
|
|
|
: Path.Combine(folder, filename + ext);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
protected virtual string GetDefaultEncoderPreset()
|
|
|
|
protected virtual string GetDefaultEncoderPreset()
|
|
|
@ -393,44 +395,36 @@ namespace MediaBrowser.Api.Playback
|
|
|
|
request.Static = string.Equals("true", val, StringComparison.OrdinalIgnoreCase);
|
|
|
|
request.Static = string.Equals("true", val, StringComparison.OrdinalIgnoreCase);
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
case 4:
|
|
|
|
case 4:
|
|
|
|
{
|
|
|
|
|
|
|
|
if (videoRequest != null)
|
|
|
|
if (videoRequest != null)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
videoRequest.VideoCodec = val;
|
|
|
|
videoRequest.VideoCodec = val;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
case 5:
|
|
|
|
case 5:
|
|
|
|
request.AudioCodec = val;
|
|
|
|
request.AudioCodec = val;
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
case 6:
|
|
|
|
case 6:
|
|
|
|
{
|
|
|
|
|
|
|
|
if (videoRequest != null)
|
|
|
|
if (videoRequest != null)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
videoRequest.AudioStreamIndex = int.Parse(val, CultureInfo.InvariantCulture);
|
|
|
|
videoRequest.AudioStreamIndex = int.Parse(val, CultureInfo.InvariantCulture);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
case 7:
|
|
|
|
case 7:
|
|
|
|
{
|
|
|
|
|
|
|
|
if (videoRequest != null)
|
|
|
|
if (videoRequest != null)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
videoRequest.SubtitleStreamIndex = int.Parse(val, CultureInfo.InvariantCulture);
|
|
|
|
videoRequest.SubtitleStreamIndex = int.Parse(val, CultureInfo.InvariantCulture);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
case 8:
|
|
|
|
case 8:
|
|
|
|
{
|
|
|
|
|
|
|
|
if (videoRequest != null)
|
|
|
|
if (videoRequest != null)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
videoRequest.VideoBitRate = int.Parse(val, CultureInfo.InvariantCulture);
|
|
|
|
videoRequest.VideoBitRate = int.Parse(val, CultureInfo.InvariantCulture);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
case 9:
|
|
|
|
case 9:
|
|
|
|
request.AudioBitRate = int.Parse(val, CultureInfo.InvariantCulture);
|
|
|
|
request.AudioBitRate = int.Parse(val, CultureInfo.InvariantCulture);
|
|
|
|
break;
|
|
|
|
break;
|
|
|
@ -438,71 +432,57 @@ namespace MediaBrowser.Api.Playback
|
|
|
|
request.MaxAudioChannels = int.Parse(val, CultureInfo.InvariantCulture);
|
|
|
|
request.MaxAudioChannels = int.Parse(val, CultureInfo.InvariantCulture);
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
case 11:
|
|
|
|
case 11:
|
|
|
|
{
|
|
|
|
|
|
|
|
if (videoRequest != null)
|
|
|
|
if (videoRequest != null)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
videoRequest.MaxFramerate = float.Parse(val, CultureInfo.InvariantCulture);
|
|
|
|
videoRequest.MaxFramerate = float.Parse(val, CultureInfo.InvariantCulture);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
case 12:
|
|
|
|
case 12:
|
|
|
|
{
|
|
|
|
|
|
|
|
if (videoRequest != null)
|
|
|
|
if (videoRequest != null)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
videoRequest.MaxWidth = int.Parse(val, CultureInfo.InvariantCulture);
|
|
|
|
videoRequest.MaxWidth = int.Parse(val, CultureInfo.InvariantCulture);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
case 13:
|
|
|
|
case 13:
|
|
|
|
{
|
|
|
|
|
|
|
|
if (videoRequest != null)
|
|
|
|
if (videoRequest != null)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
videoRequest.MaxHeight = int.Parse(val, CultureInfo.InvariantCulture);
|
|
|
|
videoRequest.MaxHeight = int.Parse(val, CultureInfo.InvariantCulture);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
case 14:
|
|
|
|
case 14:
|
|
|
|
request.StartTimeTicks = long.Parse(val, CultureInfo.InvariantCulture);
|
|
|
|
request.StartTimeTicks = long.Parse(val, CultureInfo.InvariantCulture);
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
case 15:
|
|
|
|
case 15:
|
|
|
|
{
|
|
|
|
|
|
|
|
if (videoRequest != null)
|
|
|
|
if (videoRequest != null)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
videoRequest.Level = val;
|
|
|
|
videoRequest.Level = val;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
case 16:
|
|
|
|
case 16:
|
|
|
|
{
|
|
|
|
|
|
|
|
if (videoRequest != null)
|
|
|
|
if (videoRequest != null)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
videoRequest.MaxRefFrames = int.Parse(val, CultureInfo.InvariantCulture);
|
|
|
|
videoRequest.MaxRefFrames = int.Parse(val, CultureInfo.InvariantCulture);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
case 17:
|
|
|
|
case 17:
|
|
|
|
{
|
|
|
|
|
|
|
|
if (videoRequest != null)
|
|
|
|
if (videoRequest != null)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
videoRequest.MaxVideoBitDepth = int.Parse(val, CultureInfo.InvariantCulture);
|
|
|
|
videoRequest.MaxVideoBitDepth = int.Parse(val, CultureInfo.InvariantCulture);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
case 18:
|
|
|
|
case 18:
|
|
|
|
{
|
|
|
|
|
|
|
|
if (videoRequest != null)
|
|
|
|
if (videoRequest != null)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
videoRequest.Profile = val;
|
|
|
|
videoRequest.Profile = val;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
case 19:
|
|
|
|
case 19:
|
|
|
|
// cabac no longer used
|
|
|
|
// cabac no longer used
|
|
|
|
break;
|
|
|
|
break;
|
|
|
@ -519,16 +499,13 @@ namespace MediaBrowser.Api.Playback
|
|
|
|
// Duplicating ItemId because of MediaMonkey
|
|
|
|
// Duplicating ItemId because of MediaMonkey
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
case 24:
|
|
|
|
case 24:
|
|
|
|
{
|
|
|
|
|
|
|
|
if (videoRequest != null)
|
|
|
|
if (videoRequest != null)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
videoRequest.CopyTimestamps = string.Equals("true", val, StringComparison.OrdinalIgnoreCase);
|
|
|
|
videoRequest.CopyTimestamps = string.Equals("true", val, StringComparison.OrdinalIgnoreCase);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
case 25:
|
|
|
|
case 25:
|
|
|
|
{
|
|
|
|
|
|
|
|
if (!string.IsNullOrWhiteSpace(val) && videoRequest != null)
|
|
|
|
if (!string.IsNullOrWhiteSpace(val) && videoRequest != null)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if (Enum.TryParse(val, out SubtitleDeliveryMethod method))
|
|
|
|
if (Enum.TryParse(val, out SubtitleDeliveryMethod method))
|
|
|
@ -538,52 +515,43 @@ namespace MediaBrowser.Api.Playback
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
case 26:
|
|
|
|
case 26:
|
|
|
|
request.TranscodingMaxAudioChannels = int.Parse(val, CultureInfo.InvariantCulture);
|
|
|
|
request.TranscodingMaxAudioChannels = int.Parse(val, CultureInfo.InvariantCulture);
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
case 27:
|
|
|
|
case 27:
|
|
|
|
{
|
|
|
|
|
|
|
|
if (videoRequest != null)
|
|
|
|
if (videoRequest != null)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
videoRequest.EnableSubtitlesInManifest = string.Equals("true", val, StringComparison.OrdinalIgnoreCase);
|
|
|
|
videoRequest.EnableSubtitlesInManifest = string.Equals("true", val, StringComparison.OrdinalIgnoreCase);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
case 28:
|
|
|
|
case 28:
|
|
|
|
request.Tag = val;
|
|
|
|
request.Tag = val;
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
case 29:
|
|
|
|
case 29:
|
|
|
|
{
|
|
|
|
|
|
|
|
if (videoRequest != null)
|
|
|
|
if (videoRequest != null)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
videoRequest.RequireAvc = string.Equals("true", val, StringComparison.OrdinalIgnoreCase);
|
|
|
|
videoRequest.RequireAvc = string.Equals("true", val, StringComparison.OrdinalIgnoreCase);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
case 30:
|
|
|
|
case 30:
|
|
|
|
request.SubtitleCodec = val;
|
|
|
|
request.SubtitleCodec = val;
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
case 31:
|
|
|
|
case 31:
|
|
|
|
{
|
|
|
|
|
|
|
|
if (videoRequest != null)
|
|
|
|
if (videoRequest != null)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
videoRequest.RequireNonAnamorphic = string.Equals("true", val, StringComparison.OrdinalIgnoreCase);
|
|
|
|
videoRequest.RequireNonAnamorphic = string.Equals("true", val, StringComparison.OrdinalIgnoreCase);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
case 32:
|
|
|
|
case 32:
|
|
|
|
{
|
|
|
|
|
|
|
|
if (videoRequest != null)
|
|
|
|
if (videoRequest != null)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
videoRequest.DeInterlace = string.Equals("true", val, StringComparison.OrdinalIgnoreCase);
|
|
|
|
videoRequest.DeInterlace = string.Equals("true", val, StringComparison.OrdinalIgnoreCase);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
case 33:
|
|
|
|
case 33:
|
|
|
|
request.TranscodeReasons = val;
|
|
|
|
request.TranscodeReasons = val;
|
|
|
|
break;
|
|
|
|
break;
|
|
|
@ -860,14 +828,11 @@ namespace MediaBrowser.Api.Playback
|
|
|
|
{
|
|
|
|
{
|
|
|
|
state.DeviceProfile = DlnaManager.GetProfile(state.Request.DeviceProfileId);
|
|
|
|
state.DeviceProfile = DlnaManager.GetProfile(state.Request.DeviceProfileId);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
else if (!string.IsNullOrWhiteSpace(state.Request.DeviceId))
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if (!string.IsNullOrWhiteSpace(state.Request.DeviceId))
|
|
|
|
var caps = DeviceManager.GetCapabilities(state.Request.DeviceId);
|
|
|
|
{
|
|
|
|
|
|
|
|
var caps = DeviceManager.GetCapabilities(state.Request.DeviceId);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
state.DeviceProfile = caps != null ? caps.DeviceProfile : DlnaManager.GetProfile(headers);
|
|
|
|
state.DeviceProfile = caps == null ? DlnaManager.GetProfile(headers) : caps.DeviceProfile;
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
var profile = state.DeviceProfile;
|
|
|
|
var profile = state.DeviceProfile;
|
|
|
|