From 2e57bac8bae9425f4521ad5e71258eb498272431 Mon Sep 17 00:00:00 2001 From: Jason Dove <1695733+jasongdove@users.noreply.github.com> Date: Fri, 16 Jan 2026 09:55:27 -0600 Subject: [PATCH] clean up old song artwork --- .../Core/Metadata/SongFolderScanner.cs | 45 +++++++++++-------- 1 file changed, 27 insertions(+), 18 deletions(-) diff --git a/ErsatzTV.Scanner/Core/Metadata/SongFolderScanner.cs b/ErsatzTV.Scanner/Core/Metadata/SongFolderScanner.cs index 45b862680..49f4f86d3 100644 --- a/ErsatzTV.Scanner/Core/Metadata/SongFolderScanner.cs +++ b/ErsatzTV.Scanner/Core/Metadata/SongFolderScanner.cs @@ -25,6 +25,7 @@ public class SongFolderScanner : LocalFolderScanner, ISongFolderScanner private readonly IFileSystem _fileSystem; private readonly ILocalFileSystem _localFileSystem; private readonly ILocalMetadataProvider _localMetadataProvider; + private readonly IMetadataRepository _metadataRepository; private readonly ILogger _logger; private readonly IMediaItemRepository _mediaItemRepository; private readonly ISongRepository _songRepository; @@ -58,6 +59,7 @@ public class SongFolderScanner : LocalFolderScanner, ISongFolderScanner _fileSystem = fileSystem; _localFileSystem = localFileSystem; _localMetadataProvider = localMetadataProvider; + _metadataRepository = metadataRepository; _songRepository = songRepository; _libraryRepository = libraryRepository; _mediaItemRepository = mediaItemRepository; @@ -263,7 +265,7 @@ public class SongFolderScanner : LocalFolderScanner, ISongFolderScanner if (shouldUpdate) { - song.SongMetadata ??= new List(); + song.SongMetadata ??= []; _logger.LogDebug("Refreshing {Attribute} for {Path}", "Metadata", path); if (await _localMetadataProvider.RefreshTagMetadata(song)) @@ -302,23 +304,28 @@ public class SongFolderScanner : LocalFolderScanner, ISongFolderScanner } Song song = result.Item; - Option maybeThumbnail = LocateThumbnail(song); - if (maybeThumbnail.IsNone) - { - await ExtractEmbeddedArtwork(song, ffmpegPath, cancellationToken); - } - - foreach (string thumbnailFile in maybeThumbnail) + foreach (SongMetadata metadata in song.SongMetadata.HeadOrNone()) { - SongMetadata metadata = song.SongMetadata.Head(); - await RefreshArtwork( - thumbnailFile, - metadata, - ArtworkKind.Thumbnail, - ffmpegPath, - None, - cancellationToken); + Option maybeThumbnail = LocateThumbnail(song); + if (maybeThumbnail.IsNone && !await ExtractEmbeddedArtwork(song, ffmpegPath, cancellationToken)) + { + if (metadata.Artwork.Any(a => a.ArtworkKind is ArtworkKind.Thumbnail)) + { + await _metadataRepository.RemoveArtworkWithKind(metadata, ArtworkKind.Thumbnail); + } + } + + foreach (string thumbnailFile in maybeThumbnail) + { + await RefreshArtwork( + thumbnailFile, + metadata, + ArtworkKind.Thumbnail, + ffmpegPath, + None, + cancellationToken); + } } return result; @@ -345,12 +352,12 @@ public class SongFolderScanner : LocalFolderScanner, ISongFolderScanner }).Flatten(); } - private async Task ExtractEmbeddedArtwork(Song song, string ffmpegPath, CancellationToken cancellationToken) + private async Task ExtractEmbeddedArtwork(Song song, string ffmpegPath, CancellationToken cancellationToken) { Option maybeArtworkStream = Optional(song.GetHeadVersion().Streams.Find(ms => ms.AttachedPic)); foreach (MediaStream artworkStream in maybeArtworkStream) { - await RefreshArtwork( + return await RefreshArtwork( song.GetHeadVersion().MediaFiles.Head().Path, song.SongMetadata.Head(), ArtworkKind.Thumbnail, @@ -358,5 +365,7 @@ public class SongFolderScanner : LocalFolderScanner, ISongFolderScanner artworkStream.Index, cancellationToken); } + + return false; } }