diff --git a/CHANGELOG.md b/CHANGELOG.md index bc212f3d0..86c22f971 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - `MYSQL__CONNECTIONSTRING` - (e.g. `Server=localhost;Database=ErsatzTV;Uid=root;Pwd=ersatztv;`) - Add option to use shared Plex servers, not just owned servers - This can be enabled by setting the env var `ETV_ALLOW_SHARED_PLEX_SERVERS` to any non-empty value +- Show Plex server names in Libraries page ### Fixed - Fix subtitle scaling when using QSV hardware acceleration diff --git a/ErsatzTV.Application/Emby/EmbyLibraryViewModel.cs b/ErsatzTV.Application/Emby/EmbyLibraryViewModel.cs index 1b561e75b..9189febad 100644 --- a/ErsatzTV.Application/Emby/EmbyLibraryViewModel.cs +++ b/ErsatzTV.Application/Emby/EmbyLibraryViewModel.cs @@ -9,4 +9,4 @@ public record EmbyLibraryViewModel( LibraryMediaKind MediaKind, bool ShouldSyncItems, int MediaSourceId) - : LibraryViewModel("Emby", Id, Name, MediaKind, MediaSourceId); + : LibraryViewModel("Emby", Id, Name, MediaKind, MediaSourceId, string.Empty); diff --git a/ErsatzTV.Application/Jellyfin/JellyfinLibraryViewModel.cs b/ErsatzTV.Application/Jellyfin/JellyfinLibraryViewModel.cs index 5d2ebe140..923def50c 100644 --- a/ErsatzTV.Application/Jellyfin/JellyfinLibraryViewModel.cs +++ b/ErsatzTV.Application/Jellyfin/JellyfinLibraryViewModel.cs @@ -9,4 +9,4 @@ public record JellyfinLibraryViewModel( LibraryMediaKind MediaKind, bool ShouldSyncItems, int MediaSourceId) - : LibraryViewModel("Jellyfin", Id, Name, MediaKind, MediaSourceId); + : LibraryViewModel("Jellyfin", Id, Name, MediaKind, MediaSourceId, string.Empty); diff --git a/ErsatzTV.Application/Libraries/LibraryViewModel.cs b/ErsatzTV.Application/Libraries/LibraryViewModel.cs index 7eb051551..67f6727da 100644 --- a/ErsatzTV.Application/Libraries/LibraryViewModel.cs +++ b/ErsatzTV.Application/Libraries/LibraryViewModel.cs @@ -2,4 +2,10 @@ namespace ErsatzTV.Application.Libraries; -public record LibraryViewModel(string LibraryKind, int Id, string Name, LibraryMediaKind MediaKind, int MediaSourceId); +public record LibraryViewModel( + string LibraryKind, + int Id, + string Name, + LibraryMediaKind MediaKind, + int MediaSourceId, + string MediaSourceName); diff --git a/ErsatzTV.Application/Libraries/LocalLibraryViewModel.cs b/ErsatzTV.Application/Libraries/LocalLibraryViewModel.cs index 2497f9aac..2e3bef591 100644 --- a/ErsatzTV.Application/Libraries/LocalLibraryViewModel.cs +++ b/ErsatzTV.Application/Libraries/LocalLibraryViewModel.cs @@ -3,4 +3,4 @@ namespace ErsatzTV.Application.Libraries; public record LocalLibraryViewModel(int Id, string Name, LibraryMediaKind MediaKind, int MediaSourceId) - : LibraryViewModel("Local", Id, Name, MediaKind, MediaSourceId); + : LibraryViewModel("Local", Id, Name, MediaKind, MediaSourceId, string.Empty); diff --git a/ErsatzTV.Application/Libraries/Mapper.cs b/ErsatzTV.Application/Libraries/Mapper.cs index 60aa02ad5..c07aaf67b 100644 --- a/ErsatzTV.Application/Libraries/Mapper.cs +++ b/ErsatzTV.Application/Libraries/Mapper.cs @@ -10,7 +10,7 @@ internal static class Mapper library switch { LocalLibrary l => ProjectToViewModel(l), - PlexLibrary p => new PlexLibraryViewModel(p.Id, p.Name, p.MediaKind, p.MediaSourceId), + PlexLibrary p => new PlexLibraryViewModel(p.Id, p.Name, p.MediaKind, p.MediaSourceId, GetServerName(p.MediaSource)), JellyfinLibrary j => new JellyfinLibraryViewModel( j.Id, j.Name, @@ -26,4 +26,11 @@ internal static class Mapper public static LocalLibraryPathViewModel ProjectToViewModel(LibraryPath libraryPath) => new(libraryPath.Id, libraryPath.LibraryId, libraryPath.Path); + + private static string GetServerName(MediaSource ms) => + ms switch + { + PlexMediaSource pms => pms.ServerName, + _ => string.Empty + }; } diff --git a/ErsatzTV.Application/Libraries/PlexLibraryViewModel.cs b/ErsatzTV.Application/Libraries/PlexLibraryViewModel.cs index a46940461..c8fd2ef85 100644 --- a/ErsatzTV.Application/Libraries/PlexLibraryViewModel.cs +++ b/ErsatzTV.Application/Libraries/PlexLibraryViewModel.cs @@ -2,5 +2,10 @@ namespace ErsatzTV.Application.Libraries; -public record PlexLibraryViewModel(int Id, string Name, LibraryMediaKind MediaKind, int MediaSourceId) - : LibraryViewModel("Plex", Id, Name, MediaKind, MediaSourceId); +public record PlexLibraryViewModel( + int Id, + string Name, + LibraryMediaKind MediaKind, + int MediaSourceId, + string MediaSourceName) + : LibraryViewModel("Plex", Id, Name, MediaKind, MediaSourceId, MediaSourceName); diff --git a/ErsatzTV.Application/Libraries/Queries/GetExternalCollectionsHandler.cs b/ErsatzTV.Application/Libraries/Queries/GetExternalCollectionsHandler.cs index 26ee6aec2..f2ae23ed9 100644 --- a/ErsatzTV.Application/Libraries/Queries/GetExternalCollectionsHandler.cs +++ b/ErsatzTV.Application/Libraries/Queries/GetExternalCollectionsHandler.cs @@ -27,7 +27,8 @@ public class GetExternalCollectionsHandler : IRequestHandler> +public class GetPlexLibrariesBySourceIdHandler : IRequestHandler> { - private readonly IMediaSourceRepository _mediaSourceRepository; + private readonly IDbContextFactory _dbContextFactory; - public GetPlexLibrariesBySourceIdHandler(IMediaSourceRepository mediaSourceRepository) => - _mediaSourceRepository = mediaSourceRepository; + public GetPlexLibrariesBySourceIdHandler(IDbContextFactory dbContextFactory) + { + _dbContextFactory = dbContextFactory; + } - public Task> Handle( + public async Task> Handle( GetPlexLibrariesBySourceId request, - CancellationToken cancellationToken) => - _mediaSourceRepository.GetPlexLibraries(request.PlexMediaSourceId) - .Map(list => list.Map(ProjectToViewModel).ToList()); + CancellationToken cancellationToken) + { + await using TvContext context = await _dbContextFactory.CreateDbContextAsync(cancellationToken); + + return await context.PlexLibraries + .AsNoTracking() + .Where(l => l.MediaSourceId == request.PlexMediaSourceId) + .Map(pl => ProjectToViewModel(pl)) + .ToListAsync(cancellationToken); + } } diff --git a/ErsatzTV.Core/Interfaces/Repositories/IMediaSourceRepository.cs b/ErsatzTV.Core/Interfaces/Repositories/IMediaSourceRepository.cs index 082947f6c..236ffa05d 100644 --- a/ErsatzTV.Core/Interfaces/Repositories/IMediaSourceRepository.cs +++ b/ErsatzTV.Core/Interfaces/Repositories/IMediaSourceRepository.cs @@ -6,7 +6,6 @@ public interface IMediaSourceRepository { Task Add(PlexMediaSource plexMediaSource); Task> GetAllPlex(); - Task> GetPlexLibraries(int plexMediaSourceId); Task> GetPlexPathReplacements(int plexMediaSourceId); Task> GetPlexLibrary(int plexLibraryId); Task> GetPlex(int id); diff --git a/ErsatzTV.Infrastructure/Data/Repositories/MediaSourceRepository.cs b/ErsatzTV.Infrastructure/Data/Repositories/MediaSourceRepository.cs index c044760c0..7f3048132 100644 --- a/ErsatzTV.Infrastructure/Data/Repositories/MediaSourceRepository.cs +++ b/ErsatzTV.Infrastructure/Data/Repositories/MediaSourceRepository.cs @@ -31,14 +31,6 @@ public class MediaSourceRepository : IMediaSourceRepository .ToListAsync(); } - public async Task> GetPlexLibraries(int plexMediaSourceId) - { - await using TvContext context = await _dbContextFactory.CreateDbContextAsync(); - return await context.PlexLibraries - .Filter(l => l.MediaSourceId == plexMediaSourceId) - .ToListAsync(); - } - public async Task> GetPlexPathReplacements(int plexMediaSourceId) { await using TvContext context = await _dbContextFactory.CreateDbContextAsync(); diff --git a/ErsatzTV/Pages/Libraries.razor b/ErsatzTV/Pages/Libraries.razor index 9f84eebbd..2e22bb063 100644 --- a/ErsatzTV/Pages/Libraries.razor +++ b/ErsatzTV/Pages/Libraries.razor @@ -20,19 +20,31 @@ + @if (_showServerNames) + { + + } Library Kind - Name + @if (_showServerNames) + { + Server Name + } + Library Name Media Kind @context.LibraryKind - @context.Name + @if (_showServerNames) + { + @context.MediaSourceName + } + @context.Name @context.MediaKind
@@ -133,6 +145,7 @@ private IList _libraries = new List(); private IList _externalCollections = new List(); private Dictionary _progressByLibrary = new(); + private bool _showServerNames = false; protected override void OnInitialized() { @@ -146,6 +159,8 @@ private async Task LoadLibraries(CancellationToken cancellationToken) { _libraries = await _mediator.Send(new GetConfiguredLibraries(), cancellationToken); + _showServerNames = _libraries.Any(l => l is PlexLibraryViewModel); + _externalCollections = await _mediator.Send(new GetExternalCollections(), cancellationToken); _progressByLibrary = _libraries.ToDictionary(vm => vm.Id, _ => 0); }