using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; using Jellyfin.Plugin.SRFPlay.Services; using MediaBrowser.Model.Tasks; using Microsoft.Extensions.Logging; namespace Jellyfin.Plugin.SRFPlay.ScheduledTasks; /// /// Scheduled task for checking and removing expired SRF Play content. /// public class ExpirationCheckTask : IScheduledTask { private readonly ILogger _logger; private readonly ContentExpirationService _expirationService; /// /// Initializes a new instance of the class. /// /// The logger instance. /// The content expiration service. public ExpirationCheckTask( ILogger logger, ContentExpirationService expirationService) { _logger = logger; _expirationService = expirationService; } /// public string Name => "Check SRF Play Content Expiration"; /// public string Description => "Checks for expired SRF Play content and removes it from the library"; /// public string Category => "SRF Play"; /// public string Key => "SRFPlayExpirationCheck"; /// public async Task ExecuteAsync(IProgress progress, CancellationToken cancellationToken) { _logger.LogInformation("Starting SRF Play expiration check task"); progress?.Report(0); try { var config = Plugin.Instance?.Configuration; if (config == null) { _logger.LogWarning("Plugin configuration not available"); return; } // Get expiration statistics first progress?.Report(25); var (total, expired, expiringSoon) = await _expirationService.GetExpirationStatisticsAsync(cancellationToken).ConfigureAwait(false); _logger.LogInformation( "Expiration statistics - Total: {Total}, Expired: {Expired}, Expiring Soon: {ExpiringSoon}", total, expired, expiringSoon); if (expired == 0) { _logger.LogInformation("No expired content found"); progress?.Report(100); return; } // Remove expired content progress?.Report(50); var removedCount = await _expirationService.CheckAndRemoveExpiredContentAsync(cancellationToken).ConfigureAwait(false); progress?.Report(100); _logger.LogInformation("SRF Play expiration check task completed. Removed {Count} expired items", removedCount); } catch (Exception ex) { _logger.LogError(ex, "Error during SRF Play expiration check task"); throw; } } /// public IEnumerable GetDefaultTriggers() { var config = Plugin.Instance?.Configuration; var intervalHours = config?.ExpirationCheckIntervalHours ?? 24; // Run daily at 3 AM or every X hours as configured return new[] { new TaskTriggerInfo { Type = TaskTriggerInfo.TriggerDaily, TimeOfDayTicks = TimeSpan.FromHours(3).Ticks }, new TaskTriggerInfo { Type = TaskTriggerInfo.TriggerInterval, IntervalTicks = TimeSpan.FromHours(intervalHours).Ticks } }; } }