diff --git a/MediaCleaner/Filtering/SeriesFilter.cs b/MediaCleaner/Filtering/SeriesFilter.cs index 32f92a8..1b91654 100644 --- a/MediaCleaner/Filtering/SeriesFilter.cs +++ b/MediaCleaner/Filtering/SeriesFilter.cs @@ -29,13 +29,13 @@ public List Apply(List items) var seasons = items.GroupBy(x => ((Episode)x.Item).Season?.Id ?? ((Episode)x.Item).Series?.Id); foreach (var season in seasons) { - var first = season.MaxBy(x => x.Data?.First().LastPlayedDate ?? x.Item.DateCreated); + var first = season.MaxBy(x => x.Data?.First()?.LastPlayedDate ?? x.Item.DateCreated); if (first?.Item is not Episode episode) continue; var episodes = episode.Season.GetEpisodes().Where(x => !x.IsVirtualItem).ToList(); var allWatched = season.Count() == episodes.Count && season.All(value => episodes.Contains(value.Item)); _logger.LogDebug("\"{Username}\" has watched episodes {Count} of {Total} in season \"{SeriesName}\": \"{SeasonName}\"", - season.First().Data?.First().User.Username ?? "[None]", season.Count(), episodes.Count, episode.Series.Name, episode.Season.Name); + season.First().Data?.First()?.User.Username ?? "[None]", season.Count(), episodes.Count, episode.Series.Name, episode.Season.Name); if (allWatched) { @@ -57,13 +57,13 @@ public List Apply(List items) var series = items.GroupBy(x => ((Episode)x.Item).Series?.Id); foreach (var show in series) { - var first = show.MaxBy(x => x.Data?.First().LastPlayedDate ?? x.Item.DateCreated); + var first = show.MaxBy(x => x.Data?.First()?.LastPlayedDate ?? x.Item.DateCreated); if (first?.Item is not Episode episode) continue; var episodes = episode.Series.GetEpisodes().Where(x => !x.IsVirtualItem).ToList(); var allWatched = show.Count() == episodes.Count && show.All(value => episodes.Contains(value.Item)); _logger.LogDebug("\"{Username}\" has watched episodes {Count} of {Total} in series \"{SeriesName}\"'", - show.First().Data?.First().User.Username ?? "[None]", show.Count(), episodes.Count, episode.Series.Name); + show.First().Data?.First()?.User.Username ?? "[None]", show.Count(), episodes.Count, episode.Series.Name); if (allWatched) { diff --git a/MediaCleaner/MediaCleaner.csproj b/MediaCleaner/MediaCleaner.csproj index ef9c612..450613f 100644 --- a/MediaCleaner/MediaCleaner.csproj +++ b/MediaCleaner/MediaCleaner.csproj @@ -4,8 +4,8 @@ net6.0 enable MediaCleaner - 2.12.0.0 - 2.12.0.0 + 2.13.0.0 + 2.13.0.0 diff --git a/MediaCleaner/MediaCleanupTask.cs b/MediaCleaner/MediaCleanupTask.cs index 3e41de0..cfab1d6 100644 --- a/MediaCleaner/MediaCleanupTask.cs +++ b/MediaCleaner/MediaCleanupTask.cs @@ -199,7 +199,14 @@ public async Task ExecuteAsync(IProgress progress, CancellationToken can } } - DeleteItem(item.Item); + try + { + DeleteItem(item.Item); + } + catch (Exception ex) + { + _logger.LogError(ex, "Error deleting item: {name}", item.FullName); + } } expiredNotPlayed = expiredNotPlayed.OrderBy(x => x.Item.DateCreated).ToList(); @@ -213,7 +220,14 @@ public async Task ExecuteAsync(IProgress progress, CancellationToken can await CreateNotification(item); - DeleteItem(item.Item); + try + { + DeleteItem(item.Item); + } + catch (Exception ex) + { + _logger.LogError(ex, "Error deleting item: {name}", item.FullName); + } } progress.Report(100); @@ -500,37 +514,67 @@ private async Task CreateNotification(ExpiredItem item) { case Movie movie: title = $"\"{movie.Name}\" was deleted"; - shortOverview = $"Last played by {item.Data.First().User.Username} at {item.Data.First().LastPlayedDate}"; + shortOverview = item.Kind switch + { + ExpiredKind.Played => $"Last played by {item.Data.First().User.Username} at {item.Data.First().LastPlayedDate}", + ExpiredKind.NotPlayed => $"Not played by anyone since {item.Item.DateCreated}", + _ => throw new NotImplementedException(), + }; overview = $"{movie.Path}"; break; case Series series: title = $"\"{series.Name}\" was deleted"; - shortOverview = $"Last played by {item.Data.First().User.Username} at {item.Data.First().LastPlayedDate}"; + shortOverview = item.Kind switch + { + ExpiredKind.Played => $"Last played by {item.Data.First().User.Username} at {item.Data.First().LastPlayedDate}", + ExpiredKind.NotPlayed => $"Not played by anyone since {item.Item.DateCreated}", + _ => throw new NotImplementedException(), + }; overview = $"{series.Path}"; break; case Season season: title = $"\"{season.SeriesName}\" S{season.IndexNumber:D2} was deleted"; - shortOverview = $"Last played by {item.Data.First().User.Username} at {item.Data.First().LastPlayedDate}"; + shortOverview = item.Kind switch + { + ExpiredKind.Played => $"Last played by {item.Data.First().User.Username} at {item.Data.First().LastPlayedDate}", + ExpiredKind.NotPlayed => $"Not played by anyone since {item.Item.DateCreated}", + _ => throw new NotImplementedException(), + }; overview = $"{season.Path ?? season.SeriesPath}"; break; case Episode episode: title = $"\"{episode.SeriesName}\" S{episode.ParentIndexNumber:D2}E{episode.IndexNumber:D2} was deleted"; - shortOverview = $"Last played by {item.Data.First().User.Username} at {item.Data.First().LastPlayedDate}"; + shortOverview = item.Kind switch + { + ExpiredKind.Played => $"Last played by {item.Data.First().User.Username} at {item.Data.First().LastPlayedDate}", + ExpiredKind.NotPlayed => $"Not played by anyone since {item.Item.DateCreated}", + _ => throw new NotImplementedException(), + }; overview = $"{episode.Path}"; break; case Video video: title = $"\"{video.Name}\" was deleted"; - shortOverview = $"Last played by {item.Data.First().User.Username} at {item.Data.First().LastPlayedDate}"; + shortOverview = item.Kind switch + { + ExpiredKind.Played => $"Last played by {item.Data.First().User.Username} at {item.Data.First().LastPlayedDate}", + ExpiredKind.NotPlayed => $"Not played by anyone since {item.Item.DateCreated}", + _ => throw new NotImplementedException(), + }; overview = $"{video.Path}"; break; default: title = $"\"{item.Item.Name}\" was deleted"; - shortOverview = $"Last played by {item.Data.First().User.Username} at {item.Data.First().LastPlayedDate}"; + shortOverview = item.Kind switch + { + ExpiredKind.Played => $"Last played by {item.Data.First().User.Username} at {item.Data.First().LastPlayedDate}", + ExpiredKind.NotPlayed => $"Not played by anyone since {item.Item.DateCreated}", + _ => throw new NotImplementedException(), + }; overview = $"{item.Item.Path}"; break; }; diff --git a/build.yaml b/build.yaml index 517d2df..834b238 100644 --- a/build.yaml +++ b/build.yaml @@ -1,7 +1,7 @@ --- name: "Media Cleaner" guid: "607fee77-97eb-41fe-bf22-26844d99ffb0" -version: "2.12.0.0" +version: "2.13.0.0" targetAbi: "10.8.11.0" framework: "net6.0" overview: "Delete played media after specified time" @@ -13,7 +13,5 @@ owner: "shemanaev" artifacts: - "MediaCleaner.dll" changelog: > - Add color coding to levels in log viewer - Add full name in logs - Add cleanup of old unplayed items + Fix not played cleanup