IMDbs eigene Schnittstelle kostet Geld, Rotten Tomatoes vergibt Zugänge nur an Partner, Letterboxd hat gar keine offene. OMDb liefert alle drei in einer Antwort, über die IMDb-Kennung, die ohnehin schon an jedem Film steht. **Eine Tabelle und kein Feld je Quelle.** `Movie.Rating` ist ein Skalar ohne Quellenangabe, und das war richtig, solange es eine Quelle gab. Für drei weitere wären es drei Spalten — und bei der vierten wieder eine Migration. Jetzt ist jede Quelle eine Zeile, je Titel und Quelle eine, mit eindeutigem Index darauf: ein zweiter Lauf schreibt um statt anzuhäufen. **Zwei Werte je Bewertung, und beide gebraucht.** Der normierte Wert zum Vergleichen und Sortieren, die Anzeige zum Hinschreiben. Rotten Tomatoes in „8,7 von 10" umzurechnen wäre eine Lüge über die Quelle — dort steht 87 %, und genau so kennt man es. **Wieder keine zweite Metadatenquelle.** `IBewertungsquelle` liefert Bewertungen, sonst nichts. Bei Titel und Beschreibung wären zwei Anbieter zwei Wahrheiten; bei einer Bewertung ist jede Quelle eine eigene Zahl, und da sind mehrere kein Widerspruch, sondern der Sinn der Sache. **Ohne Kennung wird nicht gefragt.** OMDb kennt nur den Weg über die IMDb-Kennung; nach einem Titel zu suchen hiesse, denselben Zuordnungsfehler ein zweites Mal zu riskieren. Und auf Unbekanntes antwortet OMDb mit 200 und `Response: "False"` — das als Treffer durchzulassen legte eine leere Bewertung ab, die danach als „keine Wertung" dastünde. Angezeigt wird mit Kürzel statt Stern: vier gleich aussehende Zahlen nebeneinander sagen nicht, woher sie kommen. Kein Logo — die Marken von IMDb und Rotten Tomatoes mitzuliefern hiesse, fremde Zeichen auszuliefern. Kein mitgelieferter Schlüssel, aus demselben Grund wie bei fanart.tv: OMDb begrenzt auf tausend Abrufe am Tag je Schlüssel. Einzutragen unter Einstellungen → Übersicht → Metadaten. 740 Tests grün, davon acht neue. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
1186 lines
40 KiB
C#
1186 lines
40 KiB
C#
// <auto-generated />
|
|
using System;
|
|
using Flaro.Data;
|
|
using Microsoft.EntityFrameworkCore;
|
|
using Microsoft.EntityFrameworkCore.Infrastructure;
|
|
using Microsoft.EntityFrameworkCore.Migrations;
|
|
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
|
|
|
|
#nullable disable
|
|
|
|
namespace Flaro.Data.Migrations
|
|
{
|
|
[DbContext(typeof(FlaroContext))]
|
|
[Migration("20261008191902_Fremdbewertungen")]
|
|
partial class Fremdbewertungen
|
|
{
|
|
/// <inheritdoc />
|
|
protected override void BuildTargetModel(ModelBuilder modelBuilder)
|
|
{
|
|
#pragma warning disable 612, 618
|
|
modelBuilder.HasAnnotation("ProductVersion", "10.0.12");
|
|
|
|
modelBuilder.Entity("Flaro.Core.Auth.AuthCode", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<Guid?>("ApprovedByUserId")
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<string>("Code")
|
|
.IsRequired()
|
|
.HasMaxLength(16)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<long?>("ConsumedAt")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<long>("CreatedAt")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<string>("DeviceId")
|
|
.IsRequired()
|
|
.HasMaxLength(128)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<string>("DeviceName")
|
|
.IsRequired()
|
|
.HasMaxLength(128)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<long>("ExpiresAt")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<string>("HandleFingerprint")
|
|
.IsRequired()
|
|
.HasMaxLength(64)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.HasKey("Id");
|
|
|
|
b.HasIndex("Code");
|
|
|
|
b.HasIndex("HandleFingerprint")
|
|
.IsUnique();
|
|
|
|
b.ToTable("AuthCodes");
|
|
});
|
|
|
|
modelBuilder.Entity("Flaro.Core.Auth.DeviceToken", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<long>("CreatedAt")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<string>("DeviceId")
|
|
.IsRequired()
|
|
.HasMaxLength(128)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<string>("DeviceName")
|
|
.IsRequired()
|
|
.HasMaxLength(128)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<long>("LastSeenAt")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<long?>("RevokedAt")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<string>("TokenFingerprint")
|
|
.IsRequired()
|
|
.HasMaxLength(64)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<Guid>("UserId")
|
|
.HasColumnType("TEXT");
|
|
|
|
b.HasKey("Id");
|
|
|
|
b.HasIndex("TokenFingerprint")
|
|
.IsUnique();
|
|
|
|
b.HasIndex("UserId");
|
|
|
|
b.ToTable("DeviceTokens");
|
|
});
|
|
|
|
modelBuilder.Entity("Flaro.Core.Auth.Einladung", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<long>("CreatedAt")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<Guid>("CreatedByUserId")
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<long>("ExpiresAt")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<int?>("MaxUses")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<long?>("RevokedAt")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<string>("TokenFingerprint")
|
|
.IsRequired()
|
|
.HasMaxLength(64)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<int>("UsedCount")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.HasKey("Id");
|
|
|
|
b.HasIndex("CreatedAt");
|
|
|
|
b.HasIndex("CreatedByUserId");
|
|
|
|
b.HasIndex("TokenFingerprint")
|
|
.IsUnique();
|
|
|
|
b.ToTable("Einladungen");
|
|
});
|
|
|
|
modelBuilder.Entity("Flaro.Core.Libraries.Library", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<long>("CreatedAt")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<string>("Kind")
|
|
.IsRequired()
|
|
.HasMaxLength(32)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<string>("Name")
|
|
.IsRequired()
|
|
.HasMaxLength(128)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<string>("Path")
|
|
.IsRequired()
|
|
.HasMaxLength(1024)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<bool>("ReviewNewItems")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<int>("SortOrder")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.HasKey("Id");
|
|
|
|
b.ToTable("Libraries");
|
|
});
|
|
|
|
modelBuilder.Entity("Flaro.Core.Library.Credit", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<string>("Character")
|
|
.HasMaxLength(256)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<Guid?>("MovieId")
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<int>("Order")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<Guid>("PersonId")
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<string>("Role")
|
|
.IsRequired()
|
|
.HasMaxLength(16)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<Guid?>("SeriesId")
|
|
.HasColumnType("TEXT");
|
|
|
|
b.HasKey("Id");
|
|
|
|
b.HasIndex("MovieId");
|
|
|
|
b.HasIndex("PersonId");
|
|
|
|
b.HasIndex("SeriesId");
|
|
|
|
b.ToTable("Credits");
|
|
});
|
|
|
|
modelBuilder.Entity("Flaro.Core.Library.Episode", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<long>("AddedAt")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<int>("EpisodeNumber")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<string>("MetadataLanguage")
|
|
.HasMaxLength(16)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<string>("Overview")
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<long?>("PublishAt")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<int>("SeasonNumber")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<Guid>("SeriesId")
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<string>("StillImage")
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<string>("Title")
|
|
.HasMaxLength(512)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.HasKey("Id");
|
|
|
|
b.HasIndex("SeriesId", "SeasonNumber", "EpisodeNumber")
|
|
.IsUnique();
|
|
|
|
b.ToTable("Episodes");
|
|
});
|
|
|
|
modelBuilder.Entity("Flaro.Core.Library.Fremdbewertung", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<string>("Anzeige")
|
|
.IsRequired()
|
|
.HasMaxLength(32)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<Guid?>("MovieId")
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<string>("Quelle")
|
|
.IsRequired()
|
|
.HasMaxLength(32)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<Guid?>("SeriesId")
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<double>("Wert")
|
|
.HasColumnType("REAL");
|
|
|
|
b.HasKey("Id");
|
|
|
|
b.HasIndex("MovieId", "Quelle")
|
|
.IsUnique()
|
|
.HasFilter("\"MovieId\" IS NOT NULL");
|
|
|
|
b.HasIndex("SeriesId", "Quelle")
|
|
.IsUnique()
|
|
.HasFilter("\"SeriesId\" IS NOT NULL");
|
|
|
|
b.ToTable("Fremdbewertungen");
|
|
});
|
|
|
|
modelBuilder.Entity("Flaro.Core.Library.Genre", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<string>("Name")
|
|
.IsRequired()
|
|
.HasMaxLength(64)
|
|
.HasColumnType("TEXT")
|
|
.UseCollation("NOCASE");
|
|
|
|
b.HasKey("Id");
|
|
|
|
b.HasIndex("Name")
|
|
.IsUnique();
|
|
|
|
b.ToTable("Genres");
|
|
});
|
|
|
|
modelBuilder.Entity("Flaro.Core.Library.GenreLink", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<Guid>("GenreId")
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<Guid?>("MovieId")
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<Guid?>("SeriesId")
|
|
.HasColumnType("TEXT");
|
|
|
|
b.HasKey("Id");
|
|
|
|
b.HasIndex("MovieId");
|
|
|
|
b.HasIndex("SeriesId");
|
|
|
|
b.HasIndex("GenreId", "MovieId")
|
|
.IsUnique()
|
|
.HasFilter("\"MovieId\" IS NOT NULL");
|
|
|
|
b.HasIndex("GenreId", "SeriesId")
|
|
.IsUnique()
|
|
.HasFilter("\"SeriesId\" IS NOT NULL");
|
|
|
|
b.ToTable("GenreLinks");
|
|
});
|
|
|
|
modelBuilder.Entity("Flaro.Core.Library.ItemTranslation", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<Guid?>("EpisodeId")
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<long>("FetchedAt")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<string>("Language")
|
|
.IsRequired()
|
|
.HasMaxLength(16)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<Guid?>("MovieId")
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<string>("Overview")
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<Guid?>("SeriesId")
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<string>("Tagline")
|
|
.HasMaxLength(512)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<string>("Title")
|
|
.HasMaxLength(512)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.HasKey("Id");
|
|
|
|
b.HasIndex("EpisodeId", "Language")
|
|
.IsUnique()
|
|
.HasFilter("\"EpisodeId\" IS NOT NULL");
|
|
|
|
b.HasIndex("MovieId", "Language")
|
|
.IsUnique()
|
|
.HasFilter("\"MovieId\" IS NOT NULL");
|
|
|
|
b.HasIndex("SeriesId", "Language")
|
|
.IsUnique()
|
|
.HasFilter("\"SeriesId\" IS NOT NULL");
|
|
|
|
b.ToTable("Translations");
|
|
});
|
|
|
|
modelBuilder.Entity("Flaro.Core.Library.MediaFile", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<long?>("BitRate")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<string>("Container")
|
|
.HasMaxLength(32)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<long?>("Duration")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<Guid?>("EpisodeId")
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<Guid>("LibraryId")
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<long?>("MissingSince")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<long>("ModifiedAt")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<Guid?>("MovieId")
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<string>("Path")
|
|
.IsRequired()
|
|
.HasMaxLength(1024)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<long?>("ProbedAt")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<long>("SeenAt")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<long>("SizeBytes")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<string>("VersionLabel")
|
|
.HasMaxLength(64)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.HasKey("Id");
|
|
|
|
b.HasIndex("EpisodeId");
|
|
|
|
b.HasIndex("MovieId");
|
|
|
|
b.HasIndex("LibraryId", "Path")
|
|
.IsUnique();
|
|
|
|
b.ToTable("MediaFiles");
|
|
});
|
|
|
|
modelBuilder.Entity("Flaro.Core.Library.MediaStream", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<int?>("Channels")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<string>("Codec")
|
|
.HasMaxLength(64)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<int?>("Height")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<int>("Index")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<bool>("IsDefault")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<bool>("IsForced")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<string>("Kind")
|
|
.IsRequired()
|
|
.HasMaxLength(16)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<string>("Language")
|
|
.HasMaxLength(16)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<Guid>("MediaFileId")
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<string>("Title")
|
|
.HasMaxLength(256)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<int?>("Width")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.HasKey("Id");
|
|
|
|
b.HasIndex("MediaFileId", "Index")
|
|
.IsUnique();
|
|
|
|
b.ToTable("MediaStreams");
|
|
});
|
|
|
|
modelBuilder.Entity("Flaro.Core.Library.Meldung", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<string>("Art")
|
|
.IsRequired()
|
|
.HasMaxLength(32)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<Guid?>("EpisodeId")
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<long?>("ErledigtAm")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<Guid?>("ErledigtVon")
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<long>("GemeldetAm")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<string>("Kommentar")
|
|
.IsRequired()
|
|
.HasMaxLength(2000)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<Guid?>("MovieId")
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<int?>("SeasonNumber")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<Guid?>("SeriesId")
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<long?>("Stelle")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<Guid>("UserId")
|
|
.HasColumnType("TEXT");
|
|
|
|
b.HasKey("Id");
|
|
|
|
b.HasIndex("EpisodeId");
|
|
|
|
b.HasIndex("MovieId");
|
|
|
|
b.HasIndex("SeriesId");
|
|
|
|
b.HasIndex("ErledigtAm", "GemeldetAm");
|
|
|
|
b.HasIndex("UserId", "GemeldetAm");
|
|
|
|
b.ToTable("Meldungen");
|
|
});
|
|
|
|
modelBuilder.Entity("Flaro.Core.Library.Movie", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<long>("AddedAt")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<string>("BackdropImage")
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<bool>("BackdropPinned")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<long?>("ChangedSince")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<string>("ContentRating")
|
|
.HasMaxLength(16)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<int?>("FassungenGeprueftBei")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<string>("ImdbId")
|
|
.HasMaxLength(32)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<Guid>("LibraryId")
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<string>("LogoImage")
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<bool>("LogoPinned")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<bool>("MatchLocked")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<string>("MetadataLanguage")
|
|
.HasMaxLength(16)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<string>("OriginalTitle")
|
|
.HasMaxLength(512)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<string>("Overview")
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<string>("ParsedTitle")
|
|
.IsRequired()
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<int?>("ParsedYear")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<string>("PosterImage")
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<bool>("PosterPinned")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<long?>("PublishAt")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<double?>("Rating")
|
|
.HasColumnType("REAL");
|
|
|
|
b.Property<int?>("RuntimeMinutes")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<bool>("SortTitlePinned")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<string>("SortTitleValue")
|
|
.IsRequired()
|
|
.HasMaxLength(512)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<string>("Tagline")
|
|
.HasMaxLength(512)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<string>("Title")
|
|
.IsRequired()
|
|
.HasMaxLength(512)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<bool>("TitlePinned")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<int?>("TmdbId")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<int?>("Year")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.HasKey("Id");
|
|
|
|
b.HasIndex("LibraryId", "MetadataLanguage");
|
|
|
|
b.HasIndex("LibraryId", "SortTitleValue");
|
|
|
|
b.HasIndex("LibraryId", "TmdbId")
|
|
.IsUnique()
|
|
.HasFilter("\"TmdbId\" IS NOT NULL");
|
|
|
|
b.ToTable("Movies");
|
|
});
|
|
|
|
modelBuilder.Entity("Flaro.Core.Library.Person", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<string>("Image")
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<string>("Name")
|
|
.IsRequired()
|
|
.HasMaxLength(256)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<int>("TmdbId")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.HasKey("Id");
|
|
|
|
b.HasIndex("TmdbId")
|
|
.IsUnique();
|
|
|
|
b.ToTable("People");
|
|
});
|
|
|
|
modelBuilder.Entity("Flaro.Core.Library.Series", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<long>("AddedAt")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<string>("BackdropImage")
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<bool>("BackdropPinned")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<long?>("ChangedSince")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<string>("ContentRating")
|
|
.HasMaxLength(16)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<string>("ImdbId")
|
|
.HasMaxLength(32)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<Guid>("LibraryId")
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<string>("LogoImage")
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<bool>("LogoPinned")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<bool>("MatchLocked")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<string>("MetadataLanguage")
|
|
.HasMaxLength(16)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<string>("OriginalTitle")
|
|
.HasMaxLength(512)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<string>("Overview")
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<string>("ParsedTitle")
|
|
.IsRequired()
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<int?>("ParsedYear")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<string>("PosterImage")
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<bool>("PosterPinned")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<long?>("PublishAt")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<double?>("Rating")
|
|
.HasColumnType("REAL");
|
|
|
|
b.Property<int?>("RuntimeMinutes")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<bool>("SortTitlePinned")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<string>("SortTitleValue")
|
|
.IsRequired()
|
|
.HasMaxLength(512)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<string>("Tagline")
|
|
.HasMaxLength(512)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<string>("Title")
|
|
.IsRequired()
|
|
.HasMaxLength(512)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<bool>("TitlePinned")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<int?>("TmdbId")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<int?>("Year")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.HasKey("Id");
|
|
|
|
b.HasIndex("LibraryId", "MetadataLanguage");
|
|
|
|
b.HasIndex("LibraryId", "SortTitleValue");
|
|
|
|
b.HasIndex("LibraryId", "TmdbId")
|
|
.IsUnique()
|
|
.HasFilter("\"TmdbId\" IS NOT NULL");
|
|
|
|
b.ToTable("Series");
|
|
});
|
|
|
|
modelBuilder.Entity("Flaro.Core.Playback.Sehtag", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<Guid?>("EpisodeId")
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<Guid?>("MovieId")
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<double>("Sekunden")
|
|
.HasColumnType("REAL");
|
|
|
|
b.Property<int>("Tag")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<Guid>("UserId")
|
|
.HasColumnType("TEXT");
|
|
|
|
b.HasKey("Id");
|
|
|
|
b.HasIndex("EpisodeId");
|
|
|
|
b.HasIndex("MovieId");
|
|
|
|
b.HasIndex("UserId", "Tag");
|
|
|
|
b.HasIndex("UserId", "Tag", "EpisodeId")
|
|
.IsUnique()
|
|
.HasFilter("\"EpisodeId\" IS NOT NULL");
|
|
|
|
b.HasIndex("UserId", "Tag", "MovieId")
|
|
.IsUnique()
|
|
.HasFilter("\"MovieId\" IS NOT NULL");
|
|
|
|
b.ToTable("Sehtage");
|
|
});
|
|
|
|
modelBuilder.Entity("Flaro.Core.Playback.UserItemState", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<bool>("Dismissed")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<Guid?>("EpisodeId")
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<bool>("Favourite")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<bool>("InProgress")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<long?>("LastPlayedAt")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<Guid?>("MovieId")
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<int>("PlayCount")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<long>("Position")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<int?>("Rating")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<long?>("Runtime")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<Guid?>("SeriesId")
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<long>("UpdatedAt")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<Guid>("UserId")
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<bool>("Watched")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.HasKey("Id");
|
|
|
|
b.HasIndex("EpisodeId");
|
|
|
|
b.HasIndex("MovieId");
|
|
|
|
b.HasIndex("SeriesId");
|
|
|
|
b.HasIndex("UserId", "EpisodeId")
|
|
.IsUnique()
|
|
.HasFilter("\"EpisodeId\" IS NOT NULL");
|
|
|
|
b.HasIndex("UserId", "MovieId")
|
|
.IsUnique()
|
|
.HasFilter("\"MovieId\" IS NOT NULL");
|
|
|
|
b.HasIndex("UserId", "SeriesId")
|
|
.IsUnique()
|
|
.HasFilter("\"SeriesId\" IS NOT NULL");
|
|
|
|
b.HasIndex("UserId", "InProgress", "UpdatedAt");
|
|
|
|
b.ToTable("UserItemStates");
|
|
});
|
|
|
|
modelBuilder.Entity("Flaro.Core.ServerSetting", b =>
|
|
{
|
|
b.Property<string>("Key")
|
|
.HasMaxLength(128)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<string>("Value")
|
|
.IsRequired()
|
|
.HasMaxLength(4096)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.HasKey("Key");
|
|
|
|
b.ToTable("Settings");
|
|
});
|
|
|
|
modelBuilder.Entity("Flaro.Core.Users.User", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<string>("AvatarImage")
|
|
.HasMaxLength(64)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<long>("CreatedAt")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<bool>("IsAdministrator")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<bool>("IsOwner")
|
|
.HasColumnType("INTEGER");
|
|
|
|
b.Property<string>("Language")
|
|
.HasMaxLength(16)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<string>("PasswordHash")
|
|
.IsRequired()
|
|
.HasMaxLength(256)
|
|
.HasColumnType("TEXT");
|
|
|
|
b.Property<string>("UserName")
|
|
.IsRequired()
|
|
.HasMaxLength(64)
|
|
.HasColumnType("TEXT")
|
|
.UseCollation("NOCASE");
|
|
|
|
b.HasKey("Id");
|
|
|
|
b.HasIndex("UserName")
|
|
.IsUnique();
|
|
|
|
b.ToTable("Users");
|
|
});
|
|
|
|
modelBuilder.Entity("Flaro.Core.Auth.DeviceToken", b =>
|
|
{
|
|
b.HasOne("Flaro.Core.Users.User", null)
|
|
.WithMany()
|
|
.HasForeignKey("UserId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired();
|
|
});
|
|
|
|
modelBuilder.Entity("Flaro.Core.Auth.Einladung", b =>
|
|
{
|
|
b.HasOne("Flaro.Core.Users.User", null)
|
|
.WithMany()
|
|
.HasForeignKey("CreatedByUserId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired();
|
|
});
|
|
|
|
modelBuilder.Entity("Flaro.Core.Library.Credit", b =>
|
|
{
|
|
b.HasOne("Flaro.Core.Library.Movie", null)
|
|
.WithMany()
|
|
.HasForeignKey("MovieId")
|
|
.OnDelete(DeleteBehavior.Cascade);
|
|
|
|
b.HasOne("Flaro.Core.Library.Person", null)
|
|
.WithMany()
|
|
.HasForeignKey("PersonId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired();
|
|
|
|
b.HasOne("Flaro.Core.Library.Series", null)
|
|
.WithMany()
|
|
.HasForeignKey("SeriesId")
|
|
.OnDelete(DeleteBehavior.Cascade);
|
|
});
|
|
|
|
modelBuilder.Entity("Flaro.Core.Library.Episode", b =>
|
|
{
|
|
b.HasOne("Flaro.Core.Library.Series", null)
|
|
.WithMany()
|
|
.HasForeignKey("SeriesId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired();
|
|
});
|
|
|
|
modelBuilder.Entity("Flaro.Core.Library.Fremdbewertung", b =>
|
|
{
|
|
b.HasOne("Flaro.Core.Library.Movie", null)
|
|
.WithMany()
|
|
.HasForeignKey("MovieId")
|
|
.OnDelete(DeleteBehavior.Cascade);
|
|
|
|
b.HasOne("Flaro.Core.Library.Series", null)
|
|
.WithMany()
|
|
.HasForeignKey("SeriesId")
|
|
.OnDelete(DeleteBehavior.Cascade);
|
|
});
|
|
|
|
modelBuilder.Entity("Flaro.Core.Library.GenreLink", b =>
|
|
{
|
|
b.HasOne("Flaro.Core.Library.Genre", null)
|
|
.WithMany()
|
|
.HasForeignKey("GenreId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired();
|
|
|
|
b.HasOne("Flaro.Core.Library.Movie", null)
|
|
.WithMany()
|
|
.HasForeignKey("MovieId")
|
|
.OnDelete(DeleteBehavior.Cascade);
|
|
|
|
b.HasOne("Flaro.Core.Library.Series", null)
|
|
.WithMany()
|
|
.HasForeignKey("SeriesId")
|
|
.OnDelete(DeleteBehavior.Cascade);
|
|
});
|
|
|
|
modelBuilder.Entity("Flaro.Core.Library.MediaFile", b =>
|
|
{
|
|
b.HasOne("Flaro.Core.Libraries.Library", null)
|
|
.WithMany()
|
|
.HasForeignKey("LibraryId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired();
|
|
});
|
|
|
|
modelBuilder.Entity("Flaro.Core.Library.MediaStream", b =>
|
|
{
|
|
b.HasOne("Flaro.Core.Library.MediaFile", null)
|
|
.WithMany()
|
|
.HasForeignKey("MediaFileId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired();
|
|
});
|
|
|
|
modelBuilder.Entity("Flaro.Core.Library.Meldung", b =>
|
|
{
|
|
b.HasOne("Flaro.Core.Library.Episode", null)
|
|
.WithMany()
|
|
.HasForeignKey("EpisodeId")
|
|
.OnDelete(DeleteBehavior.Cascade);
|
|
|
|
b.HasOne("Flaro.Core.Library.Movie", null)
|
|
.WithMany()
|
|
.HasForeignKey("MovieId")
|
|
.OnDelete(DeleteBehavior.Cascade);
|
|
|
|
b.HasOne("Flaro.Core.Library.Series", null)
|
|
.WithMany()
|
|
.HasForeignKey("SeriesId")
|
|
.OnDelete(DeleteBehavior.Cascade);
|
|
|
|
b.HasOne("Flaro.Core.Users.User", null)
|
|
.WithMany()
|
|
.HasForeignKey("UserId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired();
|
|
});
|
|
|
|
modelBuilder.Entity("Flaro.Core.Library.Movie", b =>
|
|
{
|
|
b.HasOne("Flaro.Core.Libraries.Library", null)
|
|
.WithMany()
|
|
.HasForeignKey("LibraryId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired();
|
|
});
|
|
|
|
modelBuilder.Entity("Flaro.Core.Library.Series", b =>
|
|
{
|
|
b.HasOne("Flaro.Core.Libraries.Library", null)
|
|
.WithMany()
|
|
.HasForeignKey("LibraryId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired();
|
|
});
|
|
|
|
modelBuilder.Entity("Flaro.Core.Playback.Sehtag", b =>
|
|
{
|
|
b.HasOne("Flaro.Core.Library.Episode", null)
|
|
.WithMany()
|
|
.HasForeignKey("EpisodeId")
|
|
.OnDelete(DeleteBehavior.Cascade);
|
|
|
|
b.HasOne("Flaro.Core.Library.Movie", null)
|
|
.WithMany()
|
|
.HasForeignKey("MovieId")
|
|
.OnDelete(DeleteBehavior.Cascade);
|
|
|
|
b.HasOne("Flaro.Core.Users.User", null)
|
|
.WithMany()
|
|
.HasForeignKey("UserId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired();
|
|
});
|
|
|
|
modelBuilder.Entity("Flaro.Core.Playback.UserItemState", b =>
|
|
{
|
|
b.HasOne("Flaro.Core.Library.Episode", null)
|
|
.WithMany()
|
|
.HasForeignKey("EpisodeId")
|
|
.OnDelete(DeleteBehavior.Cascade);
|
|
|
|
b.HasOne("Flaro.Core.Library.Movie", null)
|
|
.WithMany()
|
|
.HasForeignKey("MovieId")
|
|
.OnDelete(DeleteBehavior.Cascade);
|
|
|
|
b.HasOne("Flaro.Core.Library.Series", null)
|
|
.WithMany()
|
|
.HasForeignKey("SeriesId")
|
|
.OnDelete(DeleteBehavior.Cascade);
|
|
|
|
b.HasOne("Flaro.Core.Users.User", null)
|
|
.WithMany()
|
|
.HasForeignKey("UserId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired();
|
|
});
|
|
#pragma warning restore 612, 618
|
|
}
|
|
}
|
|
}
|