Browse Source

Fix refreshing the library cannot delete old attachments (#14461)

Nyanmisaka 2 days ago
parent
commit
25a362345d

+ 9 - 1
Jellyfin.Server.Implementations/Item/MediaAttachmentRepository.cs

@@ -25,8 +25,16 @@ public class MediaAttachmentRepository(IDbContextFactory<JellyfinDbContext> dbPr
     {
     {
         using var context = dbProvider.CreateDbContext();
         using var context = dbProvider.CreateDbContext();
         using var transaction = context.Database.BeginTransaction();
         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.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();
         context.SaveChanges();
         transaction.Commit();
         transaction.Commit();
     }
     }

+ 1 - 4
MediaBrowser.Providers/MediaInfo/FFProbeVideoInfo.cs

@@ -276,10 +276,7 @@ namespace MediaBrowser.Providers.MediaInfo
 
 
             _mediaStreamRepository.SaveMediaStreams(video.Id, mediaStreams, cancellationToken);
             _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
             if (options.MetadataRefreshMode == MetadataRefreshMode.FullRefresh
                 || options.MetadataRefreshMode == MetadataRefreshMode.Default)
                 || options.MetadataRefreshMode == MetadataRefreshMode.Default)