aboutsummaryrefslogtreecommitdiff
path: root/Jellyfin.Api/ModelBinders
diff options
context:
space:
mode:
Diffstat (limited to 'Jellyfin.Api/ModelBinders')
-rw-r--r--Jellyfin.Api/ModelBinders/CommaDelimitedArrayModelBinder.cs113
-rw-r--r--Jellyfin.Api/ModelBinders/LegacyDateTimeModelBinder.cs61
-rw-r--r--Jellyfin.Api/ModelBinders/NullableEnumModelBinder.cs61
-rw-r--r--Jellyfin.Api/ModelBinders/NullableEnumModelBinderProvider.cs31
-rw-r--r--Jellyfin.Api/ModelBinders/PipeDelimitedArrayModelBinder.cs113
5 files changed, 187 insertions, 192 deletions
diff --git a/Jellyfin.Api/ModelBinders/CommaDelimitedArrayModelBinder.cs b/Jellyfin.Api/ModelBinders/CommaDelimitedArrayModelBinder.cs
index c04f3c721..a34fd01d5 100644
--- a/Jellyfin.Api/ModelBinders/CommaDelimitedArrayModelBinder.cs
+++ b/Jellyfin.Api/ModelBinders/CommaDelimitedArrayModelBinder.cs
@@ -5,86 +5,85 @@ using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc.ModelBinding;
using Microsoft.Extensions.Logging;
-namespace Jellyfin.Api.ModelBinders
+namespace Jellyfin.Api.ModelBinders;
+
+/// <summary>
+/// Comma delimited array model binder.
+/// Returns an empty array of specified type if there is no query parameter.
+/// </summary>
+public class CommaDelimitedArrayModelBinder : IModelBinder
{
+ private readonly ILogger<CommaDelimitedArrayModelBinder> _logger;
+
/// <summary>
- /// Comma delimited array model binder.
- /// Returns an empty array of specified type if there is no query parameter.
+ /// Initializes a new instance of the <see cref="CommaDelimitedArrayModelBinder"/> class.
/// </summary>
- public class CommaDelimitedArrayModelBinder : IModelBinder
+ /// <param name="logger">Instance of the <see cref="ILogger{CommaDelimitedArrayModelBinder}"/> interface.</param>
+ public CommaDelimitedArrayModelBinder(ILogger<CommaDelimitedArrayModelBinder> logger)
+ {
+ _logger = logger;
+ }
+
+ /// <inheritdoc/>
+ public Task BindModelAsync(ModelBindingContext bindingContext)
{
- private readonly ILogger<CommaDelimitedArrayModelBinder> _logger;
+ var valueProviderResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
+ var elementType = bindingContext.ModelType.GetElementType() ?? bindingContext.ModelType.GenericTypeArguments[0];
+ var converter = TypeDescriptor.GetConverter(elementType);
- /// <summary>
- /// Initializes a new instance of the <see cref="CommaDelimitedArrayModelBinder"/> class.
- /// </summary>
- /// <param name="logger">Instance of the <see cref="ILogger{CommaDelimitedArrayModelBinder}"/> interface.</param>
- public CommaDelimitedArrayModelBinder(ILogger<CommaDelimitedArrayModelBinder> logger)
+ if (valueProviderResult.Length > 1)
{
- _logger = logger;
+ var typedValues = GetParsedResult(valueProviderResult.Values, elementType, converter);
+ bindingContext.Result = ModelBindingResult.Success(typedValues);
}
-
- /// <inheritdoc/>
- public Task BindModelAsync(ModelBindingContext bindingContext)
+ else
{
- var valueProviderResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
- var elementType = bindingContext.ModelType.GetElementType() ?? bindingContext.ModelType.GenericTypeArguments[0];
- var converter = TypeDescriptor.GetConverter(elementType);
+ var value = valueProviderResult.FirstValue;
- if (valueProviderResult.Length > 1)
+ if (value is not null)
{
- var typedValues = GetParsedResult(valueProviderResult.Values, elementType, converter);
+ var splitValues = value.Split(',', StringSplitOptions.RemoveEmptyEntries);
+ var typedValues = GetParsedResult(splitValues, elementType, converter);
bindingContext.Result = ModelBindingResult.Success(typedValues);
}
else
{
- var value = valueProviderResult.FirstValue;
-
- if (value != null)
- {
- var splitValues = value.Split(',', StringSplitOptions.RemoveEmptyEntries);
- var typedValues = GetParsedResult(splitValues, elementType, converter);
- bindingContext.Result = ModelBindingResult.Success(typedValues);
- }
- else
- {
- var emptyResult = Array.CreateInstance(elementType, 0);
- bindingContext.Result = ModelBindingResult.Success(emptyResult);
- }
+ var emptyResult = Array.CreateInstance(elementType, 0);
+ bindingContext.Result = ModelBindingResult.Success(emptyResult);
}
-
- return Task.CompletedTask;
}
- private Array GetParsedResult(IReadOnlyList<string> values, Type elementType, TypeConverter converter)
+ return Task.CompletedTask;
+ }
+
+ private Array GetParsedResult(IReadOnlyList<string> values, Type elementType, TypeConverter converter)
+ {
+ var parsedValues = new object?[values.Count];
+ var convertedCount = 0;
+ for (var i = 0; i < values.Count; i++)
{
- var parsedValues = new object?[values.Count];
- var convertedCount = 0;
- for (var i = 0; i < values.Count; i++)
+ try
{
- try
- {
- parsedValues[i] = converter.ConvertFromString(values[i].Trim());
- convertedCount++;
- }
- catch (FormatException e)
- {
- _logger.LogDebug(e, "Error converting value.");
- }
+ parsedValues[i] = converter.ConvertFromString(values[i].Trim());
+ convertedCount++;
}
-
- var typedValues = Array.CreateInstance(elementType, convertedCount);
- var typedValueIndex = 0;
- for (var i = 0; i < parsedValues.Length; i++)
+ catch (FormatException e)
{
- if (parsedValues[i] != null)
- {
- typedValues.SetValue(parsedValues[i], typedValueIndex);
- typedValueIndex++;
- }
+ _logger.LogDebug(e, "Error converting value.");
}
+ }
- return typedValues;
+ var typedValues = Array.CreateInstance(elementType, convertedCount);
+ var typedValueIndex = 0;
+ for (var i = 0; i < parsedValues.Length; i++)
+ {
+ if (parsedValues[i] != null)
+ {
+ typedValues.SetValue(parsedValues[i], typedValueIndex);
+ typedValueIndex++;
+ }
}
+
+ return typedValues;
}
}
diff --git a/Jellyfin.Api/ModelBinders/LegacyDateTimeModelBinder.cs b/Jellyfin.Api/ModelBinders/LegacyDateTimeModelBinder.cs
index e1cb725f3..87a30773e 100644
--- a/Jellyfin.Api/ModelBinders/LegacyDateTimeModelBinder.cs
+++ b/Jellyfin.Api/ModelBinders/LegacyDateTimeModelBinder.cs
@@ -5,45 +5,44 @@ using Microsoft.AspNetCore.Mvc.ModelBinding;
using Microsoft.AspNetCore.Mvc.ModelBinding.Binders;
using Microsoft.Extensions.Logging;
-namespace Jellyfin.Api.ModelBinders
+namespace Jellyfin.Api.ModelBinders;
+
+/// <summary>
+/// DateTime model binder.
+/// </summary>
+public class LegacyDateTimeModelBinder : IModelBinder
{
+ // Borrowed from the DateTimeModelBinderProvider
+ private const DateTimeStyles SupportedStyles = DateTimeStyles.AdjustToUniversal | DateTimeStyles.AllowWhiteSpaces;
+ private readonly DateTimeModelBinder _defaultModelBinder;
+
/// <summary>
- /// DateTime model binder.
+ /// Initializes a new instance of the <see cref="LegacyDateTimeModelBinder"/> class.
/// </summary>
- public class LegacyDateTimeModelBinder : IModelBinder
+ /// <param name="loggerFactory">Instance of the <see cref="ILoggerFactory"/> interface.</param>
+ public LegacyDateTimeModelBinder(ILoggerFactory loggerFactory)
{
- // Borrowed from the DateTimeModelBinderProvider
- private const DateTimeStyles SupportedStyles = DateTimeStyles.AdjustToUniversal | DateTimeStyles.AllowWhiteSpaces;
- private readonly DateTimeModelBinder _defaultModelBinder;
-
- /// <summary>
- /// Initializes a new instance of the <see cref="LegacyDateTimeModelBinder"/> class.
- /// </summary>
- /// <param name="loggerFactory">Instance of the <see cref="ILoggerFactory"/> interface.</param>
- public LegacyDateTimeModelBinder(ILoggerFactory loggerFactory)
- {
- _defaultModelBinder = new DateTimeModelBinder(SupportedStyles, loggerFactory);
- }
+ _defaultModelBinder = new DateTimeModelBinder(SupportedStyles, loggerFactory);
+ }
- /// <inheritdoc />
- public Task BindModelAsync(ModelBindingContext bindingContext)
+ /// <inheritdoc />
+ public Task BindModelAsync(ModelBindingContext bindingContext)
+ {
+ var valueProviderResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
+ if (valueProviderResult.Values.Count == 1)
{
- var valueProviderResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
- if (valueProviderResult.Values.Count == 1)
+ var dateTimeString = valueProviderResult.FirstValue;
+ // Mark Played Item.
+ if (DateTime.TryParseExact(dateTimeString, "yyyyMMddHHmmss", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal, out var dateTime))
{
- var dateTimeString = valueProviderResult.FirstValue;
- // Mark Played Item.
- if (DateTime.TryParseExact(dateTimeString, "yyyyMMddHHmmss", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal, out var dateTime))
- {
- bindingContext.Result = ModelBindingResult.Success(dateTime);
- }
- else
- {
- return _defaultModelBinder.BindModelAsync(bindingContext);
- }
+ bindingContext.Result = ModelBindingResult.Success(dateTime);
+ }
+ else
+ {
+ return _defaultModelBinder.BindModelAsync(bindingContext);
}
-
- return Task.CompletedTask;
}
+
+ return Task.CompletedTask;
}
}
diff --git a/Jellyfin.Api/ModelBinders/NullableEnumModelBinder.cs b/Jellyfin.Api/ModelBinders/NullableEnumModelBinder.cs
index d2e78ac88..a2e139ca1 100644
--- a/Jellyfin.Api/ModelBinders/NullableEnumModelBinder.cs
+++ b/Jellyfin.Api/ModelBinders/NullableEnumModelBinder.cs
@@ -4,45 +4,44 @@ using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc.ModelBinding;
using Microsoft.Extensions.Logging;
-namespace Jellyfin.Api.ModelBinders
+namespace Jellyfin.Api.ModelBinders;
+
+/// <summary>
+/// Nullable enum model binder.
+/// </summary>
+public class NullableEnumModelBinder : IModelBinder
{
+ private readonly ILogger<NullableEnumModelBinder> _logger;
+
/// <summary>
- /// Nullable enum model binder.
+ /// Initializes a new instance of the <see cref="NullableEnumModelBinder"/> class.
/// </summary>
- public class NullableEnumModelBinder : IModelBinder
+ /// <param name="logger">Instance of the <see cref="ILogger{NullableEnumModelBinder}"/> interface.</param>
+ public NullableEnumModelBinder(ILogger<NullableEnumModelBinder> logger)
{
- private readonly ILogger<NullableEnumModelBinder> _logger;
-
- /// <summary>
- /// Initializes a new instance of the <see cref="NullableEnumModelBinder"/> class.
- /// </summary>
- /// <param name="logger">Instance of the <see cref="ILogger{NullableEnumModelBinder}"/> interface.</param>
- public NullableEnumModelBinder(ILogger<NullableEnumModelBinder> logger)
- {
- _logger = logger;
- }
+ _logger = logger;
+ }
- /// <inheritdoc />
- public Task BindModelAsync(ModelBindingContext bindingContext)
+ /// <inheritdoc />
+ public Task BindModelAsync(ModelBindingContext bindingContext)
+ {
+ var valueProviderResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
+ var elementType = bindingContext.ModelType.GetElementType() ?? bindingContext.ModelType.GenericTypeArguments[0];
+ var converter = TypeDescriptor.GetConverter(elementType);
+ if (valueProviderResult.Length != 0)
{
- var valueProviderResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
- var elementType = bindingContext.ModelType.GetElementType() ?? bindingContext.ModelType.GenericTypeArguments[0];
- var converter = TypeDescriptor.GetConverter(elementType);
- if (valueProviderResult.Length != 0)
+ try
{
- try
- {
- // REVIEW: This shouldn't be null here
- var convertedValue = converter.ConvertFromString(valueProviderResult.FirstValue!);
- bindingContext.Result = ModelBindingResult.Success(convertedValue);
- }
- catch (FormatException e)
- {
- _logger.LogDebug(e, "Error converting value.");
- }
+ // REVIEW: This shouldn't be null here
+ var convertedValue = converter.ConvertFromString(valueProviderResult.FirstValue!);
+ bindingContext.Result = ModelBindingResult.Success(convertedValue);
+ }
+ catch (FormatException e)
+ {
+ _logger.LogDebug(e, "Error converting value.");
}
-
- return Task.CompletedTask;
}
+
+ return Task.CompletedTask;
}
}
diff --git a/Jellyfin.Api/ModelBinders/NullableEnumModelBinderProvider.cs b/Jellyfin.Api/ModelBinders/NullableEnumModelBinderProvider.cs
index 2ccfd0c06..43ffdaefd 100644
--- a/Jellyfin.Api/ModelBinders/NullableEnumModelBinderProvider.cs
+++ b/Jellyfin.Api/ModelBinders/NullableEnumModelBinderProvider.cs
@@ -3,25 +3,24 @@ using Microsoft.AspNetCore.Mvc.ModelBinding;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
-namespace Jellyfin.Api.ModelBinders
+namespace Jellyfin.Api.ModelBinders;
+
+/// <summary>
+/// Nullable enum model binder provider.
+/// </summary>
+public class NullableEnumModelBinderProvider : IModelBinderProvider
{
- /// <summary>
- /// Nullable enum model binder provider.
- /// </summary>
- public class NullableEnumModelBinderProvider : IModelBinderProvider
+ /// <inheritdoc />
+ public IModelBinder? GetBinder(ModelBinderProviderContext context)
{
- /// <inheritdoc />
- public IModelBinder? GetBinder(ModelBinderProviderContext context)
+ var nullableType = Nullable.GetUnderlyingType(context.Metadata.ModelType);
+ if (nullableType is null || !nullableType.IsEnum)
{
- var nullableType = Nullable.GetUnderlyingType(context.Metadata.ModelType);
- if (nullableType == null || !nullableType.IsEnum)
- {
- // Type isn't nullable or isn't an enum.
- return null;
- }
-
- var logger = context.Services.GetRequiredService<ILogger<NullableEnumModelBinder>>();
- return new NullableEnumModelBinder(logger);
+ // Type isn't nullable or isn't an enum.
+ return null;
}
+
+ var logger = context.Services.GetRequiredService<ILogger<NullableEnumModelBinder>>();
+ return new NullableEnumModelBinder(logger);
}
}
diff --git a/Jellyfin.Api/ModelBinders/PipeDelimitedArrayModelBinder.cs b/Jellyfin.Api/ModelBinders/PipeDelimitedArrayModelBinder.cs
index 639ab0793..cb9a82955 100644
--- a/Jellyfin.Api/ModelBinders/PipeDelimitedArrayModelBinder.cs
+++ b/Jellyfin.Api/ModelBinders/PipeDelimitedArrayModelBinder.cs
@@ -5,86 +5,85 @@ using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc.ModelBinding;
using Microsoft.Extensions.Logging;
-namespace Jellyfin.Api.ModelBinders
+namespace Jellyfin.Api.ModelBinders;
+
+/// <summary>
+/// Comma delimited array model binder.
+/// Returns an empty array of specified type if there is no query parameter.
+/// </summary>
+public class PipeDelimitedArrayModelBinder : IModelBinder
{
+ private readonly ILogger<PipeDelimitedArrayModelBinder> _logger;
+
/// <summary>
- /// Comma delimited array model binder.
- /// Returns an empty array of specified type if there is no query parameter.
+ /// Initializes a new instance of the <see cref="PipeDelimitedArrayModelBinder"/> class.
/// </summary>
- public class PipeDelimitedArrayModelBinder : IModelBinder
+ /// <param name="logger">Instance of the <see cref="ILogger{PipeDelimitedArrayModelBinder}"/> interface.</param>
+ public PipeDelimitedArrayModelBinder(ILogger<PipeDelimitedArrayModelBinder> logger)
+ {
+ _logger = logger;
+ }
+
+ /// <inheritdoc/>
+ public Task BindModelAsync(ModelBindingContext bindingContext)
{
- private readonly ILogger<PipeDelimitedArrayModelBinder> _logger;
+ var valueProviderResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
+ var elementType = bindingContext.ModelType.GetElementType() ?? bindingContext.ModelType.GenericTypeArguments[0];
+ var converter = TypeDescriptor.GetConverter(elementType);
- /// <summary>
- /// Initializes a new instance of the <see cref="PipeDelimitedArrayModelBinder"/> class.
- /// </summary>
- /// <param name="logger">Instance of the <see cref="ILogger{PipeDelimitedArrayModelBinder}"/> interface.</param>
- public PipeDelimitedArrayModelBinder(ILogger<PipeDelimitedArrayModelBinder> logger)
+ if (valueProviderResult.Length > 1)
{
- _logger = logger;
+ var typedValues = GetParsedResult(valueProviderResult.Values, elementType, converter);
+ bindingContext.Result = ModelBindingResult.Success(typedValues);
}
-
- /// <inheritdoc/>
- public Task BindModelAsync(ModelBindingContext bindingContext)
+ else
{
- var valueProviderResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
- var elementType = bindingContext.ModelType.GetElementType() ?? bindingContext.ModelType.GenericTypeArguments[0];
- var converter = TypeDescriptor.GetConverter(elementType);
+ var value = valueProviderResult.FirstValue;
- if (valueProviderResult.Length > 1)
+ if (value is not null)
{
- var typedValues = GetParsedResult(valueProviderResult.Values, elementType, converter);
+ var splitValues = value.Split('|', StringSplitOptions.RemoveEmptyEntries);
+ var typedValues = GetParsedResult(splitValues, elementType, converter);
bindingContext.Result = ModelBindingResult.Success(typedValues);
}
else
{
- var value = valueProviderResult.FirstValue;
-
- if (value != null)
- {
- var splitValues = value.Split('|', StringSplitOptions.RemoveEmptyEntries);
- var typedValues = GetParsedResult(splitValues, elementType, converter);
- bindingContext.Result = ModelBindingResult.Success(typedValues);
- }
- else
- {
- var emptyResult = Array.CreateInstance(elementType, 0);
- bindingContext.Result = ModelBindingResult.Success(emptyResult);
- }
+ var emptyResult = Array.CreateInstance(elementType, 0);
+ bindingContext.Result = ModelBindingResult.Success(emptyResult);
}
-
- return Task.CompletedTask;
}
- private Array GetParsedResult(IReadOnlyList<string> values, Type elementType, TypeConverter converter)
+ return Task.CompletedTask;
+ }
+
+ private Array GetParsedResult(IReadOnlyList<string> values, Type elementType, TypeConverter converter)
+ {
+ var parsedValues = new object?[values.Count];
+ var convertedCount = 0;
+ for (var i = 0; i < values.Count; i++)
{
- var parsedValues = new object?[values.Count];
- var convertedCount = 0;
- for (var i = 0; i < values.Count; i++)
+ try
{
- try
- {
- parsedValues[i] = converter.ConvertFromString(values[i].Trim());
- convertedCount++;
- }
- catch (FormatException e)
- {
- _logger.LogDebug(e, "Error converting value.");
- }
+ parsedValues[i] = converter.ConvertFromString(values[i].Trim());
+ convertedCount++;
}
-
- var typedValues = Array.CreateInstance(elementType, convertedCount);
- var typedValueIndex = 0;
- for (var i = 0; i < parsedValues.Length; i++)
+ catch (FormatException e)
{
- if (parsedValues[i] != null)
- {
- typedValues.SetValue(parsedValues[i], typedValueIndex);
- typedValueIndex++;
- }
+ _logger.LogDebug(e, "Error converting value.");
}
+ }
- return typedValues;
+ var typedValues = Array.CreateInstance(elementType, convertedCount);
+ var typedValueIndex = 0;
+ for (var i = 0; i < parsedValues.Length; i++)
+ {
+ if (parsedValues[i] != null)
+ {
+ typedValues.SetValue(parsedValues[i], typedValueIndex);
+ typedValueIndex++;
+ }
}
+
+ return typedValues;
}
}