From e2b3c1ce8e9569fb8999c9228f912da188a1d693 Mon Sep 17 00:00:00 2001 From: Jason Dove Date: Wed, 28 Dec 2022 13:41:01 -0600 Subject: [PATCH] properly unflag local movies that are now present on disk (#1076) --- CHANGELOG.md | 3 +- .../Repositories/IMediaItemRepository.cs | 1 + ErsatzTV.Core/Metadata/MovieFolderScanner.cs | 30 ++++++++++++++----- .../Data/Repositories/MediaItemRepository.cs | 13 ++++++++ 4 files changed, 38 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d1ea7f73d..5bd855e90 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -# Changelog + Changelog All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). @@ -7,6 +7,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ### Fixed - Fix many transcoding failures caused by the colorspace filter - Fix song playback with VAAPI and NVENC +- Fix edge case where some local movies would not automatically be restored from trash ### Changed - Upgrade to dotnet 7 diff --git a/ErsatzTV.Core/Interfaces/Repositories/IMediaItemRepository.cs b/ErsatzTV.Core/Interfaces/Repositories/IMediaItemRepository.cs index 97c9efee4..f4d74bdb0 100644 --- a/ErsatzTV.Core/Interfaces/Repositories/IMediaItemRepository.cs +++ b/ErsatzTV.Core/Interfaces/Repositories/IMediaItemRepository.cs @@ -10,4 +10,5 @@ public interface IMediaItemRepository Task> FlagFileNotFound(LibraryPath libraryPath, string path); Task FlagNormal(MediaItem mediaItem); Task> DeleteItems(List mediaItemIds); + Task> GetAllTrashedItems(LibraryPath libraryPath); } diff --git a/ErsatzTV.Core/Metadata/MovieFolderScanner.cs b/ErsatzTV.Core/Metadata/MovieFolderScanner.cs index 9409e94c2..d3bb9a68f 100644 --- a/ErsatzTV.Core/Metadata/MovieFolderScanner.cs +++ b/ErsatzTV.Core/Metadata/MovieFolderScanner.cs @@ -18,6 +18,7 @@ public class MovieFolderScanner : LocalFolderScanner, IMovieFolderScanner private readonly IClient _client; private readonly IFallbackMetadataProvider _fallbackMetadataProvider; private readonly ILibraryRepository _libraryRepository; + private readonly IMediaItemRepository _mediaItemRepository; private readonly ILocalFileSystem _localFileSystem; private readonly ILocalMetadataProvider _localMetadataProvider; private readonly ILocalSubtitlesProvider _localSubtitlesProvider; @@ -64,6 +65,7 @@ public class MovieFolderScanner : LocalFolderScanner, IMovieFolderScanner _searchRepository = searchRepository; _fallbackMetadataProvider = fallbackMetadataProvider; _libraryRepository = libraryRepository; + _mediaItemRepository = mediaItemRepository; _mediator = mediator; _client = client; _logger = logger; @@ -79,6 +81,8 @@ public class MovieFolderScanner : LocalFolderScanner, IMovieFolderScanner { try { + List allTrashedItems = await _mediaItemRepository.GetAllTrashedItems(libraryPath); + decimal progressSpread = progressMax - progressMin; var foldersCompleted = 0; @@ -133,16 +137,26 @@ public class MovieFolderScanner : LocalFolderScanner, IMovieFolderScanner .Filter(f => f.Path == movieFolder) .HeadOrNone(); - // skip folder if etag matches - if (await knownFolder.Map(f => f.Etag ?? string.Empty).IfNoneAsync(string.Empty) == etag) + bool etagMatches = await knownFolder.Map(f => f.Etag ?? string.Empty).IfNoneAsync(string.Empty) == etag; + if (etagMatches) { - continue; + if (allFiles.Any(allTrashedItems.Contains)) + { + _logger.LogDebug("Previously trashed items are now present in folder {Folder}", movieFolder); + } + else + { + // etag matches and no trashed items are now present, continue to next folder + continue; + } } - - _logger.LogDebug( - "UPDATE: Etag has changed for folder {Folder}", - movieFolder); - + else + { + _logger.LogDebug( + "UPDATE: Etag has changed for folder {Folder}", + movieFolder); + } + foreach (string file in allFiles.OrderBy(identity)) { // TODO: figure out how to rebuild playlists diff --git a/ErsatzTV.Infrastructure/Data/Repositories/MediaItemRepository.cs b/ErsatzTV.Infrastructure/Data/Repositories/MediaItemRepository.cs index 017d96e28..83777d407 100644 --- a/ErsatzTV.Infrastructure/Data/Repositories/MediaItemRepository.cs +++ b/ErsatzTV.Infrastructure/Data/Repositories/MediaItemRepository.cs @@ -82,6 +82,19 @@ public class MediaItemRepository : IMediaItemRepository return ids; } + public async Task> GetAllTrashedItems(LibraryPath libraryPath) + { + await using TvContext dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await dbContext.Connection.QueryAsync( + @"SELECT MF.Path + FROM MediaItem M + INNER JOIN MediaVersion MV on M.Id = COALESCE(MovieId, MusicVideoId, OtherVideoId, SongId, EpisodeId) + INNER JOIN MediaFile MF on MV.Id = MF.MediaVersionId + WHERE M.State IN (1,2) AND M.LibraryPathId = @LibraryPathId", + new { LibraryPathId = libraryPath.Id }) + .Map(list => list.ToList()); + } + public async Task FlagNormal(MediaItem mediaItem) { await using TvContext dbContext = await _dbContextFactory.CreateDbContextAsync();