diff --git a/Jellyfin.Plugin.MediaCleaner/Helpers/LoggingHelper.cs b/Jellyfin.Plugin.MediaCleaner/Helpers/LoggingHelper.cs index 06be3e7..9b8dbaa 100644 --- a/Jellyfin.Plugin.MediaCleaner/Helpers/LoggingHelper.cs +++ b/Jellyfin.Plugin.MediaCleaner/Helpers/LoggingHelper.cs @@ -125,11 +125,11 @@ public class LoggingHelper } } - public void PrintDebugSeasonNumber(int seasonNumber) + public void PrintDebugSeasonInfo() { if (Configuration.DebugMode) { - _logger.LogInformation("Season {SeasonNumber} debug information:", [seasonNumber]); + _logger.LogInformation("Season debug information:"); } } @@ -149,12 +149,12 @@ public class LoggingHelper } } - public void PrintDebugNoUserDataAndOutsideCutoffEpisodeInfo(IReadOnlyCollection episodes, int seasonNumber) + public void PrintDebugNoUserDataAndOutsideCutoffEpisodeInfo(IReadOnlyCollection episodes) { ArgumentNullException.ThrowIfNull(episodes); if(Configuration.DebugMode){ - _logger.LogInformation("No user data, and creation date is outside of media cutoff, Season {SeasonNumber} is stale.", seasonNumber); + _logger.LogInformation("No user data, and creation date is outside of media cutoff, Season is stale."); _logger.LogInformation("-------------------------------------------------"); _logger.LogInformation("Episode creation dates:"); diff --git a/Jellyfin.Plugin.MediaCleaner/Helpers/SeriesHelper.cs b/Jellyfin.Plugin.MediaCleaner/Helpers/SeriesHelper.cs index 5d83dbc..f53630b 100644 --- a/Jellyfin.Plugin.MediaCleaner/Helpers/SeriesHelper.cs +++ b/Jellyfin.Plugin.MediaCleaner/Helpers/SeriesHelper.cs @@ -25,17 +25,24 @@ public class SeriesHelper private static PluginConfiguration Configuration => Plugin.Instance!.Configuration; - public bool IsSeasonUserDataStale(IReadOnlyList episodes, int seasonNumber) + public bool IsSeasonUserDataStale(IReadOnlyList episodes) { bool seasonIsStale = false; + List staleEpisodes = []; + var episodesWithUserData = episodes.Where(episode => episode.UserData.Where(data => data.LastPlayedDate != null).ToList().Count > 0).ToList(); _loggingHelper.PrintDebugEpisodesWithUserData(episodesWithUserData); foreach (var episode in episodesWithUserData) { + bool episodeIsStale = false; + var mostRecentUserData = episode.UserData.OrderByDescending(data => data.LastPlayedDate).First(data => data.LastPlayedDate != null); + var staleLastPlayedDate = mostRecentUserData.LastPlayedDate < DateTime.Now.AddDays(-Configuration.StaleMediaCutoff); + var staleCreationDate = episode.DateCreated < DateTime.Now.AddDays(-Configuration.StaleMediaCutoff); + if(Configuration.DebugMode){ _logger.LogInformation("User data for episode: {Episode}", episode); _logger.LogInformation("-------------------------------------------------"); @@ -45,15 +52,30 @@ public class SeriesHelper } _logger.LogInformation("-------------------------------------------------"); } - if (mostRecentUserData.LastPlayedDate < DateTime.Now.AddDays(-Configuration.StaleMediaCutoff)) - { - if(Configuration.DebugMode){ - _logger.LogInformation("Most recent user data has a last played date of: {LastPlayedDate}. Therefore all episodes are stale. Adding Season {SeasonNumber} to stale list.", [mostRecentUserData.LastPlayedDate, seasonNumber]); - _logger.LogInformation("-------------------------------------------------"); - } - seasonIsStale = true; + if (staleLastPlayedDate && staleCreationDate) + { + episodeIsStale = true; + if(Configuration.DebugMode){ + _logger.LogInformation("Most recent user data has a last played date of: {LastPlayedDate}.", [mostRecentUserData.LastPlayedDate]); + _logger.LogInformation("And episode created {DateCreated}.", episode.DateCreated); + } } + + if (episodeIsStale) + { + staleEpisodes.Add(episode); + if(Configuration.DebugMode){ + _logger.LogInformation("Episode is stale."); + } + } + } + + if(staleEpisodes.Count == episodes.Count) + { + seasonIsStale = true; + _logger.LogInformation("Stale episodes count matches all episode count. Season is stale."); + _logger.LogInformation("-------------------------------------------------"); } return seasonIsStale; diff --git a/Jellyfin.Plugin.MediaCleaner/ScheduledTasks/StaleMediaTask.cs b/Jellyfin.Plugin.MediaCleaner/ScheduledTasks/StaleMediaTask.cs index 99c2269..a769c83 100644 --- a/Jellyfin.Plugin.MediaCleaner/ScheduledTasks/StaleMediaTask.cs +++ b/Jellyfin.Plugin.MediaCleaner/ScheduledTasks/StaleMediaTask.cs @@ -112,8 +112,6 @@ public sealed class StaleMediaTask : IScheduledTask _loggingHelper.PrintDebugDataForSeries(item); - int seasonNumber = 1; - foreach (var season in seasons) { // Gets each episode, to access user data. @@ -125,7 +123,7 @@ public sealed class StaleMediaTask : IScheduledTask bool seasonCreatedOutsideCutoff = episodes.All(episode => episode.DateCreated < DateTime.Now.AddDays(-Configuration.StaleMediaCutoff)); - _loggingHelper.PrintDebugSeasonNumber(seasonNumber); + _loggingHelper.PrintDebugSeasonInfo(); if (seasonCreatedOutsideCutoff) { @@ -133,19 +131,18 @@ public sealed class StaleMediaTask : IScheduledTask } bool seasonHasUserData = episodes.Any(episode => episode.UserData.Count > 0); - bool seasonIsStale = (seasonHasUserData && _seriesHelper.IsSeasonUserDataStale(episodes, seasonNumber)) || seasonCreatedOutsideCutoff; + bool seasonIsStale = (seasonHasUserData && _seriesHelper.IsSeasonUserDataStale(episodes)) || seasonCreatedOutsideCutoff; bool noUserDataAndOutsideCutoff = !seasonHasUserData && seasonCreatedOutsideCutoff; if (seasonIsStale) { if (noUserDataAndOutsideCutoff) { - _loggingHelper.PrintDebugNoUserDataAndOutsideCutoffEpisodeInfo(episodes, seasonNumber); + _loggingHelper.PrintDebugNoUserDataAndOutsideCutoffEpisodeInfo(episodes); } staleEpisodes.AddRange(episodes); } - seasonNumber++; } _loggingHelper.PrintDebugEndOfScanningForSeries(item);