diff --git a/Kyoo.Common/Controllers/ILibraryManager.cs b/Kyoo.Common/Controllers/ILibraryManager.cs index 133fa7c5..75e2b53f 100644 --- a/Kyoo.Common/Controllers/ILibraryManager.cs +++ b/Kyoo.Common/Controllers/ILibraryManager.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Threading.Tasks; +using JetBrains.Annotations; using Kyoo.Models; namespace Kyoo.Controllers @@ -20,35 +21,40 @@ namespace Kyoo.Controllers Task GetPeople(string slug); // Get by relations - Task> GetSeasons(long showID); - Task> GetSeasons(string showSlug); + Task> GetSeasons(long showID); + Task> GetSeasons(string showSlug); - Task> GetEpisodes(long showID, long seasonNumber); - Task> GetEpisodes(string showSlug, long seasonNumber); - Task> GetEpisodes(long seasonID); + Task> GetEpisodes(long showID, long seasonNumber); + Task> GetEpisodes(string showSlug, long seasonNumber); + Task> GetEpisodes(long seasonID); + // Helpers + Task GetShowByPath(string path); + Task AddShowLink(long showID, long? libraryID, long? collectionID); + Task AddShowLink([NotNull] Show show, Library library, Collection collection); + // Get all - Task> GetLibraries(); - Task> GetCollections(); - Task> GetShows(); - Task> GetSeasons(); - Task> GetEpisodes(); - Task> GetTracks(); - Task> GetStudios(); - Task> GetPeoples(); - Task> GetGenres(); - Task> GetProviders(); + Task> GetLibraries(); + Task> GetCollections(); + Task> GetShows(); + Task> GetSeasons(); + Task> GetEpisodes(); + Task> GetTracks(); + Task> GetStudios(); + Task> GetPeoples(); + Task> GetGenres(); + Task> GetProviders(); // Search - Task> SearchLibraries(string searchQuery); - Task> SearchCollections(string searchQuery); - Task> SearchShows(string searchQuery); - Task> SearchSeasons(string searchQuery); - Task> SearchEpisodes(string searchQuery); - Task> SearchGenres(string searchQuery); - Task> SearchStudios(string searchQuery); - Task> SearchPeople(string searchQuery); + Task> SearchLibraries(string searchQuery); + Task> SearchCollections(string searchQuery); + Task> SearchShows(string searchQuery); + Task> SearchSeasons(string searchQuery); + Task> SearchEpisodes(string searchQuery); + Task> SearchGenres(string searchQuery); + Task> SearchStudios(string searchQuery); + Task> SearchPeople(string searchQuery); //Register values Task RegisterLibrary(Library library); diff --git a/Kyoo.Common/Controllers/IRepository.cs b/Kyoo.Common/Controllers/IRepository.cs index af30eb88..a63886ea 100644 --- a/Kyoo.Common/Controllers/IRepository.cs +++ b/Kyoo.Common/Controllers/IRepository.cs @@ -9,31 +9,35 @@ namespace Kyoo.Controllers { Task Get(long id); Task Get(string slug); - Task> Search(string query); - Task> GetAll(); + Task> Search(string query); + Task> GetAll(); Task Create([NotNull] T obj); Task CreateIfNotExists([NotNull] T obj); Task Edit([NotNull] T edited, bool resetOld); Task Delete(T obj); } - - public interface IShowRepository : IRepository {} + + public interface IShowRepository : IRepository + { + Task GetByPath(string path); + Task AddShowLink(long showID, long? libraryID, long? collectionID); + } public interface ISeasonRepository : IRepository { Task Get(string showSlug, long seasonNumber); - Task> GetSeasons(long showID); - Task> GetSeasons(string showSlug); + Task> GetSeasons(long showID); + Task> GetSeasons(string showSlug); } public interface IEpisodeRepository : IRepository { Task Get(string showSlug, long seasonNumber, long episodeNumber); - Task> GetEpisodes(long showID, long seasonNumber); - Task> GetEpisodes(string showSlug, long seasonNumber); - Task> GetEpisodes(long seasonID); + Task> GetEpisodes(long showID, long seasonNumber); + Task> GetEpisodes(string showSlug, long seasonNumber); + Task> GetEpisodes(long seasonID); } public interface ITrackRepository : IRepository diff --git a/Kyoo.Common/Models/Task.cs b/Kyoo.Common/Models/Task.cs index f00b24c2..76cfbc52 100644 --- a/Kyoo.Common/Models/Task.cs +++ b/Kyoo.Common/Models/Task.cs @@ -14,7 +14,7 @@ namespace Kyoo.Models public bool RunOnStartup { get; } public int Priority { get; } public Task Run(IServiceProvider serviceProvider, CancellationToken cancellationToken, string arguments = null); - public IEnumerable GetPossibleParameters(); + public Task> GetPossibleParameters(); public int? Progress(); } } \ No newline at end of file diff --git a/Kyoo/Controllers/LibraryManager.cs b/Kyoo/Controllers/LibraryManager.cs index 60ca9f79..82f8f5ea 100644 --- a/Kyoo/Controllers/LibraryManager.cs +++ b/Kyoo/Controllers/LibraryManager.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Threading.Tasks; using Kyoo.Models; @@ -86,117 +87,134 @@ namespace Kyoo.Controllers return _people.Get(slug); } - public Task> GetLibraries() + public Task> GetLibraries() { return _libraries.GetAll(); } - public Task> GetCollections() + public Task> GetCollections() { return _collections.GetAll(); } - public Task> GetShows() + public Task> GetShows() { return _shows.GetAll(); } - public Task> GetSeasons() + public Task> GetSeasons() { return _seasons.GetAll(); } - public Task> GetEpisodes() + public Task> GetEpisodes() { return _episodes.GetAll(); } - public Task> GetTracks() + public Task> GetTracks() { return _tracks.GetAll(); } - public Task> GetStudios() + public Task> GetStudios() { return _studios.GetAll(); } - public Task> GetPeoples() + public Task> GetPeoples() { return _people.GetAll(); } - public Task> GetGenres() + public Task> GetGenres() { return _genres.GetAll(); } - public Task> GetProviders() + public Task> GetProviders() { return _providers.GetAll(); } - public Task> GetSeasons(long showID) + public Task> GetSeasons(long showID) { return _seasons.GetSeasons(showID); } - public Task> GetSeasons(string showSlug) + public Task> GetSeasons(string showSlug) { return _seasons.GetSeasons(showSlug); } - public Task> GetEpisodes(long showID, long seasonNumber) + public Task> GetEpisodes(long showID, long seasonNumber) { return _episodes.GetEpisodes(showID, seasonNumber); } - public Task> GetEpisodes(string showSlug, long seasonNumber) + public Task> GetEpisodes(string showSlug, long seasonNumber) { return _episodes.GetEpisodes(showSlug, seasonNumber); } - public Task> GetEpisodes(long seasonID) + public Task> GetEpisodes(long seasonID) { return _episodes.GetEpisodes(seasonID); } - public Task> SearchLibraries(string searchQuery) + public Task GetShowByPath(string path) + { + return _shows.GetByPath(path); + } + + public Task AddShowLink(long showID, long? libraryID, long? collectionID) + { + return _shows.AddShowLink(showID, libraryID, collectionID); + } + + public Task AddShowLink(Show show, Library library, Collection collection) + { + if (show == null) + throw new ArgumentNullException(nameof(show)); + return AddShowLink(show.ID, library?.ID, collection?.ID); + } + + public Task> SearchLibraries(string searchQuery) { return _libraries.Search(searchQuery); } - public Task> SearchCollections(string searchQuery) + public Task> SearchCollections(string searchQuery) { return _collections.Search(searchQuery); } - public Task> SearchShows(string searchQuery) + public Task> SearchShows(string searchQuery) { return _shows.Search(searchQuery); } - public Task> SearchSeasons(string searchQuery) + public Task> SearchSeasons(string searchQuery) { return _seasons.Search(searchQuery); } - public Task> SearchEpisodes(string searchQuery) + public Task> SearchEpisodes(string searchQuery) { return _episodes.Search(searchQuery); } - public Task> SearchGenres(string searchQuery) + public Task> SearchGenres(string searchQuery) { return _genres.Search(searchQuery); } - public Task> SearchStudios(string searchQuery) + public Task> SearchStudios(string searchQuery) { return _studios.Search(searchQuery); } - public Task> SearchPeople(string searchQuery) + public Task> SearchPeople(string searchQuery) { return _people.Search(searchQuery); } diff --git a/Kyoo/Controllers/Repositories/CollectionRepository.cs b/Kyoo/Controllers/Repositories/CollectionRepository.cs index c0b38434..476ffd67 100644 --- a/Kyoo/Controllers/Repositories/CollectionRepository.cs +++ b/Kyoo/Controllers/Repositories/CollectionRepository.cs @@ -28,7 +28,7 @@ namespace Kyoo.Controllers return _database.Collections.FirstOrDefaultAsync(x => x.Slug == slug); } - public async Task> Search(string query) + public async Task> Search(string query) { return await _database.Collections .Where(x => EF.Functions.Like(x.Name, $"%{query}%")) @@ -36,7 +36,7 @@ namespace Kyoo.Controllers .ToListAsync(); } - public async Task> GetAll() + public async Task> GetAll() { return await _database.Collections.ToListAsync(); } diff --git a/Kyoo/Controllers/Repositories/EpisodeRepository.cs b/Kyoo/Controllers/Repositories/EpisodeRepository.cs index 71fcfebd..dd92ad85 100644 --- a/Kyoo/Controllers/Repositories/EpisodeRepository.cs +++ b/Kyoo/Controllers/Repositories/EpisodeRepository.cs @@ -46,7 +46,7 @@ namespace Kyoo.Controllers && x.EpisodeNumber == episodeNumber); } - public async Task> Search(string query) + public async Task> Search(string query) { return await _database.Episodes .Where(x => EF.Functions.Like(x.Title, $"%{query}%")) @@ -54,7 +54,7 @@ namespace Kyoo.Controllers .ToListAsync(); } - public async Task> GetAll() + public async Task> GetAll() { return await _database.Episodes.ToListAsync(); } @@ -64,10 +64,7 @@ namespace Kyoo.Controllers if (obj == null) throw new ArgumentNullException(nameof(obj)); - obj.Show = null; - obj.Season = null; await Validate(obj); - await _database.Episodes.AddAsync(obj); await _database.SaveChangesAsync(); return obj.ID; @@ -120,19 +117,19 @@ namespace Kyoo.Controllers await _database.SaveChangesAsync(); } - public async Task> GetEpisodes(long showID, long seasonNumber) + public async Task> GetEpisodes(long showID, long seasonNumber) { return await _database.Episodes.Where(x => x.ShowID == showID && x.SeasonNumber == seasonNumber).ToListAsync(); } - public async Task> GetEpisodes(string showSlug, long seasonNumber) + public async Task> GetEpisodes(string showSlug, long seasonNumber) { return await _database.Episodes.Where(x => x.Show.Slug == showSlug && x.SeasonNumber == seasonNumber).ToListAsync(); } - public async Task> GetEpisodes(long seasonID) + public async Task> GetEpisodes(long seasonID) { return await _database.Episodes.Where(x => x.SeasonID == seasonID).ToListAsync(); } diff --git a/Kyoo/Controllers/Repositories/GenreRepository.cs b/Kyoo/Controllers/Repositories/GenreRepository.cs index 5544c07b..1035e54b 100644 --- a/Kyoo/Controllers/Repositories/GenreRepository.cs +++ b/Kyoo/Controllers/Repositories/GenreRepository.cs @@ -28,7 +28,7 @@ namespace Kyoo.Controllers return await _database.Genres.FirstOrDefaultAsync(x => x.Slug == slug); } - public async Task> Search(string query) + public async Task> Search(string query) { return await _database.Genres .Where(genre => EF.Functions.Like(genre.Name, $"%{query}%")) @@ -36,7 +36,7 @@ namespace Kyoo.Controllers .ToListAsync(); } - public async Task> GetAll() + public async Task> GetAll() { return await _database.Genres.ToListAsync(); } diff --git a/Kyoo/Controllers/Repositories/LibraryRepository.cs b/Kyoo/Controllers/Repositories/LibraryRepository.cs index bac6e6ba..c73af246 100644 --- a/Kyoo/Controllers/Repositories/LibraryRepository.cs +++ b/Kyoo/Controllers/Repositories/LibraryRepository.cs @@ -30,7 +30,7 @@ namespace Kyoo.Controllers return _database.Libraries.FirstOrDefaultAsync(x => x.Name == slug); } - public async Task> Search(string query) + public async Task> Search(string query) { return await _database.Libraries .Where(x => EF.Functions.Like(x.Name, $"%{query}%")) @@ -38,7 +38,7 @@ namespace Kyoo.Controllers .ToListAsync(); } - public async Task> GetAll() + public async Task> GetAll() { return await _database.Libraries.ToListAsync(); } diff --git a/Kyoo/Controllers/Repositories/PeopleRepository.cs b/Kyoo/Controllers/Repositories/PeopleRepository.cs index f6a85c1a..0b702be5 100644 --- a/Kyoo/Controllers/Repositories/PeopleRepository.cs +++ b/Kyoo/Controllers/Repositories/PeopleRepository.cs @@ -29,7 +29,7 @@ namespace Kyoo.Controllers return _database.Peoples.FirstOrDefaultAsync(x => x.Slug == slug); } - public async Task> Search(string query) + public async Task> Search(string query) { return await _database.Peoples .Where(people => EF.Functions.Like(people.Name, $"%{query}%")) @@ -37,7 +37,7 @@ namespace Kyoo.Controllers .ToListAsync(); } - public async Task> GetAll() + public async Task> GetAll() { return await _database.Peoples.ToListAsync(); } diff --git a/Kyoo/Controllers/Repositories/ProviderRepository.cs b/Kyoo/Controllers/Repositories/ProviderRepository.cs index 01e2898a..4f9b85aa 100644 --- a/Kyoo/Controllers/Repositories/ProviderRepository.cs +++ b/Kyoo/Controllers/Repositories/ProviderRepository.cs @@ -28,7 +28,7 @@ namespace Kyoo.Controllers return await _database.Providers.FirstOrDefaultAsync(x => x.Name == slug); } - public async Task> Search(string query) + public async Task> Search(string query) { return await _database.Providers .Where(x => EF.Functions.Like(x.Name, $"%{query}%")) @@ -36,7 +36,7 @@ namespace Kyoo.Controllers .ToListAsync(); } - public async Task> GetAll() + public async Task> GetAll() { return await _database.Providers.ToListAsync(); } diff --git a/Kyoo/Controllers/Repositories/SeasonRepository.cs b/Kyoo/Controllers/Repositories/SeasonRepository.cs index 98d1fe26..686308dc 100644 --- a/Kyoo/Controllers/Repositories/SeasonRepository.cs +++ b/Kyoo/Controllers/Repositories/SeasonRepository.cs @@ -42,7 +42,7 @@ namespace Kyoo.Controllers && x.SeasonNumber == seasonNumber); } - public async Task> Search(string query) + public async Task> Search(string query) { return await _database.Seasons .Where(x => EF.Functions.Like(x.Title, $"%{query}%")) @@ -50,7 +50,7 @@ namespace Kyoo.Controllers .ToListAsync(); } - public async Task> GetAll() + public async Task> GetAll() { return await _database.Seasons.ToListAsync(); } @@ -116,12 +116,12 @@ namespace Kyoo.Controllers await _database.SaveChangesAsync(); } - public async Task> GetSeasons(long showID) + public async Task> GetSeasons(long showID) { return await _database.Seasons.Where(x => x.ShowID == showID).ToListAsync(); } - public async Task> GetSeasons(string showSlug) + public async Task> GetSeasons(string showSlug) { return await _database.Seasons.Where(x => x.Show.Slug == showSlug).ToListAsync(); } diff --git a/Kyoo/Controllers/Repositories/ShowRepository.cs b/Kyoo/Controllers/Repositories/ShowRepository.cs index e0901cfc..21ce741b 100644 --- a/Kyoo/Controllers/Repositories/ShowRepository.cs +++ b/Kyoo/Controllers/Repositories/ShowRepository.cs @@ -39,7 +39,12 @@ namespace Kyoo.Controllers return await _database.Shows.FirstOrDefaultAsync(x => x.Slug == slug); } - public async Task> Search(string query) + public async Task GetByPath(string path) + { + return await _database.Shows.FirstOrDefaultAsync(x => x.Path == path); + } + + public async Task> Search(string query) { return await _database.Shows .FromSqlInterpolated($@"SELECT * FROM Shows WHERE Shows.Title LIKE {$"%{query}%"} @@ -48,7 +53,7 @@ namespace Kyoo.Controllers .ToListAsync(); } - public async Task> GetAll() + public async Task> GetAll() { return await _database.Shows.ToListAsync(); } @@ -121,5 +126,28 @@ namespace Kyoo.Controllers _database.Shows.Remove(show); await _database.SaveChangesAsync(); } + + public Task AddShowLink(long showID, long? libraryID, long? collectionID) + { + if (collectionID != null) + { + _database.CollectionLinks.AddIfNotExist(new CollectionLink { CollectionID = collectionID, ShowID = showID}, + x => x.CollectionID == collectionID && x.ShowID == showID); + } + if (libraryID != null) + { + _database.LibraryLinks.AddIfNotExist(new LibraryLink {LibraryID = libraryID.Value, ShowID = showID}, + x => x.LibraryID == libraryID.Value && x.CollectionID == null && x.ShowID == showID); + } + + if (libraryID != null && collectionID != null) + { + _database.LibraryLinks.AddIfNotExist( + new LibraryLink {LibraryID = libraryID.Value, CollectionID = collectionID.Value}, + x => x.LibraryID == libraryID && x.CollectionID == collectionID && x.ShowID == null); + } + + return Task.CompletedTask; + } } } \ No newline at end of file diff --git a/Kyoo/Controllers/Repositories/StudioRepository.cs b/Kyoo/Controllers/Repositories/StudioRepository.cs index c7d77f18..f531d7c1 100644 --- a/Kyoo/Controllers/Repositories/StudioRepository.cs +++ b/Kyoo/Controllers/Repositories/StudioRepository.cs @@ -28,7 +28,7 @@ namespace Kyoo.Controllers return await _database.Studios.FirstOrDefaultAsync(x => x.Name == slug); } - public async Task> Search(string query) + public async Task> Search(string query) { return await _database.Studios .Where(x => EF.Functions.Like(x.Name, $"%{query}%")) @@ -36,7 +36,7 @@ namespace Kyoo.Controllers .ToListAsync(); } - public async Task> GetAll() + public async Task> GetAll() { return await _database.Studios.ToListAsync(); } diff --git a/Kyoo/Controllers/Repositories/TrackRepository.cs b/Kyoo/Controllers/Repositories/TrackRepository.cs index a5d58aa0..be67ab2c 100644 --- a/Kyoo/Controllers/Repositories/TrackRepository.cs +++ b/Kyoo/Controllers/Repositories/TrackRepository.cs @@ -34,12 +34,12 @@ namespace Kyoo.Controllers && x.IsForced == isForced); } - public Task> Search(string query) + public Task> Search(string query) { throw new InvalidOperationException("Tracks do not support the search method."); } - public async Task> GetAll() + public async Task> GetAll() { return await _database.Tracks.ToListAsync(); } diff --git a/Kyoo/Tasks/Crawler.cs b/Kyoo/Tasks/Crawler.cs index 065bc613..70a88b6c 100644 --- a/Kyoo/Tasks/Crawler.cs +++ b/Kyoo/Tasks/Crawler.cs @@ -8,7 +8,6 @@ using System.Text.RegularExpressions; using System.Threading; using System.Threading.Tasks; using Kyoo.Models.Watch; -using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; namespace Kyoo.Controllers @@ -28,11 +27,11 @@ namespace Kyoo.Controllers private ITranscoder _transcoder; private IConfiguration _config; - public IEnumerable GetPossibleParameters() + public async Task> GetPossibleParameters() { using IServiceScope serviceScope = _serviceProvider.CreateScope(); ILibraryManager libraryManager = serviceScope.ServiceProvider.GetService(); - return libraryManager.GetLibraries().Select(x => x.Slug); + return (await libraryManager.GetLibraries()).Select(x => x.Slug); } public int? Progress() @@ -53,28 +52,27 @@ namespace Kyoo.Controllers { using IServiceScope serviceScope = _serviceProvider.CreateScope(); ILibraryManager libraryManager = serviceScope.ServiceProvider.GetService(); - IEnumerable episodes = libraryManager.GetEpisodes(); - IEnumerable libraries = argument == null - ? libraryManager.GetLibraries() - : new [] {libraryManager.GetLibrary(argument)}; + ICollection episodes = await libraryManager.GetEpisodes(); + ICollection libraries = argument == null + ? await libraryManager.GetLibraries() + : new [] { await libraryManager.GetLibrary(argument)}; foreach (Episode episode in episodes) { if (!File.Exists(episode.Path)) - libraryManager.RemoveEpisode(episode); + await libraryManager.DeleteEpisode(episode); } - await libraryManager.SaveChanges(); - await Task.WhenAll(libraries.ToList().Select(x => Scan(x, libraryManager, cancellationToken))); + await Task.WhenAll(libraries.Select(x => Scan(x, episodes, cancellationToken))); } catch (Exception ex) { - Console.Error.WriteLine($"Unknown exception thrown durring libraries scan.\nException: {ex.Message}"); + await Console.Error.WriteLineAsync($"Unknown exception thrown durring libraries scan.\nException: {ex.Message}"); } Console.WriteLine("Scan finished!"); } - private Task Scan(Library library, ILibraryManager libraryManager, CancellationToken cancellationToken) + private Task Scan(Library library, ICollection episodes, CancellationToken cancellationToken) { Console.WriteLine($"Scanning library {library.Name} at {string.Join(", ", library.Paths)}."); return Task.WhenAll(library.Paths.Select(async path => @@ -89,29 +87,29 @@ namespace Kyoo.Controllers } catch (DirectoryNotFoundException) { - Console.Error.WriteLine($"The library's directory {path} could not be found (library slug: {library.Slug})"); + await Console.Error.WriteLineAsync($"The library's directory {path} could not be found (library slug: {library.Slug})"); return Task.CompletedTask; } catch (PathTooLongException) { - Console.Error.WriteLine($"The library's directory {path} is too long for this system. (library slug: {library.Slug})"); + await Console.Error.WriteLineAsync($"The library's directory {path} is too long for this system. (library slug: {library.Slug})"); return Task.CompletedTask; } catch (ArgumentException) { - Console.Error.WriteLine($"The library's directory {path} is invalid. (library slug: {library.Slug})"); + await Console.Error.WriteLineAsync($"The library's directory {path} is invalid. (library slug: {library.Slug})"); return Task.CompletedTask; } catch (UnauthorizedAccessException) { - Console.Error.WriteLine($"Permission denied: can't access library's directory at {path}. (library slug: {library.Slug})"); + await Console.Error.WriteLineAsync($"Permission denied: can't access library's directory at {path}. (library slug: {library.Slug})"); return Task.CompletedTask; } // return Task.WhenAll(files.Select(file => foreach (string file in files) { - if (!IsVideo(file) || libraryManager.GetEpisodes().Any(x => x.Path == file)) + if (!IsVideo(file) || episodes.Any(x => x.Path == file)) continue; //return Task.CompletedTask; string relativePath = file.Substring(path.Length); /*return*/ await RegisterFile(file, relativePath, library, cancellationToken); @@ -128,7 +126,6 @@ namespace Kyoo.Controllers using IServiceScope serviceScope = _serviceProvider.CreateScope(); ILibraryManager libraryManager = serviceScope.ServiceProvider.GetService(); - ((DbSet)libraryManager.GetLibraries()).Attach(library); string patern = _config.GetValue("regex"); Regex regex = new Regex(patern, RegexOptions.IgnoreCase); @@ -145,66 +142,88 @@ namespace Kyoo.Controllers bool isMovie = seasonNumber == -1 && episodeNumber == -1 && absoluteNumber == -1; Show show = await GetShow(libraryManager, showName, showPath, isMovie, library); if (isMovie) - libraryManager.Register(await GetMovie(show, path)); + await libraryManager.RegisterEpisode(await GetMovie(show, path)); else { Season season = await GetSeason(libraryManager, show, seasonNumber, library); Episode episode = await GetEpisode(libraryManager, show, season, episodeNumber, absoluteNumber, path, library); - libraryManager.Register(episode); + await libraryManager.RegisterEpisode(episode); } - if (collection != null) - libraryManager.Register(collection); - libraryManager.RegisterShowLinks(library, collection, show); - Console.WriteLine($"Registering episode at: {path}"); - await libraryManager.SaveChanges(); + + await libraryManager.AddShowLink(show, library, collection); + Console.WriteLine($"Episode at {path} registered."); } - private async Task GetCollection(ILibraryManager libraryManager, string collectionName, Library library) + private async Task GetCollection(ILibraryManager libraryManager, + string collectionName, + Library library) { if (string.IsNullOrEmpty(collectionName)) - return await Task.FromResult(null); - Collection name = libraryManager.GetCollection(Utility.ToSlug(collectionName)); - if (name != null) - return name; - return await _metadataProvider.GetCollectionFromName(collectionName, library); + return null; + Collection collection = await libraryManager.GetCollection(Utility.ToSlug(collectionName)); + if (collection != null) + return collection; + collection = await _metadataProvider.GetCollectionFromName(collectionName, library); + await libraryManager.RegisterCollection(collection); + return collection; } - private async Task GetShow(ILibraryManager libraryManager, string showTitle, string showPath, bool isMovie, Library library) + private async Task GetShow(ILibraryManager libraryManager, + string showTitle, + string showPath, + bool isMovie, + Library library) { - Show show = libraryManager.GetShowByPath(showPath); + Show show = await libraryManager.GetShowByPath(showPath); if (show != null) return show; show = await _metadataProvider.SearchShow(showTitle, isMovie, library); show.Path = showPath; show.People = await _metadataProvider.GetPeople(show, library); + await libraryManager.RegisterShow(show); await _thumbnailsManager.Validate(show.People); await _thumbnailsManager.Validate(show); return show; } - private async Task GetSeason(ILibraryManager libraryManager, Show show, long seasonNumber, Library library) + private async Task GetSeason(ILibraryManager libraryManager, + Show show, + long seasonNumber, + Library library) { if (seasonNumber == -1) return default; - Season season = libraryManager.GetSeason(show.Slug, seasonNumber); + Season season = await libraryManager.GetSeason(show.Slug, seasonNumber); if (season == null) { season = await _metadataProvider.GetSeason(show, seasonNumber, library); + await libraryManager.RegisterSeason(season); await _thumbnailsManager.Validate(season); } season.Show = show; return season; } - private async Task GetEpisode(ILibraryManager libraryManager, Show show, Season season, long episodeNumber, long absoluteNumber, string episodePath, Library library) + private async Task GetEpisode(ILibraryManager libraryManager, + Show show, + Season season, + long episodeNumber, + long absoluteNumber, + string episodePath, + Library library) { - Episode episode = await _metadataProvider.GetEpisode(show, episodePath, season?.SeasonNumber ?? -1, episodeNumber, absoluteNumber, library); - if (season == null) - season = await GetSeason(libraryManager, show, episode.SeasonNumber, library); + Episode episode = await _metadataProvider.GetEpisode(show, + episodePath, + season?.SeasonNumber ?? -1, + episodeNumber, + absoluteNumber, + library); + + season ??= await GetSeason(libraryManager, show, episode.SeasonNumber, library); episode.Season = season; if (season == null) { - await Console.Error.WriteLineAsync("\tError: You don't have any provider that support absolute epiode numbering. Install one and try again."); + await Console.Error.WriteLineAsync("Error: You don't have any provider that support absolute epiode numbering. Install one and try again."); return default; } diff --git a/Kyoo/Tasks/CreateDatabase.cs b/Kyoo/Tasks/CreateDatabase.cs index c5345ab4..d4e751dc 100644 --- a/Kyoo/Tasks/CreateDatabase.cs +++ b/Kyoo/Tasks/CreateDatabase.cs @@ -58,9 +58,9 @@ namespace Kyoo.Tasks return Task.CompletedTask; } - public IEnumerable GetPossibleParameters() + public Task> GetPossibleParameters() { - return null; + return Task.FromResult>(null); } public int? Progress() diff --git a/Kyoo/Tasks/MetadataLoader.cs b/Kyoo/Tasks/MetadataLoader.cs index 427eb22e..c66702c5 100644 --- a/Kyoo/Tasks/MetadataLoader.cs +++ b/Kyoo/Tasks/MetadataLoader.cs @@ -28,9 +28,9 @@ namespace Kyoo.Tasks return Task.CompletedTask; } - public IEnumerable GetPossibleParameters() + public Task> GetPossibleParameters() { - return null; + return Task.FromResult>(null); } public int? Progress() diff --git a/Kyoo/Tasks/PluginLoader.cs b/Kyoo/Tasks/PluginLoader.cs index a174caa5..b3f1c064 100644 --- a/Kyoo/Tasks/PluginLoader.cs +++ b/Kyoo/Tasks/PluginLoader.cs @@ -24,9 +24,9 @@ namespace Kyoo.Tasks return Task.CompletedTask; } - public IEnumerable GetPossibleParameters() + public Task> GetPossibleParameters() { - return null; + return Task.FromResult>(null); } public int? Progress() diff --git a/Kyoo/Tasks/ReScan.cs b/Kyoo/Tasks/ReScan.cs index aca39b6d..7ab182a7 100644 --- a/Kyoo/Tasks/ReScan.cs +++ b/Kyoo/Tasks/ReScan.cs @@ -114,9 +114,9 @@ namespace Kyoo.Tasks await _thumbnailsManager.Validate(edited, true); } - public IEnumerable GetPossibleParameters() + public Task> GetPossibleParameters() { - return default; + return Task.FromResult>(null); } public int? Progress()