diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json
index 228d4a17c8..c2127ba5c3 100644
--- a/.devcontainer/devcontainer.json
+++ b/.devcontainer/devcontainer.json
@@ -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"
diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644
index 0000000000..6733d59aca
--- /dev/null
+++ b/.vscode/settings.json
@@ -0,0 +1,3 @@
+{
+ "dotnet.preferVisualStudioCodeFileSystemWatcher": true
+}
diff --git a/Emby.Server.Implementations/ApplicationHost.cs b/Emby.Server.Implementations/ApplicationHost.cs
index 4fe1d2b17e..4d959905d9 100644
--- a/Emby.Server.Implementations/ApplicationHost.cs
+++ b/Emby.Server.Implementations/ApplicationHost.cs
@@ -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
///
/// Create services registered with the service container that need to be initialized at application startup.
///
+ /// The configuration used to initialise the application.
/// A task representing the service initialization operation.
- public async Task InitializeServices()
+ public async Task InitializeServices(IConfiguration startupConfig)
{
- var jellyfinDb = await Resolve>().CreateDbContextAsync().ConfigureAwait(false);
+ var factory = Resolve>();
+ var provider = Resolve();
+ provider.DbContextFactory = factory;
+
+ var jellyfinDb = await factory.CreateDbContextAsync().ConfigureAwait(false);
await using (jellyfinDb.ConfigureAwait(false))
{
if ((await jellyfinDb.Database.GetPendingMigrationsAsync().ConfigureAwait(false)).Any())
diff --git a/Emby.Server.Implementations/Collections/CollectionManager.cs b/Emby.Server.Implementations/Collections/CollectionManager.cs
index 4a0662e16a..60f515f24d 100644
--- a/Emby.Server.Implementations/Collections/CollectionManager.cs
+++ b/Emby.Server.Implementations/Collections/CollectionManager.cs
@@ -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;
diff --git a/Emby.Server.Implementations/Data/CleanDatabaseScheduledTask.cs b/Emby.Server.Implementations/Data/CleanDatabaseScheduledTask.cs
index a83ded439c..63481b1f8c 100644
--- a/Emby.Server.Implementations/Data/CleanDatabaseScheduledTask.cs
+++ b/Emby.Server.Implementations/Data/CleanDatabaseScheduledTask.cs
@@ -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;
diff --git a/Emby.Server.Implementations/Dto/DtoService.cs b/Emby.Server.Implementations/Dto/DtoService.cs
index 356d1e437a..0ce967e6a9 100644
--- a/Emby.Server.Implementations/Dto/DtoService.cs
+++ b/Emby.Server.Implementations/Dto/DtoService.cs
@@ -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;
diff --git a/Emby.Server.Implementations/Emby.Server.Implementations.csproj b/Emby.Server.Implementations/Emby.Server.Implementations.csproj
index 70dd5eb9ae..8f89f35ac9 100644
--- a/Emby.Server.Implementations/Emby.Server.Implementations.csproj
+++ b/Emby.Server.Implementations/Emby.Server.Implementations.csproj
@@ -18,6 +18,7 @@
+
diff --git a/Emby.Server.Implementations/EntryPoints/LibraryChangedNotifier.cs b/Emby.Server.Implementations/EntryPoints/LibraryChangedNotifier.cs
index fb0a55135f..933cfc8cbe 100644
--- a/Emby.Server.Implementations/EntryPoints/LibraryChangedNotifier.cs
+++ b/Emby.Server.Implementations/EntryPoints/LibraryChangedNotifier.cs
@@ -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;
diff --git a/Emby.Server.Implementations/HttpServer/Security/AuthService.cs b/Emby.Server.Implementations/HttpServer/Security/AuthService.cs
index 1d04f3da37..8a79cdebc1 100644
--- a/Emby.Server.Implementations/HttpServer/Security/AuthService.cs
+++ b/Emby.Server.Implementations/HttpServer/Security/AuthService.cs
@@ -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;
diff --git a/Emby.Server.Implementations/Images/BaseFolderImageProvider.cs b/Emby.Server.Implementations/Images/BaseFolderImageProvider.cs
index f9c10ba098..0d63b3af7d 100644
--- a/Emby.Server.Implementations/Images/BaseFolderImageProvider.cs
+++ b/Emby.Server.Implementations/Images/BaseFolderImageProvider.cs
@@ -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;
diff --git a/Emby.Server.Implementations/Images/CollectionFolderImageProvider.cs b/Emby.Server.Implementations/Images/CollectionFolderImageProvider.cs
index 34c722e41d..273d356a39 100644
--- a/Emby.Server.Implementations/Images/CollectionFolderImageProvider.cs
+++ b/Emby.Server.Implementations/Images/CollectionFolderImageProvider.cs
@@ -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;
diff --git a/Emby.Server.Implementations/Images/GenreImageProvider.cs b/Emby.Server.Implementations/Images/GenreImageProvider.cs
index c9b41f8193..706de60a90 100644
--- a/Emby.Server.Implementations/Images/GenreImageProvider.cs
+++ b/Emby.Server.Implementations/Images/GenreImageProvider.cs
@@ -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;
diff --git a/Emby.Server.Implementations/Images/MusicGenreImageProvider.cs b/Emby.Server.Implementations/Images/MusicGenreImageProvider.cs
index 31f053f065..c472623e67 100644
--- a/Emby.Server.Implementations/Images/MusicGenreImageProvider.cs
+++ b/Emby.Server.Implementations/Images/MusicGenreImageProvider.cs
@@ -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;
diff --git a/Emby.Server.Implementations/Library/LibraryManager.cs b/Emby.Server.Implementations/Library/LibraryManager.cs
index b810ad4de1..27f6826685 100644
--- a/Emby.Server.Implementations/Library/LibraryManager.cs
+++ b/Emby.Server.Implementations/Library/LibraryManager.cs
@@ -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;
diff --git a/Emby.Server.Implementations/Library/MediaSourceManager.cs b/Emby.Server.Implementations/Library/MediaSourceManager.cs
index 92a5e9ffd9..afe5b14e92 100644
--- a/Emby.Server.Implementations/Library/MediaSourceManager.cs
+++ b/Emby.Server.Implementations/Library/MediaSourceManager.cs
@@ -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;
diff --git a/Emby.Server.Implementations/Library/MediaStreamSelector.cs b/Emby.Server.Implementations/Library/MediaStreamSelector.cs
index 6791e3ca90..631179ffcf 100644
--- a/Emby.Server.Implementations/Library/MediaStreamSelector.cs
+++ b/Emby.Server.Implementations/Library/MediaStreamSelector.cs
@@ -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;
diff --git a/Emby.Server.Implementations/Library/MusicManager.cs b/Emby.Server.Implementations/Library/MusicManager.cs
index 71c69ec50a..28cf695007 100644
--- a/Emby.Server.Implementations/Library/MusicManager.cs
+++ b/Emby.Server.Implementations/Library/MusicManager.cs
@@ -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;
diff --git a/Emby.Server.Implementations/Library/SearchEngine.cs b/Emby.Server.Implementations/Library/SearchEngine.cs
index 3ac1d02192..9d81b835ce 100644
--- a/Emby.Server.Implementations/Library/SearchEngine.cs
+++ b/Emby.Server.Implementations/Library/SearchEngine.cs
@@ -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;
diff --git a/Emby.Server.Implementations/Library/SplashscreenPostScanTask.cs b/Emby.Server.Implementations/Library/SplashscreenPostScanTask.cs
index 76e564d535..0c9edd8398 100644
--- a/Emby.Server.Implementations/Library/SplashscreenPostScanTask.cs
+++ b/Emby.Server.Implementations/Library/SplashscreenPostScanTask.cs
@@ -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;
diff --git a/Emby.Server.Implementations/Library/UserDataManager.cs b/Emby.Server.Implementations/Library/UserDataManager.cs
index a41ef888b0..8b88b904bb 100644
--- a/Emby.Server.Implementations/Library/UserDataManager.cs
+++ b/Emby.Server.Implementations/Library/UserDataManager.cs
@@ -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;
diff --git a/Emby.Server.Implementations/Library/UserViewManager.cs b/Emby.Server.Implementations/Library/UserViewManager.cs
index d42a0e7d28..5a9315a92a 100644
--- a/Emby.Server.Implementations/Library/UserViewManager.cs
+++ b/Emby.Server.Implementations/Library/UserViewManager.cs
@@ -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;
diff --git a/Emby.Server.Implementations/Library/Validators/CollectionPostScanTask.cs b/Emby.Server.Implementations/Library/Validators/CollectionPostScanTask.cs
index 89f64ee4f0..337b1afdd4 100644
--- a/Emby.Server.Implementations/Library/Validators/CollectionPostScanTask.cs
+++ b/Emby.Server.Implementations/Library/Validators/CollectionPostScanTask.cs
@@ -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;
diff --git a/Emby.Server.Implementations/Playlists/PlaylistManager.cs b/Emby.Server.Implementations/Playlists/PlaylistManager.cs
index 9e780a49e5..7b0a164414 100644
--- a/Emby.Server.Implementations/Playlists/PlaylistManager.cs
+++ b/Emby.Server.Implementations/Playlists/PlaylistManager.cs
@@ -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;
diff --git a/Emby.Server.Implementations/Playlists/PlaylistsFolder.cs b/Emby.Server.Implementations/Playlists/PlaylistsFolder.cs
index db3aeaaf31..a5be2b616e 100644
--- a/Emby.Server.Implementations/Playlists/PlaylistsFolder.cs
+++ b/Emby.Server.Implementations/Playlists/PlaylistsFolder.cs
@@ -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;
diff --git a/Emby.Server.Implementations/ScheduledTasks/Tasks/OptimizeDatabaseTask.cs b/Emby.Server.Implementations/ScheduledTasks/Tasks/OptimizeDatabaseTask.cs
index 7d4e2377dc..4d3a04377f 100644
--- a/Emby.Server.Implementations/ScheduledTasks/Tasks/OptimizeDatabaseTask.cs
+++ b/Emby.Server.Implementations/ScheduledTasks/Tasks/OptimizeDatabaseTask.cs
@@ -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 _logger;
private readonly ILocalizationManager _localization;
private readonly IDbContextFactory _provider;
+ private readonly IJellyfinDatabaseProvider _jellyfinDatabaseProvider;
///
/// Initializes a new instance of the class.
@@ -25,14 +26,17 @@ namespace Emby.Server.Implementations.ScheduledTasks.Tasks
/// Instance of the interface.
/// Instance of the interface.
/// Instance of the interface.
+ /// Instance of the JellyfinDatabaseProvider that can be used for provider specific operations.
public OptimizeDatabaseTask(
ILogger logger,
ILocalizationManager localization,
- IDbContextFactory provider)
+ IDbContextFactory provider,
+ IJellyfinDatabaseProvider jellyfinDatabaseProvider)
{
_logger = logger;
_localization = localization;
_provider = provider;
+ _jellyfinDatabaseProvider = jellyfinDatabaseProvider;
}
///
@@ -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)
{
diff --git a/Emby.Server.Implementations/Session/SessionManager.cs b/Emby.Server.Implementations/Session/SessionManager.cs
index df2acfc46c..42f7deca15 100644
--- a/Emby.Server.Implementations/Session/SessionManager.cs
+++ b/Emby.Server.Implementations/Session/SessionManager.cs
@@ -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;
diff --git a/Emby.Server.Implementations/Sorting/DateLastMediaAddedComparer.cs b/Emby.Server.Implementations/Sorting/DateLastMediaAddedComparer.cs
index e1c26d0121..9afc511086 100644
--- a/Emby.Server.Implementations/Sorting/DateLastMediaAddedComparer.cs
+++ b/Emby.Server.Implementations/Sorting/DateLastMediaAddedComparer.cs
@@ -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;
diff --git a/Emby.Server.Implementations/Sorting/DatePlayedComparer.cs b/Emby.Server.Implementations/Sorting/DatePlayedComparer.cs
index d668c17bfc..4c013a8bd7 100644
--- a/Emby.Server.Implementations/Sorting/DatePlayedComparer.cs
+++ b/Emby.Server.Implementations/Sorting/DatePlayedComparer.cs
@@ -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;
diff --git a/Emby.Server.Implementations/Sorting/IsFavoriteOrLikeComparer.cs b/Emby.Server.Implementations/Sorting/IsFavoriteOrLikeComparer.cs
index 622a341b6a..cf77861673 100644
--- a/Emby.Server.Implementations/Sorting/IsFavoriteOrLikeComparer.cs
+++ b/Emby.Server.Implementations/Sorting/IsFavoriteOrLikeComparer.cs
@@ -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;
diff --git a/Emby.Server.Implementations/Sorting/IsPlayedComparer.cs b/Emby.Server.Implementations/Sorting/IsPlayedComparer.cs
index 2a3e456c2d..e42c8a33a3 100644
--- a/Emby.Server.Implementations/Sorting/IsPlayedComparer.cs
+++ b/Emby.Server.Implementations/Sorting/IsPlayedComparer.cs
@@ -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;
diff --git a/Emby.Server.Implementations/Sorting/IsUnplayedComparer.cs b/Emby.Server.Implementations/Sorting/IsUnplayedComparer.cs
index afd8ccf9f3..f54188030b 100644
--- a/Emby.Server.Implementations/Sorting/IsUnplayedComparer.cs
+++ b/Emby.Server.Implementations/Sorting/IsUnplayedComparer.cs
@@ -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;
diff --git a/Emby.Server.Implementations/Sorting/PlayCountComparer.cs b/Emby.Server.Implementations/Sorting/PlayCountComparer.cs
index 12f88bf4da..dd2149b578 100644
--- a/Emby.Server.Implementations/Sorting/PlayCountComparer.cs
+++ b/Emby.Server.Implementations/Sorting/PlayCountComparer.cs
@@ -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;
diff --git a/Emby.Server.Implementations/SyncPlay/Group.cs b/Emby.Server.Implementations/SyncPlay/Group.cs
index a7821c0e0e..d47e477938 100644
--- a/Emby.Server.Implementations/SyncPlay/Group.cs
+++ b/Emby.Server.Implementations/SyncPlay/Group.cs
@@ -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;
diff --git a/Emby.Server.Implementations/TV/TVSeriesManager.cs b/Emby.Server.Implementations/TV/TVSeriesManager.cs
index 10d27498bf..ee2e18f735 100644
--- a/Emby.Server.Implementations/TV/TVSeriesManager.cs
+++ b/Emby.Server.Implementations/TV/TVSeriesManager.cs
@@ -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;
diff --git a/Jellyfin.Api/Auth/CustomAuthenticationHandler.cs b/Jellyfin.Api/Auth/CustomAuthenticationHandler.cs
index 1286c92c7a..f6f2f59c52 100644
--- a/Jellyfin.Api/Auth/CustomAuthenticationHandler.cs
+++ b/Jellyfin.Api/Auth/CustomAuthenticationHandler.cs
@@ -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;
diff --git a/Jellyfin.Api/Auth/DefaultAuthorizationPolicy/DefaultAuthorizationHandler.cs b/Jellyfin.Api/Auth/DefaultAuthorizationPolicy/DefaultAuthorizationHandler.cs
index 4928d5ed24..6b80d537fb 100644
--- a/Jellyfin.Api/Auth/DefaultAuthorizationPolicy/DefaultAuthorizationHandler.cs
+++ b/Jellyfin.Api/Auth/DefaultAuthorizationPolicy/DefaultAuthorizationHandler.cs
@@ -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;
diff --git a/Jellyfin.Api/Auth/SyncPlayAccessPolicy/SyncPlayAccessHandler.cs b/Jellyfin.Api/Auth/SyncPlayAccessPolicy/SyncPlayAccessHandler.cs
index 5fcf72fb46..7efb5b1698 100644
--- a/Jellyfin.Api/Auth/SyncPlayAccessPolicy/SyncPlayAccessHandler.cs
+++ b/Jellyfin.Api/Auth/SyncPlayAccessPolicy/SyncPlayAccessHandler.cs
@@ -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;
diff --git a/Jellyfin.Api/Auth/UserPermissionPolicy/UserPermissionHandler.cs b/Jellyfin.Api/Auth/UserPermissionPolicy/UserPermissionHandler.cs
index f20779f6cd..d139eab16f 100644
--- a/Jellyfin.Api/Auth/UserPermissionPolicy/UserPermissionHandler.cs
+++ b/Jellyfin.Api/Auth/UserPermissionPolicy/UserPermissionHandler.cs
@@ -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;
diff --git a/Jellyfin.Api/Auth/UserPermissionPolicy/UserPermissionRequirement.cs b/Jellyfin.Api/Auth/UserPermissionPolicy/UserPermissionRequirement.cs
index a7c3cce971..152c400cde 100644
--- a/Jellyfin.Api/Auth/UserPermissionPolicy/UserPermissionRequirement.cs
+++ b/Jellyfin.Api/Auth/UserPermissionPolicy/UserPermissionRequirement.cs
@@ -1,5 +1,5 @@
using Jellyfin.Api.Auth.DefaultAuthorizationPolicy;
-using Jellyfin.Data.Enums;
+using Jellyfin.Database.Implementations.Enums;
namespace Jellyfin.Api.Auth.UserPermissionPolicy
{
diff --git a/Jellyfin.Api/Controllers/ArtistsController.cs b/Jellyfin.Api/Controllers/ArtistsController.cs
index 10556da65d..7ba75dc243 100644
--- a/Jellyfin.Api/Controllers/ArtistsController.cs
+++ b/Jellyfin.Api/Controllers/ArtistsController.cs
@@ -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;
diff --git a/Jellyfin.Api/Controllers/ChannelsController.cs b/Jellyfin.Api/Controllers/ChannelsController.cs
index 2f55e88ec4..880b3a82d4 100644
--- a/Jellyfin.Api/Controllers/ChannelsController.cs
+++ b/Jellyfin.Api/Controllers/ChannelsController.cs
@@ -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;
diff --git a/Jellyfin.Api/Controllers/DisplayPreferencesController.cs b/Jellyfin.Api/Controllers/DisplayPreferencesController.cs
index 6d94d96f3a..13064882cc 100644
--- a/Jellyfin.Api/Controllers/DisplayPreferencesController.cs
+++ b/Jellyfin.Api/Controllers/DisplayPreferencesController.cs
@@ -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;
diff --git a/Jellyfin.Api/Controllers/GenresController.cs b/Jellyfin.Api/Controllers/GenresController.cs
index f0d17decbf..dd60d01e0c 100644
--- a/Jellyfin.Api/Controllers/GenresController.cs
+++ b/Jellyfin.Api/Controllers/GenresController.cs
@@ -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;
diff --git a/Jellyfin.Api/Controllers/ImageController.cs b/Jellyfin.Api/Controllers/ImageController.cs
index b711990261..e7b7405ca9 100644
--- a/Jellyfin.Api/Controllers/ImageController.cs
+++ b/Jellyfin.Api/Controllers/ImageController.cs
@@ -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)
diff --git a/Jellyfin.Api/Controllers/InstantMixController.cs b/Jellyfin.Api/Controllers/InstantMixController.cs
index e326b925b8..c4b9767565 100644
--- a/Jellyfin.Api/Controllers/InstantMixController.cs
+++ b/Jellyfin.Api/Controllers/InstantMixController.cs
@@ -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;
diff --git a/Jellyfin.Api/Controllers/ItemsController.cs b/Jellyfin.Api/Controllers/ItemsController.cs
index ed2f49b864..803c2f1f78 100644
--- a/Jellyfin.Api/Controllers/ItemsController.cs
+++ b/Jellyfin.Api/Controllers/ItemsController.cs
@@ -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;
diff --git a/Jellyfin.Api/Controllers/LibraryController.cs b/Jellyfin.Api/Controllers/LibraryController.cs
index 7c6160fc49..bde1758e99 100644
--- a/Jellyfin.Api/Controllers/LibraryController.cs
+++ b/Jellyfin.Api/Controllers/LibraryController.cs
@@ -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;
diff --git a/Jellyfin.Api/Controllers/LiveTvController.cs b/Jellyfin.Api/Controllers/LiveTvController.cs
index 1c0a6af79d..5461d12fa2 100644
--- a/Jellyfin.Api/Controllers/LiveTvController.cs
+++ b/Jellyfin.Api/Controllers/LiveTvController.cs
@@ -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;
diff --git a/Jellyfin.Api/Controllers/MediaSegmentsController.cs b/Jellyfin.Api/Controllers/MediaSegmentsController.cs
index 2d1d4e2c8a..e30e2b54e4 100644
--- a/Jellyfin.Api/Controllers/MediaSegmentsController.cs
+++ b/Jellyfin.Api/Controllers/MediaSegmentsController.cs
@@ -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;
diff --git a/Jellyfin.Api/Controllers/MoviesController.cs b/Jellyfin.Api/Controllers/MoviesController.cs
index cbbaaddbfe..363acf815a 100644
--- a/Jellyfin.Api/Controllers/MoviesController.cs
+++ b/Jellyfin.Api/Controllers/MoviesController.cs
@@ -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;
diff --git a/Jellyfin.Api/Controllers/MusicGenresController.cs b/Jellyfin.Api/Controllers/MusicGenresController.cs
index e8bc8f2657..1e45e53ca1 100644
--- a/Jellyfin.Api/Controllers/MusicGenresController.cs
+++ b/Jellyfin.Api/Controllers/MusicGenresController.cs
@@ -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;
diff --git a/Jellyfin.Api/Controllers/PersonsController.cs b/Jellyfin.Api/Controllers/PersonsController.cs
index b0c493fbec..4d12dc18fc 100644
--- a/Jellyfin.Api/Controllers/PersonsController.cs
+++ b/Jellyfin.Api/Controllers/PersonsController.cs
@@ -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;
diff --git a/Jellyfin.Api/Controllers/PlaystateController.cs b/Jellyfin.Api/Controllers/PlaystateController.cs
index 794c6500c6..1577b45947 100644
--- a/Jellyfin.Api/Controllers/PlaystateController.cs
+++ b/Jellyfin.Api/Controllers/PlaystateController.cs
@@ -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;
diff --git a/Jellyfin.Api/Controllers/StudiosController.cs b/Jellyfin.Api/Controllers/StudiosController.cs
index 43c5384dce..52cb87e72c 100644
--- a/Jellyfin.Api/Controllers/StudiosController.cs
+++ b/Jellyfin.Api/Controllers/StudiosController.cs
@@ -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;
diff --git a/Jellyfin.Api/Controllers/SuggestionsController.cs b/Jellyfin.Api/Controllers/SuggestionsController.cs
index 9b56d08494..52982c362d 100644
--- a/Jellyfin.Api/Controllers/SuggestionsController.cs
+++ b/Jellyfin.Api/Controllers/SuggestionsController.cs
@@ -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;
diff --git a/Jellyfin.Api/Controllers/TrailersController.cs b/Jellyfin.Api/Controllers/TrailersController.cs
index 7ee4396bba..3e4bac89a5 100644
--- a/Jellyfin.Api/Controllers/TrailersController.cs
+++ b/Jellyfin.Api/Controllers/TrailersController.cs
@@ -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;
diff --git a/Jellyfin.Api/Controllers/TvShowsController.cs b/Jellyfin.Api/Controllers/TvShowsController.cs
index cc070244b1..0f08854d24 100644
--- a/Jellyfin.Api/Controllers/TvShowsController.cs
+++ b/Jellyfin.Api/Controllers/TvShowsController.cs
@@ -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;
diff --git a/Jellyfin.Api/Controllers/UserController.cs b/Jellyfin.Api/Controllers/UserController.cs
index d7886d247f..d0ced277a0 100644
--- a/Jellyfin.Api/Controllers/UserController.cs
+++ b/Jellyfin.Api/Controllers/UserController.cs
@@ -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;
diff --git a/Jellyfin.Api/Controllers/UserLibraryController.cs b/Jellyfin.Api/Controllers/UserLibraryController.cs
index 6cc2b4244c..0e04beb14e 100644
--- a/Jellyfin.Api/Controllers/UserLibraryController.cs
+++ b/Jellyfin.Api/Controllers/UserLibraryController.cs
@@ -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;
diff --git a/Jellyfin.Api/Controllers/YearsController.cs b/Jellyfin.Api/Controllers/YearsController.cs
index 2b32ae728c..ebf98da456 100644
--- a/Jellyfin.Api/Controllers/YearsController.cs
+++ b/Jellyfin.Api/Controllers/YearsController.cs
@@ -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;
diff --git a/Jellyfin.Api/Helpers/DynamicHlsHelper.cs b/Jellyfin.Api/Helpers/DynamicHlsHelper.cs
index 6487160303..ebd0288ca6 100644
--- a/Jellyfin.Api/Helpers/DynamicHlsHelper.cs
+++ b/Jellyfin.Api/Helpers/DynamicHlsHelper.cs
@@ -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;
diff --git a/Jellyfin.Api/Helpers/MediaInfoHelper.cs b/Jellyfin.Api/Helpers/MediaInfoHelper.cs
index 4adda0b695..7b493d3fa0 100644
--- a/Jellyfin.Api/Helpers/MediaInfoHelper.cs
+++ b/Jellyfin.Api/Helpers/MediaInfoHelper.cs
@@ -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;
diff --git a/Jellyfin.Api/Helpers/RequestHelpers.cs b/Jellyfin.Api/Helpers/RequestHelpers.cs
index eb83a37ba4..e10e940f21 100644
--- a/Jellyfin.Api/Helpers/RequestHelpers.cs
+++ b/Jellyfin.Api/Helpers/RequestHelpers.cs
@@ -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;
diff --git a/Jellyfin.Api/Models/LiveTvDtos/GetProgramsDto.cs b/Jellyfin.Api/Models/LiveTvDtos/GetProgramsDto.cs
index dece664262..2616694d83 100644
--- a/Jellyfin.Api/Models/LiveTvDtos/GetProgramsDto.cs
+++ b/Jellyfin.Api/Models/LiveTvDtos/GetProgramsDto.cs
@@ -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;
diff --git a/Jellyfin.Api/WebSocketListeners/ActivityLogWebSocketListener.cs b/Jellyfin.Api/WebSocketListeners/ActivityLogWebSocketListener.cs
index 97f827fde0..60379f4152 100644
--- a/Jellyfin.Api/WebSocketListeners/ActivityLogWebSocketListener.cs
+++ b/Jellyfin.Api/WebSocketListeners/ActivityLogWebSocketListener.cs
@@ -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;
diff --git a/Jellyfin.Api/WebSocketListeners/SessionInfoWebSocketListener.cs b/Jellyfin.Api/WebSocketListeners/SessionInfoWebSocketListener.cs
index 6cbab6571e..9d149cc85a 100644
--- a/Jellyfin.Api/WebSocketListeners/SessionInfoWebSocketListener.cs
+++ b/Jellyfin.Api/WebSocketListeners/SessionInfoWebSocketListener.cs
@@ -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;
diff --git a/Jellyfin.Data/DayOfWeekHelper.cs b/Jellyfin.Data/DayOfWeekHelper.cs
index 82abfb8313..836860e0ea 100644
--- a/Jellyfin.Data/DayOfWeekHelper.cs
+++ b/Jellyfin.Data/DayOfWeekHelper.cs
@@ -1,7 +1,7 @@
#pragma warning disable CS1591
using System;
-using Jellyfin.Data.Enums;
+using Jellyfin.Database.Implementations.Enums;
namespace Jellyfin.Data
{
diff --git a/Jellyfin.Data/Enums/ArtKind.cs b/Jellyfin.Data/Enums/ArtKind.cs
deleted file mode 100644
index f7a73848c8..0000000000
--- a/Jellyfin.Data/Enums/ArtKind.cs
+++ /dev/null
@@ -1,33 +0,0 @@
-namespace Jellyfin.Data.Enums
-{
- ///
- /// An enum representing types of art.
- ///
- public enum ArtKind
- {
- ///
- /// Another type of art, not covered by the other members.
- ///
- Other = 0,
-
- ///
- /// A poster.
- ///
- Poster = 1,
-
- ///
- /// A banner.
- ///
- Banner = 2,
-
- ///
- /// A thumbnail.
- ///
- Thumbnail = 3,
-
- ///
- /// A logo.
- ///
- Logo = 4
- }
-}
diff --git a/Jellyfin.Data/Enums/ChromecastVersion.cs b/Jellyfin.Data/Enums/ChromecastVersion.cs
deleted file mode 100644
index c9c8a4a625..0000000000
--- a/Jellyfin.Data/Enums/ChromecastVersion.cs
+++ /dev/null
@@ -1,18 +0,0 @@
-namespace Jellyfin.Data.Enums
-{
- ///
- /// An enum representing the version of Chromecast to be used by clients.
- ///
- public enum ChromecastVersion
- {
- ///
- /// Stable Chromecast version.
- ///
- Stable = 0,
-
- ///
- /// Unstable Chromecast version.
- ///
- Unstable = 1
- }
-}
diff --git a/Jellyfin.Data/Enums/DynamicDayOfWeek.cs b/Jellyfin.Data/Enums/DynamicDayOfWeek.cs
deleted file mode 100644
index d3d8dd8227..0000000000
--- a/Jellyfin.Data/Enums/DynamicDayOfWeek.cs
+++ /dev/null
@@ -1,58 +0,0 @@
-namespace Jellyfin.Data.Enums
-{
- ///
- /// An enum that represents a day of the week, weekdays, weekends, or all days.
- ///
- public enum DynamicDayOfWeek
- {
- ///
- /// Sunday.
- ///
- Sunday = 0,
-
- ///
- /// Monday.
- ///
- Monday = 1,
-
- ///
- /// Tuesday.
- ///
- Tuesday = 2,
-
- ///
- /// Wednesday.
- ///
- Wednesday = 3,
-
- ///
- /// Thursday.
- ///
- Thursday = 4,
-
- ///
- /// Friday.
- ///
- Friday = 5,
-
- ///
- /// Saturday.
- ///
- Saturday = 6,
-
- ///
- /// All days of the week.
- ///
- Everyday = 7,
-
- ///
- /// A week day, or Monday-Friday.
- ///
- Weekday = 8,
-
- ///
- /// Saturday and Sunday.
- ///
- Weekend = 9
- }
-}
diff --git a/Jellyfin.Data/Enums/HomeSectionType.cs b/Jellyfin.Data/Enums/HomeSectionType.cs
deleted file mode 100644
index 62da8c3fff..0000000000
--- a/Jellyfin.Data/Enums/HomeSectionType.cs
+++ /dev/null
@@ -1,58 +0,0 @@
-namespace Jellyfin.Data.Enums
-{
- ///
- /// An enum representing the different options for the home screen sections.
- ///
- public enum HomeSectionType
- {
- ///
- /// None.
- ///
- None = 0,
-
- ///
- /// My Media.
- ///
- SmallLibraryTiles = 1,
-
- ///
- /// My Media Small.
- ///
- LibraryButtons = 2,
-
- ///
- /// Active Recordings.
- ///
- ActiveRecordings = 3,
-
- ///
- /// Continue Watching.
- ///
- Resume = 4,
-
- ///
- /// Continue Listening.
- ///
- ResumeAudio = 5,
-
- ///
- /// Latest Media.
- ///
- LatestMedia = 6,
-
- ///
- /// Next Up.
- ///
- NextUp = 7,
-
- ///
- /// Live TV.
- ///
- LiveTv = 8,
-
- ///
- /// Continue Reading.
- ///
- ResumeBook = 9
- }
-}
diff --git a/Jellyfin.Data/Enums/IndexingKind.cs b/Jellyfin.Data/Enums/IndexingKind.cs
deleted file mode 100644
index 3967712b03..0000000000
--- a/Jellyfin.Data/Enums/IndexingKind.cs
+++ /dev/null
@@ -1,23 +0,0 @@
-namespace Jellyfin.Data.Enums
-{
- ///
- /// An enum representing a type of indexing in a user's display preferences.
- ///
- public enum IndexingKind
- {
- ///
- /// Index by the premiere date.
- ///
- PremiereDate = 0,
-
- ///
- /// Index by the production year.
- ///
- ProductionYear = 1,
-
- ///
- /// Index by the community rating.
- ///
- CommunityRating = 2
- }
-}
diff --git a/Jellyfin.Data/Enums/MediaFileKind.cs b/Jellyfin.Data/Enums/MediaFileKind.cs
deleted file mode 100644
index 797c26ec27..0000000000
--- a/Jellyfin.Data/Enums/MediaFileKind.cs
+++ /dev/null
@@ -1,33 +0,0 @@
-namespace Jellyfin.Data.Enums
-{
- ///
- /// An enum representing the type of media file.
- ///
- public enum MediaFileKind
- {
- ///
- /// The main file.
- ///
- Main = 0,
-
- ///
- /// A sidecar file.
- ///
- Sidecar = 1,
-
- ///
- /// An additional part to the main file.
- ///
- AdditionalPart = 2,
-
- ///
- /// An alternative format to the main file.
- ///
- AlternativeFormat = 3,
-
- ///
- /// An additional stream for the main file.
- ///
- AdditionalStream = 4
- }
-}
diff --git a/Jellyfin.Data/Enums/PermissionKind.cs b/Jellyfin.Data/Enums/PermissionKind.cs
deleted file mode 100644
index c3d6705c24..0000000000
--- a/Jellyfin.Data/Enums/PermissionKind.cs
+++ /dev/null
@@ -1,128 +0,0 @@
-namespace Jellyfin.Data.Enums
-{
- ///
- /// The types of user permissions.
- ///
- public enum PermissionKind
- {
- ///
- /// Whether the user is an administrator.
- ///
- IsAdministrator = 0,
-
- ///
- /// Whether the user is hidden.
- ///
- IsHidden = 1,
-
- ///
- /// Whether the user is disabled.
- ///
- IsDisabled = 2,
-
- ///
- /// Whether the user can control shared devices.
- ///
- EnableSharedDeviceControl = 3,
-
- ///
- /// Whether the user can access the server remotely.
- ///
- EnableRemoteAccess = 4,
-
- ///
- /// Whether the user can manage live tv.
- ///
- EnableLiveTvManagement = 5,
-
- ///
- /// Whether the user can access live tv.
- ///
- EnableLiveTvAccess = 6,
-
- ///
- /// Whether the user can play media.
- ///
- EnableMediaPlayback = 7,
-
- ///
- /// Whether the server should transcode audio for the user if requested.
- ///
- EnableAudioPlaybackTranscoding = 8,
-
- ///
- /// Whether the server should transcode video for the user if requested.
- ///
- EnableVideoPlaybackTranscoding = 9,
-
- ///
- /// Whether the user can delete content.
- ///
- EnableContentDeletion = 10,
-
- ///
- /// Whether the user can download content.
- ///
- EnableContentDownloading = 11,
-
- ///
- /// Whether to enable sync transcoding for the user.
- ///
- EnableSyncTranscoding = 12,
-
- ///
- /// Whether the user can do media conversion.
- ///
- EnableMediaConversion = 13,
-
- ///
- /// Whether the user has access to all devices.
- ///
- EnableAllDevices = 14,
-
- ///
- /// Whether the user has access to all channels.
- ///
- EnableAllChannels = 15,
-
- ///
- /// Whether the user has access to all folders.
- ///
- EnableAllFolders = 16,
-
- ///
- /// Whether to enable public sharing for the user.
- ///
- EnablePublicSharing = 17,
-
- ///
- /// Whether the user can remotely control other users.
- ///
- EnableRemoteControlOfOtherUsers = 18,
-
- ///
- /// Whether the user is permitted to do playback remuxing.
- ///
- EnablePlaybackRemuxing = 19,
-
- ///
- /// Whether the server should force transcoding on remote connections for the user.
- ///
- ForceRemoteSourceTranscoding = 20,
-
- ///
- /// Whether the user can create, modify and delete collections.
- ///
- EnableCollectionManagement = 21,
-
- ///
- /// Whether the user can edit subtitles.
- ///
- EnableSubtitleManagement = 22,
-
- ///
- /// Whether the user can edit lyrics.
- ///
- EnableLyricManagement = 23,
- }
-}
diff --git a/Jellyfin.Data/Enums/PersonRoleType.cs b/Jellyfin.Data/Enums/PersonRoleType.cs
deleted file mode 100644
index 1e619f5eef..0000000000
--- a/Jellyfin.Data/Enums/PersonRoleType.cs
+++ /dev/null
@@ -1,68 +0,0 @@
-namespace Jellyfin.Data.Enums
-{
- ///
- /// An enum representing a person's role in a specific media item.
- ///
- public enum PersonRoleType
- {
- ///
- /// Another role, not covered by the other types.
- ///
- Other = 0,
-
- ///
- /// The director of the media.
- ///
- Director = 1,
-
- ///
- /// An artist.
- ///
- Artist = 2,
-
- ///
- /// The original artist.
- ///
- OriginalArtist = 3,
-
- ///
- /// An actor.
- ///
- Actor = 4,
-
- ///
- /// A voice actor.
- ///
- VoiceActor = 5,
-
- ///
- /// A producer.
- ///
- Producer = 6,
-
- ///
- /// A remixer.
- ///
- Remixer = 7,
-
- ///
- /// A conductor.
- ///
- Conductor = 8,
-
- ///
- /// A composer.
- ///
- Composer = 9,
-
- ///
- /// An author.
- ///
- Author = 10,
-
- ///
- /// An editor.
- ///
- Editor = 11
- }
-}
diff --git a/Jellyfin.Data/Enums/PreferenceKind.cs b/Jellyfin.Data/Enums/PreferenceKind.cs
deleted file mode 100644
index d2b412e459..0000000000
--- a/Jellyfin.Data/Enums/PreferenceKind.cs
+++ /dev/null
@@ -1,73 +0,0 @@
-namespace Jellyfin.Data.Enums
-{
- ///
- /// The types of user preferences.
- ///
- public enum PreferenceKind
- {
- ///
- /// A list of blocked tags.
- ///
- BlockedTags = 0,
-
- ///
- /// A list of blocked channels.
- ///
- BlockedChannels = 1,
-
- ///
- /// A list of blocked media folders.
- ///
- BlockedMediaFolders = 2,
-
- ///
- /// A list of enabled devices.
- ///
- EnabledDevices = 3,
-
- ///
- /// A list of enabled channels.
- ///
- EnabledChannels = 4,
-
- ///
- /// A list of enabled folders.
- ///
- EnabledFolders = 5,
-
- ///
- /// A list of folders to allow content deletion from.
- ///
- EnableContentDeletionFromFolders = 6,
-
- ///
- /// A list of latest items to exclude.
- ///
- LatestItemExcludes = 7,
-
- ///
- /// A list of media to exclude.
- ///
- MyMediaExcludes = 8,
-
- ///
- /// A list of grouped folders.
- ///
- GroupedFolders = 9,
-
- ///
- /// A list of unrated items to block.
- ///
- BlockUnratedItems = 10,
-
- ///
- /// A list of ordered views.
- ///
- OrderedViews = 11,
-
- ///
- /// A list of allowed tags.
- ///
- AllowedTags = 12
- }
-}
diff --git a/Jellyfin.Data/Enums/ScrollDirection.cs b/Jellyfin.Data/Enums/ScrollDirection.cs
deleted file mode 100644
index 29c50e2c4e..0000000000
--- a/Jellyfin.Data/Enums/ScrollDirection.cs
+++ /dev/null
@@ -1,18 +0,0 @@
-namespace Jellyfin.Data.Enums
-{
- ///
- /// An enum representing the axis that should be scrolled.
- ///
- public enum ScrollDirection
- {
- ///
- /// Horizontal scrolling direction.
- ///
- Horizontal = 0,
-
- ///
- /// Vertical scrolling direction.
- ///
- Vertical = 1
- }
-}
diff --git a/Jellyfin.Data/Enums/SortOrder.cs b/Jellyfin.Data/Enums/SortOrder.cs
deleted file mode 100644
index 4151448e4e..0000000000
--- a/Jellyfin.Data/Enums/SortOrder.cs
+++ /dev/null
@@ -1,18 +0,0 @@
-namespace Jellyfin.Data.Enums
-{
- ///
- /// An enum representing the sorting order.
- ///
- public enum SortOrder
- {
- ///
- /// Sort in increasing order.
- ///
- Ascending = 0,
-
- ///
- /// Sort in decreasing order.
- ///
- Descending = 1
- }
-}
diff --git a/Jellyfin.Data/Enums/SubtitlePlaybackMode.cs b/Jellyfin.Data/Enums/SubtitlePlaybackMode.cs
deleted file mode 100644
index 79693d321a..0000000000
--- a/Jellyfin.Data/Enums/SubtitlePlaybackMode.cs
+++ /dev/null
@@ -1,33 +0,0 @@
-namespace Jellyfin.Data.Enums
-{
- ///
- /// An enum representing a subtitle playback mode.
- ///
- public enum SubtitlePlaybackMode
- {
- ///
- /// The default subtitle playback mode.
- ///
- Default = 0,
-
- ///
- /// Always show subtitles.
- ///
- Always = 1,
-
- ///
- /// Only show forced subtitles.
- ///
- OnlyForced = 2,
-
- ///
- /// Don't show subtitles.
- ///
- None = 3,
-
- ///
- /// Only show subtitles when the current audio stream is in a different language.
- ///
- Smart = 4
- }
-}
diff --git a/Jellyfin.Data/Enums/SyncPlayUserAccessType.cs b/Jellyfin.Data/Enums/SyncPlayUserAccessType.cs
deleted file mode 100644
index 030d16fb90..0000000000
--- a/Jellyfin.Data/Enums/SyncPlayUserAccessType.cs
+++ /dev/null
@@ -1,23 +0,0 @@
-namespace Jellyfin.Data.Enums
-{
- ///
- /// Enum SyncPlayUserAccessType.
- ///
- public enum SyncPlayUserAccessType
- {
- ///
- /// User can create groups and join them.
- ///
- CreateAndJoinGroups = 0,
-
- ///
- /// User can only join already existing groups.
- ///
- JoinGroups = 1,
-
- ///
- /// SyncPlay is disabled for the user.
- ///
- None = 2
- }
-}
diff --git a/Jellyfin.Data/Enums/ViewType.cs b/Jellyfin.Data/Enums/ViewType.cs
deleted file mode 100644
index c0fd7d448b..0000000000
--- a/Jellyfin.Data/Enums/ViewType.cs
+++ /dev/null
@@ -1,113 +0,0 @@
-namespace Jellyfin.Data.Enums
-{
- ///
- /// An enum representing the type of view for a library or collection.
- ///
- public enum ViewType
- {
- ///
- /// Shows albums.
- ///
- Albums = 0,
-
- ///
- /// Shows album artists.
- ///
- AlbumArtists = 1,
-
- ///
- /// Shows artists.
- ///
- Artists = 2,
-
- ///
- /// Shows channels.
- ///
- Channels = 3,
-
- ///
- /// Shows collections.
- ///
- Collections = 4,
-
- ///
- /// Shows episodes.
- ///
- Episodes = 5,
-
- ///
- /// Shows favorites.
- ///
- Favorites = 6,
-
- ///
- /// Shows genres.
- ///
- Genres = 7,
-
- ///
- /// Shows guide.
- ///
- Guide = 8,
-
- ///
- /// Shows movies.
- ///
- Movies = 9,
-
- ///
- /// Shows networks.
- ///
- Networks = 10,
-
- ///
- /// Shows playlists.
- ///
- Playlists = 11,
-
- ///
- /// Shows programs.
- ///
- Programs = 12,
-
- ///
- /// Shows recordings.
- ///
- Recordings = 13,
-
- ///
- /// Shows schedule.
- ///
- Schedule = 14,
-
- ///
- /// Shows series.
- ///
- Series = 15,
-
- ///
- /// Shows shows.
- ///
- Shows = 16,
-
- ///
- /// Shows songs.
- ///
- Songs = 17,
-
- ///
- /// Shows songs.
- ///
- Suggestions = 18,
-
- ///
- /// Shows trailers.
- ///
- Trailers = 19,
-
- ///
- /// Shows upcoming.
- ///
- Upcoming = 20
- }
-}
diff --git a/Jellyfin.Data/Events/Users/UserCreatedEventArgs.cs b/Jellyfin.Data/Events/Users/UserCreatedEventArgs.cs
index b3b8d28318..8de34fec2c 100644
--- a/Jellyfin.Data/Events/Users/UserCreatedEventArgs.cs
+++ b/Jellyfin.Data/Events/Users/UserCreatedEventArgs.cs
@@ -1,4 +1,4 @@
-using Jellyfin.Data.Entities;
+using Jellyfin.Database.Implementations.Entities;
namespace Jellyfin.Data.Events.Users
{
diff --git a/Jellyfin.Data/Events/Users/UserDeletedEventArgs.cs b/Jellyfin.Data/Events/Users/UserDeletedEventArgs.cs
index d57c917c9f..c85de34ded 100644
--- a/Jellyfin.Data/Events/Users/UserDeletedEventArgs.cs
+++ b/Jellyfin.Data/Events/Users/UserDeletedEventArgs.cs
@@ -1,4 +1,4 @@
-using Jellyfin.Data.Entities;
+using Jellyfin.Database.Implementations.Entities;
namespace Jellyfin.Data.Events.Users
{
diff --git a/Jellyfin.Data/Events/Users/UserLockedOutEventArgs.cs b/Jellyfin.Data/Events/Users/UserLockedOutEventArgs.cs
index 4475948219..46b399d26d 100644
--- a/Jellyfin.Data/Events/Users/UserLockedOutEventArgs.cs
+++ b/Jellyfin.Data/Events/Users/UserLockedOutEventArgs.cs
@@ -1,4 +1,4 @@
-using Jellyfin.Data.Entities;
+using Jellyfin.Database.Implementations.Entities;
namespace Jellyfin.Data.Events.Users
{
diff --git a/Jellyfin.Data/Events/Users/UserPasswordChangedEventArgs.cs b/Jellyfin.Data/Events/Users/UserPasswordChangedEventArgs.cs
index a235ccada9..ee41147d5d 100644
--- a/Jellyfin.Data/Events/Users/UserPasswordChangedEventArgs.cs
+++ b/Jellyfin.Data/Events/Users/UserPasswordChangedEventArgs.cs
@@ -1,4 +1,4 @@
-using Jellyfin.Data.Entities;
+using Jellyfin.Database.Implementations.Entities;
namespace Jellyfin.Data.Events.Users
{
diff --git a/Jellyfin.Data/Events/Users/UserUpdatedEventArgs.cs b/Jellyfin.Data/Events/Users/UserUpdatedEventArgs.cs
index 780ace6abe..0f2763f366 100644
--- a/Jellyfin.Data/Events/Users/UserUpdatedEventArgs.cs
+++ b/Jellyfin.Data/Events/Users/UserUpdatedEventArgs.cs
@@ -1,4 +1,4 @@
-using Jellyfin.Data.Entities;
+using Jellyfin.Database.Implementations.Entities;
namespace Jellyfin.Data.Events.Users
{
diff --git a/Jellyfin.Data/Interfaces/IHasConcurrencyToken.cs b/Jellyfin.Data/Interfaces/IHasConcurrencyToken.cs
deleted file mode 100644
index 2c4091493e..0000000000
--- a/Jellyfin.Data/Interfaces/IHasConcurrencyToken.cs
+++ /dev/null
@@ -1,18 +0,0 @@
-namespace Jellyfin.Data.Interfaces
-{
- ///
- /// An interface abstracting an entity that has a concurrency token.
- ///
- public interface IHasConcurrencyToken
- {
- ///
- /// Gets the version of this row. Acts as a concurrency token.
- ///
- uint RowVersion { get; }
-
- ///
- /// Called when saving changes to this entity.
- ///
- void OnSavingChanges();
- }
-}
diff --git a/Jellyfin.Data/Interfaces/IHasPermissions.cs b/Jellyfin.Data/Interfaces/IHasPermissions.cs
deleted file mode 100644
index bf8ec9d887..0000000000
--- a/Jellyfin.Data/Interfaces/IHasPermissions.cs
+++ /dev/null
@@ -1,31 +0,0 @@
-using System.Collections.Generic;
-using Jellyfin.Data.Entities;
-using Jellyfin.Data.Enums;
-
-namespace Jellyfin.Data.Interfaces
-{
- ///
- /// An abstraction representing an entity that has permissions.
- ///
- public interface IHasPermissions
- {
- ///
- /// Gets a collection containing this entity's permissions.
- ///
- ICollection Permissions { get; }
-
- ///
- /// Checks whether this entity has the specified permission kind.
- ///
- /// The kind of permission.
- /// true if this entity has the specified permission, false otherwise.
- bool HasPermission(PermissionKind kind);
-
- ///
- /// Sets the specified permission to the provided value.
- ///
- /// The kind of permission.
- /// The value to set.
- void SetPermission(PermissionKind kind, bool value);
- }
-}
diff --git a/Jellyfin.Data/Interfaces/IHasReleases.cs b/Jellyfin.Data/Interfaces/IHasReleases.cs
deleted file mode 100644
index 3b615893ed..0000000000
--- a/Jellyfin.Data/Interfaces/IHasReleases.cs
+++ /dev/null
@@ -1,16 +0,0 @@
-using System.Collections.Generic;
-using Jellyfin.Data.Entities.Libraries;
-
-namespace Jellyfin.Data.Interfaces
-{
- ///
- /// An abstraction representing an entity that has releases.
- ///
- public interface IHasReleases
- {
- ///
- /// Gets a collection containing this entity's releases.
- ///
- ICollection Releases { get; }
- }
-}
diff --git a/Jellyfin.Data/Jellyfin.Data.csproj b/Jellyfin.Data/Jellyfin.Data.csproj
index 921cf2d8c1..45374c22f7 100644
--- a/Jellyfin.Data/Jellyfin.Data.csproj
+++ b/Jellyfin.Data/Jellyfin.Data.csproj
@@ -38,6 +38,10 @@
+
+
+
+
diff --git a/Jellyfin.Data/UserEntityExtensions.cs b/Jellyfin.Data/UserEntityExtensions.cs
new file mode 100644
index 0000000000..149fc9042d
--- /dev/null
+++ b/Jellyfin.Data/UserEntityExtensions.cs
@@ -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;
+
+///
+/// Contains extension methods for manipulation of entities.
+///
+public static class UserEntityExtensions
+{
+ ///
+ /// The values being delimited here are Guids, so commas work as they do not appear in Guids.
+ ///
+ private const char Delimiter = ',';
+
+ ///
+ /// Checks whether the user has the specified permission.
+ ///
+ /// The entity to update.
+ /// The permission kind.
+ /// True if the user has the specified permission.
+ public static bool HasPermission(this IHasPermissions entity, PermissionKind kind)
+ {
+ return entity.Permissions.FirstOrDefault(p => p.Kind == kind)?.Value ?? false;
+ }
+
+ ///
+ /// Sets the given permission kind to the provided value.
+ ///
+ /// The entity to update.
+ /// The permission kind.
+ /// The value to set.
+ 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;
+ }
+ }
+
+ ///
+ /// Gets the user's preferences for the given preference kind.
+ ///
+ /// The entity to update.
+ /// The preference kind.
+ /// A string array containing the user's preferences.
+ 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() : val.Split(Delimiter);
+ }
+
+ ///
+ /// Gets the user's preferences for the given preference kind.
+ ///
+ /// The entity to update.
+ /// The preference kind.
+ /// Type of preference.
+ /// A {T} array containing the user's preference.
+ public static T[] GetPreferenceValues(this User entity, PreferenceKind preference)
+ {
+ var val = entity.Preferences.FirstOrDefault(p => p.Kind == preference)?.Value;
+ if (string.IsNullOrEmpty(val))
+ {
+ return Array.Empty();
+ }
+
+ // 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];
+ }
+
+ ///
+ /// Sets the specified preference to the given value.
+ ///
+ /// The entity to update.
+ /// The preference kind.
+ /// The values.
+ 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;
+ }
+ }
+
+ ///
+ /// Sets the specified preference to the given value.
+ ///
+ /// The entity to update.
+ /// The preference kind.
+ /// The values.
+ /// The type of value.
+ public static void SetPreference(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;
+ }
+ }
+
+ ///
+ /// Checks whether this user is currently allowed to use the server.
+ ///
+ /// The entity to update.
+ /// True if the current time is within an access schedule, or there are no access schedules.
+ public static bool IsParentalScheduleAllowed(this User entity)
+ {
+ return entity.AccessSchedules.Count == 0
+ || entity.AccessSchedules.Any(i => IsParentalScheduleAllowed(i, DateTime.UtcNow));
+ }
+
+ ///
+ /// Checks whether the provided folder is in this user's grouped folders.
+ ///
+ /// The entity to update.
+ /// The Guid of the folder.
+ /// True if the folder is in the user's grouped folders.
+ public static bool IsFolderGrouped(this User entity, Guid id)
+ {
+ return Array.IndexOf(GetPreferenceValues(entity, PreferenceKind.GroupedFolders), id) != -1;
+ }
+
+ ///
+ /// Initializes the default permissions for a user. Should only be called on user creation.
+ ///
+ /// The entity to update.
+ // 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));
+ }
+
+ ///
+ /// Initializes the default preferences. Should only be called on user creation.
+ ///
+ /// The entity to update.
+ public static void AddDefaultPreferences(this User entity)
+ {
+ foreach (var val in Enum.GetValues())
+ {
+ 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;
+ }
+}
diff --git a/Jellyfin.Server.Implementations/Activity/ActivityManager.cs b/Jellyfin.Server.Implementations/Activity/ActivityManager.cs
index 54272aeafa..8d492f7cd7 100644
--- a/Jellyfin.Server.Implementations/Activity/ActivityManager.cs
+++ b/Jellyfin.Server.Implementations/Activity/ActivityManager.cs
@@ -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;
diff --git a/Jellyfin.Server.Implementations/DbConfiguration/DatabaseConfigurationFactory.cs b/Jellyfin.Server.Implementations/DbConfiguration/DatabaseConfigurationFactory.cs
new file mode 100644
index 0000000000..26d32f4173
--- /dev/null
+++ b/Jellyfin.Server.Implementations/DbConfiguration/DatabaseConfigurationFactory.cs
@@ -0,0 +1,17 @@
+using System;
+using System.Collections.Generic;
+using MediaBrowser.Common.Configuration;
+
+namespace Jellyfin.Server.Implementations.DatabaseConfiguration;
+
+///
+/// Factory for constructing a database configuration.
+///
+public class DatabaseConfigurationFactory : IConfigurationFactory
+{
+ ///
+ public IEnumerable GetConfigurations()
+ {
+ yield return new DatabaseConfigurationStore();
+ }
+}
diff --git a/Jellyfin.Server.Implementations/DbConfiguration/DatabaseConfigurationStore.cs b/Jellyfin.Server.Implementations/DbConfiguration/DatabaseConfigurationStore.cs
new file mode 100644
index 0000000000..537630561c
--- /dev/null
+++ b/Jellyfin.Server.Implementations/DbConfiguration/DatabaseConfigurationStore.cs
@@ -0,0 +1,26 @@
+using System;
+using System.Collections.Generic;
+using Jellyfin.Database.Implementations.DbConfiguration;
+using MediaBrowser.Common.Configuration;
+
+namespace Jellyfin.Server.Implementations.DatabaseConfiguration;
+
+///
+/// A configuration that stores database related settings.
+///
+public class DatabaseConfigurationStore : ConfigurationStore
+{
+ ///
+ /// The name of the configuration in the storage.
+ ///
+ public const string StoreKey = "database";
+
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ public DatabaseConfigurationStore()
+ {
+ ConfigurationType = typeof(DatabaseConfigurationOptions);
+ Key = StoreKey;
+ }
+}
diff --git a/Jellyfin.Server.Implementations/Devices/DeviceManager.cs b/Jellyfin.Server.Implementations/Devices/DeviceManager.cs
index d3bff2936c..51a1186452 100644
--- a/Jellyfin.Server.Implementations/Devices/DeviceManager.cs
+++ b/Jellyfin.Server.Implementations/Devices/DeviceManager.cs
@@ -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;
diff --git a/Jellyfin.Server.Implementations/Events/Consumers/Library/LyricDownloadFailureLogger.cs b/Jellyfin.Server.Implementations/Events/Consumers/Library/LyricDownloadFailureLogger.cs
index 0d52bb9856..5f4864e953 100644
--- a/Jellyfin.Server.Implementations/Events/Consumers/Library/LyricDownloadFailureLogger.cs
+++ b/Jellyfin.Server.Implementations/Events/Consumers/Library/LyricDownloadFailureLogger.cs
@@ -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;
diff --git a/Jellyfin.Server.Implementations/Events/Consumers/Library/SubtitleDownloadFailureLogger.cs b/Jellyfin.Server.Implementations/Events/Consumers/Library/SubtitleDownloadFailureLogger.cs
index 0a8c064a99..8fe380e4f4 100644
--- a/Jellyfin.Server.Implementations/Events/Consumers/Library/SubtitleDownloadFailureLogger.cs
+++ b/Jellyfin.Server.Implementations/Events/Consumers/Library/SubtitleDownloadFailureLogger.cs
@@ -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;
diff --git a/Jellyfin.Server.Implementations/Events/Consumers/Security/AuthenticationFailedLogger.cs b/Jellyfin.Server.Implementations/Events/Consumers/Security/AuthenticationFailedLogger.cs
index a4424c7391..1a8931a6dc 100644
--- a/Jellyfin.Server.Implementations/Events/Consumers/Security/AuthenticationFailedLogger.cs
+++ b/Jellyfin.Server.Implementations/Events/Consumers/Security/AuthenticationFailedLogger.cs
@@ -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;
diff --git a/Jellyfin.Server.Implementations/Events/Consumers/Security/AuthenticationSucceededLogger.cs b/Jellyfin.Server.Implementations/Events/Consumers/Security/AuthenticationSucceededLogger.cs
index e0ecef2a5d..584d559e44 100644
--- a/Jellyfin.Server.Implementations/Events/Consumers/Security/AuthenticationSucceededLogger.cs
+++ b/Jellyfin.Server.Implementations/Events/Consumers/Security/AuthenticationSucceededLogger.cs
@@ -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;
diff --git a/Jellyfin.Server.Implementations/Events/Consumers/Session/PlaybackStartLogger.cs b/Jellyfin.Server.Implementations/Events/Consumers/Session/PlaybackStartLogger.cs
index 0ef929a99b..73323acb37 100644
--- a/Jellyfin.Server.Implementations/Events/Consumers/Session/PlaybackStartLogger.cs
+++ b/Jellyfin.Server.Implementations/Events/Consumers/Session/PlaybackStartLogger.cs
@@ -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;
diff --git a/Jellyfin.Server.Implementations/Events/Consumers/Session/PlaybackStopLogger.cs b/Jellyfin.Server.Implementations/Events/Consumers/Session/PlaybackStopLogger.cs
index 7d452ea2fd..b75567539c 100644
--- a/Jellyfin.Server.Implementations/Events/Consumers/Session/PlaybackStopLogger.cs
+++ b/Jellyfin.Server.Implementations/Events/Consumers/Session/PlaybackStopLogger.cs
@@ -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;
diff --git a/Jellyfin.Server.Implementations/Events/Consumers/Session/SessionEndedLogger.cs b/Jellyfin.Server.Implementations/Events/Consumers/Session/SessionEndedLogger.cs
index 77e7859c6f..b90708a2f2 100644
--- a/Jellyfin.Server.Implementations/Events/Consumers/Session/SessionEndedLogger.cs
+++ b/Jellyfin.Server.Implementations/Events/Consumers/Session/SessionEndedLogger.cs
@@ -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.Session;
using MediaBrowser.Model.Activity;
diff --git a/Jellyfin.Server.Implementations/Events/Consumers/Session/SessionStartedLogger.cs b/Jellyfin.Server.Implementations/Events/Consumers/Session/SessionStartedLogger.cs
index 141dc20ea3..139c2e2acb 100644
--- a/Jellyfin.Server.Implementations/Events/Consumers/Session/SessionStartedLogger.cs
+++ b/Jellyfin.Server.Implementations/Events/Consumers/Session/SessionStartedLogger.cs
@@ -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.Session;
using MediaBrowser.Model.Activity;
diff --git a/Jellyfin.Server.Implementations/Events/Consumers/System/TaskCompletedLogger.cs b/Jellyfin.Server.Implementations/Events/Consumers/System/TaskCompletedLogger.cs
index b0a9393eb6..da82a3b30f 100644
--- a/Jellyfin.Server.Implementations/Events/Consumers/System/TaskCompletedLogger.cs
+++ b/Jellyfin.Server.Implementations/Events/Consumers/System/TaskCompletedLogger.cs
@@ -3,7 +3,7 @@ using System.Collections.Generic;
using System.Globalization;
using System.Text;
using System.Threading.Tasks;
-using Jellyfin.Data.Entities;
+using Jellyfin.Database.Implementations.Entities;
using MediaBrowser.Controller.Events;
using MediaBrowser.Model.Activity;
using MediaBrowser.Model.Globalization;
diff --git a/Jellyfin.Server.Implementations/Events/Consumers/Updates/PluginInstallationFailedLogger.cs b/Jellyfin.Server.Implementations/Events/Consumers/Updates/PluginInstallationFailedLogger.cs
index 0ae9b7f66f..632f30c7ad 100644
--- a/Jellyfin.Server.Implementations/Events/Consumers/Updates/PluginInstallationFailedLogger.cs
+++ b/Jellyfin.Server.Implementations/Events/Consumers/Updates/PluginInstallationFailedLogger.cs
@@ -1,7 +1,7 @@
using System;
using System.Globalization;
using System.Threading.Tasks;
-using Jellyfin.Data.Entities;
+using Jellyfin.Database.Implementations.Entities;
using MediaBrowser.Common.Updates;
using MediaBrowser.Controller.Events;
using MediaBrowser.Model.Activity;
diff --git a/Jellyfin.Server.Implementations/Events/Consumers/Updates/PluginInstalledLogger.cs b/Jellyfin.Server.Implementations/Events/Consumers/Updates/PluginInstalledLogger.cs
index 287ba578ba..4b49b714cf 100644
--- a/Jellyfin.Server.Implementations/Events/Consumers/Updates/PluginInstalledLogger.cs
+++ b/Jellyfin.Server.Implementations/Events/Consumers/Updates/PluginInstalledLogger.cs
@@ -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.Updates;
using MediaBrowser.Model.Activity;
diff --git a/Jellyfin.Server.Implementations/Events/Consumers/Updates/PluginUninstalledLogger.cs b/Jellyfin.Server.Implementations/Events/Consumers/Updates/PluginUninstalledLogger.cs
index 2de207b152..2d24de7fc6 100644
--- a/Jellyfin.Server.Implementations/Events/Consumers/Updates/PluginUninstalledLogger.cs
+++ b/Jellyfin.Server.Implementations/Events/Consumers/Updates/PluginUninstalledLogger.cs
@@ -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.Updates;
using MediaBrowser.Model.Activity;
diff --git a/Jellyfin.Server.Implementations/Events/Consumers/Updates/PluginUpdatedLogger.cs b/Jellyfin.Server.Implementations/Events/Consumers/Updates/PluginUpdatedLogger.cs
index 08d6bf9c25..e892d3dd9a 100644
--- a/Jellyfin.Server.Implementations/Events/Consumers/Updates/PluginUpdatedLogger.cs
+++ b/Jellyfin.Server.Implementations/Events/Consumers/Updates/PluginUpdatedLogger.cs
@@ -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.Updates;
using MediaBrowser.Model.Activity;
diff --git a/Jellyfin.Server.Implementations/Events/Consumers/Users/UserCreatedLogger.cs b/Jellyfin.Server.Implementations/Events/Consumers/Users/UserCreatedLogger.cs
index a09c344f61..4f063f6a1b 100644
--- a/Jellyfin.Server.Implementations/Events/Consumers/Users/UserCreatedLogger.cs
+++ b/Jellyfin.Server.Implementations/Events/Consumers/Users/UserCreatedLogger.cs
@@ -1,7 +1,7 @@
using System.Globalization;
using System.Threading.Tasks;
-using Jellyfin.Data.Entities;
using Jellyfin.Data.Events.Users;
+using Jellyfin.Database.Implementations.Entities;
using MediaBrowser.Controller.Events;
using MediaBrowser.Model.Activity;
using MediaBrowser.Model.Globalization;
diff --git a/Jellyfin.Server.Implementations/Events/Consumers/Users/UserDeletedLogger.cs b/Jellyfin.Server.Implementations/Events/Consumers/Users/UserDeletedLogger.cs
index 46da8044a1..ba4a072e84 100644
--- a/Jellyfin.Server.Implementations/Events/Consumers/Users/UserDeletedLogger.cs
+++ b/Jellyfin.Server.Implementations/Events/Consumers/Users/UserDeletedLogger.cs
@@ -1,8 +1,8 @@
using System;
using System.Globalization;
using System.Threading.Tasks;
-using Jellyfin.Data.Entities;
using Jellyfin.Data.Events.Users;
+using Jellyfin.Database.Implementations.Entities;
using MediaBrowser.Controller.Events;
using MediaBrowser.Model.Activity;
using MediaBrowser.Model.Globalization;
diff --git a/Jellyfin.Server.Implementations/Events/Consumers/Users/UserLockedOutLogger.cs b/Jellyfin.Server.Implementations/Events/Consumers/Users/UserLockedOutLogger.cs
index 1d0d016a74..bbc00567d1 100644
--- a/Jellyfin.Server.Implementations/Events/Consumers/Users/UserLockedOutLogger.cs
+++ b/Jellyfin.Server.Implementations/Events/Consumers/Users/UserLockedOutLogger.cs
@@ -1,7 +1,7 @@
using System.Globalization;
using System.Threading.Tasks;
-using Jellyfin.Data.Entities;
using Jellyfin.Data.Events.Users;
+using Jellyfin.Database.Implementations.Entities;
using MediaBrowser.Controller.Events;
using MediaBrowser.Model.Activity;
using MediaBrowser.Model.Globalization;
diff --git a/Jellyfin.Server.Implementations/Events/Consumers/Users/UserPasswordChangedLogger.cs b/Jellyfin.Server.Implementations/Events/Consumers/Users/UserPasswordChangedLogger.cs
index 2b8f966a80..7219704ec6 100644
--- a/Jellyfin.Server.Implementations/Events/Consumers/Users/UserPasswordChangedLogger.cs
+++ b/Jellyfin.Server.Implementations/Events/Consumers/Users/UserPasswordChangedLogger.cs
@@ -1,7 +1,7 @@
using System.Globalization;
using System.Threading.Tasks;
-using Jellyfin.Data.Entities;
using Jellyfin.Data.Events.Users;
+using Jellyfin.Database.Implementations.Entities;
using MediaBrowser.Controller.Events;
using MediaBrowser.Model.Activity;
using MediaBrowser.Model.Globalization;
diff --git a/Jellyfin.Server.Implementations/Extensions/ServiceCollectionExtensions.cs b/Jellyfin.Server.Implementations/Extensions/ServiceCollectionExtensions.cs
index 7eee260593..fbbb5bca73 100644
--- a/Jellyfin.Server.Implementations/Extensions/ServiceCollectionExtensions.cs
+++ b/Jellyfin.Server.Implementations/Extensions/ServiceCollectionExtensions.cs
@@ -1,8 +1,15 @@
using System;
-using System.IO;
+using System.Collections.Generic;
+using System.Reflection;
+using Jellyfin.Database.Implementations;
+using Jellyfin.Database.Implementations.DbConfiguration;
+using Jellyfin.Database.Providers.Sqlite;
using MediaBrowser.Common.Configuration;
+using MediaBrowser.Controller.Configuration;
using Microsoft.EntityFrameworkCore;
+using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
+using JellyfinDbProviderFactory = System.Func;
namespace Jellyfin.Server.Implementations.Extensions;
@@ -11,17 +18,77 @@ namespace Jellyfin.Server.Implementations.Extensions;
///
public static class ServiceCollectionExtensions
{
+ private static IEnumerable DatabaseProviderTypes()
+ {
+ yield return typeof(SqliteDatabaseProvider);
+ }
+
+ private static IDictionary GetSupportedDbProviders()
+ {
+ var items = new Dictionary(StringComparer.InvariantCultureIgnoreCase);
+ foreach (var providerType in DatabaseProviderTypes())
+ {
+ var keyAttribute = providerType.GetCustomAttribute();
+ if (keyAttribute is null || string.IsNullOrWhiteSpace(keyAttribute.DatabaseProviderKey))
+ {
+ continue;
+ }
+
+ var provider = providerType;
+ items[keyAttribute.DatabaseProviderKey] = (services) => (IJellyfinDatabaseProvider)ActivatorUtilities.CreateInstance(services, providerType);
+ }
+
+ return items;
+ }
+
///
/// Adds the interface to the service collection with second level caching enabled.
///
/// An instance of the interface.
+ /// The server configuration manager.
+ /// The startup Configuration.
/// The updated service collection.
- public static IServiceCollection AddJellyfinDbContext(this IServiceCollection serviceCollection)
+ public static IServiceCollection AddJellyfinDbContext(
+ this IServiceCollection serviceCollection,
+ IServerConfigurationManager configurationManager,
+ IConfiguration configuration)
{
+ var efCoreConfiguration = configurationManager.GetConfiguration("database");
+ var providers = GetSupportedDbProviders();
+ JellyfinDbProviderFactory? providerFactory = null;
+
+ if (efCoreConfiguration?.DatabaseType is null)
+ {
+ var cmdMigrationArgument = configuration.GetValue("migration-provider");
+ if (!string.IsNullOrWhiteSpace(cmdMigrationArgument))
+ {
+ efCoreConfiguration = new DatabaseConfigurationOptions()
+ {
+ DatabaseType = cmdMigrationArgument,
+ };
+ }
+ else
+ {
+ // when nothing is setup via new Database configuration, fallback to SQLite with default settings.
+ efCoreConfiguration = new DatabaseConfigurationOptions()
+ {
+ DatabaseType = "Jellyfin-SQLite",
+ };
+ configurationManager.SaveConfiguration("database", efCoreConfiguration);
+ }
+ }
+
+ if (!providers.TryGetValue(efCoreConfiguration.DatabaseType.ToUpperInvariant(), out providerFactory!))
+ {
+ throw new InvalidOperationException($"Jellyfin cannot find the database provider of type '{efCoreConfiguration.DatabaseType}'. Supported types are {string.Join(", ", providers.Keys)}");
+ }
+
+ serviceCollection.AddSingleton(providerFactory!);
+
serviceCollection.AddPooledDbContextFactory((serviceProvider, opt) =>
{
- var applicationPaths = serviceProvider.GetRequiredService();
- opt.UseSqlite($"Filename={Path.Combine(applicationPaths.DataPath, "jellyfin.db")};Pooling=false");
+ var provider = serviceProvider.GetRequiredService();
+ provider.Initialise(opt);
});
return serviceCollection;
diff --git a/Jellyfin.Server.Implementations/Item/BaseItemRepository.cs b/Jellyfin.Server.Implementations/Item/BaseItemRepository.cs
index bea69b2820..4f69022441 100644
--- a/Jellyfin.Server.Implementations/Item/BaseItemRepository.cs
+++ b/Jellyfin.Server.Implementations/Item/BaseItemRepository.cs
@@ -16,8 +16,10 @@ using System.Reflection;
using System.Text;
using System.Text.Json;
using System.Threading;
-using Jellyfin.Data.Entities;
using Jellyfin.Data.Enums;
+using Jellyfin.Database.Implementations;
+using Jellyfin.Database.Implementations.Entities;
+using Jellyfin.Database.Implementations.Enums;
using Jellyfin.Extensions;
using Jellyfin.Extensions.Json;
using MediaBrowser.Common;
@@ -36,7 +38,7 @@ using MediaBrowser.Model.Querying;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging;
using BaseItemDto = MediaBrowser.Controller.Entities.BaseItem;
-using BaseItemEntity = Jellyfin.Data.Entities.BaseItemEntity;
+using BaseItemEntity = Jellyfin.Database.Implementations.Entities.BaseItemEntity;
namespace Jellyfin.Server.Implementations.Item;
diff --git a/Jellyfin.Server.Implementations/Item/ChapterRepository.cs b/Jellyfin.Server.Implementations/Item/ChapterRepository.cs
index fc6f04d56a..93e15735c9 100644
--- a/Jellyfin.Server.Implementations/Item/ChapterRepository.cs
+++ b/Jellyfin.Server.Implementations/Item/ChapterRepository.cs
@@ -2,7 +2,8 @@ using System;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
-using Jellyfin.Data.Entities;
+using Jellyfin.Database.Implementations;
+using Jellyfin.Database.Implementations.Entities;
using MediaBrowser.Controller.Chapters;
using MediaBrowser.Controller.Drawing;
using MediaBrowser.Model.Dto;
diff --git a/Jellyfin.Server.Implementations/Item/MediaAttachmentRepository.cs b/Jellyfin.Server.Implementations/Item/MediaAttachmentRepository.cs
index 1557982093..3ae6dbd702 100644
--- a/Jellyfin.Server.Implementations/Item/MediaAttachmentRepository.cs
+++ b/Jellyfin.Server.Implementations/Item/MediaAttachmentRepository.cs
@@ -3,7 +3,8 @@ using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
using System.Threading;
-using Jellyfin.Data.Entities;
+using Jellyfin.Database.Implementations;
+using Jellyfin.Database.Implementations.Entities;
using MediaBrowser.Controller.Persistence;
using MediaBrowser.Model.Entities;
using Microsoft.EntityFrameworkCore;
diff --git a/Jellyfin.Server.Implementations/Item/MediaStreamRepository.cs b/Jellyfin.Server.Implementations/Item/MediaStreamRepository.cs
index f47e3fdfd3..36c3b9e565 100644
--- a/Jellyfin.Server.Implementations/Item/MediaStreamRepository.cs
+++ b/Jellyfin.Server.Implementations/Item/MediaStreamRepository.cs
@@ -3,7 +3,8 @@ using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
using System.Threading;
-using Jellyfin.Data.Entities;
+using Jellyfin.Database.Implementations;
+using Jellyfin.Database.Implementations.Entities;
using MediaBrowser.Controller;
using MediaBrowser.Controller.Persistence;
using MediaBrowser.Model.Entities;
diff --git a/Jellyfin.Server.Implementations/Item/PeopleRepository.cs b/Jellyfin.Server.Implementations/Item/PeopleRepository.cs
index 1396f1c6f8..77877835e0 100644
--- a/Jellyfin.Server.Implementations/Item/PeopleRepository.cs
+++ b/Jellyfin.Server.Implementations/Item/PeopleRepository.cs
@@ -2,8 +2,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;
+using Jellyfin.Database.Implementations.Entities;
using Jellyfin.Extensions;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Persistence;
diff --git a/Jellyfin.Server.Implementations/Jellyfin.Server.Implementations.csproj b/Jellyfin.Server.Implementations/Jellyfin.Server.Implementations.csproj
index 31cf24fb2d..6693ab8dbd 100644
--- a/Jellyfin.Server.Implementations/Jellyfin.Server.Implementations.csproj
+++ b/Jellyfin.Server.Implementations/Jellyfin.Server.Implementations.csproj
@@ -28,22 +28,15 @@
-
-
- all
- runtime; build; native; contentfiles; analyzers; buildtransitive
-
-
- all
- runtime; build; native; contentfiles; analyzers; buildtransitive
-
+
+
diff --git a/Jellyfin.Server.Implementations/MediaSegments/MediaSegmentManager.cs b/Jellyfin.Server.Implementations/MediaSegments/MediaSegmentManager.cs
index 59ec418ce7..d6eeafacc3 100644
--- a/Jellyfin.Server.Implementations/MediaSegments/MediaSegmentManager.cs
+++ b/Jellyfin.Server.Implementations/MediaSegments/MediaSegmentManager.cs
@@ -5,8 +5,9 @@ using System.Globalization;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
-using Jellyfin.Data.Entities;
-using Jellyfin.Data.Enums;
+using Jellyfin.Database.Implementations;
+using Jellyfin.Database.Implementations.Entities;
+using Jellyfin.Database.Implementations.Enums;
using Jellyfin.Extensions;
using MediaBrowser.Common.Extensions;
using MediaBrowser.Controller;
diff --git a/Jellyfin.Server.Implementations/Migrations/DesignTimeJellyfinDbFactory.cs b/Jellyfin.Server.Implementations/Migrations/DesignTimeJellyfinDbFactory.cs
deleted file mode 100644
index 500c4a1c72..0000000000
--- a/Jellyfin.Server.Implementations/Migrations/DesignTimeJellyfinDbFactory.cs
+++ /dev/null
@@ -1,21 +0,0 @@
-using Microsoft.EntityFrameworkCore;
-using Microsoft.EntityFrameworkCore.Design;
-using Microsoft.Extensions.Logging.Abstractions;
-
-namespace Jellyfin.Server.Implementations.Migrations
-{
- ///
- /// The design time factory for .
- /// This is only used for the creation of migrations and not during runtime.
- ///
- internal class DesignTimeJellyfinDbFactory : IDesignTimeDbContextFactory
- {
- public JellyfinDbContext CreateDbContext(string[] args)
- {
- var optionsBuilder = new DbContextOptionsBuilder();
- optionsBuilder.UseSqlite("Data Source=jellyfin.db");
-
- return new JellyfinDbContext(optionsBuilder.Options, NullLogger.Instance);
- }
- }
-}
diff --git a/Jellyfin.Server.Implementations/ModelBuilderExtensions.cs b/Jellyfin.Server.Implementations/ModelBuilderExtensions.cs
deleted file mode 100644
index 79ae1661aa..0000000000
--- a/Jellyfin.Server.Implementations/ModelBuilderExtensions.cs
+++ /dev/null
@@ -1,48 +0,0 @@
-using System;
-using Jellyfin.Server.Implementations.ValueConverters;
-using Microsoft.EntityFrameworkCore;
-using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
-
-namespace Jellyfin.Server.Implementations
-{
- ///
- /// Model builder extensions.
- ///
- public static class ModelBuilderExtensions
- {
- ///
- /// Specify value converter for the object type.
- ///
- /// The model builder.
- /// The .
- /// The type to convert.
- /// The modified .
- public static ModelBuilder UseValueConverterForType(this ModelBuilder modelBuilder, ValueConverter converter)
- {
- var type = typeof(T);
- foreach (var entityType in modelBuilder.Model.GetEntityTypes())
- {
- foreach (var property in entityType.GetProperties())
- {
- if (property.ClrType == type)
- {
- property.SetValueConverter(converter);
- }
- }
- }
-
- return modelBuilder;
- }
-
- ///
- /// Specify the default .
- ///
- /// The model builder to extend.
- /// The to specify.
- public static void SetDefaultDateTimeKind(this ModelBuilder modelBuilder, DateTimeKind kind)
- {
- modelBuilder.UseValueConverterForType(new DateTimeKindValueConverter(kind));
- modelBuilder.UseValueConverterForType(new DateTimeKindValueConverter(kind));
- }
- }
-}
diff --git a/Jellyfin.Server.Implementations/Security/AuthenticationManager.cs b/Jellyfin.Server.Implementations/Security/AuthenticationManager.cs
index 1c9f54ab03..cf0293463f 100644
--- a/Jellyfin.Server.Implementations/Security/AuthenticationManager.cs
+++ b/Jellyfin.Server.Implementations/Security/AuthenticationManager.cs
@@ -1,7 +1,8 @@
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
-using Jellyfin.Data.Entities.Security;
+using Jellyfin.Database.Implementations;
+using Jellyfin.Database.Implementations.Entities.Security;
using MediaBrowser.Controller.Security;
using Microsoft.EntityFrameworkCore;
diff --git a/Jellyfin.Server.Implementations/Security/AuthorizationContext.cs b/Jellyfin.Server.Implementations/Security/AuthorizationContext.cs
index 9e225393c4..e3fe517c49 100644
--- a/Jellyfin.Server.Implementations/Security/AuthorizationContext.cs
+++ b/Jellyfin.Server.Implementations/Security/AuthorizationContext.cs
@@ -5,6 +5,7 @@ using System.Collections.Generic;
using System.Net;
using System.Threading.Tasks;
using Jellyfin.Data.Queries;
+using Jellyfin.Database.Implementations;
using Jellyfin.Extensions;
using MediaBrowser.Controller;
using MediaBrowser.Controller.Configuration;
diff --git a/Jellyfin.Server.Implementations/Trickplay/TrickplayManager.cs b/Jellyfin.Server.Implementations/Trickplay/TrickplayManager.cs
index 6949ec1a8c..bf39f13a77 100644
--- a/Jellyfin.Server.Implementations/Trickplay/TrickplayManager.cs
+++ b/Jellyfin.Server.Implementations/Trickplay/TrickplayManager.cs
@@ -7,7 +7,8 @@ using System.Text;
using System.Threading;
using System.Threading.Tasks;
using AsyncKeyedLock;
-using Jellyfin.Data.Entities;
+using Jellyfin.Database.Implementations;
+using Jellyfin.Database.Implementations.Entities;
using MediaBrowser.Common.Configuration;
using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Drawing;
diff --git a/Jellyfin.Server.Implementations/Users/DefaultAuthenticationProvider.cs b/Jellyfin.Server.Implementations/Users/DefaultAuthenticationProvider.cs
index acada7aa46..35c43b176d 100644
--- a/Jellyfin.Server.Implementations/Users/DefaultAuthenticationProvider.cs
+++ b/Jellyfin.Server.Implementations/Users/DefaultAuthenticationProvider.cs
@@ -2,7 +2,7 @@ using System;
using System.Diagnostics.CodeAnalysis;
using System.Globalization;
using System.Threading.Tasks;
-using Jellyfin.Data.Entities;
+using Jellyfin.Database.Implementations.Entities;
using MediaBrowser.Controller.Authentication;
using MediaBrowser.Model.Cryptography;
using Microsoft.Extensions.Logging;
diff --git a/Jellyfin.Server.Implementations/Users/DefaultPasswordResetProvider.cs b/Jellyfin.Server.Implementations/Users/DefaultPasswordResetProvider.cs
index cefbd0624d..6296881a9e 100644
--- a/Jellyfin.Server.Implementations/Users/DefaultPasswordResetProvider.cs
+++ b/Jellyfin.Server.Implementations/Users/DefaultPasswordResetProvider.cs
@@ -4,7 +4,7 @@ using System.IO;
using System.Security.Cryptography;
using System.Text.Json;
using System.Threading.Tasks;
-using Jellyfin.Data.Entities;
+using Jellyfin.Database.Implementations.Entities;
using MediaBrowser.Common;
using MediaBrowser.Common.Extensions;
using MediaBrowser.Controller.Authentication;
diff --git a/Jellyfin.Server.Implementations/Users/DeviceAccessHost.cs b/Jellyfin.Server.Implementations/Users/DeviceAccessHost.cs
index 45b0a0853e..92e2bb4fa7 100644
--- a/Jellyfin.Server.Implementations/Users/DeviceAccessHost.cs
+++ b/Jellyfin.Server.Implementations/Users/DeviceAccessHost.cs
@@ -1,9 +1,10 @@
using System.Threading;
using System.Threading.Tasks;
-using Jellyfin.Data.Entities;
-using Jellyfin.Data.Enums;
+using Jellyfin.Data;
using Jellyfin.Data.Events;
using Jellyfin.Data.Queries;
+using Jellyfin.Database.Implementations.Entities;
+using Jellyfin.Database.Implementations.Enums;
using MediaBrowser.Controller.Devices;
using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Session;
diff --git a/Jellyfin.Server.Implementations/Users/DisplayPreferencesManager.cs b/Jellyfin.Server.Implementations/Users/DisplayPreferencesManager.cs
index e204a16a64..0f21e11a35 100644
--- a/Jellyfin.Server.Implementations/Users/DisplayPreferencesManager.cs
+++ b/Jellyfin.Server.Implementations/Users/DisplayPreferencesManager.cs
@@ -5,7 +5,8 @@ using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
-using Jellyfin.Data.Entities;
+using Jellyfin.Database.Implementations;
+using Jellyfin.Database.Implementations.Entities;
using MediaBrowser.Controller;
using Microsoft.EntityFrameworkCore;
diff --git a/Jellyfin.Server.Implementations/Users/InvalidAuthProvider.cs b/Jellyfin.Server.Implementations/Users/InvalidAuthProvider.cs
index c4e4c460a6..caf9d5bd9a 100644
--- a/Jellyfin.Server.Implementations/Users/InvalidAuthProvider.cs
+++ b/Jellyfin.Server.Implementations/Users/InvalidAuthProvider.cs
@@ -1,5 +1,5 @@
using System.Threading.Tasks;
-using Jellyfin.Data.Entities;
+using Jellyfin.Database.Implementations.Entities;
using MediaBrowser.Controller.Authentication;
namespace Jellyfin.Server.Implementations.Users
diff --git a/Jellyfin.Server.Implementations/Users/UserManager.cs b/Jellyfin.Server.Implementations/Users/UserManager.cs
index fba8923f89..3c39e5503b 100644
--- a/Jellyfin.Server.Implementations/Users/UserManager.cs
+++ b/Jellyfin.Server.Implementations/Users/UserManager.cs
@@ -7,10 +7,13 @@ using System.Globalization;
using System.Linq;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
-using Jellyfin.Data.Entities;
+using Jellyfin.Data;
using Jellyfin.Data.Enums;
using Jellyfin.Data.Events;
using Jellyfin.Data.Events.Users;
+using Jellyfin.Database.Implementations;
+using Jellyfin.Database.Implementations.Entities;
+using Jellyfin.Database.Implementations.Enums;
using Jellyfin.Extensions;
using MediaBrowser.Common;
using MediaBrowser.Common.Extensions;
@@ -146,7 +149,7 @@ namespace Jellyfin.Server.Implementations.Users
ThrowIfInvalidUsername(newName);
- if (user.Username.Equals(newName, StringComparison.Ordinal))
+ if (user.Username.Equals(newName, StringComparison.OrdinalIgnoreCase))
{
throw new ArgumentException("The new and old names must be different.");
}
@@ -154,8 +157,11 @@ namespace Jellyfin.Server.Implementations.Users
var dbContext = await _dbProvider.CreateDbContextAsync().ConfigureAwait(false);
await using (dbContext.ConfigureAwait(false))
{
+#pragma warning disable CA1862 // Use the 'StringComparison' method overloads to perform case-insensitive string comparisons
+#pragma warning disable CA1311 // Specify a culture or use an invariant version to avoid implicit dependency on current culture
+#pragma warning disable CA1304 // The behavior of 'string.ToUpper()' could vary based on the current user's locale settings
if (await dbContext.Users
- .AnyAsync(u => u.Username == newName && !u.Id.Equals(user.Id))
+ .AnyAsync(u => u.Username.ToUpper() == newName.ToUpper() && !u.Id.Equals(user.Id))
.ConfigureAwait(false))
{
throw new ArgumentException(string.Format(
@@ -163,6 +169,9 @@ namespace Jellyfin.Server.Implementations.Users
"A user with the name '{0}' already exists.",
newName));
}
+#pragma warning restore CA1304 // The behavior of 'string.ToUpper()' could vary based on the current user's locale settings
+#pragma warning restore CA1311 // Specify a culture or use an invariant version to avoid implicit dependency on current culture
+#pragma warning restore CA1862 // Use the 'StringComparison' method overloads to perform case-insensitive string comparisons
user.Username = newName;
await UpdateUserInternalAsync(dbContext, user).ConfigureAwait(false);
diff --git a/Jellyfin.Server/CoreAppHost.cs b/Jellyfin.Server/CoreAppHost.cs
index d5b6e93b8e..f3bf6b805a 100644
--- a/Jellyfin.Server/CoreAppHost.cs
+++ b/Jellyfin.Server/CoreAppHost.cs
@@ -4,13 +4,14 @@ using System.Reflection;
using Emby.Server.Implementations;
using Emby.Server.Implementations.Session;
using Jellyfin.Api.WebSocketListeners;
+using Jellyfin.Database.Implementations;
using Jellyfin.Drawing;
using Jellyfin.Drawing.Skia;
using Jellyfin.LiveTv;
-using Jellyfin.Server.Implementations;
using Jellyfin.Server.Implementations.Activity;
using Jellyfin.Server.Implementations.Devices;
using Jellyfin.Server.Implementations.Events;
+using Jellyfin.Server.Implementations.Extensions;
using Jellyfin.Server.Implementations.Security;
using Jellyfin.Server.Implementations.Trickplay;
using Jellyfin.Server.Implementations.Users;
@@ -116,9 +117,12 @@ namespace Jellyfin.Server
// Jellyfin.Server
yield return typeof(CoreAppHost).Assembly;
- // Jellyfin.Server.Implementations
+ // Jellyfin.Database.Implementations
yield return typeof(JellyfinDbContext).Assembly;
+ // Jellyfin.Server.Implementations
+ yield return typeof(ServiceCollectionExtensions).Assembly;
+
// Jellyfin.LiveTv
yield return typeof(LiveTvManager).Assembly;
}
diff --git a/Jellyfin.Server/Extensions/ApiServiceCollectionExtensions.cs b/Jellyfin.Server/Extensions/ApiServiceCollectionExtensions.cs
index 1a327e0f9f..c6c3f21fe1 100644
--- a/Jellyfin.Server/Extensions/ApiServiceCollectionExtensions.cs
+++ b/Jellyfin.Server/Extensions/ApiServiceCollectionExtensions.cs
@@ -19,6 +19,7 @@ using Jellyfin.Api.Controllers;
using Jellyfin.Api.Formatters;
using Jellyfin.Api.ModelBinders;
using Jellyfin.Data.Enums;
+using Jellyfin.Database.Implementations.Enums;
using Jellyfin.Extensions.Json;
using Jellyfin.Server.Configuration;
using Jellyfin.Server.Filters;
diff --git a/Jellyfin.Server/Extensions/WebHostBuilderExtensions.cs b/Jellyfin.Server/Extensions/WebHostBuilderExtensions.cs
index 6b95770ed5..7695c0d9ee 100644
--- a/Jellyfin.Server/Extensions/WebHostBuilderExtensions.cs
+++ b/Jellyfin.Server/Extensions/WebHostBuilderExtensions.cs
@@ -85,6 +85,6 @@ public static class WebHostBuilderExtensions
logger.LogInformation("Kestrel listening to unix socket {SocketPath}", socketPath);
}
})
- .UseStartup(_ => new Startup(appHost));
+ .UseStartup(context => new Startup(appHost, context.Configuration));
}
}
diff --git a/Jellyfin.Server/Jellyfin.Server.csproj b/Jellyfin.Server/Jellyfin.Server.csproj
index ebb12ba4e7..452b03efbe 100644
--- a/Jellyfin.Server/Jellyfin.Server.csproj
+++ b/Jellyfin.Server/Jellyfin.Server.csproj
@@ -66,6 +66,7 @@
+
diff --git a/Jellyfin.Server/Migrations/Routines/MigrateActivityLogDb.cs b/Jellyfin.Server/Migrations/Routines/MigrateActivityLogDb.cs
index 2f23cb1f8f..e9fe9abceb 100644
--- a/Jellyfin.Server/Migrations/Routines/MigrateActivityLogDb.cs
+++ b/Jellyfin.Server/Migrations/Routines/MigrateActivityLogDb.cs
@@ -2,8 +2,8 @@ using System;
using System.Collections.Generic;
using System.IO;
using Emby.Server.Implementations.Data;
-using Jellyfin.Data.Entities;
-using Jellyfin.Server.Implementations;
+using Jellyfin.Database.Implementations;
+using Jellyfin.Database.Implementations.Entities;
using MediaBrowser.Controller;
using Microsoft.Data.Sqlite;
using Microsoft.EntityFrameworkCore;
diff --git a/Jellyfin.Server/Migrations/Routines/MigrateAuthenticationDb.cs b/Jellyfin.Server/Migrations/Routines/MigrateAuthenticationDb.cs
index c845beef2f..feaf46c843 100644
--- a/Jellyfin.Server/Migrations/Routines/MigrateAuthenticationDb.cs
+++ b/Jellyfin.Server/Migrations/Routines/MigrateAuthenticationDb.cs
@@ -2,8 +2,8 @@ using System;
using System.Collections.Generic;
using System.IO;
using Emby.Server.Implementations.Data;
-using Jellyfin.Data.Entities.Security;
-using Jellyfin.Server.Implementations;
+using Jellyfin.Database.Implementations;
+using Jellyfin.Database.Implementations.Entities.Security;
using MediaBrowser.Controller;
using MediaBrowser.Controller.Library;
using Microsoft.Data.Sqlite;
diff --git a/Jellyfin.Server/Migrations/Routines/MigrateDisplayPreferencesDb.cs b/Jellyfin.Server/Migrations/Routines/MigrateDisplayPreferencesDb.cs
index 502a37cde1..a8fa2e52a1 100644
--- a/Jellyfin.Server/Migrations/Routines/MigrateDisplayPreferencesDb.cs
+++ b/Jellyfin.Server/Migrations/Routines/MigrateDisplayPreferencesDb.cs
@@ -5,9 +5,9 @@ using System.Linq;
using System.Text.Json;
using System.Text.Json.Serialization;
using Emby.Server.Implementations.Data;
-using Jellyfin.Data.Entities;
-using Jellyfin.Data.Enums;
-using Jellyfin.Server.Implementations;
+using Jellyfin.Database.Implementations;
+using Jellyfin.Database.Implementations.Entities;
+using Jellyfin.Database.Implementations.Enums;
using MediaBrowser.Controller;
using MediaBrowser.Controller.Library;
using MediaBrowser.Model.Dto;
diff --git a/Jellyfin.Server/Migrations/Routines/MigrateLibraryDb.cs b/Jellyfin.Server/Migrations/Routines/MigrateLibraryDb.cs
index 9e33eb2a71..214a2f4e66 100644
--- a/Jellyfin.Server/Migrations/Routines/MigrateLibraryDb.cs
+++ b/Jellyfin.Server/Migrations/Routines/MigrateLibraryDb.cs
@@ -9,10 +9,11 @@ using System.Globalization;
using System.IO;
using System.Linq;
using System.Text;
+using System.Threading;
using Emby.Server.Implementations.Data;
-using Jellyfin.Data.Entities;
+using Jellyfin.Database.Implementations;
+using Jellyfin.Database.Implementations.Entities;
using Jellyfin.Extensions;
-using Jellyfin.Server.Implementations;
using Jellyfin.Server.Implementations.Item;
using MediaBrowser.Controller;
using MediaBrowser.Controller.Entities;
@@ -20,7 +21,8 @@ using MediaBrowser.Model.Entities;
using Microsoft.Data.Sqlite;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging;
-using Chapter = Jellyfin.Data.Entities.Chapter;
+using BaseItemEntity = Jellyfin.Database.Implementations.Entities.BaseItemEntity;
+using Chapter = Jellyfin.Database.Implementations.Entities.Chapter;
namespace Jellyfin.Server.Migrations.Routines;
@@ -33,6 +35,7 @@ public class MigrateLibraryDb : IMigrationRoutine
private readonly ILogger _logger;
private readonly IServerApplicationPaths _paths;
+ private readonly IJellyfinDatabaseProvider _jellyfinDatabaseProvider;
private readonly IDbContextFactory _provider;
///
@@ -41,14 +44,17 @@ public class MigrateLibraryDb : IMigrationRoutine
/// The logger.
/// The database provider.
/// The server application paths.
+ /// The database provider for special access.
public MigrateLibraryDb(
ILogger logger,
IDbContextFactory provider,
- IServerApplicationPaths paths)
+ IServerApplicationPaths paths,
+ IJellyfinDatabaseProvider jellyfinDatabaseProvider)
{
_logger = logger;
_provider = provider;
_paths = paths;
+ _jellyfinDatabaseProvider = jellyfinDatabaseProvider;
}
///
@@ -120,7 +126,7 @@ public class MigrateLibraryDb : IMigrationRoutine
dbContext.ItemValues.ExecuteDelete();
// EFCores local lookup sucks. We cannot use context.ItemValues.Local here because its just super slow.
- var localItems = new Dictionary<(int Type, string CleanValue), (ItemValue ItemValue, List ItemIds)>();
+ var localItems = new Dictionary<(int Type, string CleanValue), (Database.Implementations.Entities.ItemValue ItemValue, List ItemIds)>();
foreach (SqliteDataReader dto in connection.Query(itemValueQuery))
{
@@ -323,17 +329,7 @@ public class MigrateLibraryDb : IMigrationRoutine
_logger.LogInformation("Migrating Library db took {0}.", migrationTotalTime);
- if (dbContext.Database.IsSqlite())
- {
- _logger.LogInformation("Vacuum and Optimise jellyfin.db now.");
- dbContext.Database.ExecuteSqlRaw("PRAGMA optimize");
- dbContext.Database.ExecuteSqlRaw("VACUUM");
- _logger.LogInformation("jellyfin.db optimized successfully!");
- }
- else
- {
- _logger.LogInformation("This database doesn't support optimization");
- }
+ _jellyfinDatabaseProvider.RunScheduledOptimisation(CancellationToken.None).ConfigureAwait(false).GetAwaiter().GetResult();
}
private UserData? GetUserData(ImmutableArray users, SqliteDataReader dto)
diff --git a/Jellyfin.Server/Migrations/Routines/MigrateUserDb.cs b/Jellyfin.Server/Migrations/Routines/MigrateUserDb.cs
index 7dcae5bd9d..c40560660d 100644
--- a/Jellyfin.Server/Migrations/Routines/MigrateUserDb.cs
+++ b/Jellyfin.Server/Migrations/Routines/MigrateUserDb.cs
@@ -1,10 +1,11 @@
using System;
using System.IO;
using Emby.Server.Implementations.Data;
-using Jellyfin.Data.Entities;
-using Jellyfin.Data.Enums;
+using Jellyfin.Data;
+using Jellyfin.Database.Implementations;
+using Jellyfin.Database.Implementations.Entities;
+using Jellyfin.Database.Implementations.Enums;
using Jellyfin.Extensions.Json;
-using Jellyfin.Server.Implementations;
using Jellyfin.Server.Implementations.Users;
using MediaBrowser.Controller;
using MediaBrowser.Controller.Entities;
diff --git a/Jellyfin.Server/Program.cs b/Jellyfin.Server/Program.cs
index 7e50100b09..32814393cf 100644
--- a/Jellyfin.Server/Program.cs
+++ b/Jellyfin.Server/Program.cs
@@ -4,12 +4,13 @@ using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
+using System.Threading;
using System.Threading.Tasks;
using CommandLine;
using Emby.Server.Implementations;
+using Jellyfin.Database.Implementations;
using Jellyfin.Server.Extensions;
using Jellyfin.Server.Helpers;
-using Jellyfin.Server.Implementations;
using Jellyfin.Server.ServerSetupApp;
using MediaBrowser.Common.Configuration;
using MediaBrowser.Common.Net;
@@ -164,7 +165,7 @@ namespace Jellyfin.Server
// Re-use the host service provider in the app host since ASP.NET doesn't allow a custom service collection.
appHost.ServiceProvider = _jellyfinHost.Services;
- await appHost.InitializeServices().ConfigureAwait(false);
+ await appHost.InitializeServices(startupConfig).ConfigureAwait(false);
Migrations.MigrationRunner.Run(appHost, _loggerFactory);
try
@@ -204,23 +205,12 @@ namespace Jellyfin.Server
// Don't throw additional exception if startup failed.
if (appHost.ServiceProvider is not null)
{
- var isSqlite = false;
_logger.LogInformation("Running query planner optimizations in the database... This might take a while");
- // Run before disposing the application
- var context = await appHost.ServiceProvider.GetRequiredService>().CreateDbContextAsync().ConfigureAwait(false);
- await using (context.ConfigureAwait(false))
- {
- if (context.Database.IsSqlite())
- {
- isSqlite = true;
- await context.Database.ExecuteSqlRawAsync("PRAGMA optimize").ConfigureAwait(false);
- }
- }
- if (isSqlite)
- {
- SqliteConnection.ClearAllPools();
- }
+ var databaseProvider = appHost.ServiceProvider.GetRequiredService();
+ using var shutdownSource = new CancellationTokenSource();
+ shutdownSource.CancelAfter((int)TimeSpan.FromSeconds(60).TotalMicroseconds);
+ await databaseProvider.RunShutdownTask(shutdownSource.Token).ConfigureAwait(false);
}
_appHost = null;
diff --git a/Jellyfin.Server/Startup.cs b/Jellyfin.Server/Startup.cs
index c686614699..688b169359 100644
--- a/Jellyfin.Server/Startup.cs
+++ b/Jellyfin.Server/Startup.cs
@@ -6,6 +6,7 @@ using System.Net.Mime;
using System.Text;
using Emby.Server.Implementations.EntryPoints;
using Jellyfin.Api.Middleware;
+using Jellyfin.Database.Implementations;
using Jellyfin.LiveTv.Extensions;
using Jellyfin.LiveTv.Recordings;
using Jellyfin.MediaEncoding.Hls.Extensions;
@@ -13,7 +14,6 @@ using Jellyfin.Networking;
using Jellyfin.Networking.HappyEyeballs;
using Jellyfin.Server.Extensions;
using Jellyfin.Server.HealthChecks;
-using Jellyfin.Server.Implementations;
using Jellyfin.Server.Implementations.Extensions;
using Jellyfin.Server.Infrastructure;
using MediaBrowser.Common.Net;
@@ -39,15 +39,18 @@ namespace Jellyfin.Server
public class Startup
{
private readonly CoreAppHost _serverApplicationHost;
+ private readonly IConfiguration _configuration;
private readonly IServerConfigurationManager _serverConfigurationManager;
///
/// Initializes a new instance of the class.
///
/// The server application host.
- public Startup(CoreAppHost appHost)
+ /// The used Configuration.
+ public Startup(CoreAppHost appHost, IConfiguration configuration)
{
_serverApplicationHost = appHost;
+ _configuration = configuration;
_serverConfigurationManager = appHost.ConfigurationManager;
}
@@ -67,7 +70,7 @@ namespace Jellyfin.Server
// TODO remove once this is fixed upstream https://github.com/dotnet/aspnetcore/issues/34371
services.AddSingleton, SymlinkFollowingPhysicalFileResultExecutor>();
services.AddJellyfinApi(_serverApplicationHost.GetApiPluginAssemblies(), _serverConfigurationManager.GetNetworkConfiguration());
- services.AddJellyfinDbContext();
+ services.AddJellyfinDbContext(_serverApplicationHost.ConfigurationManager, _configuration);
services.AddJellyfinApiSwagger();
// configure custom legacy authentication
diff --git a/Jellyfin.sln b/Jellyfin.sln
index edef9b7a59..cdc8c8f651 100644
--- a/Jellyfin.sln
+++ b/Jellyfin.sln
@@ -87,6 +87,12 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Jellyfin.LiveTv.Tests", "te
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Jellyfin.LiveTv", "src\Jellyfin.LiveTv\Jellyfin.LiveTv.csproj", "{8C6B2B13-58A4-4506-9DAB-1F882A093FE0}"
EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Jellyfin.Database", "Jellyfin.Database", "{4C54CE05-69C8-48FA-8785-39F7F6DB1CAD}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Jellyfin.Database.Providers.Sqlite", "src\Jellyfin.Database\Jellyfin.Database.Providers.Sqlite\Jellyfin.Database.Providers.Sqlite.csproj", "{A5590358-33CC-4B39-BDE7-DC62FEB03C76}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Jellyfin.Database.Implementations", "src\Jellyfin.Database\Jellyfin.Database.Implementations\Jellyfin.Database.Implementations.csproj", "{8C9F9221-8415-496C-B1F5-E7756F03FA59}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -241,17 +247,28 @@ Global
{8C6B2B13-58A4-4506-9DAB-1F882A093FE0}.Debug|Any CPU.Build.0 = Debug|Any CPU
{8C6B2B13-58A4-4506-9DAB-1F882A093FE0}.Release|Any CPU.ActiveCfg = Release|Any CPU
{8C6B2B13-58A4-4506-9DAB-1F882A093FE0}.Release|Any CPU.Build.0 = Release|Any CPU
+ {A5590358-33CC-4B39-BDE7-DC62FEB03C76}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {A5590358-33CC-4B39-BDE7-DC62FEB03C76}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {A5590358-33CC-4B39-BDE7-DC62FEB03C76}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {A5590358-33CC-4B39-BDE7-DC62FEB03C76}.Release|Any CPU.Build.0 = Release|Any CPU
+ {8C9F9221-8415-496C-B1F5-E7756F03FA59}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {8C9F9221-8415-496C-B1F5-E7756F03FA59}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {8C9F9221-8415-496C-B1F5-E7756F03FA59}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {8C9F9221-8415-496C-B1F5-E7756F03FA59}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
+ {08FFF49B-F175-4807-A2B5-73B0EBD9F716} = {C9F0AB5D-F4D7-40C8-A353-3305C86D6D4C}
+ {154872D9-6C12-4007-96E3-8F70A58386CE} = {C9F0AB5D-F4D7-40C8-A353-3305C86D6D4C}
{DF194677-DFD3-42AF-9F75-D44D5A416478} = {FBBB5129-006E-4AD7-BAD5-8B7CA1D10ED6}
{28464062-0939-4AA7-9F7B-24DDDA61A7C0} = {FBBB5129-006E-4AD7-BAD5-8B7CA1D10ED6}
{3998657B-1CCC-49DD-A19F-275DC8495F57} = {FBBB5129-006E-4AD7-BAD5-8B7CA1D10ED6}
{A2FD0A10-8F62-4F9D-B171-FFDF9F0AFA9D} = {FBBB5129-006E-4AD7-BAD5-8B7CA1D10ED6}
{2E3A1B4B-4225-4AAA-8B29-0181A84E7AEE} = {FBBB5129-006E-4AD7-BAD5-8B7CA1D10ED6}
{462584F7-5023-4019-9EAC-B98CA458C0A0} = {FBBB5129-006E-4AD7-BAD5-8B7CA1D10ED6}
+ {0A3FCC4D-C714-4072-B90F-E374A15F9FF9} = {C9F0AB5D-F4D7-40C8-A353-3305C86D6D4C}
{30922383-D513-4F4D-B890-A940B57FA353} = {FBBB5129-006E-4AD7-BAD5-8B7CA1D10ED6}
{FC1BC0CE-E8D2-4AE9-A6AB-8A02143B335D} = {FBBB5129-006E-4AD7-BAD5-8B7CA1D10ED6}
{42816EA8-4511-4CBF-A9C7-7791D5DDDAE6} = {FBBB5129-006E-4AD7-BAD5-8B7CA1D10ED6}
@@ -264,11 +281,11 @@ Global
{DA9FD356-4894-4830-B208-D6BCE3E65B11} = {C9F0AB5D-F4D7-40C8-A353-3305C86D6D4C}
{FE47334C-EFDE-4519-BD50-F24430FF360B} = {FBBB5129-006E-4AD7-BAD5-8B7CA1D10ED6}
{24960660-DE6C-47BF-AEEF-CEE8F19FE6C2} = {FBBB5129-006E-4AD7-BAD5-8B7CA1D10ED6}
- {08FFF49B-F175-4807-A2B5-73B0EBD9F716} = {C9F0AB5D-F4D7-40C8-A353-3305C86D6D4C}
- {154872D9-6C12-4007-96E3-8F70A58386CE} = {C9F0AB5D-F4D7-40C8-A353-3305C86D6D4C}
- {0A3FCC4D-C714-4072-B90F-E374A15F9FF9} = {C9F0AB5D-F4D7-40C8-A353-3305C86D6D4C}
{C4F71272-C6BE-4C30-BE0D-4E6ED651D6D3} = {FBBB5129-006E-4AD7-BAD5-8B7CA1D10ED6}
{8C6B2B13-58A4-4506-9DAB-1F882A093FE0} = {C9F0AB5D-F4D7-40C8-A353-3305C86D6D4C}
+ {4C54CE05-69C8-48FA-8785-39F7F6DB1CAD} = {C9F0AB5D-F4D7-40C8-A353-3305C86D6D4C}
+ {A5590358-33CC-4B39-BDE7-DC62FEB03C76} = {4C54CE05-69C8-48FA-8785-39F7F6DB1CAD}
+ {8C9F9221-8415-496C-B1F5-E7756F03FA59} = {4C54CE05-69C8-48FA-8785-39F7F6DB1CAD}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {3448830C-EBDC-426C-85CD-7BBB9651A7FE}
diff --git a/MediaBrowser.Controller/Authentication/IAuthenticationProvider.cs b/MediaBrowser.Controller/Authentication/IAuthenticationProvider.cs
index 81b532fda8..976a667acd 100644
--- a/MediaBrowser.Controller/Authentication/IAuthenticationProvider.cs
+++ b/MediaBrowser.Controller/Authentication/IAuthenticationProvider.cs
@@ -1,7 +1,7 @@
#pragma warning disable CS1591
using System.Threading.Tasks;
-using Jellyfin.Data.Entities;
+using Jellyfin.Database.Implementations.Entities;
using MediaBrowser.Model.Users;
namespace MediaBrowser.Controller.Authentication
diff --git a/MediaBrowser.Controller/Authentication/IPasswordResetProvider.cs b/MediaBrowser.Controller/Authentication/IPasswordResetProvider.cs
index 8c9d1baf88..592ce99556 100644
--- a/MediaBrowser.Controller/Authentication/IPasswordResetProvider.cs
+++ b/MediaBrowser.Controller/Authentication/IPasswordResetProvider.cs
@@ -4,7 +4,7 @@
using System;
using System.Threading.Tasks;
-using Jellyfin.Data.Entities;
+using Jellyfin.Database.Implementations.Entities;
using MediaBrowser.Model.Users;
namespace MediaBrowser.Controller.Authentication
diff --git a/MediaBrowser.Controller/Channels/Channel.cs b/MediaBrowser.Controller/Channels/Channel.cs
index 9e07000bcf..199e22b3fa 100644
--- a/MediaBrowser.Controller/Channels/Channel.cs
+++ b/MediaBrowser.Controller/Channels/Channel.cs
@@ -7,8 +7,9 @@ using System.Globalization;
using System.Linq;
using System.Text.Json.Serialization;
using System.Threading;
-using Jellyfin.Data.Entities;
-using Jellyfin.Data.Enums;
+using Jellyfin.Data;
+using Jellyfin.Database.Implementations.Entities;
+using Jellyfin.Database.Implementations.Enums;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Model.Querying;
diff --git a/MediaBrowser.Controller/Collections/ICollectionManager.cs b/MediaBrowser.Controller/Collections/ICollectionManager.cs
index 38a78a67b5..206b5ac426 100644
--- a/MediaBrowser.Controller/Collections/ICollectionManager.cs
+++ b/MediaBrowser.Controller/Collections/ICollectionManager.cs
@@ -3,7 +3,7 @@
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
-using Jellyfin.Data.Entities;
+using Jellyfin.Database.Implementations.Entities;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.Movies;
diff --git a/MediaBrowser.Controller/Devices/IDeviceManager.cs b/MediaBrowser.Controller/Devices/IDeviceManager.cs
index fe7dc1cf94..ea38950d32 100644
--- a/MediaBrowser.Controller/Devices/IDeviceManager.cs
+++ b/MediaBrowser.Controller/Devices/IDeviceManager.cs
@@ -1,10 +1,10 @@
using System;
using System.Threading.Tasks;
using Jellyfin.Data.Dtos;
-using Jellyfin.Data.Entities;
-using Jellyfin.Data.Entities.Security;
using Jellyfin.Data.Events;
using Jellyfin.Data.Queries;
+using Jellyfin.Database.Implementations.Entities;
+using Jellyfin.Database.Implementations.Entities.Security;
using MediaBrowser.Model.Devices;
using MediaBrowser.Model.Dto;
using MediaBrowser.Model.Querying;
diff --git a/MediaBrowser.Controller/Drawing/IImageProcessor.cs b/MediaBrowser.Controller/Drawing/IImageProcessor.cs
index 702ce39a2a..4eeec99b0b 100644
--- a/MediaBrowser.Controller/Drawing/IImageProcessor.cs
+++ b/MediaBrowser.Controller/Drawing/IImageProcessor.cs
@@ -3,7 +3,7 @@
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
-using Jellyfin.Data.Entities;
+using Jellyfin.Database.Implementations.Entities;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Model.Drawing;
using MediaBrowser.Model.Dto;
diff --git a/MediaBrowser.Controller/Dto/IDtoService.cs b/MediaBrowser.Controller/Dto/IDtoService.cs
index 22453f0f76..f1d507fcbd 100644
--- a/MediaBrowser.Controller/Dto/IDtoService.cs
+++ b/MediaBrowser.Controller/Dto/IDtoService.cs
@@ -1,7 +1,7 @@
#pragma warning disable CA1002
using System.Collections.Generic;
-using Jellyfin.Data.Entities;
+using Jellyfin.Database.Implementations.Entities;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Model.Dto;
diff --git a/MediaBrowser.Controller/Entities/Audio/MusicAlbum.cs b/MediaBrowser.Controller/Entities/Audio/MusicAlbum.cs
index f3873775b9..d016d8f62b 100644
--- a/MediaBrowser.Controller/Entities/Audio/MusicAlbum.cs
+++ b/MediaBrowser.Controller/Entities/Audio/MusicAlbum.cs
@@ -8,8 +8,10 @@ using System.Linq;
using System.Text.Json.Serialization;
using System.Threading;
using System.Threading.Tasks;
-using Jellyfin.Data.Entities;
+using Jellyfin.Data;
using Jellyfin.Data.Enums;
+using Jellyfin.Database.Implementations.Entities;
+using Jellyfin.Database.Implementations.Enums;
using MediaBrowser.Controller.Dto;
using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Providers;
diff --git a/MediaBrowser.Controller/Entities/Audio/MusicArtist.cs b/MediaBrowser.Controller/Entities/Audio/MusicArtist.cs
index 52221ad9e3..58841e5b78 100644
--- a/MediaBrowser.Controller/Entities/Audio/MusicArtist.cs
+++ b/MediaBrowser.Controller/Entities/Audio/MusicArtist.cs
@@ -8,8 +8,10 @@ using System.Linq;
using System.Text.Json.Serialization;
using System.Threading;
using System.Threading.Tasks;
-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.Providers;
using MediaBrowser.Model.Entities;
diff --git a/MediaBrowser.Controller/Entities/BaseItem.cs b/MediaBrowser.Controller/Entities/BaseItem.cs
index a331f7983b..1dd289631d 100644
--- a/MediaBrowser.Controller/Entities/BaseItem.cs
+++ b/MediaBrowser.Controller/Entities/BaseItem.cs
@@ -12,8 +12,10 @@ using System.Text;
using System.Text.Json.Serialization;
using System.Threading;
using System.Threading.Tasks;
-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.Channels;
diff --git a/MediaBrowser.Controller/Entities/CollectionFolder.cs b/MediaBrowser.Controller/Entities/CollectionFolder.cs
index b7b5dac034..ca79e62454 100644
--- a/MediaBrowser.Controller/Entities/CollectionFolder.cs
+++ b/MediaBrowser.Controller/Entities/CollectionFolder.cs
@@ -11,8 +11,8 @@ using System.Text.Json;
using System.Text.Json.Serialization;
using System.Threading;
using System.Threading.Tasks;
-using Jellyfin.Data.Entities;
using Jellyfin.Data.Enums;
+using Jellyfin.Database.Implementations.Entities;
using Jellyfin.Extensions.Json;
using MediaBrowser.Controller.IO;
using MediaBrowser.Controller.Library;
diff --git a/MediaBrowser.Controller/Entities/Folder.cs b/MediaBrowser.Controller/Entities/Folder.cs
index af6348e462..dd85a6ec0e 100644
--- a/MediaBrowser.Controller/Entities/Folder.cs
+++ b/MediaBrowser.Controller/Entities/Folder.cs
@@ -13,8 +13,10 @@ using System.Threading;
using System.Threading.Tasks;
using System.Threading.Tasks.Dataflow;
using J2N.Collections.Generic.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.Controller.Channels;
using MediaBrowser.Controller.Collections;
diff --git a/MediaBrowser.Controller/Entities/InternalItemsQuery.cs b/MediaBrowser.Controller/Entities/InternalItemsQuery.cs
index 43f02fb72b..5ce5fd4fa9 100644
--- a/MediaBrowser.Controller/Entities/InternalItemsQuery.cs
+++ b/MediaBrowser.Controller/Entities/InternalItemsQuery.cs
@@ -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 MediaBrowser.Controller.Dto;
using MediaBrowser.Model.Entities;
diff --git a/MediaBrowser.Controller/Entities/InternalPeopleQuery.cs b/MediaBrowser.Controller/Entities/InternalPeopleQuery.cs
index 3e1d892748..203a16a668 100644
--- a/MediaBrowser.Controller/Entities/InternalPeopleQuery.cs
+++ b/MediaBrowser.Controller/Entities/InternalPeopleQuery.cs
@@ -4,7 +4,7 @@
using System;
using System.Collections.Generic;
-using Jellyfin.Data.Entities;
+using Jellyfin.Database.Implementations.Entities;
namespace MediaBrowser.Controller.Entities
{
diff --git a/MediaBrowser.Controller/Entities/Movies/BoxSet.cs b/MediaBrowser.Controller/Entities/Movies/BoxSet.cs
index c9a93d0f56..d656fccb4f 100644
--- a/MediaBrowser.Controller/Entities/Movies/BoxSet.cs
+++ b/MediaBrowser.Controller/Entities/Movies/BoxSet.cs
@@ -7,8 +7,10 @@ using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
using System.Text.Json.Serialization;
-using Jellyfin.Data.Entities;
+using Jellyfin.Data;
using Jellyfin.Data.Enums;
+using Jellyfin.Database.Implementations.Entities;
+using Jellyfin.Database.Implementations.Enums;
using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.Querying;
diff --git a/MediaBrowser.Controller/Entities/TV/Season.cs b/MediaBrowser.Controller/Entities/TV/Season.cs
index 9dbac1e920..1293528fba 100644
--- a/MediaBrowser.Controller/Entities/TV/Season.cs
+++ b/MediaBrowser.Controller/Entities/TV/Season.cs
@@ -7,8 +7,8 @@ using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text.Json.Serialization;
-using Jellyfin.Data.Entities;
using Jellyfin.Data.Enums;
+using Jellyfin.Database.Implementations.Entities;
using Jellyfin.Extensions;
using MediaBrowser.Common;
using MediaBrowser.Controller.Dto;
diff --git a/MediaBrowser.Controller/Entities/TV/Series.cs b/MediaBrowser.Controller/Entities/TV/Series.cs
index 137d91f1cf..5dad158519 100644
--- a/MediaBrowser.Controller/Entities/TV/Series.cs
+++ b/MediaBrowser.Controller/Entities/TV/Series.cs
@@ -9,12 +9,13 @@ using System.Linq;
using System.Text.Json.Serialization;
using System.Threading;
using System.Threading.Tasks;
-using Jellyfin.Data.Entities;
+using Jellyfin.Data;
using Jellyfin.Data.Enums;
+using Jellyfin.Database.Implementations.Entities;
+using Jellyfin.Database.Implementations.Enums;
using MediaBrowser.Controller.Dto;
using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.Entities;
-using MediaBrowser.Model.Providers;
using MediaBrowser.Model.Querying;
using MetadataProvider = MediaBrowser.Model.Entities.MetadataProvider;
diff --git a/MediaBrowser.Controller/Entities/UserRootFolder.cs b/MediaBrowser.Controller/Entities/UserRootFolder.cs
index 7ae4a4a2cd..bc7e22d9a0 100644
--- a/MediaBrowser.Controller/Entities/UserRootFolder.cs
+++ b/MediaBrowser.Controller/Entities/UserRootFolder.cs
@@ -8,7 +8,7 @@ using System.Linq;
using System.Text.Json.Serialization;
using System.Threading;
using System.Threading.Tasks;
-using Jellyfin.Data.Entities;
+using Jellyfin.Database.Implementations.Entities;
using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.Library;
using MediaBrowser.Model.Querying;
diff --git a/MediaBrowser.Controller/Entities/UserView.cs b/MediaBrowser.Controller/Entities/UserView.cs
index f5ca3737c2..dfa31315cb 100644
--- a/MediaBrowser.Controller/Entities/UserView.cs
+++ b/MediaBrowser.Controller/Entities/UserView.cs
@@ -8,8 +8,8 @@ using System.Linq;
using System.Text.Json.Serialization;
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.Providers;
using MediaBrowser.Controller.TV;
diff --git a/MediaBrowser.Controller/Entities/UserViewBuilder.cs b/MediaBrowser.Controller/Entities/UserViewBuilder.cs
index 4ec2e4c0a4..c2b4da32ac 100644
--- a/MediaBrowser.Controller/Entities/UserViewBuilder.cs
+++ b/MediaBrowser.Controller/Entities/UserViewBuilder.cs
@@ -6,8 +6,10 @@ using System;
using System.Collections.Generic;
using System.Globalization;
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.Library;
using MediaBrowser.Controller.TV;
diff --git a/MediaBrowser.Controller/IDisplayPreferencesManager.cs b/MediaBrowser.Controller/IDisplayPreferencesManager.cs
index 10c0f56e09..a97096eaee 100644
--- a/MediaBrowser.Controller/IDisplayPreferencesManager.cs
+++ b/MediaBrowser.Controller/IDisplayPreferencesManager.cs
@@ -1,6 +1,6 @@
using System;
using System.Collections.Generic;
-using Jellyfin.Data.Entities;
+using Jellyfin.Database.Implementations.Entities;
namespace MediaBrowser.Controller
{
diff --git a/MediaBrowser.Controller/Library/IIntroProvider.cs b/MediaBrowser.Controller/Library/IIntroProvider.cs
index 4a9721acbe..860e948afe 100644
--- a/MediaBrowser.Controller/Library/IIntroProvider.cs
+++ b/MediaBrowser.Controller/Library/IIntroProvider.cs
@@ -2,6 +2,7 @@
using System.Collections.Generic;
using System.Threading.Tasks;
+using Jellyfin.Database.Implementations.Entities;
using MediaBrowser.Controller.Entities;
namespace MediaBrowser.Controller.Library
@@ -23,6 +24,6 @@ namespace MediaBrowser.Controller.Library
/// The item.
/// The user.
/// IEnumerable{System.String}.
- Task> GetIntros(BaseItem item, Jellyfin.Data.Entities.User user);
+ Task> GetIntros(BaseItem item, User user);
}
}
diff --git a/MediaBrowser.Controller/Library/ILibraryManager.cs b/MediaBrowser.Controller/Library/ILibraryManager.cs
index e4490bca3b..a3e3e4991c 100644
--- a/MediaBrowser.Controller/Library/ILibraryManager.cs
+++ b/MediaBrowser.Controller/Library/ILibraryManager.cs
@@ -4,8 +4,9 @@ using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
-using Jellyfin.Data.Entities;
using Jellyfin.Data.Enums;
+using Jellyfin.Database.Implementations.Entities;
+using Jellyfin.Database.Implementations.Enums;
using MediaBrowser.Controller.Dto;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.Audio;
diff --git a/MediaBrowser.Controller/Library/IMediaSourceManager.cs b/MediaBrowser.Controller/Library/IMediaSourceManager.cs
index eb697268c7..2b6781a197 100644
--- a/MediaBrowser.Controller/Library/IMediaSourceManager.cs
+++ b/MediaBrowser.Controller/Library/IMediaSourceManager.cs
@@ -6,7 +6,7 @@ using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
-using Jellyfin.Data.Entities;
+using Jellyfin.Database.Implementations.Entities;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.LiveTv;
using MediaBrowser.Controller.Persistence;
diff --git a/MediaBrowser.Controller/Library/IMusicManager.cs b/MediaBrowser.Controller/Library/IMusicManager.cs
index 7ba8fc20cf..20764ec601 100644
--- a/MediaBrowser.Controller/Library/IMusicManager.cs
+++ b/MediaBrowser.Controller/Library/IMusicManager.cs
@@ -1,7 +1,7 @@
#pragma warning disable CA1002, CS1591
using System.Collections.Generic;
-using Jellyfin.Data.Entities;
+using Jellyfin.Database.Implementations.Entities;
using MediaBrowser.Controller.Dto;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.Audio;
diff --git a/MediaBrowser.Controller/Library/IUserDataManager.cs b/MediaBrowser.Controller/Library/IUserDataManager.cs
index 5a2deda66a..eb46611dd9 100644
--- a/MediaBrowser.Controller/Library/IUserDataManager.cs
+++ b/MediaBrowser.Controller/Library/IUserDataManager.cs
@@ -1,7 +1,7 @@
using System;
using System.Collections.Generic;
using System.Threading;
-using Jellyfin.Data.Entities;
+using Jellyfin.Database.Implementations.Entities;
using MediaBrowser.Controller.Dto;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Model.Dto;
diff --git a/MediaBrowser.Controller/Library/IUserManager.cs b/MediaBrowser.Controller/Library/IUserManager.cs
index 1c115be857..0109cf4b7d 100644
--- a/MediaBrowser.Controller/Library/IUserManager.cs
+++ b/MediaBrowser.Controller/Library/IUserManager.cs
@@ -3,8 +3,8 @@
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
-using Jellyfin.Data.Entities;
using Jellyfin.Data.Events;
+using Jellyfin.Database.Implementations.Entities;
using MediaBrowser.Model.Configuration;
using MediaBrowser.Model.Dto;
using MediaBrowser.Model.Users;
diff --git a/MediaBrowser.Controller/Library/PlaybackProgressEventArgs.cs b/MediaBrowser.Controller/Library/PlaybackProgressEventArgs.cs
index 76e9eb1f54..b0a6782c77 100644
--- a/MediaBrowser.Controller/Library/PlaybackProgressEventArgs.cs
+++ b/MediaBrowser.Controller/Library/PlaybackProgressEventArgs.cs
@@ -4,7 +4,7 @@
using System;
using System.Collections.Generic;
-using Jellyfin.Data.Entities;
+using Jellyfin.Database.Implementations.Entities;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Session;
using MediaBrowser.Model.Dto;
diff --git a/MediaBrowser.Controller/LiveTv/ILiveTvManager.cs b/MediaBrowser.Controller/LiveTv/ILiveTvManager.cs
index c0e46ba245..8d59eef9f1 100644
--- a/MediaBrowser.Controller/LiveTv/ILiveTvManager.cs
+++ b/MediaBrowser.Controller/LiveTv/ILiveTvManager.cs
@@ -6,8 +6,8 @@ using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
-using Jellyfin.Data.Entities;
using Jellyfin.Data.Events;
+using Jellyfin.Database.Implementations.Entities;
using MediaBrowser.Controller.Dto;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Model.Dto;
diff --git a/MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs b/MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs
index a9e419df46..cf76f336c8 100644
--- a/MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs
+++ b/MediaBrowser.Controller/MediaEncoding/EncodingHelper.cs
@@ -13,7 +13,9 @@ using System.Runtime.InteropServices;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
+using Jellyfin.Data;
using Jellyfin.Data.Enums;
+using Jellyfin.Database.Implementations.Enums;
using Jellyfin.Extensions;
using MediaBrowser.Common.Configuration;
using MediaBrowser.Controller.Extensions;
diff --git a/MediaBrowser.Controller/MediaEncoding/EncodingJobInfo.cs b/MediaBrowser.Controller/MediaEncoding/EncodingJobInfo.cs
index caa312987d..7586ac9024 100644
--- a/MediaBrowser.Controller/MediaEncoding/EncodingJobInfo.cs
+++ b/MediaBrowser.Controller/MediaEncoding/EncodingJobInfo.cs
@@ -6,8 +6,8 @@ using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
-using Jellyfin.Data.Entities;
using Jellyfin.Data.Enums;
+using Jellyfin.Database.Implementations.Entities;
using MediaBrowser.Model.Dlna;
using MediaBrowser.Model.Drawing;
using MediaBrowser.Model.Dto;
diff --git a/MediaBrowser.Controller/MediaSegments/IMediaSegmentManager.cs b/MediaBrowser.Controller/MediaSegments/IMediaSegmentManager.cs
index 570d2bacea..456977b88e 100644
--- a/MediaBrowser.Controller/MediaSegments/IMediaSegmentManager.cs
+++ b/MediaBrowser.Controller/MediaSegments/IMediaSegmentManager.cs
@@ -2,8 +2,8 @@ using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
-using Jellyfin.Data.Entities;
-using Jellyfin.Data.Enums;
+using Jellyfin.Database.Implementations.Entities;
+using Jellyfin.Database.Implementations.Enums;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Model.MediaSegments;
diff --git a/MediaBrowser.Controller/Net/AuthorizationInfo.cs b/MediaBrowser.Controller/Net/AuthorizationInfo.cs
index e452f26494..dd5eb9a01d 100644
--- a/MediaBrowser.Controller/Net/AuthorizationInfo.cs
+++ b/MediaBrowser.Controller/Net/AuthorizationInfo.cs
@@ -1,6 +1,6 @@
using System;
using System.Diagnostics.CodeAnalysis;
-using Jellyfin.Data.Entities;
+using Jellyfin.Database.Implementations.Entities;
namespace MediaBrowser.Controller.Net
{
diff --git a/MediaBrowser.Controller/Playlists/Playlist.cs b/MediaBrowser.Controller/Playlists/Playlist.cs
index edea54291d..1062399e3f 100644
--- a/MediaBrowser.Controller/Playlists/Playlist.cs
+++ b/MediaBrowser.Controller/Playlists/Playlist.cs
@@ -9,8 +9,10 @@ using System.Linq;
using System.Text.Json.Serialization;
using System.Threading;
using System.Threading.Tasks;
-using Jellyfin.Data.Entities;
+using Jellyfin.Data;
using Jellyfin.Data.Enums;
+using Jellyfin.Database.Implementations.Entities;
+using Jellyfin.Database.Implementations.Enums;
using MediaBrowser.Controller.Dto;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.Audio;
diff --git a/MediaBrowser.Controller/Session/ISessionManager.cs b/MediaBrowser.Controller/Session/ISessionManager.cs
index 5dd0413b4d..21131e6b5e 100644
--- a/MediaBrowser.Controller/Session/ISessionManager.cs
+++ b/MediaBrowser.Controller/Session/ISessionManager.cs
@@ -6,7 +6,8 @@ using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
-using Jellyfin.Data.Entities.Security;
+using Jellyfin.Database.Implementations.Entities;
+using Jellyfin.Database.Implementations.Entities.Security;
using MediaBrowser.Controller.Authentication;
using MediaBrowser.Controller.Library;
using MediaBrowser.Model.Dto;
@@ -73,7 +74,7 @@ namespace MediaBrowser.Controller.Session
/// The remote end point.
/// The user.
/// A task containing the session information.
- Task LogSessionActivity(string appName, string appVersion, string deviceId, string deviceName, string remoteEndPoint, Jellyfin.Data.Entities.User user);
+ Task LogSessionActivity(string appName, string appVersion, string deviceId, string deviceName, string remoteEndPoint, User user);
///
/// Used to report that a session controller has connected.
diff --git a/MediaBrowser.Controller/Sorting/IUserBaseItemComparer.cs b/MediaBrowser.Controller/Sorting/IUserBaseItemComparer.cs
index 66a0c52547..97f653edf5 100644
--- a/MediaBrowser.Controller/Sorting/IUserBaseItemComparer.cs
+++ b/MediaBrowser.Controller/Sorting/IUserBaseItemComparer.cs
@@ -1,5 +1,6 @@
#nullable disable
+using Jellyfin.Database.Implementations.Entities;
using MediaBrowser.Controller.Library;
namespace MediaBrowser.Controller.Sorting
@@ -13,7 +14,7 @@ namespace MediaBrowser.Controller.Sorting
/// Gets or sets the user.
///
/// The user.
- Jellyfin.Data.Entities.User User { get; set; }
+ User User { get; set; }
///
/// Gets or sets the user manager.
diff --git a/MediaBrowser.Controller/Trickplay/ITrickplayManager.cs b/MediaBrowser.Controller/Trickplay/ITrickplayManager.cs
index 800317800d..9ac8ead11c 100644
--- a/MediaBrowser.Controller/Trickplay/ITrickplayManager.cs
+++ b/MediaBrowser.Controller/Trickplay/ITrickplayManager.cs
@@ -2,7 +2,7 @@ using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
-using Jellyfin.Data.Entities;
+using Jellyfin.Database.Implementations.Entities;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Model.Configuration;
diff --git a/MediaBrowser.MediaEncoding/Transcoding/TranscodeManager.cs b/MediaBrowser.MediaEncoding/Transcoding/TranscodeManager.cs
index 57557d55ca..85bb862c77 100644
--- a/MediaBrowser.MediaEncoding/Transcoding/TranscodeManager.cs
+++ b/MediaBrowser.MediaEncoding/Transcoding/TranscodeManager.cs
@@ -10,7 +10,8 @@ using System.Text.Json;
using System.Threading;
using System.Threading.Tasks;
using AsyncKeyedLock;
-using Jellyfin.Data.Enums;
+using Jellyfin.Data;
+using Jellyfin.Database.Implementations.Enums;
using Jellyfin.Extensions;
using MediaBrowser.Common;
using MediaBrowser.Common.Configuration;
diff --git a/MediaBrowser.Model/Activity/IActivityManager.cs b/MediaBrowser.Model/Activity/IActivityManager.cs
index 28073fb8d7..95aa567ada 100644
--- a/MediaBrowser.Model/Activity/IActivityManager.cs
+++ b/MediaBrowser.Model/Activity/IActivityManager.cs
@@ -2,9 +2,9 @@
using System;
using System.Threading.Tasks;
-using Jellyfin.Data.Entities;
using Jellyfin.Data.Events;
using Jellyfin.Data.Queries;
+using Jellyfin.Database.Implementations.Entities;
using MediaBrowser.Model.Querying;
namespace MediaBrowser.Model.Activity
diff --git a/MediaBrowser.Model/Configuration/UserConfiguration.cs b/MediaBrowser.Model/Configuration/UserConfiguration.cs
index b477f2593a..fe4b2de65f 100644
--- a/MediaBrowser.Model/Configuration/UserConfiguration.cs
+++ b/MediaBrowser.Model/Configuration/UserConfiguration.cs
@@ -1,7 +1,7 @@
#pragma warning disable CS1591
using System;
-using Jellyfin.Data.Enums;
+using Jellyfin.Database.Implementations.Enums;
namespace MediaBrowser.Model.Configuration
{
diff --git a/MediaBrowser.Model/Dto/BaseItemDto.cs b/MediaBrowser.Model/Dto/BaseItemDto.cs
index 7e8949e1fb..7bfd8ca29c 100644
--- a/MediaBrowser.Model/Dto/BaseItemDto.cs
+++ b/MediaBrowser.Model/Dto/BaseItemDto.cs
@@ -3,8 +3,8 @@
using System;
using System.Collections.Generic;
-using Jellyfin.Data.Entities;
using Jellyfin.Data.Enums;
+using Jellyfin.Database.Implementations.Entities;
using MediaBrowser.Model.Drawing;
using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Library;
diff --git a/MediaBrowser.Model/Dto/DisplayPreferencesDto.cs b/MediaBrowser.Model/Dto/DisplayPreferencesDto.cs
index 90163ae91f..54cbe65f68 100644
--- a/MediaBrowser.Model/Dto/DisplayPreferencesDto.cs
+++ b/MediaBrowser.Model/Dto/DisplayPreferencesDto.cs
@@ -1,5 +1,5 @@
using System.Collections.Generic;
-using Jellyfin.Data.Enums;
+using Jellyfin.Database.Implementations.Enums;
namespace MediaBrowser.Model.Dto
{
diff --git a/MediaBrowser.Model/Library/UserViewQuery.cs b/MediaBrowser.Model/Library/UserViewQuery.cs
index 643a1f9b13..01d5e3b6ca 100644
--- a/MediaBrowser.Model/Library/UserViewQuery.cs
+++ b/MediaBrowser.Model/Library/UserViewQuery.cs
@@ -1,8 +1,8 @@
#pragma warning disable CS1591
using System;
-using Jellyfin.Data.Entities;
using Jellyfin.Data.Enums;
+using Jellyfin.Database.Implementations.Entities;
namespace MediaBrowser.Model.Library
{
diff --git a/MediaBrowser.Model/LiveTv/LiveTvChannelQuery.cs b/MediaBrowser.Model/LiveTv/LiveTvChannelQuery.cs
index d872572b77..38e2731762 100644
--- a/MediaBrowser.Model/LiveTv/LiveTvChannelQuery.cs
+++ b/MediaBrowser.Model/LiveTv/LiveTvChannelQuery.cs
@@ -3,6 +3,7 @@
using System;
using Jellyfin.Data.Enums;
+using Jellyfin.Database.Implementations.Enums;
namespace MediaBrowser.Model.LiveTv
{
diff --git a/MediaBrowser.Model/LiveTv/SeriesTimerQuery.cs b/MediaBrowser.Model/LiveTv/SeriesTimerQuery.cs
index dae885775c..e93ad81d3a 100644
--- a/MediaBrowser.Model/LiveTv/SeriesTimerQuery.cs
+++ b/MediaBrowser.Model/LiveTv/SeriesTimerQuery.cs
@@ -1,6 +1,6 @@
#pragma warning disable CS1591
-using Jellyfin.Data.Enums;
+using Jellyfin.Database.Implementations.Enums;
namespace MediaBrowser.Model.LiveTv
{
diff --git a/MediaBrowser.Model/MediaSegments/MediaSegmentDto.cs b/MediaBrowser.Model/MediaSegments/MediaSegmentDto.cs
index a0433fee18..6e5c7885cc 100644
--- a/MediaBrowser.Model/MediaSegments/MediaSegmentDto.cs
+++ b/MediaBrowser.Model/MediaSegments/MediaSegmentDto.cs
@@ -1,5 +1,5 @@
using System;
-using Jellyfin.Data.Enums;
+using Jellyfin.Database.Implementations.Enums;
namespace MediaBrowser.Model.MediaSegments;
diff --git a/MediaBrowser.Model/Querying/LatestItemsQuery.cs b/MediaBrowser.Model/Querying/LatestItemsQuery.cs
index 251ff5d681..40dc813978 100644
--- a/MediaBrowser.Model/Querying/LatestItemsQuery.cs
+++ b/MediaBrowser.Model/Querying/LatestItemsQuery.cs
@@ -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.Model.Entities;
namespace MediaBrowser.Model.Querying
diff --git a/MediaBrowser.Model/Querying/NextUpQuery.cs b/MediaBrowser.Model/Querying/NextUpQuery.cs
index aee720aa7b..a2a3a9d1bb 100644
--- a/MediaBrowser.Model/Querying/NextUpQuery.cs
+++ b/MediaBrowser.Model/Querying/NextUpQuery.cs
@@ -1,7 +1,7 @@
#pragma warning disable CS1591
using System;
-using Jellyfin.Data.Entities;
+using Jellyfin.Database.Implementations.Entities;
using MediaBrowser.Model.Entities;
namespace MediaBrowser.Model.Querying;
diff --git a/MediaBrowser.Model/Users/UserPolicy.cs b/MediaBrowser.Model/Users/UserPolicy.cs
index 951e057632..3d430e1015 100644
--- a/MediaBrowser.Model/Users/UserPolicy.cs
+++ b/MediaBrowser.Model/Users/UserPolicy.cs
@@ -6,7 +6,8 @@ using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Xml.Serialization;
using Jellyfin.Data.Enums;
-using AccessSchedule = Jellyfin.Data.Entities.AccessSchedule;
+using Jellyfin.Database.Implementations.Enums;
+using AccessSchedule = Jellyfin.Database.Implementations.Entities.AccessSchedule;
namespace MediaBrowser.Model.Users
{
diff --git a/src/Jellyfin.Database/Jellyfin.Database.Implementations/DbConfiguration/DatabaseConfigurationOptions.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/DbConfiguration/DatabaseConfigurationOptions.cs
new file mode 100644
index 0000000000..b481a106fd
--- /dev/null
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/DbConfiguration/DatabaseConfigurationOptions.cs
@@ -0,0 +1,12 @@
+namespace Jellyfin.Database.Implementations.DbConfiguration;
+
+///
+/// Options to configure jellyfins managed database.
+///
+public class DatabaseConfigurationOptions
+{
+ ///
+ /// Gets or Sets the type of database jellyfin should use.
+ ///
+ public required string DatabaseType { get; set; }
+}
diff --git a/Jellyfin.Data/Entities/AccessSchedule.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/AccessSchedule.cs
similarity index 94%
rename from Jellyfin.Data/Entities/AccessSchedule.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/AccessSchedule.cs
index f534e49f3f..e23ac86aaa 100644
--- a/Jellyfin.Data/Entities/AccessSchedule.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/AccessSchedule.cs
@@ -1,9 +1,9 @@
using System;
using System.ComponentModel.DataAnnotations.Schema;
using System.Xml.Serialization;
-using Jellyfin.Data.Enums;
+using Jellyfin.Database.Implementations.Enums;
-namespace Jellyfin.Data.Entities
+namespace Jellyfin.Database.Implementations.Entities
{
///
/// An entity representing a user's access schedule.
diff --git a/Jellyfin.Data/Entities/ActivityLog.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/ActivityLog.cs
similarity index 97%
rename from Jellyfin.Data/Entities/ActivityLog.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/ActivityLog.cs
index 51dd0ffb8e..bf623be7ed 100644
--- a/Jellyfin.Data/Entities/ActivityLog.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/ActivityLog.cs
@@ -1,10 +1,10 @@
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
-using Jellyfin.Data.Interfaces;
+using Jellyfin.Database.Implementations.Interfaces;
using Microsoft.Extensions.Logging;
-namespace Jellyfin.Data.Entities
+namespace Jellyfin.Database.Implementations.Entities
{
///
/// An entity referencing an activity log entry.
diff --git a/Jellyfin.Data/Entities/AncestorId.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/AncestorId.cs
similarity index 92%
rename from Jellyfin.Data/Entities/AncestorId.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/AncestorId.cs
index 954416dfe1..3d25ae4f45 100644
--- a/Jellyfin.Data/Entities/AncestorId.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/AncestorId.cs
@@ -1,6 +1,6 @@
using System;
-namespace Jellyfin.Data.Entities;
+namespace Jellyfin.Database.Implementations.Entities;
///
/// Represents the relational information for an .
diff --git a/Jellyfin.Data/Entities/AttachmentStreamInfo.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/AttachmentStreamInfo.cs
similarity index 95%
rename from Jellyfin.Data/Entities/AttachmentStreamInfo.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/AttachmentStreamInfo.cs
index 19265a0115..aab3082b37 100644
--- a/Jellyfin.Data/Entities/AttachmentStreamInfo.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/AttachmentStreamInfo.cs
@@ -1,6 +1,6 @@
using System;
-namespace Jellyfin.Data.Entities;
+namespace Jellyfin.Database.Implementations.Entities;
///
/// Provides information about an Attachment to an .
diff --git a/Jellyfin.Data/Entities/BaseItemEntity.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/BaseItemEntity.cs
similarity index 97%
rename from Jellyfin.Data/Entities/BaseItemEntity.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/BaseItemEntity.cs
index e3e0e0861e..fc9695a091 100644
--- a/Jellyfin.Data/Entities/BaseItemEntity.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/BaseItemEntity.cs
@@ -3,10 +3,8 @@
using System;
using System.Collections.Generic;
-using System.ComponentModel.DataAnnotations;
-using System.ComponentModel.DataAnnotations.Schema;
-namespace Jellyfin.Data.Entities;
+namespace Jellyfin.Database.Implementations.Entities;
public class BaseItemEntity
{
diff --git a/Jellyfin.Data/Entities/BaseItemExtraType.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/BaseItemExtraType.cs
similarity index 84%
rename from Jellyfin.Data/Entities/BaseItemExtraType.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/BaseItemExtraType.cs
index 54aef50e40..46a59f7903 100644
--- a/Jellyfin.Data/Entities/BaseItemExtraType.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/BaseItemExtraType.cs
@@ -1,5 +1,5 @@
#pragma warning disable CS1591
-namespace Jellyfin.Data.Entities;
+namespace Jellyfin.Database.Implementations.Entities;
public enum BaseItemExtraType
{
diff --git a/Jellyfin.Data/Entities/BaseItemImageInfo.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/BaseItemImageInfo.cs
similarity index 95%
rename from Jellyfin.Data/Entities/BaseItemImageInfo.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/BaseItemImageInfo.cs
index 37723df116..71d60fc25d 100644
--- a/Jellyfin.Data/Entities/BaseItemImageInfo.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/BaseItemImageInfo.cs
@@ -1,9 +1,8 @@
#pragma warning disable CA2227
using System;
-using System.Collections.Generic;
-namespace Jellyfin.Data.Entities;
+namespace Jellyfin.Database.Implementations.Entities;
///
/// Enum TrailerTypes.
diff --git a/Jellyfin.Data/Entities/BaseItemMetadataField.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/BaseItemMetadataField.cs
similarity index 91%
rename from Jellyfin.Data/Entities/BaseItemMetadataField.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/BaseItemMetadataField.cs
index 27bbfc4731..e7dbc8e9fd 100644
--- a/Jellyfin.Data/Entities/BaseItemMetadataField.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/BaseItemMetadataField.cs
@@ -1,6 +1,6 @@
using System;
-namespace Jellyfin.Data.Entities;
+namespace Jellyfin.Database.Implementations.Entities;
///
/// Enum MetadataFields.
diff --git a/Jellyfin.Data/Entities/BaseItemProvider.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/BaseItemProvider.cs
similarity index 79%
rename from Jellyfin.Data/Entities/BaseItemProvider.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/BaseItemProvider.cs
index 9a1565728d..73bb583e31 100644
--- a/Jellyfin.Data/Entities/BaseItemProvider.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/BaseItemProvider.cs
@@ -1,9 +1,6 @@
using System;
-using System.Collections.Generic;
-using System.ComponentModel.DataAnnotations;
-using System.ComponentModel.DataAnnotations.Schema;
-namespace Jellyfin.Data.Entities;
+namespace Jellyfin.Database.Implementations.Entities;
///
/// Represents a Key-Value relation of an BaseItem's provider.
diff --git a/Jellyfin.Data/Entities/BaseItemTrailerType.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/BaseItemTrailerType.cs
similarity index 90%
rename from Jellyfin.Data/Entities/BaseItemTrailerType.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/BaseItemTrailerType.cs
index 2bb648138a..db329ad2af 100644
--- a/Jellyfin.Data/Entities/BaseItemTrailerType.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/BaseItemTrailerType.cs
@@ -1,6 +1,6 @@
using System;
-namespace Jellyfin.Data.Entities;
+namespace Jellyfin.Database.Implementations.Entities;
///
/// Enum TrailerTypes.
diff --git a/Jellyfin.Data/Entities/Chapter.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Chapter.cs
similarity index 95%
rename from Jellyfin.Data/Entities/Chapter.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Chapter.cs
index 579442cdb6..f9b9813281 100644
--- a/Jellyfin.Data/Entities/Chapter.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Chapter.cs
@@ -1,6 +1,6 @@
using System;
-namespace Jellyfin.Data.Entities;
+namespace Jellyfin.Database.Implementations.Entities;
///
/// The Chapter entity.
diff --git a/Jellyfin.Data/Entities/CustomItemDisplayPreferences.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/CustomItemDisplayPreferences.cs
similarity index 97%
rename from Jellyfin.Data/Entities/CustomItemDisplayPreferences.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/CustomItemDisplayPreferences.cs
index a606595122..b3d4b16bc6 100644
--- a/Jellyfin.Data/Entities/CustomItemDisplayPreferences.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/CustomItemDisplayPreferences.cs
@@ -2,7 +2,7 @@ using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
-namespace Jellyfin.Data.Entities
+namespace Jellyfin.Database.Implementations.Entities
{
///
/// An entity that represents a user's custom display preferences for a specific item.
diff --git a/Jellyfin.Data/Entities/DisplayPreferences.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/DisplayPreferences.cs
similarity index 97%
rename from Jellyfin.Data/Entities/DisplayPreferences.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/DisplayPreferences.cs
index f0be657691..ae6966e594 100644
--- a/Jellyfin.Data/Entities/DisplayPreferences.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/DisplayPreferences.cs
@@ -2,9 +2,9 @@ using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
-using Jellyfin.Data.Enums;
+using Jellyfin.Database.Implementations.Enums;
-namespace Jellyfin.Data.Entities
+namespace Jellyfin.Database.Implementations.Entities
{
///
/// An entity representing a user's display preferences.
diff --git a/Jellyfin.Data/Entities/Group.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Group.cs
similarity index 79%
rename from Jellyfin.Data/Entities/Group.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Group.cs
index 1be6f986a1..9dd2486464 100644
--- a/Jellyfin.Data/Entities/Group.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Group.cs
@@ -1,11 +1,9 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
-using System.Linq;
-using Jellyfin.Data.Enums;
-using Jellyfin.Data.Interfaces;
+using Jellyfin.Database.Implementations.Interfaces;
-namespace Jellyfin.Data.Entities
+namespace Jellyfin.Database.Implementations.Entities
{
///
/// An entity representing a group.
@@ -59,18 +57,6 @@ namespace Jellyfin.Data.Entities
///
public virtual ICollection Preferences { get; private set; }
- ///
- public bool HasPermission(PermissionKind kind)
- {
- return Permissions.First(p => p.Kind == kind).Value;
- }
-
- ///
- public void SetPermission(PermissionKind kind, bool value)
- {
- Permissions.First(p => p.Kind == kind).Value = value;
- }
-
///
public void OnSavingChanges()
{
diff --git a/Jellyfin.Data/Entities/HomeSection.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/HomeSection.cs
similarity index 91%
rename from Jellyfin.Data/Entities/HomeSection.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/HomeSection.cs
index 8dd6e647e2..584550ac56 100644
--- a/Jellyfin.Data/Entities/HomeSection.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/HomeSection.cs
@@ -1,7 +1,7 @@
using System.ComponentModel.DataAnnotations.Schema;
-using Jellyfin.Data.Enums;
+using Jellyfin.Database.Implementations.Enums;
-namespace Jellyfin.Data.Entities
+namespace Jellyfin.Database.Implementations.Entities
{
///
/// An entity representing a section on the user's home page.
diff --git a/Jellyfin.Data/Entities/ImageInfo.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/ImageInfo.cs
similarity index 96%
rename from Jellyfin.Data/Entities/ImageInfo.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/ImageInfo.cs
index 935a53a263..9c0b36852e 100644
--- a/Jellyfin.Data/Entities/ImageInfo.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/ImageInfo.cs
@@ -2,7 +2,7 @@ using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
-namespace Jellyfin.Data.Entities
+namespace Jellyfin.Database.Implementations.Entities
{
///
/// An entity representing an image.
diff --git a/Jellyfin.Data/Entities/ImageInfoImageType.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/ImageInfoImageType.cs
similarity index 95%
rename from Jellyfin.Data/Entities/ImageInfoImageType.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/ImageInfoImageType.cs
index f78178dd22..6052a95bb2 100644
--- a/Jellyfin.Data/Entities/ImageInfoImageType.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/ImageInfoImageType.cs
@@ -1,4 +1,4 @@
-namespace Jellyfin.Data.Entities;
+namespace Jellyfin.Database.Implementations.Entities;
///
/// Enum ImageType.
diff --git a/Jellyfin.Data/Entities/ItemDisplayPreferences.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/ItemDisplayPreferences.cs
similarity index 96%
rename from Jellyfin.Data/Entities/ItemDisplayPreferences.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/ItemDisplayPreferences.cs
index 93e6664ea4..6770531143 100644
--- a/Jellyfin.Data/Entities/ItemDisplayPreferences.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/ItemDisplayPreferences.cs
@@ -1,9 +1,9 @@
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
-using Jellyfin.Data.Enums;
+using Jellyfin.Database.Implementations.Enums;
-namespace Jellyfin.Data.Entities
+namespace Jellyfin.Database.Implementations.Entities
{
///
/// An entity that represents a user's display preferences for a specific item.
diff --git a/Jellyfin.Data/Entities/ItemValue.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/ItemValue.cs
similarity index 94%
rename from Jellyfin.Data/Entities/ItemValue.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/ItemValue.cs
index 11d8e383ee..b5a31921d8 100644
--- a/Jellyfin.Data/Entities/ItemValue.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/ItemValue.cs
@@ -1,7 +1,7 @@
using System;
using System.Collections.Generic;
-namespace Jellyfin.Data.Entities;
+namespace Jellyfin.Database.Implementations.Entities;
///
/// Represents an ItemValue for a BaseItem.
diff --git a/Jellyfin.Data/Entities/ItemValueMap.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/ItemValueMap.cs
similarity index 90%
rename from Jellyfin.Data/Entities/ItemValueMap.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/ItemValueMap.cs
index 94db6a011b..23f6e0f7bc 100644
--- a/Jellyfin.Data/Entities/ItemValueMap.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/ItemValueMap.cs
@@ -1,7 +1,6 @@
using System;
-using System.Collections.Generic;
-namespace Jellyfin.Data.Entities;
+namespace Jellyfin.Database.Implementations.Entities;
///
/// Mapping table for the ItemValue BaseItem relation.
diff --git a/Jellyfin.Data/Entities/ItemValueType.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/ItemValueType.cs
similarity index 91%
rename from Jellyfin.Data/Entities/ItemValueType.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/ItemValueType.cs
index 3bae3beccd..9e2e11c006 100644
--- a/Jellyfin.Data/Entities/ItemValueType.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/ItemValueType.cs
@@ -1,5 +1,5 @@
#pragma warning disable CA1027 // Mark enums with FlagsAttribute
-namespace Jellyfin.Data.Entities;
+namespace Jellyfin.Database.Implementations.Entities;
///
/// Provides the Value types for an .
diff --git a/Jellyfin.Data/Entities/Libraries/Artwork.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/Artwork.cs
similarity index 90%
rename from Jellyfin.Data/Entities/Libraries/Artwork.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/Artwork.cs
index fc3c1036f0..f3083a96ba 100644
--- a/Jellyfin.Data/Entities/Libraries/Artwork.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/Artwork.cs
@@ -1,10 +1,10 @@
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
-using Jellyfin.Data.Enums;
-using Jellyfin.Data.Interfaces;
+using Jellyfin.Database.Implementations.Enums;
+using Jellyfin.Database.Implementations.Interfaces;
-namespace Jellyfin.Data.Entities.Libraries
+namespace Jellyfin.Database.Implementations.Entities.Libraries
{
///
/// An entity representing artwork.
diff --git a/Jellyfin.Data/Entities/Libraries/Book.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/Book.cs
similarity index 87%
rename from Jellyfin.Data/Entities/Libraries/Book.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/Book.cs
index a838686d05..b56c1f9403 100644
--- a/Jellyfin.Data/Entities/Libraries/Book.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/Book.cs
@@ -1,7 +1,7 @@
using System.Collections.Generic;
-using Jellyfin.Data.Interfaces;
+using Jellyfin.Database.Implementations.Interfaces;
-namespace Jellyfin.Data.Entities.Libraries
+namespace Jellyfin.Database.Implementations.Entities.Libraries
{
///
/// An entity representing a book.
diff --git a/Jellyfin.Data/Entities/Libraries/BookMetadata.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/BookMetadata.cs
similarity index 89%
rename from Jellyfin.Data/Entities/Libraries/BookMetadata.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/BookMetadata.cs
index 4a350d200e..a284d563a3 100644
--- a/Jellyfin.Data/Entities/Libraries/BookMetadata.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/BookMetadata.cs
@@ -1,7 +1,7 @@
using System.Collections.Generic;
-using Jellyfin.Data.Interfaces;
+using Jellyfin.Database.Implementations.Interfaces;
-namespace Jellyfin.Data.Entities.Libraries
+namespace Jellyfin.Database.Implementations.Entities.Libraries
{
///
/// An entity containing metadata for a book.
diff --git a/Jellyfin.Data/Entities/Libraries/Chapter.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/Chapter.cs
similarity index 94%
rename from Jellyfin.Data/Entities/Libraries/Chapter.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/Chapter.cs
index f068338f92..eac973060e 100644
--- a/Jellyfin.Data/Entities/Libraries/Chapter.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/Chapter.cs
@@ -1,9 +1,9 @@
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
-using Jellyfin.Data.Interfaces;
+using Jellyfin.Database.Implementations.Interfaces;
-namespace Jellyfin.Data.Entities.Libraries
+namespace Jellyfin.Database.Implementations.Entities.Libraries
{
///
/// An entity representing a chapter.
diff --git a/Jellyfin.Data/Entities/Libraries/Collection.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/Collection.cs
similarity index 92%
rename from Jellyfin.Data/Entities/Libraries/Collection.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/Collection.cs
index 7de6019692..03b68317a6 100644
--- a/Jellyfin.Data/Entities/Libraries/Collection.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/Collection.cs
@@ -3,9 +3,9 @@
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
-using Jellyfin.Data.Interfaces;
+using Jellyfin.Database.Implementations.Interfaces;
-namespace Jellyfin.Data.Entities.Libraries
+namespace Jellyfin.Database.Implementations.Entities.Libraries
{
///
/// An entity representing a collection.
diff --git a/Jellyfin.Data/Entities/Libraries/CollectionItem.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/CollectionItem.cs
similarity index 94%
rename from Jellyfin.Data/Entities/Libraries/CollectionItem.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/CollectionItem.cs
index 15b356a74e..3777c705b8 100644
--- a/Jellyfin.Data/Entities/Libraries/CollectionItem.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/CollectionItem.cs
@@ -1,8 +1,8 @@
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
-using Jellyfin.Data.Interfaces;
+using Jellyfin.Database.Implementations.Interfaces;
-namespace Jellyfin.Data.Entities.Libraries
+namespace Jellyfin.Database.Implementations.Entities.Libraries
{
///
/// An entity representing a collection item.
diff --git a/Jellyfin.Data/Entities/Libraries/Company.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/Company.cs
similarity index 93%
rename from Jellyfin.Data/Entities/Libraries/Company.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/Company.cs
index 1abbee4458..c686751ab7 100644
--- a/Jellyfin.Data/Entities/Libraries/Company.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/Company.cs
@@ -1,9 +1,9 @@
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
-using Jellyfin.Data.Interfaces;
+using Jellyfin.Database.Implementations.Interfaces;
-namespace Jellyfin.Data.Entities.Libraries
+namespace Jellyfin.Database.Implementations.Entities.Libraries
{
///
/// An entity representing a company.
diff --git a/Jellyfin.Data/Entities/Libraries/CompanyMetadata.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/CompanyMetadata.cs
similarity index 96%
rename from Jellyfin.Data/Entities/Libraries/CompanyMetadata.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/CompanyMetadata.cs
index a29f08c7f6..fdf1f274fb 100644
--- a/Jellyfin.Data/Entities/Libraries/CompanyMetadata.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/CompanyMetadata.cs
@@ -1,6 +1,6 @@
using System.ComponentModel.DataAnnotations;
-namespace Jellyfin.Data.Entities.Libraries
+namespace Jellyfin.Database.Implementations.Entities.Libraries
{
///
/// An entity holding metadata for a .
diff --git a/Jellyfin.Data/Entities/Libraries/CustomItem.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/CustomItem.cs
similarity index 88%
rename from Jellyfin.Data/Entities/Libraries/CustomItem.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/CustomItem.cs
index e27d01d860..70e47d6bc6 100644
--- a/Jellyfin.Data/Entities/Libraries/CustomItem.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/CustomItem.cs
@@ -1,7 +1,7 @@
using System.Collections.Generic;
-using Jellyfin.Data.Interfaces;
+using Jellyfin.Database.Implementations.Interfaces;
-namespace Jellyfin.Data.Entities.Libraries
+namespace Jellyfin.Database.Implementations.Entities.Libraries
{
///
/// An entity representing a custom item.
diff --git a/Jellyfin.Data/Entities/Libraries/CustomItemMetadata.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/CustomItemMetadata.cs
similarity index 89%
rename from Jellyfin.Data/Entities/Libraries/CustomItemMetadata.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/CustomItemMetadata.cs
index af2393870f..660e535e3a 100644
--- a/Jellyfin.Data/Entities/Libraries/CustomItemMetadata.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/CustomItemMetadata.cs
@@ -1,4 +1,4 @@
-namespace Jellyfin.Data.Entities.Libraries
+namespace Jellyfin.Database.Implementations.Entities.Libraries
{
///
/// An entity containing metadata for a custom item.
diff --git a/Jellyfin.Data/Entities/Libraries/Episode.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/Episode.cs
similarity index 89%
rename from Jellyfin.Data/Entities/Libraries/Episode.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/Episode.cs
index ce2f0c6178..7cb71f06d9 100644
--- a/Jellyfin.Data/Entities/Libraries/Episode.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/Episode.cs
@@ -1,7 +1,7 @@
using System.Collections.Generic;
-using Jellyfin.Data.Interfaces;
+using Jellyfin.Database.Implementations.Interfaces;
-namespace Jellyfin.Data.Entities.Libraries
+namespace Jellyfin.Database.Implementations.Entities.Libraries
{
///
/// An entity representing an episode.
diff --git a/Jellyfin.Data/Entities/Libraries/EpisodeMetadata.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/EpisodeMetadata.cs
similarity index 95%
rename from Jellyfin.Data/Entities/Libraries/EpisodeMetadata.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/EpisodeMetadata.cs
index b0ef11e0f2..b5c2c3c2a3 100644
--- a/Jellyfin.Data/Entities/Libraries/EpisodeMetadata.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/EpisodeMetadata.cs
@@ -1,6 +1,6 @@
using System.ComponentModel.DataAnnotations;
-namespace Jellyfin.Data.Entities.Libraries
+namespace Jellyfin.Database.Implementations.Entities.Libraries
{
///
/// An entity containing metadata for an .
diff --git a/Jellyfin.Data/Entities/Libraries/Genre.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/Genre.cs
similarity index 91%
rename from Jellyfin.Data/Entities/Libraries/Genre.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/Genre.cs
index 3b822ee828..442dced2f4 100644
--- a/Jellyfin.Data/Entities/Libraries/Genre.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/Genre.cs
@@ -1,8 +1,8 @@
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
-using Jellyfin.Data.Interfaces;
+using Jellyfin.Database.Implementations.Interfaces;
-namespace Jellyfin.Data.Entities.Libraries
+namespace Jellyfin.Database.Implementations.Entities.Libraries
{
///
/// An entity representing a genre.
diff --git a/Jellyfin.Data/Entities/Libraries/ItemMetadata.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/ItemMetadata.cs
similarity index 97%
rename from Jellyfin.Data/Entities/Libraries/ItemMetadata.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/ItemMetadata.cs
index fa9276c669..e5cbab7e45 100644
--- a/Jellyfin.Data/Entities/Libraries/ItemMetadata.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/ItemMetadata.cs
@@ -2,9 +2,9 @@ using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
-using Jellyfin.Data.Interfaces;
+using Jellyfin.Database.Implementations.Interfaces;
-namespace Jellyfin.Data.Entities.Libraries
+namespace Jellyfin.Database.Implementations.Entities.Libraries
{
///
/// An abstract class that holds metadata.
diff --git a/Jellyfin.Data/Entities/Libraries/Library.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/Library.cs
similarity index 93%
rename from Jellyfin.Data/Entities/Libraries/Library.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/Library.cs
index 0db42a1c7b..d1877ef438 100644
--- a/Jellyfin.Data/Entities/Libraries/Library.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/Library.cs
@@ -1,8 +1,8 @@
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
-using Jellyfin.Data.Interfaces;
+using Jellyfin.Database.Implementations.Interfaces;
-namespace Jellyfin.Data.Entities.Libraries
+namespace Jellyfin.Database.Implementations.Entities.Libraries
{
///
/// An entity representing a library.
diff --git a/Jellyfin.Data/Entities/Libraries/LibraryItem.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/LibraryItem.cs
similarity index 92%
rename from Jellyfin.Data/Entities/Libraries/LibraryItem.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/LibraryItem.cs
index d889b871ed..4fccf6d731 100644
--- a/Jellyfin.Data/Entities/Libraries/LibraryItem.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/LibraryItem.cs
@@ -1,9 +1,9 @@
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
-using Jellyfin.Data.Interfaces;
+using Jellyfin.Database.Implementations.Interfaces;
-namespace Jellyfin.Data.Entities.Libraries
+namespace Jellyfin.Database.Implementations.Entities.Libraries
{
///
/// An entity representing a library item.
diff --git a/Jellyfin.Data/Entities/Libraries/MediaFile.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/MediaFile.cs
similarity index 92%
rename from Jellyfin.Data/Entities/Libraries/MediaFile.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/MediaFile.cs
index 7b5a3af64c..6e435579c7 100644
--- a/Jellyfin.Data/Entities/Libraries/MediaFile.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/MediaFile.cs
@@ -2,10 +2,10 @@ using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
-using Jellyfin.Data.Enums;
-using Jellyfin.Data.Interfaces;
+using Jellyfin.Database.Implementations.Enums;
+using Jellyfin.Database.Implementations.Interfaces;
-namespace Jellyfin.Data.Entities.Libraries
+namespace Jellyfin.Database.Implementations.Entities.Libraries
{
///
/// An entity representing a file on disk.
diff --git a/Jellyfin.Data/Entities/Libraries/MediaFileStream.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/MediaFileStream.cs
similarity index 92%
rename from Jellyfin.Data/Entities/Libraries/MediaFileStream.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/MediaFileStream.cs
index e24e73ecb7..4552386fee 100644
--- a/Jellyfin.Data/Entities/Libraries/MediaFileStream.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/MediaFileStream.cs
@@ -2,9 +2,9 @@
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
-using Jellyfin.Data.Interfaces;
+using Jellyfin.Database.Implementations.Interfaces;
-namespace Jellyfin.Data.Entities.Libraries
+namespace Jellyfin.Database.Implementations.Entities.Libraries
{
///
/// An entity representing a stream in a media file.
diff --git a/Jellyfin.Data/Entities/Libraries/MetadataProvider.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/MetadataProvider.cs
similarity index 92%
rename from Jellyfin.Data/Entities/Libraries/MetadataProvider.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/MetadataProvider.cs
index b38d6a4f1f..dc8f153500 100644
--- a/Jellyfin.Data/Entities/Libraries/MetadataProvider.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/MetadataProvider.cs
@@ -1,9 +1,9 @@
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
-using Jellyfin.Data.Interfaces;
+using Jellyfin.Database.Implementations.Interfaces;
-namespace Jellyfin.Data.Entities.Libraries
+namespace Jellyfin.Database.Implementations.Entities.Libraries
{
///
/// An entity representing a metadata provider.
diff --git a/Jellyfin.Data/Entities/Libraries/MetadataProviderId.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/MetadataProviderId.cs
similarity index 94%
rename from Jellyfin.Data/Entities/Libraries/MetadataProviderId.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/MetadataProviderId.cs
index a198f53ba3..b7c9313a26 100644
--- a/Jellyfin.Data/Entities/Libraries/MetadataProviderId.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/MetadataProviderId.cs
@@ -1,9 +1,9 @@
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
-using Jellyfin.Data.Interfaces;
+using Jellyfin.Database.Implementations.Interfaces;
-namespace Jellyfin.Data.Entities.Libraries
+namespace Jellyfin.Database.Implementations.Entities.Libraries
{
///
/// An entity representing a unique identifier for a metadata provider.
diff --git a/Jellyfin.Data/Entities/Libraries/Movie.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/Movie.cs
similarity index 87%
rename from Jellyfin.Data/Entities/Libraries/Movie.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/Movie.cs
index 499fafd0e1..afc0e0f435 100644
--- a/Jellyfin.Data/Entities/Libraries/Movie.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/Movie.cs
@@ -1,7 +1,7 @@
using System.Collections.Generic;
-using Jellyfin.Data.Interfaces;
+using Jellyfin.Database.Implementations.Interfaces;
-namespace Jellyfin.Data.Entities.Libraries
+namespace Jellyfin.Database.Implementations.Entities.Libraries
{
///
/// An entity representing a movie.
diff --git a/Jellyfin.Data/Entities/Libraries/MovieMetadata.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/MovieMetadata.cs
similarity index 94%
rename from Jellyfin.Data/Entities/Libraries/MovieMetadata.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/MovieMetadata.cs
index 44b5f34d7f..3d797d97e7 100644
--- a/Jellyfin.Data/Entities/Libraries/MovieMetadata.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/MovieMetadata.cs
@@ -1,8 +1,8 @@
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
-using Jellyfin.Data.Interfaces;
+using Jellyfin.Database.Implementations.Interfaces;
-namespace Jellyfin.Data.Entities.Libraries
+namespace Jellyfin.Database.Implementations.Entities.Libraries
{
///
/// An entity holding the metadata for a movie.
diff --git a/Jellyfin.Data/Entities/Libraries/MusicAlbum.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/MusicAlbum.cs
similarity index 93%
rename from Jellyfin.Data/Entities/Libraries/MusicAlbum.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/MusicAlbum.cs
index d6231bbf02..51f77ce0be 100644
--- a/Jellyfin.Data/Entities/Libraries/MusicAlbum.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/MusicAlbum.cs
@@ -1,6 +1,6 @@
using System.Collections.Generic;
-namespace Jellyfin.Data.Entities.Libraries
+namespace Jellyfin.Database.Implementations.Entities.Libraries
{
///
/// An entity representing a music album.
diff --git a/Jellyfin.Data/Entities/Libraries/MusicAlbumMetadata.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/MusicAlbumMetadata.cs
similarity index 96%
rename from Jellyfin.Data/Entities/Libraries/MusicAlbumMetadata.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/MusicAlbumMetadata.cs
index 691f3504fa..bfb94c44d6 100644
--- a/Jellyfin.Data/Entities/Libraries/MusicAlbumMetadata.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/MusicAlbumMetadata.cs
@@ -1,7 +1,7 @@
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
-namespace Jellyfin.Data.Entities.Libraries
+namespace Jellyfin.Database.Implementations.Entities.Libraries
{
///
/// An entity holding the metadata for a music album.
diff --git a/Jellyfin.Data/Entities/Libraries/Person.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/Person.cs
similarity index 95%
rename from Jellyfin.Data/Entities/Libraries/Person.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/Person.cs
index 90dc55b70d..25cdfdc2ee 100644
--- a/Jellyfin.Data/Entities/Libraries/Person.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/Person.cs
@@ -2,9 +2,9 @@ using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
-using Jellyfin.Data.Interfaces;
+using Jellyfin.Database.Implementations.Interfaces;
-namespace Jellyfin.Data.Entities.Libraries
+namespace Jellyfin.Database.Implementations.Entities.Libraries
{
///
/// An entity representing a person.
diff --git a/Jellyfin.Data/Entities/Libraries/PersonRole.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/PersonRole.cs
similarity index 93%
rename from Jellyfin.Data/Entities/Libraries/PersonRole.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/PersonRole.cs
index 7d40bdf448..e1c2113908 100644
--- a/Jellyfin.Data/Entities/Libraries/PersonRole.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/PersonRole.cs
@@ -1,10 +1,10 @@
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
-using Jellyfin.Data.Enums;
-using Jellyfin.Data.Interfaces;
+using Jellyfin.Database.Implementations.Enums;
+using Jellyfin.Database.Implementations.Interfaces;
-namespace Jellyfin.Data.Entities.Libraries
+namespace Jellyfin.Database.Implementations.Entities.Libraries
{
///
/// An entity representing a person's role in media.
diff --git a/Jellyfin.Data/Entities/Libraries/Photo.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/Photo.cs
similarity index 87%
rename from Jellyfin.Data/Entities/Libraries/Photo.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/Photo.cs
index 4b459432bc..b113170e1d 100644
--- a/Jellyfin.Data/Entities/Libraries/Photo.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/Photo.cs
@@ -1,7 +1,7 @@
using System.Collections.Generic;
-using Jellyfin.Data.Interfaces;
+using Jellyfin.Database.Implementations.Interfaces;
-namespace Jellyfin.Data.Entities.Libraries
+namespace Jellyfin.Database.Implementations.Entities.Libraries
{
///
/// An entity representing a photo.
diff --git a/Jellyfin.Data/Entities/Libraries/PhotoMetadata.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/PhotoMetadata.cs
similarity index 89%
rename from Jellyfin.Data/Entities/Libraries/PhotoMetadata.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/PhotoMetadata.cs
index 6c284307d7..6fae4a024f 100644
--- a/Jellyfin.Data/Entities/Libraries/PhotoMetadata.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/PhotoMetadata.cs
@@ -1,4 +1,4 @@
-namespace Jellyfin.Data.Entities.Libraries
+namespace Jellyfin.Database.Implementations.Entities.Libraries
{
///
/// An entity that holds metadata for a photo.
diff --git a/Jellyfin.Data/Entities/Libraries/Rating.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/Rating.cs
similarity index 93%
rename from Jellyfin.Data/Entities/Libraries/Rating.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/Rating.cs
index 58c8fa49ef..627575024e 100644
--- a/Jellyfin.Data/Entities/Libraries/Rating.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/Rating.cs
@@ -1,8 +1,8 @@
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
-using Jellyfin.Data.Interfaces;
+using Jellyfin.Database.Implementations.Interfaces;
-namespace Jellyfin.Data.Entities.Libraries
+namespace Jellyfin.Database.Implementations.Entities.Libraries
{
///
/// An entity representing a rating for an entity.
diff --git a/Jellyfin.Data/Entities/Libraries/RatingSource.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/RatingSource.cs
similarity index 94%
rename from Jellyfin.Data/Entities/Libraries/RatingSource.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/RatingSource.cs
index 0f3a073244..8322855991 100644
--- a/Jellyfin.Data/Entities/Libraries/RatingSource.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/RatingSource.cs
@@ -1,8 +1,8 @@
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
-using Jellyfin.Data.Interfaces;
+using Jellyfin.Database.Implementations.Interfaces;
-namespace Jellyfin.Data.Entities.Libraries
+namespace Jellyfin.Database.Implementations.Entities.Libraries
{
///
/// This is the entity to store review ratings, not age ratings.
diff --git a/Jellyfin.Data/Entities/Libraries/Release.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/Release.cs
similarity index 94%
rename from Jellyfin.Data/Entities/Libraries/Release.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/Release.cs
index e68ab9105a..db148338e2 100644
--- a/Jellyfin.Data/Entities/Libraries/Release.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/Release.cs
@@ -2,9 +2,9 @@ using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
-using Jellyfin.Data.Interfaces;
+using Jellyfin.Database.Implementations.Interfaces;
-namespace Jellyfin.Data.Entities.Libraries
+namespace Jellyfin.Database.Implementations.Entities.Libraries
{
///
/// An entity representing a release for a library item, eg. Director's cut vs. standard.
diff --git a/Jellyfin.Data/Entities/Libraries/Season.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/Season.cs
similarity index 94%
rename from Jellyfin.Data/Entities/Libraries/Season.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/Season.cs
index fc110b49da..dc9f695d98 100644
--- a/Jellyfin.Data/Entities/Libraries/Season.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/Season.cs
@@ -1,6 +1,6 @@
using System.Collections.Generic;
-namespace Jellyfin.Data.Entities.Libraries
+namespace Jellyfin.Database.Implementations.Entities.Libraries
{
///
/// An entity representing a season.
diff --git a/Jellyfin.Data/Entities/Libraries/SeasonMetadata.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/SeasonMetadata.cs
similarity index 93%
rename from Jellyfin.Data/Entities/Libraries/SeasonMetadata.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/SeasonMetadata.cs
index da40a075f5..af1e9fa2b7 100644
--- a/Jellyfin.Data/Entities/Libraries/SeasonMetadata.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/SeasonMetadata.cs
@@ -1,6 +1,6 @@
using System.ComponentModel.DataAnnotations;
-namespace Jellyfin.Data.Entities.Libraries
+namespace Jellyfin.Database.Implementations.Entities.Libraries
{
///
/// An entity that holds metadata for seasons.
diff --git a/Jellyfin.Data/Entities/Libraries/Series.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/Series.cs
similarity index 95%
rename from Jellyfin.Data/Entities/Libraries/Series.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/Series.cs
index ab484c96d6..1e1633248f 100644
--- a/Jellyfin.Data/Entities/Libraries/Series.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/Series.cs
@@ -1,7 +1,7 @@
using System;
using System.Collections.Generic;
-namespace Jellyfin.Data.Entities.Libraries
+namespace Jellyfin.Database.Implementations.Entities.Libraries
{
///
/// An entity representing a series.
diff --git a/Jellyfin.Data/Entities/Libraries/SeriesMetadata.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/SeriesMetadata.cs
similarity index 94%
rename from Jellyfin.Data/Entities/Libraries/SeriesMetadata.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/SeriesMetadata.cs
index 42115802c5..b1b2b10bea 100644
--- a/Jellyfin.Data/Entities/Libraries/SeriesMetadata.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/SeriesMetadata.cs
@@ -1,8 +1,8 @@
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
-using Jellyfin.Data.Interfaces;
+using Jellyfin.Database.Implementations.Interfaces;
-namespace Jellyfin.Data.Entities.Libraries
+namespace Jellyfin.Database.Implementations.Entities.Libraries
{
///
/// An entity representing series metadata.
diff --git a/Jellyfin.Data/Entities/Libraries/Track.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/Track.cs
similarity index 89%
rename from Jellyfin.Data/Entities/Libraries/Track.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/Track.cs
index d354000337..f0bd88963a 100644
--- a/Jellyfin.Data/Entities/Libraries/Track.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/Track.cs
@@ -1,7 +1,7 @@
using System.Collections.Generic;
-using Jellyfin.Data.Interfaces;
+using Jellyfin.Database.Implementations.Interfaces;
-namespace Jellyfin.Data.Entities.Libraries
+namespace Jellyfin.Database.Implementations.Entities.Libraries
{
///
/// An entity representing a track.
diff --git a/Jellyfin.Data/Entities/Libraries/TrackMetadata.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/TrackMetadata.cs
similarity index 89%
rename from Jellyfin.Data/Entities/Libraries/TrackMetadata.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/TrackMetadata.cs
index 042d2b90db..d9b4736a7c 100644
--- a/Jellyfin.Data/Entities/Libraries/TrackMetadata.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Libraries/TrackMetadata.cs
@@ -1,4 +1,4 @@
-namespace Jellyfin.Data.Entities.Libraries
+namespace Jellyfin.Database.Implementations.Entities.Libraries
{
///
/// An entity holding metadata for a track.
diff --git a/Jellyfin.Data/Entities/MediaSegment.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/MediaSegment.cs
similarity index 91%
rename from Jellyfin.Data/Entities/MediaSegment.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/MediaSegment.cs
index 90120d7721..c34369d889 100644
--- a/Jellyfin.Data/Entities/MediaSegment.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/MediaSegment.cs
@@ -1,8 +1,8 @@
using System;
using System.ComponentModel.DataAnnotations.Schema;
-using Jellyfin.Data.Enums;
+using Jellyfin.Database.Implementations.Enums;
-namespace Jellyfin.Data.Entities;
+namespace Jellyfin.Database.Implementations.Entities;
///
/// An entity representing the metadata for a group of trickplay tiles.
diff --git a/Jellyfin.Data/Entities/MediaStreamInfo.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/MediaStreamInfo.cs
similarity index 96%
rename from Jellyfin.Data/Entities/MediaStreamInfo.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/MediaStreamInfo.cs
index 77816565af..207317376d 100644
--- a/Jellyfin.Data/Entities/MediaStreamInfo.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/MediaStreamInfo.cs
@@ -1,9 +1,8 @@
#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member
using System;
-using System.Diagnostics.CodeAnalysis;
-namespace Jellyfin.Data.Entities;
+namespace Jellyfin.Database.Implementations.Entities;
public class MediaStreamInfo
{
diff --git a/Jellyfin.Data/Entities/MediaStreamTypeEntity.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/MediaStreamTypeEntity.cs
similarity index 90%
rename from Jellyfin.Data/Entities/MediaStreamTypeEntity.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/MediaStreamTypeEntity.cs
index f57672a2cf..33dd81bdd6 100644
--- a/Jellyfin.Data/Entities/MediaStreamTypeEntity.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/MediaStreamTypeEntity.cs
@@ -1,4 +1,4 @@
-namespace Jellyfin.Data.Entities;
+namespace Jellyfin.Database.Implementations.Entities;
///
/// Enum MediaStreamType.
diff --git a/Jellyfin.Data/Entities/People.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/People.cs
similarity index 92%
rename from Jellyfin.Data/Entities/People.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/People.cs
index 18c778b17a..20cf3e2d9e 100644
--- a/Jellyfin.Data/Entities/People.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/People.cs
@@ -3,7 +3,7 @@
using System;
using System.Collections.Generic;
-namespace Jellyfin.Data.Entities;
+namespace Jellyfin.Database.Implementations.Entities;
///
/// People entity.
diff --git a/Jellyfin.Data/Entities/PeopleBaseItemMap.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/PeopleBaseItemMap.cs
similarity index 94%
rename from Jellyfin.Data/Entities/PeopleBaseItemMap.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/PeopleBaseItemMap.cs
index bfaaf82151..c719a185c4 100644
--- a/Jellyfin.Data/Entities/PeopleBaseItemMap.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/PeopleBaseItemMap.cs
@@ -1,6 +1,6 @@
using System;
-namespace Jellyfin.Data.Entities;
+namespace Jellyfin.Database.Implementations.Entities;
///
/// Mapping table for People to BaseItems.
diff --git a/Jellyfin.Data/Entities/Permission.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Permission.cs
similarity index 92%
rename from Jellyfin.Data/Entities/Permission.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Permission.cs
index 6d2e68077c..84b86574cc 100644
--- a/Jellyfin.Data/Entities/Permission.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Permission.cs
@@ -3,10 +3,10 @@
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
-using Jellyfin.Data.Enums;
-using Jellyfin.Data.Interfaces;
+using Jellyfin.Database.Implementations.Enums;
+using Jellyfin.Database.Implementations.Interfaces;
-namespace Jellyfin.Data.Entities
+namespace Jellyfin.Database.Implementations.Entities
{
///
/// An entity representing whether the associated user has a specific permission.
diff --git a/Jellyfin.Data/Entities/Preference.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Preference.cs
similarity index 92%
rename from Jellyfin.Data/Entities/Preference.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Preference.cs
index a6ab275d31..c02ea7375a 100644
--- a/Jellyfin.Data/Entities/Preference.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Preference.cs
@@ -1,10 +1,10 @@
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
-using Jellyfin.Data.Enums;
-using Jellyfin.Data.Interfaces;
+using Jellyfin.Database.Implementations.Enums;
+using Jellyfin.Database.Implementations.Interfaces;
-namespace Jellyfin.Data.Entities
+namespace Jellyfin.Database.Implementations.Entities
{
///
/// An entity representing a preference attached to a user or group.
diff --git a/Jellyfin.Data/Entities/ProgramAudioEntity.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/ProgramAudioEntity.cs
similarity index 90%
rename from Jellyfin.Data/Entities/ProgramAudioEntity.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/ProgramAudioEntity.cs
index 9d79e5ddb1..cb7255c19f 100644
--- a/Jellyfin.Data/Entities/ProgramAudioEntity.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/ProgramAudioEntity.cs
@@ -1,4 +1,4 @@
-namespace Jellyfin.Data.Entities;
+namespace Jellyfin.Database.Implementations.Entities;
///
/// Lists types of Audio.
diff --git a/Jellyfin.Data/Entities/Security/ApiKey.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Security/ApiKey.cs
similarity index 96%
rename from Jellyfin.Data/Entities/Security/ApiKey.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Security/ApiKey.cs
index 1fcbe0f5e9..25a1d5ce90 100644
--- a/Jellyfin.Data/Entities/Security/ApiKey.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Security/ApiKey.cs
@@ -3,7 +3,7 @@ using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Globalization;
-namespace Jellyfin.Data.Entities.Security
+namespace Jellyfin.Database.Implementations.Entities.Security
{
///
/// An entity representing an API key.
diff --git a/Jellyfin.Data/Entities/Security/Device.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Security/Device.cs
similarity index 98%
rename from Jellyfin.Data/Entities/Security/Device.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Security/Device.cs
index 67d7f78eda..b0f9b2d569 100644
--- a/Jellyfin.Data/Entities/Security/Device.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Security/Device.cs
@@ -3,7 +3,7 @@ using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Globalization;
-namespace Jellyfin.Data.Entities.Security
+namespace Jellyfin.Database.Implementations.Entities.Security
{
///
/// An entity representing a device.
diff --git a/Jellyfin.Data/Entities/Security/DeviceOptions.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Security/DeviceOptions.cs
similarity index 93%
rename from Jellyfin.Data/Entities/Security/DeviceOptions.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Security/DeviceOptions.cs
index 531f66c627..8ac3e364c4 100644
--- a/Jellyfin.Data/Entities/Security/DeviceOptions.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/Security/DeviceOptions.cs
@@ -1,6 +1,6 @@
using System.ComponentModel.DataAnnotations.Schema;
-namespace Jellyfin.Data.Entities.Security
+namespace Jellyfin.Database.Implementations.Entities.Security
{
///
/// An entity representing custom options for a device.
diff --git a/Jellyfin.Data/Entities/TrickplayInfo.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/TrickplayInfo.cs
similarity index 96%
rename from Jellyfin.Data/Entities/TrickplayInfo.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/TrickplayInfo.cs
index ff9a68beff..06b290e4f2 100644
--- a/Jellyfin.Data/Entities/TrickplayInfo.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/TrickplayInfo.cs
@@ -1,7 +1,7 @@
using System;
using System.Text.Json.Serialization;
-namespace Jellyfin.Data.Entities;
+namespace Jellyfin.Database.Implementations.Entities;
///
/// An entity representing the metadata for a group of trickplay tiles.
diff --git a/Jellyfin.Data/Entities/User.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/User.cs
similarity index 55%
rename from Jellyfin.Data/Entities/User.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/User.cs
index 9bbe9efe89..31538b5bf3 100644
--- a/Jellyfin.Data/Entities/User.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/User.cs
@@ -1,25 +1,18 @@
using System;
using System.Collections.Generic;
-using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
-using System.Linq;
using System.Text.Json.Serialization;
-using Jellyfin.Data.Enums;
-using Jellyfin.Data.Interfaces;
+using Jellyfin.Database.Implementations.Enums;
+using Jellyfin.Database.Implementations.Interfaces;
-namespace Jellyfin.Data.Entities
+namespace Jellyfin.Database.Implementations.Entities
{
///
/// An entity representing a user.
///
public class User : IHasPermissions, IHasConcurrencyToken
{
- ///
- /// The values being delimited here are Guids, so commas work as they do not appear in Guids.
- ///
- private const char Delimiter = ',';
-
///
/// Initializes a new instance of the class.
/// Public constructor with required data.
@@ -339,196 +332,5 @@ namespace Jellyfin.Data.Entities
{
RowVersion++;
}
-
- ///
- /// Checks whether the user has the specified permission.
- ///
- /// The permission kind.
- /// True if the user has the specified permission.
- public bool HasPermission(PermissionKind kind)
- {
- return Permissions.FirstOrDefault(p => p.Kind == kind)?.Value ?? false;
- }
-
- ///
- /// Sets the given permission kind to the provided value.
- ///
- /// The permission kind.
- /// The value to set.
- public void SetPermission(PermissionKind kind, bool value)
- {
- var currentPermission = Permissions.FirstOrDefault(p => p.Kind == kind);
- if (currentPermission is null)
- {
- Permissions.Add(new Permission(kind, value));
- }
- else
- {
- currentPermission.Value = value;
- }
- }
-
- ///
- /// Gets the user's preferences for the given preference kind.
- ///
- /// The preference kind.
- /// A string array containing the user's preferences.
- public string[] GetPreference(PreferenceKind preference)
- {
- var val = Preferences.FirstOrDefault(p => p.Kind == preference)?.Value;
-
- return string.IsNullOrEmpty(val) ? Array.Empty() : val.Split(Delimiter);
- }
-
- ///
- /// Gets the user's preferences for the given preference kind.
- ///
- /// The preference kind.
- /// Type of preference.
- /// A {T} array containing the user's preference.
- public T[] GetPreferenceValues(PreferenceKind preference)
- {
- var val = Preferences.FirstOrDefault(p => p.Kind == preference)?.Value;
- if (string.IsNullOrEmpty(val))
- {
- return Array.Empty();
- }
-
- // 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];
- }
-
- ///
- /// Sets the specified preference to the given value.
- ///
- /// The preference kind.
- /// The values.
- public void SetPreference(PreferenceKind preference, string[] values)
- {
- var value = string.Join(Delimiter, values);
- var currentPreference = Preferences.FirstOrDefault(p => p.Kind == preference);
- if (currentPreference is null)
- {
- Preferences.Add(new Preference(preference, value));
- }
- else
- {
- currentPreference.Value = value;
- }
- }
-
- ///
- /// Sets the specified preference to the given value.
- ///
- /// The preference kind.
- /// The values.
- /// The type of value.
- public void SetPreference(PreferenceKind preference, T[] values)
- {
- var value = string.Join(Delimiter, values);
- var currentPreference = Preferences.FirstOrDefault(p => p.Kind == preference);
- if (currentPreference is null)
- {
- Preferences.Add(new Preference(preference, value));
- }
- else
- {
- currentPreference.Value = value;
- }
- }
-
- ///
- /// Checks whether this user is currently allowed to use the server.
- ///
- /// True if the current time is within an access schedule, or there are no access schedules.
- public bool IsParentalScheduleAllowed()
- {
- return AccessSchedules.Count == 0
- || AccessSchedules.Any(i => IsParentalScheduleAllowed(i, DateTime.UtcNow));
- }
-
- ///
- /// Checks whether the provided folder is in this user's grouped folders.
- ///
- /// The Guid of the folder.
- /// True if the folder is in the user's grouped folders.
- public bool IsFolderGrouped(Guid id)
- {
- return Array.IndexOf(GetPreferenceValues(PreferenceKind.GroupedFolders), id) != -1;
- }
-
- ///
- /// Initializes the default permissions for a user. Should only be called on user creation.
- ///
- // TODO: make these user configurable?
- public void AddDefaultPermissions()
- {
- Permissions.Add(new Permission(PermissionKind.IsAdministrator, false));
- Permissions.Add(new Permission(PermissionKind.IsDisabled, false));
- Permissions.Add(new Permission(PermissionKind.IsHidden, true));
- Permissions.Add(new Permission(PermissionKind.EnableAllChannels, true));
- Permissions.Add(new Permission(PermissionKind.EnableAllDevices, true));
- Permissions.Add(new Permission(PermissionKind.EnableAllFolders, true));
- Permissions.Add(new Permission(PermissionKind.EnableContentDeletion, false));
- Permissions.Add(new Permission(PermissionKind.EnableContentDownloading, true));
- Permissions.Add(new Permission(PermissionKind.EnableMediaConversion, true));
- Permissions.Add(new Permission(PermissionKind.EnableMediaPlayback, true));
- Permissions.Add(new Permission(PermissionKind.EnablePlaybackRemuxing, true));
- Permissions.Add(new Permission(PermissionKind.EnablePublicSharing, true));
- Permissions.Add(new Permission(PermissionKind.EnableRemoteAccess, true));
- Permissions.Add(new Permission(PermissionKind.EnableSyncTranscoding, true));
- Permissions.Add(new Permission(PermissionKind.EnableAudioPlaybackTranscoding, true));
- Permissions.Add(new Permission(PermissionKind.EnableLiveTvAccess, true));
- Permissions.Add(new Permission(PermissionKind.EnableLiveTvManagement, true));
- Permissions.Add(new Permission(PermissionKind.EnableSharedDeviceControl, true));
- Permissions.Add(new Permission(PermissionKind.EnableVideoPlaybackTranscoding, true));
- Permissions.Add(new Permission(PermissionKind.ForceRemoteSourceTranscoding, false));
- Permissions.Add(new Permission(PermissionKind.EnableRemoteControlOfOtherUsers, false));
- Permissions.Add(new Permission(PermissionKind.EnableCollectionManagement, false));
- Permissions.Add(new Permission(PermissionKind.EnableSubtitleManagement, false));
- Permissions.Add(new Permission(PermissionKind.EnableLyricManagement, false));
- }
-
- ///
- /// Initializes the default preferences. Should only be called on user creation.
- ///
- public void AddDefaultPreferences()
- {
- foreach (var val in Enum.GetValues())
- {
- 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;
- }
}
}
diff --git a/Jellyfin.Data/Entities/UserData.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/UserData.cs
similarity index 96%
rename from Jellyfin.Data/Entities/UserData.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/UserData.cs
index 05ab6dd2d2..cd80686615 100644
--- a/Jellyfin.Data/Entities/UserData.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Entities/UserData.cs
@@ -1,7 +1,6 @@
using System;
-using System.ComponentModel.DataAnnotations.Schema;
-namespace Jellyfin.Data.Entities;
+namespace Jellyfin.Database.Implementations.Entities;
///
/// Provides and related data.
diff --git a/src/Jellyfin.Database/Jellyfin.Database.Implementations/Enums/ArtKind.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Enums/ArtKind.cs
new file mode 100644
index 0000000000..218e97bcc0
--- /dev/null
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Enums/ArtKind.cs
@@ -0,0 +1,32 @@
+namespace Jellyfin.Database.Implementations.Enums;
+
+///
+/// An enum representing types of art.
+///
+public enum ArtKind
+{
+ ///
+ /// Another type of art, not covered by the other members.
+ ///
+ Other = 0,
+
+ ///
+ /// A poster.
+ ///
+ Poster = 1,
+
+ ///
+ /// A banner.
+ ///
+ Banner = 2,
+
+ ///
+ /// A thumbnail.
+ ///
+ Thumbnail = 3,
+
+ ///
+ /// A logo.
+ ///
+ Logo = 4
+}
diff --git a/src/Jellyfin.Database/Jellyfin.Database.Implementations/Enums/ChromecastVersion.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Enums/ChromecastVersion.cs
new file mode 100644
index 0000000000..123f2fe438
--- /dev/null
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Enums/ChromecastVersion.cs
@@ -0,0 +1,17 @@
+namespace Jellyfin.Database.Implementations.Enums;
+
+///
+/// An enum representing the version of Chromecast to be used by clients.
+///
+public enum ChromecastVersion
+{
+ ///
+ /// Stable Chromecast version.
+ ///
+ Stable = 0,
+
+ ///
+ /// Unstable Chromecast version.
+ ///
+ Unstable = 1
+}
diff --git a/src/Jellyfin.Database/Jellyfin.Database.Implementations/Enums/DynamicDayOfWeek.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Enums/DynamicDayOfWeek.cs
new file mode 100644
index 0000000000..69a9b5816a
--- /dev/null
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Enums/DynamicDayOfWeek.cs
@@ -0,0 +1,57 @@
+namespace Jellyfin.Database.Implementations.Enums;
+
+///
+/// An enum that represents a day of the week, weekdays, weekends, or all days.
+///
+public enum DynamicDayOfWeek
+{
+ ///
+ /// Sunday.
+ ///
+ Sunday = 0,
+
+ ///
+ /// Monday.
+ ///
+ Monday = 1,
+
+ ///
+ /// Tuesday.
+ ///
+ Tuesday = 2,
+
+ ///
+ /// Wednesday.
+ ///
+ Wednesday = 3,
+
+ ///
+ /// Thursday.
+ ///
+ Thursday = 4,
+
+ ///
+ /// Friday.
+ ///
+ Friday = 5,
+
+ ///
+ /// Saturday.
+ ///
+ Saturday = 6,
+
+ ///
+ /// All days of the week.
+ ///
+ Everyday = 7,
+
+ ///
+ /// A week day, or Monday-Friday.
+ ///
+ Weekday = 8,
+
+ ///
+ /// Saturday and Sunday.
+ ///
+ Weekend = 9
+}
diff --git a/src/Jellyfin.Database/Jellyfin.Database.Implementations/Enums/HomeSectionType.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Enums/HomeSectionType.cs
new file mode 100644
index 0000000000..6ba57e74d5
--- /dev/null
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Enums/HomeSectionType.cs
@@ -0,0 +1,57 @@
+namespace Jellyfin.Database.Implementations.Enums;
+
+///
+/// An enum representing the different options for the home screen sections.
+///
+public enum HomeSectionType
+{
+ ///
+ /// None.
+ ///
+ None = 0,
+
+ ///
+ /// My Media.
+ ///
+ SmallLibraryTiles = 1,
+
+ ///
+ /// My Media Small.
+ ///
+ LibraryButtons = 2,
+
+ ///
+ /// Active Recordings.
+ ///
+ ActiveRecordings = 3,
+
+ ///
+ /// Continue Watching.
+ ///
+ Resume = 4,
+
+ ///
+ /// Continue Listening.
+ ///
+ ResumeAudio = 5,
+
+ ///
+ /// Latest Media.
+ ///
+ LatestMedia = 6,
+
+ ///
+ /// Next Up.
+ ///
+ NextUp = 7,
+
+ ///
+ /// Live TV.
+ ///
+ LiveTv = 8,
+
+ ///
+ /// Continue Reading.
+ ///
+ ResumeBook = 9
+}
diff --git a/src/Jellyfin.Database/Jellyfin.Database.Implementations/Enums/IndexingKind.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Enums/IndexingKind.cs
new file mode 100644
index 0000000000..72ac1140cb
--- /dev/null
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Enums/IndexingKind.cs
@@ -0,0 +1,22 @@
+namespace Jellyfin.Database.Implementations.Enums;
+
+///
+/// An enum representing a type of indexing in a user's display preferences.
+///
+public enum IndexingKind
+{
+ ///
+ /// Index by the premiere date.
+ ///
+ PremiereDate = 0,
+
+ ///
+ /// Index by the production year.
+ ///
+ ProductionYear = 1,
+
+ ///
+ /// Index by the community rating.
+ ///
+ CommunityRating = 2
+}
diff --git a/src/Jellyfin.Database/Jellyfin.Database.Implementations/Enums/MediaFileKind.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Enums/MediaFileKind.cs
new file mode 100644
index 0000000000..8e6f677dca
--- /dev/null
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Enums/MediaFileKind.cs
@@ -0,0 +1,32 @@
+namespace Jellyfin.Database.Implementations.Enums;
+
+///
+/// An enum representing the type of media file.
+///
+public enum MediaFileKind
+{
+ ///
+ /// The main file.
+ ///
+ Main = 0,
+
+ ///
+ /// A sidecar file.
+ ///
+ Sidecar = 1,
+
+ ///
+ /// An additional part to the main file.
+ ///
+ AdditionalPart = 2,
+
+ ///
+ /// An alternative format to the main file.
+ ///
+ AlternativeFormat = 3,
+
+ ///
+ /// An additional stream for the main file.
+ ///
+ AdditionalStream = 4
+}
diff --git a/Jellyfin.Data/Enums/MediaSegmentType.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Enums/MediaSegmentType.cs
similarity index 85%
rename from Jellyfin.Data/Enums/MediaSegmentType.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/Enums/MediaSegmentType.cs
index 4586354504..a6e8732fff 100644
--- a/Jellyfin.Data/Enums/MediaSegmentType.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Enums/MediaSegmentType.cs
@@ -1,6 +1,6 @@
-using Jellyfin.Data.Entities;
+using Jellyfin.Database.Implementations.Entities;
-namespace Jellyfin.Data.Enums;
+namespace Jellyfin.Database.Implementations.Enums;
///
/// Defines the types of content an individual represents.
diff --git a/src/Jellyfin.Database/Jellyfin.Database.Implementations/Enums/PermissionKind.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Enums/PermissionKind.cs
new file mode 100644
index 0000000000..0818639636
--- /dev/null
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Enums/PermissionKind.cs
@@ -0,0 +1,127 @@
+namespace Jellyfin.Database.Implementations.Enums;
+
+///
+/// The types of user permissions.
+///
+public enum PermissionKind
+{
+ ///
+ /// Whether the user is an administrator.
+ ///
+ IsAdministrator = 0,
+
+ ///
+ /// Whether the user is hidden.
+ ///
+ IsHidden = 1,
+
+ ///
+ /// Whether the user is disabled.
+ ///
+ IsDisabled = 2,
+
+ ///
+ /// Whether the user can control shared devices.
+ ///
+ EnableSharedDeviceControl = 3,
+
+ ///
+ /// Whether the user can access the server remotely.
+ ///
+ EnableRemoteAccess = 4,
+
+ ///
+ /// Whether the user can manage live tv.
+ ///
+ EnableLiveTvManagement = 5,
+
+ ///
+ /// Whether the user can access live tv.
+ ///
+ EnableLiveTvAccess = 6,
+
+ ///
+ /// Whether the user can play media.
+ ///
+ EnableMediaPlayback = 7,
+
+ ///
+ /// Whether the server should transcode audio for the user if requested.
+ ///
+ EnableAudioPlaybackTranscoding = 8,
+
+ ///
+ /// Whether the server should transcode video for the user if requested.
+ ///
+ EnableVideoPlaybackTranscoding = 9,
+
+ ///
+ /// Whether the user can delete content.
+ ///
+ EnableContentDeletion = 10,
+
+ ///
+ /// Whether the user can download content.
+ ///
+ EnableContentDownloading = 11,
+
+ ///
+ /// Whether to enable sync transcoding for the user.
+ ///
+ EnableSyncTranscoding = 12,
+
+ ///
+ /// Whether the user can do media conversion.
+ ///
+ EnableMediaConversion = 13,
+
+ ///
+ /// Whether the user has access to all devices.
+ ///
+ EnableAllDevices = 14,
+
+ ///
+ /// Whether the user has access to all channels.
+ ///
+ EnableAllChannels = 15,
+
+ ///
+ /// Whether the user has access to all folders.
+ ///
+ EnableAllFolders = 16,
+
+ ///
+ /// Whether to enable public sharing for the user.
+ ///
+ EnablePublicSharing = 17,
+
+ ///
+ /// Whether the user can remotely control other users.
+ ///
+ EnableRemoteControlOfOtherUsers = 18,
+
+ ///
+ /// Whether the user is permitted to do playback remuxing.
+ ///
+ EnablePlaybackRemuxing = 19,
+
+ ///
+ /// Whether the server should force transcoding on remote connections for the user.
+ ///
+ ForceRemoteSourceTranscoding = 20,
+
+ ///
+ /// Whether the user can create, modify and delete collections.
+ ///
+ EnableCollectionManagement = 21,
+
+ ///
+ /// Whether the user can edit subtitles.
+ ///
+ EnableSubtitleManagement = 22,
+
+ ///
+ /// Whether the user can edit lyrics.
+ ///
+ EnableLyricManagement = 23,
+}
diff --git a/src/Jellyfin.Database/Jellyfin.Database.Implementations/Enums/PersonRoleType.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Enums/PersonRoleType.cs
new file mode 100644
index 0000000000..5b913385e8
--- /dev/null
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Enums/PersonRoleType.cs
@@ -0,0 +1,67 @@
+namespace Jellyfin.Database.Implementations.Enums;
+
+///
+/// An enum representing a person's role in a specific media item.
+///
+public enum PersonRoleType
+{
+ ///
+ /// Another role, not covered by the other types.
+ ///
+ Other = 0,
+
+ ///
+ /// The director of the media.
+ ///
+ Director = 1,
+
+ ///
+ /// An artist.
+ ///
+ Artist = 2,
+
+ ///
+ /// The original artist.
+ ///
+ OriginalArtist = 3,
+
+ ///
+ /// An actor.
+ ///
+ Actor = 4,
+
+ ///
+ /// A voice actor.
+ ///
+ VoiceActor = 5,
+
+ ///
+ /// A producer.
+ ///
+ Producer = 6,
+
+ ///
+ /// A remixer.
+ ///
+ Remixer = 7,
+
+ ///
+ /// A conductor.
+ ///
+ Conductor = 8,
+
+ ///
+ /// A composer.
+ ///
+ Composer = 9,
+
+ ///
+ /// An author.
+ ///
+ Author = 10,
+
+ ///
+ /// An editor.
+ ///
+ Editor = 11
+}
diff --git a/src/Jellyfin.Database/Jellyfin.Database.Implementations/Enums/PreferenceKind.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Enums/PreferenceKind.cs
new file mode 100644
index 0000000000..f70e3e2c23
--- /dev/null
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Enums/PreferenceKind.cs
@@ -0,0 +1,72 @@
+namespace Jellyfin.Database.Implementations.Enums;
+
+///
+/// The types of user preferences.
+///
+public enum PreferenceKind
+{
+ ///
+ /// A list of blocked tags.
+ ///
+ BlockedTags = 0,
+
+ ///
+ /// A list of blocked channels.
+ ///
+ BlockedChannels = 1,
+
+ ///
+ /// A list of blocked media folders.
+ ///
+ BlockedMediaFolders = 2,
+
+ ///
+ /// A list of enabled devices.
+ ///
+ EnabledDevices = 3,
+
+ ///
+ /// A list of enabled channels.
+ ///
+ EnabledChannels = 4,
+
+ ///
+ /// A list of enabled folders.
+ ///
+ EnabledFolders = 5,
+
+ ///
+ /// A list of folders to allow content deletion from.
+ ///
+ EnableContentDeletionFromFolders = 6,
+
+ ///
+ /// A list of latest items to exclude.
+ ///
+ LatestItemExcludes = 7,
+
+ ///
+ /// A list of media to exclude.
+ ///
+ MyMediaExcludes = 8,
+
+ ///
+ /// A list of grouped folders.
+ ///
+ GroupedFolders = 9,
+
+ ///
+ /// A list of unrated items to block.
+ ///
+ BlockUnratedItems = 10,
+
+ ///
+ /// A list of ordered views.
+ ///
+ OrderedViews = 11,
+
+ ///
+ /// A list of allowed tags.
+ ///
+ AllowedTags = 12
+}
diff --git a/src/Jellyfin.Database/Jellyfin.Database.Implementations/Enums/ScrollDirection.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Enums/ScrollDirection.cs
new file mode 100644
index 0000000000..3ff3c45faf
--- /dev/null
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Enums/ScrollDirection.cs
@@ -0,0 +1,17 @@
+namespace Jellyfin.Database.Implementations.Enums;
+
+///
+/// An enum representing the axis that should be scrolled.
+///
+public enum ScrollDirection
+{
+ ///
+ /// Horizontal scrolling direction.
+ ///
+ Horizontal = 0,
+
+ ///
+ /// Vertical scrolling direction.
+ ///
+ Vertical = 1
+}
diff --git a/src/Jellyfin.Database/Jellyfin.Database.Implementations/Enums/SortOrder.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Enums/SortOrder.cs
new file mode 100644
index 0000000000..c865b75f11
--- /dev/null
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Enums/SortOrder.cs
@@ -0,0 +1,17 @@
+namespace Jellyfin.Database.Implementations.Enums;
+
+///
+/// An enum representing the sorting order.
+///
+public enum SortOrder
+{
+ ///
+ /// Sort in increasing order.
+ ///
+ Ascending = 0,
+
+ ///
+ /// Sort in decreasing order.
+ ///
+ Descending = 1
+}
diff --git a/src/Jellyfin.Database/Jellyfin.Database.Implementations/Enums/SubtitlePlaybackMode.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Enums/SubtitlePlaybackMode.cs
new file mode 100644
index 0000000000..c394c209bb
--- /dev/null
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Enums/SubtitlePlaybackMode.cs
@@ -0,0 +1,32 @@
+namespace Jellyfin.Database.Implementations.Enums;
+
+///
+/// An enum representing a subtitle playback mode.
+///
+public enum SubtitlePlaybackMode
+{
+ ///
+ /// The default subtitle playback mode.
+ ///
+ Default = 0,
+
+ ///
+ /// Always show subtitles.
+ ///
+ Always = 1,
+
+ ///
+ /// Only show forced subtitles.
+ ///
+ OnlyForced = 2,
+
+ ///
+ /// Don't show subtitles.
+ ///
+ None = 3,
+
+ ///
+ /// Only show subtitles when the current audio stream is in a different language.
+ ///
+ Smart = 4
+}
diff --git a/src/Jellyfin.Database/Jellyfin.Database.Implementations/Enums/SyncPlayUserAccessType.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Enums/SyncPlayUserAccessType.cs
new file mode 100644
index 0000000000..311642e0d7
--- /dev/null
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Enums/SyncPlayUserAccessType.cs
@@ -0,0 +1,22 @@
+namespace Jellyfin.Database.Implementations.Enums;
+
+///
+/// Enum SyncPlayUserAccessType.
+///
+public enum SyncPlayUserAccessType
+{
+ ///
+ /// User can create groups and join them.
+ ///
+ CreateAndJoinGroups = 0,
+
+ ///
+ /// User can only join already existing groups.
+ ///
+ JoinGroups = 1,
+
+ ///
+ /// SyncPlay is disabled for the user.
+ ///
+ None = 2
+}
diff --git a/src/Jellyfin.Database/Jellyfin.Database.Implementations/Enums/ViewType.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Enums/ViewType.cs
new file mode 100644
index 0000000000..b2bcbf2bb6
--- /dev/null
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Enums/ViewType.cs
@@ -0,0 +1,112 @@
+namespace Jellyfin.Database.Implementations.Enums;
+
+///
+/// An enum representing the type of view for a library or collection.
+///
+public enum ViewType
+{
+ ///
+ /// Shows albums.
+ ///
+ Albums = 0,
+
+ ///
+ /// Shows album artists.
+ ///
+ AlbumArtists = 1,
+
+ ///
+ /// Shows artists.
+ ///
+ Artists = 2,
+
+ ///
+ /// Shows channels.
+ ///
+ Channels = 3,
+
+ ///
+ /// Shows collections.
+ ///
+ Collections = 4,
+
+ ///
+ /// Shows episodes.
+ ///
+ Episodes = 5,
+
+ ///
+ /// Shows favorites.
+ ///
+ Favorites = 6,
+
+ ///
+ /// Shows genres.
+ ///
+ Genres = 7,
+
+ ///
+ /// Shows guide.
+ ///
+ Guide = 8,
+
+ ///
+ /// Shows movies.
+ ///
+ Movies = 9,
+
+ ///
+ /// Shows networks.
+ ///
+ Networks = 10,
+
+ ///
+ /// Shows playlists.
+ ///
+ Playlists = 11,
+
+ ///
+ /// Shows programs.
+ ///
+ Programs = 12,
+
+ ///
+ /// Shows recordings.
+ ///
+ Recordings = 13,
+
+ ///
+ /// Shows schedule.
+ ///
+ Schedule = 14,
+
+ ///
+ /// Shows series.
+ ///
+ Series = 15,
+
+ ///
+ /// Shows shows.
+ ///
+ Shows = 16,
+
+ ///
+ /// Shows songs.
+ ///
+ Songs = 17,
+
+ ///
+ /// Shows songs.
+ ///
+ Suggestions = 18,
+
+ ///
+ /// Shows trailers.
+ ///
+ Trailers = 19,
+
+ ///
+ /// Shows upcoming.
+ ///
+ Upcoming = 20
+}
diff --git a/src/Jellyfin.Database/Jellyfin.Database.Implementations/IJellyfinDatabaseProvider.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/IJellyfinDatabaseProvider.cs
new file mode 100644
index 0000000000..0740165530
--- /dev/null
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/IJellyfinDatabaseProvider.cs
@@ -0,0 +1,48 @@
+using System.Threading;
+using System.Threading.Tasks;
+using Microsoft.EntityFrameworkCore;
+
+namespace Jellyfin.Database.Implementations;
+
+///
+/// Defines the type and extension points for multi database support.
+///
+public interface IJellyfinDatabaseProvider
+{
+ ///
+ /// Gets or Sets the Database Factory when initialisaition is done.
+ ///
+ IDbContextFactory? DbContextFactory { get; set; }
+
+ ///
+ /// Initialises jellyfins EFCore database access.
+ ///
+ /// The EFCore database options.
+ void Initialise(DbContextOptionsBuilder options);
+
+ ///
+ /// Will be invoked when EFCore wants to build its model.
+ ///
+ /// The ModelBuilder from EFCore.
+ void OnModelCreating(ModelBuilder modelBuilder);
+
+ ///
+ /// Will be invoked when EFCore wants to configure its model.
+ ///
+ /// The ModelConfigurationBuilder from EFCore.
+ void ConfigureConventions(ModelConfigurationBuilder configurationBuilder);
+
+ ///
+ /// If supported this should run any periodic maintaince tasks.
+ ///
+ /// The token to abort the operation.
+ /// A representing the asynchronous operation.
+ Task RunScheduledOptimisation(CancellationToken cancellationToken);
+
+ ///
+ /// If supported this should perform any actions that are required on stopping the jellyfin server.
+ ///
+ /// The token that will be used to abort the operation.
+ /// A representing the asynchronous operation.
+ Task RunShutdownTask(CancellationToken cancellationToken);
+}
diff --git a/Jellyfin.Data/Interfaces/IHasArtwork.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Interfaces/IHasArtwork.cs
similarity index 74%
rename from Jellyfin.Data/Interfaces/IHasArtwork.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/Interfaces/IHasArtwork.cs
index a4d9c54af4..46007472a2 100644
--- a/Jellyfin.Data/Interfaces/IHasArtwork.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Interfaces/IHasArtwork.cs
@@ -1,7 +1,7 @@
using System.Collections.Generic;
-using Jellyfin.Data.Entities.Libraries;
+using Jellyfin.Database.Implementations.Entities.Libraries;
-namespace Jellyfin.Data.Interfaces
+namespace Jellyfin.Database.Implementations.Interfaces
{
///
/// An interface abstracting an entity that has artwork.
diff --git a/Jellyfin.Data/Interfaces/IHasCompanies.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Interfaces/IHasCompanies.cs
similarity index 75%
rename from Jellyfin.Data/Interfaces/IHasCompanies.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/Interfaces/IHasCompanies.cs
index 8f19ce04fa..5cfefa456a 100644
--- a/Jellyfin.Data/Interfaces/IHasCompanies.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Interfaces/IHasCompanies.cs
@@ -1,7 +1,7 @@
using System.Collections.Generic;
-using Jellyfin.Data.Entities.Libraries;
+using Jellyfin.Database.Implementations.Entities.Libraries;
-namespace Jellyfin.Data.Interfaces
+namespace Jellyfin.Database.Implementations.Interfaces
{
///
/// An abstraction representing an entity that has companies.
diff --git a/src/Jellyfin.Database/Jellyfin.Database.Implementations/Interfaces/IHasConcurrencyToken.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Interfaces/IHasConcurrencyToken.cs
new file mode 100644
index 0000000000..196d2680db
--- /dev/null
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Interfaces/IHasConcurrencyToken.cs
@@ -0,0 +1,17 @@
+namespace Jellyfin.Database.Implementations.Interfaces;
+
+///
+/// An interface abstracting an entity that has a concurrency token.
+///
+public interface IHasConcurrencyToken
+{
+ ///
+ /// Gets the version of this row. Acts as a concurrency token.
+ ///
+ uint RowVersion { get; }
+
+ ///
+ /// Called when saving changes to this entity.
+ ///
+ void OnSavingChanges();
+}
diff --git a/src/Jellyfin.Database/Jellyfin.Database.Implementations/Interfaces/IHasPermissions.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Interfaces/IHasPermissions.cs
new file mode 100644
index 0000000000..99b29e6d35
--- /dev/null
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Interfaces/IHasPermissions.cs
@@ -0,0 +1,15 @@
+using System.Collections.Generic;
+using Jellyfin.Database.Implementations.Entities;
+
+namespace Jellyfin.Database.Implementations.Interfaces;
+
+///
+/// An abstraction representing an entity that has permissions.
+///
+public interface IHasPermissions
+{
+ ///
+ /// Gets a collection containing this entity's permissions.
+ ///
+ ICollection Permissions { get; }
+}
diff --git a/src/Jellyfin.Database/Jellyfin.Database.Implementations/Interfaces/IHasReleases.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Interfaces/IHasReleases.cs
new file mode 100644
index 0000000000..742a6a3867
--- /dev/null
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Interfaces/IHasReleases.cs
@@ -0,0 +1,15 @@
+using System.Collections.Generic;
+using Jellyfin.Database.Implementations.Entities.Libraries;
+
+namespace Jellyfin.Database.Implementations.Interfaces;
+
+///
+/// An abstraction representing an entity that has releases.
+///
+public interface IHasReleases
+{
+ ///
+ /// Gets a collection containing this entity's releases.
+ ///
+ ICollection Releases { get; }
+}
diff --git a/src/Jellyfin.Database/Jellyfin.Database.Implementations/Jellyfin.Database.Implementations.csproj b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Jellyfin.Database.Implementations.csproj
new file mode 100644
index 0000000000..3b619cce61
--- /dev/null
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/Jellyfin.Database.Implementations.csproj
@@ -0,0 +1,25 @@
+
+
+
+ net9.0
+ false
+ true
+
+
+
+
+
+
+
+
+
+ all
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+
+
+ all
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+
+
+
+
diff --git a/src/Jellyfin.Database/Jellyfin.Database.Implementations/JellyfinDatabaseProviderKeyAttribute.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/JellyfinDatabaseProviderKeyAttribute.cs
new file mode 100644
index 0000000000..778aca373e
--- /dev/null
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/JellyfinDatabaseProviderKeyAttribute.cs
@@ -0,0 +1,29 @@
+namespace Jellyfin.Database.Implementations;
+
+///
+/// Defines the key of the database provider.
+///
+[System.AttributeUsage(System.AttributeTargets.Class, Inherited = true, AllowMultiple = true)]
+public sealed class JellyfinDatabaseProviderKeyAttribute : System.Attribute
+{
+ // See the attribute guidelines at
+ // http://go.microsoft.com/fwlink/?LinkId=85236
+ private readonly string _databaseProviderKey;
+
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// The key on which to identify the annotated provider.
+ public JellyfinDatabaseProviderKeyAttribute(string databaseProviderKey)
+ {
+ _databaseProviderKey = databaseProviderKey;
+ }
+
+ ///
+ /// Gets the key on which to identify the annotated provider.
+ ///
+ public string DatabaseProviderKey
+ {
+ get { return _databaseProviderKey; }
+ }
+}
diff --git a/Jellyfin.Server.Implementations/JellyfinDbContext.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/JellyfinDbContext.cs
similarity index 90%
rename from Jellyfin.Server.Implementations/JellyfinDbContext.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/JellyfinDbContext.cs
index 43ea2bd3c2..9db70263d2 100644
--- a/Jellyfin.Server.Implementations/JellyfinDbContext.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/JellyfinDbContext.cs
@@ -1,14 +1,12 @@
using System;
using System.Linq;
-using Jellyfin.Data.Entities;
-using Jellyfin.Data.Entities.Security;
-using Jellyfin.Data.Interfaces;
+using Jellyfin.Database.Implementations.Entities;
+using Jellyfin.Database.Implementations.Entities.Security;
+using Jellyfin.Database.Implementations.Interfaces;
using Microsoft.EntityFrameworkCore;
-using Microsoft.EntityFrameworkCore.Metadata.Builders;
-using Microsoft.EntityFrameworkCore.Metadata.Conventions;
using Microsoft.Extensions.Logging;
-namespace Jellyfin.Server.Implementations;
+namespace Jellyfin.Database.Implementations;
///
///
@@ -16,7 +14,8 @@ namespace Jellyfin.Server.Implementations;
///
/// The database context options.
/// Logger.
-public class JellyfinDbContext(DbContextOptions options, ILogger logger) : DbContext(options)
+/// The provider for the database engine specific operations.
+public class JellyfinDbContext(DbContextOptions options, ILogger logger, IJellyfinDatabaseProvider jellyfinDatabaseProvider) : DbContext(options)
{
///
/// Gets the containing the access schedules.
@@ -267,29 +266,17 @@ public class JellyfinDbContext(DbContextOptions options, ILog
///
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
- modelBuilder.SetDefaultDateTimeKind(DateTimeKind.Utc);
+ jellyfinDatabaseProvider.OnModelCreating(modelBuilder);
base.OnModelCreating(modelBuilder);
// Configuration for each entity is in its own class inside 'ModelConfiguration'.
modelBuilder.ApplyConfigurationsFromAssembly(typeof(JellyfinDbContext).Assembly);
}
- ///
+ ///
protected override void ConfigureConventions(ModelConfigurationBuilder configurationBuilder)
{
- configurationBuilder.Conventions.Add(_ => new DoNotUseReturningClauseConvention());
- }
-
- private class DoNotUseReturningClauseConvention : IModelFinalizingConvention
- {
- public void ProcessModelFinalizing(
- IConventionModelBuilder modelBuilder,
- IConventionContext context)
- {
- foreach (var entityType in modelBuilder.Metadata.GetEntityTypes())
- {
- entityType.UseSqlReturningClause(false);
- }
- }
+ jellyfinDatabaseProvider.ConfigureConventions(configurationBuilder);
+ base.ConfigureConventions(configurationBuilder);
}
}
diff --git a/Jellyfin.Server.Implementations/ModelConfiguration/ActivityLogConfiguration.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/ModelConfiguration/ActivityLogConfiguration.cs
similarity index 78%
rename from Jellyfin.Server.Implementations/ModelConfiguration/ActivityLogConfiguration.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/ModelConfiguration/ActivityLogConfiguration.cs
index 9a63ed9f21..a209c5b90d 100644
--- a/Jellyfin.Server.Implementations/ModelConfiguration/ActivityLogConfiguration.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/ModelConfiguration/ActivityLogConfiguration.cs
@@ -1,8 +1,8 @@
-using Jellyfin.Data.Entities;
+using Jellyfin.Database.Implementations.Entities;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
-namespace Jellyfin.Server.Implementations.ModelConfiguration;
+namespace Jellyfin.Database.Implementations.ModelConfiguration;
///
/// FluentAPI configuration for the ActivityLog entity.
diff --git a/Jellyfin.Server.Implementations/ModelConfiguration/AncestorIdConfiguration.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/ModelConfiguration/AncestorIdConfiguration.cs
similarity index 84%
rename from Jellyfin.Server.Implementations/ModelConfiguration/AncestorIdConfiguration.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/ModelConfiguration/AncestorIdConfiguration.cs
index 8cc817fb8b..1cb4a1eb1d 100644
--- a/Jellyfin.Server.Implementations/ModelConfiguration/AncestorIdConfiguration.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/ModelConfiguration/AncestorIdConfiguration.cs
@@ -1,9 +1,8 @@
-using System;
-using Jellyfin.Data.Entities;
+using Jellyfin.Database.Implementations.Entities;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
-namespace Jellyfin.Server.Implementations.ModelConfiguration;
+namespace Jellyfin.Database.Implementations.ModelConfiguration;
///
/// AncestorId configuration.
diff --git a/Jellyfin.Server.Implementations/ModelConfiguration/ApiKeyConfiguration.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/ModelConfiguration/ApiKeyConfiguration.cs
similarity index 80%
rename from Jellyfin.Server.Implementations/ModelConfiguration/ApiKeyConfiguration.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/ModelConfiguration/ApiKeyConfiguration.cs
index 3f19b6986a..ea382c7183 100644
--- a/Jellyfin.Server.Implementations/ModelConfiguration/ApiKeyConfiguration.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/ModelConfiguration/ApiKeyConfiguration.cs
@@ -1,8 +1,8 @@
-using Jellyfin.Data.Entities.Security;
+using Jellyfin.Database.Implementations.Entities.Security;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
-namespace Jellyfin.Server.Implementations.ModelConfiguration
+namespace Jellyfin.Database.Implementations.ModelConfiguration
{
///
/// FluentAPI configuration for the ApiKey entity.
diff --git a/Jellyfin.Server.Implementations/ModelConfiguration/AttachmentStreamInfoConfiguration.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/ModelConfiguration/AttachmentStreamInfoConfiguration.cs
similarity index 79%
rename from Jellyfin.Server.Implementations/ModelConfiguration/AttachmentStreamInfoConfiguration.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/ModelConfiguration/AttachmentStreamInfoConfiguration.cs
index 057b6689ac..66cafc83cf 100644
--- a/Jellyfin.Server.Implementations/ModelConfiguration/AttachmentStreamInfoConfiguration.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/ModelConfiguration/AttachmentStreamInfoConfiguration.cs
@@ -1,8 +1,8 @@
-using Jellyfin.Data.Entities;
+using Jellyfin.Database.Implementations.Entities;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
-namespace Jellyfin.Server.Implementations.ModelConfiguration;
+namespace Jellyfin.Database.Implementations.ModelConfiguration;
///
/// FluentAPI configuration for the AttachmentStreamInfo entity.
diff --git a/Jellyfin.Server.Implementations/ModelConfiguration/BaseItemConfiguration.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/ModelConfiguration/BaseItemConfiguration.cs
similarity index 95%
rename from Jellyfin.Server.Implementations/ModelConfiguration/BaseItemConfiguration.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/ModelConfiguration/BaseItemConfiguration.cs
index eaf48981cd..37816faece 100644
--- a/Jellyfin.Server.Implementations/ModelConfiguration/BaseItemConfiguration.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/ModelConfiguration/BaseItemConfiguration.cs
@@ -1,10 +1,8 @@
-using System;
-using Jellyfin.Data.Entities;
+using Jellyfin.Database.Implementations.Entities;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
-using SQLitePCL;
-namespace Jellyfin.Server.Implementations.ModelConfiguration;
+namespace Jellyfin.Database.Implementations.ModelConfiguration;
///
/// Configuration for BaseItem.
diff --git a/Jellyfin.Server.Implementations/ModelConfiguration/BaseItemMetadataFieldConfiguration.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/ModelConfiguration/BaseItemMetadataFieldConfiguration.cs
similarity index 73%
rename from Jellyfin.Server.Implementations/ModelConfiguration/BaseItemMetadataFieldConfiguration.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/ModelConfiguration/BaseItemMetadataFieldConfiguration.cs
index 137f4a883b..a602ea65f4 100644
--- a/Jellyfin.Server.Implementations/ModelConfiguration/BaseItemMetadataFieldConfiguration.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/ModelConfiguration/BaseItemMetadataFieldConfiguration.cs
@@ -1,12 +1,8 @@
-using System;
-using System.Linq;
-using Jellyfin.Data.Entities;
-using MediaBrowser.Model.Entities;
+using Jellyfin.Database.Implementations.Entities;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
-using SQLitePCL;
-namespace Jellyfin.Server.Implementations.ModelConfiguration;
+namespace Jellyfin.Database.Implementations.ModelConfiguration;
///
/// Provides configuration for the BaseItemMetadataField entity.
diff --git a/Jellyfin.Server.Implementations/ModelConfiguration/BaseItemProviderConfiguration.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/ModelConfiguration/BaseItemProviderConfiguration.cs
similarity index 82%
rename from Jellyfin.Server.Implementations/ModelConfiguration/BaseItemProviderConfiguration.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/ModelConfiguration/BaseItemProviderConfiguration.cs
index d15049a1fa..dd28000ba6 100644
--- a/Jellyfin.Server.Implementations/ModelConfiguration/BaseItemProviderConfiguration.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/ModelConfiguration/BaseItemProviderConfiguration.cs
@@ -1,9 +1,8 @@
-using System;
-using Jellyfin.Data.Entities;
+using Jellyfin.Database.Implementations.Entities;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
-namespace Jellyfin.Server.Implementations.ModelConfiguration;
+namespace Jellyfin.Database.Implementations.ModelConfiguration;
///
/// BaseItemProvider configuration.
diff --git a/Jellyfin.Server.Implementations/ModelConfiguration/BaseItemTrailerTypeConfiguration.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/ModelConfiguration/BaseItemTrailerTypeConfiguration.cs
similarity index 73%
rename from Jellyfin.Server.Implementations/ModelConfiguration/BaseItemTrailerTypeConfiguration.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/ModelConfiguration/BaseItemTrailerTypeConfiguration.cs
index f03d99c29c..2a888b7de8 100644
--- a/Jellyfin.Server.Implementations/ModelConfiguration/BaseItemTrailerTypeConfiguration.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/ModelConfiguration/BaseItemTrailerTypeConfiguration.cs
@@ -1,12 +1,8 @@
-using System;
-using System.Linq;
-using Jellyfin.Data.Entities;
-using MediaBrowser.Model.Entities;
+using Jellyfin.Database.Implementations.Entities;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
-using SQLitePCL;
-namespace Jellyfin.Server.Implementations.ModelConfiguration;
+namespace Jellyfin.Database.Implementations.ModelConfiguration;
///
/// Provides configuration for the BaseItemMetadataField entity.
diff --git a/Jellyfin.Server.Implementations/ModelConfiguration/ChapterConfiguration.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/ModelConfiguration/ChapterConfiguration.cs
similarity index 78%
rename from Jellyfin.Server.Implementations/ModelConfiguration/ChapterConfiguration.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/ModelConfiguration/ChapterConfiguration.cs
index 5a84f7750a..d97a39f4d2 100644
--- a/Jellyfin.Server.Implementations/ModelConfiguration/ChapterConfiguration.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/ModelConfiguration/ChapterConfiguration.cs
@@ -1,9 +1,8 @@
-using System;
-using Jellyfin.Data.Entities;
+using Jellyfin.Database.Implementations.Entities;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
-namespace Jellyfin.Server.Implementations.ModelConfiguration;
+namespace Jellyfin.Database.Implementations.ModelConfiguration;
///
/// Chapter configuration.
diff --git a/Jellyfin.Server.Implementations/ModelConfiguration/CustomItemDisplayPreferencesConfiguration.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/ModelConfiguration/CustomItemDisplayPreferencesConfiguration.cs
similarity index 84%
rename from Jellyfin.Server.Implementations/ModelConfiguration/CustomItemDisplayPreferencesConfiguration.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/ModelConfiguration/CustomItemDisplayPreferencesConfiguration.cs
index 779aec986b..e8a510ab97 100644
--- a/Jellyfin.Server.Implementations/ModelConfiguration/CustomItemDisplayPreferencesConfiguration.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/ModelConfiguration/CustomItemDisplayPreferencesConfiguration.cs
@@ -1,8 +1,8 @@
-using Jellyfin.Data.Entities;
+using Jellyfin.Database.Implementations.Entities;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
-namespace Jellyfin.Server.Implementations.ModelConfiguration
+namespace Jellyfin.Database.Implementations.ModelConfiguration
{
///
/// FluentAPI configuration for the CustomItemDisplayPreferences entity.
diff --git a/Jellyfin.Server.Implementations/ModelConfiguration/DeviceConfiguration.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/ModelConfiguration/DeviceConfiguration.cs
similarity index 86%
rename from Jellyfin.Server.Implementations/ModelConfiguration/DeviceConfiguration.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/ModelConfiguration/DeviceConfiguration.cs
index a750b65c03..3551f76863 100644
--- a/Jellyfin.Server.Implementations/ModelConfiguration/DeviceConfiguration.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/ModelConfiguration/DeviceConfiguration.cs
@@ -1,8 +1,8 @@
-using Jellyfin.Data.Entities.Security;
+using Jellyfin.Database.Implementations.Entities.Security;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
-namespace Jellyfin.Server.Implementations.ModelConfiguration
+namespace Jellyfin.Database.Implementations.ModelConfiguration
{
///
/// FluentAPI configuration for the Device entity.
diff --git a/Jellyfin.Server.Implementations/ModelConfiguration/DeviceOptionsConfiguration.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/ModelConfiguration/DeviceOptionsConfiguration.cs
similarity index 80%
rename from Jellyfin.Server.Implementations/ModelConfiguration/DeviceOptionsConfiguration.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/ModelConfiguration/DeviceOptionsConfiguration.cs
index 038afd7524..9055e80253 100644
--- a/Jellyfin.Server.Implementations/ModelConfiguration/DeviceOptionsConfiguration.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/ModelConfiguration/DeviceOptionsConfiguration.cs
@@ -1,8 +1,8 @@
-using Jellyfin.Data.Entities.Security;
+using Jellyfin.Database.Implementations.Entities.Security;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
-namespace Jellyfin.Server.Implementations.ModelConfiguration
+namespace Jellyfin.Database.Implementations.ModelConfiguration
{
///
/// FluentAPI configuration for the DeviceOptions entity.
diff --git a/Jellyfin.Server.Implementations/ModelConfiguration/DisplayPreferencesConfiguration.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/ModelConfiguration/DisplayPreferencesConfiguration.cs
similarity index 86%
rename from Jellyfin.Server.Implementations/ModelConfiguration/DisplayPreferencesConfiguration.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/ModelConfiguration/DisplayPreferencesConfiguration.cs
index 9b437861bb..45e0c64824 100644
--- a/Jellyfin.Server.Implementations/ModelConfiguration/DisplayPreferencesConfiguration.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/ModelConfiguration/DisplayPreferencesConfiguration.cs
@@ -1,8 +1,8 @@
-using Jellyfin.Data.Entities;
+using Jellyfin.Database.Implementations.Entities;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
-namespace Jellyfin.Server.Implementations.ModelConfiguration
+namespace Jellyfin.Database.Implementations.ModelConfiguration
{
///
/// FluentAPI configuration for the DisplayPreferencesConfiguration entity.
diff --git a/Jellyfin.Server.Implementations/ModelConfiguration/ItemValuesConfiguration.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/ModelConfiguration/ItemValuesConfiguration.cs
similarity index 79%
rename from Jellyfin.Server.Implementations/ModelConfiguration/ItemValuesConfiguration.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/ModelConfiguration/ItemValuesConfiguration.cs
index abeeb09c9b..c8e003eaa1 100644
--- a/Jellyfin.Server.Implementations/ModelConfiguration/ItemValuesConfiguration.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/ModelConfiguration/ItemValuesConfiguration.cs
@@ -1,9 +1,8 @@
-using System;
-using Jellyfin.Data.Entities;
+using Jellyfin.Database.Implementations.Entities;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
-namespace Jellyfin.Server.Implementations.ModelConfiguration;
+namespace Jellyfin.Database.Implementations.ModelConfiguration;
///
/// itemvalues Configuration.
diff --git a/Jellyfin.Server.Implementations/ModelConfiguration/ItemValuesMapConfiguration.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/ModelConfiguration/ItemValuesMapConfiguration.cs
similarity index 80%
rename from Jellyfin.Server.Implementations/ModelConfiguration/ItemValuesMapConfiguration.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/ModelConfiguration/ItemValuesMapConfiguration.cs
index 9c22b114c7..42ef235326 100644
--- a/Jellyfin.Server.Implementations/ModelConfiguration/ItemValuesMapConfiguration.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/ModelConfiguration/ItemValuesMapConfiguration.cs
@@ -1,9 +1,8 @@
-using System;
-using Jellyfin.Data.Entities;
+using Jellyfin.Database.Implementations.Entities;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
-namespace Jellyfin.Server.Implementations.ModelConfiguration;
+namespace Jellyfin.Database.Implementations.ModelConfiguration;
///
/// itemvalues Configuration.
diff --git a/Jellyfin.Server.Implementations/ModelConfiguration/MediaStreamInfoConfiguration.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/ModelConfiguration/MediaStreamInfoConfiguration.cs
similarity index 84%
rename from Jellyfin.Server.Implementations/ModelConfiguration/MediaStreamInfoConfiguration.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/ModelConfiguration/MediaStreamInfoConfiguration.cs
index 7e572f9a39..075af2c053 100644
--- a/Jellyfin.Server.Implementations/ModelConfiguration/MediaStreamInfoConfiguration.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/ModelConfiguration/MediaStreamInfoConfiguration.cs
@@ -1,9 +1,8 @@
-using System;
-using Jellyfin.Data.Entities;
+using Jellyfin.Database.Implementations.Entities;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
-namespace Jellyfin.Server.Implementations.ModelConfiguration;
+namespace Jellyfin.Database.Implementations.ModelConfiguration;
///
/// People configuration.
diff --git a/Jellyfin.Server.Implementations/ModelConfiguration/PeopleBaseItemMapConfiguration.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/ModelConfiguration/PeopleBaseItemMapConfiguration.cs
similarity index 84%
rename from Jellyfin.Server.Implementations/ModelConfiguration/PeopleBaseItemMapConfiguration.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/ModelConfiguration/PeopleBaseItemMapConfiguration.cs
index cdaee9161c..5e3ab44433 100644
--- a/Jellyfin.Server.Implementations/ModelConfiguration/PeopleBaseItemMapConfiguration.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/ModelConfiguration/PeopleBaseItemMapConfiguration.cs
@@ -1,9 +1,8 @@
-using System;
-using Jellyfin.Data.Entities;
+using Jellyfin.Database.Implementations.Entities;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
-namespace Jellyfin.Server.Implementations.ModelConfiguration;
+namespace Jellyfin.Database.Implementations.ModelConfiguration;
///
/// People configuration.
diff --git a/Jellyfin.Server.Implementations/ModelConfiguration/PeopleConfiguration.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/ModelConfiguration/PeopleConfiguration.cs
similarity index 79%
rename from Jellyfin.Server.Implementations/ModelConfiguration/PeopleConfiguration.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/ModelConfiguration/PeopleConfiguration.cs
index f3cccb13fe..e8f77a8067 100644
--- a/Jellyfin.Server.Implementations/ModelConfiguration/PeopleConfiguration.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/ModelConfiguration/PeopleConfiguration.cs
@@ -1,9 +1,8 @@
-using System;
-using Jellyfin.Data.Entities;
+using Jellyfin.Database.Implementations.Entities;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
-namespace Jellyfin.Server.Implementations.ModelConfiguration;
+namespace Jellyfin.Database.Implementations.ModelConfiguration;
///
/// People configuration.
diff --git a/Jellyfin.Server.Implementations/ModelConfiguration/PermissionConfiguration.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/ModelConfiguration/PermissionConfiguration.cs
similarity index 87%
rename from Jellyfin.Server.Implementations/ModelConfiguration/PermissionConfiguration.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/ModelConfiguration/PermissionConfiguration.cs
index 240e284c0c..d2aed54eb1 100644
--- a/Jellyfin.Server.Implementations/ModelConfiguration/PermissionConfiguration.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/ModelConfiguration/PermissionConfiguration.cs
@@ -1,8 +1,8 @@
-using Jellyfin.Data.Entities;
+using Jellyfin.Database.Implementations.Entities;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
-namespace Jellyfin.Server.Implementations.ModelConfiguration
+namespace Jellyfin.Database.Implementations.ModelConfiguration
{
///
/// FluentAPI configuration for the Permission entity.
diff --git a/Jellyfin.Server.Implementations/ModelConfiguration/PreferenceConfiguration.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/ModelConfiguration/PreferenceConfiguration.cs
similarity index 83%
rename from Jellyfin.Server.Implementations/ModelConfiguration/PreferenceConfiguration.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/ModelConfiguration/PreferenceConfiguration.cs
index 49c869c6a8..207051bcd1 100644
--- a/Jellyfin.Server.Implementations/ModelConfiguration/PreferenceConfiguration.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/ModelConfiguration/PreferenceConfiguration.cs
@@ -1,8 +1,8 @@
-using Jellyfin.Data.Entities;
+using Jellyfin.Database.Implementations.Entities;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
-namespace Jellyfin.Server.Implementations.ModelConfiguration
+namespace Jellyfin.Database.Implementations.ModelConfiguration
{
///
/// FluentAPI configuration for the Permission entity.
diff --git a/Jellyfin.Server.Implementations/ModelConfiguration/TrickplayInfoConfiguration.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/ModelConfiguration/TrickplayInfoConfiguration.cs
similarity index 80%
rename from Jellyfin.Server.Implementations/ModelConfiguration/TrickplayInfoConfiguration.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/ModelConfiguration/TrickplayInfoConfiguration.cs
index dc1c17e5ef..1b364a05ed 100644
--- a/Jellyfin.Server.Implementations/ModelConfiguration/TrickplayInfoConfiguration.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/ModelConfiguration/TrickplayInfoConfiguration.cs
@@ -1,8 +1,8 @@
-using Jellyfin.Data.Entities;
+using Jellyfin.Database.Implementations.Entities;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
-namespace Jellyfin.Server.Implementations.ModelConfiguration
+namespace Jellyfin.Database.Implementations.ModelConfiguration
{
///
/// FluentAPI configuration for the TrickplayInfo entity.
diff --git a/Jellyfin.Server.Implementations/ModelConfiguration/UserConfiguration.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/ModelConfiguration/UserConfiguration.cs
similarity index 89%
rename from Jellyfin.Server.Implementations/ModelConfiguration/UserConfiguration.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/ModelConfiguration/UserConfiguration.cs
index a369cf6562..61b5e06e8a 100644
--- a/Jellyfin.Server.Implementations/ModelConfiguration/UserConfiguration.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/ModelConfiguration/UserConfiguration.cs
@@ -1,8 +1,8 @@
-using Jellyfin.Data.Entities;
+using Jellyfin.Database.Implementations.Entities;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
-namespace Jellyfin.Server.Implementations.ModelConfiguration
+namespace Jellyfin.Database.Implementations.ModelConfiguration
{
///
/// FluentAPI configuration for the User entity.
@@ -13,8 +13,7 @@ namespace Jellyfin.Server.Implementations.ModelConfiguration
public void Configure(EntityTypeBuilder builder)
{
builder
- .Property(user => user.Username)
- .UseCollation("NOCASE");
+ .Property(user => user.Username);
builder
.HasOne(u => u.ProfileImage)
diff --git a/Jellyfin.Server.Implementations/ModelConfiguration/UserDataConfiguration.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/ModelConfiguration/UserDataConfiguration.cs
similarity index 87%
rename from Jellyfin.Server.Implementations/ModelConfiguration/UserDataConfiguration.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Implementations/ModelConfiguration/UserDataConfiguration.cs
index 7bbb28d431..47604d3217 100644
--- a/Jellyfin.Server.Implementations/ModelConfiguration/UserDataConfiguration.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/ModelConfiguration/UserDataConfiguration.cs
@@ -1,9 +1,8 @@
-using System;
-using Jellyfin.Data.Entities;
+using Jellyfin.Database.Implementations.Entities;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
-namespace Jellyfin.Server.Implementations.ModelConfiguration;
+namespace Jellyfin.Database.Implementations.ModelConfiguration;
///
/// FluentAPI configuration for the UserData entity.
diff --git a/src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/DoNotUseReturningClauseConvention.cs b/src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/DoNotUseReturningClauseConvention.cs
new file mode 100644
index 0000000000..18f336dda8
--- /dev/null
+++ b/src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/DoNotUseReturningClauseConvention.cs
@@ -0,0 +1,20 @@
+using System;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Metadata.Builders;
+using Microsoft.EntityFrameworkCore.Metadata.Conventions;
+
+namespace Jellyfin.Database.Providers.Sqlite;
+
+internal class DoNotUseReturningClauseConvention : IModelFinalizingConvention
+{
+ ///
+ public void ProcessModelFinalizing(
+ IConventionModelBuilder modelBuilder,
+ IConventionContext context)
+ {
+ foreach (var entityType in modelBuilder.Metadata.GetEntityTypes())
+ {
+ entityType.UseSqlReturningClause(false);
+ }
+ }
+}
diff --git a/src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Jellyfin.Database.Providers.Sqlite.csproj b/src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Jellyfin.Database.Providers.Sqlite.csproj
new file mode 100644
index 0000000000..03e5fc4958
--- /dev/null
+++ b/src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Jellyfin.Database.Providers.Sqlite.csproj
@@ -0,0 +1,31 @@
+
+
+
+ net9.0
+ false
+ true
+
+
+
+
+
+
+
+
+
+
+ all
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+
+
+ all
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+
+
+
+
+
+
+
+
+
diff --git a/Jellyfin.Server.Implementations/Migrations/.gitattributes b/src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/.gitattributes
similarity index 100%
rename from Jellyfin.Server.Implementations/Migrations/.gitattributes
rename to src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/.gitattributes
diff --git a/Jellyfin.Server.Implementations/Migrations/20200514181226_AddActivityLog.Designer.cs b/src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20200514181226_AddActivityLog.Designer.cs
similarity index 98%
rename from Jellyfin.Server.Implementations/Migrations/20200514181226_AddActivityLog.Designer.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20200514181226_AddActivityLog.Designer.cs
index 80fe784dd7..7891006430 100644
--- a/Jellyfin.Server.Implementations/Migrations/20200514181226_AddActivityLog.Designer.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20200514181226_AddActivityLog.Designer.cs
@@ -2,7 +2,7 @@
//
using System;
-using Jellyfin.Server.Implementations;
+using Jellyfin.Database.Implementations;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
diff --git a/Jellyfin.Server.Implementations/Migrations/20200514181226_AddActivityLog.cs b/src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20200514181226_AddActivityLog.cs
similarity index 100%
rename from Jellyfin.Server.Implementations/Migrations/20200514181226_AddActivityLog.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20200514181226_AddActivityLog.cs
diff --git a/Jellyfin.Server.Implementations/Migrations/20200613202153_AddUsers.Designer.cs b/src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20200613202153_AddUsers.Designer.cs
similarity index 99%
rename from Jellyfin.Server.Implementations/Migrations/20200613202153_AddUsers.Designer.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20200613202153_AddUsers.Designer.cs
index 7aa4479b3d..eab3cd3e7e 100644
--- a/Jellyfin.Server.Implementations/Migrations/20200613202153_AddUsers.Designer.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20200613202153_AddUsers.Designer.cs
@@ -2,7 +2,7 @@
//
using System;
-using Jellyfin.Server.Implementations;
+using Jellyfin.Database.Implementations;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
diff --git a/Jellyfin.Server.Implementations/Migrations/20200613202153_AddUsers.cs b/src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20200613202153_AddUsers.cs
similarity index 100%
rename from Jellyfin.Server.Implementations/Migrations/20200613202153_AddUsers.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20200613202153_AddUsers.cs
diff --git a/Jellyfin.Server.Implementations/Migrations/20200728005145_AddDisplayPreferences.Designer.cs b/src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20200728005145_AddDisplayPreferences.Designer.cs
similarity index 99%
rename from Jellyfin.Server.Implementations/Migrations/20200728005145_AddDisplayPreferences.Designer.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20200728005145_AddDisplayPreferences.Designer.cs
index 3860c851d0..91dd0ff7ab 100644
--- a/Jellyfin.Server.Implementations/Migrations/20200728005145_AddDisplayPreferences.Designer.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20200728005145_AddDisplayPreferences.Designer.cs
@@ -2,7 +2,7 @@
//
using System;
-using Jellyfin.Server.Implementations;
+using Jellyfin.Database.Implementations;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
diff --git a/Jellyfin.Server.Implementations/Migrations/20200728005145_AddDisplayPreferences.cs b/src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20200728005145_AddDisplayPreferences.cs
similarity index 100%
rename from Jellyfin.Server.Implementations/Migrations/20200728005145_AddDisplayPreferences.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20200728005145_AddDisplayPreferences.cs
diff --git a/Jellyfin.Server.Implementations/Migrations/20200905220533_FixDisplayPreferencesIndex.Designer.cs b/src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20200905220533_FixDisplayPreferencesIndex.Designer.cs
similarity index 99%
rename from Jellyfin.Server.Implementations/Migrations/20200905220533_FixDisplayPreferencesIndex.Designer.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20200905220533_FixDisplayPreferencesIndex.Designer.cs
index 1134f7aa42..8ec9231030 100644
--- a/Jellyfin.Server.Implementations/Migrations/20200905220533_FixDisplayPreferencesIndex.Designer.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20200905220533_FixDisplayPreferencesIndex.Designer.cs
@@ -2,7 +2,7 @@
//
using System;
-using Jellyfin.Server.Implementations;
+using Jellyfin.Database.Implementations;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
diff --git a/Jellyfin.Server.Implementations/Migrations/20200905220533_FixDisplayPreferencesIndex.cs b/src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20200905220533_FixDisplayPreferencesIndex.cs
similarity index 100%
rename from Jellyfin.Server.Implementations/Migrations/20200905220533_FixDisplayPreferencesIndex.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20200905220533_FixDisplayPreferencesIndex.cs
diff --git a/Jellyfin.Server.Implementations/Migrations/20201004171403_AddMaxActiveSessions.Designer.cs b/src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20201004171403_AddMaxActiveSessions.Designer.cs
similarity index 99%
rename from Jellyfin.Server.Implementations/Migrations/20201004171403_AddMaxActiveSessions.Designer.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20201004171403_AddMaxActiveSessions.Designer.cs
index 607310caae..499faa9c47 100644
--- a/Jellyfin.Server.Implementations/Migrations/20201004171403_AddMaxActiveSessions.Designer.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20201004171403_AddMaxActiveSessions.Designer.cs
@@ -2,7 +2,7 @@
//
using System;
-using Jellyfin.Server.Implementations;
+using Jellyfin.Database.Implementations;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
diff --git a/Jellyfin.Server.Implementations/Migrations/20201004171403_AddMaxActiveSessions.cs b/src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20201004171403_AddMaxActiveSessions.cs
similarity index 100%
rename from Jellyfin.Server.Implementations/Migrations/20201004171403_AddMaxActiveSessions.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20201004171403_AddMaxActiveSessions.cs
diff --git a/Jellyfin.Server.Implementations/Migrations/20201204223655_AddCustomDisplayPreferences.Designer.cs b/src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20201204223655_AddCustomDisplayPreferences.Designer.cs
similarity index 99%
rename from Jellyfin.Server.Implementations/Migrations/20201204223655_AddCustomDisplayPreferences.Designer.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20201204223655_AddCustomDisplayPreferences.Designer.cs
index 02c3fc7532..7ab851689a 100644
--- a/Jellyfin.Server.Implementations/Migrations/20201204223655_AddCustomDisplayPreferences.Designer.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20201204223655_AddCustomDisplayPreferences.Designer.cs
@@ -1,7 +1,7 @@
#pragma warning disable CS1591
//
using System;
-using Jellyfin.Server.Implementations;
+using Jellyfin.Database.Implementations;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
diff --git a/Jellyfin.Server.Implementations/Migrations/20201204223655_AddCustomDisplayPreferences.cs b/src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20201204223655_AddCustomDisplayPreferences.cs
similarity index 100%
rename from Jellyfin.Server.Implementations/Migrations/20201204223655_AddCustomDisplayPreferences.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20201204223655_AddCustomDisplayPreferences.cs
diff --git a/Jellyfin.Server.Implementations/Migrations/20210320181425_AddIndexesAndCollations.Designer.cs b/src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20210320181425_AddIndexesAndCollations.Designer.cs
similarity index 99%
rename from Jellyfin.Server.Implementations/Migrations/20210320181425_AddIndexesAndCollations.Designer.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20210320181425_AddIndexesAndCollations.Designer.cs
index 1cfd7112ce..e14ed9380e 100644
--- a/Jellyfin.Server.Implementations/Migrations/20210320181425_AddIndexesAndCollations.Designer.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20210320181425_AddIndexesAndCollations.Designer.cs
@@ -2,7 +2,7 @@
//
using System;
-using Jellyfin.Server.Implementations;
+using Jellyfin.Database.Implementations;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
diff --git a/Jellyfin.Server.Implementations/Migrations/20210320181425_AddIndexesAndCollations.cs b/src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20210320181425_AddIndexesAndCollations.cs
similarity index 100%
rename from Jellyfin.Server.Implementations/Migrations/20210320181425_AddIndexesAndCollations.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20210320181425_AddIndexesAndCollations.cs
diff --git a/Jellyfin.Server.Implementations/Migrations/20210407110544_NullableCustomPrefValue.Designer.cs b/src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20210407110544_NullableCustomPrefValue.Designer.cs
similarity index 99%
rename from Jellyfin.Server.Implementations/Migrations/20210407110544_NullableCustomPrefValue.Designer.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20210407110544_NullableCustomPrefValue.Designer.cs
index ecf7af4952..05f2c80a25 100644
--- a/Jellyfin.Server.Implementations/Migrations/20210407110544_NullableCustomPrefValue.Designer.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20210407110544_NullableCustomPrefValue.Designer.cs
@@ -1,7 +1,7 @@
#pragma warning disable CS1591
//
using System;
-using Jellyfin.Server.Implementations;
+using Jellyfin.Database.Implementations;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
diff --git a/Jellyfin.Server.Implementations/Migrations/20210407110544_NullableCustomPrefValue.cs b/src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20210407110544_NullableCustomPrefValue.cs
similarity index 100%
rename from Jellyfin.Server.Implementations/Migrations/20210407110544_NullableCustomPrefValue.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20210407110544_NullableCustomPrefValue.cs
diff --git a/Jellyfin.Server.Implementations/Migrations/20210814002109_AddDevices.Designer.cs b/src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20210814002109_AddDevices.Designer.cs
similarity index 99%
rename from Jellyfin.Server.Implementations/Migrations/20210814002109_AddDevices.Designer.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20210814002109_AddDevices.Designer.cs
index dccba6f773..c9f3cf696c 100644
--- a/Jellyfin.Server.Implementations/Migrations/20210814002109_AddDevices.Designer.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20210814002109_AddDevices.Designer.cs
@@ -2,7 +2,7 @@
//
using System;
-using Jellyfin.Server.Implementations;
+using Jellyfin.Database.Implementations;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
diff --git a/Jellyfin.Server.Implementations/Migrations/20210814002109_AddDevices.cs b/src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20210814002109_AddDevices.cs
similarity index 100%
rename from Jellyfin.Server.Implementations/Migrations/20210814002109_AddDevices.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20210814002109_AddDevices.cs
diff --git a/Jellyfin.Server.Implementations/Migrations/20221022080052_AddIndexActivityLogsDateCreated.Designer.cs b/src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20221022080052_AddIndexActivityLogsDateCreated.Designer.cs
similarity index 99%
rename from Jellyfin.Server.Implementations/Migrations/20221022080052_AddIndexActivityLogsDateCreated.Designer.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20221022080052_AddIndexActivityLogsDateCreated.Designer.cs
index e821c106e3..ab7781d155 100644
--- a/Jellyfin.Server.Implementations/Migrations/20221022080052_AddIndexActivityLogsDateCreated.Designer.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20221022080052_AddIndexActivityLogsDateCreated.Designer.cs
@@ -2,7 +2,7 @@
//
using System;
-using Jellyfin.Server.Implementations;
+using Jellyfin.Database.Implementations;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
diff --git a/Jellyfin.Server.Implementations/Migrations/20221022080052_AddIndexActivityLogsDateCreated.cs b/src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20221022080052_AddIndexActivityLogsDateCreated.cs
similarity index 100%
rename from Jellyfin.Server.Implementations/Migrations/20221022080052_AddIndexActivityLogsDateCreated.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20221022080052_AddIndexActivityLogsDateCreated.cs
diff --git a/Jellyfin.Server.Implementations/Migrations/20230526173516_RemoveEasyPassword.Designer.cs b/src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20230526173516_RemoveEasyPassword.Designer.cs
similarity index 99%
rename from Jellyfin.Server.Implementations/Migrations/20230526173516_RemoveEasyPassword.Designer.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20230526173516_RemoveEasyPassword.Designer.cs
index 360fa03768..8a2806113f 100644
--- a/Jellyfin.Server.Implementations/Migrations/20230526173516_RemoveEasyPassword.Designer.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20230526173516_RemoveEasyPassword.Designer.cs
@@ -1,6 +1,6 @@
//
using System;
-using Jellyfin.Server.Implementations;
+using Jellyfin.Database.Implementations;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
diff --git a/Jellyfin.Server.Implementations/Migrations/20230526173516_RemoveEasyPassword.cs b/src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20230526173516_RemoveEasyPassword.cs
similarity index 100%
rename from Jellyfin.Server.Implementations/Migrations/20230526173516_RemoveEasyPassword.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20230526173516_RemoveEasyPassword.cs
diff --git a/Jellyfin.Server.Implementations/Migrations/20230626233818_AddTrickplayInfos.Designer.cs b/src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20230626233818_AddTrickplayInfos.Designer.cs
similarity index 99%
rename from Jellyfin.Server.Implementations/Migrations/20230626233818_AddTrickplayInfos.Designer.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20230626233818_AddTrickplayInfos.Designer.cs
index 17d33845f5..a11507bd5d 100644
--- a/Jellyfin.Server.Implementations/Migrations/20230626233818_AddTrickplayInfos.Designer.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20230626233818_AddTrickplayInfos.Designer.cs
@@ -1,6 +1,6 @@
//
using System;
-using Jellyfin.Server.Implementations;
+using Jellyfin.Database.Implementations;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
diff --git a/Jellyfin.Server.Implementations/Migrations/20230626233818_AddTrickplayInfos.cs b/src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20230626233818_AddTrickplayInfos.cs
similarity index 100%
rename from Jellyfin.Server.Implementations/Migrations/20230626233818_AddTrickplayInfos.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20230626233818_AddTrickplayInfos.cs
diff --git a/Jellyfin.Server.Implementations/Migrations/20230923170422_UserCastReceiver.Designer.cs b/src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20230923170422_UserCastReceiver.Designer.cs
similarity index 99%
rename from Jellyfin.Server.Implementations/Migrations/20230923170422_UserCastReceiver.Designer.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20230923170422_UserCastReceiver.Designer.cs
index 4c09176691..ddea37f6dd 100644
--- a/Jellyfin.Server.Implementations/Migrations/20230923170422_UserCastReceiver.Designer.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20230923170422_UserCastReceiver.Designer.cs
@@ -1,6 +1,6 @@
//
using System;
-using Jellyfin.Server.Implementations;
+using Jellyfin.Database.Implementations;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
diff --git a/Jellyfin.Server.Implementations/Migrations/20230923170422_UserCastReceiver.cs b/src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20230923170422_UserCastReceiver.cs
similarity index 100%
rename from Jellyfin.Server.Implementations/Migrations/20230923170422_UserCastReceiver.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20230923170422_UserCastReceiver.cs
diff --git a/Jellyfin.Server.Implementations/Migrations/20240729140605_AddMediaSegments.Designer.cs b/src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20240729140605_AddMediaSegments.Designer.cs
similarity index 99%
rename from Jellyfin.Server.Implementations/Migrations/20240729140605_AddMediaSegments.Designer.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20240729140605_AddMediaSegments.Designer.cs
index 35a3cdad2d..ab7065ee65 100644
--- a/Jellyfin.Server.Implementations/Migrations/20240729140605_AddMediaSegments.Designer.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20240729140605_AddMediaSegments.Designer.cs
@@ -1,6 +1,6 @@
//
using System;
-using Jellyfin.Server.Implementations;
+using Jellyfin.Database.Implementations;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
diff --git a/Jellyfin.Server.Implementations/Migrations/20240729140605_AddMediaSegments.cs b/src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20240729140605_AddMediaSegments.cs
similarity index 100%
rename from Jellyfin.Server.Implementations/Migrations/20240729140605_AddMediaSegments.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20240729140605_AddMediaSegments.cs
diff --git a/Jellyfin.Server.Implementations/Migrations/20240928082930_MarkSegmentProviderIdNonNullable.Designer.cs b/src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20240928082930_MarkSegmentProviderIdNonNullable.Designer.cs
similarity index 99%
rename from Jellyfin.Server.Implementations/Migrations/20240928082930_MarkSegmentProviderIdNonNullable.Designer.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20240928082930_MarkSegmentProviderIdNonNullable.Designer.cs
index 8dba31a67f..aa60bff324 100644
--- a/Jellyfin.Server.Implementations/Migrations/20240928082930_MarkSegmentProviderIdNonNullable.Designer.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20240928082930_MarkSegmentProviderIdNonNullable.Designer.cs
@@ -1,6 +1,6 @@
//
using System;
-using Jellyfin.Server.Implementations;
+using Jellyfin.Database.Implementations;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
diff --git a/Jellyfin.Server.Implementations/Migrations/20240928082930_MarkSegmentProviderIdNonNullable.cs b/src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20240928082930_MarkSegmentProviderIdNonNullable.cs
similarity index 100%
rename from Jellyfin.Server.Implementations/Migrations/20240928082930_MarkSegmentProviderIdNonNullable.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20240928082930_MarkSegmentProviderIdNonNullable.cs
diff --git a/Jellyfin.Server.Implementations/Migrations/20241020103111_LibraryDbMigration.Designer.cs b/src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20241020103111_LibraryDbMigration.Designer.cs
similarity index 99%
rename from Jellyfin.Server.Implementations/Migrations/20241020103111_LibraryDbMigration.Designer.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20241020103111_LibraryDbMigration.Designer.cs
index 27745f601a..2ea6dafe13 100644
--- a/Jellyfin.Server.Implementations/Migrations/20241020103111_LibraryDbMigration.Designer.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20241020103111_LibraryDbMigration.Designer.cs
@@ -1,6 +1,6 @@
//
using System;
-using Jellyfin.Server.Implementations;
+using Jellyfin.Database.Implementations;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
diff --git a/Jellyfin.Server.Implementations/Migrations/20241020103111_LibraryDbMigration.cs b/src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20241020103111_LibraryDbMigration.cs
similarity index 100%
rename from Jellyfin.Server.Implementations/Migrations/20241020103111_LibraryDbMigration.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20241020103111_LibraryDbMigration.cs
diff --git a/Jellyfin.Server.Implementations/Migrations/20241111131257_AddedCustomDataKey.Designer.cs b/src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20241111131257_AddedCustomDataKey.Designer.cs
similarity index 99%
rename from Jellyfin.Server.Implementations/Migrations/20241111131257_AddedCustomDataKey.Designer.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20241111131257_AddedCustomDataKey.Designer.cs
index 1fbf21492d..d589a4afd7 100644
--- a/Jellyfin.Server.Implementations/Migrations/20241111131257_AddedCustomDataKey.Designer.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20241111131257_AddedCustomDataKey.Designer.cs
@@ -1,6 +1,6 @@
//
using System;
-using Jellyfin.Server.Implementations;
+using Jellyfin.Database.Implementations;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
diff --git a/Jellyfin.Server.Implementations/Migrations/20241111131257_AddedCustomDataKey.cs b/src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20241111131257_AddedCustomDataKey.cs
similarity index 100%
rename from Jellyfin.Server.Implementations/Migrations/20241111131257_AddedCustomDataKey.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20241111131257_AddedCustomDataKey.cs
diff --git a/Jellyfin.Server.Implementations/Migrations/20241111135439_AddedCustomDataKeyKey.Designer.cs b/src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20241111135439_AddedCustomDataKeyKey.Designer.cs
similarity index 99%
rename from Jellyfin.Server.Implementations/Migrations/20241111135439_AddedCustomDataKeyKey.Designer.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20241111135439_AddedCustomDataKeyKey.Designer.cs
index bac6fd5b5a..3d70bb0296 100644
--- a/Jellyfin.Server.Implementations/Migrations/20241111135439_AddedCustomDataKeyKey.Designer.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20241111135439_AddedCustomDataKeyKey.Designer.cs
@@ -1,6 +1,6 @@
//
using System;
-using Jellyfin.Server.Implementations;
+using Jellyfin.Database.Implementations;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
diff --git a/Jellyfin.Server.Implementations/Migrations/20241111135439_AddedCustomDataKeyKey.cs b/src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20241111135439_AddedCustomDataKeyKey.cs
similarity index 100%
rename from Jellyfin.Server.Implementations/Migrations/20241111135439_AddedCustomDataKeyKey.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20241111135439_AddedCustomDataKeyKey.cs
diff --git a/Jellyfin.Server.Implementations/Migrations/20241112152323_FixAncestorIdConfig.Designer.cs b/src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20241112152323_FixAncestorIdConfig.Designer.cs
similarity index 99%
rename from Jellyfin.Server.Implementations/Migrations/20241112152323_FixAncestorIdConfig.Designer.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20241112152323_FixAncestorIdConfig.Designer.cs
index ad622d44c5..1e0d3b129f 100644
--- a/Jellyfin.Server.Implementations/Migrations/20241112152323_FixAncestorIdConfig.Designer.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20241112152323_FixAncestorIdConfig.Designer.cs
@@ -1,6 +1,6 @@
//
using System;
-using Jellyfin.Server.Implementations;
+using Jellyfin.Database.Implementations;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
diff --git a/Jellyfin.Server.Implementations/Migrations/20241112152323_FixAncestorIdConfig.cs b/src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20241112152323_FixAncestorIdConfig.cs
similarity index 100%
rename from Jellyfin.Server.Implementations/Migrations/20241112152323_FixAncestorIdConfig.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20241112152323_FixAncestorIdConfig.cs
diff --git a/Jellyfin.Server.Implementations/Migrations/20241112232041_fixMediaStreams.Designer.cs b/src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20241112232041_fixMediaStreams.Designer.cs
similarity index 99%
rename from Jellyfin.Server.Implementations/Migrations/20241112232041_fixMediaStreams.Designer.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20241112232041_fixMediaStreams.Designer.cs
index dc4c8212ba..ccf67d899f 100644
--- a/Jellyfin.Server.Implementations/Migrations/20241112232041_fixMediaStreams.Designer.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20241112232041_fixMediaStreams.Designer.cs
@@ -1,6 +1,6 @@
//
using System;
-using Jellyfin.Server.Implementations;
+using Jellyfin.Database.Implementations;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
diff --git a/Jellyfin.Server.Implementations/Migrations/20241112232041_fixMediaStreams.cs b/src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20241112232041_fixMediaStreams.cs
similarity index 100%
rename from Jellyfin.Server.Implementations/Migrations/20241112232041_fixMediaStreams.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20241112232041_fixMediaStreams.cs
diff --git a/Jellyfin.Server.Implementations/Migrations/20241112234144_FixMediaStreams2.Designer.cs b/src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20241112234144_FixMediaStreams2.Designer.cs
similarity index 99%
rename from Jellyfin.Server.Implementations/Migrations/20241112234144_FixMediaStreams2.Designer.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20241112234144_FixMediaStreams2.Designer.cs
index 5714120b5c..d3ba8c96a9 100644
--- a/Jellyfin.Server.Implementations/Migrations/20241112234144_FixMediaStreams2.Designer.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20241112234144_FixMediaStreams2.Designer.cs
@@ -1,6 +1,6 @@
//
using System;
-using Jellyfin.Server.Implementations;
+using Jellyfin.Database.Implementations;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
diff --git a/Jellyfin.Server.Implementations/Migrations/20241112234144_FixMediaStreams2.cs b/src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20241112234144_FixMediaStreams2.cs
similarity index 100%
rename from Jellyfin.Server.Implementations/Migrations/20241112234144_FixMediaStreams2.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20241112234144_FixMediaStreams2.cs
diff --git a/Jellyfin.Server.Implementations/Migrations/20241113133548_EnforceUniqueItemValue.Designer.cs b/src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20241113133548_EnforceUniqueItemValue.Designer.cs
similarity index 99%
rename from Jellyfin.Server.Implementations/Migrations/20241113133548_EnforceUniqueItemValue.Designer.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20241113133548_EnforceUniqueItemValue.Designer.cs
index 855f02fd3f..2c0058c720 100644
--- a/Jellyfin.Server.Implementations/Migrations/20241113133548_EnforceUniqueItemValue.Designer.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20241113133548_EnforceUniqueItemValue.Designer.cs
@@ -1,6 +1,6 @@
//
using System;
-using Jellyfin.Server.Implementations;
+using Jellyfin.Database.Implementations;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
diff --git a/Jellyfin.Server.Implementations/Migrations/20241113133548_EnforceUniqueItemValue.cs b/src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20241113133548_EnforceUniqueItemValue.cs
similarity index 100%
rename from Jellyfin.Server.Implementations/Migrations/20241113133548_EnforceUniqueItemValue.cs
rename to src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20241113133548_EnforceUniqueItemValue.cs
diff --git a/src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20250202021306_FixedCollation.Designer.cs b/src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20250202021306_FixedCollation.Designer.cs
new file mode 100644
index 0000000000..da4bab3fd3
--- /dev/null
+++ b/src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/Migrations/20250202021306_FixedCollation.Designer.cs
@@ -0,0 +1,1594 @@
+//
+using System;
+using Jellyfin.Database.Implementations;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+
+#nullable disable
+
+namespace Jellyfin.Server.Implementations.Migrations
+{
+ [DbContext(typeof(JellyfinDbContext))]
+ [Migration("20250202021306_FixedCollation")]
+ partial class FixedCollation
+ {
+ ///
+ protected override void BuildTargetModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder.HasAnnotation("ProductVersion", "9.0.1");
+
+ modelBuilder.Entity("Jellyfin.Data.Entities.AccessSchedule", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("DayOfWeek")
+ .HasColumnType("INTEGER");
+
+ b.Property("EndHour")
+ .HasColumnType("REAL");
+
+ b.Property("StartHour")
+ .HasColumnType("REAL");
+
+ b.Property("UserId")
+ .HasColumnType("TEXT");
+
+ b.HasKey("Id");
+
+ b.HasIndex("UserId");
+
+ b.ToTable("AccessSchedules");
+ });
+
+ modelBuilder.Entity("Jellyfin.Data.Entities.ActivityLog", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("DateCreated")
+ .HasColumnType("TEXT");
+
+ b.Property("ItemId")
+ .HasMaxLength(256)
+ .HasColumnType("TEXT");
+
+ b.Property("LogSeverity")
+ .HasColumnType("INTEGER");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasMaxLength(512)
+ .HasColumnType("TEXT");
+
+ b.Property("Overview")
+ .HasMaxLength(512)
+ .HasColumnType("TEXT");
+
+ b.Property("RowVersion")
+ .IsConcurrencyToken()
+ .HasColumnType("INTEGER");
+
+ b.Property("ShortOverview")
+ .HasMaxLength(512)
+ .HasColumnType("TEXT");
+
+ b.Property("Type")
+ .IsRequired()
+ .HasMaxLength(256)
+ .HasColumnType("TEXT");
+
+ b.Property("UserId")
+ .HasColumnType("TEXT");
+
+ b.HasKey("Id");
+
+ b.HasIndex("DateCreated");
+
+ b.ToTable("ActivityLogs");
+ });
+
+ modelBuilder.Entity("Jellyfin.Data.Entities.AncestorId", b =>
+ {
+ b.Property("ItemId")
+ .HasColumnType("TEXT");
+
+ b.Property("ParentItemId")
+ .HasColumnType("TEXT");
+
+ b.HasKey("ItemId", "ParentItemId");
+
+ b.HasIndex("ParentItemId");
+
+ b.ToTable("AncestorIds");
+ });
+
+ modelBuilder.Entity("Jellyfin.Data.Entities.AttachmentStreamInfo", b =>
+ {
+ b.Property("ItemId")
+ .HasColumnType("TEXT");
+
+ b.Property("Index")
+ .HasColumnType("INTEGER");
+
+ b.Property("Codec")
+ .IsRequired()
+ .HasColumnType("TEXT");
+
+ b.Property("CodecTag")
+ .HasColumnType("TEXT");
+
+ b.Property("Comment")
+ .HasColumnType("TEXT");
+
+ b.Property("Filename")
+ .HasColumnType("TEXT");
+
+ b.Property("MimeType")
+ .HasColumnType("TEXT");
+
+ b.HasKey("ItemId", "Index");
+
+ b.ToTable("AttachmentStreamInfos");
+ });
+
+ modelBuilder.Entity("Jellyfin.Data.Entities.BaseItemEntity", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("TEXT");
+
+ b.Property("Album")
+ .HasColumnType("TEXT");
+
+ b.Property("AlbumArtists")
+ .HasColumnType("TEXT");
+
+ b.Property("Artists")
+ .HasColumnType("TEXT");
+
+ b.Property("Audio")
+ .HasColumnType("INTEGER");
+
+ b.Property("ChannelId")
+ .HasColumnType("TEXT");
+
+ b.Property("CleanName")
+ .HasColumnType("TEXT");
+
+ b.Property("CommunityRating")
+ .HasColumnType("REAL");
+
+ b.Property("CriticRating")
+ .HasColumnType("REAL");
+
+ b.Property("CustomRating")
+ .HasColumnType("TEXT");
+
+ b.Property("Data")
+ .HasColumnType("TEXT");
+
+ b.Property("DateCreated")
+ .HasColumnType("TEXT");
+
+ b.Property("DateLastMediaAdded")
+ .HasColumnType("TEXT");
+
+ b.Property("DateLastRefreshed")
+ .HasColumnType("TEXT");
+
+ b.Property("DateLastSaved")
+ .HasColumnType("TEXT");
+
+ b.Property("DateModified")
+ .HasColumnType("TEXT");
+
+ b.Property("EndDate")
+ .HasColumnType("TEXT");
+
+ b.Property("EpisodeTitle")
+ .HasColumnType("TEXT");
+
+ b.Property("ExternalId")
+ .HasColumnType("TEXT");
+
+ b.Property("ExternalSeriesId")
+ .HasColumnType("TEXT");
+
+ b.Property("ExternalServiceId")
+ .HasColumnType("TEXT");
+
+ b.Property("ExtraIds")
+ .HasColumnType("TEXT");
+
+ b.Property("ExtraType")
+ .HasColumnType("INTEGER");
+
+ b.Property("ForcedSortName")
+ .HasColumnType("TEXT");
+
+ b.Property("Genres")
+ .HasColumnType("TEXT");
+
+ b.Property("Height")
+ .HasColumnType("INTEGER");
+
+ b.Property("IndexNumber")
+ .HasColumnType("INTEGER");
+
+ b.Property("InheritedParentalRatingValue")
+ .HasColumnType("INTEGER");
+
+ b.Property("IsFolder")
+ .HasColumnType("INTEGER");
+
+ b.Property("IsInMixedFolder")
+ .HasColumnType("INTEGER");
+
+ b.Property("IsLocked")
+ .HasColumnType("INTEGER");
+
+ b.Property("IsMovie")
+ .HasColumnType("INTEGER");
+
+ b.Property("IsRepeat")
+ .HasColumnType("INTEGER");
+
+ b.Property("IsSeries")
+ .HasColumnType("INTEGER");
+
+ b.Property("IsVirtualItem")
+ .HasColumnType("INTEGER");
+
+ b.Property("LUFS")
+ .HasColumnType("REAL");
+
+ b.Property("MediaType")
+ .HasColumnType("TEXT");
+
+ b.Property("Name")
+ .HasColumnType("TEXT");
+
+ b.Property("NormalizationGain")
+ .HasColumnType("REAL");
+
+ b.Property("OfficialRating")
+ .HasColumnType("TEXT");
+
+ b.Property("OriginalTitle")
+ .HasColumnType("TEXT");
+
+ b.Property("Overview")
+ .HasColumnType("TEXT");
+
+ b.Property("OwnerId")
+ .HasColumnType("TEXT");
+
+ b.Property("ParentId")
+ .HasColumnType("TEXT");
+
+ b.Property("ParentIndexNumber")
+ .HasColumnType("INTEGER");
+
+ b.Property("Path")
+ .HasColumnType("TEXT");
+
+ b.Property("PreferredMetadataCountryCode")
+ .HasColumnType("TEXT");
+
+ b.Property("PreferredMetadataLanguage")
+ .HasColumnType("TEXT");
+
+ b.Property("PremiereDate")
+ .HasColumnType("TEXT");
+
+ b.Property("PresentationUniqueKey")
+ .HasColumnType("TEXT");
+
+ b.Property("PrimaryVersionId")
+ .HasColumnType("TEXT");
+
+ b.Property("ProductionLocations")
+ .HasColumnType("TEXT");
+
+ b.Property("ProductionYear")
+ .HasColumnType("INTEGER");
+
+ b.Property("RunTimeTicks")
+ .HasColumnType("INTEGER");
+
+ b.Property("SeasonId")
+ .HasColumnType("TEXT");
+
+ b.Property("SeasonName")
+ .HasColumnType("TEXT");
+
+ b.Property("SeriesId")
+ .HasColumnType("TEXT");
+
+ b.Property("SeriesName")
+ .HasColumnType("TEXT");
+
+ b.Property("SeriesPresentationUniqueKey")
+ .HasColumnType("TEXT");
+
+ b.Property("ShowId")
+ .HasColumnType("TEXT");
+
+ b.Property("Size")
+ .HasColumnType("INTEGER");
+
+ b.Property("SortName")
+ .HasColumnType("TEXT");
+
+ b.Property("StartDate")
+ .HasColumnType("TEXT");
+
+ b.Property("Studios")
+ .HasColumnType("TEXT");
+
+ b.Property("Tagline")
+ .HasColumnType("TEXT");
+
+ b.Property("Tags")
+ .HasColumnType("TEXT");
+
+ b.Property("TopParentId")
+ .HasColumnType("TEXT");
+
+ b.Property("TotalBitrate")
+ .HasColumnType("INTEGER");
+
+ b.Property("Type")
+ .IsRequired()
+ .HasColumnType("TEXT");
+
+ b.Property("UnratedType")
+ .HasColumnType("TEXT");
+
+ b.Property("Width")
+ .HasColumnType("INTEGER");
+
+ b.HasKey("Id");
+
+ b.HasIndex("ParentId");
+
+ b.HasIndex("Path");
+
+ b.HasIndex("PresentationUniqueKey");
+
+ b.HasIndex("TopParentId", "Id");
+
+ b.HasIndex("Type", "TopParentId", "Id");
+
+ b.HasIndex("Type", "TopParentId", "PresentationUniqueKey");
+
+ b.HasIndex("Type", "TopParentId", "StartDate");
+
+ b.HasIndex("Id", "Type", "IsFolder", "IsVirtualItem");
+
+ b.HasIndex("MediaType", "TopParentId", "IsVirtualItem", "PresentationUniqueKey");
+
+ b.HasIndex("Type", "SeriesPresentationUniqueKey", "IsFolder", "IsVirtualItem");
+
+ b.HasIndex("Type", "SeriesPresentationUniqueKey", "PresentationUniqueKey", "SortName");
+
+ b.HasIndex("IsFolder", "TopParentId", "IsVirtualItem", "PresentationUniqueKey", "DateCreated");
+
+ b.HasIndex("Type", "TopParentId", "IsVirtualItem", "PresentationUniqueKey", "DateCreated");
+
+ b.ToTable("BaseItems");
+ });
+
+ modelBuilder.Entity("Jellyfin.Data.Entities.BaseItemImageInfo", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("TEXT");
+
+ b.Property("Blurhash")
+ .HasColumnType("BLOB");
+
+ b.Property