From 37a405e4e41ab5bee2dfd754035b7842dc1792c8 Mon Sep 17 00:00:00 2001 From: Jason Dove <1695733+jasongdove@users.noreply.github.com> Date: Fri, 16 Jan 2026 09:39:47 -0600 Subject: [PATCH] clien up old music video/artist artwork --- .../Metadata/FallbackMetadataProvider.cs | 12 +++++-- .../Core/Metadata/LocalMetadataProvider.cs | 8 +++-- .../Core/Metadata/MovieFolderScanner.cs | 2 +- .../Core/Metadata/MusicVideoFolderScanner.cs | 35 ++++++++++++++----- .../Core/Metadata/OtherVideoFolderScanner.cs | 2 +- 5 files changed, 42 insertions(+), 17 deletions(-) diff --git a/ErsatzTV.Core/Metadata/FallbackMetadataProvider.cs b/ErsatzTV.Core/Metadata/FallbackMetadataProvider.cs index 71a630433..93fc0862b 100644 --- a/ErsatzTV.Core/Metadata/FallbackMetadataProvider.cs +++ b/ErsatzTV.Core/Metadata/FallbackMetadataProvider.cs @@ -57,7 +57,11 @@ public partial class FallbackMetadataProvider(IClient client) : IFallbackMetadat { string fileName = Path.GetFileName(artistFolder); return new ArtistMetadata - { MetadataKind = MetadataKind.Fallback, Title = fileName ?? artistFolder }; + { + MetadataKind = MetadataKind.Fallback, + Title = fileName ?? artistFolder, + Artwork = [] + }; } public List GetFallbackMetadata(Episode episode) @@ -112,7 +116,8 @@ public partial class FallbackMetadataProvider(IClient client) : IFallbackMetadat var metadata = new MusicVideoMetadata { MetadataKind = MetadataKind.Fallback, - Title = fileName ?? path + Title = fileName ?? path, + Artwork = [] }; return GetMusicVideoMetadata(fileName, metadata); @@ -148,7 +153,8 @@ public partial class FallbackMetadataProvider(IClient client) : IFallbackMetadat { MetadataKind = MetadataKind.Fallback, Title = fileName ?? path, - Song = song + Song = song, + Artwork = [] }; return GetSongMetadata(path, metadata); diff --git a/ErsatzTV.Scanner/Core/Metadata/LocalMetadataProvider.cs b/ErsatzTV.Scanner/Core/Metadata/LocalMetadataProvider.cs index f3b80c0ee..34e46a7b1 100644 --- a/ErsatzTV.Scanner/Core/Metadata/LocalMetadataProvider.cs +++ b/ErsatzTV.Scanner/Core/Metadata/LocalMetadataProvider.cs @@ -335,7 +335,8 @@ public class LocalMetadataProvider : ILocalMetadataProvider Genres = nfo.Genres.Map(g => new Genre { Name = g }).ToList(), Tags = nfo.Tags.Map(t => new Tag { Name = t }).ToList(), Studios = nfo.Studios.Map(s => new Studio { Name = s }).ToList(), - Directors = nfo.Directors.Map(s => new Director { Name = s }).ToList() + Directors = nfo.Directors.Map(s => new Director { Name = s }).ToList(), + Artwork = [] }; } @@ -949,7 +950,7 @@ public class LocalMetadataProvider : ILocalMetadataProvider ? SortTitle.GetSortTitle(metadata.Title) : metadata.SortTitle; metadata.ArtistId = artist.Id; - artist.ArtistMetadata = new List { metadata }; + artist.ArtistMetadata = [metadata]; return await _metadataRepository.Add(metadata); } @@ -1355,7 +1356,8 @@ public class LocalMetadataProvider : ILocalMetadataProvider Biography = nfo.Biography, Genres = nfo.Genres.Map(g => new Genre { Name = g }).ToList(), Styles = nfo.Styles.Map(s => new Style { Name = s }).ToList(), - Moods = nfo.Moods.Map(m => new Mood { Name = m }).ToList() + Moods = nfo.Moods.Map(m => new Mood { Name = m }).ToList(), + Artwork = [] }; } diff --git a/ErsatzTV.Scanner/Core/Metadata/MovieFolderScanner.cs b/ErsatzTV.Scanner/Core/Metadata/MovieFolderScanner.cs index 26d318ea8..4afe697c2 100644 --- a/ErsatzTV.Scanner/Core/Metadata/MovieFolderScanner.cs +++ b/ErsatzTV.Scanner/Core/Metadata/MovieFolderScanner.cs @@ -314,7 +314,7 @@ public class MovieFolderScanner : LocalFolderScanner, IMovieFolderScanner try { Movie movie = result.Item; - foreach (var metadata in movie.MovieMetadata.HeadOrNone()) + foreach (MovieMetadata metadata in movie.MovieMetadata.HeadOrNone()) { Option maybeArtwork = LocateArtwork(movie, artworkKind); foreach (string posterFile in maybeArtwork) diff --git a/ErsatzTV.Scanner/Core/Metadata/MusicVideoFolderScanner.cs b/ErsatzTV.Scanner/Core/Metadata/MusicVideoFolderScanner.cs index 4969679bf..a43577f21 100644 --- a/ErsatzTV.Scanner/Core/Metadata/MusicVideoFolderScanner.cs +++ b/ErsatzTV.Scanner/Core/Metadata/MusicVideoFolderScanner.cs @@ -23,6 +23,7 @@ public class MusicVideoFolderScanner : LocalFolderScanner, IMusicVideoFolderScan 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; @@ -66,6 +67,7 @@ public class MusicVideoFolderScanner : LocalFolderScanner, IMusicVideoFolderScan _localMetadataProvider = localMetadataProvider; _localSubtitlesProvider = localSubtitlesProvider; _localChaptersProvider = localChaptersProvider; + _metadataRepository = metadataRepository; _artistRepository = artistRepository; _musicVideoRepository = musicVideoRepository; _libraryRepository = libraryRepository; @@ -279,11 +281,19 @@ public class MusicVideoFolderScanner : LocalFolderScanner, IMusicVideoFolderScan try { Artist artist = result.Item; - await LocateArtworkForArtist(artistFolder, artworkKind).IfSomeAsync(async artworkFile => + foreach (ArtistMetadata metadata in artist.ArtistMetadata.HeadOrNone()) { - ArtistMetadata metadata = artist.ArtistMetadata.Head(); - await RefreshArtwork(artworkFile, metadata, artworkKind, None, None, cancellationToken); - }); + Option maybeArtwork = LocateArtworkForArtist(artistFolder, artworkKind); + foreach (string artworkFile in maybeArtwork) + { + await RefreshArtwork(artworkFile, metadata, artworkKind, None, None, cancellationToken); + } + + if (maybeArtwork.IsNone && metadata.Artwork.Any(a => a.ArtworkKind == artworkKind)) + { + await _metadataRepository.RemoveArtworkWithKind(metadata, artworkKind); + } + } return result; } @@ -425,7 +435,7 @@ public class MusicVideoFolderScanner : LocalFolderScanner, IMusicVideoFolderScan { if (!Optional(musicVideo.MusicVideoMetadata).Flatten().Any()) { - musicVideo.MusicVideoMetadata ??= new List(); + musicVideo.MusicVideoMetadata ??= []; string path = musicVideo.MediaVersions.Head().MediaFiles.Head().Path; _logger.LogDebug("Refreshing {Attribute} for {Path}", "Fallback Metadata", path); @@ -497,11 +507,18 @@ public class MusicVideoFolderScanner : LocalFolderScanner, IMusicVideoFolderScan { MusicVideo musicVideo = result.Item; - Option maybeThumbnail = LocateThumbnail(musicVideo); - foreach (string thumbnailFile in maybeThumbnail) + foreach (MusicVideoMetadata metadata in musicVideo.MusicVideoMetadata.HeadOrNone()) { - MusicVideoMetadata metadata = musicVideo.MusicVideoMetadata.Head(); - await RefreshArtwork(thumbnailFile, metadata, ArtworkKind.Thumbnail, None, None, cancellationToken); + Option maybeThumbnail = LocateThumbnail(musicVideo); + foreach (string thumbnailFile in maybeThumbnail) + { + await RefreshArtwork(thumbnailFile, metadata, ArtworkKind.Thumbnail, None, None, cancellationToken); + } + + if (maybeThumbnail.IsNone && metadata.Artwork.Any(a => a.ArtworkKind is ArtworkKind.Thumbnail)) + { + await _metadataRepository.RemoveArtworkWithKind(metadata, ArtworkKind.Thumbnail); + } } return result; diff --git a/ErsatzTV.Scanner/Core/Metadata/OtherVideoFolderScanner.cs b/ErsatzTV.Scanner/Core/Metadata/OtherVideoFolderScanner.cs index 92ad87d58..45b172fda 100644 --- a/ErsatzTV.Scanner/Core/Metadata/OtherVideoFolderScanner.cs +++ b/ErsatzTV.Scanner/Core/Metadata/OtherVideoFolderScanner.cs @@ -361,7 +361,7 @@ public class OtherVideoFolderScanner : LocalFolderScanner, IOtherVideoFolderScan { OtherVideo otherVideo = result.Item; - foreach (var metadata in otherVideo.OtherVideoMetadata.HeadOrNone()) + foreach (OtherVideoMetadata metadata in otherVideo.OtherVideoMetadata.HeadOrNone()) { Option maybeThumbnail = LocateThumbnail(otherVideo); foreach (string thumbnailFile in maybeThumbnail)