Using scopes for the rescan task

This commit is contained in:
Zoe Roux 2020-05-08 02:32:51 +02:00
parent 90a7d6654e
commit 7f0302f832
4 changed files with 74 additions and 59 deletions

View File

@ -41,20 +41,20 @@ namespace Kyoo.Controllers
IEnumerable<Episode> GetEpisodes(string showSlug, long seasonNumber); IEnumerable<Episode> GetEpisodes(string showSlug, long seasonNumber);
//Register values //Register values
void Register(object obj); Task Register(object obj);
void RegisterShowLinks(Library library, Collection collection, Show show); Task RegisterShowLinks(Library library, Collection collection, Show show);
Task SaveChanges(); Task SaveChanges();
// Edit values // Edit values
void Edit(Library library, bool resetOld); Task Edit(Library library, bool resetOld);
void Edit(Collection collection, bool resetOld); Task Edit(Collection collection, bool resetOld);
void Edit(Show show, bool resetOld); Task Edit(Show show, bool resetOld);
void Edit(Season season, bool resetOld); Task Edit(Season season, bool resetOld);
void Edit(Episode episode, bool resetOld); Task Edit(Episode episode, bool resetOld);
void Edit(Track track, bool resetOld); Task Edit(Track track, bool resetOld);
void Edit(People people, bool resetOld); Task Edit(People people, bool resetOld);
void Edit(Studio studio, bool resetOld); Task Edit(Studio studio, bool resetOld);
void Edit(Genre genre, bool resetOld); Task Edit(Genre genre, bool resetOld);
// Validate values // Validate values
Library Validate(Library library); Library Validate(Library library);

View File

@ -168,14 +168,15 @@ namespace Kyoo.Controllers
#endregion #endregion
#region Register #region Register
public void Register(object obj) public Task Register(object obj)
{ {
if (obj == null) if (obj == null)
return; return Task.CompletedTask;
_database.Entry(obj).State = EntityState.Added; _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) if (collection != null)
{ {
@ -187,6 +188,8 @@ namespace Kyoo.Controllers
else else
_database.LibraryLinks.AddIfNotExist(new LibraryLink {Library = library, Show = show}, _database.LibraryLinks.AddIfNotExist(new LibraryLink {Library = library, Show = show},
x => x.Library == library && x.Collection == null && x.Show == show); x => x.Library == library && x.Collection == null && x.Show == show);
return _database.SaveChangesAsync();
} }
public Task SaveChanges() public Task SaveChanges()
@ -196,9 +199,9 @@ namespace Kyoo.Controllers
#endregion #endregion
#region Edit #region Edit
public void Edit(Library edited, bool resetOld) public Task Edit(Library edited, bool resetOld)
{ {
Edit(() => return Edit(() =>
{ {
var query = _database.Libraries var query = _database.Libraries
.Include(x => x.Providers); .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; var query = _database.Collections;
Collection old = _database.Entry(edited).IsKeySet Collection old = _database.Entry(edited).IsKeySet
@ -234,9 +237,9 @@ namespace Kyoo.Controllers
Validate(old); Validate(old);
}); });
} }
public void Edit(Show edited, bool resetOld) public Task Edit(Show edited, bool resetOld)
{ {
Edit(() => return Edit(() =>
{ {
var query = _database.Shows var query = _database.Shows
.Include(x => x.GenreLinks) .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 var query = _database.Seasons
.Include(x => x.ExternalIDs) .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 var query = _database.Episodes
.Include(x => x.ExternalIDs) .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); 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 var query = _database.Peoples
.Include(x => x.ExternalIDs); .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; var query = _database.Studios;
Studio old = _database.Entry(edited).IsKeySet 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; var query = _database.Genres;
Genre old = _database.Entry(edited).IsKeySet 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.LazyLoadingEnabled = false;
_database.ChangeTracker.AutoDetectChangesEnabled = false; _database.ChangeTracker.AutoDetectChangesEnabled = false;
@ -382,7 +385,7 @@ namespace Kyoo.Controllers
applyFunction.Invoke(); applyFunction.Invoke();
_database.ChangeTracker.DetectChanges(); _database.ChangeTracker.DetectChanges();
_database.SaveChanges(); await _database.SaveChangesAsync();
} }
finally finally
{ {

View File

@ -142,17 +142,16 @@ namespace Kyoo.Controllers
bool isMovie = seasonNumber == -1 && episodeNumber == -1 && absoluteNumber == -1; bool isMovie = seasonNumber == -1 && episodeNumber == -1 && absoluteNumber == -1;
Show show = await GetShow(libraryManager, showName, showPath, isMovie, library); Show show = await GetShow(libraryManager, showName, showPath, isMovie, library);
if (isMovie) if (isMovie)
libraryManager.Register(await GetMovie(show, path)); await libraryManager.Register(await GetMovie(show, path));
else else
{ {
Season season = await GetSeason(libraryManager, show, seasonNumber, library); Season season = await GetSeason(libraryManager, show, seasonNumber, library);
Episode episode = await GetEpisode(libraryManager, show, season, episodeNumber, absoluteNumber, path, library); Episode episode = await GetEpisode(libraryManager, show, season, episodeNumber, absoluteNumber, path, library);
libraryManager.Register(episode); await libraryManager.Register(episode);
} }
if (collection != null) if (collection != null)
libraryManager.Register(collection); await libraryManager.Register(collection);
libraryManager.RegisterShowLinks(library, collection, show); await libraryManager.RegisterShowLinks(library, collection, show);
await libraryManager.SaveChanges();
} }
private async Task<Collection> GetCollection(ILibraryManager libraryManager, string collectionName, Library library) private async Task<Collection> GetCollection(ILibraryManager libraryManager, string collectionName, Library library)

View File

@ -19,7 +19,7 @@ namespace Kyoo.Tasks
public int Priority => 0; public int Priority => 0;
private ILibraryManager _libraryManager; private IServiceProvider _serviceProvider;
private IThumbnailsManager _thumbnailsManager; private IThumbnailsManager _thumbnailsManager;
private IProviderManager _providerManager; private IProviderManager _providerManager;
private DatabaseContext _database; private DatabaseContext _database;
@ -27,9 +27,9 @@ namespace Kyoo.Tasks
public async 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>(); _serviceProvider = serviceProvider;
_thumbnailsManager = serviceScope.ServiceProvider.GetService<IThumbnailsManager>(); _thumbnailsManager = serviceProvider.GetService<IThumbnailsManager>();
_providerManager = serviceScope.ServiceProvider.GetService<IProviderManager>(); _providerManager = serviceProvider.GetService<IProviderManager>();
_database = serviceScope.ServiceProvider.GetService<DatabaseContext>(); _database = serviceScope.ServiceProvider.GetService<DatabaseContext>();
if (arguments == null || !arguments.Contains('/')) if (arguments == null || !arguments.Contains('/'))
@ -49,7 +49,12 @@ namespace Kyoo.Tasks
private async Task ReScanShow(string slug) private async Task ReScanShow(string slug)
{ {
Show old = _database.Shows.FirstOrDefault(x => x.Slug == slug); Show old;
using (IServiceScope serviceScope = _serviceProvider.CreateScope())
{
ILibraryManager libraryManager = serviceScope.ServiceProvider.GetService<ILibraryManager>();
old = _database.Shows.FirstOrDefault(x => x.Slug == slug);
if (old == null) if (old == null)
return; return;
Library library = _database.LibraryLinks.First(x => x.Show == old && x.Library != null).Library; Library library = _database.LibraryLinks.First(x => x.Show == old && x.Library != null).Library;
@ -57,8 +62,9 @@ namespace Kyoo.Tasks
edited.ID = old.ID; edited.ID = old.ID;
edited.Slug = old.Slug; edited.Slug = old.Slug;
edited.Path = old.Path; edited.Path = old.Path;
_libraryManager.Edit(edited, true); await libraryManager.Edit(edited, true);
await _thumbnailsManager.Validate(edited, true); await _thumbnailsManager.Validate(edited, true);
}
if (old.Seasons != null) if (old.Seasons != null)
await Task.WhenAll(old.Seasons.Select(x => ReScanSeason(old, x))); await Task.WhenAll(old.Seasons.Select(x => ReScanSeason(old, x)));
IEnumerable<Episode> orphans = old.Episodes.Where(x => x.Season == null).ToList(); IEnumerable<Episode> orphans = old.Episodes.Where(x => x.Season == null).ToList();
@ -83,21 +89,28 @@ namespace Kyoo.Tasks
private async Task ReScanSeason(Show show, Season old) private async Task ReScanSeason(Show show, Season old)
{ {
using (IServiceScope serviceScope = _serviceProvider.CreateScope())
{
ILibraryManager libraryManager = serviceScope.ServiceProvider.GetService<ILibraryManager>();
Library library = _database.LibraryLinks.First(x => x.Show == show && x.Library != null).Library; Library library = _database.LibraryLinks.First(x => x.Show == show && x.Library != null).Library;
Season edited = await _providerManager.GetSeason(show, old.SeasonNumber, library); Season edited = await _providerManager.GetSeason(show, old.SeasonNumber, library);
edited.ID = old.ID; edited.ID = old.ID;
_libraryManager.Edit(edited, true); await libraryManager.Edit(edited, true);
await _thumbnailsManager.Validate(edited, true); await _thumbnailsManager.Validate(edited, true);
}
if (old.Episodes != null) if (old.Episodes != null)
await Task.WhenAll(old.Episodes.Select(x => ReScanEpisode(show, x))); await Task.WhenAll(old.Episodes.Select(x => ReScanEpisode(show, x)));
} }
private async Task ReScanEpisode(Show show, Episode old) private async Task ReScanEpisode(Show show, Episode old)
{ {
using IServiceScope serviceScope = _serviceProvider.CreateScope();
ILibraryManager libraryManager = serviceScope.ServiceProvider.GetService<ILibraryManager>();
Library library = _database.LibraryLinks.First(x => x.Show == show && x.Library != null).Library; 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); Episode edited = await _providerManager.GetEpisode(show, old.Path, old.SeasonNumber, old.EpisodeNumber, old.AbsoluteNumber, library);
edited.ID = old.ID; edited.ID = old.ID;
_libraryManager.Edit(edited, true); await libraryManager.Edit(edited, true);
await _thumbnailsManager.Validate(edited, true); await _thumbnailsManager.Validate(edited, true);
} }