aboutsummaryrefslogtreecommitdiff
path: root/Jellyfin.Api/Extensions/DtoExtensions.cs
blob: f919a4707d80b76dcbe7e4838773a53837e8effd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
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;

/// <summary>
/// Dto Extensions.
/// </summary>
public static class DtoExtensions
{
    /// <summary>
    /// Add additional fields depending on client.
    /// </summary>
    /// <remarks>
    /// Use in place of GetDtoOptions.
    /// Legacy order: 2.
    /// </remarks>
    /// <param name="dtoOptions">DtoOptions object.</param>
    /// <param name="user">Current claims principal.</param>
    /// <returns>Modified DtoOptions object.</returns>
    internal static DtoOptions AddClientFields(
        this DtoOptions dtoOptions, ClaimsPrincipal user)
    {
        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))
            {
                dtoOptions.Fields = [..dtoOptions.Fields, ItemFields.RecursiveItemCount];
            }
        }

        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))
            {
                dtoOptions.Fields = [..dtoOptions.Fields, ItemFields.ChildCount];
            }
        }

        return dtoOptions;
    }

    /// <summary>
    /// Add additional DtoOptions.
    /// </summary>
    /// <remarks>
    /// Converted from IHasDtoOptions.
    /// Legacy order: 3.
    /// </remarks>
    /// <param name="dtoOptions">DtoOptions object.</param>
    /// <param name="enableImages">Enable images.</param>
    /// <param name="enableUserData">Enable user data.</param>
    /// <param name="imageTypeLimit">Image type limit.</param>
    /// <param name="enableImageTypes">Enable image types.</param>
    /// <returns>Modified DtoOptions object.</returns>
    internal static DtoOptions AddAdditionalDtoOptions(
        this DtoOptions dtoOptions,
        bool? enableImages,
        bool? enableUserData,
        int? imageTypeLimit,
        IReadOnlyList<ImageType> 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;
    }
}