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);
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;

View File

@ -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();

View File

@ -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))

View File

@ -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()
};
}
}

View File

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

View File

@ -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<ILibraryManager>();
@ -35,20 +34,24 @@ namespace Kyoo.Tasks
_database = serviceScope.ServiceProvider.GetService<DatabaseContext>();
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<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)
@ -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)
{

View File

@ -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();
}

View File

@ -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();
}

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