mirror of
https://github.com/zoriya/Kyoo.git
synced 2025-07-08 18:54:22 -04:00
Updating the database scheme
This commit is contained in:
parent
602661db40
commit
90a7d6654e
@ -12,7 +12,12 @@ namespace Kyoo.Models
|
|||||||
public string Poster { get; set; }
|
public string Poster { get; set; }
|
||||||
public string Overview { get; set; }
|
public string Overview { get; set; }
|
||||||
[JsonIgnore] public string ImgPrimary { get; set; }
|
[JsonIgnore] public string ImgPrimary { get; set; }
|
||||||
public virtual IEnumerable<Show> Shows { get; set; }
|
[JsonIgnore] public virtual IEnumerable<CollectionLink> Links { get; set; }
|
||||||
|
public virtual IEnumerable<Show> Shows
|
||||||
|
{
|
||||||
|
get => Links.Select(x => x.Show);
|
||||||
|
set => Links = value.Select(x => new CollectionLink(this, x));
|
||||||
|
}
|
||||||
|
|
||||||
public Collection() { }
|
public Collection() { }
|
||||||
|
|
||||||
|
@ -7,5 +7,15 @@ namespace Kyoo.Models
|
|||||||
public virtual Collection Collection { get; set; }
|
public virtual Collection Collection { get; set; }
|
||||||
public long ShowID { get; set; }
|
public long ShowID { get; set; }
|
||||||
public virtual Show Show { get; set; }
|
public virtual Show Show { get; set; }
|
||||||
|
|
||||||
|
public CollectionLink() { }
|
||||||
|
|
||||||
|
public CollectionLink(Collection collection, Show show)
|
||||||
|
{
|
||||||
|
Collection = collection;
|
||||||
|
CollectionID = collection.ID;
|
||||||
|
Show = show;
|
||||||
|
ShowID = show.ID;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -430,25 +430,14 @@ namespace Kyoo.Controllers
|
|||||||
return x;
|
return x;
|
||||||
}).ToList();
|
}).ToList();
|
||||||
|
|
||||||
show.People = show.People?.Select(x =>
|
show.People = show.People?.GroupBy(x => x.Slug)
|
||||||
{
|
.Select(x => x.First())
|
||||||
x.People = Validate(x.People);
|
.Select(x =>
|
||||||
x.PeopleID = x.People.ID;
|
{
|
||||||
return x;
|
x.People = Validate(x.People);
|
||||||
}).ToList();
|
x.PeopleID = x.People.ID;
|
||||||
|
return x;
|
||||||
show.Seasons = show.Seasons?.Select(x =>
|
}).ToList();
|
||||||
{
|
|
||||||
return _database.Seasons.FirstOrDefault(y => y.ShowID == x.ShowID
|
|
||||||
&& y.SeasonNumber == x.SeasonNumber) ?? Validate(x);
|
|
||||||
}).ToList();
|
|
||||||
show.Episodes = show.Episodes?.Select(x =>
|
|
||||||
{
|
|
||||||
return _database.Episodes.FirstOrDefault(y => y.ShowID == x.ShowID
|
|
||||||
&& y.SeasonNumber == x.SeasonNumber
|
|
||||||
&& y.EpisodeNumber == x.EpisodeNumber) ?? Validate(x);
|
|
||||||
}).ToList();
|
|
||||||
|
|
||||||
show.ExternalIDs = Validate(show.ExternalIDs);
|
show.ExternalIDs = Validate(show.ExternalIDs);
|
||||||
return show;
|
return show;
|
||||||
}
|
}
|
||||||
@ -457,13 +446,8 @@ namespace Kyoo.Controllers
|
|||||||
{
|
{
|
||||||
if (season == null)
|
if (season == null)
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
season.Episodes = season.Episodes?.Select(x =>
|
season.Show = Validate(season.Show);
|
||||||
{
|
|
||||||
return _database.Episodes.FirstOrDefault(y => y.ShowID == x.ShowID
|
|
||||||
&& y.SeasonNumber == x.SeasonNumber
|
|
||||||
&& y.EpisodeNumber == x.EpisodeNumber) ?? Validate(x);
|
|
||||||
}).ToList();
|
|
||||||
season.ExternalIDs = Validate(season.ExternalIDs);
|
season.ExternalIDs = Validate(season.ExternalIDs);
|
||||||
return season;
|
return season;
|
||||||
}
|
}
|
||||||
@ -472,13 +456,9 @@ namespace Kyoo.Controllers
|
|||||||
{
|
{
|
||||||
if (episode == null)
|
if (episode == null)
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
Season old = _database.Seasons.FirstOrDefault(x => x.ShowID == episode.ShowID
|
episode.Show = GetShow(episode.Show.Slug) ?? Validate(episode.Show);
|
||||||
&& x.SeasonNumber == episode.SeasonNumber);
|
episode.Season = GetSeason(episode.Show.Slug, episode.SeasonNumber) ?? Validate(episode.Season);
|
||||||
if (old != null)
|
|
||||||
episode.Season = old;
|
|
||||||
else
|
|
||||||
episode.Season.ExternalIDs = Validate(episode.Season.ExternalIDs);
|
|
||||||
episode.ExternalIDs = Validate(episode.ExternalIDs);
|
episode.ExternalIDs = Validate(episode.ExternalIDs);
|
||||||
return episode;
|
return episode;
|
||||||
}
|
}
|
||||||
|
@ -117,17 +117,17 @@ namespace Kyoo
|
|||||||
|
|
||||||
modelBuilder.Entity<Show>()
|
modelBuilder.Entity<Show>()
|
||||||
.Ignore(x => x.Genres);
|
.Ignore(x => x.Genres);
|
||||||
|
|
||||||
|
modelBuilder.Entity<Collection>()
|
||||||
|
.Ignore(x => x.Shows);
|
||||||
|
|
||||||
modelBuilder.Entity<PeopleLink>()
|
modelBuilder.Entity<PeopleLink>()
|
||||||
.Ignore(x => x.Slug);
|
.Ignore(x => x.Slug)
|
||||||
modelBuilder.Entity<PeopleLink>()
|
.Ignore(x => x.Name)
|
||||||
.Ignore(x => x.Name);
|
|
||||||
modelBuilder.Entity<PeopleLink>()
|
|
||||||
.Ignore(x => x.ExternalIDs);
|
.Ignore(x => x.ExternalIDs);
|
||||||
|
|
||||||
modelBuilder.Entity<ProviderLink>()
|
modelBuilder.Entity<ProviderLink>()
|
||||||
.Ignore(x => x.Name);
|
.Ignore(x => x.Name)
|
||||||
modelBuilder.Entity<ProviderLink>()
|
|
||||||
.Ignore(x => x.Logo);
|
.Ignore(x => x.Logo);
|
||||||
|
|
||||||
|
|
||||||
|
@ -9,7 +9,7 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
|
|||||||
namespace Kyoo.Models.DatabaseMigrations.Internal
|
namespace Kyoo.Models.DatabaseMigrations.Internal
|
||||||
{
|
{
|
||||||
[DbContext(typeof(DatabaseContext))]
|
[DbContext(typeof(DatabaseContext))]
|
||||||
[Migration("20200426223831_Initial")]
|
[Migration("20200507185533_Initial")]
|
||||||
partial class Initial
|
partial class Initial
|
||||||
{
|
{
|
||||||
protected override void BuildTargetModel(ModelBuilder modelBuilder)
|
protected override void BuildTargetModel(ModelBuilder modelBuilder)
|
||||||
@ -27,6 +27,9 @@ namespace Kyoo.Models.DatabaseMigrations.Internal
|
|||||||
b.Property<string>("ImgPrimary")
|
b.Property<string>("ImgPrimary")
|
||||||
.HasColumnType("TEXT");
|
.HasColumnType("TEXT");
|
||||||
|
|
||||||
|
b.Property<long?>("LibraryID")
|
||||||
|
.HasColumnType("INTEGER");
|
||||||
|
|
||||||
b.Property<string>("Name")
|
b.Property<string>("Name")
|
||||||
.HasColumnType("TEXT");
|
.HasColumnType("TEXT");
|
||||||
|
|
||||||
@ -41,6 +44,8 @@ namespace Kyoo.Models.DatabaseMigrations.Internal
|
|||||||
|
|
||||||
b.HasKey("ID");
|
b.HasKey("ID");
|
||||||
|
|
||||||
|
b.HasIndex("LibraryID");
|
||||||
|
|
||||||
b.HasIndex("Slug")
|
b.HasIndex("Slug")
|
||||||
.IsUnique();
|
.IsUnique();
|
||||||
|
|
||||||
@ -271,10 +276,7 @@ namespace Kyoo.Models.DatabaseMigrations.Internal
|
|||||||
.ValueGeneratedOnAdd()
|
.ValueGeneratedOnAdd()
|
||||||
.HasColumnType("INTEGER");
|
.HasColumnType("INTEGER");
|
||||||
|
|
||||||
b.Property<string>("PeopleID")
|
b.Property<long>("PeopleID")
|
||||||
.HasColumnType("TEXT");
|
|
||||||
|
|
||||||
b.Property<long?>("PeopleID1")
|
|
||||||
.HasColumnType("INTEGER");
|
.HasColumnType("INTEGER");
|
||||||
|
|
||||||
b.Property<string>("Role")
|
b.Property<string>("Role")
|
||||||
@ -288,7 +290,7 @@ namespace Kyoo.Models.DatabaseMigrations.Internal
|
|||||||
|
|
||||||
b.HasKey("ID");
|
b.HasKey("ID");
|
||||||
|
|
||||||
b.HasIndex("PeopleID1");
|
b.HasIndex("PeopleID");
|
||||||
|
|
||||||
b.HasIndex("ShowID");
|
b.HasIndex("ShowID");
|
||||||
|
|
||||||
@ -385,6 +387,9 @@ namespace Kyoo.Models.DatabaseMigrations.Internal
|
|||||||
b.Property<bool>("IsMovie")
|
b.Property<bool>("IsMovie")
|
||||||
.HasColumnType("INTEGER");
|
.HasColumnType("INTEGER");
|
||||||
|
|
||||||
|
b.Property<long?>("LibraryID")
|
||||||
|
.HasColumnType("INTEGER");
|
||||||
|
|
||||||
b.Property<string>("Logo")
|
b.Property<string>("Logo")
|
||||||
.HasColumnType("TEXT");
|
.HasColumnType("TEXT");
|
||||||
|
|
||||||
@ -417,6 +422,8 @@ namespace Kyoo.Models.DatabaseMigrations.Internal
|
|||||||
|
|
||||||
b.HasKey("ID");
|
b.HasKey("ID");
|
||||||
|
|
||||||
|
b.HasIndex("LibraryID");
|
||||||
|
|
||||||
b.HasIndex("Slug")
|
b.HasIndex("Slug")
|
||||||
.IsUnique();
|
.IsUnique();
|
||||||
|
|
||||||
@ -485,10 +492,17 @@ namespace Kyoo.Models.DatabaseMigrations.Internal
|
|||||||
b.ToTable("Tracks");
|
b.ToTable("Tracks");
|
||||||
});
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("Kyoo.Models.Collection", b =>
|
||||||
|
{
|
||||||
|
b.HasOne("Kyoo.Models.Library", null)
|
||||||
|
.WithMany("Collections")
|
||||||
|
.HasForeignKey("LibraryID");
|
||||||
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("Kyoo.Models.CollectionLink", b =>
|
modelBuilder.Entity("Kyoo.Models.CollectionLink", b =>
|
||||||
{
|
{
|
||||||
b.HasOne("Kyoo.Models.Collection", "Collection")
|
b.HasOne("Kyoo.Models.Collection", "Collection")
|
||||||
.WithMany()
|
.WithMany("Links")
|
||||||
.HasForeignKey("CollectionID");
|
.HasForeignKey("CollectionID");
|
||||||
|
|
||||||
b.HasOne("Kyoo.Models.Show", "Show")
|
b.HasOne("Kyoo.Models.Show", "Show")
|
||||||
@ -572,7 +586,9 @@ namespace Kyoo.Models.DatabaseMigrations.Internal
|
|||||||
{
|
{
|
||||||
b.HasOne("Kyoo.Models.People", "People")
|
b.HasOne("Kyoo.Models.People", "People")
|
||||||
.WithMany("Roles")
|
.WithMany("Roles")
|
||||||
.HasForeignKey("PeopleID1");
|
.HasForeignKey("PeopleID")
|
||||||
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
|
.IsRequired();
|
||||||
|
|
||||||
b.HasOne("Kyoo.Models.Show", "Show")
|
b.HasOne("Kyoo.Models.Show", "Show")
|
||||||
.WithMany("People")
|
.WithMany("People")
|
||||||
@ -605,6 +621,10 @@ namespace Kyoo.Models.DatabaseMigrations.Internal
|
|||||||
|
|
||||||
modelBuilder.Entity("Kyoo.Models.Show", b =>
|
modelBuilder.Entity("Kyoo.Models.Show", b =>
|
||||||
{
|
{
|
||||||
|
b.HasOne("Kyoo.Models.Library", null)
|
||||||
|
.WithMany("Shows")
|
||||||
|
.HasForeignKey("LibraryID");
|
||||||
|
|
||||||
b.HasOne("Kyoo.Models.Studio", "Studio")
|
b.HasOne("Kyoo.Models.Studio", "Studio")
|
||||||
.WithMany()
|
.WithMany()
|
||||||
.HasForeignKey("StudioID");
|
.HasForeignKey("StudioID");
|
@ -7,23 +7,6 @@ namespace Kyoo.Models.DatabaseMigrations.Internal
|
|||||||
{
|
{
|
||||||
protected override void Up(MigrationBuilder migrationBuilder)
|
protected override void Up(MigrationBuilder migrationBuilder)
|
||||||
{
|
{
|
||||||
migrationBuilder.CreateTable(
|
|
||||||
name: "Collections",
|
|
||||||
columns: table => new
|
|
||||||
{
|
|
||||||
ID = table.Column<long>(nullable: false)
|
|
||||||
.Annotation("Sqlite:Autoincrement", true),
|
|
||||||
Slug = table.Column<string>(nullable: true),
|
|
||||||
Name = table.Column<string>(nullable: true),
|
|
||||||
Poster = table.Column<string>(nullable: true),
|
|
||||||
Overview = table.Column<string>(nullable: true),
|
|
||||||
ImgPrimary = table.Column<string>(nullable: true)
|
|
||||||
},
|
|
||||||
constraints: table =>
|
|
||||||
{
|
|
||||||
table.PrimaryKey("PK_Collections", x => x.ID);
|
|
||||||
});
|
|
||||||
|
|
||||||
migrationBuilder.CreateTable(
|
migrationBuilder.CreateTable(
|
||||||
name: "Genres",
|
name: "Genres",
|
||||||
columns: table => new
|
columns: table => new
|
||||||
@ -96,6 +79,30 @@ namespace Kyoo.Models.DatabaseMigrations.Internal
|
|||||||
table.PrimaryKey("PK_Studios", x => x.ID);
|
table.PrimaryKey("PK_Studios", x => x.ID);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
migrationBuilder.CreateTable(
|
||||||
|
name: "Collections",
|
||||||
|
columns: table => new
|
||||||
|
{
|
||||||
|
ID = table.Column<long>(nullable: false)
|
||||||
|
.Annotation("Sqlite:Autoincrement", true),
|
||||||
|
Slug = table.Column<string>(nullable: true),
|
||||||
|
Name = table.Column<string>(nullable: true),
|
||||||
|
Poster = table.Column<string>(nullable: true),
|
||||||
|
Overview = table.Column<string>(nullable: true),
|
||||||
|
ImgPrimary = table.Column<string>(nullable: true),
|
||||||
|
LibraryID = table.Column<long>(nullable: true)
|
||||||
|
},
|
||||||
|
constraints: table =>
|
||||||
|
{
|
||||||
|
table.PrimaryKey("PK_Collections", x => x.ID);
|
||||||
|
table.ForeignKey(
|
||||||
|
name: "FK_Collections_Libraries_LibraryID",
|
||||||
|
column: x => x.LibraryID,
|
||||||
|
principalTable: "Libraries",
|
||||||
|
principalColumn: "ID",
|
||||||
|
onDelete: ReferentialAction.Restrict);
|
||||||
|
});
|
||||||
|
|
||||||
migrationBuilder.CreateTable(
|
migrationBuilder.CreateTable(
|
||||||
name: "ProviderLinks",
|
name: "ProviderLinks",
|
||||||
columns: table => new
|
columns: table => new
|
||||||
@ -141,11 +148,18 @@ namespace Kyoo.Models.DatabaseMigrations.Internal
|
|||||||
Logo = table.Column<string>(nullable: true),
|
Logo = table.Column<string>(nullable: true),
|
||||||
Backdrop = table.Column<string>(nullable: true),
|
Backdrop = table.Column<string>(nullable: true),
|
||||||
IsMovie = table.Column<bool>(nullable: false),
|
IsMovie = table.Column<bool>(nullable: false),
|
||||||
StudioID = table.Column<long>(nullable: true)
|
StudioID = table.Column<long>(nullable: true),
|
||||||
|
LibraryID = table.Column<long>(nullable: true)
|
||||||
},
|
},
|
||||||
constraints: table =>
|
constraints: table =>
|
||||||
{
|
{
|
||||||
table.PrimaryKey("PK_Shows", x => x.ID);
|
table.PrimaryKey("PK_Shows", x => x.ID);
|
||||||
|
table.ForeignKey(
|
||||||
|
name: "FK_Shows_Libraries_LibraryID",
|
||||||
|
column: x => x.LibraryID,
|
||||||
|
principalTable: "Libraries",
|
||||||
|
principalColumn: "ID",
|
||||||
|
onDelete: ReferentialAction.Restrict);
|
||||||
table.ForeignKey(
|
table.ForeignKey(
|
||||||
name: "FK_Shows_Studios_StudioID",
|
name: "FK_Shows_Studios_StudioID",
|
||||||
column: x => x.StudioID,
|
column: x => x.StudioID,
|
||||||
@ -243,8 +257,7 @@ namespace Kyoo.Models.DatabaseMigrations.Internal
|
|||||||
{
|
{
|
||||||
ID = table.Column<long>(nullable: false)
|
ID = table.Column<long>(nullable: false)
|
||||||
.Annotation("Sqlite:Autoincrement", true),
|
.Annotation("Sqlite:Autoincrement", true),
|
||||||
PeopleID = table.Column<string>(nullable: true),
|
PeopleID = table.Column<long>(nullable: false),
|
||||||
PeopleID1 = table.Column<long>(nullable: true),
|
|
||||||
ShowID = table.Column<long>(nullable: false),
|
ShowID = table.Column<long>(nullable: false),
|
||||||
Role = table.Column<string>(nullable: true),
|
Role = table.Column<string>(nullable: true),
|
||||||
Type = table.Column<string>(nullable: true)
|
Type = table.Column<string>(nullable: true)
|
||||||
@ -253,11 +266,11 @@ namespace Kyoo.Models.DatabaseMigrations.Internal
|
|||||||
{
|
{
|
||||||
table.PrimaryKey("PK_PeopleLinks", x => x.ID);
|
table.PrimaryKey("PK_PeopleLinks", x => x.ID);
|
||||||
table.ForeignKey(
|
table.ForeignKey(
|
||||||
name: "FK_PeopleLinks_Peoples_PeopleID1",
|
name: "FK_PeopleLinks_Peoples_PeopleID",
|
||||||
column: x => x.PeopleID1,
|
column: x => x.PeopleID,
|
||||||
principalTable: "Peoples",
|
principalTable: "Peoples",
|
||||||
principalColumn: "ID",
|
principalColumn: "ID",
|
||||||
onDelete: ReferentialAction.Restrict);
|
onDelete: ReferentialAction.Cascade);
|
||||||
table.ForeignKey(
|
table.ForeignKey(
|
||||||
name: "FK_PeopleLinks_Shows_ShowID",
|
name: "FK_PeopleLinks_Shows_ShowID",
|
||||||
column: x => x.ShowID,
|
column: x => x.ShowID,
|
||||||
@ -411,6 +424,11 @@ namespace Kyoo.Models.DatabaseMigrations.Internal
|
|||||||
table: "CollectionLinks",
|
table: "CollectionLinks",
|
||||||
column: "ShowID");
|
column: "ShowID");
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_Collections_LibraryID",
|
||||||
|
table: "Collections",
|
||||||
|
column: "LibraryID");
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
migrationBuilder.CreateIndex(
|
||||||
name: "IX_Collections_Slug",
|
name: "IX_Collections_Slug",
|
||||||
table: "Collections",
|
table: "Collections",
|
||||||
@ -485,9 +503,9 @@ namespace Kyoo.Models.DatabaseMigrations.Internal
|
|||||||
column: "ShowID");
|
column: "ShowID");
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
migrationBuilder.CreateIndex(
|
||||||
name: "IX_PeopleLinks_PeopleID1",
|
name: "IX_PeopleLinks_PeopleID",
|
||||||
table: "PeopleLinks",
|
table: "PeopleLinks",
|
||||||
column: "PeopleID1");
|
column: "PeopleID");
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
migrationBuilder.CreateIndex(
|
||||||
name: "IX_PeopleLinks_ShowID",
|
name: "IX_PeopleLinks_ShowID",
|
||||||
@ -521,6 +539,11 @@ namespace Kyoo.Models.DatabaseMigrations.Internal
|
|||||||
table: "Seasons",
|
table: "Seasons",
|
||||||
column: "ShowID");
|
column: "ShowID");
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_Shows_LibraryID",
|
||||||
|
table: "Shows",
|
||||||
|
column: "LibraryID");
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
migrationBuilder.CreateIndex(
|
||||||
name: "IX_Shows_Slug",
|
name: "IX_Shows_Slug",
|
||||||
table: "Shows",
|
table: "Shows",
|
||||||
@ -576,9 +599,6 @@ namespace Kyoo.Models.DatabaseMigrations.Internal
|
|||||||
migrationBuilder.DropTable(
|
migrationBuilder.DropTable(
|
||||||
name: "Peoples");
|
name: "Peoples");
|
||||||
|
|
||||||
migrationBuilder.DropTable(
|
|
||||||
name: "Libraries");
|
|
||||||
|
|
||||||
migrationBuilder.DropTable(
|
migrationBuilder.DropTable(
|
||||||
name: "Providers");
|
name: "Providers");
|
||||||
|
|
||||||
@ -591,6 +611,9 @@ namespace Kyoo.Models.DatabaseMigrations.Internal
|
|||||||
migrationBuilder.DropTable(
|
migrationBuilder.DropTable(
|
||||||
name: "Shows");
|
name: "Shows");
|
||||||
|
|
||||||
|
migrationBuilder.DropTable(
|
||||||
|
name: "Libraries");
|
||||||
|
|
||||||
migrationBuilder.DropTable(
|
migrationBuilder.DropTable(
|
||||||
name: "Studios");
|
name: "Studios");
|
||||||
}
|
}
|
@ -25,6 +25,9 @@ namespace Kyoo.Models.DatabaseMigrations.Internal
|
|||||||
b.Property<string>("ImgPrimary")
|
b.Property<string>("ImgPrimary")
|
||||||
.HasColumnType("TEXT");
|
.HasColumnType("TEXT");
|
||||||
|
|
||||||
|
b.Property<long?>("LibraryID")
|
||||||
|
.HasColumnType("INTEGER");
|
||||||
|
|
||||||
b.Property<string>("Name")
|
b.Property<string>("Name")
|
||||||
.HasColumnType("TEXT");
|
.HasColumnType("TEXT");
|
||||||
|
|
||||||
@ -39,6 +42,8 @@ namespace Kyoo.Models.DatabaseMigrations.Internal
|
|||||||
|
|
||||||
b.HasKey("ID");
|
b.HasKey("ID");
|
||||||
|
|
||||||
|
b.HasIndex("LibraryID");
|
||||||
|
|
||||||
b.HasIndex("Slug")
|
b.HasIndex("Slug")
|
||||||
.IsUnique();
|
.IsUnique();
|
||||||
|
|
||||||
@ -269,10 +274,7 @@ namespace Kyoo.Models.DatabaseMigrations.Internal
|
|||||||
.ValueGeneratedOnAdd()
|
.ValueGeneratedOnAdd()
|
||||||
.HasColumnType("INTEGER");
|
.HasColumnType("INTEGER");
|
||||||
|
|
||||||
b.Property<string>("PeopleID")
|
b.Property<long>("PeopleID")
|
||||||
.HasColumnType("TEXT");
|
|
||||||
|
|
||||||
b.Property<long?>("PeopleID1")
|
|
||||||
.HasColumnType("INTEGER");
|
.HasColumnType("INTEGER");
|
||||||
|
|
||||||
b.Property<string>("Role")
|
b.Property<string>("Role")
|
||||||
@ -286,7 +288,7 @@ namespace Kyoo.Models.DatabaseMigrations.Internal
|
|||||||
|
|
||||||
b.HasKey("ID");
|
b.HasKey("ID");
|
||||||
|
|
||||||
b.HasIndex("PeopleID1");
|
b.HasIndex("PeopleID");
|
||||||
|
|
||||||
b.HasIndex("ShowID");
|
b.HasIndex("ShowID");
|
||||||
|
|
||||||
@ -383,6 +385,9 @@ namespace Kyoo.Models.DatabaseMigrations.Internal
|
|||||||
b.Property<bool>("IsMovie")
|
b.Property<bool>("IsMovie")
|
||||||
.HasColumnType("INTEGER");
|
.HasColumnType("INTEGER");
|
||||||
|
|
||||||
|
b.Property<long?>("LibraryID")
|
||||||
|
.HasColumnType("INTEGER");
|
||||||
|
|
||||||
b.Property<string>("Logo")
|
b.Property<string>("Logo")
|
||||||
.HasColumnType("TEXT");
|
.HasColumnType("TEXT");
|
||||||
|
|
||||||
@ -415,6 +420,8 @@ namespace Kyoo.Models.DatabaseMigrations.Internal
|
|||||||
|
|
||||||
b.HasKey("ID");
|
b.HasKey("ID");
|
||||||
|
|
||||||
|
b.HasIndex("LibraryID");
|
||||||
|
|
||||||
b.HasIndex("Slug")
|
b.HasIndex("Slug")
|
||||||
.IsUnique();
|
.IsUnique();
|
||||||
|
|
||||||
@ -483,10 +490,17 @@ namespace Kyoo.Models.DatabaseMigrations.Internal
|
|||||||
b.ToTable("Tracks");
|
b.ToTable("Tracks");
|
||||||
});
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("Kyoo.Models.Collection", b =>
|
||||||
|
{
|
||||||
|
b.HasOne("Kyoo.Models.Library", null)
|
||||||
|
.WithMany("Collections")
|
||||||
|
.HasForeignKey("LibraryID");
|
||||||
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("Kyoo.Models.CollectionLink", b =>
|
modelBuilder.Entity("Kyoo.Models.CollectionLink", b =>
|
||||||
{
|
{
|
||||||
b.HasOne("Kyoo.Models.Collection", "Collection")
|
b.HasOne("Kyoo.Models.Collection", "Collection")
|
||||||
.WithMany()
|
.WithMany("Links")
|
||||||
.HasForeignKey("CollectionID");
|
.HasForeignKey("CollectionID");
|
||||||
|
|
||||||
b.HasOne("Kyoo.Models.Show", "Show")
|
b.HasOne("Kyoo.Models.Show", "Show")
|
||||||
@ -570,7 +584,9 @@ namespace Kyoo.Models.DatabaseMigrations.Internal
|
|||||||
{
|
{
|
||||||
b.HasOne("Kyoo.Models.People", "People")
|
b.HasOne("Kyoo.Models.People", "People")
|
||||||
.WithMany("Roles")
|
.WithMany("Roles")
|
||||||
.HasForeignKey("PeopleID1");
|
.HasForeignKey("PeopleID")
|
||||||
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
|
.IsRequired();
|
||||||
|
|
||||||
b.HasOne("Kyoo.Models.Show", "Show")
|
b.HasOne("Kyoo.Models.Show", "Show")
|
||||||
.WithMany("People")
|
.WithMany("People")
|
||||||
@ -603,6 +619,10 @@ namespace Kyoo.Models.DatabaseMigrations.Internal
|
|||||||
|
|
||||||
modelBuilder.Entity("Kyoo.Models.Show", b =>
|
modelBuilder.Entity("Kyoo.Models.Show", b =>
|
||||||
{
|
{
|
||||||
|
b.HasOne("Kyoo.Models.Library", null)
|
||||||
|
.WithMany("Shows")
|
||||||
|
.HasForeignKey("LibraryID");
|
||||||
|
|
||||||
b.HasOne("Kyoo.Models.Studio", "Studio")
|
b.HasOne("Kyoo.Models.Studio", "Studio")
|
||||||
.WithMany()
|
.WithMany()
|
||||||
.HasForeignKey("StudioID");
|
.HasForeignKey("StudioID");
|
||||||
|
@ -8,6 +8,7 @@ using System.Text.RegularExpressions;
|
|||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Kyoo.Models.Watch;
|
using Kyoo.Models.Watch;
|
||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
|
|
||||||
namespace Kyoo.Controllers
|
namespace Kyoo.Controllers
|
||||||
@ -21,7 +22,7 @@ namespace Kyoo.Controllers
|
|||||||
public bool RunOnStartup => true;
|
public bool RunOnStartup => true;
|
||||||
public int Priority => 0;
|
public int Priority => 0;
|
||||||
|
|
||||||
private ILibraryManager _libraryManager;
|
private IServiceProvider _serviceProvider;
|
||||||
private IThumbnailsManager _thumbnailsManager;
|
private IThumbnailsManager _thumbnailsManager;
|
||||||
private IProviderManager _metadataProvider;
|
private IProviderManager _metadataProvider;
|
||||||
private ITranscoder _transcoder;
|
private ITranscoder _transcoder;
|
||||||
@ -29,7 +30,9 @@ namespace Kyoo.Controllers
|
|||||||
|
|
||||||
public IEnumerable<string> GetPossibleParameters()
|
public IEnumerable<string> GetPossibleParameters()
|
||||||
{
|
{
|
||||||
return _libraryManager.GetLibraries().Select(x => x.Slug);
|
using IServiceScope serviceScope = _serviceProvider.CreateScope();
|
||||||
|
ILibraryManager libraryManager = serviceScope.ServiceProvider.GetService<ILibraryManager>();
|
||||||
|
return libraryManager.GetLibraries().Select(x => x.Slug);
|
||||||
}
|
}
|
||||||
|
|
||||||
public int? Progress()
|
public int? Progress()
|
||||||
@ -40,30 +43,30 @@ namespace Kyoo.Controllers
|
|||||||
|
|
||||||
public async Task Run(IServiceProvider serviceProvider, CancellationToken cancellationToken, string argument = null)
|
public async Task Run(IServiceProvider serviceProvider, CancellationToken cancellationToken, string argument = null)
|
||||||
{
|
{
|
||||||
// TODO Should use more scopes of the library manager (one per episodes to register).
|
_serviceProvider = serviceProvider;
|
||||||
using IServiceScope serviceScope = serviceProvider.CreateScope();
|
_thumbnailsManager = serviceProvider.GetService<IThumbnailsManager>();
|
||||||
_libraryManager = serviceScope.ServiceProvider.GetService<ILibraryManager>();
|
_metadataProvider = serviceProvider.GetService<IProviderManager>();
|
||||||
_thumbnailsManager = serviceScope.ServiceProvider.GetService<IThumbnailsManager>();
|
_transcoder = serviceProvider.GetService<ITranscoder>();
|
||||||
_metadataProvider = serviceScope.ServiceProvider.GetService<IProviderManager>();
|
_config = serviceProvider.GetService<IConfiguration>();
|
||||||
_transcoder = serviceScope.ServiceProvider.GetService<ITranscoder>();
|
|
||||||
_config = serviceScope.ServiceProvider.GetService<IConfiguration>();
|
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
IEnumerable<Episode> episodes = _libraryManager.GetEpisodes();
|
using IServiceScope serviceScope = _serviceProvider.CreateScope();
|
||||||
|
ILibraryManager libraryManager = serviceScope.ServiceProvider.GetService<ILibraryManager>();
|
||||||
|
IEnumerable<Episode> episodes = libraryManager.GetEpisodes();
|
||||||
IEnumerable<Library> libraries = argument == null
|
IEnumerable<Library> libraries = argument == null
|
||||||
? _libraryManager.GetLibraries()
|
? libraryManager.GetLibraries()
|
||||||
: new [] {_libraryManager.GetLibrary(argument)};
|
: new [] {libraryManager.GetLibrary(argument)};
|
||||||
|
|
||||||
foreach (Episode episode in episodes)
|
foreach (Episode episode in episodes)
|
||||||
{
|
{
|
||||||
if (!File.Exists(episode.Path))
|
if (!File.Exists(episode.Path))
|
||||||
_libraryManager.RemoveEpisode(episode);
|
libraryManager.RemoveEpisode(episode);
|
||||||
}
|
}
|
||||||
await _libraryManager.SaveChanges();
|
await libraryManager.SaveChanges();
|
||||||
|
|
||||||
foreach (Library library in libraries)
|
foreach (Library library in libraries)
|
||||||
await Scan(library, cancellationToken);
|
await Scan(library, libraryManager, cancellationToken);
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
@ -72,7 +75,7 @@ namespace Kyoo.Controllers
|
|||||||
Console.WriteLine("Scan finished!");
|
Console.WriteLine("Scan finished!");
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task Scan(Library library, CancellationToken cancellationToken)
|
private async Task Scan(Library library, ILibraryManager libraryManager, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
Console.WriteLine($"Scanning library {library.Name} at {string.Join(", ", library.Paths)}.");
|
Console.WriteLine($"Scanning library {library.Name} at {string.Join(", ", library.Paths)}.");
|
||||||
foreach (string path in library.Paths)
|
foreach (string path in library.Paths)
|
||||||
@ -106,11 +109,11 @@ namespace Kyoo.Controllers
|
|||||||
}
|
}
|
||||||
await Task.WhenAll(files.Select(file =>
|
await Task.WhenAll(files.Select(file =>
|
||||||
{
|
{
|
||||||
if (!IsVideo(file) || _libraryManager.GetEpisodes().Any(x => x.Path == file))
|
if (!IsVideo(file) || libraryManager.GetEpisodes().Any(x => x.Path == file))
|
||||||
return null;
|
return Task.CompletedTask;
|
||||||
string relativePath = file.Substring(path.Length);
|
string relativePath = file.Substring(path.Length);
|
||||||
return RegisterFile(file, relativePath, library, cancellationToken);
|
return RegisterFile(file, relativePath, library, cancellationToken);
|
||||||
}).Where(x => x != null));
|
}));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -119,6 +122,10 @@ namespace Kyoo.Controllers
|
|||||||
if (token.IsCancellationRequested)
|
if (token.IsCancellationRequested)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
using IServiceScope serviceScope = _serviceProvider.CreateScope();
|
||||||
|
ILibraryManager libraryManager = serviceScope.ServiceProvider.GetService<ILibraryManager>();
|
||||||
|
((DbSet<Library>)libraryManager.GetLibraries()).Attach(library);
|
||||||
|
|
||||||
Console.WriteLine($"Registering episode at: {path}");
|
Console.WriteLine($"Registering episode at: {path}");
|
||||||
string patern = _config.GetValue<string>("regex");
|
string patern = _config.GetValue<string>("regex");
|
||||||
Regex regex = new Regex(patern, RegexOptions.IgnoreCase);
|
Regex regex = new Regex(patern, RegexOptions.IgnoreCase);
|
||||||
@ -131,33 +138,36 @@ namespace Kyoo.Controllers
|
|||||||
long episodeNumber = long.TryParse(match.Groups["Episode"].Value, out tmp) ? tmp : -1;
|
long episodeNumber = long.TryParse(match.Groups["Episode"].Value, out tmp) ? tmp : -1;
|
||||||
long absoluteNumber = long.TryParse(match.Groups["Absolute"].Value, out tmp) ? tmp : -1;
|
long absoluteNumber = long.TryParse(match.Groups["Absolute"].Value, out tmp) ? tmp : -1;
|
||||||
|
|
||||||
Collection collection = await GetCollection(collectionName, library);
|
Collection collection = await GetCollection(libraryManager, collectionName, library);
|
||||||
bool isMovie = seasonNumber == -1 && episodeNumber == -1 && absoluteNumber == -1;
|
bool isMovie = seasonNumber == -1 && episodeNumber == -1 && absoluteNumber == -1;
|
||||||
Show show = await GetShow(showName, showPath, isMovie, library);
|
Show show = await GetShow(libraryManager, showName, showPath, isMovie, library);
|
||||||
if (isMovie)
|
if (isMovie)
|
||||||
_libraryManager.Register(await GetMovie(show, path));
|
libraryManager.Register(await GetMovie(show, path));
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Season season = await GetSeason(show, seasonNumber, library);
|
Season season = await GetSeason(libraryManager, show, seasonNumber, library);
|
||||||
Episode episode = await GetEpisode(show, season, episodeNumber, absoluteNumber, path, library);
|
Episode episode = await GetEpisode(libraryManager, show, season, episodeNumber, absoluteNumber, path, library);
|
||||||
_libraryManager.Register(episode);
|
libraryManager.Register(episode);
|
||||||
}
|
}
|
||||||
if (collection != null)
|
if (collection != null)
|
||||||
_libraryManager.Register(collection);
|
libraryManager.Register(collection);
|
||||||
_libraryManager.RegisterShowLinks(library, collection, show);
|
libraryManager.RegisterShowLinks(library, collection, show);
|
||||||
await _libraryManager.SaveChanges();
|
await libraryManager.SaveChanges();
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task<Collection> GetCollection(string collectionName, Library library)
|
private async Task<Collection> GetCollection(ILibraryManager libraryManager, string collectionName, Library library)
|
||||||
{
|
{
|
||||||
if (string.IsNullOrEmpty(collectionName))
|
if (string.IsNullOrEmpty(collectionName))
|
||||||
return await Task.FromResult<Collection>(null);
|
return await Task.FromResult<Collection>(null);
|
||||||
return _libraryManager.GetCollection(Utility.ToSlug(collectionName)) ?? await _metadataProvider.GetCollectionFromName(collectionName, library);
|
Collection name = libraryManager.GetCollection(Utility.ToSlug(collectionName));
|
||||||
|
if (name != null)
|
||||||
|
return name;
|
||||||
|
return await _metadataProvider.GetCollectionFromName(collectionName, library);
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task<Show> GetShow(string showTitle, string showPath, bool isMovie, Library library)
|
private async Task<Show> GetShow(ILibraryManager libraryManager, string showTitle, string showPath, bool isMovie, Library library)
|
||||||
{
|
{
|
||||||
Show show = _libraryManager.GetShowByPath(showPath);
|
Show show = libraryManager.GetShowByPath(showPath);
|
||||||
if (show != null)
|
if (show != null)
|
||||||
return show;
|
return show;
|
||||||
show = await _metadataProvider.SearchShow(showTitle, isMovie, library);
|
show = await _metadataProvider.SearchShow(showTitle, isMovie, library);
|
||||||
@ -170,11 +180,11 @@ namespace Kyoo.Controllers
|
|||||||
return show;
|
return show;
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task<Season> GetSeason(Show show, long seasonNumber, Library library)
|
private async Task<Season> GetSeason(ILibraryManager libraryManager, Show show, long seasonNumber, Library library)
|
||||||
{
|
{
|
||||||
if (seasonNumber == -1)
|
if (seasonNumber == -1)
|
||||||
return default;
|
return default;
|
||||||
Season season = _libraryManager.GetSeason(show.Slug, seasonNumber);
|
Season season = libraryManager.GetSeason(show.Slug, seasonNumber);
|
||||||
if (season == null)
|
if (season == null)
|
||||||
{
|
{
|
||||||
season = await _metadataProvider.GetSeason(show, seasonNumber, library);
|
season = await _metadataProvider.GetSeason(show, seasonNumber, library);
|
||||||
@ -184,11 +194,11 @@ namespace Kyoo.Controllers
|
|||||||
return season;
|
return season;
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task<Episode> GetEpisode(Show show, Season season, long episodeNumber, long absoluteNumber, string episodePath, Library library)
|
private async Task<Episode> 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);
|
Episode episode = await _metadataProvider.GetEpisode(show, episodePath, season?.SeasonNumber ?? -1, episodeNumber, absoluteNumber, library);
|
||||||
if (season == null)
|
if (season == null)
|
||||||
season = await GetSeason(show, episode.SeasonNumber, library);
|
season = await GetSeason(libraryManager, show, episode.SeasonNumber, library);
|
||||||
episode.Season = season;
|
episode.Season = season;
|
||||||
if (season == null)
|
if (season == null)
|
||||||
{
|
{
|
||||||
|
@ -25,12 +25,11 @@ namespace Kyoo.Api
|
|||||||
|
|
||||||
if (people == null)
|
if (people == null)
|
||||||
return NotFound();
|
return NotFound();
|
||||||
Collection collection = new Collection(people.Slug, people.Name, null, null)
|
return new Collection(people.Slug, people.Name, null, null)
|
||||||
{
|
{
|
||||||
Shows = people.Roles.Select(x => x.Show),
|
Shows = people.Roles.Select(x => x.Show),
|
||||||
Poster = "peopleimg/" + people.Slug
|
Poster = "peopleimg/" + people.Slug
|
||||||
};
|
};
|
||||||
return collection;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
x
Reference in New Issue
Block a user