mirror of
				https://github.com/zoriya/Kyoo.git
				synced 2025-11-03 19:17:16 -05: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);
 | 
			
		||||
			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;
 | 
			
		||||
 | 
			
		||||
@ -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();
 | 
			
		||||
 | 
			
		||||
@ -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))
 | 
			
		||||
 | 
			
		||||
@ -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()
 | 
			
		||||
		};
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
@ -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)
 | 
			
		||||
				{
 | 
			
		||||
 | 
			
		||||
@ -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)
 | 
			
		||||
		{
 | 
			
		||||
 | 
			
		||||
@ -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();
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user