forked from jellyfin/jellyfin
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request jellyfin#9374 from Shadowghost/fixup2
- Loading branch information
Showing
14 changed files
with
1,718 additions
and
1,133 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,74 +1,94 @@ | ||
#nullable disable | ||
#pragma warning disable CS1591 | ||
|
||
using System; | ||
using System.Collections.Generic; | ||
using System.Linq; | ||
using System.Xml.Serialization; | ||
using Jellyfin.Extensions; | ||
using MediaBrowser.Model.Extensions; | ||
|
||
namespace MediaBrowser.Model.Dlna; | ||
|
||
namespace MediaBrowser.Model.Dlna | ||
/// <summary> | ||
/// Defines the <see cref="CodecProfile"/>. | ||
/// </summary> | ||
public class CodecProfile | ||
{ | ||
public class CodecProfile | ||
/// <summary> | ||
/// Initializes a new instance of the <see cref="CodecProfile"/> class. | ||
/// </summary> | ||
public CodecProfile() | ||
{ | ||
public CodecProfile() | ||
{ | ||
Conditions = Array.Empty<ProfileCondition>(); | ||
ApplyConditions = Array.Empty<ProfileCondition>(); | ||
} | ||
|
||
[XmlAttribute("type")] | ||
public CodecType Type { get; set; } | ||
|
||
public ProfileCondition[] Conditions { get; set; } | ||
|
||
public ProfileCondition[] ApplyConditions { get; set; } | ||
|
||
[XmlAttribute("codec")] | ||
public string Codec { get; set; } | ||
Conditions = []; | ||
ApplyConditions = []; | ||
} | ||
|
||
[XmlAttribute("container")] | ||
public string Container { get; set; } | ||
/// <summary> | ||
/// Gets or sets the <see cref="CodecType"/> which this container must meet. | ||
/// </summary> | ||
[XmlAttribute("type")] | ||
public CodecType Type { get; set; } | ||
|
||
[XmlAttribute("subcontainer")] | ||
public string SubContainer { get; set; } | ||
/// <summary> | ||
/// Gets or sets the list of <see cref="ProfileCondition"/> which this profile must meet. | ||
/// </summary> | ||
public ProfileCondition[] Conditions { get; set; } | ||
|
||
public string[] GetCodecs() | ||
{ | ||
return ContainerProfile.SplitValue(Codec); | ||
} | ||
/// <summary> | ||
/// Gets or sets the list of <see cref="ProfileCondition"/> to apply if this profile is met. | ||
/// </summary> | ||
public ProfileCondition[] ApplyConditions { get; set; } | ||
|
||
private bool ContainsContainer(string container, bool useSubContainer = false) | ||
{ | ||
var containerToCheck = useSubContainer && string.Equals(Container, "hls", StringComparison.OrdinalIgnoreCase) ? SubContainer : Container; | ||
return ContainerProfile.ContainsContainer(containerToCheck, container); | ||
} | ||
/// <summary> | ||
/// Gets or sets the codec(s) that this profile applies to. | ||
/// </summary> | ||
[XmlAttribute("codec")] | ||
public string? Codec { get; set; } | ||
|
||
public bool ContainsAnyCodec(string codec, string container, bool useSubContainer = false) | ||
{ | ||
return ContainsAnyCodec(ContainerProfile.SplitValue(codec), container, useSubContainer); | ||
} | ||
/// <summary> | ||
/// Gets or sets the container(s) which this profile will be applied to. | ||
/// </summary> | ||
[XmlAttribute("container")] | ||
public string? Container { get; set; } | ||
|
||
public bool ContainsAnyCodec(string[] codec, string container, bool useSubContainer = false) | ||
{ | ||
if (!ContainsContainer(container, useSubContainer)) | ||
{ | ||
return false; | ||
} | ||
/// <summary> | ||
/// Gets or sets the sub-container(s) which this profile will be applied to. | ||
/// </summary> | ||
[XmlAttribute("subcontainer")] | ||
public string? SubContainer { get; set; } | ||
|
||
var codecs = GetCodecs(); | ||
if (codecs.Length == 0) | ||
{ | ||
return true; | ||
} | ||
/// <summary> | ||
/// Checks to see whether the codecs and containers contain the given parameters. | ||
/// </summary> | ||
/// <param name="codecs">The codecs to match.</param> | ||
/// <param name="container">The container to match.</param> | ||
/// <param name="useSubContainer">Consider sub-containers.</param> | ||
/// <returns>True if both conditions are met.</returns> | ||
public bool ContainsAnyCodec(IReadOnlyList<string> codecs, string? container, bool useSubContainer = false) | ||
{ | ||
var containerToCheck = useSubContainer && string.Equals(Container, "hls", StringComparison.OrdinalIgnoreCase) ? SubContainer : Container; | ||
return ContainerHelper.ContainsContainer(containerToCheck, container) && codecs.Any(c => ContainerHelper.ContainsContainer(Codec, false, c)); | ||
} | ||
|
||
foreach (var val in codec) | ||
{ | ||
if (codecs.Contains(val, StringComparison.OrdinalIgnoreCase)) | ||
{ | ||
return true; | ||
} | ||
} | ||
/// <summary> | ||
/// Checks to see whether the codecs and containers contain the given parameters. | ||
/// </summary> | ||
/// <param name="codec">The codec to match.</param> | ||
/// <param name="container">The container to match.</param> | ||
/// <param name="useSubContainer">Consider sub-containers.</param> | ||
/// <returns>True if both conditions are met.</returns> | ||
public bool ContainsAnyCodec(string? codec, string? container, bool useSubContainer = false) | ||
{ | ||
return ContainsAnyCodec(codec.AsSpan(), container, useSubContainer); | ||
} | ||
|
||
return false; | ||
} | ||
/// <summary> | ||
/// Checks to see whether the codecs and containers contain the given parameters. | ||
/// </summary> | ||
/// <param name="codec">The codec to match.</param> | ||
/// <param name="container">The container to match.</param> | ||
/// <param name="useSubContainer">Consider sub-containers.</param> | ||
/// <returns>True if both conditions are met.</returns> | ||
public bool ContainsAnyCodec(ReadOnlySpan<char> codec, string? container, bool useSubContainer = false) | ||
{ | ||
var containerToCheck = useSubContainer && string.Equals(Container, "hls", StringComparison.OrdinalIgnoreCase) ? SubContainer : Container; | ||
return ContainerHelper.ContainsContainer(containerToCheck, container) && ContainerHelper.ContainsContainer(Codec, false, codec); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,74 +1,49 @@ | ||
#pragma warning disable CS1591 | ||
#pragma warning disable CA1819 // Properties should not return arrays | ||
|
||
using System; | ||
using System.Collections.Generic; | ||
using System.Xml.Serialization; | ||
using Jellyfin.Extensions; | ||
using MediaBrowser.Model.Extensions; | ||
|
||
namespace MediaBrowser.Model.Dlna | ||
namespace MediaBrowser.Model.Dlna; | ||
|
||
/// <summary> | ||
/// Defines the <see cref="ContainerProfile"/>. | ||
/// </summary> | ||
public class ContainerProfile | ||
{ | ||
public class ContainerProfile | ||
/// <summary> | ||
/// Gets or sets the <see cref="DlnaProfileType"/> which this container must meet. | ||
/// </summary> | ||
[XmlAttribute("type")] | ||
public DlnaProfileType Type { get; set; } | ||
|
||
/// <summary> | ||
/// Gets or sets the list of <see cref="ProfileCondition"/> which this container will be applied to. | ||
/// </summary> | ||
public ProfileCondition[] Conditions { get; set; } = []; | ||
|
||
/// <summary> | ||
/// Gets or sets the container(s) which this container must meet. | ||
/// </summary> | ||
[XmlAttribute("container")] | ||
public string? Container { get; set; } | ||
|
||
/// <summary> | ||
/// Gets or sets the sub container(s) which this container must meet. | ||
/// </summary> | ||
[XmlAttribute("subcontainer")] | ||
public string? SubContainer { get; set; } | ||
|
||
/// <summary> | ||
/// Returns true if an item in <paramref name="container"/> appears in the <see cref="Container"/> property. | ||
/// </summary> | ||
/// <param name="container">The item to match.</param> | ||
/// <param name="useSubContainer">Consider subcontainers.</param> | ||
/// <returns>The result of the operation.</returns> | ||
public bool ContainsContainer(ReadOnlySpan<char> container, bool useSubContainer = false) | ||
{ | ||
[XmlAttribute("type")] | ||
public DlnaProfileType Type { get; set; } | ||
|
||
public ProfileCondition[] Conditions { get; set; } = Array.Empty<ProfileCondition>(); | ||
|
||
[XmlAttribute("container")] | ||
public string Container { get; set; } = string.Empty; | ||
|
||
public static string[] SplitValue(string? value) | ||
{ | ||
if (string.IsNullOrEmpty(value)) | ||
{ | ||
return Array.Empty<string>(); | ||
} | ||
|
||
return value.Split(',', StringSplitOptions.RemoveEmptyEntries); | ||
} | ||
|
||
public bool ContainsContainer(string? container) | ||
{ | ||
var containers = SplitValue(Container); | ||
|
||
return ContainsContainer(containers, container); | ||
} | ||
|
||
public static bool ContainsContainer(string? profileContainers, string? inputContainer) | ||
{ | ||
var isNegativeList = false; | ||
if (profileContainers is not null && profileContainers.StartsWith('-')) | ||
{ | ||
isNegativeList = true; | ||
profileContainers = profileContainers.Substring(1); | ||
} | ||
|
||
return ContainsContainer(SplitValue(profileContainers), isNegativeList, inputContainer); | ||
} | ||
|
||
public static bool ContainsContainer(string[]? profileContainers, string? inputContainer) | ||
{ | ||
return ContainsContainer(profileContainers, false, inputContainer); | ||
} | ||
|
||
public static bool ContainsContainer(string[]? profileContainers, bool isNegativeList, string? inputContainer) | ||
{ | ||
if (profileContainers is null || profileContainers.Length == 0) | ||
{ | ||
// Empty profiles always support all containers/codecs | ||
return true; | ||
} | ||
|
||
var allInputContainers = SplitValue(inputContainer); | ||
|
||
foreach (var container in allInputContainers) | ||
{ | ||
if (profileContainers.Contains(container, StringComparison.OrdinalIgnoreCase)) | ||
{ | ||
return !isNegativeList; | ||
} | ||
} | ||
|
||
return isNegativeList; | ||
} | ||
var containerToCheck = useSubContainer && string.Equals(Container, "hls", StringComparison.OrdinalIgnoreCase) ? SubContainer : Container; | ||
return ContainerHelper.ContainsContainer(containerToCheck, container); | ||
} | ||
} |
Oops, something went wrong.