#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; } }