Updated code to correct build errors for Jellyfin.Extensions
This commit is contained in:
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Binary file not shown.
+1
-1
@@ -14,7 +14,7 @@ using System.Reflection;
|
||||
[assembly: System.Reflection.AssemblyCompanyAttribute("Jellyfin.CodeAnalysis")]
|
||||
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
|
||||
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
|
||||
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+f47555f2aa4eff7dcc5c5ef5bbda374f292f0638")]
|
||||
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+d5fdbec943d63c7347d69788f4e23f2ba6acd5df")]
|
||||
[assembly: System.Reflection.AssemblyProductAttribute("Jellyfin.CodeAnalysis")]
|
||||
[assembly: System.Reflection.AssemblyTitleAttribute("Jellyfin.CodeAnalysis")]
|
||||
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
|
||||
|
||||
+1
-1
@@ -1 +1 @@
|
||||
cfe4822f334685403d8dd28c9794902cf41ac16cf3fdae734ed53b2348acf886
|
||||
01be5b7a7d11c265e3c9319eedb944305ba9c03e308798d4520f783c5e3126c5
|
||||
|
||||
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
@@ -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