mirror of
				https://github.com/jellyfin/jellyfin.git
				synced 2025-11-03 19:17:24 -05:00 
			
		
		
		
	Merge pull request #13589 from JPVenson/feature/DatabaseRefactor
[Feature] Database code refactor
This commit is contained in:
		
						commit
						d848faeb75
					
				@ -1,6 +1,8 @@
 | 
			
		||||
{
 | 
			
		||||
    "name": "Development Jellyfin Server",
 | 
			
		||||
    "image":"mcr.microsoft.com/devcontainers/dotnet:9.0-bookworm",
 | 
			
		||||
    "image": "mcr.microsoft.com/devcontainers/dotnet:9.0-bookworm",
 | 
			
		||||
    "service": "app",
 | 
			
		||||
    "workspaceFolder": "/workspaces/${localWorkspaceFolderBasename}",
 | 
			
		||||
    // restores nuget packages, installs the dotnet workloads and installs the dev https certificate
 | 
			
		||||
    "postStartCommand": "sudo dotnet restore; sudo dotnet workload update; sudo dotnet dev-certs https --trust; sudo bash \"./.devcontainer/install-ffmpeg.sh\"",
 | 
			
		||||
    // reads the extensions list and installs them
 | 
			
		||||
@ -13,7 +15,9 @@
 | 
			
		||||
        },
 | 
			
		||||
        "ghcr.io/devcontainers-contrib/features/apt-packages:1": {
 | 
			
		||||
            "preserve_apt_list": false,
 | 
			
		||||
            "packages": ["libfontconfig1"]
 | 
			
		||||
            "packages": [
 | 
			
		||||
                "libfontconfig1"
 | 
			
		||||
            ]
 | 
			
		||||
        },
 | 
			
		||||
        "ghcr.io/devcontainers/features/docker-in-docker:2": {
 | 
			
		||||
            "dockerDashComposeVersion": "v2"
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										3
									
								
								.vscode/settings.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								.vscode/settings.json
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,3 @@
 | 
			
		||||
{
 | 
			
		||||
    "dotnet.preferVisualStudioCodeFileSystemWatcher": true
 | 
			
		||||
}
 | 
			
		||||
@ -35,11 +35,11 @@ using Emby.Server.Implementations.SyncPlay;
 | 
			
		||||
using Emby.Server.Implementations.TV;
 | 
			
		||||
using Emby.Server.Implementations.Updates;
 | 
			
		||||
using Jellyfin.Api.Helpers;
 | 
			
		||||
using Jellyfin.Database.Implementations;
 | 
			
		||||
using Jellyfin.Drawing;
 | 
			
		||||
using Jellyfin.MediaEncoding.Hls.Playlist;
 | 
			
		||||
using Jellyfin.Networking.Manager;
 | 
			
		||||
using Jellyfin.Networking.Udp;
 | 
			
		||||
using Jellyfin.Server.Implementations;
 | 
			
		||||
using Jellyfin.Server.Implementations.Item;
 | 
			
		||||
using Jellyfin.Server.Implementations.MediaSegments;
 | 
			
		||||
using MediaBrowser.Common;
 | 
			
		||||
@ -574,10 +574,15 @@ namespace Emby.Server.Implementations
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Create services registered with the service container that need to be initialized at application startup.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        /// <param name="startupConfig">The configuration used to initialise the application.</param>
 | 
			
		||||
        /// <returns>A task representing the service initialization operation.</returns>
 | 
			
		||||
        public async Task InitializeServices()
 | 
			
		||||
        public async Task InitializeServices(IConfiguration startupConfig)
 | 
			
		||||
        {
 | 
			
		||||
            var jellyfinDb = await Resolve<IDbContextFactory<JellyfinDbContext>>().CreateDbContextAsync().ConfigureAwait(false);
 | 
			
		||||
            var factory = Resolve<IDbContextFactory<JellyfinDbContext>>();
 | 
			
		||||
            var provider = Resolve<IJellyfinDatabaseProvider>();
 | 
			
		||||
            provider.DbContextFactory = factory;
 | 
			
		||||
 | 
			
		||||
            var jellyfinDb = await factory.CreateDbContextAsync().ConfigureAwait(false);
 | 
			
		||||
            await using (jellyfinDb.ConfigureAwait(false))
 | 
			
		||||
            {
 | 
			
		||||
                if ((await jellyfinDb.Database.GetPendingMigrationsAsync().ConfigureAwait(false)).Any())
 | 
			
		||||
 | 
			
		||||
@ -4,7 +4,7 @@ using System.IO;
 | 
			
		||||
using System.Linq;
 | 
			
		||||
using System.Threading;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
using Jellyfin.Data.Entities;
 | 
			
		||||
using Jellyfin.Database.Implementations.Entities;
 | 
			
		||||
using MediaBrowser.Common.Configuration;
 | 
			
		||||
using MediaBrowser.Controller.Collections;
 | 
			
		||||
using MediaBrowser.Controller.Entities;
 | 
			
		||||
 | 
			
		||||
@ -4,7 +4,7 @@ using System;
 | 
			
		||||
using System.Linq;
 | 
			
		||||
using System.Threading;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
using Jellyfin.Server.Implementations;
 | 
			
		||||
using Jellyfin.Database.Implementations;
 | 
			
		||||
using MediaBrowser.Controller;
 | 
			
		||||
using MediaBrowser.Controller.Entities;
 | 
			
		||||
using MediaBrowser.Controller.Library;
 | 
			
		||||
 | 
			
		||||
@ -5,8 +5,8 @@ using System.Collections.Generic;
 | 
			
		||||
using System.Globalization;
 | 
			
		||||
using System.IO;
 | 
			
		||||
using System.Linq;
 | 
			
		||||
using Jellyfin.Data.Entities;
 | 
			
		||||
using Jellyfin.Data.Enums;
 | 
			
		||||
using Jellyfin.Database.Implementations.Entities;
 | 
			
		||||
using Jellyfin.Extensions;
 | 
			
		||||
using MediaBrowser.Common;
 | 
			
		||||
using MediaBrowser.Controller.Channels;
 | 
			
		||||
 | 
			
		||||
@ -18,6 +18,7 @@
 | 
			
		||||
    <ProjectReference Include="..\Emby.Photos\Emby.Photos.csproj" />
 | 
			
		||||
    <ProjectReference Include="..\src\Jellyfin.Drawing\Jellyfin.Drawing.csproj" />
 | 
			
		||||
    <ProjectReference Include="..\MediaBrowser.MediaEncoding\MediaBrowser.MediaEncoding.csproj" />
 | 
			
		||||
    <ProjectReference Include="..\src\Jellyfin.Database\Jellyfin.Database.Implementations\Jellyfin.Database.Implementations.csproj" />
 | 
			
		||||
  </ItemGroup>
 | 
			
		||||
 | 
			
		||||
  <ItemGroup>
 | 
			
		||||
 | 
			
		||||
@ -5,8 +5,8 @@ using System.Globalization;
 | 
			
		||||
using System.Linq;
 | 
			
		||||
using System.Threading;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
using Jellyfin.Data.Entities;
 | 
			
		||||
using Jellyfin.Data.Events;
 | 
			
		||||
using Jellyfin.Database.Implementations.Entities;
 | 
			
		||||
using Jellyfin.Extensions;
 | 
			
		||||
using MediaBrowser.Controller.Channels;
 | 
			
		||||
using MediaBrowser.Controller.Configuration;
 | 
			
		||||
 | 
			
		||||
@ -1,7 +1,8 @@
 | 
			
		||||
#pragma warning disable CS1591
 | 
			
		||||
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
using Jellyfin.Data.Enums;
 | 
			
		||||
using Jellyfin.Data;
 | 
			
		||||
using Jellyfin.Database.Implementations.Enums;
 | 
			
		||||
using MediaBrowser.Controller.Net;
 | 
			
		||||
using Microsoft.AspNetCore.Http;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -2,6 +2,7 @@
 | 
			
		||||
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using Jellyfin.Data.Enums;
 | 
			
		||||
using Jellyfin.Database.Implementations.Enums;
 | 
			
		||||
using MediaBrowser.Common.Configuration;
 | 
			
		||||
using MediaBrowser.Controller.Drawing;
 | 
			
		||||
using MediaBrowser.Controller.Dto;
 | 
			
		||||
 | 
			
		||||
@ -6,6 +6,7 @@ using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.IO;
 | 
			
		||||
using Jellyfin.Data.Enums;
 | 
			
		||||
using Jellyfin.Database.Implementations.Enums;
 | 
			
		||||
using MediaBrowser.Common.Configuration;
 | 
			
		||||
using MediaBrowser.Controller.Drawing;
 | 
			
		||||
using MediaBrowser.Controller.Dto;
 | 
			
		||||
 | 
			
		||||
@ -2,6 +2,7 @@
 | 
			
		||||
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using Jellyfin.Data.Enums;
 | 
			
		||||
using Jellyfin.Database.Implementations.Enums;
 | 
			
		||||
using MediaBrowser.Common.Configuration;
 | 
			
		||||
using MediaBrowser.Controller.Drawing;
 | 
			
		||||
using MediaBrowser.Controller.Dto;
 | 
			
		||||
 | 
			
		||||
@ -4,6 +4,7 @@
 | 
			
		||||
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using Jellyfin.Data.Enums;
 | 
			
		||||
using Jellyfin.Database.Implementations.Enums;
 | 
			
		||||
using MediaBrowser.Common.Configuration;
 | 
			
		||||
using MediaBrowser.Controller.Drawing;
 | 
			
		||||
using MediaBrowser.Controller.Dto;
 | 
			
		||||
 | 
			
		||||
@ -18,8 +18,10 @@ using Emby.Server.Implementations.Library.Validators;
 | 
			
		||||
using Emby.Server.Implementations.Playlists;
 | 
			
		||||
using Emby.Server.Implementations.ScheduledTasks.Tasks;
 | 
			
		||||
using Emby.Server.Implementations.Sorting;
 | 
			
		||||
using Jellyfin.Data.Entities;
 | 
			
		||||
using Jellyfin.Data;
 | 
			
		||||
using Jellyfin.Data.Enums;
 | 
			
		||||
using Jellyfin.Database.Implementations.Entities;
 | 
			
		||||
using Jellyfin.Database.Implementations.Enums;
 | 
			
		||||
using Jellyfin.Extensions;
 | 
			
		||||
using MediaBrowser.Common.Extensions;
 | 
			
		||||
using MediaBrowser.Controller;
 | 
			
		||||
 | 
			
		||||
@ -13,8 +13,10 @@ using System.Text.Json;
 | 
			
		||||
using System.Threading;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
using AsyncKeyedLock;
 | 
			
		||||
using Jellyfin.Data.Entities;
 | 
			
		||||
using Jellyfin.Data;
 | 
			
		||||
using Jellyfin.Data.Enums;
 | 
			
		||||
using Jellyfin.Database.Implementations.Entities;
 | 
			
		||||
using Jellyfin.Database.Implementations.Enums;
 | 
			
		||||
using Jellyfin.Extensions;
 | 
			
		||||
using Jellyfin.Extensions.Json;
 | 
			
		||||
using MediaBrowser.Common.Configuration;
 | 
			
		||||
 | 
			
		||||
@ -3,7 +3,7 @@
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Linq;
 | 
			
		||||
using Jellyfin.Data.Enums;
 | 
			
		||||
using Jellyfin.Database.Implementations.Enums;
 | 
			
		||||
using Jellyfin.Extensions;
 | 
			
		||||
using MediaBrowser.Model.Entities;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -4,8 +4,9 @@ using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Collections.Immutable;
 | 
			
		||||
using System.Linq;
 | 
			
		||||
using Jellyfin.Data.Entities;
 | 
			
		||||
using Jellyfin.Data.Enums;
 | 
			
		||||
using Jellyfin.Database.Implementations.Entities;
 | 
			
		||||
using Jellyfin.Database.Implementations.Enums;
 | 
			
		||||
using Jellyfin.Extensions;
 | 
			
		||||
using MediaBrowser.Controller.Dto;
 | 
			
		||||
using MediaBrowser.Controller.Entities;
 | 
			
		||||
 | 
			
		||||
@ -3,8 +3,9 @@
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Linq;
 | 
			
		||||
using Jellyfin.Data.Entities;
 | 
			
		||||
using Jellyfin.Data.Enums;
 | 
			
		||||
using Jellyfin.Database.Implementations.Entities;
 | 
			
		||||
using Jellyfin.Database.Implementations.Enums;
 | 
			
		||||
using Jellyfin.Extensions;
 | 
			
		||||
using MediaBrowser.Controller.Dto;
 | 
			
		||||
using MediaBrowser.Controller.Entities;
 | 
			
		||||
 | 
			
		||||
@ -4,6 +4,7 @@ using System.Linq;
 | 
			
		||||
using System.Threading;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
using Jellyfin.Data.Enums;
 | 
			
		||||
using Jellyfin.Database.Implementations.Enums;
 | 
			
		||||
using MediaBrowser.Controller.Drawing;
 | 
			
		||||
using MediaBrowser.Controller.Dto;
 | 
			
		||||
using MediaBrowser.Controller.Entities;
 | 
			
		||||
 | 
			
		||||
@ -6,9 +6,9 @@ using System.Collections.Generic;
 | 
			
		||||
using System.Globalization;
 | 
			
		||||
using System.Linq;
 | 
			
		||||
using System.Threading;
 | 
			
		||||
using Jellyfin.Data.Entities;
 | 
			
		||||
using Jellyfin.Database.Implementations;
 | 
			
		||||
using Jellyfin.Database.Implementations.Entities;
 | 
			
		||||
using Jellyfin.Extensions;
 | 
			
		||||
using Jellyfin.Server.Implementations;
 | 
			
		||||
using MediaBrowser.Controller.Configuration;
 | 
			
		||||
using MediaBrowser.Controller.Dto;
 | 
			
		||||
using MediaBrowser.Controller.Entities;
 | 
			
		||||
 | 
			
		||||
@ -6,8 +6,10 @@ using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Linq;
 | 
			
		||||
using System.Threading;
 | 
			
		||||
using Jellyfin.Data.Entities;
 | 
			
		||||
using Jellyfin.Data;
 | 
			
		||||
using Jellyfin.Data.Enums;
 | 
			
		||||
using Jellyfin.Database.Implementations.Entities;
 | 
			
		||||
using Jellyfin.Database.Implementations.Enums;
 | 
			
		||||
using Jellyfin.Extensions;
 | 
			
		||||
using MediaBrowser.Controller.Channels;
 | 
			
		||||
using MediaBrowser.Controller.Configuration;
 | 
			
		||||
 | 
			
		||||
@ -4,6 +4,7 @@ using System.Linq;
 | 
			
		||||
using System.Threading;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
using Jellyfin.Data.Enums;
 | 
			
		||||
using Jellyfin.Database.Implementations.Enums;
 | 
			
		||||
using MediaBrowser.Controller.Collections;
 | 
			
		||||
using MediaBrowser.Controller.Entities;
 | 
			
		||||
using MediaBrowser.Controller.Entities.Movies;
 | 
			
		||||
 | 
			
		||||
@ -9,8 +9,8 @@ using System.IO;
 | 
			
		||||
using System.Linq;
 | 
			
		||||
using System.Threading;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
using Jellyfin.Data.Entities;
 | 
			
		||||
using Jellyfin.Data.Enums;
 | 
			
		||||
using Jellyfin.Database.Implementations.Entities;
 | 
			
		||||
using Jellyfin.Extensions;
 | 
			
		||||
using MediaBrowser.Controller.Dto;
 | 
			
		||||
using MediaBrowser.Controller.Entities;
 | 
			
		||||
 | 
			
		||||
@ -3,8 +3,8 @@
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Linq;
 | 
			
		||||
using System.Text.Json.Serialization;
 | 
			
		||||
using Jellyfin.Data.Entities;
 | 
			
		||||
using Jellyfin.Data.Enums;
 | 
			
		||||
using Jellyfin.Database.Implementations.Entities;
 | 
			
		||||
using MediaBrowser.Common;
 | 
			
		||||
using MediaBrowser.Controller.Entities;
 | 
			
		||||
using MediaBrowser.Controller.Playlists;
 | 
			
		||||
 | 
			
		||||
@ -2,7 +2,7 @@ using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Threading;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
using Jellyfin.Server.Implementations;
 | 
			
		||||
using Jellyfin.Database.Implementations;
 | 
			
		||||
using MediaBrowser.Model.Globalization;
 | 
			
		||||
using MediaBrowser.Model.Tasks;
 | 
			
		||||
using Microsoft.EntityFrameworkCore;
 | 
			
		||||
@ -18,6 +18,7 @@ namespace Emby.Server.Implementations.ScheduledTasks.Tasks
 | 
			
		||||
        private readonly ILogger<OptimizeDatabaseTask> _logger;
 | 
			
		||||
        private readonly ILocalizationManager _localization;
 | 
			
		||||
        private readonly IDbContextFactory<JellyfinDbContext> _provider;
 | 
			
		||||
        private readonly IJellyfinDatabaseProvider _jellyfinDatabaseProvider;
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Initializes a new instance of the <see cref="OptimizeDatabaseTask" /> class.
 | 
			
		||||
@ -25,14 +26,17 @@ namespace Emby.Server.Implementations.ScheduledTasks.Tasks
 | 
			
		||||
        /// <param name="logger">Instance of the <see cref="ILogger"/> interface.</param>
 | 
			
		||||
        /// <param name="localization">Instance of the <see cref="ILocalizationManager"/> interface.</param>
 | 
			
		||||
        /// <param name="provider">Instance of the <see cref="IDbContextFactory{JellyfinDbContext}"/> interface.</param>
 | 
			
		||||
        /// <param name="jellyfinDatabaseProvider">Instance of the JellyfinDatabaseProvider that can be used for provider specific operations.</param>
 | 
			
		||||
        public OptimizeDatabaseTask(
 | 
			
		||||
            ILogger<OptimizeDatabaseTask> logger,
 | 
			
		||||
            ILocalizationManager localization,
 | 
			
		||||
            IDbContextFactory<JellyfinDbContext> provider)
 | 
			
		||||
            IDbContextFactory<JellyfinDbContext> provider,
 | 
			
		||||
            IJellyfinDatabaseProvider jellyfinDatabaseProvider)
 | 
			
		||||
        {
 | 
			
		||||
            _logger = logger;
 | 
			
		||||
            _localization = localization;
 | 
			
		||||
            _provider = provider;
 | 
			
		||||
            _jellyfinDatabaseProvider = jellyfinDatabaseProvider;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <inheritdoc />
 | 
			
		||||
@ -73,20 +77,7 @@ namespace Emby.Server.Implementations.ScheduledTasks.Tasks
 | 
			
		||||
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                var context = await _provider.CreateDbContextAsync(cancellationToken).ConfigureAwait(false);
 | 
			
		||||
                await using (context.ConfigureAwait(false))
 | 
			
		||||
                {
 | 
			
		||||
                    if (context.Database.IsSqlite())
 | 
			
		||||
                    {
 | 
			
		||||
                        await context.Database.ExecuteSqlRawAsync("PRAGMA optimize", cancellationToken).ConfigureAwait(false);
 | 
			
		||||
                        await context.Database.ExecuteSqlRawAsync("VACUUM", cancellationToken).ConfigureAwait(false);
 | 
			
		||||
                        _logger.LogInformation("jellyfin.db optimized successfully!");
 | 
			
		||||
                    }
 | 
			
		||||
                    else
 | 
			
		||||
                    {
 | 
			
		||||
                        _logger.LogInformation("This database doesn't support optimization");
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                await _jellyfinDatabaseProvider.RunScheduledOptimisation(cancellationToken).ConfigureAwait(false);
 | 
			
		||||
            }
 | 
			
		||||
            catch (Exception e)
 | 
			
		||||
            {
 | 
			
		||||
 | 
			
		||||
@ -7,11 +7,13 @@ using System.Globalization;
 | 
			
		||||
using System.Linq;
 | 
			
		||||
using System.Threading;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
using Jellyfin.Data.Entities;
 | 
			
		||||
using Jellyfin.Data.Entities.Security;
 | 
			
		||||
using Jellyfin.Data;
 | 
			
		||||
using Jellyfin.Data.Enums;
 | 
			
		||||
using Jellyfin.Data.Events;
 | 
			
		||||
using Jellyfin.Data.Queries;
 | 
			
		||||
using Jellyfin.Database.Implementations.Entities;
 | 
			
		||||
using Jellyfin.Database.Implementations.Entities.Security;
 | 
			
		||||
using Jellyfin.Database.Implementations.Enums;
 | 
			
		||||
using Jellyfin.Extensions;
 | 
			
		||||
using MediaBrowser.Common.Events;
 | 
			
		||||
using MediaBrowser.Common.Extensions;
 | 
			
		||||
 | 
			
		||||
@ -2,8 +2,8 @@
 | 
			
		||||
#pragma warning disable CS1591
 | 
			
		||||
 | 
			
		||||
using System;
 | 
			
		||||
using Jellyfin.Data.Entities;
 | 
			
		||||
using Jellyfin.Data.Enums;
 | 
			
		||||
using Jellyfin.Database.Implementations.Entities;
 | 
			
		||||
using MediaBrowser.Controller.Entities;
 | 
			
		||||
using MediaBrowser.Controller.Library;
 | 
			
		||||
using MediaBrowser.Controller.Sorting;
 | 
			
		||||
 | 
			
		||||
@ -1,8 +1,8 @@
 | 
			
		||||
#nullable disable
 | 
			
		||||
 | 
			
		||||
using System;
 | 
			
		||||
using Jellyfin.Data.Entities;
 | 
			
		||||
using Jellyfin.Data.Enums;
 | 
			
		||||
using Jellyfin.Database.Implementations.Entities;
 | 
			
		||||
using MediaBrowser.Controller.Entities;
 | 
			
		||||
using MediaBrowser.Controller.Library;
 | 
			
		||||
using MediaBrowser.Controller.Sorting;
 | 
			
		||||
 | 
			
		||||
@ -1,8 +1,8 @@
 | 
			
		||||
#nullable disable
 | 
			
		||||
#pragma warning disable CS1591
 | 
			
		||||
 | 
			
		||||
using Jellyfin.Data.Entities;
 | 
			
		||||
using Jellyfin.Data.Enums;
 | 
			
		||||
using Jellyfin.Database.Implementations.Entities;
 | 
			
		||||
using MediaBrowser.Controller.Entities;
 | 
			
		||||
using MediaBrowser.Controller.Library;
 | 
			
		||||
using MediaBrowser.Controller.Sorting;
 | 
			
		||||
 | 
			
		||||
@ -2,8 +2,8 @@
 | 
			
		||||
 | 
			
		||||
#pragma warning disable CS1591
 | 
			
		||||
 | 
			
		||||
using Jellyfin.Data.Entities;
 | 
			
		||||
using Jellyfin.Data.Enums;
 | 
			
		||||
using Jellyfin.Database.Implementations.Entities;
 | 
			
		||||
using MediaBrowser.Controller.Entities;
 | 
			
		||||
using MediaBrowser.Controller.Library;
 | 
			
		||||
using MediaBrowser.Controller.Sorting;
 | 
			
		||||
 | 
			
		||||
@ -2,8 +2,8 @@
 | 
			
		||||
 | 
			
		||||
#pragma warning disable CS1591
 | 
			
		||||
 | 
			
		||||
using Jellyfin.Data.Entities;
 | 
			
		||||
using Jellyfin.Data.Enums;
 | 
			
		||||
using Jellyfin.Database.Implementations.Entities;
 | 
			
		||||
using MediaBrowser.Controller.Entities;
 | 
			
		||||
using MediaBrowser.Controller.Library;
 | 
			
		||||
using MediaBrowser.Controller.Sorting;
 | 
			
		||||
 | 
			
		||||
@ -1,7 +1,7 @@
 | 
			
		||||
#nullable disable
 | 
			
		||||
 | 
			
		||||
using Jellyfin.Data.Entities;
 | 
			
		||||
using Jellyfin.Data.Enums;
 | 
			
		||||
using Jellyfin.Database.Implementations.Entities;
 | 
			
		||||
using MediaBrowser.Controller.Entities;
 | 
			
		||||
using MediaBrowser.Controller.Library;
 | 
			
		||||
using MediaBrowser.Controller.Sorting;
 | 
			
		||||
 | 
			
		||||
@ -5,7 +5,7 @@ using System.Collections.Generic;
 | 
			
		||||
using System.Linq;
 | 
			
		||||
using System.Threading;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
using Jellyfin.Data.Entities;
 | 
			
		||||
using Jellyfin.Database.Implementations.Entities;
 | 
			
		||||
using Jellyfin.Extensions;
 | 
			
		||||
using MediaBrowser.Controller.Library;
 | 
			
		||||
using MediaBrowser.Controller.Session;
 | 
			
		||||
 | 
			
		||||
@ -3,8 +3,10 @@
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Linq;
 | 
			
		||||
using Jellyfin.Data.Entities;
 | 
			
		||||
using Jellyfin.Data;
 | 
			
		||||
using Jellyfin.Data.Enums;
 | 
			
		||||
using Jellyfin.Database.Implementations.Entities;
 | 
			
		||||
using Jellyfin.Database.Implementations.Enums;
 | 
			
		||||
using Jellyfin.Extensions;
 | 
			
		||||
using MediaBrowser.Controller.Configuration;
 | 
			
		||||
using MediaBrowser.Controller.Dto;
 | 
			
		||||
 | 
			
		||||
@ -3,7 +3,8 @@ using System.Security.Claims;
 | 
			
		||||
using System.Text.Encodings.Web;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
using Jellyfin.Api.Constants;
 | 
			
		||||
using Jellyfin.Data.Enums;
 | 
			
		||||
using Jellyfin.Data;
 | 
			
		||||
using Jellyfin.Database.Implementations.Enums;
 | 
			
		||||
using MediaBrowser.Controller.Authentication;
 | 
			
		||||
using MediaBrowser.Controller.Net;
 | 
			
		||||
using Microsoft.AspNetCore.Authentication;
 | 
			
		||||
 | 
			
		||||
@ -1,7 +1,8 @@
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
using Jellyfin.Api.Constants;
 | 
			
		||||
using Jellyfin.Api.Extensions;
 | 
			
		||||
using Jellyfin.Data.Enums;
 | 
			
		||||
using Jellyfin.Data;
 | 
			
		||||
using Jellyfin.Database.Implementations.Enums;
 | 
			
		||||
using Jellyfin.Extensions;
 | 
			
		||||
using MediaBrowser.Common.Extensions;
 | 
			
		||||
using MediaBrowser.Common.Net;
 | 
			
		||||
 | 
			
		||||
@ -1,6 +1,7 @@
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
using Jellyfin.Api.Extensions;
 | 
			
		||||
using Jellyfin.Data.Enums;
 | 
			
		||||
using Jellyfin.Database.Implementations.Enums;
 | 
			
		||||
using MediaBrowser.Common.Extensions;
 | 
			
		||||
using MediaBrowser.Controller.Library;
 | 
			
		||||
using MediaBrowser.Controller.SyncPlay;
 | 
			
		||||
 | 
			
		||||
@ -1,5 +1,6 @@
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
using Jellyfin.Api.Extensions;
 | 
			
		||||
using Jellyfin.Data;
 | 
			
		||||
using Jellyfin.Extensions;
 | 
			
		||||
using MediaBrowser.Common.Extensions;
 | 
			
		||||
using MediaBrowser.Controller.Library;
 | 
			
		||||
 | 
			
		||||
@ -1,5 +1,5 @@
 | 
			
		||||
using Jellyfin.Api.Auth.DefaultAuthorizationPolicy;
 | 
			
		||||
using Jellyfin.Data.Enums;
 | 
			
		||||
using Jellyfin.Database.Implementations.Enums;
 | 
			
		||||
 | 
			
		||||
namespace Jellyfin.Api.Auth.UserPermissionPolicy
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
@ -4,8 +4,9 @@ using System.Linq;
 | 
			
		||||
using Jellyfin.Api.Extensions;
 | 
			
		||||
using Jellyfin.Api.Helpers;
 | 
			
		||||
using Jellyfin.Api.ModelBinders;
 | 
			
		||||
using Jellyfin.Data.Entities;
 | 
			
		||||
using Jellyfin.Data.Enums;
 | 
			
		||||
using Jellyfin.Database.Implementations.Entities;
 | 
			
		||||
using Jellyfin.Database.Implementations.Enums;
 | 
			
		||||
using Jellyfin.Extensions;
 | 
			
		||||
using MediaBrowser.Controller.Dto;
 | 
			
		||||
using MediaBrowser.Controller.Entities;
 | 
			
		||||
 | 
			
		||||
@ -6,6 +6,7 @@ using System.Threading.Tasks;
 | 
			
		||||
using Jellyfin.Api.Helpers;
 | 
			
		||||
using Jellyfin.Api.ModelBinders;
 | 
			
		||||
using Jellyfin.Data.Enums;
 | 
			
		||||
using Jellyfin.Database.Implementations.Enums;
 | 
			
		||||
using Jellyfin.Extensions;
 | 
			
		||||
using MediaBrowser.Controller.Channels;
 | 
			
		||||
using MediaBrowser.Controller.Dto;
 | 
			
		||||
 | 
			
		||||
@ -4,8 +4,8 @@ using System.Diagnostics.CodeAnalysis;
 | 
			
		||||
using System.Globalization;
 | 
			
		||||
using System.Linq;
 | 
			
		||||
using Jellyfin.Api.Helpers;
 | 
			
		||||
using Jellyfin.Data.Entities;
 | 
			
		||||
using Jellyfin.Data.Enums;
 | 
			
		||||
using Jellyfin.Database.Implementations.Entities;
 | 
			
		||||
using Jellyfin.Database.Implementations.Enums;
 | 
			
		||||
using MediaBrowser.Common.Extensions;
 | 
			
		||||
using MediaBrowser.Controller;
 | 
			
		||||
using MediaBrowser.Model.Dto;
 | 
			
		||||
 | 
			
		||||
@ -4,8 +4,9 @@ using System.Linq;
 | 
			
		||||
using Jellyfin.Api.Extensions;
 | 
			
		||||
using Jellyfin.Api.Helpers;
 | 
			
		||||
using Jellyfin.Api.ModelBinders;
 | 
			
		||||
using Jellyfin.Data.Entities;
 | 
			
		||||
using Jellyfin.Data.Enums;
 | 
			
		||||
using Jellyfin.Database.Implementations.Entities;
 | 
			
		||||
using Jellyfin.Database.Implementations.Enums;
 | 
			
		||||
using Jellyfin.Extensions;
 | 
			
		||||
using MediaBrowser.Controller.Dto;
 | 
			
		||||
using MediaBrowser.Controller.Entities;
 | 
			
		||||
 | 
			
		||||
@ -130,7 +130,7 @@ public class ImageController : BaseJellyfinApiController
 | 
			
		||||
                await _userManager.ClearProfileImageAsync(user).ConfigureAwait(false);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            user.ProfileImage = new Data.Entities.ImageInfo(Path.Combine(userDataPath, "profile" + extension));
 | 
			
		||||
            user.ProfileImage = new Database.Implementations.Entities.ImageInfo(Path.Combine(userDataPath, "profile" + extension));
 | 
			
		||||
 | 
			
		||||
            await _providerManager
 | 
			
		||||
                .SaveImage(stream, mimeType, user.ProfileImage.Path)
 | 
			
		||||
 | 
			
		||||
@ -6,7 +6,7 @@ using System.Linq;
 | 
			
		||||
using Jellyfin.Api.Extensions;
 | 
			
		||||
using Jellyfin.Api.Helpers;
 | 
			
		||||
using Jellyfin.Api.ModelBinders;
 | 
			
		||||
using Jellyfin.Data.Entities;
 | 
			
		||||
using Jellyfin.Database.Implementations.Entities;
 | 
			
		||||
using Jellyfin.Extensions;
 | 
			
		||||
using MediaBrowser.Controller.Dto;
 | 
			
		||||
using MediaBrowser.Controller.Entities;
 | 
			
		||||
 | 
			
		||||
@ -4,7 +4,9 @@ using System.Linq;
 | 
			
		||||
using Jellyfin.Api.Extensions;
 | 
			
		||||
using Jellyfin.Api.Helpers;
 | 
			
		||||
using Jellyfin.Api.ModelBinders;
 | 
			
		||||
using Jellyfin.Data;
 | 
			
		||||
using Jellyfin.Data.Enums;
 | 
			
		||||
using Jellyfin.Database.Implementations.Enums;
 | 
			
		||||
using Jellyfin.Extensions;
 | 
			
		||||
using MediaBrowser.Common.Extensions;
 | 
			
		||||
using MediaBrowser.Controller.Dto;
 | 
			
		||||
 | 
			
		||||
@ -11,8 +11,9 @@ using Jellyfin.Api.Extensions;
 | 
			
		||||
using Jellyfin.Api.Helpers;
 | 
			
		||||
using Jellyfin.Api.ModelBinders;
 | 
			
		||||
using Jellyfin.Api.Models.LibraryDtos;
 | 
			
		||||
using Jellyfin.Data.Entities;
 | 
			
		||||
using Jellyfin.Data.Enums;
 | 
			
		||||
using Jellyfin.Database.Implementations.Entities;
 | 
			
		||||
using Jellyfin.Database.Implementations.Enums;
 | 
			
		||||
using Jellyfin.Extensions;
 | 
			
		||||
using MediaBrowser.Common.Api;
 | 
			
		||||
using MediaBrowser.Common.Extensions;
 | 
			
		||||
 | 
			
		||||
@ -15,6 +15,7 @@ using Jellyfin.Api.Helpers;
 | 
			
		||||
using Jellyfin.Api.ModelBinders;
 | 
			
		||||
using Jellyfin.Api.Models.LiveTvDtos;
 | 
			
		||||
using Jellyfin.Data.Enums;
 | 
			
		||||
using Jellyfin.Database.Implementations.Enums;
 | 
			
		||||
using Jellyfin.Extensions;
 | 
			
		||||
using MediaBrowser.Common.Api;
 | 
			
		||||
using MediaBrowser.Common.Configuration;
 | 
			
		||||
 | 
			
		||||
@ -4,7 +4,7 @@ using System.ComponentModel.DataAnnotations;
 | 
			
		||||
using System.Linq;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
using Jellyfin.Api.Extensions;
 | 
			
		||||
using Jellyfin.Data.Enums;
 | 
			
		||||
using Jellyfin.Database.Implementations.Enums;
 | 
			
		||||
using MediaBrowser.Controller;
 | 
			
		||||
using MediaBrowser.Controller.Entities;
 | 
			
		||||
using MediaBrowser.Controller.Library;
 | 
			
		||||
 | 
			
		||||
@ -5,8 +5,9 @@ using System.Linq;
 | 
			
		||||
using Jellyfin.Api.Extensions;
 | 
			
		||||
using Jellyfin.Api.Helpers;
 | 
			
		||||
using Jellyfin.Api.ModelBinders;
 | 
			
		||||
using Jellyfin.Data.Entities;
 | 
			
		||||
using Jellyfin.Data.Enums;
 | 
			
		||||
using Jellyfin.Database.Implementations.Entities;
 | 
			
		||||
using Jellyfin.Database.Implementations.Enums;
 | 
			
		||||
using Jellyfin.Extensions;
 | 
			
		||||
using MediaBrowser.Common.Extensions;
 | 
			
		||||
using MediaBrowser.Controller.Configuration;
 | 
			
		||||
 | 
			
		||||
@ -4,8 +4,9 @@ using System.Linq;
 | 
			
		||||
using Jellyfin.Api.Extensions;
 | 
			
		||||
using Jellyfin.Api.Helpers;
 | 
			
		||||
using Jellyfin.Api.ModelBinders;
 | 
			
		||||
using Jellyfin.Data.Entities;
 | 
			
		||||
using Jellyfin.Data.Enums;
 | 
			
		||||
using Jellyfin.Database.Implementations.Entities;
 | 
			
		||||
using Jellyfin.Database.Implementations.Enums;
 | 
			
		||||
using Jellyfin.Extensions;
 | 
			
		||||
using MediaBrowser.Controller.Dto;
 | 
			
		||||
using MediaBrowser.Controller.Entities;
 | 
			
		||||
 | 
			
		||||
@ -4,7 +4,7 @@ using System.Linq;
 | 
			
		||||
using Jellyfin.Api.Extensions;
 | 
			
		||||
using Jellyfin.Api.Helpers;
 | 
			
		||||
using Jellyfin.Api.ModelBinders;
 | 
			
		||||
using Jellyfin.Data.Entities;
 | 
			
		||||
using Jellyfin.Database.Implementations.Entities;
 | 
			
		||||
using Jellyfin.Extensions;
 | 
			
		||||
using MediaBrowser.Controller.Dto;
 | 
			
		||||
using MediaBrowser.Controller.Entities;
 | 
			
		||||
 | 
			
		||||
@ -5,7 +5,7 @@ using System.Threading.Tasks;
 | 
			
		||||
using Jellyfin.Api.Extensions;
 | 
			
		||||
using Jellyfin.Api.Helpers;
 | 
			
		||||
using Jellyfin.Api.ModelBinders;
 | 
			
		||||
using Jellyfin.Data.Entities;
 | 
			
		||||
using Jellyfin.Database.Implementations.Entities;
 | 
			
		||||
using Jellyfin.Extensions;
 | 
			
		||||
using MediaBrowser.Controller.Entities;
 | 
			
		||||
using MediaBrowser.Controller.Library;
 | 
			
		||||
 | 
			
		||||
@ -3,8 +3,8 @@ using System.ComponentModel.DataAnnotations;
 | 
			
		||||
using Jellyfin.Api.Extensions;
 | 
			
		||||
using Jellyfin.Api.Helpers;
 | 
			
		||||
using Jellyfin.Api.ModelBinders;
 | 
			
		||||
using Jellyfin.Data.Entities;
 | 
			
		||||
using Jellyfin.Data.Enums;
 | 
			
		||||
using Jellyfin.Database.Implementations.Entities;
 | 
			
		||||
using Jellyfin.Extensions;
 | 
			
		||||
using MediaBrowser.Controller.Dto;
 | 
			
		||||
using MediaBrowser.Controller.Entities;
 | 
			
		||||
 | 
			
		||||
@ -3,8 +3,9 @@ using System.ComponentModel.DataAnnotations;
 | 
			
		||||
using Jellyfin.Api.Extensions;
 | 
			
		||||
using Jellyfin.Api.Helpers;
 | 
			
		||||
using Jellyfin.Api.ModelBinders;
 | 
			
		||||
using Jellyfin.Data.Entities;
 | 
			
		||||
using Jellyfin.Data.Enums;
 | 
			
		||||
using Jellyfin.Database.Implementations.Entities;
 | 
			
		||||
using Jellyfin.Database.Implementations.Enums;
 | 
			
		||||
using Jellyfin.Extensions;
 | 
			
		||||
using MediaBrowser.Controller.Dto;
 | 
			
		||||
using MediaBrowser.Controller.Entities;
 | 
			
		||||
 | 
			
		||||
@ -1,6 +1,7 @@
 | 
			
		||||
using System;
 | 
			
		||||
using Jellyfin.Api.ModelBinders;
 | 
			
		||||
using Jellyfin.Data.Enums;
 | 
			
		||||
using Jellyfin.Database.Implementations.Enums;
 | 
			
		||||
using MediaBrowser.Model.Dto;
 | 
			
		||||
using MediaBrowser.Model.Entities;
 | 
			
		||||
using MediaBrowser.Model.Querying;
 | 
			
		||||
 | 
			
		||||
@ -7,6 +7,7 @@ using Jellyfin.Api.Extensions;
 | 
			
		||||
using Jellyfin.Api.Helpers;
 | 
			
		||||
using Jellyfin.Api.ModelBinders;
 | 
			
		||||
using Jellyfin.Data.Enums;
 | 
			
		||||
using Jellyfin.Database.Implementations.Enums;
 | 
			
		||||
using Jellyfin.Extensions;
 | 
			
		||||
using MediaBrowser.Controller.Dto;
 | 
			
		||||
using MediaBrowser.Controller.Entities;
 | 
			
		||||
 | 
			
		||||
@ -7,7 +7,8 @@ using Jellyfin.Api.Constants;
 | 
			
		||||
using Jellyfin.Api.Extensions;
 | 
			
		||||
using Jellyfin.Api.Helpers;
 | 
			
		||||
using Jellyfin.Api.Models.UserDtos;
 | 
			
		||||
using Jellyfin.Data.Enums;
 | 
			
		||||
using Jellyfin.Data;
 | 
			
		||||
using Jellyfin.Database.Implementations.Enums;
 | 
			
		||||
using Jellyfin.Extensions;
 | 
			
		||||
using MediaBrowser.Common.Api;
 | 
			
		||||
using MediaBrowser.Common.Extensions;
 | 
			
		||||
 | 
			
		||||
@ -7,8 +7,8 @@ using System.Threading.Tasks;
 | 
			
		||||
using Jellyfin.Api.Extensions;
 | 
			
		||||
using Jellyfin.Api.Helpers;
 | 
			
		||||
using Jellyfin.Api.ModelBinders;
 | 
			
		||||
using Jellyfin.Data.Entities;
 | 
			
		||||
using Jellyfin.Data.Enums;
 | 
			
		||||
using Jellyfin.Database.Implementations.Entities;
 | 
			
		||||
using Jellyfin.Extensions;
 | 
			
		||||
using MediaBrowser.Controller.Dto;
 | 
			
		||||
using MediaBrowser.Controller.Entities;
 | 
			
		||||
 | 
			
		||||
@ -6,8 +6,9 @@ using System.Linq;
 | 
			
		||||
using Jellyfin.Api.Extensions;
 | 
			
		||||
using Jellyfin.Api.Helpers;
 | 
			
		||||
using Jellyfin.Api.ModelBinders;
 | 
			
		||||
using Jellyfin.Data.Entities;
 | 
			
		||||
using Jellyfin.Data.Enums;
 | 
			
		||||
using Jellyfin.Database.Implementations.Entities;
 | 
			
		||||
using Jellyfin.Database.Implementations.Enums;
 | 
			
		||||
using Jellyfin.Extensions;
 | 
			
		||||
using MediaBrowser.Controller.Dto;
 | 
			
		||||
using MediaBrowser.Controller.Entities;
 | 
			
		||||
 | 
			
		||||
@ -8,8 +8,8 @@ using System.Text;
 | 
			
		||||
using System.Threading;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
using Jellyfin.Api.Extensions;
 | 
			
		||||
using Jellyfin.Data.Entities;
 | 
			
		||||
using Jellyfin.Data.Enums;
 | 
			
		||||
using Jellyfin.Database.Implementations.Entities;
 | 
			
		||||
using Jellyfin.Extensions;
 | 
			
		||||
using MediaBrowser.Common.Configuration;
 | 
			
		||||
using MediaBrowser.Common.Extensions;
 | 
			
		||||
 | 
			
		||||
@ -7,8 +7,10 @@ using System.Text.Json;
 | 
			
		||||
using System.Threading;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
using Jellyfin.Api.Extensions;
 | 
			
		||||
using Jellyfin.Data.Entities;
 | 
			
		||||
using Jellyfin.Data;
 | 
			
		||||
using Jellyfin.Data.Enums;
 | 
			
		||||
using Jellyfin.Database.Implementations.Entities;
 | 
			
		||||
using Jellyfin.Database.Implementations.Enums;
 | 
			
		||||
using Jellyfin.Extensions;
 | 
			
		||||
using MediaBrowser.Common.Extensions;
 | 
			
		||||
using MediaBrowser.Common.Net;
 | 
			
		||||
 | 
			
		||||
@ -5,8 +5,9 @@ using System.Security.Claims;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
using Jellyfin.Api.Constants;
 | 
			
		||||
using Jellyfin.Api.Extensions;
 | 
			
		||||
using Jellyfin.Data.Entities;
 | 
			
		||||
using Jellyfin.Data.Enums;
 | 
			
		||||
using Jellyfin.Database.Implementations.Entities;
 | 
			
		||||
using Jellyfin.Database.Implementations.Enums;
 | 
			
		||||
using Jellyfin.Extensions;
 | 
			
		||||
using MediaBrowser.Common.Extensions;
 | 
			
		||||
using MediaBrowser.Controller.Dto;
 | 
			
		||||
 | 
			
		||||
@ -3,6 +3,7 @@ using System.Collections.Generic;
 | 
			
		||||
using System.ComponentModel;
 | 
			
		||||
using System.Text.Json.Serialization;
 | 
			
		||||
using Jellyfin.Data.Enums;
 | 
			
		||||
using Jellyfin.Database.Implementations.Enums;
 | 
			
		||||
using Jellyfin.Extensions.Json.Converters;
 | 
			
		||||
using MediaBrowser.Model.Entities;
 | 
			
		||||
using MediaBrowser.Model.Querying;
 | 
			
		||||
 | 
			
		||||
@ -1,7 +1,8 @@
 | 
			
		||||
using System;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
using Jellyfin.Data.Enums;
 | 
			
		||||
using Jellyfin.Data;
 | 
			
		||||
using Jellyfin.Data.Events;
 | 
			
		||||
using Jellyfin.Database.Implementations.Enums;
 | 
			
		||||
using MediaBrowser.Controller.Authentication;
 | 
			
		||||
using MediaBrowser.Controller.Net;
 | 
			
		||||
using MediaBrowser.Model.Activity;
 | 
			
		||||
 | 
			
		||||
@ -1,6 +1,7 @@
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
using Jellyfin.Data.Enums;
 | 
			
		||||
using Jellyfin.Data;
 | 
			
		||||
using Jellyfin.Database.Implementations.Enums;
 | 
			
		||||
using MediaBrowser.Controller.Authentication;
 | 
			
		||||
using MediaBrowser.Controller.Library;
 | 
			
		||||
using MediaBrowser.Controller.Net;
 | 
			
		||||
 | 
			
		||||
@ -1,7 +1,7 @@
 | 
			
		||||
#pragma warning disable CS1591
 | 
			
		||||
 | 
			
		||||
using System;
 | 
			
		||||
using Jellyfin.Data.Enums;
 | 
			
		||||
using Jellyfin.Database.Implementations.Enums;
 | 
			
		||||
 | 
			
		||||
namespace Jellyfin.Data
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
@ -1,33 +0,0 @@
 | 
			
		||||
namespace Jellyfin.Data.Enums
 | 
			
		||||
{
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// An enum representing types of art.
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    public enum ArtKind
 | 
			
		||||
    {
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Another type of art, not covered by the other members.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        Other = 0,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// A poster.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        Poster = 1,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// A banner.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        Banner = 2,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// A thumbnail.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        Thumbnail = 3,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// A logo.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        Logo = 4
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -1,18 +0,0 @@
 | 
			
		||||
namespace Jellyfin.Data.Enums
 | 
			
		||||
{
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// An enum representing the version of Chromecast to be used by clients.
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    public enum ChromecastVersion
 | 
			
		||||
    {
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Stable Chromecast version.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        Stable = 0,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Unstable Chromecast version.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        Unstable = 1
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -1,58 +0,0 @@
 | 
			
		||||
namespace Jellyfin.Data.Enums
 | 
			
		||||
{
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// An enum that represents a day of the week, weekdays, weekends, or all days.
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    public enum DynamicDayOfWeek
 | 
			
		||||
    {
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Sunday.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        Sunday = 0,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Monday.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        Monday = 1,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Tuesday.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        Tuesday = 2,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Wednesday.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        Wednesday = 3,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Thursday.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        Thursday = 4,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Friday.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        Friday = 5,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Saturday.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        Saturday = 6,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// All days of the week.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        Everyday = 7,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// A week day, or Monday-Friday.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        Weekday = 8,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Saturday and Sunday.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        Weekend = 9
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -1,58 +0,0 @@
 | 
			
		||||
namespace Jellyfin.Data.Enums
 | 
			
		||||
{
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// An enum representing the different options for the home screen sections.
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    public enum HomeSectionType
 | 
			
		||||
    {
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// None.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        None = 0,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// My Media.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        SmallLibraryTiles = 1,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// My Media Small.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        LibraryButtons = 2,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Active Recordings.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        ActiveRecordings = 3,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Continue Watching.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        Resume = 4,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Continue Listening.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        ResumeAudio = 5,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Latest Media.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        LatestMedia = 6,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Next Up.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        NextUp = 7,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Live TV.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        LiveTv = 8,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Continue Reading.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        ResumeBook = 9
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -1,23 +0,0 @@
 | 
			
		||||
namespace Jellyfin.Data.Enums
 | 
			
		||||
{
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// An enum representing a type of indexing in a user's display preferences.
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    public enum IndexingKind
 | 
			
		||||
    {
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Index by the premiere date.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        PremiereDate = 0,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Index by the production year.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        ProductionYear = 1,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Index by the community rating.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        CommunityRating = 2
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -1,33 +0,0 @@
 | 
			
		||||
namespace Jellyfin.Data.Enums
 | 
			
		||||
{
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// An enum representing the type of media file.
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    public enum MediaFileKind
 | 
			
		||||
    {
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// The main file.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        Main = 0,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// A sidecar file.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        Sidecar = 1,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// An additional part to the main file.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        AdditionalPart = 2,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// An alternative format to the main file.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        AlternativeFormat = 3,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// An additional stream for the main file.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        AdditionalStream = 4
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -1,128 +0,0 @@
 | 
			
		||||
namespace Jellyfin.Data.Enums
 | 
			
		||||
{
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// The types of user permissions.
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    public enum PermissionKind
 | 
			
		||||
    {
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Whether the user is an administrator.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        IsAdministrator = 0,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Whether the user is hidden.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        IsHidden = 1,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Whether the user is disabled.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        IsDisabled = 2,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Whether the user can control shared devices.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        EnableSharedDeviceControl = 3,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Whether the user can access the server remotely.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        EnableRemoteAccess = 4,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Whether the user can manage live tv.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        EnableLiveTvManagement = 5,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Whether the user can access live tv.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        EnableLiveTvAccess = 6,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Whether the user can play media.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        EnableMediaPlayback = 7,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Whether the server should transcode audio for the user if requested.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        EnableAudioPlaybackTranscoding = 8,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Whether the server should transcode video for the user if requested.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        EnableVideoPlaybackTranscoding = 9,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Whether the user can delete content.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        EnableContentDeletion = 10,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Whether the user can download content.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        EnableContentDownloading = 11,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Whether to enable sync transcoding for the user.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        EnableSyncTranscoding = 12,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Whether the user can do media conversion.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        EnableMediaConversion = 13,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Whether the user has access to all devices.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        EnableAllDevices = 14,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Whether the user has access to all channels.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        EnableAllChannels = 15,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Whether the user has access to all folders.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        EnableAllFolders = 16,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Whether to enable public sharing for the user.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        EnablePublicSharing = 17,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Whether the user can remotely control other users.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        EnableRemoteControlOfOtherUsers = 18,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Whether the user is permitted to do playback remuxing.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        EnablePlaybackRemuxing = 19,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Whether the server should force transcoding on remote connections for the user.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        ForceRemoteSourceTranscoding = 20,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Whether the user can create, modify and delete collections.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        EnableCollectionManagement = 21,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Whether the user can edit subtitles.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        EnableSubtitleManagement = 22,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Whether the user can edit lyrics.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        EnableLyricManagement = 23,
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -1,68 +0,0 @@
 | 
			
		||||
namespace Jellyfin.Data.Enums
 | 
			
		||||
{
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// An enum representing a person's role in a specific media item.
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    public enum PersonRoleType
 | 
			
		||||
    {
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Another role, not covered by the other types.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        Other = 0,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// The director of the media.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        Director = 1,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// An artist.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        Artist = 2,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// The original artist.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        OriginalArtist = 3,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// An actor.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        Actor = 4,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// A voice actor.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        VoiceActor = 5,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// A producer.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        Producer = 6,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// A remixer.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        Remixer = 7,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// A conductor.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        Conductor = 8,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// A composer.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        Composer = 9,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// An author.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        Author = 10,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// An editor.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        Editor = 11
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -1,73 +0,0 @@
 | 
			
		||||
namespace Jellyfin.Data.Enums
 | 
			
		||||
{
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// The types of user preferences.
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    public enum PreferenceKind
 | 
			
		||||
    {
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// A list of blocked tags.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        BlockedTags = 0,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// A list of blocked channels.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        BlockedChannels = 1,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// A list of blocked media folders.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        BlockedMediaFolders = 2,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// A list of enabled devices.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        EnabledDevices = 3,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// A list of enabled channels.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        EnabledChannels = 4,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// A list of enabled folders.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        EnabledFolders = 5,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// A list of folders to allow content deletion from.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        EnableContentDeletionFromFolders = 6,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// A list of latest items to exclude.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        LatestItemExcludes = 7,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// A list of media to exclude.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        MyMediaExcludes = 8,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// A list of grouped folders.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        GroupedFolders = 9,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// A list of unrated items to block.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        BlockUnratedItems = 10,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// A list of ordered views.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        OrderedViews = 11,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// A list of allowed tags.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        AllowedTags = 12
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -1,18 +0,0 @@
 | 
			
		||||
namespace Jellyfin.Data.Enums
 | 
			
		||||
{
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// An enum representing the axis that should be scrolled.
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    public enum ScrollDirection
 | 
			
		||||
    {
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Horizontal scrolling direction.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        Horizontal = 0,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Vertical scrolling direction.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        Vertical = 1
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -1,18 +0,0 @@
 | 
			
		||||
namespace Jellyfin.Data.Enums
 | 
			
		||||
{
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// An enum representing the sorting order.
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    public enum SortOrder
 | 
			
		||||
    {
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Sort in increasing order.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        Ascending = 0,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Sort in decreasing order.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        Descending = 1
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -1,33 +0,0 @@
 | 
			
		||||
namespace Jellyfin.Data.Enums
 | 
			
		||||
{
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// An enum representing a subtitle playback mode.
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    public enum SubtitlePlaybackMode
 | 
			
		||||
    {
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// The default subtitle playback mode.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        Default = 0,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Always show subtitles.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        Always = 1,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Only show forced subtitles.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        OnlyForced = 2,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Don't show subtitles.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        None = 3,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Only show subtitles when the current audio stream is in a different language.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        Smart = 4
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -1,23 +0,0 @@
 | 
			
		||||
namespace Jellyfin.Data.Enums
 | 
			
		||||
{
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// Enum SyncPlayUserAccessType.
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    public enum SyncPlayUserAccessType
 | 
			
		||||
    {
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// User can create groups and join them.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        CreateAndJoinGroups = 0,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// User can only join already existing groups.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        JoinGroups = 1,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// SyncPlay is disabled for the user.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        None = 2
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -1,113 +0,0 @@
 | 
			
		||||
namespace Jellyfin.Data.Enums
 | 
			
		||||
{
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// An enum representing the type of view for a library or collection.
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    public enum ViewType
 | 
			
		||||
    {
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Shows albums.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        Albums = 0,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Shows album artists.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        AlbumArtists = 1,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Shows artists.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        Artists = 2,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Shows channels.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        Channels = 3,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Shows collections.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        Collections = 4,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Shows episodes.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        Episodes = 5,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Shows favorites.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        Favorites = 6,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Shows genres.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        Genres = 7,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Shows guide.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        Guide = 8,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Shows movies.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        Movies = 9,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Shows networks.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        Networks = 10,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Shows playlists.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        Playlists = 11,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Shows programs.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        Programs = 12,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Shows recordings.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        Recordings = 13,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Shows schedule.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        Schedule = 14,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Shows series.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        Series = 15,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Shows shows.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        Shows = 16,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Shows songs.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        Songs = 17,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Shows songs.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        Suggestions = 18,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Shows trailers.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        Trailers = 19,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Shows upcoming.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        Upcoming = 20
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -1,4 +1,4 @@
 | 
			
		||||
using Jellyfin.Data.Entities;
 | 
			
		||||
using Jellyfin.Database.Implementations.Entities;
 | 
			
		||||
 | 
			
		||||
namespace Jellyfin.Data.Events.Users
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
@ -1,4 +1,4 @@
 | 
			
		||||
using Jellyfin.Data.Entities;
 | 
			
		||||
using Jellyfin.Database.Implementations.Entities;
 | 
			
		||||
 | 
			
		||||
namespace Jellyfin.Data.Events.Users
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
@ -1,4 +1,4 @@
 | 
			
		||||
using Jellyfin.Data.Entities;
 | 
			
		||||
using Jellyfin.Database.Implementations.Entities;
 | 
			
		||||
 | 
			
		||||
namespace Jellyfin.Data.Events.Users
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
@ -1,4 +1,4 @@
 | 
			
		||||
using Jellyfin.Data.Entities;
 | 
			
		||||
using Jellyfin.Database.Implementations.Entities;
 | 
			
		||||
 | 
			
		||||
namespace Jellyfin.Data.Events.Users
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
@ -1,4 +1,4 @@
 | 
			
		||||
using Jellyfin.Data.Entities;
 | 
			
		||||
using Jellyfin.Database.Implementations.Entities;
 | 
			
		||||
 | 
			
		||||
namespace Jellyfin.Data.Events.Users
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
@ -1,18 +0,0 @@
 | 
			
		||||
namespace Jellyfin.Data.Interfaces
 | 
			
		||||
{
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// An interface abstracting an entity that has a concurrency token.
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    public interface IHasConcurrencyToken
 | 
			
		||||
    {
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Gets the version of this row. Acts as a concurrency token.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        uint RowVersion { get; }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Called when saving changes to this entity.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        void OnSavingChanges();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -1,31 +0,0 @@
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using Jellyfin.Data.Entities;
 | 
			
		||||
using Jellyfin.Data.Enums;
 | 
			
		||||
 | 
			
		||||
namespace Jellyfin.Data.Interfaces
 | 
			
		||||
{
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// An abstraction representing an entity that has permissions.
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    public interface IHasPermissions
 | 
			
		||||
    {
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Gets a collection containing this entity's permissions.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        ICollection<Permission> Permissions { get; }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Checks whether this entity has the specified permission kind.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        /// <param name="kind">The kind of permission.</param>
 | 
			
		||||
        /// <returns><c>true</c> if this entity has the specified permission, <c>false</c> otherwise.</returns>
 | 
			
		||||
        bool HasPermission(PermissionKind kind);
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Sets the specified permission to the provided value.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        /// <param name="kind">The kind of permission.</param>
 | 
			
		||||
        /// <param name="value">The value to set.</param>
 | 
			
		||||
        void SetPermission(PermissionKind kind, bool value);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -1,16 +0,0 @@
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using Jellyfin.Data.Entities.Libraries;
 | 
			
		||||
 | 
			
		||||
namespace Jellyfin.Data.Interfaces
 | 
			
		||||
{
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// An abstraction representing an entity that has releases.
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    public interface IHasReleases
 | 
			
		||||
    {
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Gets a collection containing this entity's releases.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        ICollection<Release> Releases { get; }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -38,6 +38,10 @@
 | 
			
		||||
    <PackageReference Include="SmartAnalyzers.MultithreadingAnalyzer" PrivateAssets="All" />
 | 
			
		||||
  </ItemGroup>
 | 
			
		||||
 | 
			
		||||
  <ItemGroup>
 | 
			
		||||
    <ProjectReference Include="..\src\Jellyfin.Database\Jellyfin.Database.Implementations\Jellyfin.Database.Implementations.csproj" />
 | 
			
		||||
  </ItemGroup>
 | 
			
		||||
 | 
			
		||||
  <ItemGroup>
 | 
			
		||||
    <PackageReference Include="Microsoft.Extensions.Logging" />
 | 
			
		||||
  </ItemGroup>
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										220
									
								
								Jellyfin.Data/UserEntityExtensions.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										220
									
								
								Jellyfin.Data/UserEntityExtensions.cs
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,220 @@
 | 
			
		||||
using System;
 | 
			
		||||
using System.ComponentModel;
 | 
			
		||||
using System.Linq;
 | 
			
		||||
using Jellyfin.Database.Implementations.Entities;
 | 
			
		||||
using Jellyfin.Database.Implementations.Enums;
 | 
			
		||||
using Jellyfin.Database.Implementations.Interfaces;
 | 
			
		||||
 | 
			
		||||
namespace Jellyfin.Data;
 | 
			
		||||
 | 
			
		||||
/// <summary>
 | 
			
		||||
/// Contains extension methods for manipulation of <see cref="User"/> entities.
 | 
			
		||||
/// </summary>
 | 
			
		||||
public static class UserEntityExtensions
 | 
			
		||||
{
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// The values being delimited here are Guids, so commas work as they do not appear in Guids.
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    private const char Delimiter = ',';
 | 
			
		||||
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// Checks whether the user has the specified permission.
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    /// <param name="entity">The entity to update.</param>
 | 
			
		||||
    /// <param name="kind">The permission kind.</param>
 | 
			
		||||
    /// <returns><c>True</c> if the user has the specified permission.</returns>
 | 
			
		||||
    public static bool HasPermission(this IHasPermissions entity, PermissionKind kind)
 | 
			
		||||
    {
 | 
			
		||||
        return entity.Permissions.FirstOrDefault(p => p.Kind == kind)?.Value ?? false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// Sets the given permission kind to the provided value.
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    /// <param name="entity">The entity to update.</param>
 | 
			
		||||
    /// <param name="kind">The permission kind.</param>
 | 
			
		||||
    /// <param name="value">The value to set.</param>
 | 
			
		||||
    public static void SetPermission(this IHasPermissions entity, PermissionKind kind, bool value)
 | 
			
		||||
    {
 | 
			
		||||
        var currentPermission = entity.Permissions.FirstOrDefault(p => p.Kind == kind);
 | 
			
		||||
        if (currentPermission is null)
 | 
			
		||||
        {
 | 
			
		||||
            entity.Permissions.Add(new Permission(kind, value));
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            currentPermission.Value = value;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// Gets the user's preferences for the given preference kind.
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    /// <param name="entity">The entity to update.</param>
 | 
			
		||||
    /// <param name="preference">The preference kind.</param>
 | 
			
		||||
    /// <returns>A string array containing the user's preferences.</returns>
 | 
			
		||||
    public static string[] GetPreference(this User entity, PreferenceKind preference)
 | 
			
		||||
    {
 | 
			
		||||
        var val = entity.Preferences.FirstOrDefault(p => p.Kind == preference)?.Value;
 | 
			
		||||
 | 
			
		||||
        return string.IsNullOrEmpty(val) ? Array.Empty<string>() : val.Split(Delimiter);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// Gets the user's preferences for the given preference kind.
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    /// <param name="entity">The entity to update.</param>
 | 
			
		||||
    /// <param name="preference">The preference kind.</param>
 | 
			
		||||
    /// <typeparam name="T">Type of preference.</typeparam>
 | 
			
		||||
    /// <returns>A {T} array containing the user's preference.</returns>
 | 
			
		||||
    public static T[] GetPreferenceValues<T>(this User entity, PreferenceKind preference)
 | 
			
		||||
    {
 | 
			
		||||
        var val = entity.Preferences.FirstOrDefault(p => p.Kind == preference)?.Value;
 | 
			
		||||
        if (string.IsNullOrEmpty(val))
 | 
			
		||||
        {
 | 
			
		||||
            return Array.Empty<T>();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Convert array of {string} to array of {T}
 | 
			
		||||
        var converter = TypeDescriptor.GetConverter(typeof(T));
 | 
			
		||||
        var stringValues = val.Split(Delimiter);
 | 
			
		||||
        var convertedCount = 0;
 | 
			
		||||
        var parsedValues = new T[stringValues.Length];
 | 
			
		||||
        for (var i = 0; i < stringValues.Length; i++)
 | 
			
		||||
        {
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                var parsedValue = converter.ConvertFromString(stringValues[i].Trim());
 | 
			
		||||
                if (parsedValue is not null)
 | 
			
		||||
                {
 | 
			
		||||
                    parsedValues[convertedCount++] = (T)parsedValue;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            catch (FormatException)
 | 
			
		||||
            {
 | 
			
		||||
                // Unable to convert value
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return parsedValues[..convertedCount];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// Sets the specified preference to the given value.
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    /// <param name="entity">The entity to update.</param>
 | 
			
		||||
    /// <param name="preference">The preference kind.</param>
 | 
			
		||||
    /// <param name="values">The values.</param>
 | 
			
		||||
    public static void SetPreference(this User entity, PreferenceKind preference, string[] values)
 | 
			
		||||
    {
 | 
			
		||||
        var value = string.Join(Delimiter, values);
 | 
			
		||||
        var currentPreference = entity.Preferences.FirstOrDefault(p => p.Kind == preference);
 | 
			
		||||
        if (currentPreference is null)
 | 
			
		||||
        {
 | 
			
		||||
            entity.Preferences.Add(new Preference(preference, value));
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            currentPreference.Value = value;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// Sets the specified preference to the given value.
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    /// <param name="entity">The entity to update.</param>
 | 
			
		||||
    /// <param name="preference">The preference kind.</param>
 | 
			
		||||
    /// <param name="values">The values.</param>
 | 
			
		||||
    /// <typeparam name="T">The type of value.</typeparam>
 | 
			
		||||
    public static void SetPreference<T>(this User entity, PreferenceKind preference, T[] values)
 | 
			
		||||
    {
 | 
			
		||||
        var value = string.Join(Delimiter, values);
 | 
			
		||||
        var currentPreference = entity.Preferences.FirstOrDefault(p => p.Kind == preference);
 | 
			
		||||
        if (currentPreference is null)
 | 
			
		||||
        {
 | 
			
		||||
            entity.Preferences.Add(new Preference(preference, value));
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            currentPreference.Value = value;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// Checks whether this user is currently allowed to use the server.
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    /// <param name="entity">The entity to update.</param>
 | 
			
		||||
    /// <returns><c>True</c> if the current time is within an access schedule, or there are no access schedules.</returns>
 | 
			
		||||
    public static bool IsParentalScheduleAllowed(this User entity)
 | 
			
		||||
    {
 | 
			
		||||
        return entity.AccessSchedules.Count == 0
 | 
			
		||||
               || entity.AccessSchedules.Any(i => IsParentalScheduleAllowed(i, DateTime.UtcNow));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// Checks whether the provided folder is in this user's grouped folders.
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    /// <param name="entity">The entity to update.</param>
 | 
			
		||||
    /// <param name="id">The Guid of the folder.</param>
 | 
			
		||||
    /// <returns><c>True</c> if the folder is in the user's grouped folders.</returns>
 | 
			
		||||
    public static bool IsFolderGrouped(this User entity, Guid id)
 | 
			
		||||
    {
 | 
			
		||||
        return Array.IndexOf(GetPreferenceValues<Guid>(entity, PreferenceKind.GroupedFolders), id) != -1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// Initializes the default permissions for a user. Should only be called on user creation.
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    /// <param name="entity">The entity to update.</param>
 | 
			
		||||
    // TODO: make these user configurable?
 | 
			
		||||
    public static void AddDefaultPermissions(this User entity)
 | 
			
		||||
    {
 | 
			
		||||
        entity.Permissions.Add(new Permission(PermissionKind.IsAdministrator, false));
 | 
			
		||||
        entity.Permissions.Add(new Permission(PermissionKind.IsDisabled, false));
 | 
			
		||||
        entity.Permissions.Add(new Permission(PermissionKind.IsHidden, true));
 | 
			
		||||
        entity.Permissions.Add(new Permission(PermissionKind.EnableAllChannels, true));
 | 
			
		||||
        entity.Permissions.Add(new Permission(PermissionKind.EnableAllDevices, true));
 | 
			
		||||
        entity.Permissions.Add(new Permission(PermissionKind.EnableAllFolders, true));
 | 
			
		||||
        entity.Permissions.Add(new Permission(PermissionKind.EnableContentDeletion, false));
 | 
			
		||||
        entity.Permissions.Add(new Permission(PermissionKind.EnableContentDownloading, true));
 | 
			
		||||
        entity.Permissions.Add(new Permission(PermissionKind.EnableMediaConversion, true));
 | 
			
		||||
        entity.Permissions.Add(new Permission(PermissionKind.EnableMediaPlayback, true));
 | 
			
		||||
        entity.Permissions.Add(new Permission(PermissionKind.EnablePlaybackRemuxing, true));
 | 
			
		||||
        entity.Permissions.Add(new Permission(PermissionKind.EnablePublicSharing, true));
 | 
			
		||||
        entity.Permissions.Add(new Permission(PermissionKind.EnableRemoteAccess, true));
 | 
			
		||||
        entity.Permissions.Add(new Permission(PermissionKind.EnableSyncTranscoding, true));
 | 
			
		||||
        entity.Permissions.Add(new Permission(PermissionKind.EnableAudioPlaybackTranscoding, true));
 | 
			
		||||
        entity.Permissions.Add(new Permission(PermissionKind.EnableLiveTvAccess, true));
 | 
			
		||||
        entity.Permissions.Add(new Permission(PermissionKind.EnableLiveTvManagement, true));
 | 
			
		||||
        entity.Permissions.Add(new Permission(PermissionKind.EnableSharedDeviceControl, true));
 | 
			
		||||
        entity.Permissions.Add(new Permission(PermissionKind.EnableVideoPlaybackTranscoding, true));
 | 
			
		||||
        entity.Permissions.Add(new Permission(PermissionKind.ForceRemoteSourceTranscoding, false));
 | 
			
		||||
        entity.Permissions.Add(new Permission(PermissionKind.EnableRemoteControlOfOtherUsers, false));
 | 
			
		||||
        entity.Permissions.Add(new Permission(PermissionKind.EnableCollectionManagement, false));
 | 
			
		||||
        entity.Permissions.Add(new Permission(PermissionKind.EnableSubtitleManagement, false));
 | 
			
		||||
        entity.Permissions.Add(new Permission(PermissionKind.EnableLyricManagement, false));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// Initializes the default preferences. Should only be called on user creation.
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    /// <param name="entity">The entity to update.</param>
 | 
			
		||||
    public static void AddDefaultPreferences(this User entity)
 | 
			
		||||
    {
 | 
			
		||||
        foreach (var val in Enum.GetValues<PreferenceKind>())
 | 
			
		||||
        {
 | 
			
		||||
            entity.Preferences.Add(new Preference(val, string.Empty));
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private static bool IsParentalScheduleAllowed(AccessSchedule schedule, DateTime date)
 | 
			
		||||
    {
 | 
			
		||||
        var localTime = date.ToLocalTime();
 | 
			
		||||
        var hour = localTime.TimeOfDay.TotalHours;
 | 
			
		||||
        var currentDayOfWeek = localTime.DayOfWeek;
 | 
			
		||||
 | 
			
		||||
        return schedule.DayOfWeek.Contains(currentDayOfWeek)
 | 
			
		||||
               && hour >= schedule.StartHour
 | 
			
		||||
               && hour <= schedule.EndHour;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -1,9 +1,10 @@
 | 
			
		||||
using System;
 | 
			
		||||
using System.Linq;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
using Jellyfin.Data.Entities;
 | 
			
		||||
using Jellyfin.Data.Events;
 | 
			
		||||
using Jellyfin.Data.Queries;
 | 
			
		||||
using Jellyfin.Database.Implementations;
 | 
			
		||||
using Jellyfin.Database.Implementations.Entities;
 | 
			
		||||
using MediaBrowser.Model.Activity;
 | 
			
		||||
using MediaBrowser.Model.Querying;
 | 
			
		||||
using Microsoft.EntityFrameworkCore;
 | 
			
		||||
 | 
			
		||||
@ -0,0 +1,17 @@
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using MediaBrowser.Common.Configuration;
 | 
			
		||||
 | 
			
		||||
namespace Jellyfin.Server.Implementations.DatabaseConfiguration;
 | 
			
		||||
 | 
			
		||||
/// <summary>
 | 
			
		||||
/// Factory for constructing a database configuration.
 | 
			
		||||
/// </summary>
 | 
			
		||||
public class DatabaseConfigurationFactory : IConfigurationFactory
 | 
			
		||||
{
 | 
			
		||||
    /// <inheritdoc/>
 | 
			
		||||
    public IEnumerable<ConfigurationStore> GetConfigurations()
 | 
			
		||||
    {
 | 
			
		||||
        yield return new DatabaseConfigurationStore();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -0,0 +1,26 @@
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using Jellyfin.Database.Implementations.DbConfiguration;
 | 
			
		||||
using MediaBrowser.Common.Configuration;
 | 
			
		||||
 | 
			
		||||
namespace Jellyfin.Server.Implementations.DatabaseConfiguration;
 | 
			
		||||
 | 
			
		||||
/// <summary>
 | 
			
		||||
/// A configuration that stores database related settings.
 | 
			
		||||
/// </summary>
 | 
			
		||||
public class DatabaseConfigurationStore : ConfigurationStore
 | 
			
		||||
{
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// The name of the configuration in the storage.
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    public const string StoreKey = "database";
 | 
			
		||||
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// Initializes a new instance of the <see cref="DatabaseConfigurationStore"/> class.
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    public DatabaseConfigurationStore()
 | 
			
		||||
    {
 | 
			
		||||
        ConfigurationType = typeof(DatabaseConfigurationOptions);
 | 
			
		||||
        Key = StoreKey;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -3,12 +3,14 @@ using System.Collections.Concurrent;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Linq;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
using Jellyfin.Data;
 | 
			
		||||
using Jellyfin.Data.Dtos;
 | 
			
		||||
using Jellyfin.Data.Entities;
 | 
			
		||||
using Jellyfin.Data.Entities.Security;
 | 
			
		||||
using Jellyfin.Data.Enums;
 | 
			
		||||
using Jellyfin.Data.Events;
 | 
			
		||||
using Jellyfin.Data.Queries;
 | 
			
		||||
using Jellyfin.Database.Implementations;
 | 
			
		||||
using Jellyfin.Database.Implementations.Entities;
 | 
			
		||||
using Jellyfin.Database.Implementations.Entities.Security;
 | 
			
		||||
using Jellyfin.Database.Implementations.Enums;
 | 
			
		||||
using Jellyfin.Extensions;
 | 
			
		||||
using MediaBrowser.Common.Extensions;
 | 
			
		||||
using MediaBrowser.Controller.Devices;
 | 
			
		||||
 | 
			
		||||
@ -1,7 +1,7 @@
 | 
			
		||||
using System;
 | 
			
		||||
using System.Globalization;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
using Jellyfin.Data.Entities;
 | 
			
		||||
using Jellyfin.Database.Implementations.Entities;
 | 
			
		||||
using MediaBrowser.Controller.Entities;
 | 
			
		||||
using MediaBrowser.Controller.Entities.Audio;
 | 
			
		||||
using MediaBrowser.Controller.Events;
 | 
			
		||||
 | 
			
		||||
@ -1,7 +1,7 @@
 | 
			
		||||
using System;
 | 
			
		||||
using System.Globalization;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
using Jellyfin.Data.Entities;
 | 
			
		||||
using Jellyfin.Database.Implementations.Entities;
 | 
			
		||||
using MediaBrowser.Controller.Entities;
 | 
			
		||||
using MediaBrowser.Controller.Entities.Audio;
 | 
			
		||||
using MediaBrowser.Controller.Events;
 | 
			
		||||
 | 
			
		||||
@ -1,7 +1,7 @@
 | 
			
		||||
using System;
 | 
			
		||||
using System.Globalization;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
using Jellyfin.Data.Entities;
 | 
			
		||||
using Jellyfin.Database.Implementations.Entities;
 | 
			
		||||
using MediaBrowser.Controller.Events;
 | 
			
		||||
using MediaBrowser.Controller.Events.Authentication;
 | 
			
		||||
using MediaBrowser.Model.Activity;
 | 
			
		||||
 | 
			
		||||
@ -1,6 +1,6 @@
 | 
			
		||||
using System.Globalization;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
using Jellyfin.Data.Entities;
 | 
			
		||||
using Jellyfin.Database.Implementations.Entities;
 | 
			
		||||
using MediaBrowser.Controller.Events;
 | 
			
		||||
using MediaBrowser.Controller.Events.Authentication;
 | 
			
		||||
using MediaBrowser.Model.Activity;
 | 
			
		||||
 | 
			
		||||
@ -1,8 +1,8 @@
 | 
			
		||||
using System;
 | 
			
		||||
using System.Globalization;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
using Jellyfin.Data.Entities;
 | 
			
		||||
using Jellyfin.Data.Enums;
 | 
			
		||||
using Jellyfin.Database.Implementations.Entities;
 | 
			
		||||
using MediaBrowser.Controller.Events;
 | 
			
		||||
using MediaBrowser.Controller.Library;
 | 
			
		||||
using MediaBrowser.Model.Activity;
 | 
			
		||||
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show More
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user