Applied review comments

This commit is contained in:
JPVenson 2024-12-15 14:46:40 +00:00
parent 1c3196dd5f
commit a0c568bc6c
11 changed files with 42 additions and 32 deletions

View File

@ -72,7 +72,7 @@ public class PlaystateController : BaseJellyfinApiController
[HttpPost("UserPlayedItems/{itemId}")] [HttpPost("UserPlayedItems/{itemId}")]
[ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status404NotFound)] [ProducesResponseType(StatusCodes.Status404NotFound)]
public async Task<ActionResult<UserItemDataDto>> MarkPlayedItem( public async Task<ActionResult<UserItemDataDto?>> MarkPlayedItem(
[FromQuery] Guid? userId, [FromQuery] Guid? userId,
[FromRoute, Required] Guid itemId, [FromRoute, Required] Guid itemId,
[FromQuery, ModelBinder(typeof(LegacyDateTimeModelBinder))] DateTime? datePlayed) [FromQuery, ModelBinder(typeof(LegacyDateTimeModelBinder))] DateTime? datePlayed)
@ -121,7 +121,7 @@ public class PlaystateController : BaseJellyfinApiController
[ProducesResponseType(StatusCodes.Status404NotFound)] [ProducesResponseType(StatusCodes.Status404NotFound)]
[Obsolete("Kept for backwards compatibility")] [Obsolete("Kept for backwards compatibility")]
[ApiExplorerSettings(IgnoreApi = true)] [ApiExplorerSettings(IgnoreApi = true)]
public Task<ActionResult<UserItemDataDto>> MarkPlayedItemLegacy( public Task<ActionResult<UserItemDataDto?>> MarkPlayedItemLegacy(
[FromRoute, Required] Guid userId, [FromRoute, Required] Guid userId,
[FromRoute, Required] Guid itemId, [FromRoute, Required] Guid itemId,
[FromQuery, ModelBinder(typeof(LegacyDateTimeModelBinder))] DateTime? datePlayed) [FromQuery, ModelBinder(typeof(LegacyDateTimeModelBinder))] DateTime? datePlayed)
@ -138,7 +138,7 @@ public class PlaystateController : BaseJellyfinApiController
[HttpDelete("UserPlayedItems/{itemId}")] [HttpDelete("UserPlayedItems/{itemId}")]
[ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status404NotFound)] [ProducesResponseType(StatusCodes.Status404NotFound)]
public async Task<ActionResult<UserItemDataDto>> MarkUnplayedItem( public async Task<ActionResult<UserItemDataDto?>> MarkUnplayedItem(
[FromQuery] Guid? userId, [FromQuery] Guid? userId,
[FromRoute, Required] Guid itemId) [FromRoute, Required] Guid itemId)
{ {
@ -185,7 +185,7 @@ public class PlaystateController : BaseJellyfinApiController
[ProducesResponseType(StatusCodes.Status404NotFound)] [ProducesResponseType(StatusCodes.Status404NotFound)]
[Obsolete("Kept for backwards compatibility")] [Obsolete("Kept for backwards compatibility")]
[ApiExplorerSettings(IgnoreApi = true)] [ApiExplorerSettings(IgnoreApi = true)]
public Task<ActionResult<UserItemDataDto>> MarkUnplayedItemLegacy( public Task<ActionResult<UserItemDataDto?>> MarkUnplayedItemLegacy(
[FromRoute, Required] Guid userId, [FromRoute, Required] Guid userId,
[FromRoute, Required] Guid itemId) [FromRoute, Required] Guid itemId)
=> MarkUnplayedItem(userId, itemId); => MarkUnplayedItem(userId, itemId);
@ -502,7 +502,7 @@ public class PlaystateController : BaseJellyfinApiController
/// <param name="wasPlayed">if set to <c>true</c> [was played].</param> /// <param name="wasPlayed">if set to <c>true</c> [was played].</param>
/// <param name="datePlayed">The date played.</param> /// <param name="datePlayed">The date played.</param>
/// <returns>Task.</returns> /// <returns>Task.</returns>
private UserItemDataDto UpdatePlayedStatus(User user, BaseItem item, bool wasPlayed, DateTime? datePlayed) private UserItemDataDto? UpdatePlayedStatus(User user, BaseItem item, bool wasPlayed, DateTime? datePlayed)
{ {
if (wasPlayed) if (wasPlayed)
{ {
@ -513,7 +513,7 @@ public class PlaystateController : BaseJellyfinApiController
item.MarkUnplayed(user); item.MarkUnplayed(user);
} }
return _userDataRepository.GetUserDataDto(item, user)!; return _userDataRepository.GetUserDataDto(item, user);
} }
private PlayMethod ValidatePlayMethod(PlayMethod method, string? playSessionId) private PlayMethod ValidatePlayMethod(PlayMethod method, string? playSessionId)

View File

@ -305,7 +305,7 @@ public class UserLibraryController : BaseJellyfinApiController
/// <returns>An <see cref="OkResult"/> containing the <see cref="UserItemDataDto"/>.</returns> /// <returns>An <see cref="OkResult"/> containing the <see cref="UserItemDataDto"/>.</returns>
[HttpDelete("UserItems/{itemId}/Rating")] [HttpDelete("UserItems/{itemId}/Rating")]
[ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status200OK)]
public ActionResult<UserItemDataDto> DeleteUserItemRating( public ActionResult<UserItemDataDto?> DeleteUserItemRating(
[FromQuery] Guid? userId, [FromQuery] Guid? userId,
[FromRoute, Required] Guid itemId) [FromRoute, Required] Guid itemId)
{ {
@ -338,7 +338,7 @@ public class UserLibraryController : BaseJellyfinApiController
[ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status200OK)]
[Obsolete("Kept for backwards compatibility")] [Obsolete("Kept for backwards compatibility")]
[ApiExplorerSettings(IgnoreApi = true)] [ApiExplorerSettings(IgnoreApi = true)]
public ActionResult<UserItemDataDto> DeleteUserItemRatingLegacy( public ActionResult<UserItemDataDto?> DeleteUserItemRatingLegacy(
[FromRoute, Required] Guid userId, [FromRoute, Required] Guid userId,
[FromRoute, Required] Guid itemId) [FromRoute, Required] Guid itemId)
=> DeleteUserItemRating(userId, itemId); => DeleteUserItemRating(userId, itemId);
@ -353,7 +353,7 @@ public class UserLibraryController : BaseJellyfinApiController
/// <returns>An <see cref="OkResult"/> containing the <see cref="UserItemDataDto"/>.</returns> /// <returns>An <see cref="OkResult"/> containing the <see cref="UserItemDataDto"/>.</returns>
[HttpPost("UserItems/{itemId}/Rating")] [HttpPost("UserItems/{itemId}/Rating")]
[ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status200OK)]
public ActionResult<UserItemDataDto> UpdateUserItemRating( public ActionResult<UserItemDataDto?> UpdateUserItemRating(
[FromQuery] Guid? userId, [FromQuery] Guid? userId,
[FromRoute, Required] Guid itemId, [FromRoute, Required] Guid itemId,
[FromQuery] bool? likes) [FromQuery] bool? likes)
@ -388,7 +388,7 @@ public class UserLibraryController : BaseJellyfinApiController
[ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status200OK)]
[Obsolete("Kept for backwards compatibility")] [Obsolete("Kept for backwards compatibility")]
[ApiExplorerSettings(IgnoreApi = true)] [ApiExplorerSettings(IgnoreApi = true)]
public ActionResult<UserItemDataDto> UpdateUserItemRatingLegacy( public ActionResult<UserItemDataDto?> UpdateUserItemRatingLegacy(
[FromRoute, Required] Guid userId, [FromRoute, Required] Guid userId,
[FromRoute, Required] Guid itemId, [FromRoute, Required] Guid itemId,
[FromQuery] bool? likes) [FromQuery] bool? likes)
@ -679,7 +679,7 @@ public class UserLibraryController : BaseJellyfinApiController
/// <param name="user">The user.</param> /// <param name="user">The user.</param>
/// <param name="item">The item.</param> /// <param name="item">The item.</param>
/// <param name="likes">if set to <c>true</c> [likes].</param> /// <param name="likes">if set to <c>true</c> [likes].</param>
private UserItemDataDto UpdateUserItemRatingInternal(User user, BaseItem item, bool? likes) private UserItemDataDto? UpdateUserItemRatingInternal(User user, BaseItem item, bool? likes)
{ {
// Get the user data for this item // Get the user data for this item
var data = _userDataRepository.GetUserData(user, item); var data = _userDataRepository.GetUserData(user, item);
@ -691,6 +691,6 @@ public class UserLibraryController : BaseJellyfinApiController
_userDataRepository.SaveUserData(user, item, data, UserDataSaveReason.UpdateUserRating, CancellationToken.None); _userDataRepository.SaveUserData(user, item, data, UserDataSaveReason.UpdateUserRating, CancellationToken.None);
} }
return _userDataRepository.GetUserDataDto(item, user)!; return _userDataRepository.GetUserDataDto(item, user);
} }
} }

View File

@ -1,3 +1,6 @@
#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member
#pragma warning disable CA2227 // Collection properties should be read only
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
@ -5,9 +8,6 @@ using System.ComponentModel.DataAnnotations.Schema;
namespace Jellyfin.Data.Entities; namespace Jellyfin.Data.Entities;
#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member
#pragma warning disable CA2227 // Collection properties should be read only
public class BaseItemEntity public class BaseItemEntity
{ {
public required Guid Id { get; set; } public required Guid Id { get; set; }

View File

@ -1,6 +1,6 @@
#pragma warning disable CS1591
namespace Jellyfin.Data.Entities; namespace Jellyfin.Data.Entities;
#pragma warning disable CS1591
public enum BaseItemExtraType public enum BaseItemExtraType
{ {
Unknown = 0, Unknown = 0,

View File

@ -1,8 +1,9 @@
#pragma warning disable CA2227
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
namespace Jellyfin.Data.Entities; namespace Jellyfin.Data.Entities;
#pragma warning disable CA2227
/// <summary> /// <summary>
/// Enum TrailerTypes. /// Enum TrailerTypes.
@ -39,11 +40,12 @@ public class BaseItemImageInfo
/// </summary> /// </summary>
public int Height { get; set; } public int Height { get; set; }
#pragma warning disable CA1819 #pragma warning disable CA1819 // Properties should not return arrays
/// <summary> /// <summary>
/// Gets or Sets the blurhash. /// Gets or Sets the blurhash.
/// </summary> /// </summary>
public byte[]? Blurhash { get; set; } public byte[]? Blurhash { get; set; }
#pragma warning restore CA1819
/// <summary> /// <summary>
/// Gets or Sets the reference id to the BaseItem. /// Gets or Sets the reference id to the BaseItem.

View File

@ -10,9 +10,7 @@ public enum ItemValueType
/// <summary> /// <summary>
/// Artists. /// Artists.
/// </summary> /// </summary>
#pragma warning disable CA1008 // Enums should have zero value. Cannot apply here.
Artist = 0, Artist = 0,
#pragma warning restore CA1008 // Enums should have zero value
/// <summary> /// <summary>
/// Album. /// Album.

View File

@ -1,9 +1,10 @@
#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member
using System; using System;
using System.Diagnostics.CodeAnalysis; using System.Diagnostics.CodeAnalysis;
namespace Jellyfin.Data.Entities; namespace Jellyfin.Data.Entities;
#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member
public class MediaStreamInfo public class MediaStreamInfo
{ {
public required Guid ItemId { get; set; } public required Guid ItemId { get; set; }

View File

@ -1,8 +1,9 @@
#pragma warning disable CA2227 // Collection properties should be read only
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
namespace Jellyfin.Data.Entities; namespace Jellyfin.Data.Entities;
#pragma warning disable CA2227 // Collection properties should be read only
/// <summary> /// <summary>
/// People entity. /// People entity.

View File

@ -1,3 +1,9 @@
#pragma warning disable RS0030 // Do not use banned APIs
// Do not enforce that because EFCore cannot deal with cultures well.
#pragma warning disable CA1304 // Specify CultureInfo
#pragma warning disable CA1311 // Specify a culture or use an invariant version
#pragma warning disable CA1862 // Use the 'StringComparison' method overloads to perform case-insensitive string comparisons
using System; using System;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using System.Collections.Generic; using System.Collections.Generic;
@ -31,14 +37,15 @@ using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using BaseItemDto = MediaBrowser.Controller.Entities.BaseItem; using BaseItemDto = MediaBrowser.Controller.Entities.BaseItem;
using BaseItemEntity = Jellyfin.Data.Entities.BaseItemEntity; using BaseItemEntity = Jellyfin.Data.Entities.BaseItemEntity;
#pragma warning disable RS0030 // Do not use banned APIs
// Do not enforce that because EFCore cannot deal with cultures well.
#pragma warning disable CA1304 // Specify CultureInfo
#pragma warning disable CA1311 // Specify a culture or use an invariant version
#pragma warning disable CA1862 // Use the 'StringComparison' method overloads to perform case-insensitive string comparisons
namespace Jellyfin.Server.Implementations.Item; namespace Jellyfin.Server.Implementations.Item;
/*
All queries in this class and all other nullable enabled EFCore repository classes will make libraral use of the null-forgiving operator "!".
This is done as the code isn't actually executed client side, but only the expressions are interpretet and the compiler cannot know that.
This is your only warning/message regarding this topic.
*/
/// <summary> /// <summary>
/// Handles all storage logic for BaseItems. /// Handles all storage logic for BaseItems.
/// </summary> /// </summary>
@ -1065,7 +1072,7 @@ public sealed class BaseItemRepository
ItemId = baseItemId, ItemId = baseItemId,
Id = Guid.NewGuid(), Id = Guid.NewGuid(),
Path = e.Path, Path = e.Path,
Blurhash = e.BlurHash != null ? Encoding.UTF8.GetBytes(e.BlurHash) : null, Blurhash = e.BlurHash is null ? null : Encoding.UTF8.GetBytes(e.BlurHash),
DateModified = e.DateModified, DateModified = e.DateModified,
Height = e.Height, Height = e.Height,
Width = e.Width, Width = e.Width,
@ -1079,7 +1086,7 @@ public sealed class BaseItemRepository
return new ItemImageInfo() return new ItemImageInfo()
{ {
Path = appHost?.ExpandVirtualPath(e.Path) ?? e.Path, Path = appHost?.ExpandVirtualPath(e.Path) ?? e.Path,
BlurHash = e.Blurhash != null ? Encoding.UTF8.GetString(e.Blurhash) : null, BlurHash = e.Blurhash is null ? null : Encoding.UTF8.GetString(e.Blurhash),
DateModified = e.DateModified, DateModified = e.DateModified,
Height = e.Height, Height = e.Height,
Width = e.Width, Width = e.Width,

View File

@ -81,11 +81,11 @@ namespace MediaBrowser.Providers.MediaInfo
if (!File.Exists(path)) if (!File.Exists(path))
{ {
Directory.CreateDirectory(Path.GetDirectoryName(path)); Directory.CreateDirectory(Path.GetDirectoryName(path));
#pragma warning disable CA1826
var imageStream = imageStreams.FirstOrDefault(i => (i.Comment ?? string.Empty).Contains("front", StringComparison.OrdinalIgnoreCase)) ?? var imageStream = imageStreams.FirstOrDefault(i => (i.Comment ?? string.Empty).Contains("front", StringComparison.OrdinalIgnoreCase)) ??
imageStreams.FirstOrDefault(i => (i.Comment ?? string.Empty).Contains("cover", StringComparison.OrdinalIgnoreCase)) ?? imageStreams.FirstOrDefault(i => (i.Comment ?? string.Empty).Contains("cover", StringComparison.OrdinalIgnoreCase)) ??
imageStreams.FirstOrDefault(); imageStreams.FirstOrDefault();
#pragma warning restore CA1826
var imageStreamIndex = imageStream?.Index; var imageStreamIndex = imageStream?.Index;
var tempFile = await _mediaEncoder.ExtractAudioImage(item.Path, imageStreamIndex, cancellationToken).ConfigureAwait(false); var tempFile = await _mediaEncoder.ExtractAudioImage(item.Path, imageStreamIndex, cancellationToken).ConfigureAwait(false);

View File

@ -88,6 +88,7 @@ namespace MediaBrowser.Providers.MediaInfo
: TimeSpan.FromSeconds(10); : TimeSpan.FromSeconds(10);
var query = new MediaStreamQuery { ItemId = item.Id, Index = item.DefaultVideoStreamIndex }; var query = new MediaStreamQuery { ItemId = item.Id, Index = item.DefaultVideoStreamIndex };
#pragma warning disable CA1826
var videoStream = _mediaSourceManager.GetMediaStreams(query).FirstOrDefault(); var videoStream = _mediaSourceManager.GetMediaStreams(query).FirstOrDefault();
if (videoStream is null) if (videoStream is null)
{ {
@ -95,7 +96,7 @@ namespace MediaBrowser.Providers.MediaInfo
query.Index = null; query.Index = null;
videoStream = _mediaSourceManager.GetMediaStreams(query).FirstOrDefault(); videoStream = _mediaSourceManager.GetMediaStreams(query).FirstOrDefault();
} }
#pragma warning restore CA1826
if (videoStream is null) if (videoStream is null)
{ {
_logger.LogInformation("Skipping image extraction: no video stream found for {Path}.", item.Path ?? string.Empty); _logger.LogInformation("Skipping image extraction: no video stream found for {Path}.", item.Path ?? string.Empty);