diff options
| author | JPVenson <github@jpb.email> | 2024-10-08 09:34:34 +0000 |
|---|---|---|
| committer | JPVenson <github@jpb.email> | 2024-10-08 09:34:34 +0000 |
| commit | d3a3d9fce3b891eb0be274a0cdc45a989e557652 (patch) | |
| tree | bd232ef477c259f1fafa204016f6efd4dcb8691f /MediaBrowser.Model/Extensions/ContainerHelper.cs | |
| parent | ee1bdf4e222125ed7382165fd7e09599ca4bd4aa (diff) | |
| parent | aaf20592bb0bbdf4f0f0d99fed091758e68ae850 (diff) | |
Merge remote-tracking branch 'jellyfinorigin/master' into feature/EFUserData
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..c86328ba6 --- /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) ?? []; + } +} |
