diff options
| author | Bond-009 <bond.009@outlook.com> | 2026-05-06 20:49:19 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-05-06 20:49:19 +0200 |
| commit | 33ed52b8ee25e1fae4763a26337b838dc9782b26 (patch) | |
| tree | ee68da202f604eef267254ea8c689965098b1c3e /Emby.Server.Implementations/Data/CleanDatabaseScheduledTask.cs | |
| parent | aa96ff42e616ecf5638a8f1e2e8459b94513c528 (diff) | |
| parent | d1ab428476f961426841a0561036c59c3b93878e (diff) | |
Merge branch 'master' into feature/season-provider-id-from-path
Diffstat (limited to 'Emby.Server.Implementations/Data/CleanDatabaseScheduledTask.cs')
| -rw-r--r-- | Emby.Server.Implementations/Data/CleanDatabaseScheduledTask.cs | 36 |
1 files changed, 35 insertions, 1 deletions
diff --git a/Emby.Server.Implementations/Data/CleanDatabaseScheduledTask.cs b/Emby.Server.Implementations/Data/CleanDatabaseScheduledTask.cs index 676bb7f816..17355960c3 100644 --- a/Emby.Server.Implementations/Data/CleanDatabaseScheduledTask.cs +++ b/Emby.Server.Implementations/Data/CleanDatabaseScheduledTask.cs @@ -5,10 +5,12 @@ using System.IO; using System.Linq; using System.Threading; using System.Threading.Tasks; +using Jellyfin.Data.Enums; using Jellyfin.Database.Implementations; using MediaBrowser.Controller.Entities; using MediaBrowser.Controller.IO; using MediaBrowser.Controller.Library; +using MediaBrowser.Controller.Playlists; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging; @@ -35,7 +37,11 @@ public class CleanDatabaseScheduledTask : ILibraryPostScanTask public async Task Run(IProgress<double> progress, CancellationToken cancellationToken) { - await CleanDeadItems(cancellationToken, progress).ConfigureAwait(false); + var deadItemsProgress = new Progress<double>(val => progress.Report(val * 0.8)); + await CleanDeadItems(cancellationToken, deadItemsProgress).ConfigureAwait(false); + + var playlistProgress = new Progress<double>(val => progress.Report(80 + (val * 0.2))); + await CleanOrphanedFilePlaylistsAsync(cancellationToken, playlistProgress).ConfigureAwait(false); } private async Task CleanDeadItems(CancellationToken cancellationToken, IProgress<double> progress) @@ -116,4 +122,32 @@ public class CleanDatabaseScheduledTask : ILibraryPostScanTask progress.Report(100); } + + private async Task CleanOrphanedFilePlaylistsAsync(CancellationToken cancellationToken, IProgress<double> progress) + { + var playlists = _libraryManager.GetItemList(new InternalItemsQuery + { + IncludeItemTypes = [BaseItemKind.Playlist], + Recursive = true + }).OfType<Playlist>().ToList(); + + var numComplete = 0; + var numItems = Math.Max(playlists.Count, 1); + + foreach (var playlist in playlists) + { + cancellationToken.ThrowIfCancellationRequested(); + + if (playlist.IsFile && !File.Exists(playlist.Path)) + { + _logger.LogInformation("Removing file-based playlist {Name} because source file {Path} no longer exists", playlist.Name, playlist.Path); + _libraryManager.DeleteItem(playlist, new DeleteOptions { DeleteFileLocation = false }); + } + + numComplete++; + progress.Report((double)numComplete / numItems * 100); + } + + progress.Report(100); + } } |
