From 25a362345d17d16cfe63fe51b64e6aeed3a5a76e Mon Sep 17 00:00:00 2001 From: Nyanmisaka Date: Tue, 15 Jul 2025 08:40:37 +0800 Subject: [PATCH] Fix refreshing the library cannot delete old attachments (#14461) --- .../Item/MediaAttachmentRepository.cs | 10 +++++++++- MediaBrowser.Providers/MediaInfo/FFProbeVideoInfo.cs | 5 +---- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/Jellyfin.Server.Implementations/Item/MediaAttachmentRepository.cs b/Jellyfin.Server.Implementations/Item/MediaAttachmentRepository.cs index 3ae6dbd702..e75dda4392 100644 --- a/Jellyfin.Server.Implementations/Item/MediaAttachmentRepository.cs +++ b/Jellyfin.Server.Implementations/Item/MediaAttachmentRepository.cs @@ -25,8 +25,16 @@ public class MediaAttachmentRepository(IDbContextFactory dbPr { using var context = dbProvider.CreateDbContext(); using var transaction = context.Database.BeginTransaction(); + + // Users may replace a media with a version that includes attachments to one without them. + // So when saving attachments is triggered by a library scan, we always unconditionally + // clear the old ones, and then add the new ones if given. context.AttachmentStreamInfos.Where(e => e.ItemId.Equals(id)).ExecuteDelete(); - context.AttachmentStreamInfos.AddRange(attachments.Select(e => Map(e, id))); + if (attachments.Any()) + { + context.AttachmentStreamInfos.AddRange(attachments.Select(e => Map(e, id))); + } + context.SaveChanges(); transaction.Commit(); } diff --git a/MediaBrowser.Providers/MediaInfo/FFProbeVideoInfo.cs b/MediaBrowser.Providers/MediaInfo/FFProbeVideoInfo.cs index 1540e7552d..bdb6b93beb 100644 --- a/MediaBrowser.Providers/MediaInfo/FFProbeVideoInfo.cs +++ b/MediaBrowser.Providers/MediaInfo/FFProbeVideoInfo.cs @@ -276,10 +276,7 @@ namespace MediaBrowser.Providers.MediaInfo _mediaStreamRepository.SaveMediaStreams(video.Id, mediaStreams, cancellationToken); - if (mediaAttachments.Any()) - { - _mediaAttachmentRepository.SaveMediaAttachments(video.Id, mediaAttachments, cancellationToken); - } + _mediaAttachmentRepository.SaveMediaAttachments(video.Id, mediaAttachments, cancellationToken); if (options.MetadataRefreshMode == MetadataRefreshMode.FullRefresh || options.MetadataRefreshMode == MetadataRefreshMode.Default)