Updated code to correct build errors for Jellyfin.Extensions

This commit is contained in:
2026-02-20 11:24:16 -05:00
parent d5fdbec943
commit 44ab9e1d6d
70 changed files with 12677 additions and 420 deletions
@@ -14,7 +14,7 @@ using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("Jellyfin.CodeAnalysis")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+f47555f2aa4eff7dcc5c5ef5bbda374f292f0638")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+d5fdbec943d63c7347d69788f4e23f2ba6acd5df")]
[assembly: System.Reflection.AssemblyProductAttribute("Jellyfin.CodeAnalysis")]
[assembly: System.Reflection.AssemblyTitleAttribute("Jellyfin.CodeAnalysis")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
@@ -1 +1 @@
cfe4822f334685403d8dd28c9794902cf41ac16cf3fdae734ed53b2348acf886
01be5b7a7d11c265e3c9319eedb944305ba9c03e308798d4520f783c5e3126c5
+5 -2
View File
@@ -2,10 +2,11 @@
// Copyright (c) PlaceholderCompany. All rights reserved.
// </copyright>
using System.Collections.Generic;
namespace Jellyfin.Extensions
{
using System;
using System.Collections.Generic;
/// <summary>
/// Provides <c>CopyTo</c> extensions methods for <see cref="IReadOnlyList{T}" />.
/// </summary>
@@ -21,6 +22,8 @@ namespace Jellyfin.Extensions
/// <typeparam name="T">The type of the array.</typeparam>
public static void CopyTo<T>(this IReadOnlyList<T> source, IList<T> destination, int index = 0)
{
ArgumentNullException.ThrowIfNull(source);
ArgumentNullException.ThrowIfNull(destination);
for (int i = 0; i < source.Count; i++)
{
destination[index + i] = source[i];
@@ -2,10 +2,11 @@
// Copyright (c) PlaceholderCompany. All rights reserved.
// </copyright>
using System.Collections.Generic;
namespace Jellyfin.Extensions
{
using System;
using System.Collections.Generic;
/// <summary>
/// Static extensions for the <see cref="IReadOnlyDictionary{TKey,TValue}"/> interface.
/// </summary>
@@ -23,6 +24,7 @@ namespace Jellyfin.Extensions
/// <returns>System.String.</returns>
public static string? GetFirstNotNullNorWhiteSpaceValue(this IReadOnlyDictionary<string, string> dictionary, string key1, string? key2 = null, string? key3 = null, string? key4 = null)
{
ArgumentNullException.ThrowIfNull(dictionary);
if (dictionary.TryGetValue(key1, out var val) && !string.IsNullOrWhiteSpace(val))
{
return val;
+56 -56
View File
@@ -2,35 +2,45 @@
// Copyright (c) PlaceholderCompany. All rights reserved.
// </copyright>
using System;
using System.Collections.Generic;
using System.Linq;
namespace Jellyfin.Extensions;
/// <summary>
/// Static extensions for the <see cref="IEnumerable{T}"/> interface.
/// </summary>
public static class EnumerableExtensions
namespace Jellyfin.Extensions
{
/// <summary>
/// Determines whether the value is contained in the source collection.
/// </summary>
/// <param name="source">An instance of the <see cref="IEnumerable{String}"/> interface.</param>
/// <param name="value">The value to look for in the collection.</param>
/// <param name="stringComparison">The string comparison.</param>
/// <returns>A value indicating whether the value is contained in the collection.</returns>
/// <exception cref="ArgumentNullException">The source is null.</exception>
public static bool Contains(this IEnumerable<string> source, ReadOnlySpan<char> value, StringComparison stringComparison)
{
ArgumentNullException.ThrowIfNull(source);
using System;
using System.Collections.Generic;
if (source is IList<string> list)
/// <summary>
/// Static extensions for the <see cref="IEnumerable{T}"/> interface.
/// </summary>
public static class EnumerableExtensions
{
/// <summary>
/// Determines whether the value is contained in the source collection.
/// </summary>
/// <param name="source">An instance of the <see cref="IEnumerable{String}"/> interface.</param>
/// <param name="value">The value to look for in the collection.</param>
/// <param name="stringComparison">The string comparison.</param>
/// <returns>A value indicating whether the value is contained in the collection.</returns>
/// <exception cref="ArgumentNullException">The source is null.</exception>
public static bool Contains(this IEnumerable<string> source, ReadOnlySpan<char> value, StringComparison stringComparison)
{
int len = list.Count;
for (int i = 0; i < len; i++)
ArgumentNullException.ThrowIfNull(source);
if (source is IList<string> list)
{
if (value.Equals(list[i], stringComparison))
int len = list.Count;
for (int i = 0; i < len; i++)
{
if (value.Equals(list[i], stringComparison))
{
return true;
}
}
return false;
}
foreach (string element in source)
{
if (value.Equals(element, stringComparison))
{
return true;
}
@@ -39,42 +49,32 @@ public static class EnumerableExtensions
return false;
}
foreach (string element in source)
/// <summary>
/// Gets an IEnumerable from a single item.
/// </summary>
/// <param name="item">The item to return.</param>
/// <typeparam name="T">The type of item.</typeparam>
/// <returns>The IEnumerable{T}.</returns>
public static IEnumerable<T> SingleItemAsEnumerable<T>(this T item)
{
if (value.Equals(element, stringComparison))
{
return true;
}
yield return item;
}
return false;
}
/// <summary>
/// Gets an IEnumerable from a single item.
/// </summary>
/// <param name="item">The item to return.</param>
/// <typeparam name="T">The type of item.</typeparam>
/// <returns>The IEnumerable{T}.</returns>
public static IEnumerable<T> SingleItemAsEnumerable<T>(this T item)
{
yield return item;
}
/// <summary>
/// Gets an IEnumerable consisting of all flags of an enum.
/// </summary>
/// <param name="flags">The flags enum.</param>
/// <typeparam name="T">The type of item.</typeparam>
/// <returns>The IEnumerable{Enum}.</returns>
public static IEnumerable<T> GetUniqueFlags<T>(this T flags)
where T : struct, Enum
{
foreach (T value in Enum.GetValues<T>())
/// <summary>
/// Gets an IEnumerable consisting of all flags of an enum.
/// </summary>
/// <param name="flags">The flags enum.</param>
/// <typeparam name="T">The type of item.</typeparam>
/// <returns>The IEnumerable{Enum}.</returns>
public static IEnumerable<T> GetUniqueFlags<T>(this T flags)
where T : struct, Enum
{
if (flags.HasFlag(value))
foreach (T value in Enum.GetValues<T>())
{
yield return value;
if (flags.HasFlag(value))
{
yield return value;
}
}
}
}
+13 -12
View File
@@ -2,23 +2,24 @@
// Copyright (c) PlaceholderCompany. All rights reserved.
// </copyright>
using System.IO;
namespace Jellyfin.Extensions;
/// <summary>
/// Provides helper functions for <see cref="File" />.
/// </summary>
public static class FileHelper
namespace Jellyfin.Extensions
{
using System.IO;
/// <summary>
/// Creates, or truncates a file in the specified path.
/// Provides helper functions for <see cref="File" />.
/// </summary>
/// <param name="path">The path and name of the file to create.</param>
public static void CreateEmpty(string path)
public static class FileHelper
{
using (File.OpenHandle(path, FileMode.Create, FileAccess.ReadWrite, FileShare.None))
/// <summary>
/// Creates, or truncates a file in the specified path.
/// </summary>
/// <param name="path">The path and name of the file to create.</param>
public static void CreateEmpty(string path)
{
using (File.OpenHandle(path, FileMode.Create, FileAccess.ReadWrite, FileShare.None))
{
}
}
}
}
@@ -2,41 +2,44 @@
// Copyright (c) PlaceholderCompany. All rights reserved.
// </copyright>
using System;
using System.IO;
#pragma warning disable SA1309 // Variables should not begin with underscore
namespace Jellyfin.Extensions;
/// <summary>
/// A custom StreamWriter which supports setting a IFormatProvider.
/// </summary>
public class FormattingStreamWriter : StreamWriter
namespace Jellyfin.Extensions
{
private readonly IFormatProvider _formatProvider;
using System;
using System.IO;
/// <summary>
/// Initializes a new instance of the <see cref="FormattingStreamWriter"/> class.
/// A custom StreamWriter which supports setting a IFormatProvider.
/// </summary>
/// <param name="stream">The stream to write to.</param>
/// <param name="formatProvider">The format provider to use.</param>
public FormattingStreamWriter(Stream stream, IFormatProvider formatProvider)
: base(stream)
public class FormattingStreamWriter : StreamWriter
{
_formatProvider = formatProvider;
}
private readonly IFormatProvider _formatProvider;
/// <summary>
/// Initializes a new instance of the <see cref="FormattingStreamWriter"/> class.
/// </summary>
/// <param name="path">The complete file path to write to.</param>
/// <param name="formatProvider">The format provider to use.</param>
public FormattingStreamWriter(string path, IFormatProvider formatProvider)
: base(path)
{
_formatProvider = formatProvider;
}
/// <summary>
/// Initializes a new instance of the <see cref="FormattingStreamWriter"/> class.
/// </summary>
/// <param name="stream">The stream to write to.</param>
/// <param name="formatProvider">The format provider to use.</param>
public FormattingStreamWriter(Stream stream, IFormatProvider formatProvider)
: base(stream)
{
this._formatProvider = formatProvider;
}
/// <inheritdoc />
public override IFormatProvider FormatProvider
=> _formatProvider;
/// <summary>
/// Initializes a new instance of the <see cref="FormattingStreamWriter"/> class.
/// </summary>
/// <param name="path">The complete file path to write to.</param>
/// <param name="formatProvider">The format provider to use.</param>
public FormattingStreamWriter(string path, IFormatProvider formatProvider)
: base(path)
{
this._formatProvider = formatProvider;
}
/// <inheritdoc />
public override IFormatProvider FormatProvider
=> this._formatProvider;
}
}
+23 -20
View File
@@ -2,29 +2,32 @@
// Copyright (c) PlaceholderCompany. All rights reserved.
// </copyright>
using System;
using System.Diagnostics.CodeAnalysis;
#pragma warning disable CA1720 // Variable contains type name
namespace Jellyfin.Extensions;
/// <summary>
/// Guid specific extensions.
/// </summary>
public static class GuidExtensions
namespace Jellyfin.Extensions
{
/// <summary>
/// Determine whether the guid is default.
/// </summary>
/// <param name="guid">The guid.</param>
/// <returns>Whether the guid is the default value.</returns>
public static bool IsEmpty(this Guid guid)
=> guid.Equals(default);
using System;
using System.Diagnostics.CodeAnalysis;
/// <summary>
/// Determine whether the guid is null or default.
/// Guid specific extensions.
/// </summary>
/// <param name="guid">The guid.</param>
/// <returns>Whether the guid is null or the default valueF.</returns>
public static bool IsNullOrEmpty([NotNullWhen(false)] this Guid? guid)
=> guid is null || guid.Value.IsEmpty();
public static class GuidExtensions
{
/// <summary>
/// Determine whether the guid is default.
/// </summary>
/// <param name="guid">The guid.</param>
/// <returns>Whether the guid is the default value.</returns>
public static bool IsEmpty(this Guid guid)
=> guid.Equals(default);
/// <summary>
/// Determine whether the guid is null or default.
/// </summary>
/// <param name="guid">The guid.</param>
/// <returns>Whether the guid is null or the default valueF.</returns>
public static bool IsNullOrEmpty([NotNullWhen(false)] this Guid? guid)
=> guid is null || guid.Value.IsEmpty();
}
}
@@ -2,12 +2,12 @@
// Copyright (c) PlaceholderCompany. All rights reserved.
// </copyright>
using System;
using System.Text.Json;
using System.Text.Json.Serialization;
namespace Jellyfin.Extensions.Json.Converters
{
using System;
using System.Text.Json;
using System.Text.Json.Serialization;
/// <summary>
/// Converts a number to a boolean.
/// This is needed for HDHomerun.
@@ -28,6 +28,7 @@ namespace Jellyfin.Extensions.Json.Converters
/// <inheritdoc />
public override void Write(Utf8JsonWriter writer, bool value, JsonSerializerOptions options)
{
ArgumentNullException.ThrowIfNull(writer);
writer.WriteBooleanValue(value);
}
}
@@ -2,36 +2,40 @@
// Copyright (c) PlaceholderCompany. All rights reserved.
// </copyright>
using System;
using System.Buffers;
using System.Buffers.Text;
using System.Text.Json;
using System.Text.Json.Serialization;
namespace Jellyfin.Extensions.Json.Converters;
/// <summary>
/// Converts a string to a boolean.
/// This is needed for FFprobe.
/// </summary>
public class JsonBoolStringConverter : JsonConverter<bool>
namespace Jellyfin.Extensions.Json.Converters
{
/// <inheritdoc />
public override bool Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
using System;
using System.Buffers;
using System.Buffers.Text;
using System.Text.Json;
using System.Text.Json.Serialization;
/// <summary>
/// Converts a string to a boolean.
/// This is needed for FFprobe.
/// </summary>
public class JsonBoolStringConverter : JsonConverter<bool>
{
if (reader.TokenType == JsonTokenType.String)
/// <inheritdoc />
public override bool Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
ReadOnlySpan<byte> utf8Span = reader.HasValueSequence ? reader.ValueSequence.ToArray() : reader.ValueSpan;
if (Utf8Parser.TryParse(utf8Span, out bool val, out _, 'l'))
if (reader.TokenType == JsonTokenType.String)
{
return val;
ReadOnlySpan<byte> utf8Span = reader.HasValueSequence ? reader.ValueSequence.ToArray() : reader.ValueSpan;
if (Utf8Parser.TryParse(utf8Span, out bool val, out _, 'l'))
{
return val;
}
}
return reader.GetBoolean();
}
return reader.GetBoolean();
/// <inheritdoc />
public override void Write(Utf8JsonWriter writer, bool value, JsonSerializerOptions options)
{
ArgumentNullException.ThrowIfNull(writer);
writer.WriteBooleanValue(value);
}
}
/// <inheritdoc />
public override void Write(Utf8JsonWriter writer, bool value, JsonSerializerOptions options)
=> writer.WriteBooleanValue(value);
}
@@ -13,7 +13,8 @@ namespace Jellyfin.Extensions.Json.Converters
/// <summary>
/// Initializes a new instance of the <see cref="JsonCommaDelimitedCollectionConverter{T}"/> class.
/// </summary>
public JsonCommaDelimitedCollectionConverter() : base()
public JsonCommaDelimitedCollectionConverter()
: base()
{
}
@@ -2,13 +2,13 @@
// Copyright (c) PlaceholderCompany. All rights reserved.
// </copyright>
using System;
using System.Collections.Generic;
using System.Text.Json;
using System.Text.Json.Serialization;
namespace Jellyfin.Extensions.Json.Converters
{
using System;
using System.Collections.Generic;
using System.Text.Json;
using System.Text.Json.Serialization;
/// <summary>
/// Json comma delimited collection converter factory.
/// </summary>
@@ -20,6 +20,7 @@ namespace Jellyfin.Extensions.Json.Converters
/// <inheritdoc />
public override bool CanConvert(Type typeToConvert)
{
ArgumentNullException.ThrowIfNull(typeToConvert);
return typeToConvert.IsArray
|| (typeToConvert.IsGenericType
&& (typeToConvert.GetGenericTypeDefinition().IsAssignableFrom(typeof(IReadOnlyCollection<>)) || typeToConvert.GetGenericTypeDefinition().IsAssignableFrom(typeof(IReadOnlyList<>))));
@@ -28,6 +29,7 @@ namespace Jellyfin.Extensions.Json.Converters
/// <inheritdoc />
public override JsonConverter? CreateConverter(Type typeToConvert, JsonSerializerOptions options)
{
ArgumentNullException.ThrowIfNull(typeToConvert);
var structType = typeToConvert.GetElementType() ?? typeToConvert.GenericTypeArguments[0];
return (JsonConverter?)Activator.CreateInstance(typeof(JsonCommaDelimitedCollectionConverter<>).MakeGenericType(structType));
}
@@ -2,13 +2,13 @@
// Copyright (c) PlaceholderCompany. All rights reserved.
// </copyright>
using System;
using System.Globalization;
using System.Text.Json;
using System.Text.Json.Serialization;
namespace Jellyfin.Extensions.Json.Converters
{
using System;
using System.Globalization;
using System.Text.Json;
using System.Text.Json.Serialization;
/// <summary>
/// Legacy DateTime converter.
/// Milliseconds aren't output if zero by default.
@@ -24,6 +24,7 @@ namespace Jellyfin.Extensions.Json.Converters
/// <inheritdoc />
public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options)
{
ArgumentNullException.ThrowIfNull(writer);
if (value.Millisecond == 0)
{
// Remaining ticks value will be 0, manually format.
@@ -2,52 +2,56 @@
// Copyright (c) PlaceholderCompany. All rights reserved.
// </copyright>
using System;
using System.ComponentModel;
using System.Reflection;
using System.Text.Json;
using System.Text.Json.Serialization;
#pragma warning disable SA1309 // Variables should not begin with underscore
namespace Jellyfin.Extensions.Json.Converters;
/// <summary>
/// Json unknown enum converter.
/// </summary>
/// <typeparam name="T">The type of enum.</typeparam>
public class JsonDefaultStringEnumConverter<T> : JsonConverter<T>
where T : struct, Enum
namespace Jellyfin.Extensions.Json.Converters
{
private readonly JsonConverter<T> _baseConverter;
using System;
using System.ComponentModel;
using System.Reflection;
using System.Text.Json;
using System.Text.Json.Serialization;
/// <summary>
/// Initializes a new instance of the <see cref="JsonDefaultStringEnumConverter{T}"/> class.
/// Json unknown enum converter.
/// </summary>
/// <param name="baseConverter">The base json converter.</param>
public JsonDefaultStringEnumConverter(JsonConverter<T> baseConverter)
/// <typeparam name="T">The type of enum.</typeparam>
public class JsonDefaultStringEnumConverter<T> : JsonConverter<T>
where T : struct, Enum
{
_baseConverter = baseConverter;
}
private readonly JsonConverter<T> _baseConverter;
/// <inheritdoc />
public override T Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
if (reader.IsNull() || reader.IsEmptyString())
/// <summary>
/// Initializes a new instance of the <see cref="JsonDefaultStringEnumConverter{T}"/> class.
/// </summary>
/// <param name="baseConverter">The base json converter.</param>
public JsonDefaultStringEnumConverter(JsonConverter<T> baseConverter)
{
var customValueAttribute = typeToConvert.GetCustomAttribute<DefaultValueAttribute>();
if (customValueAttribute?.Value is null)
{
throw new InvalidOperationException($"Default value not set for '{typeToConvert.Name}'");
}
return (T)customValueAttribute.Value;
this._baseConverter = baseConverter;
}
return _baseConverter.Read(ref reader, typeToConvert, options);
}
/// <inheritdoc />
public override T Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
ArgumentNullException.ThrowIfNull(typeToConvert);
if (reader.IsNull() || reader.IsEmptyString())
{
var customValueAttribute = typeToConvert.GetCustomAttribute<DefaultValueAttribute>();
if (customValueAttribute?.Value is null)
{
throw new InvalidOperationException($"Default value not set for '{typeToConvert.Name}'");
}
/// <inheritdoc />
public override void Write(Utf8JsonWriter writer, T value, JsonSerializerOptions options)
{
_baseConverter.Write(writer, value, options);
return (T)customValueAttribute.Value;
}
return this._baseConverter.Read(ref reader, typeToConvert, options);
}
/// <inheritdoc />
public override void Write(Utf8JsonWriter writer, T value, JsonSerializerOptions options)
{
this._baseConverter.Write(writer, value, options);
}
}
}
@@ -2,34 +2,37 @@
// Copyright (c) PlaceholderCompany. All rights reserved.
// </copyright>
using System;
using System.ComponentModel;
using System.Reflection;
using System.Text.Json;
using System.Text.Json.Serialization;
#pragma warning disable SA1309 // Variables should not begin with underscore
namespace Jellyfin.Extensions.Json.Converters;
/// <summary>
/// Utilizes the JsonStringEnumConverter and sets a default value if not provided.
/// </summary>
public class JsonDefaultStringEnumConverterFactory : JsonConverterFactory
namespace Jellyfin.Extensions.Json.Converters
{
private static readonly JsonStringEnumConverter _baseConverterFactory = new();
using System;
using System.ComponentModel;
using System.Reflection;
using System.Text.Json;
using System.Text.Json.Serialization;
/// <inheritdoc />
public override bool CanConvert(Type typeToConvert)
/// <summary>
/// Utilizes the JsonStringEnumConverter and sets a default value if not provided.
/// </summary>
public class JsonDefaultStringEnumConverterFactory : JsonConverterFactory
{
return _baseConverterFactory.CanConvert(typeToConvert)
&& typeToConvert.IsDefined(typeof(DefaultValueAttribute));
}
private static readonly JsonStringEnumConverter _baseConverterFactory = new();
/// <inheritdoc />
public override JsonConverter? CreateConverter(Type typeToConvert, JsonSerializerOptions options)
{
var baseConverter = _baseConverterFactory.CreateConverter(typeToConvert, options);
var converterType = typeof(JsonDefaultStringEnumConverter<>).MakeGenericType(typeToConvert);
/// <inheritdoc />
public override bool CanConvert(Type typeToConvert)
{
return _baseConverterFactory.CanConvert(typeToConvert)
&& typeToConvert.IsDefined(typeof(DefaultValueAttribute));
}
return (JsonConverter?)Activator.CreateInstance(converterType, baseConverter);
/// <inheritdoc />
public override JsonConverter? CreateConverter(Type typeToConvert, JsonSerializerOptions options)
{
var baseConverter = _baseConverterFactory.CreateConverter(typeToConvert, options);
var converterType = typeof(JsonDefaultStringEnumConverter<>).MakeGenericType(typeToConvert);
return (JsonConverter?)Activator.CreateInstance(converterType, baseConverter);
}
}
}
@@ -2,14 +2,16 @@
// Copyright (c) PlaceholderCompany. All rights reserved.
// </copyright>
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Text.Json;
using System.Text.Json.Serialization;
#pragma warning disable SA1309 // Variables should not begin with underscore
namespace Jellyfin.Extensions.Json.Converters
{
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Text.Json;
using System.Text.Json.Serialization;
/// <summary>
/// Convert delimited string to array of type.
/// </summary>
@@ -23,7 +25,7 @@ namespace Jellyfin.Extensions.Json.Converters
/// </summary>
protected JsonDelimitedCollectionConverter()
{
_typeConverter = TypeDescriptor.GetConverter(typeof(T));
this._typeConverter = TypeDescriptor.GetConverter(typeof(T));
}
/// <summary>
@@ -37,7 +39,7 @@ namespace Jellyfin.Extensions.Json.Converters
if (reader.TokenType == JsonTokenType.String)
{
// null got handled higher up the call stack
var stringEntries = reader.GetString()!.Split(Delimiter, StringSplitOptions.RemoveEmptyEntries);
var stringEntries = reader.GetString()!.Split(this.Delimiter, StringSplitOptions.RemoveEmptyEntries);
if (stringEntries.Length == 0)
{
return [];
@@ -48,7 +50,7 @@ namespace Jellyfin.Extensions.Json.Converters
{
try
{
var parsedValue = _typeConverter.ConvertFromInvariantString(stringEntries[i].Trim());
var parsedValue = this._typeConverter.ConvertFromInvariantString(stringEntries[i].Trim());
if (parsedValue is not null)
{
typedValues.Add((T)parsedValue);
@@ -60,6 +62,7 @@ namespace Jellyfin.Extensions.Json.Converters
}
}
ArgumentNullException.ThrowIfNull(typeToConvert);
if (typeToConvert.IsArray)
{
return typedValues.ToArray();
@@ -2,39 +2,43 @@
// Copyright (c) PlaceholderCompany. All rights reserved.
// </copyright>
using System;
using System.Text.Json;
using System.Text.Json.Serialization;
#pragma warning disable SA1309 // Variables should not begin with underscore
namespace Jellyfin.Extensions.Json.Converters;
/// <summary>
/// Enum flag to json array converter.
/// </summary>
/// <typeparam name="T">The type of enum.</typeparam>
public class JsonFlagEnumConverter<T> : JsonConverter<T>
where T : struct, Enum
namespace Jellyfin.Extensions.Json.Converters
{
private static readonly T[] _enumValues = Enum.GetValues<T>();
using System;
using System.Text.Json;
using System.Text.Json.Serialization;
/// <inheritdoc />
public override T Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
/// <summary>
/// Enum flag to json array converter.
/// </summary>
/// <typeparam name="T">The type of enum.</typeparam>
public class JsonFlagEnumConverter<T> : JsonConverter<T>
where T : struct, Enum
{
throw new NotImplementedException();
}
private static readonly T[] _enumValues = Enum.GetValues<T>();
/// <inheritdoc />
public override void Write(Utf8JsonWriter writer, T value, JsonSerializerOptions options)
{
writer.WriteStartArray();
foreach (var enumValue in _enumValues)
/// <inheritdoc />
public override T Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
if (value.HasFlag(enumValue))
{
writer.WriteStringValue(enumValue.ToString());
}
throw new NotImplementedException();
}
writer.WriteEndArray();
/// <inheritdoc />
public override void Write(Utf8JsonWriter writer, T value, JsonSerializerOptions options)
{
ArgumentNullException.ThrowIfNull(writer);
writer.WriteStartArray();
foreach (var enumValue in _enumValues)
{
if (value.HasFlag(enumValue))
{
writer.WriteStringValue(enumValue.ToString());
}
}
writer.WriteEndArray();
}
}
}
@@ -2,27 +2,29 @@
// Copyright (c) PlaceholderCompany. All rights reserved.
// </copyright>
using System;
using System.Reflection;
using System.Text.Json;
using System.Text.Json.Serialization;
namespace Jellyfin.Extensions.Json.Converters;
/// <summary>
/// Json flag enum converter factory.
/// </summary>
public class JsonFlagEnumConverterFactory : JsonConverterFactory
namespace Jellyfin.Extensions.Json.Converters
{
/// <inheritdoc />
public override bool CanConvert(Type typeToConvert)
{
return typeToConvert.IsEnum && typeToConvert.IsDefined(typeof(FlagsAttribute));
}
using System;
using System.Reflection;
using System.Text.Json;
using System.Text.Json.Serialization;
/// <inheritdoc />
public override JsonConverter? CreateConverter(Type typeToConvert, JsonSerializerOptions options)
/// <summary>
/// Json flag enum converter factory.
/// </summary>
public class JsonFlagEnumConverterFactory : JsonConverterFactory
{
return (JsonConverter?)Activator.CreateInstance(typeof(JsonFlagEnumConverter<>).MakeGenericType(typeToConvert));
/// <inheritdoc />
public override bool CanConvert(Type typeToConvert)
{
ArgumentNullException.ThrowIfNull(typeToConvert);
return typeToConvert.IsEnum && typeToConvert.IsDefined(typeof(FlagsAttribute));
}
/// <inheritdoc />
public override JsonConverter? CreateConverter(Type typeToConvert, JsonSerializerOptions options)
{
return (JsonConverter?)Activator.CreateInstance(typeof(JsonFlagEnumConverter<>).MakeGenericType(typeToConvert));
}
}
}
@@ -2,13 +2,15 @@
// Copyright (c) PlaceholderCompany. All rights reserved.
// </copyright>
using System;
using System.Globalization;
using System.Text.Json;
using System.Text.Json.Serialization;
#pragma warning disable SA1600 // Elements should be documented
namespace Jellyfin.Extensions.Json.Converters
{
using System;
using System.Globalization;
using System.Text.Json;
using System.Text.Json.Serialization;
/// <summary>
/// Converts a GUID object or value to/from JSON.
/// </summary>
@@ -20,14 +22,17 @@ namespace Jellyfin.Extensions.Json.Converters
? Guid.Empty
: ReadInternal(ref reader);
/// <inheritdoc />
public override void Write(Utf8JsonWriter writer, Guid value, JsonSerializerOptions options)
{
ArgumentNullException.ThrowIfNull(writer);
WriteInternal(writer, value);
}
// TODO: optimize by parsing the UTF8 bytes instead of converting to string first
internal static Guid ReadInternal(ref Utf8JsonReader reader)
=> Guid.Parse(reader.GetString()!); // null got handled higher up the call stack
/// <inheritdoc />
public override void Write(Utf8JsonWriter writer, Guid value, JsonSerializerOptions options)
=> WriteInternal(writer, value);
internal static void WriteInternal(Utf8JsonWriter writer, Guid value)
=> writer.WriteStringValue(value.ToString("N", CultureInfo.InvariantCulture));
}
@@ -2,12 +2,12 @@
// Copyright (c) PlaceholderCompany. All rights reserved.
// </copyright>
using System;
using System.Text.Json;
using System.Text.Json.Serialization;
namespace Jellyfin.Extensions.Json.Converters
{
using System;
using System.Text.Json;
using System.Text.Json.Serialization;
/// <summary>
/// Converts a GUID object or value to/from JSON.
/// </summary>
@@ -22,6 +22,7 @@ namespace Jellyfin.Extensions.Json.Converters
{
// null got handled higher up the call stack
var val = value!.Value;
ArgumentNullException.ThrowIfNull(writer);
if (val.IsEmpty())
{
writer.WriteNullValue();
@@ -2,12 +2,12 @@
// Copyright (c) PlaceholderCompany. All rights reserved.
// </copyright>
using System;
using System.Text.Json;
using System.Text.Json.Serialization;
namespace Jellyfin.Extensions.Json.Converters
{
using System;
using System.Text.Json;
using System.Text.Json.Serialization;
/// <summary>
/// Converts a nullable struct or value to/from JSON.
/// Required - some clients send an empty string.
@@ -2,12 +2,12 @@
// Copyright (c) PlaceholderCompany. All rights reserved.
// </copyright>
using System;
using System.Text.Json;
using System.Text.Json.Serialization;
namespace Jellyfin.Extensions.Json.Converters
{
using System;
using System.Text.Json;
using System.Text.Json.Serialization;
/// <summary>
/// Json nullable struct converter factory.
/// </summary>
@@ -16,6 +16,7 @@ namespace Jellyfin.Extensions.Json.Converters
/// <inheritdoc />
public override bool CanConvert(Type typeToConvert)
{
ArgumentNullException.ThrowIfNull(typeToConvert);
return typeToConvert.IsGenericType
&& typeToConvert.GetGenericTypeDefinition() == typeof(Nullable<>)
&& typeToConvert.GenericTypeArguments[0].IsValueType;
@@ -24,6 +25,7 @@ namespace Jellyfin.Extensions.Json.Converters
/// <inheritdoc />
public override JsonConverter? CreateConverter(Type typeToConvert, JsonSerializerOptions options)
{
ArgumentNullException.ThrowIfNull(typeToConvert);
var structType = typeToConvert.GenericTypeArguments[0];
return (JsonConverter?)Activator.CreateInstance(typeof(JsonNullableStructConverter<>).MakeGenericType(structType));
}
@@ -13,7 +13,8 @@ namespace Jellyfin.Extensions.Json.Converters
/// <summary>
/// Initializes a new instance of the <see cref="JsonPipeDelimitedCollectionConverter{T}"/> class.
/// </summary>
public JsonPipeDelimitedCollectionConverter() : base()
public JsonPipeDelimitedCollectionConverter()
: base()
{
}
@@ -2,13 +2,13 @@
// Copyright (c) PlaceholderCompany. All rights reserved.
// </copyright>
using System;
using System.Collections.Generic;
using System.Text.Json;
using System.Text.Json.Serialization;
namespace Jellyfin.Extensions.Json.Converters
{
using System;
using System.Collections.Generic;
using System.Text.Json;
using System.Text.Json.Serialization;
/// <summary>
/// Json Pipe delimited collection converter factory.
/// </summary>
@@ -20,6 +20,7 @@ namespace Jellyfin.Extensions.Json.Converters
/// <inheritdoc />
public override bool CanConvert(Type typeToConvert)
{
ArgumentNullException.ThrowIfNull(typeToConvert);
return typeToConvert.IsArray
|| (typeToConvert.IsGenericType
&& (typeToConvert.GetGenericTypeDefinition().IsAssignableFrom(typeof(IReadOnlyCollection<>)) || typeToConvert.GetGenericTypeDefinition().IsAssignableFrom(typeof(IReadOnlyList<>))));
@@ -28,6 +29,7 @@ namespace Jellyfin.Extensions.Json.Converters
/// <inheritdoc />
public override JsonConverter? CreateConverter(Type typeToConvert, JsonSerializerOptions options)
{
ArgumentNullException.ThrowIfNull(typeToConvert);
var structType = typeToConvert.GetElementType() ?? typeToConvert.GenericTypeArguments[0];
return (JsonConverter?)Activator.CreateInstance(typeof(JsonPipeDelimitedCollectionConverter<>).MakeGenericType(structType));
}
@@ -2,14 +2,14 @@
// Copyright (c) PlaceholderCompany. All rights reserved.
// </copyright>
using System;
using System.Buffers;
using System.Text;
using System.Text.Json;
using System.Text.Json.Serialization;
namespace Jellyfin.Extensions.Json.Converters
{
using System;
using System.Buffers;
using System.Text;
using System.Text.Json;
using System.Text.Json.Serialization;
/// <summary>
/// Converter to allow the serializer to read strings.
/// </summary>
@@ -21,7 +21,10 @@ namespace Jellyfin.Extensions.Json.Converters
/// <inheritdoc />
public override void Write(Utf8JsonWriter writer, string? value, JsonSerializerOptions options)
=> writer.WriteStringValue(value);
{
ArgumentNullException.ThrowIfNull(writer);
writer.WriteStringValue(value);
}
private static string GetRawValue(Utf8JsonReader reader)
{
@@ -2,12 +2,12 @@
// Copyright (c) PlaceholderCompany. All rights reserved.
// </copyright>
using System;
using System.Text.Json;
using System.Text.Json.Serialization;
namespace Jellyfin.Extensions.Json.Converters
{
using System;
using System.Text.Json;
using System.Text.Json.Serialization;
/// <summary>
/// Converts a Version object or value to/from JSON.
/// </summary>
@@ -22,6 +22,11 @@ namespace Jellyfin.Extensions.Json.Converters
/// <inheritdoc />
public override void Write(Utf8JsonWriter writer, Version value, JsonSerializerOptions options)
=> writer.WriteStringValue(value.ToString());
{
ArgumentNullException.ThrowIfNull(writer);
ArgumentNullException.ThrowIfNull(value);
writer.WriteStringValue(value.ToString());
}
}
}
+10 -8
View File
@@ -2,13 +2,15 @@
// Copyright (c) PlaceholderCompany. All rights reserved.
// </copyright>
using System.Text.Json;
using System.Text.Json.Serialization;
using System.Text.Json.Serialization.Metadata;
using Jellyfin.Extensions.Json.Converters;
#pragma warning disable SA1309 // Variables should not begin with underscore
namespace Jellyfin.Extensions.Json
{
using System.Text.Json;
using System.Text.Json.Serialization;
using System.Text.Json.Serialization.Metadata;
using Jellyfin.Extensions.Json.Converters;
/// <summary>
/// Helper class for having compatible JSON throughout the codebase.
/// </summary>
@@ -46,19 +48,19 @@ namespace Jellyfin.Extensions.Json
new JsonStringEnumConverter(),
new JsonNullableStructConverterFactory(),
new JsonDateTimeConverter(),
new JsonStringConverter()
new JsonStringConverter(),
},
TypeInfoResolver = new DefaultJsonTypeInfoResolver()
TypeInfoResolver = new DefaultJsonTypeInfoResolver(),
};
private static readonly JsonSerializerOptions _pascalCaseJsonSerializerOptions = new(_jsonSerializerOptions)
{
PropertyNamingPolicy = null
PropertyNamingPolicy = null,
};
private static readonly JsonSerializerOptions _camelCaseJsonSerializerOptions = new(_jsonSerializerOptions)
{
PropertyNamingPolicy = JsonNamingPolicy.CamelCase
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
};
/// <summary>
@@ -2,30 +2,31 @@
// Copyright (c) PlaceholderCompany. All rights reserved.
// </copyright>
using System.Text.Json;
namespace Jellyfin.Extensions.Json;
/// <summary>
/// Extensions for Utf8JsonReader and Utf8JsonWriter.
/// </summary>
public static class Utf8JsonExtensions
namespace Jellyfin.Extensions.Json
{
/// <summary>
/// Determines if the reader contains an empty string.
/// </summary>
/// <param name="reader">The reader.</param>
/// <returns>Whether the reader contains an empty string.</returns>
public static bool IsEmptyString(this Utf8JsonReader reader)
=> reader.TokenType == JsonTokenType.String
&& ((reader.HasValueSequence && reader.ValueSequence.IsEmpty)
|| (!reader.HasValueSequence && reader.ValueSpan.IsEmpty));
using System.Text.Json;
/// <summary>
/// Determines if the reader contains a null value.
/// Extensions for Utf8JsonReader and Utf8JsonWriter.
/// </summary>
/// <param name="reader">The reader.</param>
/// <returns>Whether the reader contains null.</returns>
public static bool IsNull(this Utf8JsonReader reader)
=> reader.TokenType == JsonTokenType.Null;
public static class Utf8JsonExtensions
{
/// <summary>
/// Determines if the reader contains an empty string.
/// </summary>
/// <param name="reader">The reader.</param>
/// <returns>Whether the reader contains an empty string.</returns>
public static bool IsEmptyString(this Utf8JsonReader reader)
=> reader.TokenType == JsonTokenType.String
&& ((reader.HasValueSequence && reader.ValueSequence.IsEmpty)
|| (!reader.HasValueSequence && reader.ValueSpan.IsEmpty));
/// <summary>
/// Determines if the reader contains a null value.
/// </summary>
/// <param name="reader">The reader.</param>
/// <returns>Whether the reader contains null.</returns>
public static bool IsNull(this Utf8JsonReader reader)
=> reader.TokenType == JsonTokenType.Null;
}
}
@@ -2,11 +2,11 @@
// Copyright (c) PlaceholderCompany. All rights reserved.
// </copyright>
using System;
using System.Collections.Generic;
namespace Jellyfin.Extensions
{
using System;
using System.Collections.Generic;
/// <summary>
/// Static extensions for the <see cref="IReadOnlyList{T}"/> interface.
/// </summary>
@@ -21,6 +21,7 @@ namespace Jellyfin.Extensions
/// <returns>Index if found, else -1.</returns>
public static int IndexOf<T>(this IReadOnlyList<T> source, T value)
{
ArgumentNullException.ThrowIfNull(source);
if (source is IList<T> list)
{
return list.IndexOf(value);
@@ -46,6 +47,8 @@ namespace Jellyfin.Extensions
/// <returns>Index if found, else -1.</returns>
public static int FindIndex<T>(this IReadOnlyList<T> source, Predicate<T> match)
{
ArgumentNullException.ThrowIfNull(source);
ArgumentNullException.ThrowIfNull(match);
if (source is List<T> list)
{
return list.FindIndex(match);
+7 -4
View File
@@ -2,11 +2,12 @@
// Copyright (c) PlaceholderCompany. All rights reserved.
// </copyright>
using System;
using System.Collections.Generic;
namespace Jellyfin.Extensions
{
using System;
using System.Collections.Generic;
using System.Security.Cryptography;
/// <summary>
/// Provides <c>Shuffle</c> extensions methods for <see cref="IList{T}" />.
/// </summary>
@@ -30,10 +31,12 @@ namespace Jellyfin.Extensions
/// <typeparam name="T">The type.</typeparam>
public static void Shuffle<T>(this IList<T> list, Random rng)
{
ArgumentNullException.ThrowIfNull(list);
int n = list.Count;
while (n > 1)
{
int k = rng.Next(n--);
ArgumentNullException.ThrowIfNull(rng);
int k = RandomNumberGenerator.GetInt32(n--);
T value = list[k];
list[k] = list[n];
list[n] = value;
@@ -28,13 +28,14 @@ SOFTWARE.
// TODO: remove when analyzer is fixed: https://github.com/dotnet/roslyn-analyzers/issues/5158
#pragma warning disable CA1034 // Nested types should not be visible
using System;
using System.Diagnostics.Contracts;
using System.Runtime.InteropServices;
#pragma warning disable SA1309 // Variables should not begin with underscore
namespace Jellyfin.Extensions
{
using System;
using System.Diagnostics.Contracts;
using System.Runtime.InteropServices;
/// <summary>
/// Extension class for splitting lines without unnecessary allocations.
/// </summary>
@@ -74,9 +75,9 @@ namespace Jellyfin.Extensions
/// <param name="separator">The separator to split on.</param>
public Enumerator(ReadOnlySpan<char> str, char separator)
{
_str = str;
_separator = separator;
Current = default;
this._str = str;
this._separator = separator;
this.Current = default;
}
/// <summary>
@@ -96,22 +97,22 @@ namespace Jellyfin.Extensions
/// <returns><c>true</c> if there is a next element; otherwise <c>false</c>.</returns>
public bool MoveNext()
{
if (_str.Length == 0)
if (this._str.Length == 0)
{
return false;
}
var span = _str;
var index = span.IndexOf(_separator);
var span = this._str;
var index = span.IndexOf(this._separator);
if (index == -1)
{
_str = ReadOnlySpan<char>.Empty;
Current = span;
this._str = ReadOnlySpan<char>.Empty;
this.Current = span;
return true;
}
Current = span.Slice(0, index);
_str = span[(index + 1)..];
this.Current = span.Slice(0, index);
this._str = span[(index + 1)..];
return true;
}
}
+10 -7
View File
@@ -2,15 +2,16 @@
// Copyright (c) PlaceholderCompany. All rights reserved.
// </copyright>
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading;
namespace Jellyfin.Extensions
{
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading;
/// <summary>
/// Class BaseExtensions.
/// </summary>
@@ -43,6 +44,7 @@ namespace Jellyfin.Extensions
/// <returns>All lines in the stream.</returns>
public static IEnumerable<string> ReadAllLines(this TextReader reader)
{
ArgumentNullException.ThrowIfNull(reader);
string? line;
while ((line = reader.ReadLine()) is not null)
{
@@ -58,6 +60,7 @@ namespace Jellyfin.Extensions
/// <returns>All lines in the stream.</returns>
public static async IAsyncEnumerable<string> ReadAllLinesAsync(this TextReader reader, [EnumeratorCancellation] CancellationToken cancellationToken = default)
{
ArgumentNullException.ThrowIfNull(reader);
string? line;
while ((line = await reader.ReadLineAsync(cancellationToken).ConfigureAwait(false)) is not null)
{
@@ -2,11 +2,12 @@
// Copyright (c) PlaceholderCompany. All rights reserved.
// </copyright>
using System.Collections.Generic;
using System.Text;
namespace Jellyfin.Extensions
{
using System;
using System.Collections.Generic;
using System.Text;
/// <summary>
/// Extension methods for the <see cref="StringBuilder"/> class.
/// </summary>
@@ -21,9 +22,11 @@ namespace Jellyfin.Extensions
/// <returns>The updated string builder.</returns>
public static StringBuilder AppendJoinInSingleQuotes(this StringBuilder builder, char delimiter, IReadOnlyList<string> values)
{
ArgumentNullException.ThrowIfNull(values);
var len = values.Count;
for (var i = 0; i < len; i++)
{
ArgumentNullException.ThrowIfNull(builder);
builder.Append('\'')
.Append(values[i])
.Append('\'')
@@ -31,6 +34,7 @@ namespace Jellyfin.Extensions
}
// remove last ,
ArgumentNullException.ThrowIfNull(builder);
builder.Length--;
return builder;
+34 -27
View File
@@ -2,41 +2,26 @@
// Copyright (c) PlaceholderCompany. All rights reserved.
// </copyright>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using ICU4N.Text;
#pragma warning disable SA1309 // Variables should not begin with underscore
#pragma warning disable SA1201 // A field should not follow a method
#pragma warning disable SA1512 // Single line comment should be proceeded by blank line
namespace Jellyfin.Extensions
{
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using ICU4N.Text;
/// <summary>
/// Provides extensions methods for <see cref="string" />.
/// </summary>
/// <summary>
/// Checks whether or not the specified string has diacritics in it.
/// </summary>
public static partial class StringExtensions
{
private static readonly Lazy<string> _transliteratorId = new(() =>
Environment.GetEnvironmentVariable("JELLYFIN_TRANSLITERATOR_ID")
?? "Any-Latin; Latin-Ascii; Lower; NFD; [:Nonspacing Mark:] Remove; [:Punctuation:] Remove;");
private static readonly Lazy<Transliterator?> _transliterator = new(() =>
{
try
{
return Transliterator.GetInstance(_transliteratorId.Value);
}
catch (ArgumentException)
{
return null;
}
});
// Matches non-conforming unicode chars
// https://mnaoumov.wordpress.com/2014/06/14/stripping-invalid-characters-from-utf-16-strings/
[GeneratedRegex("([\ud800-\udbff](?![\udc00-\udfff]))|((?<![\ud800-\udbff])[\udc00-\udfff])|()")]
private static partial Regex NonConformingUnicodeRegex();
/// <summary>
/// Removes the diacritics character from the strings.
/// </summary>
@@ -152,5 +137,27 @@ namespace Jellyfin.Extensions
{
return string.IsNullOrEmpty(text) ? text : text.AsSpan().LeftPart('\0').ToString();
}
private static readonly Lazy<string> _transliteratorId = new(() =>
Environment.GetEnvironmentVariable("JELLYFIN_TRANSLITERATOR_ID")
?? "Any-Latin; Latin-Ascii; Lower; NFD; [:Nonspacing Mark:] Remove; [:Punctuation:] Remove;");
private static readonly Lazy<Transliterator?> _transliterator = new(() =>
{
try
{
return Transliterator.GetInstance(_transliteratorId.Value);
}
catch (ArgumentException)
{
return null;
}
});
// Matches non-conforming unicode chars
// https://mnaoumov.wordpress.com/2014/06/14/stripping-invalid-characters-from-utf-16-strings/
[GeneratedRegex("([\ud800-\udbff](?![\udc00-\udfff]))|((?<![\ud800-\udbff])[\udc00-\udfff])|()")]
private static partial Regex NonConformingUnicodeRegex();
}
}
@@ -0,0 +1,24 @@
<?xml version="1.0"?>
<doc>
<assembly>
<name>Jellyfin.CodeAnalysis</name>
</assembly>
<members>
<member name="T:Jellyfin.CodeAnalysis.AsyncDisposalPatternAnalyzer">
<summary>
Analyzer to detect sync disposal of async-created IAsyncDisposable objects.
</summary>
</member>
<member name="F:Jellyfin.CodeAnalysis.AsyncDisposalPatternAnalyzer.AsyncDisposableSyncDisposal">
<summary>
Diagnostic descriptor for sync disposal of async-created IAsyncDisposable objects.
</summary>
</member>
<member name="P:Jellyfin.CodeAnalysis.AsyncDisposalPatternAnalyzer.SupportedDiagnostics">
<inheritdoc/>
</member>
<member name="M:Jellyfin.CodeAnalysis.AsyncDisposalPatternAnalyzer.Initialize(Microsoft.CodeAnalysis.Diagnostics.AnalysisContext)">
<inheritdoc/>
</member>
</members>
</doc>
@@ -0,0 +1,345 @@
{
"runtimeTarget": {
"name": ".NETCoreApp,Version=v10.0",
"signature": ""
},
"compilationOptions": {},
"targets": {
".NETCoreApp,Version=v10.0": {
"Jellyfin.Extensions/10.12.0": {
"dependencies": {
"Diacritics": "4.1.4",
"ICU4N.Transliterator": "60.1.0-alpha.356",
"Jellyfin.CodeAnalysis": "1.0.0",
"Jellyfin.Sdk": "2025.10.21"
},
"runtime": {
"Jellyfin.Extensions.dll": {}
}
},
"Diacritics/4.1.4": {
"runtime": {
"lib/net9.0/Diacritics.dll": {
"assemblyVersion": "4.1.4.0",
"fileVersion": "4.1.4.0"
}
}
},
"ICU4N/60.1.0-alpha.356": {
"dependencies": {
"J2N": "2.0.0",
"Microsoft.Extensions.Caching.Memory": "2.0.0"
},
"runtime": {
"lib/netstandard2.0/ICU4N.dll": {
"assemblyVersion": "60.0.0.0",
"fileVersion": "60.1.0.0"
}
}
},
"ICU4N.Transliterator/60.1.0-alpha.356": {
"dependencies": {
"ICU4N": "60.1.0-alpha.356"
},
"runtime": {
"lib/netstandard2.0/ICU4N.Transliterator.dll": {
"assemblyVersion": "60.0.0.0",
"fileVersion": "60.1.0.0"
}
}
},
"J2N/2.0.0": {
"runtime": {
"lib/net6.0/J2N.dll": {
"assemblyVersion": "2.0.0.0",
"fileVersion": "2.0.0.0"
}
}
},
"Jellyfin.Sdk/2025.10.21": {
"dependencies": {
"Microsoft.Kiota.Abstractions": "1.20.1",
"Microsoft.Kiota.Http.HttpClientLibrary": "1.20.1",
"Microsoft.Kiota.Serialization.Form": "1.20.1",
"Microsoft.Kiota.Serialization.Json": "1.20.1",
"Microsoft.Kiota.Serialization.Multipart": "1.20.1",
"Microsoft.Kiota.Serialization.Text": "1.20.1"
},
"runtime": {
"lib/net8.0/Jellyfin.Sdk.dll": {
"assemblyVersion": "2025.10.21.0",
"fileVersion": "2025.10.21.0"
}
}
},
"Microsoft.Extensions.Caching.Abstractions/2.0.0": {
"dependencies": {
"Microsoft.Extensions.Primitives": "2.0.0"
},
"runtime": {
"lib/netstandard2.0/Microsoft.Extensions.Caching.Abstractions.dll": {
"assemblyVersion": "2.0.0.0",
"fileVersion": "2.0.0.17205"
}
}
},
"Microsoft.Extensions.Caching.Memory/2.0.0": {
"dependencies": {
"Microsoft.Extensions.Caching.Abstractions": "2.0.0",
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.0.0",
"Microsoft.Extensions.Options": "2.0.0"
},
"runtime": {
"lib/netstandard2.0/Microsoft.Extensions.Caching.Memory.dll": {
"assemblyVersion": "2.0.0.0",
"fileVersion": "2.0.0.17205"
}
}
},
"Microsoft.Extensions.DependencyInjection.Abstractions/2.0.0": {
"runtime": {
"lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll": {
"assemblyVersion": "2.0.0.0",
"fileVersion": "2.0.0.17205"
}
}
},
"Microsoft.Extensions.Options/2.0.0": {
"dependencies": {
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.0.0",
"Microsoft.Extensions.Primitives": "2.0.0"
},
"runtime": {
"lib/netstandard2.0/Microsoft.Extensions.Options.dll": {
"assemblyVersion": "2.0.0.0",
"fileVersion": "2.0.0.17205"
}
}
},
"Microsoft.Extensions.Primitives/2.0.0": {
"runtime": {
"lib/netstandard2.0/Microsoft.Extensions.Primitives.dll": {
"assemblyVersion": "2.0.0.0",
"fileVersion": "2.0.0.17205"
}
}
},
"Microsoft.Kiota.Abstractions/1.20.1": {
"dependencies": {
"Std.UriTemplate": "2.0.5"
},
"runtime": {
"lib/net8.0/Microsoft.Kiota.Abstractions.dll": {
"assemblyVersion": "1.20.1.0",
"fileVersion": "1.20.1.0"
}
}
},
"Microsoft.Kiota.Http.HttpClientLibrary/1.20.1": {
"dependencies": {
"Microsoft.Kiota.Abstractions": "1.20.1"
},
"runtime": {
"lib/net8.0/Microsoft.Kiota.Http.HttpClientLibrary.dll": {
"assemblyVersion": "1.20.1.0",
"fileVersion": "1.20.1.0"
}
}
},
"Microsoft.Kiota.Serialization.Form/1.20.1": {
"dependencies": {
"Microsoft.Kiota.Abstractions": "1.20.1"
},
"runtime": {
"lib/net8.0/Microsoft.Kiota.Serialization.Form.dll": {
"assemblyVersion": "1.20.1.0",
"fileVersion": "1.20.1.0"
}
}
},
"Microsoft.Kiota.Serialization.Json/1.20.1": {
"dependencies": {
"Microsoft.Kiota.Abstractions": "1.20.1"
},
"runtime": {
"lib/net8.0/Microsoft.Kiota.Serialization.Json.dll": {
"assemblyVersion": "1.20.1.0",
"fileVersion": "1.20.1.0"
}
}
},
"Microsoft.Kiota.Serialization.Multipart/1.20.1": {
"dependencies": {
"Microsoft.Kiota.Abstractions": "1.20.1"
},
"runtime": {
"lib/net8.0/Microsoft.Kiota.Serialization.Multipart.dll": {
"assemblyVersion": "1.20.1.0",
"fileVersion": "1.20.1.0"
}
}
},
"Microsoft.Kiota.Serialization.Text/1.20.1": {
"dependencies": {
"Microsoft.Kiota.Abstractions": "1.20.1"
},
"runtime": {
"lib/net8.0/Microsoft.Kiota.Serialization.Text.dll": {
"assemblyVersion": "1.20.1.0",
"fileVersion": "1.20.1.0"
}
}
},
"Std.UriTemplate/2.0.5": {
"runtime": {
"lib/net5.0/Std.UriTemplate.dll": {
"assemblyVersion": "2.0.5.0",
"fileVersion": "2.0.5.0"
}
}
},
"Jellyfin.CodeAnalysis/1.0.0": {
"dependencies": {
"Jellyfin.Sdk": "2025.10.21"
},
"runtime": {
"Jellyfin.CodeAnalysis.dll": {
"assemblyVersion": "1.0.0.0",
"fileVersion": "1.0.0.0"
}
}
}
}
},
"libraries": {
"Jellyfin.Extensions/10.12.0": {
"type": "project",
"serviceable": false,
"sha512": ""
},
"Diacritics/4.1.4": {
"type": "package",
"serviceable": true,
"sha512": "sha512-9JK2bI+oWnzOK4Lu+5FXt7czofD28AMnZ95np5fkSClqioPnga1JVpjaUxVJaEpc/5HIlfikc6YI33lm2qu4mw==",
"path": "diacritics/4.1.4",
"hashPath": "diacritics.4.1.4.nupkg.sha512"
},
"ICU4N/60.1.0-alpha.356": {
"type": "package",
"serviceable": true,
"sha512": "sha512-YMZtDnjcqWzziOKiE7w6Ma7Rl5vuFDxzOsUlHh1QyfghbNEIZQOLRs9MMfwCWAjX6n9UitrF6vLXy55Z5q+4Fg==",
"path": "icu4n/60.1.0-alpha.356",
"hashPath": "icu4n.60.1.0-alpha.356.nupkg.sha512"
},
"ICU4N.Transliterator/60.1.0-alpha.356": {
"type": "package",
"serviceable": true,
"sha512": "sha512-lFOSO6bbEtB6HkWMNDJAq+rFwVyi9g6xVc5O/2xHa6iZnV7wLVDqCbaQ4W4vIeBSQZAafqhxciaEkmAvSdzlCg==",
"path": "icu4n.transliterator/60.1.0-alpha.356",
"hashPath": "icu4n.transliterator.60.1.0-alpha.356.nupkg.sha512"
},
"J2N/2.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-M5bwDajAARZiyqupU+rHQJnsVLxNBOHJ8vKYHd8LcLIb1FgLfzzcJvc31Qo5Xz/GEHFjDF9ScjKL/ks/zRTXuA==",
"path": "j2n/2.0.0",
"hashPath": "j2n.2.0.0.nupkg.sha512"
},
"Jellyfin.Sdk/2025.10.21": {
"type": "package",
"serviceable": true,
"sha512": "sha512-1pG60suEiV3v77zqLd5fO9S8m8qryxj9mZYb24Me1XgSXlaCIt0SC1V1sbFKyoG70Q3n915wT4Ko4BUanorRug==",
"path": "jellyfin.sdk/2025.10.21",
"hashPath": "jellyfin.sdk.2025.10.21.nupkg.sha512"
},
"Microsoft.Extensions.Caching.Abstractions/2.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-kGMEV53Od1ES0BDh7OOKbTW9Zu5dbbQ72yI936dvvbHlde3puuq/WRKAccFgcB2PuRjox1HFhA9+t53RYqfuEA==",
"path": "microsoft.extensions.caching.abstractions/2.0.0",
"hashPath": "microsoft.extensions.caching.abstractions.2.0.0.nupkg.sha512"
},
"Microsoft.Extensions.Caching.Memory/2.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-NqvVdYLbX7N2J2Wz9y3zjhE66JRdROiZZsGhA2u4a9IcIq/jzINC/cLM96BHA+TSOZFPxVdWneqB6/yt9u846A==",
"path": "microsoft.extensions.caching.memory/2.0.0",
"hashPath": "microsoft.extensions.caching.memory.2.0.0.nupkg.sha512"
},
"Microsoft.Extensions.DependencyInjection.Abstractions/2.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-eUdJ0Q/GfVyUJc0Jal5L1QZLceL78pvEM9wEKcHeI24KorqMDoVX+gWsMGLulQMfOwsUaPtkpQM2pFERTzSfSg==",
"path": "microsoft.extensions.dependencyinjection.abstractions/2.0.0",
"hashPath": "microsoft.extensions.dependencyinjection.abstractions.2.0.0.nupkg.sha512"
},
"Microsoft.Extensions.Options/2.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-sAKBgjl2gWsECBLLR9K54T7/uZaP2n9GhMYHay/oOLfvpvX0+iNAlQ2NJgVE352C9Fs5CDV3VbNTK8T2aNKQFA==",
"path": "microsoft.extensions.options/2.0.0",
"hashPath": "microsoft.extensions.options.2.0.0.nupkg.sha512"
},
"Microsoft.Extensions.Primitives/2.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-ukg53qNlqTrK38WA30b5qhw0GD7y3jdI9PHHASjdKyTcBHTevFM2o23tyk3pWCgAV27Bbkm+CPQ2zUe1ZOuYSA==",
"path": "microsoft.extensions.primitives/2.0.0",
"hashPath": "microsoft.extensions.primitives.2.0.0.nupkg.sha512"
},
"Microsoft.Kiota.Abstractions/1.20.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-bv1n2gnxA/O+1a26h3YB6bgcc3ZSLCjRumMh7sVkFmksLaVonhcrJpUrEtBlnnYPrnHwzm/1BYQnYjCVG7A+fA==",
"path": "microsoft.kiota.abstractions/1.20.1",
"hashPath": "microsoft.kiota.abstractions.1.20.1.nupkg.sha512"
},
"Microsoft.Kiota.Http.HttpClientLibrary/1.20.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-pQzs+9n3QAG/FKFwgIaRE0EqOXfW3rWliOdk9XZbghyRdeAtiQjSbJbpascdZlf7uatLpPYA145q6MYpLxvsgA==",
"path": "microsoft.kiota.http.httpclientlibrary/1.20.1",
"hashPath": "microsoft.kiota.http.httpclientlibrary.1.20.1.nupkg.sha512"
},
"Microsoft.Kiota.Serialization.Form/1.20.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-n7izb8GZSoatmFSpMaHmh78U3oW+YdYb2gDwhkG86COHuiGWV9s0BKBeUlFakAV00CDwaH9iFqxCQ0veYVkG1A==",
"path": "microsoft.kiota.serialization.form/1.20.1",
"hashPath": "microsoft.kiota.serialization.form.1.20.1.nupkg.sha512"
},
"Microsoft.Kiota.Serialization.Json/1.20.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-4MumZe45DI/o1YP+hq7wyArOHDhjkSiu14ysN4xWKe6vwlu43BUYydA/yT0CtjoPwbFW/6jfx/NVSvM3DzBzbg==",
"path": "microsoft.kiota.serialization.json/1.20.1",
"hashPath": "microsoft.kiota.serialization.json.1.20.1.nupkg.sha512"
},
"Microsoft.Kiota.Serialization.Multipart/1.20.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-tP7ZxA1zsIi3FE8CHwfA5JnzlW1NYld+LpFihFq+S7IXFDv1x37I968lPKGIdEpWW9vWacuqDQVKIyJiKZ257A==",
"path": "microsoft.kiota.serialization.multipart/1.20.1",
"hashPath": "microsoft.kiota.serialization.multipart.1.20.1.nupkg.sha512"
},
"Microsoft.Kiota.Serialization.Text/1.20.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-Cue4l9AeU0WgL2CdUW8K58BMwQOyiHgT7aCov2qGEKpmpeWQj7cmAWCgxDfPHYPkZtz1Ccbrw4/6KrDgCmrC3Q==",
"path": "microsoft.kiota.serialization.text/1.20.1",
"hashPath": "microsoft.kiota.serialization.text.1.20.1.nupkg.sha512"
},
"Std.UriTemplate/2.0.5": {
"type": "package",
"serviceable": true,
"sha512": "sha512-PtqPdWNBObRcDHjyjbgOz2XoCJQaiA+HNDPQve/O7yGCkospfHDCuH9ULVx1msImwHHG+uhpDjiZX7bpLN/cnw==",
"path": "std.uritemplate/2.0.5",
"hashPath": "std.uritemplate.2.0.5.nupkg.sha512"
},
"Jellyfin.CodeAnalysis/1.0.0": {
"type": "project",
"serviceable": false,
"sha512": ""
}
}
}
@@ -0,0 +1,716 @@
<?xml version="1.0"?>
<doc>
<assembly>
<name>Jellyfin.Extensions</name>
</assembly>
<members>
<member name="T:Jellyfin.Extensions.CopyToExtensions">
<summary>
Provides <c>CopyTo</c> extensions methods for <see cref="T:System.Collections.Generic.IReadOnlyList`1" />.
</summary>
</member>
<member name="M:Jellyfin.Extensions.CopyToExtensions.CopyTo``1(System.Collections.Generic.IReadOnlyList{``0},System.Collections.Generic.IList{``0},System.Int32)">
<summary>
Copies all the elements of the current collection to the specified list
starting at the specified destination array index. The index is specified as a 32-bit integer.
</summary>
<param name="source">The current collection that is the source of the elements.</param>
<param name="destination">The list that is the destination of the elements copied from the current collection.</param>
<param name="index">A 32-bit integer that represents the index in <c>destination</c> at which copying begins.</param>
<typeparam name="T">The type of the array.</typeparam>
</member>
<member name="T:Jellyfin.Extensions.DictionaryExtensions">
<summary>
Static extensions for the <see cref="T:System.Collections.Generic.IReadOnlyDictionary`2"/> interface.
</summary>
</member>
<member name="M:Jellyfin.Extensions.DictionaryExtensions.GetFirstNotNullNorWhiteSpaceValue(System.Collections.Generic.IReadOnlyDictionary{System.String,System.String},System.String,System.String,System.String,System.String)">
<summary>
Gets a string from a string dictionary, checking all keys sequentially,
stopping at the first key that returns a result that's neither null nor blank.
</summary>
<param name="dictionary">The dictionary.</param>
<param name="key1">The first checked key.</param>
<param name="key2">The second checked key.</param>
<param name="key3">The third checked key.</param>
<param name="key4">The fourth checked key.</param>
<returns>System.String.</returns>
</member>
<member name="T:Jellyfin.Extensions.EnumerableExtensions">
<summary>
Static extensions for the <see cref="T:System.Collections.Generic.IEnumerable`1"/> interface.
</summary>
</member>
<member name="M:Jellyfin.Extensions.EnumerableExtensions.Contains(System.Collections.Generic.IEnumerable{System.String},System.ReadOnlySpan{System.Char},System.StringComparison)">
<summary>
Determines whether the value is contained in the source collection.
</summary>
<param name="source">An instance of the <see cref="T:System.Collections.Generic.IEnumerable`1"/> interface.</param>
<param name="value">The value to look for in the collection.</param>
<param name="stringComparison">The string comparison.</param>
<returns>A value indicating whether the value is contained in the collection.</returns>
<exception cref="T:System.ArgumentNullException">The source is null.</exception>
</member>
<member name="M:Jellyfin.Extensions.EnumerableExtensions.SingleItemAsEnumerable``1(``0)">
<summary>
Gets an IEnumerable from a single item.
</summary>
<param name="item">The item to return.</param>
<typeparam name="T">The type of item.</typeparam>
<returns>The IEnumerable{T}.</returns>
</member>
<member name="M:Jellyfin.Extensions.EnumerableExtensions.GetUniqueFlags``1(``0)">
<summary>
Gets an IEnumerable consisting of all flags of an enum.
</summary>
<param name="flags">The flags enum.</param>
<typeparam name="T">The type of item.</typeparam>
<returns>The IEnumerable{Enum}.</returns>
</member>
<member name="T:Jellyfin.Extensions.FileHelper">
<summary>
Provides helper functions for <see cref="T:System.IO.File" />.
</summary>
</member>
<member name="M:Jellyfin.Extensions.FileHelper.CreateEmpty(System.String)">
<summary>
Creates, or truncates a file in the specified path.
</summary>
<param name="path">The path and name of the file to create.</param>
</member>
<member name="T:Jellyfin.Extensions.FormattingStreamWriter">
<summary>
A custom StreamWriter which supports setting a IFormatProvider.
</summary>
</member>
<member name="M:Jellyfin.Extensions.FormattingStreamWriter.#ctor(System.IO.Stream,System.IFormatProvider)">
<summary>
Initializes a new instance of the <see cref="T:Jellyfin.Extensions.FormattingStreamWriter"/> class.
</summary>
<param name="stream">The stream to write to.</param>
<param name="formatProvider">The format provider to use.</param>
</member>
<member name="M:Jellyfin.Extensions.FormattingStreamWriter.#ctor(System.String,System.IFormatProvider)">
<summary>
Initializes a new instance of the <see cref="T:Jellyfin.Extensions.FormattingStreamWriter"/> class.
</summary>
<param name="path">The complete file path to write to.</param>
<param name="formatProvider">The format provider to use.</param>
</member>
<member name="P:Jellyfin.Extensions.FormattingStreamWriter.FormatProvider">
<inheritdoc />
</member>
<member name="T:Jellyfin.Extensions.GuidExtensions">
<summary>
Guid specific extensions.
</summary>
</member>
<member name="M:Jellyfin.Extensions.GuidExtensions.IsEmpty(System.Guid)">
<summary>
Determine whether the guid is default.
</summary>
<param name="guid">The guid.</param>
<returns>Whether the guid is the default value.</returns>
</member>
<member name="M:Jellyfin.Extensions.GuidExtensions.IsNullOrEmpty(System.Nullable{System.Guid})">
<summary>
Determine whether the guid is null or default.
</summary>
<param name="guid">The guid.</param>
<returns>Whether the guid is null or the default valueF.</returns>
</member>
<member name="T:Jellyfin.Extensions.Json.Converters.JsonBoolNumberConverter">
<summary>
Converts a number to a boolean.
This is needed for HDHomerun.
</summary>
</member>
<member name="M:Jellyfin.Extensions.Json.Converters.JsonBoolNumberConverter.Read(System.Text.Json.Utf8JsonReader@,System.Type,System.Text.Json.JsonSerializerOptions)">
<inheritdoc />
</member>
<member name="M:Jellyfin.Extensions.Json.Converters.JsonBoolNumberConverter.Write(System.Text.Json.Utf8JsonWriter,System.Boolean,System.Text.Json.JsonSerializerOptions)">
<inheritdoc />
</member>
<member name="T:Jellyfin.Extensions.Json.Converters.JsonBoolStringConverter">
<summary>
Converts a string to a boolean.
This is needed for FFprobe.
</summary>
</member>
<member name="M:Jellyfin.Extensions.Json.Converters.JsonBoolStringConverter.Read(System.Text.Json.Utf8JsonReader@,System.Type,System.Text.Json.JsonSerializerOptions)">
<inheritdoc />
</member>
<member name="M:Jellyfin.Extensions.Json.Converters.JsonBoolStringConverter.Write(System.Text.Json.Utf8JsonWriter,System.Boolean,System.Text.Json.JsonSerializerOptions)">
<inheritdoc />
</member>
<member name="T:Jellyfin.Extensions.Json.Converters.JsonCommaDelimitedCollectionConverter`1">
<summary>
Convert comma delimited string to collection of type.
</summary>
<typeparam name="T">Type to convert to.</typeparam>
</member>
<member name="M:Jellyfin.Extensions.Json.Converters.JsonCommaDelimitedCollectionConverter`1.#ctor">
<summary>
Initializes a new instance of the <see cref="T:Jellyfin.Extensions.Json.Converters.JsonCommaDelimitedCollectionConverter`1"/> class.
</summary>
</member>
<member name="P:Jellyfin.Extensions.Json.Converters.JsonCommaDelimitedCollectionConverter`1.Delimiter">
<inheritdoc />
</member>
<member name="T:Jellyfin.Extensions.Json.Converters.JsonCommaDelimitedCollectionConverterFactory">
<summary>
Json comma delimited collection converter factory.
</summary>
<remarks>
This must be applied as an attribute, adding to the JsonConverter list causes stack overflow.
</remarks>
</member>
<member name="M:Jellyfin.Extensions.Json.Converters.JsonCommaDelimitedCollectionConverterFactory.CanConvert(System.Type)">
<inheritdoc />
</member>
<member name="M:Jellyfin.Extensions.Json.Converters.JsonCommaDelimitedCollectionConverterFactory.CreateConverter(System.Type,System.Text.Json.JsonSerializerOptions)">
<inheritdoc />
</member>
<member name="T:Jellyfin.Extensions.Json.Converters.JsonDateTimeConverter">
<summary>
Legacy DateTime converter.
Milliseconds aren't output if zero by default.
</summary>
</member>
<member name="M:Jellyfin.Extensions.Json.Converters.JsonDateTimeConverter.Read(System.Text.Json.Utf8JsonReader@,System.Type,System.Text.Json.JsonSerializerOptions)">
<inheritdoc />
</member>
<member name="M:Jellyfin.Extensions.Json.Converters.JsonDateTimeConverter.Write(System.Text.Json.Utf8JsonWriter,System.DateTime,System.Text.Json.JsonSerializerOptions)">
<inheritdoc />
</member>
<member name="T:Jellyfin.Extensions.Json.Converters.JsonDefaultStringEnumConverter`1">
<summary>
Json unknown enum converter.
</summary>
<typeparam name="T">The type of enum.</typeparam>
</member>
<member name="M:Jellyfin.Extensions.Json.Converters.JsonDefaultStringEnumConverter`1.#ctor(System.Text.Json.Serialization.JsonConverter{`0})">
<summary>
Initializes a new instance of the <see cref="T:Jellyfin.Extensions.Json.Converters.JsonDefaultStringEnumConverter`1"/> class.
</summary>
<param name="baseConverter">The base json converter.</param>
</member>
<member name="M:Jellyfin.Extensions.Json.Converters.JsonDefaultStringEnumConverter`1.Read(System.Text.Json.Utf8JsonReader@,System.Type,System.Text.Json.JsonSerializerOptions)">
<inheritdoc />
</member>
<member name="M:Jellyfin.Extensions.Json.Converters.JsonDefaultStringEnumConverter`1.Write(System.Text.Json.Utf8JsonWriter,`0,System.Text.Json.JsonSerializerOptions)">
<inheritdoc />
</member>
<member name="T:Jellyfin.Extensions.Json.Converters.JsonDefaultStringEnumConverterFactory">
<summary>
Utilizes the JsonStringEnumConverter and sets a default value if not provided.
</summary>
</member>
<member name="M:Jellyfin.Extensions.Json.Converters.JsonDefaultStringEnumConverterFactory.CanConvert(System.Type)">
<inheritdoc />
</member>
<member name="M:Jellyfin.Extensions.Json.Converters.JsonDefaultStringEnumConverterFactory.CreateConverter(System.Type,System.Text.Json.JsonSerializerOptions)">
<inheritdoc />
</member>
<member name="T:Jellyfin.Extensions.Json.Converters.JsonDelimitedCollectionConverter`1">
<summary>
Convert delimited string to array of type.
</summary>
<typeparam name="T">Type to convert to.</typeparam>
</member>
<member name="M:Jellyfin.Extensions.Json.Converters.JsonDelimitedCollectionConverter`1.#ctor">
<summary>
Initializes a new instance of the <see cref="T:Jellyfin.Extensions.Json.Converters.JsonDelimitedCollectionConverter`1"/> class.
</summary>
</member>
<member name="P:Jellyfin.Extensions.Json.Converters.JsonDelimitedCollectionConverter`1.Delimiter">
<summary>
Gets the array delimiter.
</summary>
</member>
<member name="M:Jellyfin.Extensions.Json.Converters.JsonDelimitedCollectionConverter`1.Read(System.Text.Json.Utf8JsonReader@,System.Type,System.Text.Json.JsonSerializerOptions)">
<inheritdoc />
</member>
<member name="M:Jellyfin.Extensions.Json.Converters.JsonDelimitedCollectionConverter`1.Write(System.Text.Json.Utf8JsonWriter,System.Collections.Generic.IReadOnlyCollection{`0},System.Text.Json.JsonSerializerOptions)">
<inheritdoc />
</member>
<member name="T:Jellyfin.Extensions.Json.Converters.JsonFlagEnumConverter`1">
<summary>
Enum flag to json array converter.
</summary>
<typeparam name="T">The type of enum.</typeparam>
</member>
<member name="M:Jellyfin.Extensions.Json.Converters.JsonFlagEnumConverter`1.Read(System.Text.Json.Utf8JsonReader@,System.Type,System.Text.Json.JsonSerializerOptions)">
<inheritdoc />
</member>
<member name="M:Jellyfin.Extensions.Json.Converters.JsonFlagEnumConverter`1.Write(System.Text.Json.Utf8JsonWriter,`0,System.Text.Json.JsonSerializerOptions)">
<inheritdoc />
</member>
<member name="T:Jellyfin.Extensions.Json.Converters.JsonFlagEnumConverterFactory">
<summary>
Json flag enum converter factory.
</summary>
</member>
<member name="M:Jellyfin.Extensions.Json.Converters.JsonFlagEnumConverterFactory.CanConvert(System.Type)">
<inheritdoc />
</member>
<member name="M:Jellyfin.Extensions.Json.Converters.JsonFlagEnumConverterFactory.CreateConverter(System.Type,System.Text.Json.JsonSerializerOptions)">
<inheritdoc />
</member>
<member name="T:Jellyfin.Extensions.Json.Converters.JsonGuidConverter">
<summary>
Converts a GUID object or value to/from JSON.
</summary>
</member>
<member name="M:Jellyfin.Extensions.Json.Converters.JsonGuidConverter.Read(System.Text.Json.Utf8JsonReader@,System.Type,System.Text.Json.JsonSerializerOptions)">
<inheritdoc />
</member>
<member name="M:Jellyfin.Extensions.Json.Converters.JsonGuidConverter.Write(System.Text.Json.Utf8JsonWriter,System.Guid,System.Text.Json.JsonSerializerOptions)">
<inheritdoc />
</member>
<member name="T:Jellyfin.Extensions.Json.Converters.JsonNullableGuidConverter">
<summary>
Converts a GUID object or value to/from JSON.
</summary>
</member>
<member name="M:Jellyfin.Extensions.Json.Converters.JsonNullableGuidConverter.Read(System.Text.Json.Utf8JsonReader@,System.Type,System.Text.Json.JsonSerializerOptions)">
<inheritdoc />
</member>
<member name="M:Jellyfin.Extensions.Json.Converters.JsonNullableGuidConverter.Write(System.Text.Json.Utf8JsonWriter,System.Nullable{System.Guid},System.Text.Json.JsonSerializerOptions)">
<inheritdoc />
</member>
<member name="T:Jellyfin.Extensions.Json.Converters.JsonNullableStructConverter`1">
<summary>
Converts a nullable struct or value to/from JSON.
Required - some clients send an empty string.
</summary>
<typeparam name="TStruct">The struct type.</typeparam>
</member>
<member name="M:Jellyfin.Extensions.Json.Converters.JsonNullableStructConverter`1.Read(System.Text.Json.Utf8JsonReader@,System.Type,System.Text.Json.JsonSerializerOptions)">
<inheritdoc />
</member>
<member name="M:Jellyfin.Extensions.Json.Converters.JsonNullableStructConverter`1.Write(System.Text.Json.Utf8JsonWriter,System.Nullable{`0},System.Text.Json.JsonSerializerOptions)">
<inheritdoc />
</member>
<member name="T:Jellyfin.Extensions.Json.Converters.JsonNullableStructConverterFactory">
<summary>
Json nullable struct converter factory.
</summary>
</member>
<member name="M:Jellyfin.Extensions.Json.Converters.JsonNullableStructConverterFactory.CanConvert(System.Type)">
<inheritdoc />
</member>
<member name="M:Jellyfin.Extensions.Json.Converters.JsonNullableStructConverterFactory.CreateConverter(System.Type,System.Text.Json.JsonSerializerOptions)">
<inheritdoc />
</member>
<member name="T:Jellyfin.Extensions.Json.Converters.JsonPipeDelimitedCollectionConverter`1">
<summary>
Convert Pipe delimited string to array of type.
</summary>
<typeparam name="T">Type to convert to.</typeparam>
</member>
<member name="M:Jellyfin.Extensions.Json.Converters.JsonPipeDelimitedCollectionConverter`1.#ctor">
<summary>
Initializes a new instance of the <see cref="T:Jellyfin.Extensions.Json.Converters.JsonPipeDelimitedCollectionConverter`1"/> class.
</summary>
</member>
<member name="P:Jellyfin.Extensions.Json.Converters.JsonPipeDelimitedCollectionConverter`1.Delimiter">
<inheritdoc />
</member>
<member name="T:Jellyfin.Extensions.Json.Converters.JsonPipeDelimitedCollectionConverterFactory">
<summary>
Json Pipe delimited collection converter factory.
</summary>
<remarks>
This must be applied as an attribute, adding to the JsonConverter list causes stack overflow.
</remarks>
</member>
<member name="M:Jellyfin.Extensions.Json.Converters.JsonPipeDelimitedCollectionConverterFactory.CanConvert(System.Type)">
<inheritdoc />
</member>
<member name="M:Jellyfin.Extensions.Json.Converters.JsonPipeDelimitedCollectionConverterFactory.CreateConverter(System.Type,System.Text.Json.JsonSerializerOptions)">
<inheritdoc />
</member>
<member name="T:Jellyfin.Extensions.Json.Converters.JsonStringConverter">
<summary>
Converter to allow the serializer to read strings.
</summary>
</member>
<member name="M:Jellyfin.Extensions.Json.Converters.JsonStringConverter.Read(System.Text.Json.Utf8JsonReader@,System.Type,System.Text.Json.JsonSerializerOptions)">
<inheritdoc />
</member>
<member name="M:Jellyfin.Extensions.Json.Converters.JsonStringConverter.Write(System.Text.Json.Utf8JsonWriter,System.String,System.Text.Json.JsonSerializerOptions)">
<inheritdoc />
</member>
<member name="T:Jellyfin.Extensions.Json.Converters.JsonVersionConverter">
<summary>
Converts a Version object or value to/from JSON.
</summary>
<remarks>
Required to send <see cref="T:System.Version"/> as a string instead of an object.
</remarks>
</member>
<member name="M:Jellyfin.Extensions.Json.Converters.JsonVersionConverter.Read(System.Text.Json.Utf8JsonReader@,System.Type,System.Text.Json.JsonSerializerOptions)">
<inheritdoc />
</member>
<member name="M:Jellyfin.Extensions.Json.Converters.JsonVersionConverter.Write(System.Text.Json.Utf8JsonWriter,System.Version,System.Text.Json.JsonSerializerOptions)">
<inheritdoc />
</member>
<member name="T:Jellyfin.Extensions.Json.JsonDefaults">
<summary>
Helper class for having compatible JSON throughout the codebase.
</summary>
</member>
<member name="F:Jellyfin.Extensions.Json.JsonDefaults.PascalCaseMediaType">
<summary>
Pascal case json profile media type.
</summary>
</member>
<member name="F:Jellyfin.Extensions.Json.JsonDefaults.CamelCaseMediaType">
<summary>
Camel case json profile media type.
</summary>
</member>
<member name="F:Jellyfin.Extensions.Json.JsonDefaults._jsonSerializerOptions">
<summary>
When changing these options, update
Jellyfin.Server/Extensions/ApiServiceCollectionExtensions.cs
-> AddJellyfinApi
-> AddJsonOptions.
</summary>
</member>
<member name="P:Jellyfin.Extensions.Json.JsonDefaults.Options">
<summary>
Gets the default <see cref="T:System.Text.Json.JsonSerializerOptions" /> options.
</summary>
<remarks>
The return value must not be modified.
If the defaults must be modified the author must use the copy constructor.
</remarks>
<returns>The default <see cref="T:System.Text.Json.JsonSerializerOptions" /> options.</returns>
</member>
<member name="P:Jellyfin.Extensions.Json.JsonDefaults.CamelCaseOptions">
<summary>
Gets camelCase json options.
</summary>
<remarks>
The return value must not be modified.
If the defaults must be modified the author must use the copy constructor.
</remarks>
<returns>The camelCase <see cref="T:System.Text.Json.JsonSerializerOptions" /> options.</returns>
</member>
<member name="P:Jellyfin.Extensions.Json.JsonDefaults.PascalCaseOptions">
<summary>
Gets PascalCase json options.
</summary>
<remarks>
The return value must not be modified.
If the defaults must be modified the author must use the copy constructor.
</remarks>
<returns>The PascalCase <see cref="T:System.Text.Json.JsonSerializerOptions" /> options.</returns>
</member>
<member name="T:Jellyfin.Extensions.Json.Utf8JsonExtensions">
<summary>
Extensions for Utf8JsonReader and Utf8JsonWriter.
</summary>
</member>
<member name="M:Jellyfin.Extensions.Json.Utf8JsonExtensions.IsEmptyString(System.Text.Json.Utf8JsonReader)">
<summary>
Determines if the reader contains an empty string.
</summary>
<param name="reader">The reader.</param>
<returns>Whether the reader contains an empty string.</returns>
</member>
<member name="M:Jellyfin.Extensions.Json.Utf8JsonExtensions.IsNull(System.Text.Json.Utf8JsonReader)">
<summary>
Determines if the reader contains a null value.
</summary>
<param name="reader">The reader.</param>
<returns>Whether the reader contains null.</returns>
</member>
<member name="T:Jellyfin.Extensions.ReadOnlyListExtension">
<summary>
Static extensions for the <see cref="T:System.Collections.Generic.IReadOnlyList`1"/> interface.
</summary>
</member>
<member name="M:Jellyfin.Extensions.ReadOnlyListExtension.IndexOf``1(System.Collections.Generic.IReadOnlyList{``0},``0)">
<summary>
Finds the index of the desired item.
</summary>
<param name="source">The source list.</param>
<param name="value">The value to fine.</param>
<typeparam name="T">The type of item to find.</typeparam>
<returns>Index if found, else -1.</returns>
</member>
<member name="M:Jellyfin.Extensions.ReadOnlyListExtension.FindIndex``1(System.Collections.Generic.IReadOnlyList{``0},System.Predicate{``0})">
<summary>
Finds the index of the predicate.
</summary>
<param name="source">The source list.</param>
<param name="match">The value to find.</param>
<typeparam name="T">The type of item to find.</typeparam>
<returns>Index if found, else -1.</returns>
</member>
<member name="M:Jellyfin.Extensions.ReadOnlyListExtension.FirstOrDefault``1(System.Collections.Generic.IReadOnlyList{``0})">
<summary>
Get the first or default item from a list.
</summary>
<param name="source">The source list.</param>
<typeparam name="T">The type of item.</typeparam>
<returns>The first item or default if list is empty.</returns>
</member>
<member name="T:Jellyfin.Extensions.ShuffleExtensions">
<summary>
Provides <c>Shuffle</c> extensions methods for <see cref="T:System.Collections.Generic.IList`1" />.
</summary>
</member>
<member name="M:Jellyfin.Extensions.ShuffleExtensions.Shuffle``1(System.Collections.Generic.IList{``0})">
<summary>
Shuffles the items in a list.
</summary>
<param name="list">The list that should get shuffled.</param>
<typeparam name="T">The type.</typeparam>
</member>
<member name="M:Jellyfin.Extensions.ShuffleExtensions.Shuffle``1(System.Collections.Generic.IList{``0},System.Random)">
<summary>
Shuffles the items in a list.
</summary>
<param name="list">The list that should get shuffled.</param>
<param name="rng">The random number generator to use.</param>
<typeparam name="T">The type.</typeparam>
</member>
<member name="T:Jellyfin.Extensions.SplitStringExtensions">
<summary>
Extension class for splitting lines without unnecessary allocations.
</summary>
</member>
<member name="M:Jellyfin.Extensions.SplitStringExtensions.SpanSplit(System.String,System.Char)">
<summary>
Creates a new string split enumerator.
</summary>
<param name="str">The string to split.</param>
<param name="separator">The separator to split on.</param>
<returns>The enumerator struct.</returns>
</member>
<member name="M:Jellyfin.Extensions.SplitStringExtensions.Split(System.ReadOnlySpan{System.Char},System.Char)">
<summary>
Creates a new span split enumerator.
</summary>
<param name="str">The span to split.</param>
<param name="separator">The separator to split on.</param>
<returns>The enumerator struct.</returns>
</member>
<member name="T:Jellyfin.Extensions.SplitStringExtensions.Enumerator">
<summary>
Provides an enumerator for the substrings separated by the separator.
</summary>
</member>
<member name="M:Jellyfin.Extensions.SplitStringExtensions.Enumerator.#ctor(System.ReadOnlySpan{System.Char},System.Char)">
<summary>
Initializes a new instance of the <see cref="T:Jellyfin.Extensions.SplitStringExtensions.Enumerator"/> struct.
</summary>
<param name="str">The span to split.</param>
<param name="separator">The separator to split on.</param>
</member>
<member name="P:Jellyfin.Extensions.SplitStringExtensions.Enumerator.Current">
<summary>
Gets a reference to the item at the current position of the enumerator.
</summary>
</member>
<member name="M:Jellyfin.Extensions.SplitStringExtensions.Enumerator.GetEnumerator">
<summary>
Returns <c>this</c>.
</summary>
<returns><c>this</c>.</returns>
</member>
<member name="M:Jellyfin.Extensions.SplitStringExtensions.Enumerator.MoveNext">
<summary>
Advances the enumerator to the next item.
</summary>
<returns><c>true</c> if there is a next element; otherwise <c>false</c>.</returns>
</member>
<member name="T:Jellyfin.Extensions.StreamExtensions">
<summary>
Class BaseExtensions.
</summary>
</member>
<member name="M:Jellyfin.Extensions.StreamExtensions.ReadAllLines(System.IO.Stream)">
<summary>
Reads all lines in the <see cref="T:System.IO.Stream" />.
</summary>
<param name="stream">The <see cref="T:System.IO.Stream" /> to read from.</param>
<returns>All lines in the stream.</returns>
</member>
<member name="M:Jellyfin.Extensions.StreamExtensions.ReadAllLines(System.IO.Stream,System.Text.Encoding)">
<summary>
Reads all lines in the <see cref="T:System.IO.Stream" />.
</summary>
<param name="stream">The <see cref="T:System.IO.Stream" /> to read from.</param>
<param name="encoding">The character encoding to use.</param>
<returns>All lines in the stream.</returns>
</member>
<member name="M:Jellyfin.Extensions.StreamExtensions.ReadAllLines(System.IO.TextReader)">
<summary>
Reads all lines in the <see cref="T:System.IO.TextReader" />.
</summary>
<param name="reader">The <see cref="T:System.IO.TextReader" /> to read from.</param>
<returns>All lines in the stream.</returns>
</member>
<member name="M:Jellyfin.Extensions.StreamExtensions.ReadAllLinesAsync(System.IO.TextReader,System.Threading.CancellationToken)">
<summary>
Reads all lines in the <see cref="T:System.IO.TextReader" />.
</summary>
<param name="reader">The <see cref="T:System.IO.TextReader" /> to read from.</param>
<param name="cancellationToken">The token to monitor for cancellation requests.</param>
<returns>All lines in the stream.</returns>
</member>
<member name="T:Jellyfin.Extensions.StringBuilderExtensions">
<summary>
Extension methods for the <see cref="T:System.Text.StringBuilder"/> class.
</summary>
</member>
<member name="M:Jellyfin.Extensions.StringBuilderExtensions.AppendJoinInSingleQuotes(System.Text.StringBuilder,System.Char,System.Collections.Generic.IReadOnlyList{System.String})">
<summary>
Concatenates and appends the members of a collection in single quotes using the specified delimiter.
</summary>
<param name="builder">The string builder.</param>
<param name="delimiter">The character delimiter.</param>
<param name="values">The collection of strings to concatenate.</param>
<returns>The updated string builder.</returns>
</member>
<member name="T:Jellyfin.Extensions.StringExtensions">
<summary>
Provides extensions methods for <see cref="T:System.String" />.
</summary>
<summary>
Checks whether or not the specified string has diacritics in it.
</summary>
</member>
<member name="M:Jellyfin.Extensions.StringExtensions.RemoveDiacritics(System.String)">
<summary>
Removes the diacritics character from the strings.
</summary>
<param name="text">The string to act on.</param>
<returns>The string without diacritics character.</returns>
</member>
<member name="M:Jellyfin.Extensions.StringExtensions.HasDiacritics(System.String)">
<summary>
Checks whether or not the specified string has diacritics in it.
</summary>
<param name="text">The string to check.</param>
<returns>True if the string has diacritics, false otherwise.</returns>
</member>
<member name="M:Jellyfin.Extensions.StringExtensions.Count(System.ReadOnlySpan{System.Char},System.Char)">
<summary>
Counts the number of occurrences of [needle] in the string.
</summary>
<param name="value">The haystack to search in.</param>
<param name="needle">The character to search for.</param>
<returns>The number of occurrences of the [needle] character.</returns>
</member>
<member name="M:Jellyfin.Extensions.StringExtensions.LeftPart(System.ReadOnlySpan{System.Char},System.Char)">
<summary>
Returns the part on the left of the <c>needle</c>.
</summary>
<param name="haystack">The string to seek.</param>
<param name="needle">The needle to find.</param>
<returns>The part left of the <paramref name="needle" />.</returns>
</member>
<member name="M:Jellyfin.Extensions.StringExtensions.RightPart(System.ReadOnlySpan{System.Char},System.Char)">
<summary>
Returns the part on the right of the <c>needle</c>.
</summary>
<param name="haystack">The string to seek.</param>
<param name="needle">The needle to find.</param>
<returns>The part right of the <paramref name="needle" />.</returns>
</member>
<member name="M:Jellyfin.Extensions.StringExtensions.Transliterated(System.String)">
<summary>
Returns a transliterated string which only contain ascii characters.
</summary>
<param name="text">The string to act on.</param>
<returns>The transliterated string.</returns>
</member>
<member name="M:Jellyfin.Extensions.StringExtensions.Trimmed(System.Collections.Generic.IEnumerable{System.String})">
<summary>
Ensures all strings are non-null and trimmed of leading an trailing blanks.
</summary>
<param name="values">The enumerable of strings to trim.</param>
<returns>The enumeration of trimmed strings.</returns>
</member>
<member name="M:Jellyfin.Extensions.StringExtensions.TruncateAtNull(System.String)">
<summary>
Truncates a string at the first null character ('\0').
</summary>
<param name="text">The input string.</param>
<returns>
The substring up to (but not including) the first null character,
or the original string if no null character is present.
</returns>
</member>
<member name="M:Jellyfin.Extensions.StringExtensions.NonConformingUnicodeRegex">
<remarks>
Pattern:<br/>
<code>([\ud800-\udbff](?![\udc00-\udfff]))|((?&lt;![\ud800-\udbff])[\udc00-\udfff])|()</code><br/>
Explanation:<br/>
<code>
○ Match with 3 alternative expressions, atomically.<br/>
○ 1st capture group.<br/>
○ Match a character in the set [\uD800-\uDBFF].<br/>
○ Zero-width negative lookahead.<br/>
○ Match a character in the set [\uDC00-\uDFFF].<br/>
○ 2nd capture group.<br/>
○ Zero-width negative lookbehind.<br/>
○ Match a character in the set [\uD800-\uDBFF] right-to-left.<br/>
○ Match a character in the set [\uDC00-\uDFFF].<br/>
○ 3rd capture group.<br/>
○ Match ''.<br/>
</code>
</remarks>
</member>
<member name="T:System.Text.RegularExpressions.Generated.NonConformingUnicodeRegex_0">
<summary>Custom <see cref="T:System.Text.RegularExpressions.Regex"/>-derived type for the NonConformingUnicodeRegex method.</summary>
</member>
<member name="F:System.Text.RegularExpressions.Generated.NonConformingUnicodeRegex_0.Instance">
<summary>Cached, thread-safe singleton instance.</summary>
</member>
<member name="M:System.Text.RegularExpressions.Generated.NonConformingUnicodeRegex_0.#ctor">
<summary>Initializes the instance.</summary>
</member>
<member name="T:System.Text.RegularExpressions.Generated.NonConformingUnicodeRegex_0.RunnerFactory">
<summary>Provides a factory for creating <see cref="T:System.Text.RegularExpressions.RegexRunner"/> instances to be used by methods on <see cref="T:System.Text.RegularExpressions.Regex"/>.</summary>
</member>
<member name="M:System.Text.RegularExpressions.Generated.NonConformingUnicodeRegex_0.RunnerFactory.CreateInstance">
<summary>Creates an instance of a <see cref="T:System.Text.RegularExpressions.RegexRunner"/> used by methods on <see cref="T:System.Text.RegularExpressions.Regex"/>.</summary>
</member>
<member name="T:System.Text.RegularExpressions.Generated.NonConformingUnicodeRegex_0.RunnerFactory.Runner">
<summary>Provides the runner that contains the custom logic implementing the specified regular expression.</summary>
</member>
<member name="M:System.Text.RegularExpressions.Generated.NonConformingUnicodeRegex_0.RunnerFactory.Runner.Scan(System.ReadOnlySpan{System.Char})">
<summary>Scan the <paramref name="inputSpan"/> starting from base.runtextstart for the next match.</summary>
<param name="inputSpan">The text being scanned by the regular expression.</param>
</member>
<member name="M:System.Text.RegularExpressions.Generated.NonConformingUnicodeRegex_0.RunnerFactory.Runner.TryFindNextPossibleStartingPosition(System.ReadOnlySpan{System.Char})">
<summary>Search <paramref name="inputSpan"/> starting from base.runtextpos for the next location a match could possibly start.</summary>
<param name="inputSpan">The text being scanned by the regular expression.</param>
<returns>true if a possible match was found; false if no more matches are possible.</returns>
</member>
<member name="M:System.Text.RegularExpressions.Generated.NonConformingUnicodeRegex_0.RunnerFactory.Runner.TryMatchAtCurrentPosition(System.ReadOnlySpan{System.Char})">
<summary>Determine whether <paramref name="inputSpan"/> at base.runtextpos is a match for the regular expression.</summary>
<param name="inputSpan">The text being scanned by the regular expression.</param>
<returns>true if the regular expression matches at the current position; otherwise, false.</returns>
</member>
<member name="T:System.Text.RegularExpressions.Generated.Utilities">
<summary>Helper methods used by generated <see cref="T:System.Text.RegularExpressions.Regex"/>-derived implementations.</summary>
</member>
<member name="F:System.Text.RegularExpressions.Generated.Utilities.s_defaultTimeout">
<summary>Default timeout value set in <see cref="T:System.AppContext"/>, or <see cref="F:System.Text.RegularExpressions.Regex.InfiniteMatchTimeout"/> if none was set.</summary>
</member>
<member name="F:System.Text.RegularExpressions.Generated.Utilities.s_hasTimeout">
<summary>Whether <see cref="F:System.Text.RegularExpressions.Generated.Utilities.s_defaultTimeout"/> is non-infinite.</summary>
</member>
<member name="M:System.Text.RegularExpressions.Generated.Utilities.IndexOfNonAsciiOrAny_AEA8CFA2B5BC71ABC904D402F4CC4D3E0211E0681824955E81054C16A76CB030(System.ReadOnlySpan{System.Char})">
<summary>Finds the next index of any character that matches a character in the set [\uD800-\uDFFF\uFFFD].</summary>
</member>
</members>
</doc>
@@ -6,3 +6,15 @@ E:\Projects\pgsql-jellyfin\src\Jellyfin.Extensions\obj\Debug\net10.0\Jellyfin.Ex
E:\Projects\pgsql-jellyfin\src\Jellyfin.Extensions\obj\Debug\net10.0\Jellyfin.Extensions.GeneratedMSBuildEditorConfig.editorconfig
E:\Projects\pgsql-jellyfin\src\Jellyfin.Extensions\obj\Debug\net10.0\Jellyfin.Extensions.csproj.CoreCompileInputs.cache
E:\Projects\pgsql-jellyfin\src\Jellyfin.Extensions\obj\Debug\net10.0\Jellyfin.Extensions.xml
E:\Projects\pgsql-jellyfin\src\Jellyfin.Extensions\bin\Debug\net10.0\Jellyfin.Extensions.deps.json
E:\Projects\pgsql-jellyfin\src\Jellyfin.Extensions\bin\Debug\net10.0\Jellyfin.Extensions.dll
E:\Projects\pgsql-jellyfin\src\Jellyfin.Extensions\bin\Debug\net10.0\Jellyfin.Extensions.pdb
E:\Projects\pgsql-jellyfin\src\Jellyfin.Extensions\bin\Debug\net10.0\Jellyfin.Extensions.xml
E:\Projects\pgsql-jellyfin\src\Jellyfin.Extensions\bin\Debug\net10.0\Jellyfin.CodeAnalysis.dll
E:\Projects\pgsql-jellyfin\src\Jellyfin.Extensions\bin\Debug\net10.0\Jellyfin.CodeAnalysis.pdb
E:\Projects\pgsql-jellyfin\src\Jellyfin.Extensions\bin\Debug\net10.0\Jellyfin.CodeAnalysis.xml
E:\Projects\pgsql-jellyfin\src\Jellyfin.Extensions\obj\Debug\net10.0\Jellyfin.EFA95BE5.Up2Date
E:\Projects\pgsql-jellyfin\src\Jellyfin.Extensions\obj\Debug\net10.0\Jellyfin.Extensions.dll
E:\Projects\pgsql-jellyfin\src\Jellyfin.Extensions\obj\Debug\net10.0\refint\Jellyfin.Extensions.dll
E:\Projects\pgsql-jellyfin\src\Jellyfin.Extensions\obj\Debug\net10.0\Jellyfin.Extensions.pdb
E:\Projects\pgsql-jellyfin\src\Jellyfin.Extensions\obj\Debug\net10.0\ref\Jellyfin.Extensions.dll
@@ -582,26 +582,9 @@
<summary>
Provides extensions methods for <see cref="T:System.String" />.
</summary>
</member>
<member name="M:Jellyfin.Extensions.StringExtensions.NonConformingUnicodeRegex">
<remarks>
Pattern:<br/>
<code>([\ud800-\udbff](?![\udc00-\udfff]))|((?&lt;![\ud800-\udbff])[\udc00-\udfff])|()</code><br/>
Explanation:<br/>
<code>
○ Match with 3 alternative expressions, atomically.<br/>
○ 1st capture group.<br/>
○ Match a character in the set [\uD800-\uDBFF].<br/>
○ Zero-width negative lookahead.<br/>
○ Match a character in the set [\uDC00-\uDFFF].<br/>
○ 2nd capture group.<br/>
○ Zero-width negative lookbehind.<br/>
○ Match a character in the set [\uD800-\uDBFF] right-to-left.<br/>
○ Match a character in the set [\uDC00-\uDFFF].<br/>
○ 3rd capture group.<br/>
○ Match ''.<br/>
</code>
</remarks>
<summary>
Checks whether or not the specified string has diacritics in it.
</summary>
</member>
<member name="M:Jellyfin.Extensions.StringExtensions.RemoveDiacritics(System.String)">
<summary>
@@ -665,6 +648,26 @@
or the original string if no null character is present.
</returns>
</member>
<member name="M:Jellyfin.Extensions.StringExtensions.NonConformingUnicodeRegex">
<remarks>
Pattern:<br/>
<code>([\ud800-\udbff](?![\udc00-\udfff]))|((?&lt;![\ud800-\udbff])[\udc00-\udfff])|()</code><br/>
Explanation:<br/>
<code>
○ Match with 3 alternative expressions, atomically.<br/>
○ 1st capture group.<br/>
○ Match a character in the set [\uD800-\uDBFF].<br/>
○ Zero-width negative lookahead.<br/>
○ Match a character in the set [\uDC00-\uDFFF].<br/>
○ 2nd capture group.<br/>
○ Zero-width negative lookbehind.<br/>
○ Match a character in the set [\uD800-\uDBFF] right-to-left.<br/>
○ Match a character in the set [\uDC00-\uDFFF].<br/>
○ 3rd capture group.<br/>
○ Match ''.<br/>
</code>
</remarks>
</member>
<member name="T:System.Text.RegularExpressions.Generated.NonConformingUnicodeRegex_0">
<summary>Custom <see cref="T:System.Text.RegularExpressions.Regex"/>-derived type for the NonConformingUnicodeRegex method.</summary>
</member>