diff --git a/Jellyfin.Plugin.MediaCleaner/ScheduledTasks/DeadUserDataTask.cs b/Jellyfin.Plugin.MediaCleaner/ScheduledTasks/DeadUserDataTask.cs new file mode 100644 index 0000000..5399e83 --- /dev/null +++ b/Jellyfin.Plugin.MediaCleaner/ScheduledTasks/DeadUserDataTask.cs @@ -0,0 +1,82 @@ +#pragma warning disable RS0030 // Do not use banned APIs + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Jellyfin.Database.Implementations; +using MediaBrowser.Model.Globalization; +using MediaBrowser.Model.Tasks; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Logging; + +namespace Jellyfin.Plugin.MediaCleaner.ScheduledTasks; + +/// +/// Task to clean up any detached userdata from the database. +/// +public class CleanupUserDataTask : IScheduledTask +{ + private readonly ILocalizationManager _localization; + private readonly IDbContextFactory _dbProvider; + private readonly ILogger _logger; + + /// + /// Initializes a new instance of the class. + /// + /// The localisation Provider. + /// The DB context factory. + /// A logger. + public CleanupUserDataTask(ILocalizationManager localization, IDbContextFactory dbProvider, ILogger logger) + { + _localization = localization; + _dbProvider = dbProvider; + _logger = logger; + } + + /// + public string Name => _localization.GetLocalizedString("CleanupUserDataTask"); + + public Guid PlaceholderId => new("00000000-0000-0000-0000-000000000001"); + + /// + public string Description => _localization.GetLocalizedString("CleanupUserDataTaskDescription"); + + /// + public string Category => _localization.GetLocalizedString("Media"); + + /// + public string Key => nameof(CleanupUserDataTask); + + /// + public async Task ExecuteAsync(IProgress progress, CancellationToken cancellationToken) + { + var dbContext = await _dbProvider.CreateDbContextAsync(cancellationToken).ConfigureAwait(false); + await using (dbContext.ConfigureAwait(false)) + { + var detachedUserData = dbContext.UserData.Where(e => e.ItemId == PlaceholderId).ToList(); + _logger.LogInformation("There are {NoDetached} detached UserData entries.", detachedUserData.Count); + foreach(var userData in detachedUserData) + { + if (userData.Item != null) + { + _logger.LogInformation("Detached user data for: {UserDataName}", userData.Item.Name); + } + else + { + _logger.LogInformation("Detached user data for: {UserDataName}", userData); + } + } + _logger.LogInformation("Detached user data count: {Count}.", detachedUserData.Count); + + // await detachedUserData.ExecuteDeleteAsync(cancellationToken).ConfigureAwait(false); + } + } + + /// + public IEnumerable GetDefaultTriggers() + { + yield break; + } +}