From 7015f33c227e3611d4804c3cd0338084542e8ae8 Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Wed, 6 May 2020 03:16:04 +0200 Subject: [PATCH] The identify now recursivly rescan seasons and episodes --- Kyoo.Common/Utility.cs | 13 +++------ Kyoo/Controllers/LibraryManager.cs | 12 +++++---- Kyoo/Controllers/ThumbnailsManager.cs | 4 +-- Kyoo/Tasks/CoreTaskHolder.cs | 5 ++-- Kyoo/Tasks/Crawler.cs | 7 +++-- Kyoo/Tasks/ReScan.cs | 38 ++++++++++++++++----------- Kyoo/Views/API/LibrariesAPI.cs | 5 +++- Kyoo/Views/API/ShowsAPI.cs | 8 +++--- Kyoo/Views/WebClient | 2 +- 9 files changed, 51 insertions(+), 43 deletions(-) diff --git a/Kyoo.Common/Utility.cs b/Kyoo.Common/Utility.cs index 5bc23647..4ef3c2d7 100644 --- a/Kyoo.Common/Utility.cs +++ b/Kyoo.Common/Utility.cs @@ -76,19 +76,14 @@ namespace Kyoo Type type = typeof(T); foreach (PropertyInfo property in type.GetProperties()) { - MethodInfo getter = property.GetGetMethod(); - MethodInfo setter = property.GetSetMethod(); + if (!property.CanRead || !property.CanWrite) + continue; - object value = getter != null ? getter.Invoke(second, null) : property.GetValue(second); + object value = property.GetValue(second); object defaultValue = property.PropertyType.IsValueType ? Activator.CreateInstance(property.PropertyType) : null; if (value?.Equals(defaultValue) == false) - { - if (setter != null) - setter.Invoke(first, new[] {value}); - else - property.SetValue(second, value); - } + property.SetValue(first, value); } return first; diff --git a/Kyoo/Controllers/LibraryManager.cs b/Kyoo/Controllers/LibraryManager.cs index 20bdc451..67fcf4c8 100644 --- a/Kyoo/Controllers/LibraryManager.cs +++ b/Kyoo/Controllers/LibraryManager.cs @@ -455,7 +455,7 @@ namespace Kyoo.Controllers x.Provider = _database.Providers.FirstOrDefault(y => y.Name == x.Provider.Name) ?? x.Provider; x.ProviderID = x.Provider.ID; return x; - }).ToList(); + }).GroupBy(x => x.Provider.Name).Select(x => x.First()).ToList(); } public long RegisterMovie(Episode movie) @@ -551,10 +551,12 @@ namespace Kyoo.Controllers Utility.Complete(episode, edited); - episode.Season = _database.Seasons - .FirstOrDefault(x => x.ShowID == episode.ShowID - && x.SeasonNumber == edited.SeasonNumber) ?? episode.Season; - episode.Season.ExternalIDs = ValidateExternalIDs(episode.Season.ExternalIDs); + if (episode.SeasonNumber != -1) + { + episode.Season = _database.Seasons.FirstOrDefault(x => x.ShowID == episode.ShowID + && x.SeasonNumber == edited.SeasonNumber) ?? episode.Season; + episode.Season.ExternalIDs = ValidateExternalIDs(episode.Season.ExternalIDs); + } episode.ExternalIDs = ValidateExternalIDs(episode.ExternalIDs); _database.ChangeTracker.DetectChanges(); diff --git a/Kyoo/Controllers/ThumbnailsManager.cs b/Kyoo/Controllers/ThumbnailsManager.cs index c43fef04..75f8ee5c 100644 --- a/Kyoo/Controllers/ThumbnailsManager.cs +++ b/Kyoo/Controllers/ThumbnailsManager.cs @@ -82,7 +82,7 @@ namespace Kyoo.Controllers if (season?.Show?.Path == null) return default; - if (season.ImgPrimary == null) + if (season.ImgPrimary != null) { string localPath = Path.Combine(season.Show.Path, $"season-{season.SeasonNumber}.jpg"); if (alwaysDownload || !File.Exists(localPath)) @@ -96,7 +96,7 @@ namespace Kyoo.Controllers if (episode?.Path == null) return default; - if (episode.ImgPrimary == null) + if (episode.ImgPrimary != null) { string localPath = Path.ChangeExtension(episode.Path, "jpg"); if (alwaysDownload || !File.Exists(localPath)) diff --git a/Kyoo/Tasks/CoreTaskHolder.cs b/Kyoo/Tasks/CoreTaskHolder.cs index 73f36d2a..7cae9dc8 100644 --- a/Kyoo/Tasks/CoreTaskHolder.cs +++ b/Kyoo/Tasks/CoreTaskHolder.cs @@ -5,12 +5,13 @@ namespace Kyoo.Tasks { public static class CoreTaskHolder { - public static ITask[] Tasks = + public static readonly ITask[] Tasks = { new CreateDatabase(), new PluginLoader(), new Crawler(), - new MetadataLoader() + new MetadataLoader(), + new ReScan() }; } } \ No newline at end of file diff --git a/Kyoo/Tasks/Crawler.cs b/Kyoo/Tasks/Crawler.cs index dde61eaa..ebf6e2cf 100644 --- a/Kyoo/Tasks/Crawler.cs +++ b/Kyoo/Tasks/Crawler.cs @@ -50,10 +50,9 @@ namespace Kyoo.Controllers try { IEnumerable episodes = _libraryManager.GetAllEpisodes(); - IEnumerable libraries = _libraryManager.GetLibraries(); - - if (argument != null) - libraries = libraries.Where(x => x.Slug == argument); + IEnumerable libraries = argument == null + ? _libraryManager.GetLibraries() + : new [] {_libraryManager.GetLibrary(argument)}; foreach (Episode episode in episodes) { diff --git a/Kyoo/Tasks/ReScan.cs b/Kyoo/Tasks/ReScan.cs index 8445d78c..846b7033 100644 --- a/Kyoo/Tasks/ReScan.cs +++ b/Kyoo/Tasks/ReScan.cs @@ -6,7 +6,6 @@ using System.Threading.Tasks; using Kyoo.Controllers; using Kyoo.Models; using Microsoft.EntityFrameworkCore; -using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; namespace Kyoo.Tasks @@ -26,7 +25,7 @@ namespace Kyoo.Tasks private IProviderManager _providerManager; private DatabaseContext _database; - public Task Run(IServiceProvider serviceProvider, CancellationToken cancellationToken, string arguments = null) + public async Task Run(IServiceProvider serviceProvider, CancellationToken cancellationToken, string arguments = null) { using IServiceScope serviceScope = serviceProvider.CreateScope(); _libraryManager = serviceScope.ServiceProvider.GetService(); @@ -35,20 +34,24 @@ namespace Kyoo.Tasks _database = serviceScope.ServiceProvider.GetService(); if (arguments == null || !arguments.Contains('/')) - return Task.CompletedTask; + return; string slug = arguments.Substring(arguments.IndexOf('/') + 1); - return arguments.Substring(0, arguments.IndexOf('/')) switch + switch (arguments.Substring(0, arguments.IndexOf('/'))) { - "show" => ReScanShow(slug), - "season" => ReScanSeason(slug), - _ => Task.CompletedTask - }; + case "show": + await ReScanShow(slug); + break; + //case "season": + // await ReScanSeason(slug): + default: + break; + } } private async Task ReScanShow(string slug) { - Show old = _database.Shows.AsNoTracking().FirstOrDefault(x => x.Slug == slug); + Show old = _database.Shows.FirstOrDefault(x => x.Slug == slug); if (old == null) return; Library library = _libraryManager.GetLibraryForShow(slug); @@ -58,7 +61,11 @@ namespace Kyoo.Tasks edited.Path = old.Path; _libraryManager.EditShow(edited); await _thumbnailsManager.Validate(edited, true); - await Task.WhenAll(edited.Seasons.Select(x => ReScanSeason(edited, x))); + if (old.Seasons != null) + await Task.WhenAll(old.Seasons.Select(x => ReScanSeason(old, x))); + IEnumerable orphans = old.Episodes.Where(x => x.Season == null).ToList(); + if (orphans.Any()) + await Task.WhenAll(orphans.Select(x => ReScanEpisode(old, x))); } private async Task ReScanSeason(Show show, Season old) @@ -68,13 +75,14 @@ namespace Kyoo.Tasks edited.ID = old.ID; _libraryManager.EditSeason(edited); await _thumbnailsManager.Validate(edited, true); - await Task.WhenAll(edited.Episodes.Select(x => ReScanEpisode(show, x))); + if (old.Episodes != null) + await Task.WhenAll(old.Episodes.Select(x => ReScanEpisode(show, x))); } - private async Task ReScanSeason(string slug) - { - - } + // private async Task ReScanSeason(string slug) + // { + // + // } private async Task ReScanEpisode(Show show, Episode old) { diff --git a/Kyoo/Views/API/LibrariesAPI.cs b/Kyoo/Views/API/LibrariesAPI.cs index 6c972af8..3b4fabb4 100644 --- a/Kyoo/Views/API/LibrariesAPI.cs +++ b/Kyoo/Views/API/LibrariesAPI.cs @@ -13,10 +13,12 @@ namespace Kyoo.Api public class LibrariesAPI : ControllerBase { private readonly ILibraryManager _libraryManager; + private readonly ITaskManager _taskManager; - public LibrariesAPI(ILibraryManager libraryManager) + public LibrariesAPI(ILibraryManager libraryManager, ITaskManager taskManager) { _libraryManager = libraryManager; + _taskManager = taskManager; } [HttpGet] @@ -41,6 +43,7 @@ namespace Kyoo.Api if (_libraryManager.GetLibrary(library.Slug) != null) return BadRequest(new {error = "Duplicated library slug"}); _libraryManager.RegisterLibrary(library); + _taskManager.StartTask("scan", library.Slug); return Ok(); } diff --git a/Kyoo/Views/API/ShowsAPI.cs b/Kyoo/Views/API/ShowsAPI.cs index 13c48198..bff47836 100644 --- a/Kyoo/Views/API/ShowsAPI.cs +++ b/Kyoo/Views/API/ShowsAPI.cs @@ -76,12 +76,12 @@ namespace Kyoo.Api { if (!ModelState.IsValid) return BadRequest(externalIDs); - Show show = _database.Shows.FirstOrDefault(x => x.Slug == slug); + Show show = _database.Shows.Include(x => x.ExternalIDs).FirstOrDefault(x => x.Slug == slug); if (show == null) return NotFound(); - show.ExternalIDs = externalIDs; - _libraryManager.EditShow(show); - _taskManager.StartTask("re-scan-show", $"show/{slug}"); + show.ExternalIDs = _libraryManager.ValidateExternalIDs(externalIDs); + _database.SaveChanges(); + _taskManager.StartTask("re-scan", $"show/{slug}"); return Ok(); } diff --git a/Kyoo/Views/WebClient b/Kyoo/Views/WebClient index 4135c957..5e088d54 160000 --- a/Kyoo/Views/WebClient +++ b/Kyoo/Views/WebClient @@ -1 +1 @@ -Subproject commit 4135c957573c13b4655fa858746ac0e7de97b3ea +Subproject commit 5e088d54e20451e8c070f9e2f3797325a08ceb63