using System; using System.Collections.Generic; using Jellyfin.Extensions; namespace MediaBrowser.Model.Extensions; /// /// Defines the class. /// public static class ContainerHelper { /// /// Compares two containers, returning true if an item in exists /// in . /// /// The comma-delimited string being searched. /// If the parameter begins with the - character, the operation is reversed. /// The comma-delimited string being matched. /// The result of the operation. 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); } /// /// Compares two containers, returning true if an item in exists /// in . /// /// The comma-delimited string being searched. /// If the parameter begins with the - character, the operation is reversed. /// The comma-delimited string being matched. /// The result of the operation. public static bool ContainsContainer(string? profileContainers, ReadOnlySpan inputContainer) { var isNegativeList = false; if (profileContainers != null && profileContainers.StartsWith('-')) { isNegativeList = true; profileContainers = profileContainers[1..]; } return ContainsContainer(profileContainers, isNegativeList, inputContainer); } /// /// Compares two containers, returning if an item in /// does not exist in . /// /// The comma-delimited string being searched. /// The boolean result to return if a match is not found. /// The comma-delimited string being matched. /// The result of the operation. public static bool ContainsContainer(string? profileContainers, bool isNegativeList, string? inputContainer) { if (string.IsNullOrEmpty(inputContainer)) { return isNegativeList; } return ContainsContainer(profileContainers, isNegativeList, inputContainer.AsSpan()); } /// /// Compares two containers, returning if an item in /// does not exist in . /// /// The comma-delimited string being searched. /// The boolean result to return if a match is not found. /// The comma-delimited string being matched. /// The result of the operation. public static bool ContainsContainer(string? profileContainers, bool isNegativeList, ReadOnlySpan 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; } /// /// Compares two containers, returning if an item in /// does not exist in . /// /// The profile containers being matched searched. /// The boolean result to return if a match is not found. /// The comma-delimited string being matched. /// The result of the operation. public static bool ContainsContainer(IReadOnlyList? 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; } /// /// Splits and input string. /// /// The input string. /// The result of the operation. public static string[] Split(string? input) { return input?.Split(',', StringSplitOptions.RemoveEmptyEntries) ?? []; } }