using System; using System.Collections.Generic; using System.Security.Claims; using Jellyfin.Extensions; using MediaBrowser.Controller.Dto; using MediaBrowser.Model.Entities; using MediaBrowser.Model.Querying; namespace Jellyfin.Api.Extensions; /// /// Dto Extensions. /// public static class DtoExtensions { /// /// Add additional fields depending on client. /// /// /// Use in place of GetDtoOptions. /// Legacy order: 2. /// /// DtoOptions object. /// Current claims principal. /// Modified DtoOptions object. internal static DtoOptions AddClientFields( this DtoOptions dtoOptions, ClaimsPrincipal user) { dtoOptions.Fields ??= Array.Empty(); string? client = user.GetClient(); // No client in claim if (string.IsNullOrEmpty(client)) { return dtoOptions; } if (!dtoOptions.ContainsField(ItemFields.RecursiveItemCount)) { if (client.Contains("kodi", StringComparison.OrdinalIgnoreCase) || client.Contains("wmc", StringComparison.OrdinalIgnoreCase) || client.Contains("media center", StringComparison.OrdinalIgnoreCase) || client.Contains("classic", StringComparison.OrdinalIgnoreCase)) { int oldLen = dtoOptions.Fields.Count; var arr = new ItemFields[oldLen + 1]; dtoOptions.Fields.CopyTo(arr, 0); arr[oldLen] = ItemFields.RecursiveItemCount; dtoOptions.Fields = arr; } } if (!dtoOptions.ContainsField(ItemFields.ChildCount)) { if (client.Contains("kodi", StringComparison.OrdinalIgnoreCase) || client.Contains("wmc", StringComparison.OrdinalIgnoreCase) || client.Contains("media center", StringComparison.OrdinalIgnoreCase) || client.Contains("classic", StringComparison.OrdinalIgnoreCase) || client.Contains("roku", StringComparison.OrdinalIgnoreCase) || client.Contains("samsung", StringComparison.OrdinalIgnoreCase) || client.Contains("androidtv", StringComparison.OrdinalIgnoreCase)) { int oldLen = dtoOptions.Fields.Count; var arr = new ItemFields[oldLen + 1]; dtoOptions.Fields.CopyTo(arr, 0); arr[oldLen] = ItemFields.ChildCount; dtoOptions.Fields = arr; } } return dtoOptions; } /// /// Add additional DtoOptions. /// /// /// Converted from IHasDtoOptions. /// Legacy order: 3. /// /// DtoOptions object. /// Enable images. /// Enable user data. /// Image type limit. /// Enable image types. /// Modified DtoOptions object. internal static DtoOptions AddAdditionalDtoOptions( this DtoOptions dtoOptions, bool? enableImages, bool? enableUserData, int? imageTypeLimit, IReadOnlyList enableImageTypes) { dtoOptions.EnableImages = enableImages ?? true; if (imageTypeLimit.HasValue) { dtoOptions.ImageTypeLimit = imageTypeLimit.Value; } if (enableUserData.HasValue) { dtoOptions.EnableUserData = enableUserData.Value; } if (enableImageTypes.Count != 0) { dtoOptions.ImageTypes = enableImageTypes; } return dtoOptions; } }