diff --git a/Kyoo.Common/Controllers/ILibraryManager.cs b/Kyoo.Common/Controllers/ILibraryManager.cs index c2aef739..5ecf4495 100644 --- a/Kyoo.Common/Controllers/ILibraryManager.cs +++ b/Kyoo.Common/Controllers/ILibraryManager.cs @@ -41,20 +41,20 @@ namespace Kyoo.Controllers IEnumerable GetEpisodes(string showSlug, long seasonNumber); //Register values - void Register(object obj); - void RegisterShowLinks(Library library, Collection collection, Show show); + Task Register(object obj); + Task RegisterShowLinks(Library library, Collection collection, Show show); Task SaveChanges(); // Edit values - void Edit(Library library, bool resetOld); - void Edit(Collection collection, bool resetOld); - void Edit(Show show, bool resetOld); - void Edit(Season season, bool resetOld); - void Edit(Episode episode, bool resetOld); - void Edit(Track track, bool resetOld); - void Edit(People people, bool resetOld); - void Edit(Studio studio, bool resetOld); - void Edit(Genre genre, bool resetOld); + Task Edit(Library library, bool resetOld); + Task Edit(Collection collection, bool resetOld); + Task Edit(Show show, bool resetOld); + Task Edit(Season season, bool resetOld); + Task Edit(Episode episode, bool resetOld); + Task Edit(Track track, bool resetOld); + Task Edit(People people, bool resetOld); + Task Edit(Studio studio, bool resetOld); + Task Edit(Genre genre, bool resetOld); // Validate values Library Validate(Library library); diff --git a/Kyoo/Controllers/LibraryManager.cs b/Kyoo/Controllers/LibraryManager.cs index 69499273..d29aee5c 100644 --- a/Kyoo/Controllers/LibraryManager.cs +++ b/Kyoo/Controllers/LibraryManager.cs @@ -168,14 +168,15 @@ namespace Kyoo.Controllers #endregion #region Register - public void Register(object obj) + public Task Register(object obj) { if (obj == null) - return; + return Task.CompletedTask; _database.Entry(obj).State = EntityState.Added; + return _database.SaveChangesAsync(); } - public void RegisterShowLinks(Library library, Collection collection, Show show) + public Task RegisterShowLinks(Library library, Collection collection, Show show) { if (collection != null) { @@ -187,6 +188,8 @@ namespace Kyoo.Controllers else _database.LibraryLinks.AddIfNotExist(new LibraryLink {Library = library, Show = show}, x => x.Library == library && x.Collection == null && x.Show == show); + + return _database.SaveChangesAsync(); } public Task SaveChanges() @@ -196,9 +199,9 @@ namespace Kyoo.Controllers #endregion #region Edit - public void Edit(Library edited, bool resetOld) + public Task Edit(Library edited, bool resetOld) { - Edit(() => + return Edit(() => { var query = _database.Libraries .Include(x => x.Providers); @@ -216,9 +219,9 @@ namespace Kyoo.Controllers }); } - public void Edit(Collection edited, bool resetOld) + public Task Edit(Collection edited, bool resetOld) { - Edit(() => + return Edit(() => { var query = _database.Collections; Collection old = _database.Entry(edited).IsKeySet @@ -234,9 +237,9 @@ namespace Kyoo.Controllers Validate(old); }); } - public void Edit(Show edited, bool resetOld) + public Task Edit(Show edited, bool resetOld) { - Edit(() => + return Edit(() => { var query = _database.Shows .Include(x => x.GenreLinks) @@ -256,9 +259,9 @@ namespace Kyoo.Controllers }); } - public void Edit(Season edited, bool resetOld) + public Task Edit(Season edited, bool resetOld) { - Edit(() => + return Edit(() => { var query = _database.Seasons .Include(x => x.ExternalIDs) @@ -277,9 +280,9 @@ namespace Kyoo.Controllers }); } - public void Edit(Episode edited, bool resetOld) + public Task Edit(Episode edited, bool resetOld) { - Edit(() => + return Edit(() => { var query = _database.Episodes .Include(x => x.ExternalIDs) @@ -299,9 +302,9 @@ namespace Kyoo.Controllers }); } - public void Edit(Track edited, bool resetOld) + public Task Edit(Track edited, bool resetOld) { - Edit(() => + return Edit(() => { Track old = _database.Tracks.FirstOrDefault(x => x.ID == edited.ID); @@ -314,9 +317,9 @@ namespace Kyoo.Controllers }); } - public void Edit(People edited, bool resetOld) + public Task Edit(People edited, bool resetOld) { - Edit(() => + return Edit(() => { var query = _database.Peoples .Include(x => x.ExternalIDs); @@ -334,9 +337,9 @@ namespace Kyoo.Controllers }); } - public void Edit(Studio edited, bool resetOld) + public Task Edit(Studio edited, bool resetOld) { - Edit(() => + return Edit(() => { var query = _database.Studios; Studio old = _database.Entry(edited).IsKeySet @@ -353,9 +356,9 @@ namespace Kyoo.Controllers }); } - public void Edit(Genre edited, bool resetOld) + public Task Edit(Genre edited, bool resetOld) { - Edit(() => + return Edit(() => { var query = _database.Genres; Genre old = _database.Entry(edited).IsKeySet @@ -372,7 +375,7 @@ namespace Kyoo.Controllers }); } - private void Edit(Action applyFunction) + private async Task Edit(Action applyFunction) { _database.ChangeTracker.LazyLoadingEnabled = false; _database.ChangeTracker.AutoDetectChangesEnabled = false; @@ -382,7 +385,7 @@ namespace Kyoo.Controllers applyFunction.Invoke(); _database.ChangeTracker.DetectChanges(); - _database.SaveChanges(); + await _database.SaveChangesAsync(); } finally { diff --git a/Kyoo/Tasks/Crawler.cs b/Kyoo/Tasks/Crawler.cs index 1ffdb8c6..19570b88 100644 --- a/Kyoo/Tasks/Crawler.cs +++ b/Kyoo/Tasks/Crawler.cs @@ -142,17 +142,16 @@ 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.Register(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.Register(episode); } if (collection != null) - libraryManager.Register(collection); - libraryManager.RegisterShowLinks(library, collection, show); - await libraryManager.SaveChanges(); + await libraryManager.Register(collection); + await libraryManager.RegisterShowLinks(library, collection, show); } private async Task GetCollection(ILibraryManager libraryManager, string collectionName, Library library) diff --git a/Kyoo/Tasks/ReScan.cs b/Kyoo/Tasks/ReScan.cs index ee592fb8..22c7aeb5 100644 --- a/Kyoo/Tasks/ReScan.cs +++ b/Kyoo/Tasks/ReScan.cs @@ -19,7 +19,7 @@ namespace Kyoo.Tasks public int Priority => 0; - private ILibraryManager _libraryManager; + private IServiceProvider _serviceProvider; private IThumbnailsManager _thumbnailsManager; private IProviderManager _providerManager; private DatabaseContext _database; @@ -27,9 +27,9 @@ namespace Kyoo.Tasks public async Task Run(IServiceProvider serviceProvider, CancellationToken cancellationToken, string arguments = null) { using IServiceScope serviceScope = serviceProvider.CreateScope(); - _libraryManager = serviceScope.ServiceProvider.GetService(); - _thumbnailsManager = serviceScope.ServiceProvider.GetService(); - _providerManager = serviceScope.ServiceProvider.GetService(); + _serviceProvider = serviceProvider; + _thumbnailsManager = serviceProvider.GetService(); + _providerManager = serviceProvider.GetService(); _database = serviceScope.ServiceProvider.GetService(); if (arguments == null || !arguments.Contains('/')) @@ -49,16 +49,22 @@ namespace Kyoo.Tasks private async Task ReScanShow(string slug) { - Show old = _database.Shows.FirstOrDefault(x => x.Slug == slug); - if (old == null) - return; - Library library = _database.LibraryLinks.First(x => x.Show == old && x.Library != null).Library; - Show edited = await _providerManager.CompleteShow(old, library); - edited.ID = old.ID; - edited.Slug = old.Slug; - edited.Path = old.Path; - _libraryManager.Edit(edited, true); - await _thumbnailsManager.Validate(edited, true); + Show old; + + using (IServiceScope serviceScope = _serviceProvider.CreateScope()) + { + ILibraryManager libraryManager = serviceScope.ServiceProvider.GetService(); + old = _database.Shows.FirstOrDefault(x => x.Slug == slug); + if (old == null) + return; + Library library = _database.LibraryLinks.First(x => x.Show == old && x.Library != null).Library; + Show edited = await _providerManager.CompleteShow(old, library); + edited.ID = old.ID; + edited.Slug = old.Slug; + edited.Path = old.Path; + await libraryManager.Edit(edited, true); + await _thumbnailsManager.Validate(edited, true); + } if (old.Seasons != null) await Task.WhenAll(old.Seasons.Select(x => ReScanSeason(old, x))); IEnumerable orphans = old.Episodes.Where(x => x.Season == null).ToList(); @@ -83,21 +89,28 @@ namespace Kyoo.Tasks private async Task ReScanSeason(Show show, Season old) { - Library library = _database.LibraryLinks.First(x => x.Show == show && x.Library != null).Library; - Season edited = await _providerManager.GetSeason(show, old.SeasonNumber, library); - edited.ID = old.ID; - _libraryManager.Edit(edited, true); - await _thumbnailsManager.Validate(edited, true); + using (IServiceScope serviceScope = _serviceProvider.CreateScope()) + { + ILibraryManager libraryManager = serviceScope.ServiceProvider.GetService(); + Library library = _database.LibraryLinks.First(x => x.Show == show && x.Library != null).Library; + Season edited = await _providerManager.GetSeason(show, old.SeasonNumber, library); + edited.ID = old.ID; + await libraryManager.Edit(edited, true); + await _thumbnailsManager.Validate(edited, true); + } if (old.Episodes != null) await Task.WhenAll(old.Episodes.Select(x => ReScanEpisode(show, x))); } private async Task ReScanEpisode(Show show, Episode old) { + using IServiceScope serviceScope = _serviceProvider.CreateScope(); + ILibraryManager libraryManager = serviceScope.ServiceProvider.GetService(); + Library library = _database.LibraryLinks.First(x => x.Show == show && x.Library != null).Library; Episode edited = await _providerManager.GetEpisode(show, old.Path, old.SeasonNumber, old.EpisodeNumber, old.AbsoluteNumber, library); edited.ID = old.ID; - _libraryManager.Edit(edited, true); + await libraryManager.Edit(edited, true); await _thumbnailsManager.Validate(edited, true); }