aboutsummaryrefslogtreecommitdiff
path: root/Jellyfin.Server
diff options
context:
space:
mode:
authorTim Eisele <Ghost_of_Stone@web.de>2026-05-12 18:12:54 +0200
committerGitHub <noreply@github.com>2026-05-12 18:12:54 +0200
commita9865367d8aec1bd323680a3440427dfaac2a89b (patch)
tree20298346d9c6ddd43c83f7d4f5463a822f71ce15 /Jellyfin.Server
parentc169184e019d224a60fcbb9125b05de607f42799 (diff)
Safeguard against invalid GUIDs (#16813)
Safeguard against invalid GUIDs
Diffstat (limited to 'Jellyfin.Server')
-rw-r--r--Jellyfin.Server/Migrations/Routines/MigrateLinkedChildren.cs42
-rw-r--r--Jellyfin.Server/Migrations/Routines/MoveExtractedFiles.cs10
2 files changed, 44 insertions, 8 deletions
diff --git a/Jellyfin.Server/Migrations/Routines/MigrateLinkedChildren.cs b/Jellyfin.Server/Migrations/Routines/MigrateLinkedChildren.cs
index 14ae535531..74f03f5107 100644
--- a/Jellyfin.Server/Migrations/Routines/MigrateLinkedChildren.cs
+++ b/Jellyfin.Server/Migrations/Routines/MigrateLinkedChildren.cs
@@ -7,6 +7,7 @@ using Jellyfin.Database.Implementations;
using Jellyfin.Database.Implementations.Entities;
using Jellyfin.Extensions;
using MediaBrowser.Controller;
+using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Library;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging;
@@ -283,9 +284,9 @@ internal class MigrateLinkedChildren : IDatabaseMigrationRoutine
.Select(id => _libraryManager.GetItemById(id))
.Where(item => item is not null)
.ToList();
- _libraryManager.DeleteItemsUnsafeFast(itemsToDelete!);
+ var deleted = DeleteItems(itemsToDelete!);
- _logger.LogInformation("Removed {Count} wrong-type alternate version items. They will be recreated with the correct type on next library scan.", itemsToDelete.Count);
+ _logger.LogInformation("Removed {Count} wrong-type alternate version items. They will be recreated with the correct type on next library scan.", deleted);
}
private void CleanupOrphanedAlternateVersionBaseItems(JellyfinDbContext context)
@@ -314,9 +315,9 @@ internal class MigrateLinkedChildren : IDatabaseMigrationRoutine
.Select(id => _libraryManager.GetItemById(id))
.Where(item => item is not null)
.ToList();
- _libraryManager.DeleteItemsUnsafeFast(itemsToDelete!);
+ var deleted = DeleteItems(itemsToDelete!);
- _logger.LogInformation("Removed {Count} orphaned alternate version BaseItems.", itemsToDelete.Count);
+ _logger.LogInformation("Removed {Count} orphaned alternate version BaseItems.", deleted);
}
private void CleanupItemsFromDeletedLibraries(JellyfinDbContext context)
@@ -343,9 +344,9 @@ internal class MigrateLinkedChildren : IDatabaseMigrationRoutine
.Select(id => _libraryManager.GetItemById(id))
.Where(item => item is not null)
.ToList();
- _libraryManager.DeleteItemsUnsafeFast(itemsToDelete!);
+ var deleted = DeleteItems(itemsToDelete!);
- _logger.LogInformation("Removed {Count} items from deleted libraries.", itemsToDelete.Count);
+ _logger.LogInformation("Removed {Count} items from deleted libraries.", deleted);
}
private void CleanupStaleFileEntries(JellyfinDbContext context)
@@ -431,9 +432,34 @@ internal class MigrateLinkedChildren : IDatabaseMigrationRoutine
.Select(id => _libraryManager.GetItemById(id))
.Where(item => item is not null)
.ToList();
- _libraryManager.DeleteItemsUnsafeFast(itemsToDelete!);
+ var deleted = DeleteItems(itemsToDelete!);
- _logger.LogInformation("Removed {Count} stale items.", itemsToDelete.Count);
+ _logger.LogInformation("Removed {Count} stale items.", deleted);
+ }
+
+ private int DeleteItems(IReadOnlyCollection<BaseItem> items)
+ {
+ if (items.Count == 0)
+ {
+ return 0;
+ }
+
+ var options = new DeleteOptions { DeleteFileLocation = false, DeleteFromExternalProvider = false };
+ var deleted = 0;
+ foreach (var item in items)
+ {
+ try
+ {
+ _libraryManager.DeleteItem(item, options);
+ deleted++;
+ }
+ catch (Exception ex)
+ {
+ _logger.LogWarning(ex, "Skipping item {ItemId} ({ItemName}): delete failed.", item.Id, item.Name ?? "Unknown");
+ }
+ }
+
+ return deleted;
}
private void CleanupOrphanedLinkedChildren(JellyfinDbContext context)
diff --git a/Jellyfin.Server/Migrations/Routines/MoveExtractedFiles.cs b/Jellyfin.Server/Migrations/Routines/MoveExtractedFiles.cs
index fbf9c16377..cfc1628782 100644
--- a/Jellyfin.Server/Migrations/Routines/MoveExtractedFiles.cs
+++ b/Jellyfin.Server/Migrations/Routines/MoveExtractedFiles.cs
@@ -144,6 +144,11 @@ public class MoveExtractedFiles : IAsyncMigrationRoutine
}
var newSubtitleCachePath = _pathManager.GetSubtitlePath(itemIdString, mediaStreamIndex, extension);
+ if (newSubtitleCachePath is null)
+ {
+ continue;
+ }
+
if (File.Exists(newSubtitleCachePath))
{
File.Delete(oldSubtitleCachePath);
@@ -182,6 +187,11 @@ public class MoveExtractedFiles : IAsyncMigrationRoutine
}
var newAttachmentPath = _pathManager.GetAttachmentPath(itemIdString, attachment.Filename ?? attachmentIndex.ToString(CultureInfo.InvariantCulture));
+ if (newAttachmentPath is null)
+ {
+ continue;
+ }
+
if (File.Exists(newAttachmentPath))
{
File.Delete(oldAttachmentPath);