diff options
| author | Shadowghost <Ghost_of_Stone@web.de> | 2024-09-17 20:29:43 +0200 |
|---|---|---|
| committer | Shadowghost <Ghost_of_Stone@web.de> | 2024-09-17 20:35:23 +0200 |
| commit | 2351eeba561905bafae48a948f3126797c284766 (patch) | |
| tree | 073f5b523d88eac9c98a23852e0b4ffc3f02b8ae /MediaBrowser.Model/Extensions/ContainerHelper.cs | |
| parent | 41ac5f8d76ce11a852e4dafbf20ad57d63d55f96 (diff) | |
Rework PR 6203
Diffstat (limited to 'MediaBrowser.Model/Extensions/ContainerHelper.cs')
| -rw-r--r-- | MediaBrowser.Model/Extensions/ContainerHelper.cs | 145 |
1 files changed, 145 insertions, 0 deletions
diff --git a/MediaBrowser.Model/Extensions/ContainerHelper.cs b/MediaBrowser.Model/Extensions/ContainerHelper.cs new file mode 100644 index 000000000..4b75657ff --- /dev/null +++ b/MediaBrowser.Model/Extensions/ContainerHelper.cs @@ -0,0 +1,145 @@ +using System; +using System.Collections.Generic; +using Jellyfin.Extensions; + +namespace MediaBrowser.Model.Extensions; + +/// <summary> +/// Defines the <see cref="ContainerHelper"/> class. +/// </summary> +public static class ContainerHelper +{ + /// <summary> + /// Compares two containers, returning true if an item in <paramref name="inputContainer"/> exists + /// in <paramref name="profileContainers"/>. + /// </summary> + /// <param name="profileContainers">The comma-delimited string being searched. + /// If the parameter begins with the <c>-</c> character, the operation is reversed.</param> + /// <param name="inputContainer">The comma-delimited string being matched.</param> + /// <returns>The result of the operation.</returns> + public static bool ContainsContainer(string? profileContainers, string? inputContainer) + { + var isNegativeList = false; + if (profileContainers != null && profileContainers.StartsWith('-')) + { + isNegativeList = true; + profileContainers = profileContainers[1..]; + } + + return ContainsContainer(profileContainers, isNegativeList, inputContainer); + } + + /// <summary> + /// Compares two containers, returning true if an item in <paramref name="inputContainer"/> exists + /// in <paramref name="profileContainers"/>. + /// </summary> + /// <param name="profileContainers">The comma-delimited string being searched. + /// If the parameter begins with the <c>-</c> character, the operation is reversed.</param> + /// <param name="inputContainer">The comma-delimited string being matched.</param> + /// <returns>The result of the operation.</returns> + public static bool ContainsContainer(string? profileContainers, ReadOnlySpan<char> inputContainer) + { + var isNegativeList = false; + if (profileContainers != null && profileContainers.StartsWith('-')) + { + isNegativeList = true; + profileContainers = profileContainers[1..]; + } + + return ContainsContainer(profileContainers, isNegativeList, inputContainer); + } + + /// <summary> + /// Compares two containers, returning <paramref name="isNegativeList"/> if an item in <paramref name="inputContainer"/> + /// does not exist in <paramref name="profileContainers"/>. + /// </summary> + /// <param name="profileContainers">The comma-delimited string being searched.</param> + /// <param name="isNegativeList">The boolean result to return if a match is not found.</param> + /// <param name="inputContainer">The comma-delimited string being matched.</param> + /// <returns>The result of the operation.</returns> + public static bool ContainsContainer(string? profileContainers, bool isNegativeList, string? inputContainer) + { + if (string.IsNullOrEmpty(inputContainer)) + { + return isNegativeList; + } + + return ContainsContainer(profileContainers, isNegativeList, inputContainer.AsSpan()); + } + + /// <summary> + /// Compares two containers, returning <paramref name="isNegativeList"/> if an item in <paramref name="inputContainer"/> + /// does not exist in <paramref name="profileContainers"/>. + /// </summary> + /// <param name="profileContainers">The comma-delimited string being searched.</param> + /// <param name="isNegativeList">The boolean result to return if a match is not found.</param> + /// <param name="inputContainer">The comma-delimited string being matched.</param> + /// <returns>The result of the operation.</returns> + public static bool ContainsContainer(string? profileContainers, bool isNegativeList, ReadOnlySpan<char> inputContainer) + { + if (string.IsNullOrEmpty(profileContainers)) + { + // Empty profiles always support all containers/codecs. + return true; + } + + var allInputContainers = inputContainer.Split(','); + var allProfileContainers = profileContainers.SpanSplit(','); + foreach (var container in allInputContainers) + { + if (!container.IsEmpty) + { + foreach (var profile in allProfileContainers) + { + if (container.Equals(profile, StringComparison.OrdinalIgnoreCase)) + { + return !isNegativeList; + } + } + } + } + + return isNegativeList; + } + + /// <summary> + /// Compares two containers, returning <paramref name="isNegativeList"/> if an item in <paramref name="inputContainer"/> + /// does not exist in <paramref name="profileContainers"/>. + /// </summary> + /// <param name="profileContainers">The profile containers being matched searched.</param> + /// <param name="isNegativeList">The boolean result to return if a match is not found.</param> + /// <param name="inputContainer">The comma-delimited string being matched.</param> + /// <returns>The result of the operation.</returns> + public static bool ContainsContainer(IReadOnlyList<string>? profileContainers, bool isNegativeList, string inputContainer) + { + if (profileContainers is null) + { + // Empty profiles always support all containers/codecs. + return true; + } + + var allInputContainers = inputContainer.Split(','); + foreach (var container in allInputContainers) + { + foreach (var profile in profileContainers) + { + if (string.Equals(profile, container, StringComparison.OrdinalIgnoreCase)) + { + return !isNegativeList; + } + } + } + + return isNegativeList; + } + + /// <summary> + /// Splits and input string. + /// </summary> + /// <param name="input">The input string.</param> + /// <returns>The result of the operation.</returns> + public static string[] Split(string? input) + { + return input?.Split(',', StringSplitOptions.RemoveEmptyEntries) ?? []; + } +} |
