7 Commits

6 changed files with 66 additions and 49 deletions

View File

@@ -1,5 +1,5 @@
<Project> <Project>
<PropertyGroup> <PropertyGroup>
<AssemblyVersion>0.0.0.8</AssemblyVersion> <AssemblyVersion>0.0.0.9</AssemblyVersion>
</PropertyGroup> </PropertyGroup>
</Project> </Project>

View File

@@ -39,10 +39,13 @@ public class LoggingHelper
_logger.LogInformation("-------------------------------------------------"); _logger.LogInformation("-------------------------------------------------");
} }
public void EndOfScanningForSeries(BaseItem item) public void PrintDebugEndOfScanningForSeries(BaseItem item)
{ {
_logger.LogInformation("End of scanning for series: {Series}", item); if (Configuration.DebugMode)
_logger.LogInformation("-------------------------------------------------"); {
_logger.LogInformation("End of scanning for series: {Series}", item);
_logger.LogInformation("-------------------------------------------------");
}
} }
@@ -60,12 +63,12 @@ public class LoggingHelper
_logger.LogInformation("-------------------------------------------------"); _logger.LogInformation("-------------------------------------------------");
} }
public void PrintStaleItemsInformation(IReadOnlyCollection<BaseItem> staleItems) public void PrintItemsInformation(IReadOnlyCollection<BaseItem> items)
{ {
ArgumentNullException.ThrowIfNull(staleItems); ArgumentNullException.ThrowIfNull(items);
_logger.LogInformation("Total stale items: {ItemCount}", staleItems.Count); _logger.LogInformation("Total items: {ItemCount}", items.Count);
_logger.LogInformation("Stale items found: {AllItems}", staleItems); _logger.LogInformation("Stale items found: {AllItems}", items);
} }
public void PrintStaleMoviesInformation(IReadOnlyCollection<BaseItem> staleMovies) public void PrintStaleMoviesInformation(IReadOnlyCollection<BaseItem> staleMovies)
@@ -122,11 +125,11 @@ public class LoggingHelper
} }
} }
public void PrintDebugSeasonNumber(int seasonNumber) public void PrintDebugSeasonInfo()
{ {
if (Configuration.DebugMode) if (Configuration.DebugMode)
{ {
_logger.LogInformation("Season {SeasonNumber} debug information:", [seasonNumber]); _logger.LogInformation("Season debug information:");
} }
} }
@@ -146,13 +149,11 @@ public class LoggingHelper
} }
} }
public void PrintDebugNoUserDataAndOutsideCutoffEpisodeInfo(IReadOnlyCollection<BaseItem> episodes, int seasonNumber) public void PrintDebugEpisodeCreationInfo(IReadOnlyCollection<BaseItem> episodes)
{ {
ArgumentNullException.ThrowIfNull(episodes); ArgumentNullException.ThrowIfNull(episodes);
if(Configuration.DebugMode){ if(Configuration.DebugMode){
_logger.LogInformation("No user data, and creation date is outside of media cutoff, Season {SeasonNumber} is stale.", seasonNumber);
_logger.LogInformation("-------------------------------------------------"); _logger.LogInformation("-------------------------------------------------");
_logger.LogInformation("Episode creation dates:"); _logger.LogInformation("Episode creation dates:");
_logger.LogInformation("-------------------------------------------------"); _logger.LogInformation("-------------------------------------------------");

View File

@@ -22,9 +22,12 @@ public class MovieHelper
public bool IsMovieStale(BaseItem movie) public bool IsMovieStale(BaseItem movie)
{ {
_logger.LogInformation("-------------------------------------------------"); if (Configuration.DebugMode)
_logger.LogInformation("Start of scanning for movie: {Movie}", movie); {
_logger.LogInformation("-------------------------------------------------"); _logger.LogInformation("-------------------------------------------------");
_logger.LogInformation("Start of scanning for movie: {Movie}", movie);
_logger.LogInformation("-------------------------------------------------");
}
bool movieIsStale = false; bool movieIsStale = false;
@@ -33,7 +36,7 @@ public class MovieHelper
if (hasUserData) if (hasUserData)
{ {
var mostRecentUserData = movie.UserData.OrderByDescending(data => data.LastPlayedDate).Where(data => data.LastPlayedDate != null).First(); var mostRecentUserData = movie.UserData.OrderByDescending(data => data.LastPlayedDate).First(data => data.LastPlayedDate != null);
if (Configuration.DebugMode){ if (Configuration.DebugMode){
_logger.LogInformation("Most recent user data: {Movie}", movie); _logger.LogInformation("Most recent user data: {Movie}", movie);
@@ -63,10 +66,12 @@ public class MovieHelper
movieIsStale = true; movieIsStale = true;
} }
if (Configuration.DebugMode)
_logger.LogInformation("-------------------------------------------------"); {
_logger.LogInformation("End of scanning for movie: {Movie}", movie); _logger.LogInformation("-------------------------------------------------");
_logger.LogInformation("-------------------------------------------------"); _logger.LogInformation("End of scanning for movie: {Movie}", movie);
_logger.LogInformation("-------------------------------------------------");
}
return movieIsStale; return movieIsStale;
} }

View File

@@ -25,17 +25,24 @@ public class SeriesHelper
private static PluginConfiguration Configuration => private static PluginConfiguration Configuration =>
Plugin.Instance!.Configuration; Plugin.Instance!.Configuration;
public bool IsSeasonUserDataStale(IReadOnlyList<BaseItem> episodes, int seasonNumber) public bool IsSeasonUserDataStale(IReadOnlyList<BaseItem> episodes)
{ {
bool seasonIsStale = false; bool seasonIsStale = false;
List<BaseItem> staleEpisodes = [];
var episodesWithUserData = episodes.Where(episode => episode.UserData.Where(data => data.LastPlayedDate != null).ToList().Count > 0).ToList(); var episodesWithUserData = episodes.Where(episode => episode.UserData.Where(data => data.LastPlayedDate != null).ToList().Count > 0).ToList();
_loggingHelper.PrintDebugEpisodesWithUserData(episodesWithUserData); _loggingHelper.PrintDebugEpisodesWithUserData(episodesWithUserData);
foreach (var episode in episodesWithUserData) foreach (var episode in episodesWithUserData)
{ {
var mostRecentUserData = episode.UserData.OrderByDescending(data => data.LastPlayedDate).Where(data => data.LastPlayedDate != null).First(); 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){ if(Configuration.DebugMode){
_logger.LogInformation("User data for episode: {Episode}", episode); _logger.LogInformation("User data for episode: {Episode}", episode);
_logger.LogInformation("-------------------------------------------------"); _logger.LogInformation("-------------------------------------------------");
@@ -45,15 +52,30 @@ public class SeriesHelper
} }
_logger.LogInformation("-------------------------------------------------"); _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; return seasonIsStale;

View File

@@ -70,7 +70,7 @@ public sealed class StaleMediaTask : IScheduledTask
List<BaseItem> allItems = [.. _libraryManager.GetItemsResult(query).Items]; List<BaseItem> allItems = [.. _libraryManager.GetItemsResult(query).Items];
_loggingHelper.PrintStaleItemsInformation(allItems); _loggingHelper.PrintItemsInformation(allItems);
List<BaseItem> series = [.. allItems.Where(item => item.GetBaseItemKind() == BaseItemKind.Series)]; List<BaseItem> series = [.. allItems.Where(item => item.GetBaseItemKind() == BaseItemKind.Series)];
List<BaseItem> movies = [.. allItems.Where(item => item.GetBaseItemKind() == BaseItemKind.Movie)]; List<BaseItem> movies = [.. allItems.Where(item => item.GetBaseItemKind() == BaseItemKind.Movie)];
@@ -112,8 +112,6 @@ public sealed class StaleMediaTask : IScheduledTask
_loggingHelper.PrintDebugDataForSeries(item); _loggingHelper.PrintDebugDataForSeries(item);
int seasonNumber = 1;
foreach (var season in seasons) foreach (var season in seasons)
{ {
// Gets each episode, to access user data. // Gets each episode, to access user data.
@@ -123,32 +121,23 @@ public sealed class StaleMediaTask : IScheduledTask
Recursive = false Recursive = false
}); });
bool seasonCreatedOutsideCutoff = episodes.All(episode => episode.DateCreated < DateTime.Now.AddDays(-Configuration.StaleMediaCutoff)); _loggingHelper.PrintDebugSeasonInfo();
_loggingHelper.PrintDebugSeasonNumber(seasonNumber);
if (seasonCreatedOutsideCutoff)
{
_loggingHelper.PrintDebugSeasonCreatedOutsideCutoff();
}
bool seasonHasUserData = episodes.Any(episode => episode.UserData.Count > 0); bool seasonHasUserData = episodes.Any(episode => episode.UserData.Count > 0);
bool seasonIsStale = (seasonHasUserData && _seriesHelper.IsSeasonUserDataStale(episodes, seasonNumber)) || seasonCreatedOutsideCutoff; bool seasonIsStale = seasonHasUserData && _seriesHelper.IsSeasonUserDataStale(episodes);
bool noUserDataAndOutsideCutoff = !seasonHasUserData && seasonCreatedOutsideCutoff;
if (seasonIsStale) if (seasonIsStale)
{ {
if (noUserDataAndOutsideCutoff) if (!seasonHasUserData)
{ {
_loggingHelper.PrintDebugNoUserDataAndOutsideCutoffEpisodeInfo(episodes, seasonNumber); _loggingHelper.PrintDebugEpisodeCreationInfo(episodes);
} }
staleEpisodes.AddRange(episodes); staleEpisodes.AddRange(episodes);
} }
seasonNumber++;
} }
_loggingHelper.EndOfScanningForSeries(item); _loggingHelper.PrintDebugEndOfScanningForSeries(item);
return staleEpisodes; return staleEpisodes;
} }

View File

@@ -1,9 +1,9 @@
The idea behind this plugin is to have an easy way to run a task to find all movies and shows in your media collection that users haven't viewed in a number of cutoff days. The idea behind this plugin is to have an easy way to run a task to find all movies and shows in your media collection that users haven't viewed in a number of cutoff days.
At the time of writing, the plugin is only capable of logging movies and shows that are stale (Unwatched for 90 days) by running a scheduled task. You will need to view your logs to know the number of stale files. At the time of writing, the plugin is only capable of logging movies and shows that are stale (Unwatched for a user set number of days) by running a scheduled task. You will need to view your logs to know the number of stale files and the names of said files.
Planned features: Planned features:
- Better logging to show more than just the count. - Better logging to show more than just the count.
- A page that shows what media is currently flagged for removal. And a button to confirm removal. - A page that shows what media is currently flagged for removal. And a button to confirm removal.
- Integration with sonarr and radarr apis to delete your media. - Integration with sonarr and radarr apis to delete your media.
- Whitelist for shows to ignore. (Seasonal shows) - Whitelist for shows to ignore. (Seasonal shows)