Updated code to correct build errors for Jellyfin.Extensions
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
+7
-5
@@ -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()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
+7
-5
@@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
Binary file not shown.
Binary file not shown.
@@ -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": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
Binary file not shown.
Binary file not shown.
@@ -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]))|((?<![\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>
|
||||
BIN
Binary file not shown.
+12
@@ -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
|
||||
|
||||
Binary file not shown.
Binary file not shown.
@@ -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]))|((?<![\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]))|((?<![\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>
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Reference in New Issue
Block a user