diff --git a/Emby.Dlna/Didl/DidlBuilder.cs b/Emby.Dlna/Didl/DidlBuilder.cs index 23ce21f12a..8b50d47fbd 100644 --- a/Emby.Dlna/Didl/DidlBuilder.cs +++ b/Emby.Dlna/Didl/DidlBuilder.cs @@ -974,28 +974,15 @@ namespace Emby.Dlna.Didl return; } - // TODO: Remove these default values - var albumArtUrlInfo = GetImageUrl( - imageInfo, - _profile.MaxAlbumArtWidth ?? 10000, - _profile.MaxAlbumArtHeight ?? 10000, - "jpg"); + var albumartUrlInfo = GetImageUrl(imageInfo, _profile.MaxAlbumArtWidth, _profile.MaxAlbumArtHeight, "jpg"); writer.WriteStartElement("upnp", "albumArtURI", NsUpnp); - if (!string.IsNullOrEmpty(_profile.AlbumArtPn)) - { - writer.WriteAttributeString("dlna", "profileID", NsDlna, _profile.AlbumArtPn); - } - - writer.WriteString(albumArtUrlInfo.url); + writer.WriteAttributeString("dlna", "profileID", NsDlna, _profile.AlbumArtPn); + writer.WriteString(albumartUrlInfo.url); writer.WriteFullEndElement(); - // TODO: Remove these default values - var iconUrlInfo = GetImageUrl( - imageInfo, - _profile.MaxIconWidth ?? 48, - _profile.MaxIconHeight ?? 48, - "jpg"); + // TOOD: Remove these default values + var iconUrlInfo = GetImageUrl(imageInfo, _profile.MaxIconWidth ?? 48, _profile.MaxIconHeight ?? 48, "jpg"); writer.WriteElementString("upnp", "icon", NsUpnp, iconUrlInfo.url); if (!_profile.EnableAlbumArtInDidl) @@ -1219,7 +1206,8 @@ namespace Emby.Dlna.Didl if (width.HasValue && height.HasValue) { - var newSize = DrawingUtils.Resize(new ImageDimensions(width.Value, height.Value), 0, 0, maxWidth, maxHeight); + var newSize = DrawingUtils.Resize( + new ImageDimensions(width.Value, height.Value), 0, 0, maxWidth, maxHeight); width = newSize.Width; height = newSize.Height; diff --git a/Jellyfin.Api/Controllers/UniversalAudioController.cs b/Jellyfin.Api/Controllers/UniversalAudioController.cs index ea9bc675f2..9e093fd0f0 100644 --- a/Jellyfin.Api/Controllers/UniversalAudioController.cs +++ b/Jellyfin.Api/Controllers/UniversalAudioController.cs @@ -298,9 +298,9 @@ namespace Jellyfin.Api.Controllers { Type = DlnaProfileType.Audio, Context = EncodingContext.Streaming, - Container = transcodingContainer ?? "mp3", - AudioCodec = audioCodec ?? "mp3", - Protocol = transcodingProtocol ?? "http", + Container = transcodingContainer, + AudioCodec = audioCodec, + Protocol = transcodingProtocol, BreakOnNonKeyFrames = breakOnNonKeyFrames ?? false, MaxAudioChannels = transcodingAudioChannels?.ToString(CultureInfo.InvariantCulture) } diff --git a/MediaBrowser.Model/Dlna/ContainerProfile.cs b/MediaBrowser.Model/Dlna/ContainerProfile.cs index c66ec8bc37..56c89d854f 100644 --- a/MediaBrowser.Model/Dlna/ContainerProfile.cs +++ b/MediaBrowser.Model/Dlna/ContainerProfile.cs @@ -1,7 +1,7 @@ +#nullable disable #pragma warning disable CS1591 using System; -using System.ComponentModel.DataAnnotations; using System.Linq; using System.Xml.Serialization; @@ -12,12 +12,22 @@ namespace MediaBrowser.Model.Dlna [XmlAttribute("type")] public DlnaProfileType Type { get; set; } - public ProfileCondition[]? Conditions { get; set; } = Array.Empty(); + public ProfileCondition[] Conditions { get; set; } [XmlAttribute("container")] - public string Container { get; set; } = string.Empty; + public string Container { get; set; } - public static string[] SplitValue(string? value) + public ContainerProfile() + { + Conditions = Array.Empty(); + } + + public string[] GetContainers() + { + return SplitValue(Container); + } + + public static string[] SplitValue(string value) { if (string.IsNullOrEmpty(value)) { @@ -27,14 +37,14 @@ namespace MediaBrowser.Model.Dlna return value.Split(',', StringSplitOptions.RemoveEmptyEntries); } - public bool ContainsContainer(string? container) + public bool ContainsContainer(string container) { - var containers = SplitValue(Container); + var containers = GetContainers(); return ContainsContainer(containers, container); } - public static bool ContainsContainer(string? profileContainers, string? inputContainer) + public static bool ContainsContainer(string profileContainers, string inputContainer) { var isNegativeList = false; if (profileContainers != null && profileContainers.StartsWith('-')) @@ -46,29 +56,46 @@ namespace MediaBrowser.Model.Dlna return ContainsContainer(SplitValue(profileContainers), isNegativeList, inputContainer); } - public static bool ContainsContainer(string[]? profileContainers, string? inputContainer) + public static bool ContainsContainer(string[] profileContainers, string inputContainer) { return ContainsContainer(profileContainers, false, inputContainer); } - public static bool ContainsContainer(string[]? profileContainers, bool isNegativeList, string? inputContainer) + public static bool ContainsContainer(string[] profileContainers, bool isNegativeList, string inputContainer) { - if (profileContainers == null || profileContainers.Length == 0) + if (profileContainers.Length == 0) { - return isNegativeList; + return true; } - var allInputContainers = SplitValue(inputContainer); - - foreach (var container in allInputContainers) + if (isNegativeList) { - if (profileContainers.Contains(container, StringComparer.OrdinalIgnoreCase)) + var allInputContainers = SplitValue(inputContainer); + + foreach (var container in allInputContainers) { - return !isNegativeList; + if (profileContainers.Contains(container, StringComparer.OrdinalIgnoreCase)) + { + return false; + } } + + return true; } + else + { + var allInputContainers = SplitValue(inputContainer); - return isNegativeList; + foreach (var container in allInputContainers) + { + if (profileContainers.Contains(container, StringComparer.OrdinalIgnoreCase)) + { + return true; + } + } + + return false; + } } } } diff --git a/MediaBrowser.Model/Dlna/DeviceProfile.cs b/MediaBrowser.Model/Dlna/DeviceProfile.cs index 47d1016139..ff51866587 100644 --- a/MediaBrowser.Model/Dlna/DeviceProfile.cs +++ b/MediaBrowser.Model/Dlna/DeviceProfile.cs @@ -1,6 +1,6 @@ +#nullable disable #pragma warning disable CA1819 // Properties should not return arrays using System; -using System.ComponentModel; using System.Linq; using System.Xml.Serialization; using MediaBrowser.Model.MediaInfo; @@ -13,104 +13,121 @@ namespace MediaBrowser.Model.Dlna [XmlRoot("Profile")] public class DeviceProfile { + /// + /// Initializes a new instance of the class. + /// + public DeviceProfile() + { + DirectPlayProfiles = Array.Empty(); + TranscodingProfiles = Array.Empty(); + ResponseProfiles = Array.Empty(); + CodecProfiles = Array.Empty(); + ContainerProfiles = Array.Empty(); + SubtitleProfiles = Array.Empty(); + + XmlRootAttributes = Array.Empty(); + + SupportedMediaTypes = "Audio,Photo,Video"; + MaxStreamingBitrate = 8000000; + MaxStaticBitrate = 8000000; + MusicStreamingTranscodingBitrate = 128000; + } + /// /// Gets or sets the Name. /// - public string? Name { get; set; } + public string Name { get; set; } /// /// Gets or sets the Id. /// [XmlIgnore] - public string? Id { get; set; } + public string Id { get; set; } /// /// Gets or sets the Identification. /// - public DeviceIdentification? Identification { get; set; } + public DeviceIdentification Identification { get; set; } /// /// Gets or sets the FriendlyName. /// - public string? FriendlyName { get; set; } + public string FriendlyName { get; set; } /// /// Gets or sets the Manufacturer. /// - public string? Manufacturer { get; set; } + public string Manufacturer { get; set; } /// /// Gets or sets the ManufacturerUrl. /// - public string? ManufacturerUrl { get; set; } + public string ManufacturerUrl { get; set; } /// /// Gets or sets the ModelName. /// - public string? ModelName { get; set; } + public string ModelName { get; set; } /// /// Gets or sets the ModelDescription. /// - public string? ModelDescription { get; set; } + public string ModelDescription { get; set; } /// /// Gets or sets the ModelNumber. /// - public string? ModelNumber { get; set; } + public string ModelNumber { get; set; } /// /// Gets or sets the ModelUrl. /// - public string? ModelUrl { get; set; } + public string ModelUrl { get; set; } /// /// Gets or sets the SerialNumber. /// - public string? SerialNumber { get; set; } + public string SerialNumber { get; set; } /// /// Gets or sets a value indicating whether EnableAlbumArtInDidl. /// - [DefaultValue(false)] public bool EnableAlbumArtInDidl { get; set; } /// /// Gets or sets a value indicating whether EnableSingleAlbumArtLimit. /// - [DefaultValue(false)] public bool EnableSingleAlbumArtLimit { get; set; } /// /// Gets or sets a value indicating whether EnableSingleSubtitleLimit. /// - [DefaultValue(false)] public bool EnableSingleSubtitleLimit { get; set; } /// /// Gets or sets the SupportedMediaTypes. /// - public string SupportedMediaTypes { get; set; } = "Audio,Photo,Video"; + public string SupportedMediaTypes { get; set; } /// /// Gets or sets the UserId. /// - public string? UserId { get; set; } + public string UserId { get; set; } /// /// Gets or sets the AlbumArtPn. /// - public string? AlbumArtPn { get; set; } + public string AlbumArtPn { get; set; } /// /// Gets or sets the MaxAlbumArtWidth. /// - public int? MaxAlbumArtWidth { get; set; } + public int MaxAlbumArtWidth { get; set; } /// /// Gets or sets the MaxAlbumArtHeight. /// - public int? MaxAlbumArtHeight { get; set; } + public int MaxAlbumArtHeight { get; set; } /// /// Gets or sets the MaxIconWidth. @@ -125,97 +142,92 @@ namespace MediaBrowser.Model.Dlna /// /// Gets or sets the MaxStreamingBitrate. /// - public int? MaxStreamingBitrate { get; set; } = 8000000; + public int? MaxStreamingBitrate { get; set; } /// /// Gets or sets the MaxStaticBitrate. /// - public int? MaxStaticBitrate { get; set; } = 8000000; + public int? MaxStaticBitrate { get; set; } /// /// Gets or sets the MusicStreamingTranscodingBitrate. /// - public int? MusicStreamingTranscodingBitrate { get; set; } = 128000; + public int? MusicStreamingTranscodingBitrate { get; set; } /// /// Gets or sets the MaxStaticMusicBitrate. /// - public int? MaxStaticMusicBitrate { get; set; } = 8000000; + public int? MaxStaticMusicBitrate { get; set; } /// /// Gets or sets the content of the aggregationFlags element in the urn:schemas-sonycom:av namespace. /// - public string? SonyAggregationFlags { get; set; } + public string SonyAggregationFlags { get; set; } /// /// Gets or sets the ProtocolInfo. /// - public string? ProtocolInfo { get; set; } + public string ProtocolInfo { get; set; } /// /// Gets or sets the TimelineOffsetSeconds. /// - [DefaultValue(0)] public int TimelineOffsetSeconds { get; set; } /// /// Gets or sets a value indicating whether RequiresPlainVideoItems. /// - [DefaultValue(false)] public bool RequiresPlainVideoItems { get; set; } /// /// Gets or sets a value indicating whether RequiresPlainFolders. /// - [DefaultValue(false)] public bool RequiresPlainFolders { get; set; } /// /// Gets or sets a value indicating whether EnableMSMediaReceiverRegistrar. /// - [DefaultValue(false)] public bool EnableMSMediaReceiverRegistrar { get; set; } /// /// Gets or sets a value indicating whether IgnoreTranscodeByteRangeRequests. /// - [DefaultValue(false)] public bool IgnoreTranscodeByteRangeRequests { get; set; } /// /// Gets or sets the XmlRootAttributes. /// - public XmlAttribute[] XmlRootAttributes { get; set; } = Array.Empty(); + public XmlAttribute[] XmlRootAttributes { get; set; } /// /// Gets or sets the direct play profiles. /// - public DirectPlayProfile[] DirectPlayProfiles { get; set; } = Array.Empty(); + public DirectPlayProfile[] DirectPlayProfiles { get; set; } /// /// Gets or sets the transcoding profiles. /// - public TranscodingProfile[] TranscodingProfiles { get; set; } = Array.Empty(); + public TranscodingProfile[] TranscodingProfiles { get; set; } /// /// Gets or sets the ContainerProfiles. /// - public ContainerProfile[] ContainerProfiles { get; set; } = Array.Empty(); + public ContainerProfile[] ContainerProfiles { get; set; } /// /// Gets or sets the CodecProfiles. /// - public CodecProfile[] CodecProfiles { get; set; } = Array.Empty(); + public CodecProfile[] CodecProfiles { get; set; } /// /// Gets or sets the ResponseProfiles. /// - public ResponseProfile[] ResponseProfiles { get; set; } = Array.Empty(); + public ResponseProfile[] ResponseProfiles { get; set; } /// /// Gets or sets the SubtitleProfiles. /// - public SubtitleProfile[] SubtitleProfiles { get; set; } = Array.Empty(); + public SubtitleProfile[] SubtitleProfiles { get; set; } /// /// The GetSupportedMediaTypes. @@ -232,13 +244,13 @@ namespace MediaBrowser.Model.Dlna /// The container. /// The audio Codec. /// A . - public TranscodingProfile? GetAudioTranscodingProfile(string? container, string? audioCodec) + public TranscodingProfile GetAudioTranscodingProfile(string container, string audioCodec) { container = (container ?? string.Empty).TrimStart('.'); foreach (var i in TranscodingProfiles) { - if (i.Type != DlnaProfileType.Audio) + if (i.Type != MediaBrowser.Model.Dlna.DlnaProfileType.Audio) { continue; } @@ -266,13 +278,13 @@ namespace MediaBrowser.Model.Dlna /// The audio Codec. /// The video Codec. /// The . - public TranscodingProfile? GetVideoTranscodingProfile(string? container, string? audioCodec, string? videoCodec) + public TranscodingProfile GetVideoTranscodingProfile(string container, string audioCodec, string videoCodec) { container = (container ?? string.Empty).TrimStart('.'); foreach (var i in TranscodingProfiles) { - if (i.Type != DlnaProfileType.Video) + if (i.Type != MediaBrowser.Model.Dlna.DlnaProfileType.Video) { continue; } @@ -287,7 +299,7 @@ namespace MediaBrowser.Model.Dlna continue; } - if (!string.Equals(videoCodec, i.VideoCodec, StringComparison.OrdinalIgnoreCase)) + if (!string.Equals(videoCodec, i.VideoCodec ?? string.Empty, StringComparison.OrdinalIgnoreCase)) { continue; } @@ -308,7 +320,7 @@ namespace MediaBrowser.Model.Dlna /// The audio sample rate. /// The audio bit depth. /// The . - public ResponseProfile? GetAudioMediaProfile(string container, string? audioCodec, int? audioChannels, int? audioBitrate, int? audioSampleRate, int? audioBitDepth) + public ResponseProfile GetAudioMediaProfile(string container, string audioCodec, int? audioChannels, int? audioBitrate, int? audioSampleRate, int? audioBitDepth) { foreach (var i in ResponseProfiles) { @@ -372,7 +384,7 @@ namespace MediaBrowser.Model.Dlna /// The width. /// The height. /// The . - public ResponseProfile? GetImageMediaProfile(string container, int? width, int? height) + public ResponseProfile GetImageMediaProfile(string container, int? width, int? height) { foreach (var i in ResponseProfiles) { @@ -430,10 +442,10 @@ namespace MediaBrowser.Model.Dlna /// The video Codec tag. /// True if Avc. /// The . - public ResponseProfile? GetVideoMediaProfile( + public ResponseProfile GetVideoMediaProfile( string container, - string? audioCodec, - string? videoCodec, + string audioCodec, + string videoCodec, int? width, int? height, int? bitDepth, diff --git a/MediaBrowser.Model/Dlna/DirectPlayProfile.cs b/MediaBrowser.Model/Dlna/DirectPlayProfile.cs index fa3ad098f0..88cb839918 100644 --- a/MediaBrowser.Model/Dlna/DirectPlayProfile.cs +++ b/MediaBrowser.Model/Dlna/DirectPlayProfile.cs @@ -1,6 +1,6 @@ +#nullable disable #pragma warning disable CS1591 -using System.ComponentModel.DataAnnotations; using System.Xml.Serialization; namespace MediaBrowser.Model.Dlna @@ -8,13 +8,13 @@ namespace MediaBrowser.Model.Dlna public class DirectPlayProfile { [XmlAttribute("container")] - public string? Container { get; set; } + public string Container { get; set; } [XmlAttribute("audioCodec")] - public string? AudioCodec { get; set; } + public string AudioCodec { get; set; } [XmlAttribute("videoCodec")] - public string? VideoCodec { get; set; } + public string VideoCodec { get; set; } [XmlAttribute("type")] public DlnaProfileType Type { get; set; } diff --git a/MediaBrowser.Model/Dlna/TranscodingProfile.cs b/MediaBrowser.Model/Dlna/TranscodingProfile.cs index 214578a85e..f05e31047c 100644 --- a/MediaBrowser.Model/Dlna/TranscodingProfile.cs +++ b/MediaBrowser.Model/Dlna/TranscodingProfile.cs @@ -1,7 +1,6 @@ +#nullable disable #pragma warning disable CS1591 -using System.ComponentModel; -using System.ComponentModel.DataAnnotations; using System.Xml.Serialization; namespace MediaBrowser.Model.Dlna @@ -9,56 +8,47 @@ namespace MediaBrowser.Model.Dlna public class TranscodingProfile { [XmlAttribute("container")] - public string Container { get; set; } = string.Empty; + public string Container { get; set; } [XmlAttribute("type")] public DlnaProfileType Type { get; set; } [XmlAttribute("videoCodec")] - public string VideoCodec { get; set; } = string.Empty; + public string VideoCodec { get; set; } [XmlAttribute("audioCodec")] - public string AudioCodec { get; set; } = string.Empty; + public string AudioCodec { get; set; } [XmlAttribute("protocol")] - public string Protocol { get; set; } = string.Empty; + public string Protocol { get; set; } - [DefaultValue(false)] [XmlAttribute("estimateContentLength")] public bool EstimateContentLength { get; set; } - [DefaultValue(false)] [XmlAttribute("enableMpegtsM2TsMode")] public bool EnableMpegtsM2TsMode { get; set; } - [DefaultValue(TranscodeSeekInfo.Auto)] [XmlAttribute("transcodeSeekInfo")] public TranscodeSeekInfo TranscodeSeekInfo { get; set; } - [DefaultValue(false)] [XmlAttribute("copyTimestamps")] public bool CopyTimestamps { get; set; } - [DefaultValue(EncodingContext.Streaming)] [XmlAttribute("context")] public EncodingContext Context { get; set; } - [DefaultValue(false)] [XmlAttribute("enableSubtitlesInManifest")] public bool EnableSubtitlesInManifest { get; set; } [XmlAttribute("maxAudioChannels")] - public string? MaxAudioChannels { get; set; } + public string MaxAudioChannels { get; set; } - [DefaultValue(0)] [XmlAttribute("minSegments")] public int MinSegments { get; set; } - [DefaultValue(0)] [XmlAttribute("segmentLength")] public int SegmentLength { get; set; } - [DefaultValue(false)] [XmlAttribute("breakOnNonKeyFrames")] public bool BreakOnNonKeyFrames { get; set; }