diff --git a/MediaCleaner/ItemsAdapter.cs b/MediaCleaner/ItemsAdapter.cs index 1a831a2..180c922 100644 --- a/MediaCleaner/ItemsAdapter.cs +++ b/MediaCleaner/ItemsAdapter.cs @@ -1,6 +1,4 @@ -using System; using System.Collections.Generic; -using System.Linq; using System.Threading; using Jellyfin.Data.Entities; using Jellyfin.Data.Enums; @@ -33,7 +31,7 @@ public IEnumerable GetPlayedItems( CancellationToken cancellationToken) { var result = new List(); - var items = GetUserItems(kind, user); + var items = GetUserItems(kind, user, ItemSortBy.DatePlayed); foreach (var item in items) { cancellationToken.ThrowIfCancellationRequested(); @@ -80,15 +78,24 @@ public IEnumerable GetPlayedItems( public IEnumerable GetNotPlayedItems( BaseItemKind kind, - IEnumerable excludeIds, + User user, CancellationToken cancellationToken) { var result = new List(); - var items = GetItems(kind, excludeIds); - foreach ( var item in items ) + var items = GetUserItems(kind, user, ItemSortBy.DateCreated); + foreach (var item in items) { cancellationToken.ThrowIfCancellationRequested(); + var userData = _userDataManager.GetUserData(user, item); + var isWatching = userData.PlaybackPositionTicks != 0; + if (userData.Played || isWatching) + { + _logger.LogTrace("\"{Name}\" ({Id}) was played by {Username}", item.Name, item.Id, user.Username); + continue; + } + + _logger.LogTrace("\"{Name}\" ({Id}) added because not played by {Username}", item.Name, item.Id, user.Username); result.Add(new ExpiredItem { Item = item, @@ -99,20 +106,7 @@ public IEnumerable GetNotPlayedItems( return result; } - private IEnumerable GetItems(BaseItemKind kind, IEnumerable excludeIds) => - _libraryManager.GetItemList( - new InternalItemsQuery() - { - ExcludeItemIds = excludeIds.ToArray(), - IncludeItemTypes = new[] - { - kind, - }, - IsVirtualItem = false, - OrderBy = new[] { (ItemSortBy.DateCreated, SortOrder.Descending) } - }); - - private IEnumerable GetUserItems(BaseItemKind kind, User user) => + private IEnumerable GetUserItems(BaseItemKind kind, User user, string sortBy) => _libraryManager.GetItemList( new InternalItemsQuery(user) { @@ -121,6 +115,6 @@ private IEnumerable GetUserItems(BaseItemKind kind, User user) => kind, }, IsVirtualItem = false, - OrderBy = new[] { (ItemSortBy.DatePlayed, SortOrder.Descending) } + OrderBy = new[] { (sortBy, SortOrder.Descending) } }); } diff --git a/MediaCleaner/JunkCollectors/BaseJunkCollector.cs b/MediaCleaner/JunkCollectors/BaseJunkCollector.cs index bbe8c09..6203419 100644 --- a/MediaCleaner/JunkCollectors/BaseJunkCollector.cs +++ b/MediaCleaner/JunkCollectors/BaseJunkCollector.cs @@ -37,6 +37,7 @@ public virtual List Execute( .Select(x => new ExpiredItem { Item = x.Key, + Kind = x.Select(a => a.Kind).FirstOrDefault(), Data = x.SelectMany(a => a.Data.Select(z => z)) .OrderByDescending(a => a.LastPlayedDate) .ToList() @@ -66,14 +67,20 @@ public virtual List Execute( } public virtual List ExecuteNotPlayed( - List expiredPlayedItems, + List users, IEnumerable filters, CancellationToken cancellationToken) { _logger.LogTrace("Collecting not played items started at {StartTime}", DateTime.Now); - var playedIds = expiredPlayedItems.Select(x => x.Item.Id).ToList(); - var items = _itemsAdapter - .GetNotPlayedItems(_kind, playedIds, cancellationToken) + var items = users + .SelectMany(x => _itemsAdapter.GetNotPlayedItems(_kind, x, cancellationToken)) + .GroupBy(x => x.Item) + .Where(x => x.Count() == users.Count) + .Select(x => new ExpiredItem + { + Item = x.Key, + Kind = x.Select(a => a.Kind).FirstOrDefault(), + }) .ToList(); _logger.LogDebug("Filters order: {Filters}", string.Join(", ", filters.Select(x => x.Name))); diff --git a/MediaCleaner/JunkCollectors/IJunkCollector.cs b/MediaCleaner/JunkCollectors/IJunkCollector.cs index d38ce44..7662097 100644 --- a/MediaCleaner/JunkCollectors/IJunkCollector.cs +++ b/MediaCleaner/JunkCollectors/IJunkCollector.cs @@ -8,6 +8,6 @@ namespace MediaCleaner.JunkCollectors internal interface IJunkCollector { List Execute(List users, IEnumerable filters, CancellationToken cancellationToken); - List ExecuteNotPlayed(List expiredPlayedItems, IEnumerable filters, CancellationToken cancellationToken); + List ExecuteNotPlayed(List users, IEnumerable filters, CancellationToken cancellationToken); } } diff --git a/MediaCleaner/MediaCleanupTask.cs b/MediaCleaner/MediaCleanupTask.cs index 22ce06d..e0b06e2 100644 --- a/MediaCleaner/MediaCleanupTask.cs +++ b/MediaCleaner/MediaCleanupTask.cs @@ -108,14 +108,14 @@ public async Task ExecuteAsync(IProgress progress, CancellationToken can if (Configuration.KeepMoviesFor >= 0 || Configuration.KeepMoviesNotPlayedFor >= 0) { - var expiredMovies = CollectMovies(users, usersWithFavorites, itemsAdapter, cancellationToken); if (Configuration.KeepMoviesFor >= 0) { + var expiredMovies = CollectMovies(users, usersWithFavorites, itemsAdapter, cancellationToken); expired.AddRange(expiredMovies); } if (Configuration.KeepMoviesNotPlayedFor >= 0) { - var expiredNotPlayedMovies = CollectNotPlayedMovies(expiredMovies, usersWithFavorites, itemsAdapter, cancellationToken); + var expiredNotPlayedMovies = CollectNotPlayedMovies(users, usersWithFavorites, itemsAdapter, cancellationToken); expiredNotPlayed.AddRange(expiredNotPlayedMovies); } } @@ -123,14 +123,14 @@ public async Task ExecuteAsync(IProgress progress, CancellationToken can if (Configuration.KeepEpisodesFor >= 0 || Configuration.KeepEpisodesNotPlayedFor >= 0) { - var expiredSeries = CollectSeries(users, usersWithFavorites, itemsAdapter, cancellationToken); if (Configuration.KeepEpisodesFor >= 0) { + var expiredSeries = CollectSeries(users, usersWithFavorites, itemsAdapter, cancellationToken); expired.AddRange(expiredSeries); } if (Configuration.KeepEpisodesNotPlayedFor >= 0) { - var expiredNotPlayedEpisodes = CollectNotPlayedSeries(expiredSeries, usersWithFavorites, itemsAdapter, cancellationToken); + var expiredNotPlayedEpisodes = CollectNotPlayedSeries(users, usersWithFavorites, itemsAdapter, cancellationToken); expiredNotPlayed.AddRange(expiredNotPlayedEpisodes); } } @@ -138,42 +138,42 @@ public async Task ExecuteAsync(IProgress progress, CancellationToken can if (Configuration.KeepVideosFor >= 0 || Configuration.KeepVideosNotPlayedFor >= 0) { - var expiredVideos = CollectVideos(users, usersWithFavorites, itemsAdapter, cancellationToken); if (Configuration.KeepVideosFor >= 0) { + var expiredVideos = CollectVideos(users, usersWithFavorites, itemsAdapter, cancellationToken); expired.AddRange(expiredVideos); } if (Configuration.KeepVideosNotPlayedFor >= 0) { - var expiredNotPlayedVideos = CollectNotPlayedVideos(expiredVideos, usersWithFavorites, itemsAdapter, cancellationToken); + var expiredNotPlayedVideos = CollectNotPlayedVideos(users, usersWithFavorites, itemsAdapter, cancellationToken); expiredNotPlayed.AddRange(expiredNotPlayedVideos); } } if (Configuration.KeepAudioFor >= 0 || Configuration.KeepAudioNotPlayedFor >= 0) { - var expiredAudio = CollectAudio(users, usersWithFavorites, itemsAdapter, cancellationToken); if (Configuration.KeepAudioFor >= 0) { + var expiredAudio = CollectAudio(users, usersWithFavorites, itemsAdapter, cancellationToken); expired.AddRange(expiredAudio); } if (Configuration.KeepAudioNotPlayedFor >= 0) { - var expiredNotPlayedAudio = CollectNotPlayedAudio(expiredAudio, usersWithFavorites, itemsAdapter, cancellationToken); + var expiredNotPlayedAudio = CollectNotPlayedAudio(users, usersWithFavorites, itemsAdapter, cancellationToken); expiredNotPlayed.AddRange(expiredNotPlayedAudio); } } if (Configuration.KeepAudioBooksFor >= 0 || Configuration.KeepAudioBooksNotPlayedFor >= 0) { - var expiredAudioBooks = CollectAudioBook(users, usersWithFavorites, itemsAdapter, cancellationToken); if (Configuration.KeepAudioBooksFor >= 0) { + var expiredAudioBooks = CollectAudioBook(users, usersWithFavorites, itemsAdapter, cancellationToken); expired.AddRange(expiredAudioBooks); } if (Configuration.KeepAudioBooksNotPlayedFor >= 0) { - var expiredNotPlayedAudioBooks = CollectNotPlayedAudioBook(expiredAudioBooks, usersWithFavorites, itemsAdapter, cancellationToken); + var expiredNotPlayedAudioBooks = CollectNotPlayedAudioBook(users, usersWithFavorites, itemsAdapter, cancellationToken); expiredNotPlayed.AddRange(expiredNotPlayedAudioBooks); } } @@ -267,7 +267,7 @@ private List CollectMovies(List users, List usersWithFa return expiredMovies; } - private IEnumerable CollectNotPlayedMovies(List expiredMovies, List usersWithFavorites, ItemsAdapter itemsAdapter, CancellationToken cancellationToken) + private IEnumerable CollectNotPlayedMovies(List users, List usersWithFavorites, ItemsAdapter itemsAdapter, CancellationToken cancellationToken) { var filters = new List { @@ -283,7 +283,7 @@ private IEnumerable CollectNotPlayedMovies(List expire _fileSystem) }; var moviesCollector = new MoviesJunkCollector(_loggerFactory.CreateLogger(), itemsAdapter); - var movies = moviesCollector.ExecuteNotPlayed(expiredMovies, filters, cancellationToken); + var movies = moviesCollector.ExecuteNotPlayed(users, filters, cancellationToken); return movies; } @@ -310,7 +310,7 @@ private List CollectSeries(List users, List usersWithFa return expiredSeries; } - private IEnumerable CollectNotPlayedSeries(List expiredItems, List usersWithFavorites, ItemsAdapter itemsAdapter, CancellationToken cancellationToken) + private IEnumerable CollectNotPlayedSeries(List users, List usersWithFavorites, ItemsAdapter itemsAdapter, CancellationToken cancellationToken) { var filters = new List { @@ -327,7 +327,7 @@ private IEnumerable CollectNotPlayedSeries(List expire new SeriesFilter(_loggerFactory.CreateLogger(), Configuration.DeleteEpisodes) }; var seriesCollector = new SeriesJunkCollector(_loggerFactory.CreateLogger(), itemsAdapter); - var expiredSeries = seriesCollector.ExecuteNotPlayed(expiredItems, filters, cancellationToken); + var expiredSeries = seriesCollector.ExecuteNotPlayed(users, filters, cancellationToken); return expiredSeries; } @@ -353,7 +353,7 @@ private List CollectVideos(List users, List usersWithFa return expiredVideos; } - private IEnumerable CollectNotPlayedVideos(List expiredItems, List usersWithFavorites, ItemsAdapter itemsAdapter, CancellationToken cancellationToken) + private IEnumerable CollectNotPlayedVideos(List users, List usersWithFavorites, ItemsAdapter itemsAdapter, CancellationToken cancellationToken) { var filters = new List { @@ -369,7 +369,7 @@ private IEnumerable CollectNotPlayedVideos(List expire _fileSystem) }; var videosCollector = new VideosJunkCollector(_loggerFactory.CreateLogger(), itemsAdapter); - var expiredVideos = videosCollector.ExecuteNotPlayed(expiredItems, filters, cancellationToken); + var expiredVideos = videosCollector.ExecuteNotPlayed(users, filters, cancellationToken); return expiredVideos; } @@ -395,7 +395,7 @@ private List CollectAudio(List users, List usersWithFav return expiredItems; } - private IEnumerable CollectNotPlayedAudio(List expiredAudio, List usersWithFavorites, ItemsAdapter itemsAdapter, CancellationToken cancellationToken) + private IEnumerable CollectNotPlayedAudio(List users, List usersWithFavorites, ItemsAdapter itemsAdapter, CancellationToken cancellationToken) { var filters = new List { @@ -411,7 +411,7 @@ private IEnumerable CollectNotPlayedAudio(List expired _fileSystem) }; var collector = new AudioJunkCollector(_loggerFactory.CreateLogger(), itemsAdapter); - var expiredItems = collector.ExecuteNotPlayed(expiredAudio, filters, cancellationToken); + var expiredItems = collector.ExecuteNotPlayed(users, filters, cancellationToken); return expiredItems; } @@ -437,7 +437,7 @@ private List CollectAudioBook(List users, List usersWit return expiredItems; } - private IEnumerable CollectNotPlayedAudioBook(List expiredAudioBooks, List usersWithFavorites, ItemsAdapter itemsAdapter, CancellationToken cancellationToken) + private IEnumerable CollectNotPlayedAudioBook(List users, List usersWithFavorites, ItemsAdapter itemsAdapter, CancellationToken cancellationToken) { var filters = new List { @@ -453,7 +453,7 @@ private IEnumerable CollectNotPlayedAudioBook(List exp _fileSystem) }; var collector = new AudioBookJunkCollector(_loggerFactory.CreateLogger(), itemsAdapter); - var expiredItems = collector.ExecuteNotPlayed(expiredAudioBooks, filters, cancellationToken); + var expiredItems = collector.ExecuteNotPlayed(users, filters, cancellationToken); return expiredItems; }