diff --git a/ErsatzTV.Application/MediaCards/Queries/GetMovieCardsHandler.cs b/ErsatzTV.Application/MediaCards/Queries/GetMovieCardsHandler.cs index c745f5d4e..1a55618ce 100644 --- a/ErsatzTV.Application/MediaCards/Queries/GetMovieCardsHandler.cs +++ b/ErsatzTV.Application/MediaCards/Queries/GetMovieCardsHandler.cs @@ -14,10 +14,7 @@ namespace ErsatzTV.Application.MediaCards.Queries { private readonly IMovieRepository _movieRepository; - public GetMovieCardsHandler(IMovieRepository movieRepository) - { - _movieRepository = movieRepository; - } + public GetMovieCardsHandler(IMovieRepository movieRepository) => _movieRepository = movieRepository; public async Task Handle( GetMovieCards request, diff --git a/ErsatzTV.Application/Television/Queries/GetTelevisionShowByIdHandler.cs b/ErsatzTV.Application/Television/Queries/GetTelevisionShowByIdHandler.cs index d0e2f9c94..04ba479bb 100644 --- a/ErsatzTV.Application/Television/Queries/GetTelevisionShowByIdHandler.cs +++ b/ErsatzTV.Application/Television/Queries/GetTelevisionShowByIdHandler.cs @@ -11,10 +11,8 @@ namespace ErsatzTV.Application.Television.Queries { private readonly ITelevisionRepository _televisionRepository; - public GetTelevisionShowByIdHandler(ITelevisionRepository televisionRepository) - { + public GetTelevisionShowByIdHandler(ITelevisionRepository televisionRepository) => _televisionRepository = televisionRepository; - } public Task> Handle( GetTelevisionShowById request, diff --git a/ErsatzTV.Core/Interfaces/Domain/IHasAPoster.cs b/ErsatzTV.Core/Interfaces/Domain/IHasAPoster.cs index b50abd5a6..72007f6ea 100644 --- a/ErsatzTV.Core/Interfaces/Domain/IHasAPoster.cs +++ b/ErsatzTV.Core/Interfaces/Domain/IHasAPoster.cs @@ -4,8 +4,8 @@ namespace ErsatzTV.Core.Interfaces.Domain { public interface IHasAPoster { - public string Path { get; set; } - public string Poster { get; set; } - public DateTime? PosterLastWriteTime { get; set; } + string Path { get; set; } + string Poster { get; set; } + DateTime? PosterLastWriteTime { get; set; } } } diff --git a/ErsatzTV.Core/Interfaces/FFmpeg/IDisplaySize.cs b/ErsatzTV.Core/Interfaces/FFmpeg/IDisplaySize.cs index 7b1562fbe..36b12cc41 100644 --- a/ErsatzTV.Core/Interfaces/FFmpeg/IDisplaySize.cs +++ b/ErsatzTV.Core/Interfaces/FFmpeg/IDisplaySize.cs @@ -2,7 +2,7 @@ { public interface IDisplaySize { - public int Width { get; } - public int Height { get; } + int Width { get; } + int Height { get; } } } diff --git a/ErsatzTV.Core/Interfaces/FFmpeg/IFFmpegLocator.cs b/ErsatzTV.Core/Interfaces/FFmpeg/IFFmpegLocator.cs index 04a18a225..372623493 100644 --- a/ErsatzTV.Core/Interfaces/FFmpeg/IFFmpegLocator.cs +++ b/ErsatzTV.Core/Interfaces/FFmpeg/IFFmpegLocator.cs @@ -6,6 +6,6 @@ namespace ErsatzTV.Core.Interfaces.FFmpeg { public interface IFFmpegLocator { - public Task> ValidatePath(string executableBase, ConfigElementKey key); + Task> ValidatePath(string executableBase, ConfigElementKey key); } } diff --git a/ErsatzTV.Core/Interfaces/Locking/IEntityLocker.cs b/ErsatzTV.Core/Interfaces/Locking/IEntityLocker.cs index f750db1b7..e51ccf70f 100644 --- a/ErsatzTV.Core/Interfaces/Locking/IEntityLocker.cs +++ b/ErsatzTV.Core/Interfaces/Locking/IEntityLocker.cs @@ -4,9 +4,9 @@ namespace ErsatzTV.Core.Interfaces.Locking { public interface IEntityLocker { - public event EventHandler OnMediaSourceChanged; - public bool LockMediaSource(int mediaSourceId); - public bool UnlockMediaSource(int mediaSourceId); - public bool IsMediaSourceLocked(int mediaSourceId); + event EventHandler OnMediaSourceChanged; + bool LockMediaSource(int mediaSourceId); + bool UnlockMediaSource(int mediaSourceId); + bool IsMediaSourceLocked(int mediaSourceId); } } diff --git a/ErsatzTV.Core/Interfaces/Metadata/ILocalFileSystem.cs b/ErsatzTV.Core/Interfaces/Metadata/ILocalFileSystem.cs index b1a59f689..d44cf6098 100644 --- a/ErsatzTV.Core/Interfaces/Metadata/ILocalFileSystem.cs +++ b/ErsatzTV.Core/Interfaces/Metadata/ILocalFileSystem.cs @@ -6,10 +6,10 @@ namespace ErsatzTV.Core.Interfaces.Metadata { public interface ILocalFileSystem { - public DateTime GetLastWriteTime(string path); - public bool IsMediaSourceAccessible(LocalMediaSource localMediaSource); - public IEnumerable ListSubdirectories(string folder); - public IEnumerable ListFiles(string folder); - public bool FileExists(string path); + DateTime GetLastWriteTime(string path); + bool IsMediaSourceAccessible(LocalMediaSource localMediaSource); + IEnumerable ListSubdirectories(string folder); + IEnumerable ListFiles(string folder); + bool FileExists(string path); } } diff --git a/ErsatzTV.Core/Interfaces/Metadata/ILocalPosterProvider.cs b/ErsatzTV.Core/Interfaces/Metadata/ILocalPosterProvider.cs index 675342fc8..e4c829876 100644 --- a/ErsatzTV.Core/Interfaces/Metadata/ILocalPosterProvider.cs +++ b/ErsatzTV.Core/Interfaces/Metadata/ILocalPosterProvider.cs @@ -5,7 +5,7 @@ namespace ErsatzTV.Core.Interfaces.Metadata { public interface ILocalPosterProvider { - public Task RefreshPoster(MediaItem mediaItem); - public Task SavePosterToDisk(MediaItem mediaItem, string posterPath); + Task RefreshPoster(MediaItem mediaItem); + Task SavePosterToDisk(MediaItem mediaItem, string posterPath); } } diff --git a/ErsatzTV.Core/Interfaces/Plex/IPlexSecretStore.cs b/ErsatzTV.Core/Interfaces/Plex/IPlexSecretStore.cs index f3a3bdf29..cf6973b82 100644 --- a/ErsatzTV.Core/Interfaces/Plex/IPlexSecretStore.cs +++ b/ErsatzTV.Core/Interfaces/Plex/IPlexSecretStore.cs @@ -7,11 +7,11 @@ namespace ErsatzTV.Core.Interfaces.Plex { public interface IPlexSecretStore { - public Task GetClientIdentifier(); - public Task> GetUserAuthTokens(); - public Task UpsertUserAuthToken(PlexUserAuthToken userAuthToken); - public Task> GetServerAuthTokens(); - public Task> GetServerAuthToken(string clientIdentifier); - public Task UpsertServerAuthToken(PlexServerAuthToken serverAuthToken); + Task GetClientIdentifier(); + Task> GetUserAuthTokens(); + Task UpsertUserAuthToken(PlexUserAuthToken userAuthToken); + Task> GetServerAuthTokens(); + Task> GetServerAuthToken(string clientIdentifier); + Task UpsertServerAuthToken(PlexServerAuthToken serverAuthToken); } } diff --git a/ErsatzTV.Core/Interfaces/Repositories/IChannelRepository.cs b/ErsatzTV.Core/Interfaces/Repositories/IChannelRepository.cs index 14b3954c8..fda5b1cd2 100644 --- a/ErsatzTV.Core/Interfaces/Repositories/IChannelRepository.cs +++ b/ErsatzTV.Core/Interfaces/Repositories/IChannelRepository.cs @@ -7,12 +7,12 @@ namespace ErsatzTV.Core.Interfaces.Repositories { public interface IChannelRepository { - public Task Add(Channel channel); - public Task> Get(int id); - public Task> GetByNumber(int number); - public Task> GetAll(); - public Task> GetAllForGuide(); - public Task Update(Channel channel); - public Task Delete(int channelId); + Task Add(Channel channel); + Task> Get(int id); + Task> GetByNumber(int number); + Task> GetAll(); + Task> GetAllForGuide(); + Task Update(Channel channel); + Task Delete(int channelId); } } diff --git a/ErsatzTV.Core/Interfaces/Repositories/IConfigElementRepository.cs b/ErsatzTV.Core/Interfaces/Repositories/IConfigElementRepository.cs index 087e62cc0..bd83fc4e1 100644 --- a/ErsatzTV.Core/Interfaces/Repositories/IConfigElementRepository.cs +++ b/ErsatzTV.Core/Interfaces/Repositories/IConfigElementRepository.cs @@ -6,10 +6,10 @@ namespace ErsatzTV.Core.Interfaces.Repositories { public interface IConfigElementRepository { - public Task Add(ConfigElement configElement); - public Task> Get(ConfigElementKey key); - public Task> GetValue(ConfigElementKey key); - public Task Update(ConfigElement configElement); - public Task Delete(ConfigElement configElement); + Task Add(ConfigElement configElement); + Task> Get(ConfigElementKey key); + Task> GetValue(ConfigElementKey key); + Task Update(ConfigElement configElement); + Task Delete(ConfigElement configElement); } } diff --git a/ErsatzTV.Core/Interfaces/Repositories/IFFmpegProfileRepository.cs b/ErsatzTV.Core/Interfaces/Repositories/IFFmpegProfileRepository.cs index ac4962ee9..c08ef8469 100644 --- a/ErsatzTV.Core/Interfaces/Repositories/IFFmpegProfileRepository.cs +++ b/ErsatzTV.Core/Interfaces/Repositories/IFFmpegProfileRepository.cs @@ -7,10 +7,10 @@ namespace ErsatzTV.Core.Interfaces.Repositories { public interface IFFmpegProfileRepository { - public Task Add(FFmpegProfile ffmpegProfile); - public Task> Get(int id); - public Task> GetAll(); - public Task Update(FFmpegProfile ffmpegProfile); - public Task Delete(int ffmpegProfileId); + Task Add(FFmpegProfile ffmpegProfile); + Task> Get(int id); + Task> GetAll(); + Task Update(FFmpegProfile ffmpegProfile); + Task Delete(int ffmpegProfileId); } } diff --git a/ErsatzTV.Core/Interfaces/Repositories/ILogRepository.cs b/ErsatzTV.Core/Interfaces/Repositories/ILogRepository.cs index 096d24be6..a285f45f3 100644 --- a/ErsatzTV.Core/Interfaces/Repositories/ILogRepository.cs +++ b/ErsatzTV.Core/Interfaces/Repositories/ILogRepository.cs @@ -6,6 +6,6 @@ namespace ErsatzTV.Core.Interfaces.Repositories { public interface ILogRepository { - public Task> GetRecentLogEntries(); + Task> GetRecentLogEntries(); } } diff --git a/ErsatzTV.Core/Interfaces/Repositories/IMediaCollectionRepository.cs b/ErsatzTV.Core/Interfaces/Repositories/IMediaCollectionRepository.cs index 67e2ccc97..624b037be 100644 --- a/ErsatzTV.Core/Interfaces/Repositories/IMediaCollectionRepository.cs +++ b/ErsatzTV.Core/Interfaces/Repositories/IMediaCollectionRepository.cs @@ -8,21 +8,21 @@ namespace ErsatzTV.Core.Interfaces.Repositories { public interface IMediaCollectionRepository { - public Task Add(SimpleMediaCollection collection); - public Task> Get(int id); - public Task> GetSimpleMediaCollection(int id); - public Task> GetSimpleMediaCollectionWithItems(int id); - public Task> GetTelevisionMediaCollection(int id); - public Task> GetSimpleMediaCollections(); - public Task> GetAll(); - public Task> GetSummaries(string searchString); - public Task>> GetItems(int id); - public Task>> GetSimpleMediaCollectionItems(int id); - public Task>> GetTelevisionMediaCollectionItems(int id); - public Task Update(SimpleMediaCollection collection); - public Task InsertOrIgnore(TelevisionMediaCollection collection); - public Task ReplaceItems(int collectionId, List mediaItems); - public Task Delete(int mediaCollectionId); - public Task DeleteEmptyTelevisionCollections(); + Task Add(SimpleMediaCollection collection); + Task> Get(int id); + Task> GetSimpleMediaCollection(int id); + Task> GetSimpleMediaCollectionWithItems(int id); + Task> GetTelevisionMediaCollection(int id); + Task> GetSimpleMediaCollections(); + Task> GetAll(); + Task> GetSummaries(string searchString); + Task>> GetItems(int id); + Task>> GetSimpleMediaCollectionItems(int id); + Task>> GetTelevisionMediaCollectionItems(int id); + Task Update(SimpleMediaCollection collection); + Task InsertOrIgnore(TelevisionMediaCollection collection); + Task ReplaceItems(int collectionId, List mediaItems); + Task Delete(int mediaCollectionId); + Task DeleteEmptyTelevisionCollections(); } } diff --git a/ErsatzTV.Core/Interfaces/Repositories/IMediaItemRepository.cs b/ErsatzTV.Core/Interfaces/Repositories/IMediaItemRepository.cs index aa5966938..c7c339468 100644 --- a/ErsatzTV.Core/Interfaces/Repositories/IMediaItemRepository.cs +++ b/ErsatzTV.Core/Interfaces/Repositories/IMediaItemRepository.cs @@ -1,6 +1,5 @@ using System.Collections.Generic; using System.Threading.Tasks; -using ErsatzTV.Core.AggregateModels; using ErsatzTV.Core.Domain; using LanguageExt; @@ -8,14 +7,16 @@ namespace ErsatzTV.Core.Interfaces.Repositories { public interface IMediaItemRepository { - public Task Add(MediaItem mediaItem); - public Task> Get(int id); - public Task> GetAll(); - public Task> Search(string searchString); - // public Task> GetPageByType(AggregateMediaItemType itemType, int pageNumber, int pageSize); - // public Task GetCountByType(AggregateMediaItemType itemType); - public Task> GetAllByMediaSourceId(int mediaSourceId); - public Task Update(MediaItem mediaItem); - public Task Delete(int mediaItemId); + Task Add(MediaItem mediaItem); + Task> Get(int id); + Task> GetAll(); + + Task> Search(string searchString); + + // Task> GetPageByType(AggregateMediaItemType itemType, int pageNumber, int pageSize); + // Task GetCountByType(AggregateMediaItemType itemType); + Task> GetAllByMediaSourceId(int mediaSourceId); + Task Update(MediaItem mediaItem); + Task Delete(int mediaItemId); } } diff --git a/ErsatzTV.Core/Interfaces/Repositories/IMediaSourceRepository.cs b/ErsatzTV.Core/Interfaces/Repositories/IMediaSourceRepository.cs index e5246b907..4469f45dd 100644 --- a/ErsatzTV.Core/Interfaces/Repositories/IMediaSourceRepository.cs +++ b/ErsatzTV.Core/Interfaces/Repositories/IMediaSourceRepository.cs @@ -7,14 +7,14 @@ namespace ErsatzTV.Core.Interfaces.Repositories { public interface IMediaSourceRepository { - public Task Add(LocalMediaSource localMediaSource); - public Task Add(PlexMediaSource plexMediaSource); - public Task> GetAll(); - public Task> GetAllPlex(); - public Task> Get(int id); - public Task> GetPlex(int id); - public Task CountMediaItems(int id); - public Task Update(PlexMediaSource plexMediaSource); - public Task Delete(int id); + Task Add(LocalMediaSource localMediaSource); + Task Add(PlexMediaSource plexMediaSource); + Task> GetAll(); + Task> GetAllPlex(); + Task> Get(int id); + Task> GetPlex(int id); + Task CountMediaItems(int id); + Task Update(PlexMediaSource plexMediaSource); + Task Delete(int id); } } diff --git a/ErsatzTV.Core/Interfaces/Repositories/IMovieRepository.cs b/ErsatzTV.Core/Interfaces/Repositories/IMovieRepository.cs index 4fec7e047..98569126c 100644 --- a/ErsatzTV.Core/Interfaces/Repositories/IMovieRepository.cs +++ b/ErsatzTV.Core/Interfaces/Repositories/IMovieRepository.cs @@ -7,9 +7,9 @@ namespace ErsatzTV.Core.Interfaces.Repositories { public interface IMovieRepository { - public Task> GetOrAdd(int mediaSourceId, string path); - public Task Update(MovieMediaItem movie); - public Task GetMovieCount(); - public Task> GetPagedMovies(int pageNumber, int pageSize); + Task> GetOrAdd(int mediaSourceId, string path); + Task Update(MovieMediaItem movie); + Task GetMovieCount(); + Task> GetPagedMovies(int pageNumber, int pageSize); } } diff --git a/ErsatzTV.Core/Interfaces/Repositories/IPlayoutRepository.cs b/ErsatzTV.Core/Interfaces/Repositories/IPlayoutRepository.cs index 357fb2089..354b17335 100644 --- a/ErsatzTV.Core/Interfaces/Repositories/IPlayoutRepository.cs +++ b/ErsatzTV.Core/Interfaces/Repositories/IPlayoutRepository.cs @@ -8,14 +8,14 @@ namespace ErsatzTV.Core.Interfaces.Repositories { public interface IPlayoutRepository { - public Task Add(Playout playout); - public Task> Get(int id); - public Task> GetFull(int id); - public Task> GetPlayoutItem(int channelId, DateTimeOffset now); - public Task> GetPlayoutItems(int playoutId); - public Task> GetPlayoutIdsForMediaItems(Seq mediaItems); - public Task> GetAll(); - public Task Update(Playout playout); - public Task Delete(int playoutId); + Task Add(Playout playout); + Task> Get(int id); + Task> GetFull(int id); + Task> GetPlayoutItem(int channelId, DateTimeOffset now); + Task> GetPlayoutItems(int playoutId); + Task> GetPlayoutIdsForMediaItems(Seq mediaItems); + Task> GetAll(); + Task Update(Playout playout); + Task Delete(int playoutId); } } diff --git a/ErsatzTV.Core/Interfaces/Repositories/IProgramScheduleRepository.cs b/ErsatzTV.Core/Interfaces/Repositories/IProgramScheduleRepository.cs index 098538fcc..bb2bf429e 100644 --- a/ErsatzTV.Core/Interfaces/Repositories/IProgramScheduleRepository.cs +++ b/ErsatzTV.Core/Interfaces/Repositories/IProgramScheduleRepository.cs @@ -7,12 +7,12 @@ namespace ErsatzTV.Core.Interfaces.Repositories { public interface IProgramScheduleRepository { - public Task Add(ProgramSchedule programSchedule); - public Task> Get(int id); - public Task> GetWithPlayouts(int id); - public Task> GetAll(); - public Task Update(ProgramSchedule programSchedule); - public Task Delete(int programScheduleId); - public Task>> GetItems(int programScheduleId); + Task Add(ProgramSchedule programSchedule); + Task> Get(int id); + Task> GetWithPlayouts(int id); + Task> GetAll(); + Task Update(ProgramSchedule programSchedule); + Task Delete(int programScheduleId); + Task>> GetItems(int programScheduleId); } } diff --git a/ErsatzTV.Core/Interfaces/Repositories/IResolutionRepository.cs b/ErsatzTV.Core/Interfaces/Repositories/IResolutionRepository.cs index c9f2fd6c0..fc0abc191 100644 --- a/ErsatzTV.Core/Interfaces/Repositories/IResolutionRepository.cs +++ b/ErsatzTV.Core/Interfaces/Repositories/IResolutionRepository.cs @@ -7,7 +7,7 @@ namespace ErsatzTV.Core.Interfaces.Repositories { public interface IResolutionRepository { - public Task> Get(int id); - public Task> GetAll(); + Task> Get(int id); + Task> GetAll(); } } diff --git a/ErsatzTV.Core/Interfaces/Repositories/ITelevisionRepository.cs b/ErsatzTV.Core/Interfaces/Repositories/ITelevisionRepository.cs index 31824f02f..f9c44a4f5 100644 --- a/ErsatzTV.Core/Interfaces/Repositories/ITelevisionRepository.cs +++ b/ErsatzTV.Core/Interfaces/Repositories/ITelevisionRepository.cs @@ -7,23 +7,28 @@ namespace ErsatzTV.Core.Interfaces.Repositories { public interface ITelevisionRepository { - public Task> GetAllByMediaSourceId(int mediaSourceId); - public Task Update(TelevisionShow show); - public Task Update(TelevisionSeason season); - public Task Update(TelevisionEpisodeMediaItem episode); - public Task> GetShow(int televisionShowId); - public Task GetShowCount(); - public Task> GetPagedShows(int pageNumber, int pageSize); - public Task GetSeasonCount(int televisionShowId); - public Task> GetPagedSeasons(int televisionShowId, int pageNumber, int pageSize); - public Task> GetOrAddShow(int mediaSourceId, string path); - public Task> GetOrAddSeason( + Task> GetAllByMediaSourceId(int mediaSourceId); + Task Update(TelevisionShow show); + Task Update(TelevisionSeason season); + Task Update(TelevisionEpisodeMediaItem episode); + Task> GetShow(int televisionShowId); + Task GetShowCount(); + Task> GetPagedShows(int pageNumber, int pageSize); + Task GetSeasonCount(int televisionShowId); + Task> GetPagedSeasons(int televisionShowId, int pageNumber, int pageSize); + Task> GetOrAddShow(int mediaSourceId, string path); + + Task> GetOrAddSeason( TelevisionShow show, string path, int seasonNumber); - public Task> GetOrAddEpisode( + + Task> GetOrAddEpisode( TelevisionSeason season, int mediaSourceId, string path); + + Task> FindRemovedShows(LocalMediaSource localMediaSource, List allShowFolders); + Task Delete(TelevisionShow show); } } diff --git a/ErsatzTV.Core/Interfaces/Scheduling/IMediaCollectionEnumerator.cs b/ErsatzTV.Core/Interfaces/Scheduling/IMediaCollectionEnumerator.cs index 684badcf7..7d36941ab 100644 --- a/ErsatzTV.Core/Interfaces/Scheduling/IMediaCollectionEnumerator.cs +++ b/ErsatzTV.Core/Interfaces/Scheduling/IMediaCollectionEnumerator.cs @@ -6,7 +6,7 @@ namespace ErsatzTV.Core.Interfaces.Scheduling public interface IMediaCollectionEnumerator { MediaCollectionEnumeratorState State { get; } - public Option Current { get; } - public void MoveNext(); + Option Current { get; } + void MoveNext(); } } diff --git a/ErsatzTV.Core/Interfaces/Scheduling/IPlayoutBuilder.cs b/ErsatzTV.Core/Interfaces/Scheduling/IPlayoutBuilder.cs index 6492dc834..6e8224bbe 100644 --- a/ErsatzTV.Core/Interfaces/Scheduling/IPlayoutBuilder.cs +++ b/ErsatzTV.Core/Interfaces/Scheduling/IPlayoutBuilder.cs @@ -6,9 +6,9 @@ namespace ErsatzTV.Core.Interfaces.Scheduling { public interface IPlayoutBuilder { - public Task BuildPlayoutItems(Playout playout, bool rebuild = false); + Task BuildPlayoutItems(Playout playout, bool rebuild = false); - public Task BuildPlayoutItems( + Task BuildPlayoutItems( Playout playout, DateTimeOffset playoutStart, DateTimeOffset playoutFinish, diff --git a/ErsatzTV.Core/Metadata/LocalFolderScanner.cs b/ErsatzTV.Core/Metadata/LocalFolderScanner.cs index c5a278e59..f7b2b9ca0 100644 --- a/ErsatzTV.Core/Metadata/LocalFolderScanner.cs +++ b/ErsatzTV.Core/Metadata/LocalFolderScanner.cs @@ -40,9 +40,10 @@ namespace ErsatzTV.Core.Metadata .Map(s => $"{Path.DirectorySeparatorChar}{s}{Path.DirectorySeparatorChar}") .ToList(); + private readonly IImageCache _imageCache; + private readonly ILocalFileSystem _localFileSystem; private readonly ILocalStatisticsProvider _localStatisticsProvider; - private readonly IImageCache _imageCache; private readonly ILogger _logger; protected LocalFolderScanner( @@ -76,8 +77,12 @@ namespace ErsatzTV.Core.Metadata return BaseError.New(ex.Message); } } - - protected async Task SavePosterToDisk(T show, string posterPath, Func> update, int height = 220) where T : IHasAPoster + + protected async Task SavePosterToDisk( + T show, + string posterPath, + Func> update, + int height = 220) where T : IHasAPoster { byte[] originalBytes = await File.ReadAllBytesAsync(posterPath); Either maybeHash = await _imageCache.ResizeAndSaveImage(originalBytes, height, null); diff --git a/ErsatzTV.Core/Metadata/LocalMetadataProvider.cs b/ErsatzTV.Core/Metadata/LocalMetadataProvider.cs index cec3c8e21..113966daf 100644 --- a/ErsatzTV.Core/Metadata/LocalMetadataProvider.cs +++ b/ErsatzTV.Core/Metadata/LocalMetadataProvider.cs @@ -261,14 +261,14 @@ namespace ErsatzTV.Core.Metadata return null; } - + private static string GetSortTitle(string title) { if (string.IsNullOrWhiteSpace(title)) { return title; } - + if (title.StartsWith("the ", StringComparison.OrdinalIgnoreCase)) { return title.Substring(4); diff --git a/ErsatzTV.Core/Metadata/TelevisionFolderScanner.cs b/ErsatzTV.Core/Metadata/TelevisionFolderScanner.cs index 61f058fab..c88f5e988 100644 --- a/ErsatzTV.Core/Metadata/TelevisionFolderScanner.cs +++ b/ErsatzTV.Core/Metadata/TelevisionFolderScanner.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.IO; using System.Linq; using System.Threading.Tasks; @@ -14,7 +15,6 @@ namespace ErsatzTV.Core.Metadata { public class TelevisionFolderScanner : LocalFolderScanner, ITelevisionFolderScanner { - private readonly IImageCache _imageCache; private readonly ILocalFileSystem _localFileSystem; private readonly ILocalMetadataProvider _localMetadataProvider; private readonly ILogger _logger; @@ -35,7 +35,6 @@ namespace ErsatzTV.Core.Metadata _localFileSystem = localFileSystem; _televisionRepository = televisionRepository; _localMetadataProvider = localMetadataProvider; - _imageCache = imageCache; _logger = logger; } @@ -49,8 +48,11 @@ namespace ErsatzTV.Core.Metadata return Unit.Default; } - foreach (string showFolder in _localFileSystem.ListSubdirectories(localMediaSource.Folder) - .Filter(ShouldIncludeFolder)) + var allShowFolders = _localFileSystem.ListSubdirectories(localMediaSource.Folder) + .Filter(ShouldIncludeFolder) + .ToList(); + + foreach (string showFolder in allShowFolders) { Either maybeShow = await _televisionRepository .GetOrAddShow(localMediaSource.Id, showFolder) @@ -62,6 +64,14 @@ namespace ErsatzTV.Core.Metadata _ => Task.FromResult(Unit.Default)); } + List removedShows = + await _televisionRepository.FindRemovedShows(localMediaSource, allShowFolders); + foreach (TelevisionShow show in removedShows) + { + _logger.LogDebug("Removing missing show at {Folder}", show.Path); + await _televisionRepository.Delete(show); + } + return Unit.Default; } @@ -193,7 +203,7 @@ namespace ErsatzTV.Core.Metadata return BaseError.New(ex.Message); } } - + private async Task> UpdatePoster(TelevisionSeason season) { try diff --git a/ErsatzTV.Infrastructure/Data/Repositories/MediaItemRepository.cs b/ErsatzTV.Infrastructure/Data/Repositories/MediaItemRepository.cs index 94aa3cdc1..c5572c34b 100644 --- a/ErsatzTV.Infrastructure/Data/Repositories/MediaItemRepository.cs +++ b/ErsatzTV.Infrastructure/Data/Repositories/MediaItemRepository.cs @@ -52,6 +52,25 @@ namespace ErsatzTV.Infrastructure.Data.Repositories return episodeData.OfType().Concat(movieData.OfType()).ToListAsync(); } + public Task> GetAllByMediaSourceId(int mediaSourceId) => + _dbContext.MediaItems + .Filter(i => i.MediaSourceId == mediaSourceId) + .ToListAsync(); + + public async Task Update(MediaItem mediaItem) + { + _dbContext.MediaItems.Update(mediaItem); + return await _dbContext.SaveChangesAsync() > 0; + } + + public Task Delete(int mediaItemId) => + _dbContext.MediaItems.FindAsync(mediaItemId).AsTask().Bind( + mediaItem => + { + _dbContext.MediaItems.Remove(mediaItem); + return _dbContext.SaveChangesAsync(); + }).ToUnit(); + public Task> GetPageByType(MediaType mediaType, int pageNumber, int pageSize) => mediaType switch @@ -101,24 +120,5 @@ LIMIT {0} OFFSET {1}", .CountAsync(), _ => Task.FromResult(0) }; - - public Task> GetAllByMediaSourceId(int mediaSourceId) => - _dbContext.MediaItems - .Filter(i => i.MediaSourceId == mediaSourceId) - .ToListAsync(); - - public async Task Update(MediaItem mediaItem) - { - _dbContext.MediaItems.Update(mediaItem); - return await _dbContext.SaveChangesAsync() > 0; - } - - public Task Delete(int mediaItemId) => - _dbContext.MediaItems.FindAsync(mediaItemId).AsTask().Bind( - mediaItem => - { - _dbContext.MediaItems.Remove(mediaItem); - return _dbContext.SaveChangesAsync(); - }).ToUnit(); } } diff --git a/ErsatzTV.Infrastructure/Data/Repositories/MovieRepository.cs b/ErsatzTV.Infrastructure/Data/Repositories/MovieRepository.cs index 5bbe16d49..097ba7cdb 100644 --- a/ErsatzTV.Infrastructure/Data/Repositories/MovieRepository.cs +++ b/ErsatzTV.Infrastructure/Data/Repositories/MovieRepository.cs @@ -33,7 +33,7 @@ namespace ErsatzTV.Infrastructure.Data.Repositories _dbContext.MovieMediaItems.Update(movie); return await _dbContext.SaveChangesAsync() > 0; } - + public Task GetMovieCount() => _dbContext.MovieMediaItems .AsNoTracking() diff --git a/ErsatzTV.Infrastructure/Data/Repositories/TelevisionRepository.cs b/ErsatzTV.Infrastructure/Data/Repositories/TelevisionRepository.cs index e267d4123..1c6cf8079 100644 --- a/ErsatzTV.Infrastructure/Data/Repositories/TelevisionRepository.cs +++ b/ErsatzTV.Infrastructure/Data/Repositories/TelevisionRepository.cs @@ -120,6 +120,19 @@ namespace ErsatzTV.Infrastructure.Data.Repositories () => AddEpisode(season, mediaSourceId, path)); } + public Task> FindRemovedShows( + LocalMediaSource localMediaSource, + List allShowFolders) => + _dbContext.TelevisionShows + .Filter(s => s.MediaSourceId == localMediaSource.Id) + .Filter(s => !allShowFolders.Contains(s.Path)) + .ToListAsync(); + + public Task Delete(TelevisionShow show) => + _dbContext.TelevisionShows.Remove(show).AsTask() + .Bind(_ => _dbContext.SaveChangesAsync()) + .ToUnit(); + private async Task> AddShow(int mediaSourceId, string path) { try diff --git a/ErsatzTV/Pages/TelevisionSeasons.razor b/ErsatzTV/Pages/TelevisionSeasons.razor index 86ae329a0..77fdcf552 100644 --- a/ErsatzTV/Pages/TelevisionSeasons.razor +++ b/ErsatzTV/Pages/TelevisionSeasons.razor @@ -1,25 +1,25 @@ @page "/media/tv/shows/{ShowId:int}" -@using ErsatzTV.Application.MediaCards -@using ErsatzTV.Application.MediaCards.Queries @using ErsatzTV.Application.Television @using ErsatzTV.Application.Television.Queries +@using ErsatzTV.Application.MediaCards +@using ErsatzTV.Application.MediaCards.Queries @inject IMediator Mediator - -
- - - - -
- @_show.Title - @_show.Year - @_show.Plot -
-
-
-
+ +
+ + + + +
+ @_show.Title + @_show.Year + @_show.Plot +
+
+
+
@@ -37,7 +37,7 @@ private TelevisionShowViewModel _show; private int _pageSize => 100; - private int _pageNumber = 1; + private readonly int _pageNumber = 1; private TelevisionSeasonCardResultsViewModel _data; @@ -47,7 +47,7 @@ { await Mediator.Send(new GetTelevisionShowById(ShowId)) .IfSomeAsync(vm => _show = vm); - + _data = await Mediator.Send(new GetTelevisionSeasonCards(ShowId, _pageNumber, _pageSize)); } diff --git a/ErsatzTV/Shared/MediaCard.razor b/ErsatzTV/Shared/MediaCard.razor index 51e68a7ce..d3fc639b7 100644 --- a/ErsatzTV/Shared/MediaCard.razor +++ b/ErsatzTV/Shared/MediaCard.razor @@ -1,6 +1,5 @@ -@using ErsatzTV.Application.MediaItems +@using ErsatzTV.Application.MediaCards @using Unit = LanguageExt.Unit -@using ErsatzTV.Application.MediaCards @inject IMediator Mediator
@@ -40,7 +39,7 @@ [Parameter] public MediaCardViewModel Data { get; set; } - + [Parameter] public string Link { get; set; }