diff options
| author | Cody Robibero <cody@robibe.ro> | 2024-09-18 07:21:43 -0600 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-09-18 07:21:43 -0600 |
| commit | 8c8972f0b50d6e1db2341073681f29bb3b8a5ff5 (patch) | |
| tree | 5ac709956c5991ad139ae5d85d971fc5bbe7adc9 /MediaBrowser.Model/Extensions/ContainerHelper.cs | |
| parent | 0f9a8d8ee113d2e7aaae8a0687938fba9245229b (diff) | |
| parent | 5a5da33f44b933215c95947c479ded1cdbadbcd9 (diff) | |
Merge pull request #9374 from Shadowghost/fixup2
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 0000000000..c86328ba68 --- /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 (!profile.IsEmpty && 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 = Split(inputContainer); + 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) ?? []; + } +} |
