Updated Days unwatched to stale media cutoff for clearer messaging. Also improved logging to tell you the names of the movies and series that are flagged as stale

This commit is contained in:
2025-11-29 09:13:51 -07:00
parent 489bda9dda
commit 875ffb9550
2 changed files with 40 additions and 8 deletions

View File

@@ -20,9 +20,9 @@
<div class="fieldDescription">The api key used by your sonarr instance</div> <div class="fieldDescription">The api key used by your sonarr instance</div>
</div> </div>
<div class="inputContainer"> <div class="inputContainer">
<label class="inputLabel inputLabelUnfocused" for="DaysUnwatched">Days Unwatched</label> <label class="inputLabel inputLabelUnfocused" for="StaleMediaCutoff">Stale Media Cutoff</label>
<input id="DaysUnwatched" name="DaysUnwatched" type="number" is="emby-input" style="width: 20%;"/> <input id="StaleMediaCutoff" name="StaleMediaCutoff" type="number" is="emby-input" style="width: 20%;"/>
<div class="fieldDescription">How many days to wait before deleting unwatched media</div> <div class="fieldDescription">How many days to wait before marking files as stale</div>
</div> </div>
<!-- <div class="selectContainer"> <!-- <div class="selectContainer">
<label class="selectLabel" for="Options">Several Options</label> <label class="selectLabel" for="Options">Several Options</label>
@@ -70,7 +70,7 @@
// document.querySelector('#AString').value = config.AString; // document.querySelector('#AString').value = config.AString;
document.querySelector('#RadarrAPIKey').value = config.RadarrAPIKey; document.querySelector('#RadarrAPIKey').value = config.RadarrAPIKey;
document.querySelector('#SonarrAPIKey').value = config.SonarrAPIKey; document.querySelector('#SonarrAPIKey').value = config.SonarrAPIKey;
document.querySelector('#DaysUnwatched').value = config.DaysUnwatched; document.querySelector('#StaleMediaCutoff').value = config.StaleMediaCutoff;
Dashboard.hideLoadingMsg(); Dashboard.hideLoadingMsg();
}); });
}); });
@@ -85,7 +85,7 @@
// config.AString = document.querySelector('#AString').value; // config.AString = document.querySelector('#AString').value;
config.RadarrAPIKey = document.querySelector('#RadarrAPIKey').value; config.RadarrAPIKey = document.querySelector('#RadarrAPIKey').value;
config.SonarrAPIKey = document.querySelector('#SonarrAPIKey').value; config.SonarrAPIKey = document.querySelector('#SonarrAPIKey').value;
config.DaysUnwatched = document.querySelector('#DaysUnwatched').value; config.StaleMediaCutoff = document.querySelector('#StaleMediaCutoff').value;
ApiClient.updatePluginConfiguration(MediaCleanerConfig.pluginUniqueId, config).then(function (result) { ApiClient.updatePluginConfiguration(MediaCleanerConfig.pluginUniqueId, config).then(function (result) {
Dashboard.processPluginConfigurationUpdateResult(result); Dashboard.processPluginConfigurationUpdateResult(result);
}); });

View File

@@ -61,14 +61,25 @@ public sealed class StaleMediaTask : IScheduledTask
_logger.LogInformation("Total items found: {AllItems}", allItems); _logger.LogInformation("Total items found: {AllItems}", allItems);
List<BaseItem> shows = [.. 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 && item.UserData.Count > 0)]; List<BaseItem> movies = [.. allItems.Where(item => item.GetBaseItemKind() == BaseItemKind.Movie && item.UserData.Count > 0)];
List<BaseItem> staleEpisodes = [.. shows.SelectMany(GetStaleEpisodes)]; List<BaseItem> staleEpisodes = [.. series.SelectMany(GetStaleEpisodes)];
List<BaseItem> staleMovies = [.. GetStaleMovies(movies)]; List<BaseItem> staleMovies = [.. GetStaleMovies(movies)];
_logger.LogInformation("Stale Movies found: {StaleMovies}", staleMovies.Count); _logger.LogInformation("Stale Movies found: {StaleMovies}", staleMovies.Count);
_logger.LogInformation("Stale Series found: {StaleShows}", staleEpisodes.Count); if (staleMovies.Count > 0)
{
_logger.LogInformation("Movies: {Names}", string.Join(", ", staleMovies.Select(movie => movie.Name)));
}
_logger.LogInformation("Stale Episodes found: {StaleEpisodes}", staleEpisodes.Count);
if (staleEpisodes.Count > 0)
{
// Firstly figure out the seasons, and then the Series to find the name.
List<string> seriesNames = FindDistinctSeriesNamesFromEpisodes(staleEpisodes);
_logger.LogInformation("Series: {Names}", string.Join(", ", seriesNames));
}
return Task.CompletedTask; return Task.CompletedTask;
} }
@@ -88,6 +99,27 @@ public sealed class StaleMediaTask : IScheduledTask
return staleMovies; return staleMovies;
} }
private List<string> FindDistinctSeriesNamesFromEpisodes(List<BaseItem> episodes)
{
Guid[] seasonIds = [.. episodes.Select(episode => episode.ParentId).Distinct()];
var seasons = _libraryManager.GetItemList(new InternalItemsQuery
{
ItemIds = seasonIds
});
Guid[] seriesIds = [.. seasons.Select(season => season.ParentId).Distinct()];
var series = _libraryManager.GetItemList(new InternalItemsQuery
{
ItemIds = seriesIds
});
List<string> seriesNames = [.. series.Select(series => series.Name).Distinct()];
return seriesNames;
}
private List<BaseItem> GetStaleEpisodes(BaseItem item) private List<BaseItem> GetStaleEpisodes(BaseItem item)
{ {
List<BaseItem> staleEpisodes = []; List<BaseItem> staleEpisodes = [];