Fixing duplicated seasons

This commit is contained in:
Zoe Roux 2020-06-18 15:43:25 +02:00
parent ef84a969b7
commit 7be4133af9
8 changed files with 34 additions and 33 deletions

View File

@ -30,9 +30,9 @@ namespace Kyoo.Controllers
return _database.DisposeAsync(); return _database.DisposeAsync();
} }
public async Task<Season> Get(int id) public Task<Season> Get(int id)
{ {
return await _database.Seasons.FirstOrDefaultAsync(x => x.ID == id); return _database.Seasons.FirstOrDefaultAsync(x => x.ID == id);
} }
public Task<Season> Get(string slug) public Task<Season> Get(string slug)
@ -46,9 +46,9 @@ namespace Kyoo.Controllers
return Get(showSlug, seasonNumber); return Get(showSlug, seasonNumber);
} }
public async Task<Season> Get(string showSlug, int seasonNumber) public Task<Season> Get(string showSlug, int seasonNumber)
{ {
return await _database.Seasons.FirstOrDefaultAsync(x => x.Show.Slug == showSlug return _database.Seasons.FirstOrDefaultAsync(x => x.Show.Slug == showSlug
&& x.SeasonNumber == seasonNumber); && x.SeasonNumber == seasonNumber);
} }

View File

@ -58,8 +58,8 @@ namespace Kyoo.Controllers
public async Task<ICollection<Show>> Search(string query) public async Task<ICollection<Show>> Search(string query)
{ {
return await _database.Shows return await _database.Shows
.FromSqlInterpolated($@"SELECT * FROM Shows WHERE Shows.Title LIKE {$"%{query}%"} .FromSqlInterpolated($@"SELECT * FROM Shows WHERE 'Shows.Title' LIKE {$"%{query}%"}
OR Shows.Aliases LIKE {$"%{query}%"}") OR 'Shows.Aliases' LIKE {$"%{query}%"}")
.Take(20) .Take(20)
.ToListAsync(); .ToListAsync();
} }

View File

@ -136,15 +136,18 @@ namespace Kyoo
modelBuilder.Entity<People>() modelBuilder.Entity<People>()
.HasIndex(x => x.Slug) .HasIndex(x => x.Slug)
.IsUnique(); .IsUnique();
modelBuilder.Entity<Show>()
.HasIndex(x => x.Slug)
.IsUnique();
modelBuilder.Entity<Studio>() modelBuilder.Entity<Studio>()
.HasIndex(x => x.Slug) .HasIndex(x => x.Slug)
.IsUnique(); .IsUnique();
modelBuilder.Entity<ProviderID>() modelBuilder.Entity<ProviderID>()
.HasIndex(x => x.Name) .HasIndex(x => x.Name)
.IsUnique(); .IsUnique();
modelBuilder.Entity<Season>()
.HasIndex(x => new {x.ShowID, x.SeasonNumber})
.IsUnique();
modelBuilder.Entity<Episode>()
.HasIndex(x => new {x.ShowID, x.SeasonNumber, x.EpisodeNumber, x.AbsoluteNumber})
.IsUnique();
} }
public void DiscardChanges() public void DiscardChanges()

View File

@ -10,7 +10,7 @@ using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
namespace Kyoo.Models.DatabaseMigrations.Internal namespace Kyoo.Models.DatabaseMigrations.Internal
{ {
[DbContext(typeof(DatabaseContext))] [DbContext(typeof(DatabaseContext))]
[Migration("20200607010830_Initial")] [Migration("20200618133537_Initial")]
partial class Initial partial class Initial
{ {
protected override void BuildTargetModel(ModelBuilder modelBuilder) protected override void BuildTargetModel(ModelBuilder modelBuilder)
@ -117,7 +117,8 @@ namespace Kyoo.Models.DatabaseMigrations.Internal
b.HasIndex("SeasonID"); b.HasIndex("SeasonID");
b.HasIndex("ShowID"); b.HasIndex("ShowID", "SeasonNumber", "EpisodeNumber", "AbsoluteNumber")
.IsUnique();
b.ToTable("Episodes"); b.ToTable("Episodes");
}); });
@ -374,7 +375,8 @@ namespace Kyoo.Models.DatabaseMigrations.Internal
b.HasKey("ID"); b.HasKey("ID");
b.HasIndex("ShowID"); b.HasIndex("ShowID", "SeasonNumber")
.IsUnique();
b.ToTable("Seasons"); b.ToTable("Seasons");
}); });
@ -430,9 +432,6 @@ namespace Kyoo.Models.DatabaseMigrations.Internal
b.HasKey("ID"); b.HasKey("ID");
b.HasIndex("Slug")
.IsUnique();
b.HasIndex("StudioID"); b.HasIndex("StudioID");
b.ToTable("Shows"); b.ToTable("Shows");

View File

@ -423,9 +423,10 @@ namespace Kyoo.Models.DatabaseMigrations.Internal
column: "SeasonID"); column: "SeasonID");
migrationBuilder.CreateIndex( migrationBuilder.CreateIndex(
name: "IX_Episodes_ShowID", name: "IX_Episodes_ShowID_SeasonNumber_EpisodeNumber_AbsoluteNumber",
table: "Episodes", table: "Episodes",
column: "ShowID"); columns: new[] { "ShowID", "SeasonNumber", "EpisodeNumber", "AbsoluteNumber" },
unique: true);
migrationBuilder.CreateIndex( migrationBuilder.CreateIndex(
name: "IX_GenreLinks_GenreID", name: "IX_GenreLinks_GenreID",
@ -517,14 +518,9 @@ namespace Kyoo.Models.DatabaseMigrations.Internal
unique: true); unique: true);
migrationBuilder.CreateIndex( migrationBuilder.CreateIndex(
name: "IX_Seasons_ShowID", name: "IX_Seasons_ShowID_SeasonNumber",
table: "Seasons", table: "Seasons",
column: "ShowID"); columns: new[] { "ShowID", "SeasonNumber" },
migrationBuilder.CreateIndex(
name: "IX_Shows_Slug",
table: "Shows",
column: "Slug",
unique: true); unique: true);
migrationBuilder.CreateIndex( migrationBuilder.CreateIndex(

View File

@ -115,7 +115,8 @@ namespace Kyoo.Models.DatabaseMigrations.Internal
b.HasIndex("SeasonID"); b.HasIndex("SeasonID");
b.HasIndex("ShowID"); b.HasIndex("ShowID", "SeasonNumber", "EpisodeNumber", "AbsoluteNumber")
.IsUnique();
b.ToTable("Episodes"); b.ToTable("Episodes");
}); });
@ -372,7 +373,8 @@ namespace Kyoo.Models.DatabaseMigrations.Internal
b.HasKey("ID"); b.HasKey("ID");
b.HasIndex("ShowID"); b.HasIndex("ShowID", "SeasonNumber")
.IsUnique();
b.ToTable("Seasons"); b.ToTable("Seasons");
}); });
@ -428,9 +430,6 @@ namespace Kyoo.Models.DatabaseMigrations.Internal
b.HasKey("ID"); b.HasKey("ID");
b.HasIndex("Slug")
.IsUnique();
b.HasIndex("StudioID"); b.HasIndex("StudioID");
b.ToTable("Shows"); b.ToTable("Shows");

View File

@ -27,6 +27,8 @@ namespace Kyoo.Controllers
private IProviderManager _metadataProvider; private IProviderManager _metadataProvider;
private ITranscoder _transcoder; private ITranscoder _transcoder;
private IConfiguration _config; private IConfiguration _config;
private int _parallelTasks;
public async Task<IEnumerable<string>> GetPossibleParameters() public async Task<IEnumerable<string>> GetPossibleParameters()
{ {
@ -50,6 +52,9 @@ namespace Kyoo.Controllers
_metadataProvider = serviceProvider.GetService<IProviderManager>(); _metadataProvider = serviceProvider.GetService<IProviderManager>();
_transcoder = serviceProvider.GetService<ITranscoder>(); _transcoder = serviceProvider.GetService<ITranscoder>();
_config = serviceProvider.GetService<IConfiguration>(); _config = serviceProvider.GetService<IConfiguration>();
_parallelTasks = _config.GetValue<int>("parallelTasks");
if (_parallelTasks <= 0)
_parallelTasks = 30;
using IServiceScope serviceScope = _serviceProvider.CreateScope(); using IServiceScope serviceScope = _serviceProvider.CreateScope();
await using ILibraryManager libraryManager = serviceScope.ServiceProvider.GetService<ILibraryManager>(); await using ILibraryManager libraryManager = serviceScope.ServiceProvider.GetService<ILibraryManager>();
@ -112,18 +117,16 @@ namespace Kyoo.Controllers
.GroupBy(Path.GetDirectoryName) .GroupBy(Path.GetDirectoryName)
.ToList(); .ToList();
// Todo batch wth higher numbers per list once multi-services has been implemented.
IEnumerable<Task> tasks = shows IEnumerable<Task> tasks = shows
.Select(x => x.First()) .Select(x => x.First())
.Select(x => RegisterFile(x, x.Substring(path.Length), library, cancellationToken)); .Select(x => RegisterFile(x, x.Substring(path.Length), library, cancellationToken));
foreach (Task[] showTasks in tasks.BatchBy(30)) foreach (Task[] showTasks in tasks.BatchBy(_parallelTasks))
await Task.WhenAll(showTasks); await Task.WhenAll(showTasks);
tasks = shows tasks = shows
.SelectMany(x => x.Skip(1)) .SelectMany(x => x.Skip(1))
.Select(x => RegisterFile(x, x.Substring(path.Length), library, cancellationToken)); .Select(x => RegisterFile(x, x.Substring(path.Length), library, cancellationToken));
foreach (Task[] episodeTasks in tasks.BatchBy(50)) foreach (Task[] episodeTasks in tasks.BatchBy(_parallelTasks * 2))
await Task.WhenAll(episodeTasks); await Task.WhenAll(episodeTasks);
} }
} }

View File

@ -17,6 +17,7 @@
"ConnectionStrings": { "ConnectionStrings": {
"Database": "Server=127.0.0.1; Port=5432; Database=kyooDB; User Id=kyoo; Password=kyooPassword; Pooling=true; MaxPoolSize=95; Timeout=30;" "Database": "Server=127.0.0.1; Port=5432; Database=kyooDB; User Id=kyoo; Password=kyooPassword; Pooling=true; MaxPoolSize=95; Timeout=30;"
}, },
"parallelTasks": "40",
"scheduledTasks": { "scheduledTasks": {
"scan": "24:00:00" "scan": "24:00:00"