aboutsummaryrefslogtreecommitdiff
path: root/Jellyfin.Api/Extensions/DtoExtensions.cs
blob: 85f8d789e4dca025be0b6aae7d1c5b55afca33b2 (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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
using System;
using System.Linq;
using Jellyfin.Api.Helpers;
using MediaBrowser.Controller.Dto;
using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Querying;
using Microsoft.AspNetCore.Http;

namespace Jellyfin.Api.Extensions
{
    /// <summary>
    /// Dto Extensions.
    /// </summary>
    public static class DtoExtensions
    {
        /// <summary>
        /// Add Dto Item fields.
        /// </summary>
        /// <remarks>
        /// Converted from IHasItemFields.
        /// Legacy order: 1.
        /// </remarks>
        /// <param name="dtoOptions">DtoOptions object.</param>
        /// <param name="fields">Comma delimited string of fields.</param>
        /// <returns>Modified DtoOptions object.</returns>
        internal static DtoOptions AddItemFields(this DtoOptions dtoOptions, string? fields)
        {
            if (string.IsNullOrEmpty(fields))
            {
                dtoOptions.Fields = Array.Empty<ItemFields>();
            }
            else
            {
                dtoOptions.Fields = fields.Split(',')
                    .Select(v =>
                    {
                        if (Enum.TryParse(v, true, out ItemFields value))
                        {
                            return (ItemFields?)value;
                        }

                        return null;
                    })
                    .Where(i => i.HasValue)
                    .Select(i => i!.Value)
                    .ToArray();
            }

            return dtoOptions;
        }

        /// <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="request">Current request.</param>
        /// <returns>Modified DtoOptions object.</returns>
        internal static DtoOptions AddClientFields(
            this DtoOptions dtoOptions, HttpRequest request)
        {
            dtoOptions.Fields ??= Array.Empty<ItemFields>();

            string? client = ClaimHelpers.GetClient(request.HttpContext.User);

            // No client in claim
            if (string.IsNullOrEmpty(client))
            {
                return dtoOptions;
            }

            if (!dtoOptions.ContainsField(ItemFields.RecursiveItemCount))
            {
                if (client.IndexOf("kodi", StringComparison.OrdinalIgnoreCase) != -1 ||
                    client.IndexOf("wmc", StringComparison.OrdinalIgnoreCase) != -1 ||
                    client.IndexOf("media center", StringComparison.OrdinalIgnoreCase) != -1 ||
                    client.IndexOf("classic", StringComparison.OrdinalIgnoreCase) != -1)
                {
                    int oldLen = dtoOptions.Fields.Length;
                    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.IndexOf("kodi", StringComparison.OrdinalIgnoreCase) != -1 ||
                    client.IndexOf("wmc", StringComparison.OrdinalIgnoreCase) != -1 ||
                    client.IndexOf("media center", StringComparison.OrdinalIgnoreCase) != -1 ||
                    client.IndexOf("classic", StringComparison.OrdinalIgnoreCase) != -1 ||
                    client.IndexOf("roku", StringComparison.OrdinalIgnoreCase) != -1 ||
                    client.IndexOf("samsung", StringComparison.OrdinalIgnoreCase) != -1 ||
                    client.IndexOf("androidtv", StringComparison.OrdinalIgnoreCase) != -1)
                {
                    int oldLen = dtoOptions.Fields.Length;
                    var arr = new ItemFields[oldLen + 1];
                    dtoOptions.Fields.CopyTo(arr, 0);
                    arr[oldLen] = ItemFields.ChildCount;
                    dtoOptions.Fields = arr;
                }
            }

            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,
            ImageType[] enableImageTypes)
        {
            dtoOptions.EnableImages = enableImages ?? true;

            if (imageTypeLimit.HasValue)
            {
                dtoOptions.ImageTypeLimit = imageTypeLimit.Value;
            }

            if (enableUserData.HasValue)
            {
                dtoOptions.EnableUserData = enableUserData.Value;
            }

            if (enableImageTypes.Length != 0)
            {
                dtoOptions.ImageTypes = enableImageTypes;
            }

            return dtoOptions;
        }

        /// <summary>
        /// Check if DtoOptions contains field.
        /// </summary>
        /// <param name="dtoOptions">DtoOptions object.</param>
        /// <param name="field">Field to check.</param>
        /// <returns>Field existence.</returns>
        internal static bool ContainsField(this DtoOptions dtoOptions, ItemFields field)
            => dtoOptions.Fields != null && dtoOptions.Fields.Contains(field);
    }
}