mirror of
https://github.com/zoriya/Kyoo.git
synced 2025-07-09 03:04:20 -04:00
The identify now recursivly rescan seasons and episodes
This commit is contained in:
parent
40ea4a37af
commit
7015f33c22
@ -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;
|
||||||
|
@ -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
|
{
|
||||||
|
episode.Season = _database.Seasons.FirstOrDefault(x => x.ShowID == episode.ShowID
|
||||||
&& x.SeasonNumber == edited.SeasonNumber) ?? episode.Season;
|
&& x.SeasonNumber == edited.SeasonNumber) ?? episode.Season;
|
||||||
episode.Season.ExternalIDs = ValidateExternalIDs(episode.Season.ExternalIDs);
|
episode.Season.ExternalIDs = ValidateExternalIDs(episode.Season.ExternalIDs);
|
||||||
|
}
|
||||||
episode.ExternalIDs = ValidateExternalIDs(episode.ExternalIDs);
|
episode.ExternalIDs = ValidateExternalIDs(episode.ExternalIDs);
|
||||||
|
|
||||||
_database.ChangeTracker.DetectChanges();
|
_database.ChangeTracker.DetectChanges();
|
||||||
|
@ -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))
|
||||||
|
@ -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()
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -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)
|
||||||
{
|
{
|
||||||
|
@ -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)
|
||||||
{
|
{
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
|
Loading…
x
Reference in New Issue
Block a user