repo creation with initial code after cloning public repo

This commit is contained in:
2026-02-19 07:36:25 -05:00
commit 460884fea3
2860 changed files with 650825 additions and 0 deletions
@@ -0,0 +1,150 @@
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.
/// If the parameter is empty or null, all containers in <paramref name="inputContainer"/> will be accepted.</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 is not 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.
/// If the parameter is empty or null, all containers in <paramref name="inputContainer"/> will be accepted.</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 is not 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.
/// If the parameter is empty or null, all containers in <paramref name="inputContainer"/> will be accepted.</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.
/// If the parameter is empty or null, all containers in <paramref name="inputContainer"/> will be accepted.</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.
/// If the parameter is empty or null, all containers in <paramref name="inputContainer"/> will be accepted.</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) ?? [];
}
}
@@ -0,0 +1,57 @@
using System;
using System.Collections.Generic;
using System.Linq;
using MediaBrowser.Model.Providers;
namespace MediaBrowser.Model.Extensions
{
/// <summary>
/// Extension methods for <see cref="IEnumerable{T}"/>.
/// </summary>
public static class EnumerableExtensions
{
/// <summary>
/// Orders <see cref="RemoteImageInfo"/> by requested language in descending order, prioritizing "en" over other non-matches.
/// </summary>
/// <param name="remoteImageInfos">The remote image infos.</param>
/// <param name="requestedLanguage">The requested language for the images.</param>
/// <returns>The ordered remote image infos.</returns>
public static IEnumerable<RemoteImageInfo> OrderByLanguageDescending(this IEnumerable<RemoteImageInfo> remoteImageInfos, string requestedLanguage)
{
if (string.IsNullOrWhiteSpace(requestedLanguage))
{
// Default to English if no requested language is specified.
requestedLanguage = "en";
}
return remoteImageInfos.OrderByDescending(i =>
{
// Image priority ordering:
// - Images that match the requested language
// - Images with no language
// - TODO: Images that match the original language
// - Images in English
// - Images that don't match the requested language
if (string.Equals(requestedLanguage, i.Language, StringComparison.OrdinalIgnoreCase))
{
return 4;
}
if (string.IsNullOrEmpty(i.Language))
{
return 3;
}
if (string.Equals(i.Language, "en", StringComparison.OrdinalIgnoreCase))
{
return 2;
}
return 0;
})
.ThenByDescending(i => Math.Round(i.CommunityRating ?? 0, 1) )
.ThenByDescending(i => i.VoteCount ?? 0);
}
}
}
@@ -0,0 +1,34 @@
using System;
using System.Linq;
using MediaBrowser.Model.Configuration;
namespace MediaBrowser.Model.Extensions;
/// <summary>
/// Extensions for <see cref="LibraryOptions"/>.
/// </summary>
public static class LibraryOptionsExtension
{
/// <summary>
/// Get the custom tag delimiters.
/// </summary>
/// <param name="options">This LibraryOptions.</param>
/// <returns>CustomTagDelimiters in char[].</returns>
public static char[] GetCustomTagDelimiters(this LibraryOptions options)
{
ArgumentNullException.ThrowIfNull(options);
var delimiterList = options.CustomTagDelimiters.Select<string, char?>(x =>
{
var isChar = char.TryParse(x, out var c);
if (isChar)
{
return c;
}
return null;
}).Where(x => x is not null).Select(x => x!.Value).ToList();
delimiterList.Add('\0');
return delimiterList.ToArray();
}
}
@@ -0,0 +1,38 @@
using System;
namespace MediaBrowser.Model.Extensions
{
/// <summary>
/// Helper methods for manipulating strings.
/// </summary>
public static class StringHelper
{
/// <summary>
/// Returns the string with the first character as uppercase.
/// </summary>
/// <param name="str">The input string.</param>
/// <returns>The string with the first character as uppercase.</returns>
public static string FirstToUpper(string str)
{
if (str.Length == 0)
{
return str;
}
// We check IsLower instead of IsUpper because both return false for non-letters
if (!char.IsLower(str[0]))
{
return str;
}
return string.Create(
str.Length,
str.AsSpan(),
(chars, buf) =>
{
chars[0] = char.ToUpperInvariant(buf[0]);
buf.Slice(1).CopyTo(chars.Slice(1));
});
}
}
}