From f111ef49a5092ae0e89739737f72db3152464538 Mon Sep 17 00:00:00 2001 From: Jason Dove Date: Fri, 19 Feb 2021 06:18:18 -0600 Subject: [PATCH] fix split show display (same show in different folders/sources) --- ErsatzTV.Infrastructure/Data/DbInitializer.cs | 8 --- .../Data/Repositories/TelevisionRepository.cs | 55 +++++++++++++------ ErsatzTV.Infrastructure/Data/TvContext.cs | 1 + 3 files changed, 40 insertions(+), 24 deletions(-) diff --git a/ErsatzTV.Infrastructure/Data/DbInitializer.cs b/ErsatzTV.Infrastructure/Data/DbInitializer.cs index b2d9472f8..1d01fd9c9 100644 --- a/ErsatzTV.Infrastructure/Data/DbInitializer.cs +++ b/ErsatzTV.Infrastructure/Data/DbInitializer.cs @@ -55,14 +55,6 @@ namespace ErsatzTV.Infrastructure.Data context.Channels.Add(defaultChannel); context.SaveChanges(); - // TODO: clean this up - // var mediaSource = new LocalMediaSource - // { - // Name = "Default" - // }; - // context.MediaSources.Add(mediaSource); - // context.SaveChanges(); - // TODO: create looping static image that mentions configuring via web return Unit.Default; } diff --git a/ErsatzTV.Infrastructure/Data/Repositories/TelevisionRepository.cs b/ErsatzTV.Infrastructure/Data/Repositories/TelevisionRepository.cs index 1c6cf8079..2d77380a1 100644 --- a/ErsatzTV.Infrastructure/Data/Repositories/TelevisionRepository.cs +++ b/ErsatzTV.Infrastructure/Data/Repositories/TelevisionRepository.cs @@ -50,37 +50,60 @@ namespace ErsatzTV.Infrastructure.Data.Repositories .SingleOrDefaultAsync() .Map(Optional); - // TODO: test with split folders (same show in different sources) public Task GetShowCount() => _dbContext.TelevisionShows .AsNoTracking() - // .GroupBy(s => new { s.Metadata.Title, s.Metadata.Year }) + .GroupBy(s => new { s.Metadata.Title, s.Metadata.Year }) .CountAsync(); - // TODO: test with split folders (same show in different sources) public Task> GetPagedShows(int pageNumber, int pageSize) => _dbContext.TelevisionShows + .AsNoTracking() .Include(s => s.Metadata) .OrderBy(s => s.Metadata.SortTitle) .Skip((pageNumber - 1) * pageSize) .Take(pageSize) - .AsNoTracking() - .ToListAsync(); + .ToListAsync() + .Map( + list => list.GroupBy(s => new { s.Metadata.Title, s.Metadata.Year }).Select(g => g.First()) + .ToList()); - public Task GetSeasonCount(int televisionShowId) => - _dbContext.TelevisionSeasons + public async Task GetSeasonCount(int televisionShowId) + { + Option metadata = await _dbContext.TelevisionShowMetadata .AsNoTracking() - .Where(s => s.TelevisionShowId == televisionShowId) - .CountAsync(); + .Where(m => m.TelevisionShowId == televisionShowId) + .SingleOrDefaultAsync() + .Map(Optional); - public Task> GetPagedSeasons(int televisionShowId, int pageNumber, int pageSize) => - _dbContext.TelevisionSeasons - .Where(s => s.TelevisionShowId == televisionShowId) - .OrderBy(s => s.Number) - .Skip((pageNumber - 1) * pageSize) - .Take(pageSize) + return await metadata.Match( + m => _dbContext.TelevisionShows + .AsNoTracking() + .Where(s => s.Metadata.Title == m.Title && s.Metadata.Year == m.Year) + .SelectMany(s => s.Seasons) + .CountAsync(), + Task.FromResult(0)); + } + + public async Task> GetPagedSeasons(int televisionShowId, int pageNumber, int pageSize) + { + Option metadata = await _dbContext.TelevisionShowMetadata .AsNoTracking() - .ToListAsync(); + .Where(m => m.TelevisionShowId == televisionShowId) + .SingleOrDefaultAsync() + .Map(Optional); + + return await metadata.Match( + m => _dbContext.TelevisionShows + .AsNoTracking() + .Where(s => s.Metadata.Title == m.Title && s.Metadata.Year == m.Year) + .SelectMany(s => s.Seasons) + .OrderBy(s => s.Number) + .Skip((pageNumber - 1) * pageSize) + .Take(pageSize) + .ToListAsync(), + Task.FromResult(new List())); + } public async Task> GetOrAddShow(int mediaSourceId, string path) { diff --git a/ErsatzTV.Infrastructure/Data/TvContext.cs b/ErsatzTV.Infrastructure/Data/TvContext.cs index 9e3eedd37..28f11f058 100644 --- a/ErsatzTV.Infrastructure/Data/TvContext.cs +++ b/ErsatzTV.Infrastructure/Data/TvContext.cs @@ -31,6 +31,7 @@ namespace ErsatzTV.Infrastructure.Data public DbSet FFmpegProfiles { get; set; } public DbSet Resolutions { get; set; } public DbSet TelevisionShows { get; set; } + public DbSet TelevisionShowMetadata { get; set; } public DbSet TelevisionSeasons { get; set; } // support raw sql queries