aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Emby.Server.Implementations/Library/Validators/CollectionPostScanTask.cs115
-rw-r--r--Emby.Server.Implementations/Library/Validators/CollectionValidator.cs166
2 files changed, 110 insertions, 171 deletions
diff --git a/Emby.Server.Implementations/Library/Validators/CollectionPostScanTask.cs b/Emby.Server.Implementations/Library/Validators/CollectionPostScanTask.cs
index bc204b788..64967350e 100644
--- a/Emby.Server.Implementations/Library/Validators/CollectionPostScanTask.cs
+++ b/Emby.Server.Implementations/Library/Validators/CollectionPostScanTask.cs
@@ -1,9 +1,14 @@
using System;
+using System.Linq;
using System.Threading;
using System.Threading.Tasks;
+using System.Collections.Generic;
using MediaBrowser.Controller.Collections;
+using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Entities.Movies;
using MediaBrowser.Controller.Library;
-using MediaBrowser.Controller.Persistence;
+using MediaBrowser.Model.Querying;
+using Jellyfin.Data.Enums;
using Microsoft.Extensions.Logging;
namespace Emby.Server.Implementations.Library.Validators
@@ -17,8 +22,16 @@ namespace Emby.Server.Implementations.Library.Validators
/// The _library manager.
/// </summary>
private readonly ILibraryManager _libraryManager;
+
+ /// <summary>
+ /// The collection manager.
+ /// </summary>
private readonly ICollectionManager _collectionManager;
- private readonly ILogger<CollectionValidator> _logger;
+
+ /// <summary>
+ /// The logger.
+ /// </summary>
+ private readonly ILogger<CollectionPostScanTask> _logger;
/// <summary>
/// Initializes a new instance of the <see cref="CollectionPostScanTask" /> class.
@@ -28,7 +41,7 @@ namespace Emby.Server.Implementations.Library.Validators
/// <param name="logger">The logger.</param>
public CollectionPostScanTask(
ILibraryManager libraryManager,
- ILogger<CollectionValidator> logger,
+ ILogger<CollectionPostScanTask> logger,
ICollectionManager collectionManager)
{
_libraryManager = libraryManager;
@@ -42,9 +55,101 @@ namespace Emby.Server.Implementations.Library.Validators
/// <param name="progress">The progress.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns>Task.</returns>
- public Task Run(IProgress<double> progress, CancellationToken cancellationToken)
+ public async Task Run(IProgress<double> progress, CancellationToken cancellationToken)
{
- return new CollectionValidator(_libraryManager, _collectionManager, _logger).Run(progress, cancellationToken);
+
+ var movies = _libraryManager.GetItemList(new InternalItemsQuery
+ {
+ IncludeItemTypes = new[] { nameof(Movie) },
+ IsVirtualItem = false,
+ OrderBy = new List<ValueTuple<string, SortOrder>>
+ {
+ new ValueTuple<string, SortOrder>(ItemSortBy.SortName, SortOrder.Ascending)
+ },
+ Recursive = true
+ });
+
+ var boxSets = _libraryManager.GetItemList(new InternalItemsQuery
+ {
+ IncludeItemTypes = new[] { nameof(BoxSet) },
+ CollapseBoxSetItems = false,
+ Recursive = true
+ });
+
+ var numComplete = 0;
+ var count = movies.Count;
+
+ var collectionNameMoviesMap = new Dictionary<string, List<Movie>>();
+ foreach (var m in movies)
+ {
+ var movie = m as Movie;
+ if (movie != null && movie.CollectionName != null)
+ {
+ var movieList = new List<Movie>();
+ if (collectionNameMoviesMap.TryGetValue(movie.CollectionName, out movieList))
+ {
+ if (!movieList.Any(m => m.Id == movie.Id))
+ {
+ movieList.Add(movie);
+ collectionNameMoviesMap[movie.CollectionName] = movieList;
+ }
+ }
+ else
+ {
+ collectionNameMoviesMap[movie.CollectionName] = new List<Movie> { movie };
+ }
+
+ }
+
+ numComplete++;
+ double percent = numComplete;
+ percent /= count * 2;
+ percent *= 100;
+
+ progress.Report(percent);
+ }
+
+ foreach (var pair in collectionNameMoviesMap)
+ {
+ try
+ {
+ var collectionName = pair.Key;
+ var movieList = pair.Value;
+
+ var boxSet = boxSets.FirstOrDefault(b => b != null ? b.Name == collectionName : false) as BoxSet;
+ if (boxSet == null)
+ {
+ // won't automatically create collection if only one movie in it
+ if (movieList.Count >= 2)
+ {
+ boxSet = await _collectionManager.CreateCollectionAsync(new CollectionCreationOptions
+ {
+ Name = collectionName,
+ IsLocked = true
+ });
+
+ await _collectionManager.AddToCollectionAsync(boxSet.Id, movieList.Select(m => m.Id));
+ }
+ }
+ else
+ {
+ await _collectionManager.AddToCollectionAsync(boxSet.Id, movieList.Select(m => m.Id));
+ }
+
+ numComplete++;
+ double percent = numComplete;
+ percent /= count * 2;
+ percent *= 100;
+
+ progress.Report(percent);
+ }
+ catch (Exception ex)
+ {
+ _logger.LogError(ex, "Error refreshing {0}, {1}", pair.Key, pair.Value.ToString());
+ }
+ }
+
+ progress.Report(100);
}
}
}
diff --git a/Emby.Server.Implementations/Library/Validators/CollectionValidator.cs b/Emby.Server.Implementations/Library/Validators/CollectionValidator.cs
deleted file mode 100644
index 439fc1da1..000000000
--- a/Emby.Server.Implementations/Library/Validators/CollectionValidator.cs
+++ /dev/null
@@ -1,166 +0,0 @@
-using System;
-using System.Linq;
-using System.Threading;
-using System.Threading.Tasks;
-using System.Collections.Generic;
-using MediaBrowser.Controller.Collections;
-using MediaBrowser.Controller.Entities;
-using MediaBrowser.Controller.Entities.Movies;
-using MediaBrowser.Controller.Library;
-using MediaBrowser.Model.Querying;
-using Microsoft.Extensions.Logging;
-using Jellyfin.Data.Enums;
-
-namespace Emby.Server.Implementations.Library.Validators
-{
- /// <summary>
- /// Class CollectionValidator.
- /// </summary>
- public class CollectionValidator
- {
- /// <summary>
- /// The library manager.
- /// </summary>
- private readonly ILibraryManager _libraryManager;
-
- /// <summary>
- /// The collection manager.
- /// </summary>
- private readonly ICollectionManager _collectionManager;
-
- /// <summary>
- /// The logger.
- /// </summary>
- private readonly ILogger<CollectionValidator> _logger;
-
- /// <summary>
- /// Initializes a new instance of the <see cref="CollectionValidator" /> class.
- /// </summary>
- /// <param name="libraryManager">The library manager.</param>
- /// <param name="collectionManager">The collection manager.</param>
- /// <param name="logger">The logger.</param>
- public CollectionValidator(ILibraryManager libraryManager, ICollectionManager collectionManager, ILogger<CollectionValidator> logger)
- {
- _libraryManager = libraryManager;
- _collectionManager = collectionManager;
- _logger = logger;
- }
-
- /// <summary>
- /// Runs the specified progress.
- /// </summary>
- /// <param name="progress">The progress.</param>
- /// <param name="cancellationToken">The cancellation token.</param>
- /// <returns>Task.</returns>
- public async Task Run(IProgress<double> progress, CancellationToken cancellationToken)
- {
- var movies = _libraryManager.GetItemList(new InternalItemsQuery
- {
- IncludeItemTypes = new[] { nameof(Movie) },
- IsVirtualItem = false,
- OrderBy = new List<ValueTuple<string, SortOrder>>
- {
- new ValueTuple<string, SortOrder>(ItemSortBy.SortName, SortOrder.Ascending)
- },
- Recursive = true
- }).Select(m => m as Movie).ToList();
-
- var boxSets = _libraryManager.GetItemList(new InternalItemsQuery
- {
- IncludeItemTypes = new[] { nameof(BoxSet) },
- CollapseBoxSetItems = false,
- Recursive = true
- }).Select(b => b as BoxSet).ToList();
-
- var numComplete = 0;
- var count = movies.Count;
-
- var map = new Dictionary<string, List<Movie>>();
- foreach (var movie in movies)
- {
- if (movie != null && movie.CollectionName != null)
- {
- var movieList = new List<Movie>();
- if (map.TryGetValue(movie.CollectionName, out movieList))
- {
- if (!movieList.Where(m => m.Id == movie.Id).Any())
- {
- movieList.Add(movie);
- map[movie.CollectionName] = movieList;
- }
- }
- else
- {
- map[movie.CollectionName] = new List<Movie> { movie };
- }
-
- }
-
- numComplete++;
- double percent = numComplete;
- percent /= count * 2;
- percent *= 100;
-
- progress.Report(percent);
- }
-
- foreach (var pair in map)
- {
- try
- {
- var collectionName = pair.Key;
- var movieList = pair.Value;
-
- var boxSet = boxSets.FirstOrDefault(b => b != null ? b.Name == collectionName : false);
- if (boxSet == null)
- {
- // won't automatically create collection if only one movie in it
- if (movieList.Count >= 2)
- {
- boxSet = await _collectionManager.CreateCollectionAsync(new CollectionCreationOptions
- {
- Name = collectionName,
- IsLocked = true
- });
-
- AddMovieToCollection(boxSet.Id, boxSet, movieList);
- }
- }
- else
- {
- AddMovieToCollection(boxSet.Id, boxSet, movieList);
- }
-
- numComplete++;
- double percent = numComplete;
- percent /= count * 2;
- percent *= 100;
-
- progress.Report(percent);
- }
- catch (Exception ex)
- {
- _logger.LogError(ex, "Error refreshing {0}, {1}", pair.Key, pair.Value.ToString());
- }
- }
-
- progress.Report(100);
- }
-
- private async void AddMovieToCollection(Guid boxSetId, BoxSet boxSet, List<Movie> movieList)
- {
-
- var movieIds = new List<Guid>();
- foreach (var movie in movieList)
- {
- if (!boxSet.ContainsLinkedChildByItemId(movie.Id))
- {
- movieIds.Add(movie.Id);
- }
- }
- if (movieIds.Any()) {
- await _collectionManager.AddToCollectionAsync(boxSetId, movieIds);
- }
- }
- }
-}