diff options
Diffstat (limited to 'MediaBrowser.Model')
| -rw-r--r-- | MediaBrowser.Model/ApiClient/IApiClient.cs | 24 | ||||
| -rw-r--r-- | MediaBrowser.Model/Dlna/ContentFeatureBuilder.cs | 12 | ||||
| -rw-r--r-- | MediaBrowser.Model/Dlna/DeviceProfile.cs | 126 | ||||
| -rw-r--r-- | MediaBrowser.Model/Dlna/StreamBuilder.cs | 188 | ||||
| -rw-r--r-- | MediaBrowser.Model/Plugins/BasePluginConfiguration.cs | 24 | ||||
| -rw-r--r-- | MediaBrowser.Model/Plugins/PluginInfo.cs | 20 |
6 files changed, 206 insertions, 188 deletions
diff --git a/MediaBrowser.Model/ApiClient/IApiClient.cs b/MediaBrowser.Model/ApiClient/IApiClient.cs index f4620acf7..e12a6cf2b 100644 --- a/MediaBrowser.Model/ApiClient/IApiClient.cs +++ b/MediaBrowser.Model/ApiClient/IApiClient.cs @@ -925,30 +925,6 @@ namespace MediaBrowser.Model.ApiClient string GetThumbImageUrl(BaseItemDto item, ImageOptions options); /// <summary> - /// Gets the url needed to stream an audio file - /// </summary> - /// <param name="options">The options.</param> - /// <returns>System.String.</returns> - /// <exception cref="ArgumentNullException">options</exception> - string GetAudioStreamUrl(StreamOptions options); - - /// <summary> - /// Gets the url needed to stream a video file - /// </summary> - /// <param name="options">The options.</param> - /// <returns>System.String.</returns> - /// <exception cref="ArgumentNullException">options</exception> - string GetVideoStreamUrl(VideoStreamOptions options); - - /// <summary> - /// Formulates a url for streaming video using the HLS protocol - /// </summary> - /// <param name="options">The options.</param> - /// <returns>System.String.</returns> - /// <exception cref="ArgumentNullException">options</exception> - string GetHlsVideoStreamUrl(VideoStreamOptions options); - - /// <summary> /// Gets the live tv information asynchronous. /// </summary> /// <param name="cancellationToken">The cancellation token.</param> diff --git a/MediaBrowser.Model/Dlna/ContentFeatureBuilder.cs b/MediaBrowser.Model/Dlna/ContentFeatureBuilder.cs index a7ad49cba..c97c06d34 100644 --- a/MediaBrowser.Model/Dlna/ContentFeatureBuilder.cs +++ b/MediaBrowser.Model/Dlna/ContentFeatureBuilder.cs @@ -26,7 +26,7 @@ namespace MediaBrowser.Model.Dlna DlnaFlags.DlnaV15; string dlnaflags = string.Format(";DLNA.ORG_FLAGS={0}", - FlagsToString(flagValue)); + DlnaMaps.FlagsToString(flagValue)); ResponseProfile mediaProfile = _profile.GetImageMediaProfile(container, width, @@ -73,7 +73,7 @@ namespace MediaBrowser.Model.Dlna } string dlnaflags = string.Format(";DLNA.ORG_FLAGS={0}", - FlagsToString(flagValue)); + DlnaMaps.FlagsToString(flagValue)); ResponseProfile mediaProfile = _profile.GetAudioMediaProfile(container, audioCodec, @@ -92,12 +92,6 @@ namespace MediaBrowser.Model.Dlna return (contentFeatures + orgOp + orgCi + dlnaflags).Trim(';'); } - private static string FlagsToString(DlnaFlags flags) - { - //return Enum.Format(typeof(DlnaFlags), flags, "x"); - return string.Format("{0:X8}{1:D24}", (ulong)flags, 0); - } - public string BuildVideoHeader(string container, string videoCodec, string audioCodec, @@ -136,7 +130,7 @@ namespace MediaBrowser.Model.Dlna } string dlnaflags = string.Format(";DLNA.ORG_FLAGS={0}", - FlagsToString(flagValue)); + DlnaMaps.FlagsToString(flagValue)); ResponseProfile mediaProfile = _profile.GetVideoMediaProfile(container, audioCodec, diff --git a/MediaBrowser.Model/Dlna/DeviceProfile.cs b/MediaBrowser.Model/Dlna/DeviceProfile.cs index 2b2453a23..9f599f3e3 100644 --- a/MediaBrowser.Model/Dlna/DeviceProfile.cs +++ b/MediaBrowser.Model/Dlna/DeviceProfile.cs @@ -108,7 +108,8 @@ namespace MediaBrowser.Model.Dlna List<string> list = new List<string>(); foreach (string i in (SupportedMediaTypes ?? string.Empty).Split(',')) { - if (!string.IsNullOrEmpty(i)) list.Add(i); + if (!string.IsNullOrEmpty(i)) + list.Add(i); } return list; } @@ -117,85 +118,102 @@ namespace MediaBrowser.Model.Dlna { container = (container ?? string.Empty).TrimStart('.'); - return TranscodingProfiles.FirstOrDefault(i => + foreach (var i in TranscodingProfiles) { if (i.Type != DlnaProfileType.Audio) { - return false; + continue; } if (!string.Equals(container, i.Container, StringComparison.OrdinalIgnoreCase)) { - return false; + continue; } - if (!i.GetAudioCodecs().Contains(audioCodec ?? string.Empty)) + if (!i.GetAudioCodecs().Contains(audioCodec ?? string.Empty, StringComparer.OrdinalIgnoreCase)) { - return false; + continue; } - return true; - }); + return i; + } + return null; } public TranscodingProfile GetVideoTranscodingProfile(string container, string audioCodec, string videoCodec) { container = (container ?? string.Empty).TrimStart('.'); - return TranscodingProfiles.FirstOrDefault(i => + foreach (var i in TranscodingProfiles) { if (i.Type != DlnaProfileType.Video) { - return false; + continue; } if (!string.Equals(container, i.Container, StringComparison.OrdinalIgnoreCase)) { - return false; + continue; } if (!i.GetAudioCodecs().Contains(audioCodec ?? string.Empty)) { - return false; + continue; } if (!string.Equals(videoCodec, i.VideoCodec, StringComparison.OrdinalIgnoreCase)) { - return false; + continue; } - return true; - }); + return i; + } + return null; } public ResponseProfile GetAudioMediaProfile(string container, string audioCodec, int? audioChannels, int? audioBitrate) { container = (container ?? string.Empty).TrimStart('.'); - return ResponseProfiles.FirstOrDefault(i => + foreach (var i in ResponseProfiles) { if (i.Type != DlnaProfileType.Audio) { - return false; + continue; } - List<string> containers = i.GetContainers().ToList(); - if (containers.Count > 0 && !containers.Contains(container)) + List<string> containers = i.GetContainers(); + if (containers.Count > 0 && !containers.Contains(container, StringComparer.OrdinalIgnoreCase)) { - return false; + continue; } - List<string> audioCodecs = i.GetAudioCodecs().ToList(); - if (audioCodecs.Count > 0 && !audioCodecs.Contains(audioCodec ?? string.Empty)) + List<string> audioCodecs = i.GetAudioCodecs(); + if (audioCodecs.Count > 0 && !audioCodecs.Contains(audioCodec ?? string.Empty, StringComparer.OrdinalIgnoreCase)) { - return false; + continue; } ConditionProcessor conditionProcessor = new ConditionProcessor(); - return i.Conditions.All(c => conditionProcessor.IsAudioConditionSatisfied(c, - audioChannels, - audioBitrate)); - }); + + var anyOff = false; + foreach (ProfileCondition c in i.Conditions) + { + if (!conditionProcessor.IsAudioConditionSatisfied(c, audioChannels, audioBitrate)) + { + anyOff = true; + break; + } + } + + if (anyOff) + { + continue; + } + + return i; + } + return null; } public ResponseProfile GetImageMediaProfile(string container, int? width, int? height) @@ -209,16 +227,19 @@ namespace MediaBrowser.Model.Dlna return false; } - List<string> containers = i.GetContainers().ToList(); - if (containers.Count > 0 && !containers.Contains(container)) + List<string> containers = i.GetContainers(); + if (containers.Count > 0 && !containers.Contains(container, StringComparer.OrdinalIgnoreCase)) { return false; } ConditionProcessor conditionProcessor = new ConditionProcessor(); - return i.Conditions.All(c => conditionProcessor.IsImageConditionSatisfied(c, - width, - height)); + foreach (ProfileCondition c in i.Conditions) + { + if (!conditionProcessor.IsImageConditionSatisfied(c, width, height)) + return false; + } + return true; }); } @@ -246,37 +267,31 @@ namespace MediaBrowser.Model.Dlna return false; } - List<string> containers = i.GetContainers().ToList(); - if (containers.Count > 0 && !containers.Contains(container)) + List<string> containers = i.GetContainers(); + if (containers.Count > 0 && !containers.Contains(container, StringComparer.OrdinalIgnoreCase)) { return false; } - List<string> audioCodecs = i.GetAudioCodecs().ToList(); - if (audioCodecs.Count > 0 && !audioCodecs.Contains(audioCodec ?? string.Empty)) + List<string> audioCodecs = i.GetAudioCodecs(); + if (audioCodecs.Count > 0 && !audioCodecs.Contains(audioCodec ?? string.Empty, StringComparer.OrdinalIgnoreCase)) { return false; } - List<string> videoCodecs = i.GetVideoCodecs().ToList(); - if (videoCodecs.Count > 0 && !videoCodecs.Contains(videoCodec ?? string.Empty)) + List<string> videoCodecs = i.GetVideoCodecs(); + if (videoCodecs.Count > 0 && !videoCodecs.Contains(videoCodec ?? string.Empty, StringComparer.OrdinalIgnoreCase)) { return false; } ConditionProcessor conditionProcessor = new ConditionProcessor(); - return i.Conditions.All(c => conditionProcessor.IsVideoConditionSatisfied(c, - audioBitrate, - audioChannels, - width, - height, - bitDepth, - videoBitrate, - videoProfile, - videoLevel, - videoFramerate, - packetLength, - timestamp)); + foreach (ProfileCondition c in i.Conditions) + { + if (!conditionProcessor.IsVideoConditionSatisfied(c, audioBitrate, audioChannels, width, height, bitDepth, videoBitrate, videoProfile, videoLevel, videoFramerate, packetLength, timestamp)) + return false; + } + return true; }); } @@ -292,15 +307,18 @@ namespace MediaBrowser.Model.Dlna } List<string> containers = i.GetContainers().ToList(); - if (containers.Count > 0 && !containers.Contains(container)) + if (containers.Count > 0 && !containers.Contains(container, StringComparer.OrdinalIgnoreCase)) { return false; } ConditionProcessor conditionProcessor = new ConditionProcessor(); - return i.Conditions.All(c => conditionProcessor.IsImageConditionSatisfied(c, - width, - height)); + foreach (ProfileCondition c in i.Conditions) + { + if (!conditionProcessor.IsImageConditionSatisfied(c, width, height)) + return false; + } + return true; }); } } diff --git a/MediaBrowser.Model/Dlna/StreamBuilder.cs b/MediaBrowser.Model/Dlna/StreamBuilder.cs index 9acec20aa..d87fbb109 100644 --- a/MediaBrowser.Model/Dlna/StreamBuilder.cs +++ b/MediaBrowser.Model/Dlna/StreamBuilder.cs @@ -27,7 +27,7 @@ namespace MediaBrowser.Model.Dlna mediaSources = new List<MediaSourceInfo>(); foreach (MediaSourceInfo i in mediaSources) { - if (string.Equals(i.Id, mediaSourceId, StringComparison.OrdinalIgnoreCase)) + if (string.Equals(i.Id, mediaSourceId, StringComparison.OrdinalIgnoreCase)) mediaSources.Add(i); } } @@ -60,7 +60,7 @@ namespace MediaBrowser.Model.Dlna mediaSources = new List<MediaSourceInfo>(); foreach (MediaSourceInfo i in mediaSources) { - if (string.Equals(i.Id, mediaSourceId, StringComparison.OrdinalIgnoreCase)) + if (string.Equals(i.Id, mediaSourceId, StringComparison.OrdinalIgnoreCase)) mediaSources.Add(i); } } @@ -109,13 +109,28 @@ namespace MediaBrowser.Model.Dlna int? maxBitrateSetting = options.MaxBitrate ?? options.Profile.MaxBitrate; - MediaStream audioStream = item.MediaStreams.FirstOrDefault(i => i.Type == MediaStreamType.Audio); + MediaStream audioStream = null; + foreach (MediaStream i in item.MediaStreams) + { + if (i.Type == MediaStreamType.Audio) + { + audioStream = i; + break; + } + } // Honor the max bitrate setting if (IsAudioEligibleForDirectPlay(item, maxBitrateSetting)) { - DirectPlayProfile directPlay = options.Profile.DirectPlayProfiles - .FirstOrDefault(i => i.Type == playlistItem.MediaType && IsAudioDirectPlaySupported(i, item, audioStream)); + DirectPlayProfile directPlay = null; + foreach (DirectPlayProfile i in options.Profile.DirectPlayProfiles) + { + if (i.Type == playlistItem.MediaType && IsAudioDirectPlaySupported(i, item, audioStream)) + { + directPlay = i; + break; + } + } if (directPlay != null) { @@ -126,13 +141,27 @@ namespace MediaBrowser.Model.Dlna { ConditionProcessor conditionProcessor = new ConditionProcessor(); - IEnumerable<ProfileCondition> conditions = options.Profile.CodecProfiles.Where(i => i.Type == CodecType.Audio && i.ContainsCodec(audioCodec)) - .SelectMany(i => i.Conditions); + List<ProfileCondition> conditions = new List<ProfileCondition>(); + foreach (CodecProfile i in options.Profile.CodecProfiles) + { + if (i.Type == CodecType.Audio && i.ContainsCodec(audioCodec)) + conditions.AddRange(i.Conditions); + } int? audioChannels = audioStream.Channels; int? audioBitrate = audioStream.BitRate; - if (conditions.All(c => conditionProcessor.IsAudioConditionSatisfied(c, audioChannels, audioBitrate))) + bool all = true; + foreach (ProfileCondition c in conditions) + { + if (!conditionProcessor.IsAudioConditionSatisfied(c, audioChannels, audioBitrate)) + { + all = false; + break; + } + } + + if (all) { playlistItem.IsDirectStream = true; playlistItem.Container = item.Container; @@ -143,8 +172,15 @@ namespace MediaBrowser.Model.Dlna } } - TranscodingProfile transcodingProfile = options.Profile.TranscodingProfiles - .FirstOrDefault(i => i.Type == playlistItem.MediaType); + TranscodingProfile transcodingProfile = null; + foreach (TranscodingProfile i in options.Profile.TranscodingProfiles) + { + if (i.Type == playlistItem.MediaType) + { + transcodingProfile = i; + break; + } + } if (transcodingProfile != null) { @@ -155,10 +191,11 @@ namespace MediaBrowser.Model.Dlna playlistItem.AudioCodec = transcodingProfile.AudioCodec; playlistItem.Protocol = transcodingProfile.Protocol; - IEnumerable<ProfileCondition> audioTranscodingConditions = options.Profile.CodecProfiles + List<ProfileCondition> audioTranscodingConditions = options.Profile.CodecProfiles .Where(i => i.Type == CodecType.Audio && i.ContainsCodec(transcodingProfile.AudioCodec)) .Take(1) - .SelectMany(i => i.Conditions); + .SelectMany(i => i.Conditions) + .ToList(); ApplyTranscodingConditions(playlistItem, audioTranscodingConditions); @@ -192,8 +229,25 @@ namespace MediaBrowser.Model.Dlna RunTimeTicks = item.RunTimeTicks }; - MediaStream audioStream = item.MediaStreams.FirstOrDefault(i => i.Type == MediaStreamType.Audio); - MediaStream videoStream = item.MediaStreams.FirstOrDefault(i => i.Type == MediaStreamType.Video); + MediaStream audioStream = null; + foreach (MediaStream i in item.MediaStreams) + { + if (i.Type == MediaStreamType.Audio) + { + audioStream = i; + break; + } + } + + MediaStream videoStream = null; + foreach (MediaStream i in item.MediaStreams) + { + if (i.Type == MediaStreamType.Video) + { + videoStream = i; + break; + } + } int? maxBitrateSetting = options.MaxBitrate ?? options.Profile.MaxBitrate; @@ -306,9 +360,15 @@ namespace MediaBrowser.Model.Dlna string container = mediaSource.Container; - IEnumerable<ProfileCondition> conditions = profile.ContainerProfiles - .Where(i => i.Type == DlnaProfileType.Video && i.GetContainers().Contains(container, StringComparer.OrdinalIgnoreCase)) - .SelectMany(i => i.Conditions); + List<ProfileCondition> conditions = new List<ProfileCondition>(); + foreach (ContainerProfile i in profile.ContainerProfiles) + { + if (i.Type == DlnaProfileType.Video && + i.GetContainers().Contains(container, StringComparer.OrdinalIgnoreCase)) + { + conditions.AddRange(i.Conditions); + } + } ConditionProcessor conditionProcessor = new ConditionProcessor(); @@ -328,20 +388,12 @@ namespace MediaBrowser.Model.Dlna int? packetLength = videoStream == null ? null : videoStream.PacketLength; // Check container conditions - if (!conditions.All(i => conditionProcessor.IsVideoConditionSatisfied(i, - audioBitrate, - audioChannels, - width, - height, - bitDepth, - videoBitrate, - videoProfile, - videoLevel, - videoFramerate, - packetLength, - timestamp))) + foreach (ProfileCondition i in conditions) { - return null; + if (!conditionProcessor.IsVideoConditionSatisfied(i, audioBitrate, audioChannels, width, height, bitDepth, videoBitrate, videoProfile, videoLevel, videoFramerate, packetLength, timestamp)) + { + return null; + } } string videoCodec = videoStream == null ? null : videoStream.Codec; @@ -351,24 +403,19 @@ namespace MediaBrowser.Model.Dlna return null; } - conditions = profile.CodecProfiles - .Where(i => i.Type == CodecType.Video && i.ContainsCodec(videoCodec)) - .SelectMany(i => i.Conditions); + conditions = new List<ProfileCondition>(); + foreach (CodecProfile i in profile.CodecProfiles) + { + if (i.Type == CodecType.Video && i.ContainsCodec(videoCodec)) + conditions.AddRange(i.Conditions); + } - if (!conditions.All(i => conditionProcessor.IsVideoConditionSatisfied(i, - audioBitrate, - audioChannels, - width, - height, - bitDepth, - videoBitrate, - videoProfile, - videoLevel, - videoFramerate, - packetLength, - timestamp))) + foreach (ProfileCondition i in conditions) { - return null; + if (!conditionProcessor.IsVideoConditionSatisfied(i, audioBitrate, audioChannels, width, height, bitDepth, videoBitrate, videoProfile, videoLevel, videoFramerate, packetLength, timestamp)) + { + return null; + } } if (audioStream != null) @@ -380,16 +427,19 @@ namespace MediaBrowser.Model.Dlna return null; } - conditions = profile.CodecProfiles - .Where(i => i.Type == CodecType.VideoAudio && i.ContainsCodec(audioCodec)) - .SelectMany(i => i.Conditions); + conditions = new List<ProfileCondition>(); + foreach (CodecProfile i in profile.CodecProfiles) + { + if (i.Type == CodecType.VideoAudio && i.ContainsCodec(audioCodec)) + conditions.AddRange(i.Conditions); + } - if (!conditions.All(i => conditionProcessor.IsVideoAudioConditionSatisfied(i, - audioChannels, - audioBitrate, - audioProfile))) + foreach (ProfileCondition i in conditions) { - return null; + if (!conditionProcessor.IsVideoAudioConditionSatisfied(i, audioChannels, audioBitrate, audioProfile)) + { + return null; + } } } @@ -455,11 +505,15 @@ namespace MediaBrowser.Model.Dlna private void ApplyTranscodingConditions(StreamInfo item, IEnumerable<ProfileCondition> conditions) { - foreach (ProfileCondition condition in conditions - .Where(i => !string.IsNullOrEmpty(i.Value))) + foreach (ProfileCondition condition in conditions) { string value = condition.Value; + if (string.IsNullOrEmpty(value)) + { + continue; + } + switch (condition.Property) { case ProfileConditionValue.AudioBitrate: @@ -551,7 +605,16 @@ namespace MediaBrowser.Model.Dlna { // Check container type string mediaContainer = item.Container ?? string.Empty; - if (!profile.GetContainers().Any(i => string.Equals(i, mediaContainer, StringComparison.OrdinalIgnoreCase))) + bool any = false; + foreach (string i in profile.GetContainers()) + { + if (string.Equals(i, mediaContainer, StringComparison.OrdinalIgnoreCase)) + { + any = true; + break; + } + } + if (!any) { return false; } @@ -572,7 +635,16 @@ namespace MediaBrowser.Model.Dlna { // Check container type string mediaContainer = item.Container ?? string.Empty; - if (!profile.GetContainers().Any(i => string.Equals(i, mediaContainer, StringComparison.OrdinalIgnoreCase))) + bool any = false; + foreach (string i in profile.GetContainers()) + { + if (string.Equals(i, mediaContainer, StringComparison.OrdinalIgnoreCase)) + { + any = true; + break; + } + } + if (!any) { return false; } diff --git a/MediaBrowser.Model/Plugins/BasePluginConfiguration.cs b/MediaBrowser.Model/Plugins/BasePluginConfiguration.cs index 4c7b8812f..9a8bfadd1 100644 --- a/MediaBrowser.Model/Plugins/BasePluginConfiguration.cs +++ b/MediaBrowser.Model/Plugins/BasePluginConfiguration.cs @@ -1,5 +1,4 @@ -using MediaBrowser.Model.Updates; - + namespace MediaBrowser.Model.Plugins { /// <summary> @@ -7,26 +6,5 @@ namespace MediaBrowser.Model.Plugins /// </summary> public class BasePluginConfiguration { - /// <summary> - /// Whether or not this plug-in should be automatically updated when a - /// compatible new version is released - /// </summary> - /// <value><c>true</c> if [enable auto update]; otherwise, <c>false</c>.</value> - public bool EnableAutoUpdate { get; set; } - - /// <summary> - /// The classification of updates to which to subscribe. - /// Options are: Dev, Beta or Release - /// </summary> - /// <value>The update class.</value> - public PackageVersionClass UpdateClass { get; set; } - - /// <summary> - /// Initializes a new instance of the <see cref="BasePluginConfiguration" /> class. - /// </summary> - public BasePluginConfiguration() - { - EnableAutoUpdate = true; - } } } diff --git a/MediaBrowser.Model/Plugins/PluginInfo.cs b/MediaBrowser.Model/Plugins/PluginInfo.cs index fbc2e2927..e84c06c21 100644 --- a/MediaBrowser.Model/Plugins/PluginInfo.cs +++ b/MediaBrowser.Model/Plugins/PluginInfo.cs @@ -49,25 +49,5 @@ namespace MediaBrowser.Model.Plugins /// </summary> /// <value>The unique id.</value> public string Id { get; set; } - - /// <summary> - /// Whether or not this plug-in should be automatically updated when a - /// compatible new version is released - /// </summary> - /// <value><c>true</c> if [enable auto update]; otherwise, <c>false</c>.</value> - public bool EnableAutoUpdate { get; set; } - - /// <summary> - /// The classification of updates to which to subscribe. - /// Options are: Dev, Beta or Release - /// </summary> - /// <value>The update class.</value> - public PackageVersionClass UpdateClass { get; set; } - - /// <summary> - /// Gets or sets the minimum required UI version. - /// </summary> - /// <value>The minimum required UI version.</value> - public string MinimumRequiredUIVersion { get; set; } } } |
