using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; using Jellyfin.Plugin.SRFPlay.Services.Interfaces; using MediaBrowser.Model.Tasks; using Microsoft.Extensions.Logging; namespace Jellyfin.Plugin.SRFPlay.ScheduledTasks; /// /// Scheduled task that clears stale SRF Play resume points from "Continue Watching". /// public class ResumeCleanupTask : IScheduledTask { private readonly ILogger _logger; private readonly IResumeCleanupService _resumeCleanupService; /// /// Initializes a new instance of the class. /// /// The logger. /// The resume cleanup service. public ResumeCleanupTask( ILogger logger, IResumeCleanupService resumeCleanupService) { _logger = logger; _resumeCleanupService = resumeCleanupService; } /// public string Name => "Clean Up SRF Play Continue Watching"; /// public string Description => "Removes stale SRF Play resume points - ended livestreams, abandoned playback and finished programmes - from every user's Continue Watching row"; /// public string Category => "SRF Play"; /// public string Key => "SRFPlayResumeCleanup"; /// public Task ExecuteAsync(IProgress progress, CancellationToken cancellationToken) { _logger.LogInformation("Starting SRF Play Continue Watching cleanup"); progress?.Report(0); try { var result = _resumeCleanupService.Cleanup(false, cancellationToken); progress?.Report(100); _logger.LogInformation( "SRF Play Continue Watching cleanup completed. Cleared {Cleared} of {Inspected} resume points", result.Cleared, result.Inspected); } catch (OperationCanceledException) { _logger.LogInformation("SRF Play Continue Watching cleanup was cancelled"); throw; } catch (Exception ex) { _logger.LogError(ex, "Error during SRF Play Continue Watching cleanup"); throw; } return Task.CompletedTask; } /// public IEnumerable GetDefaultTriggers() { // Runs after the 3 AM expiration check so items deleted there are already gone. return new[] { new TaskTriggerInfo { Type = TaskTriggerInfo.TriggerDaily, TimeOfDayTicks = TimeSpan.FromHours(4).Ticks } }; } }