From 4a7657d371ac3a9107ced603742ea87d4d07cda3 Mon Sep 17 00:00:00 2001 From: Jason Dove Date: Sat, 27 Feb 2021 10:16:35 -0600 Subject: [PATCH] fix collections ui --- .../Fakes/FakeTelevisionRepository.cs | 10 +++---- .../Repositories/ITelevisionRepository.cs | 10 +++---- .../Data/Repositories/ChannelRepository.cs | 7 ++++- .../Repositories/ConfigElementRepository.cs | 9 +++++-- .../Repositories/FFmpegProfileRepository.cs | 2 ++ .../Repositories/MediaCollectionRepository.cs | 13 +++++++++- .../Data/Repositories/MediaItemRepository.cs | 2 ++ .../Data/Repositories/MovieRepository.cs | 3 +++ .../Data/Repositories/PlayoutRepository.cs | 5 +++- .../Repositories/ProgramScheduleRepository.cs | 7 ++++- .../Data/Repositories/ResolutionRepository.cs | 6 ++++- .../Data/Repositories/TelevisionRepository.cs | 26 ++++++++++--------- ErsatzTV/Pages/CollectionItems.razor | 3 ++- 13 files changed, 73 insertions(+), 30 deletions(-) diff --git a/ErsatzTV.Core.Tests/Fakes/FakeTelevisionRepository.cs b/ErsatzTV.Core.Tests/Fakes/FakeTelevisionRepository.cs index c33fb1eae..02882d76e 100644 --- a/ErsatzTV.Core.Tests/Fakes/FakeTelevisionRepository.cs +++ b/ErsatzTV.Core.Tests/Fakes/FakeTelevisionRepository.cs @@ -17,7 +17,7 @@ namespace ErsatzTV.Core.Tests.Fakes public Task> GetAllShows() => throw new NotSupportedException(); - public Task> GetShow(int televisionShowId) => throw new NotSupportedException(); + public Task> GetShow(int showId) => throw new NotSupportedException(); public Task GetShowCount() => throw new NotSupportedException(); @@ -28,18 +28,18 @@ namespace ErsatzTV.Core.Tests.Fakes public Task> GetAllSeasons() => throw new NotSupportedException(); - public Task> GetSeason(int televisionSeasonId) => throw new NotSupportedException(); + public Task> GetSeason(int seasonId) => throw new NotSupportedException(); - public Task GetSeasonCount(int televisionShowId) => throw new NotSupportedException(); + public Task GetSeasonCount(int showId) => throw new NotSupportedException(); public Task> GetPagedSeasons(int televisionShowId, int pageNumber, int pageSize) => throw new NotSupportedException(); public Task> GetSeasonItems(int seasonId) => throw new NotSupportedException(); - public Task> GetEpisode(int televisionEpisodeId) => throw new NotSupportedException(); + public Task> GetEpisode(int episodeId) => throw new NotSupportedException(); - public Task GetEpisodeCount(int televisionSeasonId) => throw new NotSupportedException(); + public Task GetEpisodeCount(int seasonId) => throw new NotSupportedException(); public Task> GetPagedEpisodes(int seasonId, int pageNumber, int pageSize) => throw new NotSupportedException(); diff --git a/ErsatzTV.Core/Interfaces/Repositories/ITelevisionRepository.cs b/ErsatzTV.Core/Interfaces/Repositories/ITelevisionRepository.cs index 10fda8992..5fbb4f761 100644 --- a/ErsatzTV.Core/Interfaces/Repositories/ITelevisionRepository.cs +++ b/ErsatzTV.Core/Interfaces/Repositories/ITelevisionRepository.cs @@ -11,17 +11,17 @@ namespace ErsatzTV.Core.Interfaces.Repositories Task Update(Season season); Task Update(Episode episode); Task> GetAllShows(); - Task> GetShow(int televisionShowId); + Task> GetShow(int showId); Task GetShowCount(); Task> GetPagedShows(int pageNumber, int pageSize); Task> GetShowItems(int showId); Task> GetAllSeasons(); - Task> GetSeason(int televisionSeasonId); - Task GetSeasonCount(int televisionShowId); + Task> GetSeason(int seasonId); + Task GetSeasonCount(int showId); Task> GetPagedSeasons(int televisionShowId, int pageNumber, int pageSize); Task> GetSeasonItems(int seasonId); - Task> GetEpisode(int televisionEpisodeId); - Task GetEpisodeCount(int televisionSeasonId); + Task> GetEpisode(int episodeId); + Task GetEpisodeCount(int seasonId); Task> GetPagedEpisodes(int seasonId, int pageNumber, int pageSize); Task> GetShowByMetadata(int libraryPathId, ShowMetadata metadata); diff --git a/ErsatzTV.Infrastructure/Data/Repositories/ChannelRepository.cs b/ErsatzTV.Infrastructure/Data/Repositories/ChannelRepository.cs index 717bd74b7..c54023a83 100644 --- a/ErsatzTV.Infrastructure/Data/Repositories/ChannelRepository.cs +++ b/ErsatzTV.Infrastructure/Data/Repositories/ChannelRepository.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Linq; using System.Threading.Tasks; using ErsatzTV.Core.Domain; using ErsatzTV.Core.Interfaces.Repositories; @@ -22,12 +23,16 @@ namespace ErsatzTV.Infrastructure.Data.Repositories } public Task> Get(int id) => - _dbContext.Channels.SingleOrDefaultAsync(c => c.Id == id).Map(Optional); + _dbContext.Channels + .OrderBy(c => c.Id) + .SingleOrDefaultAsync(c => c.Id == id) + .Map(Optional); public Task> GetByNumber(int number) => _dbContext.Channels .Include(c => c.FFmpegProfile) .ThenInclude(p => p.Resolution) + .OrderBy(c => c.Number) .SingleOrDefaultAsync(c => c.Number == number) .Map(Optional); diff --git a/ErsatzTV.Infrastructure/Data/Repositories/ConfigElementRepository.cs b/ErsatzTV.Infrastructure/Data/Repositories/ConfigElementRepository.cs index 3ab5ba96d..8f7c2c166 100644 --- a/ErsatzTV.Infrastructure/Data/Repositories/ConfigElementRepository.cs +++ b/ErsatzTV.Infrastructure/Data/Repositories/ConfigElementRepository.cs @@ -1,9 +1,11 @@ using System; +using System.Linq; using System.Threading.Tasks; using ErsatzTV.Core.Domain; using ErsatzTV.Core.Interfaces.Repositories; using LanguageExt; using Microsoft.EntityFrameworkCore; +using static LanguageExt.Prelude; namespace ErsatzTV.Infrastructure.Data.Repositories { @@ -20,8 +22,11 @@ namespace ErsatzTV.Infrastructure.Data.Repositories return configElement; } - public async Task> Get(ConfigElementKey key) => - await _dbContext.ConfigElements.SingleOrDefaultAsync(ce => ce.Key == key.Key); + public Task> Get(ConfigElementKey key) => + _dbContext.ConfigElements + .OrderBy(ce => ce.Key) + .SingleOrDefaultAsync(ce => ce.Key == key.Key) + .Map(Optional); public Task> GetValue(ConfigElementKey key) => Get(key).MapT(ce => (T) Convert.ChangeType(ce.Value, typeof(T))); diff --git a/ErsatzTV.Infrastructure/Data/Repositories/FFmpegProfileRepository.cs b/ErsatzTV.Infrastructure/Data/Repositories/FFmpegProfileRepository.cs index 6d9b8df12..e4f29bda1 100644 --- a/ErsatzTV.Infrastructure/Data/Repositories/FFmpegProfileRepository.cs +++ b/ErsatzTV.Infrastructure/Data/Repositories/FFmpegProfileRepository.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Linq; using System.Threading.Tasks; using ErsatzTV.Core.Domain; using ErsatzTV.Core.Interfaces.Repositories; @@ -23,6 +24,7 @@ namespace ErsatzTV.Infrastructure.Data.Repositories public async Task> Get(int id) => await _dbContext.FFmpegProfiles .Include(p => p.Resolution) + .OrderBy(p => p.Id) .SingleOrDefaultAsync(p => p.Id == id); public Task> GetAll() => diff --git a/ErsatzTV.Infrastructure/Data/Repositories/MediaCollectionRepository.cs b/ErsatzTV.Infrastructure/Data/Repositories/MediaCollectionRepository.cs index 25fa444b3..658469fd5 100644 --- a/ErsatzTV.Infrastructure/Data/Repositories/MediaCollectionRepository.cs +++ b/ErsatzTV.Infrastructure/Data/Repositories/MediaCollectionRepository.cs @@ -30,7 +30,10 @@ namespace ErsatzTV.Infrastructure.Data.Repositories } public Task> Get(int id) => - _dbContext.Collections.SingleOrDefaultAsync(c => c.Id == id).Map(Optional); + _dbContext.Collections + .OrderBy(c => c.Id) + .SingleOrDefaultAsync(c => c.Id == id) + .Map(Optional); public Task> GetCollectionWithItems(int id) => _dbContext.Collections @@ -49,6 +52,7 @@ namespace ErsatzTV.Infrastructure.Data.Repositories .ThenInclude(i => (i as Episode).Season) .ThenInclude(s => s.Show) .ThenInclude(s => s.ShowMetadata) + .OrderBy(c => c.Id) .SingleOrDefaultAsync(c => c.Id == id) .Map(Optional); @@ -59,17 +63,24 @@ namespace ErsatzTV.Infrastructure.Data.Repositories .ThenInclude(i => i.LibraryPath) .Include(c => c.MediaItems) .ThenInclude(i => (i as Movie).MovieMetadata) + .ThenInclude(mm => mm.Artwork) .Include(c => c.MediaItems) .ThenInclude(i => (i as Show).ShowMetadata) + .ThenInclude(sm => sm.Artwork) + .Include(c => c.MediaItems) + .ThenInclude(i => (i as Season).SeasonMetadata) + .ThenInclude(sm => sm.Artwork) .Include(c => c.MediaItems) .ThenInclude(i => (i as Season).Show) .ThenInclude(s => s.ShowMetadata) .Include(c => c.MediaItems) .ThenInclude(i => (i as Episode).EpisodeMetadata) + .ThenInclude(em => em.Artwork) .Include(c => c.MediaItems) .ThenInclude(i => (i as Episode).Season) .ThenInclude(s => s.Show) .ThenInclude(s => s.ShowMetadata) + .OrderBy(c => c.Id) .SingleOrDefaultAsync(c => c.Id == id) .Map(Optional); diff --git a/ErsatzTV.Infrastructure/Data/Repositories/MediaItemRepository.cs b/ErsatzTV.Infrastructure/Data/Repositories/MediaItemRepository.cs index 3f36bbf4f..7df821faf 100644 --- a/ErsatzTV.Infrastructure/Data/Repositories/MediaItemRepository.cs +++ b/ErsatzTV.Infrastructure/Data/Repositories/MediaItemRepository.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Linq; using System.Threading.Tasks; using ErsatzTV.Core.Domain; using ErsatzTV.Core.Interfaces.Repositories; @@ -17,6 +18,7 @@ namespace ErsatzTV.Infrastructure.Data.Repositories public Task> Get(int id) => _dbContext.MediaItems .Include(i => i.LibraryPath) + .OrderBy(i => i.Id) .SingleOrDefaultAsync(i => i.Id == id) .Map(Optional); diff --git a/ErsatzTV.Infrastructure/Data/Repositories/MovieRepository.cs b/ErsatzTV.Infrastructure/Data/Repositories/MovieRepository.cs index d887ed358..9f3016ea2 100644 --- a/ErsatzTV.Infrastructure/Data/Repositories/MovieRepository.cs +++ b/ErsatzTV.Infrastructure/Data/Repositories/MovieRepository.cs @@ -35,6 +35,7 @@ namespace ErsatzTV.Infrastructure.Data.Repositories return await dbContext.Movies .Include(m => m.MovieMetadata) .ThenInclude(m => m.Artwork) + .OrderBy(m => m.Id) .SingleOrDefaultAsync(m => m.Id == movieId) .Map(Optional); } @@ -45,6 +46,7 @@ namespace ErsatzTV.Infrastructure.Data.Repositories .Include(i => i.MovieMetadata) .ThenInclude(mm => mm.Artwork) .Include(i => i.LibraryPath) + .OrderBy(i => i.Path) .SingleOrDefaultAsync(i => i.Path == path); return await maybeExisting.Match( @@ -59,6 +61,7 @@ namespace ErsatzTV.Infrastructure.Data.Repositories Option maybeExisting = await _dbContext.PlexMovieMediaItems .Include(i => i.MovieMetadata) .Include(i => i.Part) + .OrderBy(i => i.Key) .SingleOrDefaultAsync(i => i.Key == item.Key); return await maybeExisting.Match( diff --git a/ErsatzTV.Infrastructure/Data/Repositories/PlayoutRepository.cs b/ErsatzTV.Infrastructure/Data/Repositories/PlayoutRepository.cs index 83e579022..48b5c08b0 100644 --- a/ErsatzTV.Infrastructure/Data/Repositories/PlayoutRepository.cs +++ b/ErsatzTV.Infrastructure/Data/Repositories/PlayoutRepository.cs @@ -25,7 +25,10 @@ namespace ErsatzTV.Infrastructure.Data.Repositories } public Task> Get(int id) => - _dbContext.Playouts.SingleOrDefaultAsync(p => p.Id == id).Map(Optional); + _dbContext.Playouts + .OrderBy(p => p.Id) + .SingleOrDefaultAsync(p => p.Id == id) + .Map(Optional); public async Task> GetFull(int id) => await _dbContext.Playouts diff --git a/ErsatzTV.Infrastructure/Data/Repositories/ProgramScheduleRepository.cs b/ErsatzTV.Infrastructure/Data/Repositories/ProgramScheduleRepository.cs index 170b46685..119933e50 100644 --- a/ErsatzTV.Infrastructure/Data/Repositories/ProgramScheduleRepository.cs +++ b/ErsatzTV.Infrastructure/Data/Repositories/ProgramScheduleRepository.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Linq; using System.Threading.Tasks; using ErsatzTV.Core.Domain; using ErsatzTV.Core.Interfaces.Repositories; @@ -22,12 +23,16 @@ namespace ErsatzTV.Infrastructure.Data.Repositories } public Task> Get(int id) => - _dbContext.ProgramSchedules.SingleOrDefaultAsync(s => s.Id == id).Map(Optional); + _dbContext.ProgramSchedules + .OrderBy(s => s.Id) + .SingleOrDefaultAsync(s => s.Id == id) + .Map(Optional); public async Task> GetWithPlayouts(int id) => await _dbContext.ProgramSchedules .Include(ps => ps.Items) .Include(ps => ps.Playouts) + .OrderBy(ps => ps.Id) .SingleOrDefaultAsync(ps => ps.Id == id); public Task> GetAll() => diff --git a/ErsatzTV.Infrastructure/Data/Repositories/ResolutionRepository.cs b/ErsatzTV.Infrastructure/Data/Repositories/ResolutionRepository.cs index 0bdcf2fc0..0cbe4b81c 100644 --- a/ErsatzTV.Infrastructure/Data/Repositories/ResolutionRepository.cs +++ b/ErsatzTV.Infrastructure/Data/Repositories/ResolutionRepository.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Linq; using System.Threading.Tasks; using ErsatzTV.Core.Domain; using ErsatzTV.Core.Interfaces.Repositories; @@ -15,7 +16,10 @@ namespace ErsatzTV.Infrastructure.Data.Repositories public ResolutionRepository(TvContext dbContext) => _dbContext = dbContext; public Task> Get(int id) => - _dbContext.Resolutions.SingleOrDefaultAsync(r => r.Id == id).Map(Optional); + _dbContext.Resolutions + .OrderBy(r => r.Id) + .SingleOrDefaultAsync(r => r.Id == id) + .Map(Optional); public Task> GetAll() => _dbContext.Resolutions.ToListAsync(); diff --git a/ErsatzTV.Infrastructure/Data/Repositories/TelevisionRepository.cs b/ErsatzTV.Infrastructure/Data/Repositories/TelevisionRepository.cs index 25e207c4b..aa6049483 100644 --- a/ErsatzTV.Infrastructure/Data/Repositories/TelevisionRepository.cs +++ b/ErsatzTV.Infrastructure/Data/Repositories/TelevisionRepository.cs @@ -48,12 +48,13 @@ namespace ErsatzTV.Infrastructure.Data.Repositories .Include(s => s.ShowMetadata) .ToListAsync(); - public Task> GetShow(int televisionShowId) => + public Task> GetShow(int showId) => _dbContext.Shows .AsNoTracking() - .Filter(s => s.Id == televisionShowId) + .Filter(s => s.Id == showId) .Include(s => s.ShowMetadata) .ThenInclude(sm => sm.Artwork) + .OrderBy(s => s.Id) .SingleOrDefaultAsync() .Map(Optional); @@ -82,21 +83,21 @@ namespace ErsatzTV.Infrastructure.Data.Repositories .ThenInclude(s => s.ShowMetadata) .ToListAsync(); - public Task> GetSeason(int televisionSeasonId) => + public Task> GetSeason(int seasonId) => _dbContext.Seasons .AsNoTracking() .Include(s => s.SeasonMetadata) .ThenInclude(sm => sm.Artwork) .Include(s => s.Show) .ThenInclude(s => s.ShowMetadata) - .SingleOrDefaultAsync(s => s.Id == televisionSeasonId) + .OrderBy(s => s.Id) + .SingleOrDefaultAsync(s => s.Id == seasonId) .Map(Optional); - public Task GetSeasonCount(int televisionShowId) => + public Task GetSeasonCount(int showId) => _dbContext.Seasons .AsNoTracking() - .Where(s => s.ShowId == televisionShowId) - .CountAsync(); + .CountAsync(s => s.ShowId == showId); public async Task> GetPagedSeasons(int televisionShowId, int pageNumber, int pageSize) { @@ -121,20 +122,20 @@ namespace ErsatzTV.Infrastructure.Data.Repositories .ToListAsync(); } - public Task> GetEpisode(int televisionEpisodeId) => + public Task> GetEpisode(int episodeId) => _dbContext.Episodes .AsNoTracking() .Include(e => e.Season) .Include(e => e.EpisodeMetadata) .ThenInclude(em => em.Artwork) - .SingleOrDefaultAsync(s => s.Id == televisionEpisodeId) + .OrderBy(s => s.Id) + .SingleOrDefaultAsync(s => s.Id == episodeId) .Map(Optional); - public Task GetEpisodeCount(int televisionSeasonId) => + public Task GetEpisodeCount(int seasonId) => _dbContext.Episodes .AsNoTracking() - .Where(e => e.SeasonId == televisionSeasonId) - .CountAsync(); + .CountAsync(e => e.SeasonId == seasonId); public Task> GetPagedEpisodes(int seasonId, int pageNumber, int pageSize) => _dbContext.EpisodeMetadata @@ -212,6 +213,7 @@ namespace ErsatzTV.Infrastructure.Data.Repositories .Include(i => i.EpisodeMetadata) .ThenInclude(em => em.Artwork) .Include(i => i.Statistics) + .OrderBy(i => i.Path) .SingleOrDefaultAsync(i => i.Path == path); return await maybeExisting.Match( diff --git a/ErsatzTV/Pages/CollectionItems.razor b/ErsatzTV/Pages/CollectionItems.razor index aefe7aae1..2e97f80d7 100644 --- a/ErsatzTV/Pages/CollectionItems.razor +++ b/ErsatzTV/Pages/CollectionItems.razor @@ -72,7 +72,8 @@ Subtitle="@card.Title" ContainerClass="media-card-episode-container mx-2" CardClass="media-card-episode" - DeleteClicked="@RemoveEpisodeFromCollection"/> + DeleteClicked="@RemoveEpisodeFromCollection" + ArtworkKind="@ArtworkKind.Thumbnail"/> } }