The identify now recursivly rescan seasons and episodes

This commit is contained in:
Zoe Roux 2020-05-06 03:16:04 +02:00
parent 40ea4a37af
commit 7015f33c22
9 changed files with 51 additions and 43 deletions

View File

@ -76,19 +76,14 @@ namespace Kyoo
Type type = typeof(T); Type type = typeof(T);
foreach (PropertyInfo property in type.GetProperties()) foreach (PropertyInfo property in type.GetProperties())
{ {
MethodInfo getter = property.GetGetMethod(); if (!property.CanRead || !property.CanWrite)
MethodInfo setter = property.GetSetMethod(); 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; object defaultValue = property.PropertyType.IsValueType ? Activator.CreateInstance(property.PropertyType) : null;
if (value?.Equals(defaultValue) == false) if (value?.Equals(defaultValue) == false)
{ property.SetValue(first, value);
if (setter != null)
setter.Invoke(first, new[] {value});
else
property.SetValue(second, value);
}
} }
return first; return first;

View File

@ -455,7 +455,7 @@ namespace Kyoo.Controllers
x.Provider = _database.Providers.FirstOrDefault(y => y.Name == x.Provider.Name) ?? x.Provider; x.Provider = _database.Providers.FirstOrDefault(y => y.Name == x.Provider.Name) ?? x.Provider;
x.ProviderID = x.Provider.ID; x.ProviderID = x.Provider.ID;
return x; return x;
}).ToList(); }).GroupBy(x => x.Provider.Name).Select(x => x.First()).ToList();
} }
public long RegisterMovie(Episode movie) public long RegisterMovie(Episode movie)
@ -551,10 +551,12 @@ namespace Kyoo.Controllers
Utility.Complete(episode, edited); Utility.Complete(episode, edited);
episode.Season = _database.Seasons if (episode.SeasonNumber != -1)
.FirstOrDefault(x => x.ShowID == episode.ShowID {
&& x.SeasonNumber == edited.SeasonNumber) ?? episode.Season; episode.Season = _database.Seasons.FirstOrDefault(x => x.ShowID == episode.ShowID
episode.Season.ExternalIDs = ValidateExternalIDs(episode.Season.ExternalIDs); && x.SeasonNumber == edited.SeasonNumber) ?? episode.Season;
episode.Season.ExternalIDs = ValidateExternalIDs(episode.Season.ExternalIDs);
}
episode.ExternalIDs = ValidateExternalIDs(episode.ExternalIDs); episode.ExternalIDs = ValidateExternalIDs(episode.ExternalIDs);
_database.ChangeTracker.DetectChanges(); _database.ChangeTracker.DetectChanges();

View File

@ -82,7 +82,7 @@ namespace Kyoo.Controllers
if (season?.Show?.Path == null) if (season?.Show?.Path == null)
return default; return default;
if (season.ImgPrimary == null) if (season.ImgPrimary != null)
{ {
string localPath = Path.Combine(season.Show.Path, $"season-{season.SeasonNumber}.jpg"); string localPath = Path.Combine(season.Show.Path, $"season-{season.SeasonNumber}.jpg");
if (alwaysDownload || !File.Exists(localPath)) if (alwaysDownload || !File.Exists(localPath))
@ -96,7 +96,7 @@ namespace Kyoo.Controllers
if (episode?.Path == null) if (episode?.Path == null)
return default; return default;
if (episode.ImgPrimary == null) if (episode.ImgPrimary != null)
{ {
string localPath = Path.ChangeExtension(episode.Path, "jpg"); string localPath = Path.ChangeExtension(episode.Path, "jpg");
if (alwaysDownload || !File.Exists(localPath)) if (alwaysDownload || !File.Exists(localPath))

View File

@ -5,12 +5,13 @@ namespace Kyoo.Tasks
{ {
public static class CoreTaskHolder public static class CoreTaskHolder
{ {
public static ITask[] Tasks = public static readonly ITask[] Tasks =
{ {
new CreateDatabase(), new CreateDatabase(),
new PluginLoader(), new PluginLoader(),
new Crawler(), new Crawler(),
new MetadataLoader() new MetadataLoader(),
new ReScan()
}; };
} }
} }

View File

@ -50,10 +50,9 @@ namespace Kyoo.Controllers
try try
{ {
IEnumerable<Episode> episodes = _libraryManager.GetAllEpisodes(); IEnumerable<Episode> episodes = _libraryManager.GetAllEpisodes();
IEnumerable<Library> libraries = _libraryManager.GetLibraries(); IEnumerable<Library> libraries = argument == null
? _libraryManager.GetLibraries()
if (argument != null) : new [] {_libraryManager.GetLibrary(argument)};
libraries = libraries.Where(x => x.Slug == argument);
foreach (Episode episode in episodes) foreach (Episode episode in episodes)
{ {

View File

@ -6,7 +6,6 @@ using System.Threading.Tasks;
using Kyoo.Controllers; using Kyoo.Controllers;
using Kyoo.Models; using Kyoo.Models;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
namespace Kyoo.Tasks namespace Kyoo.Tasks
@ -26,7 +25,7 @@ namespace Kyoo.Tasks
private IProviderManager _providerManager; private IProviderManager _providerManager;
private DatabaseContext _database; 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(); using IServiceScope serviceScope = serviceProvider.CreateScope();
_libraryManager = serviceScope.ServiceProvider.GetService<ILibraryManager>(); _libraryManager = serviceScope.ServiceProvider.GetService<ILibraryManager>();
@ -35,20 +34,24 @@ namespace Kyoo.Tasks
_database = serviceScope.ServiceProvider.GetService<DatabaseContext>(); _database = serviceScope.ServiceProvider.GetService<DatabaseContext>();
if (arguments == null || !arguments.Contains('/')) if (arguments == null || !arguments.Contains('/'))
return Task.CompletedTask; return;
string slug = arguments.Substring(arguments.IndexOf('/') + 1); string slug = arguments.Substring(arguments.IndexOf('/') + 1);
return arguments.Substring(0, arguments.IndexOf('/')) switch switch (arguments.Substring(0, arguments.IndexOf('/')))
{ {
"show" => ReScanShow(slug), case "show":
"season" => ReScanSeason(slug), await ReScanShow(slug);
_ => Task.CompletedTask break;
}; //case "season":
// await ReScanSeason(slug):
default:
break;
}
} }
private async Task ReScanShow(string slug) 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) if (old == null)
return; return;
Library library = _libraryManager.GetLibraryForShow(slug); Library library = _libraryManager.GetLibraryForShow(slug);
@ -58,7 +61,11 @@ namespace Kyoo.Tasks
edited.Path = old.Path; edited.Path = old.Path;
_libraryManager.EditShow(edited); _libraryManager.EditShow(edited);
await _thumbnailsManager.Validate(edited, true); 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<Episode> 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) private async Task ReScanSeason(Show show, Season old)
@ -68,13 +75,14 @@ namespace Kyoo.Tasks
edited.ID = old.ID; edited.ID = old.ID;
_libraryManager.EditSeason(edited); _libraryManager.EditSeason(edited);
await _thumbnailsManager.Validate(edited, true); 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) private async Task ReScanEpisode(Show show, Episode old)
{ {

View File

@ -13,10 +13,12 @@ namespace Kyoo.Api
public class LibrariesAPI : ControllerBase public class LibrariesAPI : ControllerBase
{ {
private readonly ILibraryManager _libraryManager; private readonly ILibraryManager _libraryManager;
private readonly ITaskManager _taskManager;
public LibrariesAPI(ILibraryManager libraryManager) public LibrariesAPI(ILibraryManager libraryManager, ITaskManager taskManager)
{ {
_libraryManager = libraryManager; _libraryManager = libraryManager;
_taskManager = taskManager;
} }
[HttpGet] [HttpGet]
@ -41,6 +43,7 @@ namespace Kyoo.Api
if (_libraryManager.GetLibrary(library.Slug) != null) if (_libraryManager.GetLibrary(library.Slug) != null)
return BadRequest(new {error = "Duplicated library slug"}); return BadRequest(new {error = "Duplicated library slug"});
_libraryManager.RegisterLibrary(library); _libraryManager.RegisterLibrary(library);
_taskManager.StartTask("scan", library.Slug);
return Ok(); return Ok();
} }

View File

@ -76,12 +76,12 @@ namespace Kyoo.Api
{ {
if (!ModelState.IsValid) if (!ModelState.IsValid)
return BadRequest(externalIDs); 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) if (show == null)
return NotFound(); return NotFound();
show.ExternalIDs = externalIDs; show.ExternalIDs = _libraryManager.ValidateExternalIDs(externalIDs);
_libraryManager.EditShow(show); _database.SaveChanges();
_taskManager.StartTask("re-scan-show", $"show/{slug}"); _taskManager.StartTask("re-scan", $"show/{slug}");
return Ok(); return Ok();
} }

@ -1 +1 @@
Subproject commit 4135c957573c13b4655fa858746ac0e7de97b3ea Subproject commit 5e088d54e20451e8c070f9e2f3797325a08ceb63