mirror of
https://github.com/jellyfin/jellyfin.git
synced 2025-05-24 02:02:29 -04:00
Fix merge and build
This commit is contained in:
parent
829eb1a849
commit
ec3e15db57
@ -1,8 +1,4 @@
|
||||
<<<<<<< HEAD
|
||||
using System;
|
||||
=======
|
||||
using System.Net.Mime;
|
||||
>>>>>>> origin/master
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
|
||||
namespace Jellyfin.Api
|
||||
|
@ -1,6 +1,10 @@
|
||||
#nullable enable
|
||||
#pragma warning disable CA1801
|
||||
|
||||
using System;
|
||||
using System.Globalization;
|
||||
using System.Linq;
|
||||
using Jellyfin.Api.Constants;
|
||||
using Jellyfin.Data.Entities;
|
||||
using MediaBrowser.Model.Activity;
|
||||
using MediaBrowser.Model.Querying;
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
@ -44,7 +48,10 @@ namespace Jellyfin.Api.Controllers
|
||||
[FromQuery] DateTime? minDate,
|
||||
bool? hasUserId)
|
||||
{
|
||||
return _activityManager.GetActivityLogEntries(minDate, hasUserId, startIndex, limit);
|
||||
var filterFunc = new Func<IQueryable<ActivityLog>, IQueryable<ActivityLog>>(
|
||||
entries => entries.Where(entry => entry.DateCreated >= minDate));
|
||||
|
||||
return _activityManager.GetPagedResult(filterFunc, startIndex, limit);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,3 +1,5 @@
|
||||
#nullable enable
|
||||
|
||||
namespace Jellyfin.Api.Models.ConfigurationDtos
|
||||
{
|
||||
/// <summary>
|
||||
@ -8,11 +10,11 @@ namespace Jellyfin.Api.Models.ConfigurationDtos
|
||||
/// <summary>
|
||||
/// Gets or sets media encoder path.
|
||||
/// </summary>
|
||||
public string Path { get; set; }
|
||||
public string Path { get; set; } = null!;
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets media encoder path type.
|
||||
/// </summary>
|
||||
public string PathType { get; set; }
|
||||
public string PathType { get; set; } = null!;
|
||||
}
|
||||
}
|
||||
|
@ -93,7 +93,7 @@ namespace Jellyfin.Server.Extensions
|
||||
.AddJsonOptions(options =>
|
||||
{
|
||||
// Update all properties that are set in JsonDefaults
|
||||
var jsonOptions = JsonDefaults.PascalCase;
|
||||
var jsonOptions = JsonDefaults.GetPascalCaseOptions();
|
||||
|
||||
// From JsonDefaults
|
||||
options.JsonSerializerOptions.ReadCommentHandling = jsonOptions.ReadCommentHandling;
|
||||
|
@ -12,7 +12,7 @@ namespace Jellyfin.Server.Formatters
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="CamelCaseJsonProfileFormatter"/> class.
|
||||
/// </summary>
|
||||
public CamelCaseJsonProfileFormatter() : base(JsonDefaults.CamelCase)
|
||||
public CamelCaseJsonProfileFormatter() : base(JsonDefaults.GetCamelCaseOptions())
|
||||
{
|
||||
SupportedMediaTypes.Clear();
|
||||
SupportedMediaTypes.Add(MediaTypeHeaderValue.Parse("application/json;profile=\"CamelCase\""));
|
||||
|
@ -12,7 +12,7 @@ namespace Jellyfin.Server.Formatters
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="PascalCaseJsonProfileFormatter"/> class.
|
||||
/// </summary>
|
||||
public PascalCaseJsonProfileFormatter() : base(JsonDefaults.PascalCase)
|
||||
public PascalCaseJsonProfileFormatter() : base(JsonDefaults.GetPascalCaseOptions())
|
||||
{
|
||||
SupportedMediaTypes.Clear();
|
||||
// Add application/json for default formatter
|
||||
|
@ -14,10 +14,6 @@
|
||||
<Compile Include="..\SharedVersion.cs" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Folder Include="Attachments" />
|
||||
</ItemGroup>
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>netstandard2.1</TargetFramework>
|
||||
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
|
||||
|
@ -1,66 +0,0 @@
|
||||
using System;
|
||||
using System.Globalization;
|
||||
using System.Linq;
|
||||
using Jellyfin.Data.Entities;
|
||||
using MediaBrowser.Controller.Configuration;
|
||||
using MediaBrowser.Controller.Net;
|
||||
using MediaBrowser.Model.Activity;
|
||||
using MediaBrowser.Model.Querying;
|
||||
using MediaBrowser.Model.Services;
|
||||
using Microsoft.Extensions.Logging;
|
||||
|
||||
namespace MediaBrowser.Api.System
|
||||
{
|
||||
[Route("/System/ActivityLog/Entries", "GET", Summary = "Gets activity log entries")]
|
||||
public class GetActivityLogs : IReturn<QueryResult<ActivityLogEntry>>
|
||||
{
|
||||
/// <summary>
|
||||
/// Skips over a given number of items within the results. Use for paging.
|
||||
/// </summary>
|
||||
/// <value>The start index.</value>
|
||||
[ApiMember(Name = "StartIndex", Description = "Optional. The record index to start at. All items with a lower index will be dropped from the results.", IsRequired = false, DataType = "int", ParameterType = "query", Verb = "GET")]
|
||||
public int? StartIndex { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// The maximum number of items to return
|
||||
/// </summary>
|
||||
/// <value>The limit.</value>
|
||||
[ApiMember(Name = "Limit", Description = "Optional. The maximum number of records to return", IsRequired = false, DataType = "int", ParameterType = "query", Verb = "GET")]
|
||||
public int? Limit { get; set; }
|
||||
|
||||
[ApiMember(Name = "MinDate", Description = "Optional. The minimum date. Format = ISO", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "GET")]
|
||||
public string MinDate { get; set; }
|
||||
|
||||
public bool? HasUserId { get; set; }
|
||||
}
|
||||
|
||||
[Authenticated(Roles = "Admin")]
|
||||
public class ActivityLogService : BaseApiService
|
||||
{
|
||||
private readonly IActivityManager _activityManager;
|
||||
|
||||
public ActivityLogService(
|
||||
ILogger<ActivityLogService> logger,
|
||||
IServerConfigurationManager serverConfigurationManager,
|
||||
IHttpResultFactory httpResultFactory,
|
||||
IActivityManager activityManager)
|
||||
: base(logger, serverConfigurationManager, httpResultFactory)
|
||||
{
|
||||
_activityManager = activityManager;
|
||||
}
|
||||
|
||||
public object Get(GetActivityLogs request)
|
||||
{
|
||||
DateTime? minDate = string.IsNullOrWhiteSpace(request.MinDate) ?
|
||||
(DateTime?)null :
|
||||
DateTime.Parse(request.MinDate, null, DateTimeStyles.RoundtripKind).ToUniversalTime();
|
||||
|
||||
var filterFunc = new Func<IQueryable<ActivityLog>, IQueryable<ActivityLog>>(
|
||||
entries => entries.Where(entry => entry.DateCreated >= minDate));
|
||||
|
||||
var result = _activityManager.GetPagedResult(filterFunc, request.StartIndex, request.Limit);
|
||||
|
||||
return ToOptimizedResult(result);
|
||||
}
|
||||
}
|
||||
}
|
@ -25,7 +25,7 @@ namespace MediaBrowser.Common.Json.Converters
|
||||
/// <param name="typeToConvert">The type to convert.</param>
|
||||
/// <param name="options">The json serializer options.</param>
|
||||
/// <returns>Typed dictionary.</returns>
|
||||
/// <exception cref="NotSupportedException"></exception>
|
||||
/// <exception cref="NotSupportedException">Dictionary key type not supported.</exception>
|
||||
public override IDictionary<TKey, TValue> Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
|
||||
{
|
||||
var convertedType = typeof(Dictionary<,>).MakeGenericType(typeof(string), typeToConvert.GenericTypeArguments[1]);
|
||||
@ -38,24 +38,24 @@ namespace MediaBrowser.Common.Json.Converters
|
||||
CultureInfo.CurrentCulture);
|
||||
var enumerator = (IEnumerator)convertedType.GetMethod("GetEnumerator")!.Invoke(value, null);
|
||||
var parse = typeof(TKey).GetMethod(
|
||||
"Parse",
|
||||
0,
|
||||
BindingFlags.Public | BindingFlags.Static,
|
||||
null,
|
||||
CallingConventions.Any,
|
||||
new[] { typeof(string) },
|
||||
"Parse",
|
||||
0,
|
||||
BindingFlags.Public | BindingFlags.Static,
|
||||
null,
|
||||
CallingConventions.Any,
|
||||
new[] { typeof(string) },
|
||||
null);
|
||||
if (parse == null)
|
||||
{
|
||||
throw new NotSupportedException($"{typeof(TKey)} as TKey in IDictionary<TKey, TValue> is not supported.");
|
||||
}
|
||||
|
||||
|
||||
while (enumerator.MoveNext())
|
||||
{
|
||||
var element = (KeyValuePair<string?, TValue>)enumerator.Current;
|
||||
instance.Add((TKey)parse.Invoke(null, new[] { (object?) element.Key }), element.Value);
|
||||
instance.Add((TKey)parse.Invoke(null, new[] { (object?)element.Key }), element.Value);
|
||||
}
|
||||
|
||||
|
||||
return instance;
|
||||
}
|
||||
|
||||
@ -70,8 +70,12 @@ namespace MediaBrowser.Common.Json.Converters
|
||||
var convertedDictionary = new Dictionary<string?, TValue>(value.Count);
|
||||
foreach (var (k, v) in value)
|
||||
{
|
||||
convertedDictionary[k?.ToString()] = v;
|
||||
if (k != null)
|
||||
{
|
||||
convertedDictionary[k.ToString()] = v;
|
||||
}
|
||||
}
|
||||
|
||||
JsonSerializer.Serialize(writer, convertedDictionary, options);
|
||||
}
|
||||
}
|
||||
|
@ -22,18 +22,17 @@ namespace MediaBrowser.Common.Json.Converters
|
||||
/// <returns>Conversion ability.</returns>
|
||||
public override bool CanConvert(Type typeToConvert)
|
||||
{
|
||||
|
||||
if (!typeToConvert.IsGenericType)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
// Let built in converter handle string keys
|
||||
if (typeToConvert.GenericTypeArguments[0] == typeof(string))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
// Only support objects that implement IDictionary
|
||||
return typeToConvert.GetInterface(nameof(IDictionary)) != null;
|
||||
}
|
||||
|
@ -16,7 +16,7 @@ namespace MediaBrowser.Common.Json
|
||||
/// When changing these options, update
|
||||
/// Jellyfin.Server/Extensions/ApiServiceCollectionExtensions.cs
|
||||
/// -> AddJellyfinApi
|
||||
/// -> AddJsonOptions
|
||||
/// -> AddJsonOptions.
|
||||
/// </remarks>
|
||||
/// <returns>The default <see cref="JsonSerializerOptions" /> options.</returns>
|
||||
public static JsonSerializerOptions GetOptions()
|
||||
@ -33,31 +33,27 @@ namespace MediaBrowser.Common.Json
|
||||
|
||||
return options;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Gets CamelCase json options.
|
||||
/// Gets camelCase json options.
|
||||
/// </summary>
|
||||
public static JsonSerializerOptions CamelCase
|
||||
/// <returns>The camelCase <see cref="JsonSerializerOptions" /> options.</returns>
|
||||
public static JsonSerializerOptions GetCamelCaseOptions()
|
||||
{
|
||||
get
|
||||
{
|
||||
var options = GetOptions();
|
||||
options.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
|
||||
return options;
|
||||
}
|
||||
var options = GetOptions();
|
||||
options.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
|
||||
return options;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets PascalCase json options.
|
||||
/// </summary>
|
||||
public static JsonSerializerOptions PascalCase
|
||||
/// <returns>The PascalCase <see cref="JsonSerializerOptions" /> options.</returns>
|
||||
public static JsonSerializerOptions GetPascalCaseOptions()
|
||||
{
|
||||
get
|
||||
{
|
||||
var options = GetOptions();
|
||||
options.PropertyNamingPolicy = null;
|
||||
return options;
|
||||
}
|
||||
var options = GetOptions();
|
||||
options.PropertyNamingPolicy = null;
|
||||
return options;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user