diff --git a/ErsatzTV.Core/Interfaces/Repositories/IMetadataRepository.cs b/ErsatzTV.Core/Interfaces/Repositories/IMetadataRepository.cs index dd1c78bb2..05b762a4a 100644 --- a/ErsatzTV.Core/Interfaces/Repositories/IMetadataRepository.cs +++ b/ErsatzTV.Core/Interfaces/Repositories/IMetadataRepository.cs @@ -16,6 +16,7 @@ public interface IMetadataRepository Task UpdateStatistics(MediaItem mediaItem, MediaVersion incoming, bool updateVersion = true); Task UpdateArtworkPath(Artwork artwork); Task AddArtwork(Domain.Metadata metadata, Artwork artwork); + Task RemoveArtworkWithKind(Domain.Metadata metadata, ArtworkKind artworkKind); Task CloneArtwork( Domain.Metadata metadata, diff --git a/ErsatzTV.Core/Interfaces/Repositories/IOtherVideoRepository.cs b/ErsatzTV.Core/Interfaces/Repositories/IOtherVideoRepository.cs index c1ee47f00..819477dfc 100644 --- a/ErsatzTV.Core/Interfaces/Repositories/IOtherVideoRepository.cs +++ b/ErsatzTV.Core/Interfaces/Repositories/IOtherVideoRepository.cs @@ -19,5 +19,4 @@ public interface IOtherVideoRepository Task AddActor(OtherVideoMetadata metadata, Actor actor); Task AddDirector(OtherVideoMetadata metadata, Director director); Task AddWriter(OtherVideoMetadata metadata, Writer writer); - Task RemoveArtwork(OtherVideoMetadata metadata, ArtworkKind artworkKind); } diff --git a/ErsatzTV.Core/Metadata/FallbackMetadataProvider.cs b/ErsatzTV.Core/Metadata/FallbackMetadataProvider.cs index 8896c0caa..71a630433 100644 --- a/ErsatzTV.Core/Metadata/FallbackMetadataProvider.cs +++ b/ErsatzTV.Core/Metadata/FallbackMetadataProvider.cs @@ -44,10 +44,11 @@ public partial class FallbackMetadataProvider(IClient client) : IFallbackMetadat { MetadataKind = MetadataKind.Fallback, Title = fileName ?? showFolder, - Genres = new List(), - Tags = new List(), - Studios = new List(), - Actors = new List() + Genres = [], + Tags = [], + Studios = [], + Actors = [], + Artwork = [] }; return GetTelevisionShowMetadata(fileName, metadata); } @@ -69,18 +70,18 @@ public partial class FallbackMetadataProvider(IClient client) : IFallbackMetadat Title = Path.GetFileNameWithoutExtension(path) ?? path, DateAdded = DateTime.UtcNow, EpisodeNumber = 0, - Actors = new List(), - Artwork = new List(), - Directors = new List(), - Genres = new List(), - Guids = new List(), - Studios = new List(), - Tags = new List(), - Writers = new List() + Actors = [], + Artwork = [], + Directors = [], + Genres = [], + Guids = [], + Studios = [], + Tags = [], + Writers = [] }; return fileName != null ? GetEpisodeMetadata(fileName, baseMetadata) - : new List { baseMetadata }; + : [baseMetadata]; } public MovieMetadata GetFallbackMetadata(Movie movie) @@ -91,13 +92,14 @@ public partial class FallbackMetadataProvider(IClient client) : IFallbackMetadat { MetadataKind = MetadataKind.Fallback, Title = Path.GetFileNameWithoutExtension(path) ?? path, - Genres = new List(), - Tags = new List(), - Studios = new List(), - Actors = new List(), - Directors = new List(), - Writers = new List(), - Guids = new List() + Artwork = [], + Genres = [], + Tags = [], + Studios = [], + Actors = [], + Directors = [], + Writers = [], + Guids = [] }; return fileName != null ? GetMovieMetadata(fileName, metadata) : metadata; @@ -125,13 +127,14 @@ public partial class FallbackMetadataProvider(IClient client) : IFallbackMetadat MetadataKind = MetadataKind.Fallback, Title = fileName ?? path, OtherVideo = otherVideo, - Genres = new List(), - Tags = new List(), - Studios = new List(), - Actors = new List(), - Directors = new List(), - Writers = new List(), - Guids = new List() + Artwork = [], + Genres = [], + Tags = [], + Studios = [], + Actors = [], + Directors = [], + Writers = [], + Guids = [] }; return GetOtherVideoMetadata(path, metadata); @@ -160,6 +163,7 @@ public partial class FallbackMetadataProvider(IClient client) : IFallbackMetadat MetadataKind = MetadataKind.Fallback, Title = fileName ?? path, Image = image, + Artwork = [], Genres = [], Tags = [], Studios = [], @@ -179,6 +183,7 @@ public partial class FallbackMetadataProvider(IClient client) : IFallbackMetadat MetadataKind = MetadataKind.Fallback, Title = fileName ?? path, RemoteStream = remoteStream, + Artwork = [], Genres = [], Tags = [], Studios = [], @@ -232,14 +237,14 @@ public partial class FallbackMetadataProvider(IClient client) : IFallbackMetadat DateAdded = baseMetadata.DateAdded, DateUpdated = baseMetadata.DateAdded, Title = baseMetadata.Title, - Actors = new List(), - Artwork = new List(), - Directors = new List(), - Genres = new List(), - Guids = new List(), - Studios = new List(), - Tags = new List(), - Writers = new List() + Actors = [], + Artwork = [], + Directors = [], + Genres = [], + Guids = [], + Studios = [], + Tags = [], + Writers = [] }; result.Add(metadata); @@ -290,6 +295,7 @@ public partial class FallbackMetadataProvider(IClient client) : IFallbackMetadat ? match.Groups[2].Value.Trim() : Path.GetFileNameWithoutExtension(fileName); metadata.Artists = []; + metadata.Artwork = []; metadata.Genres = []; metadata.Tags = []; metadata.Studios = []; @@ -326,11 +332,11 @@ public partial class FallbackMetadataProvider(IClient client) : IFallbackMetadat .Map(t => new Tag { Name = t }) .ToList(); - metadata.Artwork = new List(); - metadata.Actors = new List(); - metadata.Genres = new List(); + metadata.Actors = []; + metadata.Artwork = []; + metadata.Genres = []; metadata.Tags = tags; - metadata.Studios = new List(); + metadata.Studios = []; metadata.DateUpdated = DateTime.UtcNow; metadata.OriginalTitle = Path.GetRelativePath(libraryPath, path); @@ -364,8 +370,8 @@ public partial class FallbackMetadataProvider(IClient client) : IFallbackMetadat .Map(t => new Tag { Name = t }) .ToList(); - metadata.Artwork = []; metadata.Actors = []; + metadata.Artwork = []; metadata.Genres = []; metadata.Tags = tags; metadata.Studios = []; @@ -402,8 +408,8 @@ public partial class FallbackMetadataProvider(IClient client) : IFallbackMetadat .Map(t => new Tag { Name = t }) .ToList(); - metadata.Artwork = []; metadata.Actors = []; + metadata.Artwork = []; metadata.Genres = []; metadata.Tags = tags; metadata.Studios = []; @@ -440,11 +446,11 @@ public partial class FallbackMetadataProvider(IClient client) : IFallbackMetadat .Map(t => new Tag { Name = t }) .ToList(); - metadata.Artwork = new List(); - metadata.Actors = new List(); - metadata.Genres = new List(); + metadata.Actors = []; + metadata.Artwork = []; + metadata.Genres = []; metadata.Tags = tags; - metadata.Studios = new List(); + metadata.Studios = []; metadata.DateUpdated = DateTime.UtcNow; metadata.OriginalTitle = Path.GetRelativePath(libraryPath, path); diff --git a/ErsatzTV.Infrastructure/Data/Repositories/MetadataRepository.cs b/ErsatzTV.Infrastructure/Data/Repositories/MetadataRepository.cs index 999f64108..d3738e187 100644 --- a/ErsatzTV.Infrastructure/Data/Repositories/MetadataRepository.cs +++ b/ErsatzTV.Infrastructure/Data/Repositories/MetadataRepository.cs @@ -309,6 +309,15 @@ public class MetadataRepository(IDbContextFactory dbContextFactory) : }; } + public async Task RemoveArtworkWithKind(Core.Domain.Metadata metadata, ArtworkKind artworkKind) + { + await using TvContext dbContext = await dbContextFactory.CreateDbContextAsync(); + var ids = metadata.Artwork.Where(a => a.ArtworkKind == artworkKind).Select(a => a.Id).ToHashSet(); + return await dbContext.Artwork + .Where(a => ids.Contains(a.Id)) + .ExecuteDeleteAsync() > 0; + } + public async Task CloneArtwork( Core.Domain.Metadata metadata, Option maybeArtwork, diff --git a/ErsatzTV.Infrastructure/Data/Repositories/OtherVideoRepository.cs b/ErsatzTV.Infrastructure/Data/Repositories/OtherVideoRepository.cs index 2c4135c3b..fe5bd474c 100644 --- a/ErsatzTV.Infrastructure/Data/Repositories/OtherVideoRepository.cs +++ b/ErsatzTV.Infrastructure/Data/Repositories/OtherVideoRepository.cs @@ -175,15 +175,6 @@ public class OtherVideoRepository : IOtherVideoRepository new { writer.Name, MetadataId = metadata.Id }).Map(result => result > 0); } - public async Task RemoveArtwork(OtherVideoMetadata metadata, ArtworkKind artworkKind) - { - await using TvContext dbContext = await _dbContextFactory.CreateDbContextAsync(); - var ids = metadata.Artwork.Where(a => a.ArtworkKind == artworkKind).Select(a => a.Id).ToHashSet(); - return await dbContext.Artwork - .Where(a => ids.Contains(a.Id)) - .ExecuteDeleteAsync() > 0; - } - private async Task>> AddOtherVideo( TvContext dbContext, int libraryPathId, diff --git a/ErsatzTV.Scanner/Core/Metadata/MovieFolderScanner.cs b/ErsatzTV.Scanner/Core/Metadata/MovieFolderScanner.cs index 60d627e9f..26d318ea8 100644 --- a/ErsatzTV.Scanner/Core/Metadata/MovieFolderScanner.cs +++ b/ErsatzTV.Scanner/Core/Metadata/MovieFolderScanner.cs @@ -27,6 +27,7 @@ public class MovieFolderScanner : LocalFolderScanner, IMovieFolderScanner private readonly IFileSystem _fileSystem; private readonly ILocalFileSystem _localFileSystem; private readonly ILocalMetadataProvider _localMetadataProvider; + private readonly IMetadataRepository _metadataRepository; private readonly ILocalSubtitlesProvider _localSubtitlesProvider; private readonly ILogger _logger; private readonly IMediaItemRepository _mediaItemRepository; @@ -67,6 +68,7 @@ public class MovieFolderScanner : LocalFolderScanner, IMovieFolderScanner _localSubtitlesProvider = localSubtitlesProvider; _localChaptersProvider = localChaptersProvider; _localMetadataProvider = localMetadataProvider; + _metadataRepository = metadataRepository; _libraryRepository = libraryRepository; _mediaItemRepository = mediaItemRepository; _client = client; @@ -312,11 +314,18 @@ public class MovieFolderScanner : LocalFolderScanner, IMovieFolderScanner try { Movie movie = result.Item; - Option maybeArtwork = LocateArtwork(movie, artworkKind); - foreach (string posterFile in maybeArtwork) + foreach (var metadata in movie.MovieMetadata.HeadOrNone()) { - MovieMetadata metadata = movie.MovieMetadata.Head(); - await RefreshArtwork(posterFile, metadata, artworkKind, None, None, cancellationToken); + Option maybeArtwork = LocateArtwork(movie, artworkKind); + foreach (string posterFile in maybeArtwork) + { + await RefreshArtwork(posterFile, metadata, artworkKind, None, None, cancellationToken); + } + + if (maybeArtwork.IsNone && metadata.Artwork.Any(a => a.ArtworkKind == artworkKind)) + { + await _metadataRepository.RemoveArtworkWithKind(metadata, artworkKind); + } } return result; diff --git a/ErsatzTV.Scanner/Core/Metadata/OtherVideoFolderScanner.cs b/ErsatzTV.Scanner/Core/Metadata/OtherVideoFolderScanner.cs index 79432f109..92ad87d58 100644 --- a/ErsatzTV.Scanner/Core/Metadata/OtherVideoFolderScanner.cs +++ b/ErsatzTV.Scanner/Core/Metadata/OtherVideoFolderScanner.cs @@ -22,6 +22,7 @@ public class OtherVideoFolderScanner : LocalFolderScanner, IOtherVideoFolderScan private readonly IClient _client; private readonly ILibraryRepository _libraryRepository; private readonly ILocalChaptersProvider _localChaptersProvider; + private readonly IMetadataRepository _metadataRepository; private readonly IScannerProxy _scannerProxy; private readonly IFileSystem _fileSystem; private readonly ILocalFileSystem _localFileSystem; @@ -64,6 +65,7 @@ public class OtherVideoFolderScanner : LocalFolderScanner, IOtherVideoFolderScan _localMetadataProvider = localMetadataProvider; _localSubtitlesProvider = localSubtitlesProvider; _localChaptersProvider = localChaptersProvider; + _metadataRepository = metadataRepository; _otherVideoRepository = otherVideoRepository; _libraryRepository = libraryRepository; _mediaItemRepository = mediaItemRepository; @@ -369,7 +371,7 @@ public class OtherVideoFolderScanner : LocalFolderScanner, IOtherVideoFolderScan if (maybeThumbnail.IsNone && metadata.Artwork.Any(a => a.ArtworkKind is ArtworkKind.Thumbnail)) { - await _otherVideoRepository.RemoveArtwork(metadata, ArtworkKind.Thumbnail); + await _metadataRepository.RemoveArtworkWithKind(metadata, ArtworkKind.Thumbnail); } }