rework television media (#26)

* rework television media

* refactor poster saving

* television and movie views are working again

* remove dead code

* use paper styling for all cards

* add show poster, plot to seasons page

* remove missing shows; cleanup interfaces

* fix split show display (same show in different folders/sources)

* add placeholder "add to schedule" button

* no more duplicate television shows, even with the same show split across sources

* stop releasing CLI for now

* use season number as season placeholder

* add television shows to collections

* add television seasons to collections

* add television episodes to collections

* add movies to collections

* remove movies, shows, seasons, episodes from collections

* fix page width and menus

* fix buffer size defaults

* fix chronological episode ordering

* allow deleting media collections

* don't get stuck building a playout with an empty collection

* schedule editing and playouts work again

* minor cleanup

* remove dead code

* fix bugs with viewing movies as they are loading

* add scanner tests; support nested movie folders

* update collections docs

* rearrange order of schedule items

* add show and season to schedule

* delete schedules that use legacy collections, reset all posters

* move cleanup to new migration

* load fallback metadata when nfo fails; don't require metadata in ui

* update readme and screenshots
This commit is contained in:
Jason Dove
2021-02-22 00:54:41 +00:00
committed by GitHub
parent 98cf922b3c
commit 871a031467
259 changed files with 13493 additions and 4771 deletions
@@ -22,6 +22,8 @@ namespace ErsatzTV.Infrastructure.Migrations
{
b.Property<int>("Id")
.HasColumnType("INTEGER");
b.ToView("No table or view exists for GenericIntegerId");
});
modelBuilder.Entity(
@@ -39,6 +41,8 @@ namespace ErsatzTV.Infrastructure.Migrations
b.Property<string>("Name")
.HasColumnType("TEXT");
b.ToView("No table or view exists for MediaCollectionSummary");
});
modelBuilder.Entity(
@@ -59,6 +63,8 @@ namespace ErsatzTV.Infrastructure.Migrations
b.Property<string>("Title")
.HasColumnType("TEXT");
b.ToView("No table or view exists for MediaItemSummary");
});
modelBuilder.Entity(
@@ -256,6 +262,55 @@ namespace ErsatzTV.Infrastructure.Migrations
b.ToTable("MediaSources");
});
modelBuilder.Entity(
"ErsatzTV.Core.Domain.MovieMetadata",
b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER");
b.Property<string>("ContentRating")
.HasColumnType("TEXT");
b.Property<DateTime?>("LastWriteTime")
.HasColumnType("TEXT");
b.Property<int>("MovieId")
.HasColumnType("INTEGER");
b.Property<string>("Outline")
.HasColumnType("TEXT");
b.Property<string>("Plot")
.HasColumnType("TEXT");
b.Property<DateTime?>("Premiered")
.HasColumnType("TEXT");
b.Property<string>("SortTitle")
.HasColumnType("TEXT");
b.Property<int>("Source")
.HasColumnType("INTEGER");
b.Property<string>("Tagline")
.HasColumnType("TEXT");
b.Property<string>("Title")
.HasColumnType("TEXT");
b.Property<int?>("Year")
.HasColumnType("INTEGER");
b.HasKey("Id");
b.HasIndex("MovieId")
.IsUnique();
b.ToTable("MovieMetadata");
});
modelBuilder.Entity(
"ErsatzTV.Core.Domain.Playout",
b =>
@@ -315,18 +370,25 @@ namespace ErsatzTV.Infrastructure.Migrations
"ErsatzTV.Core.Domain.PlayoutProgramScheduleAnchor",
b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER");
b.Property<int>("CollectionId")
.HasColumnType("INTEGER");
b.Property<int>("CollectionType")
.HasColumnType("INTEGER");
b.Property<int>("PlayoutId")
.HasColumnType("INTEGER");
b.Property<int>("ProgramScheduleId")
.HasColumnType("INTEGER");
b.Property<int>("MediaCollectionId")
.HasColumnType("INTEGER");
b.HasKey("Id");
b.HasKey("PlayoutId", "ProgramScheduleId", "MediaCollectionId");
b.HasIndex("MediaCollectionId");
b.HasIndex("PlayoutId");
b.HasIndex("ProgramScheduleId");
@@ -414,10 +476,13 @@ namespace ErsatzTV.Infrastructure.Migrations
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER");
b.Property<int>("CollectionType")
.HasColumnType("INTEGER");
b.Property<int>("Index")
.HasColumnType("INTEGER");
b.Property<int>("MediaCollectionId")
b.Property<int?>("MediaCollectionId")
.HasColumnType("INTEGER");
b.Property<int>("ProgramScheduleId")
@@ -426,12 +491,22 @@ namespace ErsatzTV.Infrastructure.Migrations
b.Property<TimeSpan?>("StartTime")
.HasColumnType("TEXT");
b.Property<int?>("TelevisionSeasonId")
.HasColumnType("INTEGER");
b.Property<int?>("TelevisionShowId")
.HasColumnType("INTEGER");
b.HasKey("Id");
b.HasIndex("MediaCollectionId");
b.HasIndex("ProgramScheduleId");
b.HasIndex("TelevisionSeasonId");
b.HasIndex("TelevisionShowId");
b.ToTable("ProgramScheduleItems");
});
@@ -458,20 +533,224 @@ namespace ErsatzTV.Infrastructure.Migrations
});
modelBuilder.Entity(
"MediaItemSimpleMediaCollection",
"ErsatzTV.Core.Domain.TelevisionEpisodeMetadata",
b =>
{
b.Property<int>("ItemsId")
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER");
b.Property<DateTime?>("Aired")
.HasColumnType("TEXT");
b.Property<int>("Episode")
.HasColumnType("INTEGER");
b.Property<DateTime?>("LastWriteTime")
.HasColumnType("TEXT");
b.Property<string>("Plot")
.HasColumnType("TEXT");
b.Property<int>("Season")
.HasColumnType("INTEGER");
b.Property<string>("SortTitle")
.HasColumnType("TEXT");
b.Property<int>("Source")
.HasColumnType("INTEGER");
b.Property<int>("TelevisionEpisodeId")
.HasColumnType("INTEGER");
b.Property<string>("Title")
.HasColumnType("TEXT");
b.HasKey("Id");
b.HasIndex("TelevisionEpisodeId")
.IsUnique();
b.ToTable("TelevisionEpisodeMetadata");
});
modelBuilder.Entity(
"ErsatzTV.Core.Domain.TelevisionSeason",
b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER");
b.Property<int>("Number")
.HasColumnType("INTEGER");
b.Property<string>("Path")
.HasColumnType("TEXT");
b.Property<string>("Poster")
.HasColumnType("TEXT");
b.Property<DateTime?>("PosterLastWriteTime")
.HasColumnType("TEXT");
b.Property<int>("TelevisionShowId")
.HasColumnType("INTEGER");
b.HasKey("Id");
b.HasIndex("TelevisionShowId");
b.ToTable("TelevisionSeasons");
});
modelBuilder.Entity(
"ErsatzTV.Core.Domain.TelevisionShow",
b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER");
b.Property<string>("Poster")
.HasColumnType("TEXT");
b.Property<DateTime?>("PosterLastWriteTime")
.HasColumnType("TEXT");
b.HasKey("Id");
b.ToTable("TelevisionShows");
});
modelBuilder.Entity(
"ErsatzTV.Core.Domain.TelevisionShowMetadata",
b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER");
b.Property<DateTime?>("LastWriteTime")
.HasColumnType("TEXT");
b.Property<string>("Plot")
.HasColumnType("TEXT");
b.Property<string>("SortTitle")
.HasColumnType("TEXT");
b.Property<int>("Source")
.HasColumnType("INTEGER");
b.Property<int>("TelevisionShowId")
.HasColumnType("INTEGER");
b.Property<string>("Title")
.HasColumnType("TEXT");
b.Property<int?>("Year")
.HasColumnType("INTEGER");
b.HasKey("Id");
b.HasIndex("TelevisionShowId")
.IsUnique();
b.ToTable("TelevisionShowMetadata");
});
modelBuilder.Entity(
"ErsatzTV.Core.Domain.TelevisionShowSource",
b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER");
b.Property<string>("Discriminator")
.IsRequired()
.HasColumnType("TEXT");
b.Property<int>("TelevisionShowId")
.HasColumnType("INTEGER");
b.HasKey("Id");
b.HasIndex("TelevisionShowId");
b.ToTable("TelevisionShowSource");
b.HasDiscriminator<string>("Discriminator").HasValue("TelevisionShowSource");
});
modelBuilder.Entity(
"MovieMediaItemSimpleMediaCollection",
b =>
{
b.Property<int>("MoviesId")
.HasColumnType("INTEGER");
b.Property<int>("SimpleMediaCollectionsId")
.HasColumnType("INTEGER");
b.HasKey("ItemsId", "SimpleMediaCollectionsId");
b.HasKey("MoviesId", "SimpleMediaCollectionsId");
b.HasIndex("SimpleMediaCollectionsId");
b.ToTable("MediaItemSimpleMediaCollection");
b.ToTable("SimpleMediaCollectionMovies");
});
modelBuilder.Entity(
"SimpleMediaCollectionTelevisionEpisodeMediaItem",
b =>
{
b.Property<int>("SimpleMediaCollectionsId")
.HasColumnType("INTEGER");
b.Property<int>("TelevisionEpisodesId")
.HasColumnType("INTEGER");
b.HasKey("SimpleMediaCollectionsId", "TelevisionEpisodesId");
b.HasIndex("TelevisionEpisodesId");
b.ToTable("SimpleMediaCollectionEpisodes");
});
modelBuilder.Entity(
"SimpleMediaCollectionTelevisionSeason",
b =>
{
b.Property<int>("SimpleMediaCollectionsId")
.HasColumnType("INTEGER");
b.Property<int>("TelevisionSeasonsId")
.HasColumnType("INTEGER");
b.HasKey("SimpleMediaCollectionsId", "TelevisionSeasonsId");
b.HasIndex("TelevisionSeasonsId");
b.ToTable("SimpleMediaCollectionSeasons");
});
modelBuilder.Entity(
"SimpleMediaCollectionTelevisionShow",
b =>
{
b.Property<int>("SimpleMediaCollectionsId")
.HasColumnType("INTEGER");
b.Property<int>("TelevisionShowsId")
.HasColumnType("INTEGER");
b.HasKey("SimpleMediaCollectionsId", "TelevisionShowsId");
b.HasIndex("TelevisionShowsId");
b.ToTable("SimpleMediaCollectionShows");
});
modelBuilder.Entity(
@@ -484,21 +763,29 @@ namespace ErsatzTV.Infrastructure.Migrations
});
modelBuilder.Entity(
"ErsatzTV.Core.Domain.TelevisionMediaCollection",
"ErsatzTV.Core.Domain.MovieMediaItem",
b =>
{
b.HasBaseType("ErsatzTV.Core.Domain.MediaCollection");
b.HasBaseType("ErsatzTV.Core.Domain.MediaItem");
b.Property<int?>("SeasonNumber")
b.Property<int>("MetadataId")
.HasColumnType("INTEGER");
b.Property<string>("ShowTitle")
.HasColumnType("TEXT");
b.ToTable("Movies");
});
b.HasIndex("ShowTitle", "SeasonNumber")
.IsUnique();
modelBuilder.Entity(
"ErsatzTV.Core.Domain.TelevisionEpisodeMediaItem",
b =>
{
b.HasBaseType("ErsatzTV.Core.Domain.MediaItem");
b.ToTable("TelevisionMediaCollections");
b.Property<int>("SeasonId")
.HasColumnType("INTEGER");
b.HasIndex("SeasonId");
b.ToTable("TelevisionEpisodes");
});
modelBuilder.Entity(
@@ -576,6 +863,23 @@ namespace ErsatzTV.Infrastructure.Migrations
b.ToTable("ProgramScheduleOneItems");
});
modelBuilder.Entity(
"ErsatzTV.Core.Domain.LocalTelevisionShowSource",
b =>
{
b.HasBaseType("ErsatzTV.Core.Domain.TelevisionShowSource");
b.Property<int>("MediaSourceId")
.HasColumnType("INTEGER");
b.Property<string>("Path")
.HasColumnType("TEXT");
b.HasIndex("MediaSourceId");
b.HasDiscriminator().HasValue("LocalTelevisionShowSource");
});
modelBuilder.Entity(
"ErsatzTV.Core.Domain.Channel",
b =>
@@ -613,61 +917,31 @@ namespace ErsatzTV.Infrastructure.Migrations
.IsRequired();
b.OwnsOne(
"ErsatzTV.Core.Domain.MediaMetadata",
"Metadata",
"ErsatzTV.Core.Domain.MediaItemStatistics",
"Statistics",
b1 =>
{
b1.Property<int>("MediaItemId")
.HasColumnType("INTEGER");
b1.Property<DateTime?>("Aired")
.HasColumnType("TEXT");
b1.Property<string>("AudioCodec")
.HasColumnType("TEXT");
b1.Property<string>("ContentRating")
.HasColumnType("TEXT");
b1.Property<string>("Description")
.HasColumnType("TEXT");
b1.Property<string>("DisplayAspectRatio")
.HasColumnType("TEXT");
b1.Property<TimeSpan>("Duration")
.HasColumnType("TEXT");
b1.Property<int?>("EpisodeNumber")
.HasColumnType("INTEGER");
b1.Property<int>("Height")
.HasColumnType("INTEGER");
b1.Property<DateTime?>("LastWriteTime")
.HasColumnType("TEXT");
b1.Property<int>("MediaType")
.HasColumnType("INTEGER");
b1.Property<string>("SampleAspectRatio")
.HasColumnType("TEXT");
b1.Property<int?>("SeasonNumber")
.HasColumnType("INTEGER");
b1.Property<string>("SortTitle")
.HasColumnType("TEXT");
b1.Property<int>("Source")
.HasColumnType("INTEGER");
b1.Property<string>("Subtitle")
.HasColumnType("TEXT");
b1.Property<string>("Title")
.HasColumnType("TEXT");
b1.Property<string>("VideoCodec")
.HasColumnType("TEXT");
@@ -685,9 +959,22 @@ namespace ErsatzTV.Infrastructure.Migrations
.HasForeignKey("MediaItemId");
});
b.Navigation("Metadata");
b.Navigation("Source");
b.Navigation("Statistics");
});
modelBuilder.Entity(
"ErsatzTV.Core.Domain.MovieMetadata",
b =>
{
b.HasOne("ErsatzTV.Core.Domain.MovieMediaItem", "Movie")
.WithOne("Metadata")
.HasForeignKey("ErsatzTV.Core.Domain.MovieMetadata", "MovieId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Movie");
});
modelBuilder.Entity(
@@ -770,12 +1057,6 @@ namespace ErsatzTV.Infrastructure.Migrations
"ErsatzTV.Core.Domain.PlayoutProgramScheduleAnchor",
b =>
{
b.HasOne("ErsatzTV.Core.Domain.MediaCollection", "MediaCollection")
.WithMany()
.HasForeignKey("MediaCollectionId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("ErsatzTV.Core.Domain.Playout", "Playout")
.WithMany("ProgramScheduleAnchors")
.HasForeignKey("PlayoutId")
@@ -793,13 +1074,7 @@ namespace ErsatzTV.Infrastructure.Migrations
"EnumeratorState",
b1 =>
{
b1.Property<int>("PlayoutProgramScheduleAnchorPlayoutId")
.HasColumnType("INTEGER");
b1.Property<int>("PlayoutProgramScheduleAnchorProgramScheduleId")
.HasColumnType("INTEGER");
b1.Property<int>("PlayoutProgramScheduleAnchorMediaCollectionId")
b1.Property<int>("PlayoutProgramScheduleAnchorId")
.HasColumnType("INTEGER");
b1.Property<int>("Index")
@@ -808,24 +1083,16 @@ namespace ErsatzTV.Infrastructure.Migrations
b1.Property<int>("Seed")
.HasColumnType("INTEGER");
b1.HasKey(
"PlayoutProgramScheduleAnchorPlayoutId",
"PlayoutProgramScheduleAnchorProgramScheduleId",
"PlayoutProgramScheduleAnchorMediaCollectionId");
b1.HasKey("PlayoutProgramScheduleAnchorId");
b1.ToTable("PlayoutProgramScheduleItemAnchors");
b1.WithOwner()
.HasForeignKey(
"PlayoutProgramScheduleAnchorPlayoutId",
"PlayoutProgramScheduleAnchorProgramScheduleId",
"PlayoutProgramScheduleAnchorMediaCollectionId");
.HasForeignKey("PlayoutProgramScheduleAnchorId");
});
b.Navigation("EnumeratorState");
b.Navigation("MediaCollection");
b.Navigation("Playout");
b.Navigation("ProgramSchedule");
@@ -855,9 +1122,7 @@ namespace ErsatzTV.Infrastructure.Migrations
{
b.HasOne("ErsatzTV.Core.Domain.MediaCollection", "MediaCollection")
.WithMany()
.HasForeignKey("MediaCollectionId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
.HasForeignKey("MediaCollectionId");
b.HasOne("ErsatzTV.Core.Domain.ProgramSchedule", "ProgramSchedule")
.WithMany("Items")
@@ -865,18 +1130,82 @@ namespace ErsatzTV.Infrastructure.Migrations
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("ErsatzTV.Core.Domain.TelevisionSeason", "TelevisionSeason")
.WithMany()
.HasForeignKey("TelevisionSeasonId");
b.HasOne("ErsatzTV.Core.Domain.TelevisionShow", "TelevisionShow")
.WithMany()
.HasForeignKey("TelevisionShowId");
b.Navigation("MediaCollection");
b.Navigation("ProgramSchedule");
b.Navigation("TelevisionSeason");
b.Navigation("TelevisionShow");
});
modelBuilder.Entity(
"MediaItemSimpleMediaCollection",
"ErsatzTV.Core.Domain.TelevisionEpisodeMetadata",
b =>
{
b.HasOne("ErsatzTV.Core.Domain.MediaItem", null)
b.HasOne("ErsatzTV.Core.Domain.TelevisionEpisodeMediaItem", "TelevisionEpisode")
.WithOne("Metadata")
.HasForeignKey("ErsatzTV.Core.Domain.TelevisionEpisodeMetadata", "TelevisionEpisodeId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("TelevisionEpisode");
});
modelBuilder.Entity(
"ErsatzTV.Core.Domain.TelevisionSeason",
b =>
{
b.HasOne("ErsatzTV.Core.Domain.TelevisionShow", "TelevisionShow")
.WithMany("Seasons")
.HasForeignKey("TelevisionShowId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("TelevisionShow");
});
modelBuilder.Entity(
"ErsatzTV.Core.Domain.TelevisionShowMetadata",
b =>
{
b.HasOne("ErsatzTV.Core.Domain.TelevisionShow", "TelevisionShow")
.WithOne("Metadata")
.HasForeignKey("ErsatzTV.Core.Domain.TelevisionShowMetadata", "TelevisionShowId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("TelevisionShow");
});
modelBuilder.Entity(
"ErsatzTV.Core.Domain.TelevisionShowSource",
b =>
{
b.HasOne("ErsatzTV.Core.Domain.TelevisionShow", "TelevisionShow")
.WithMany("Sources")
.HasForeignKey("TelevisionShowId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("TelevisionShow");
});
modelBuilder.Entity(
"MovieMediaItemSimpleMediaCollection",
b =>
{
b.HasOne("ErsatzTV.Core.Domain.MovieMediaItem", null)
.WithMany()
.HasForeignKey("ItemsId")
.HasForeignKey("MoviesId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
@@ -887,6 +1216,57 @@ namespace ErsatzTV.Infrastructure.Migrations
.IsRequired();
});
modelBuilder.Entity(
"SimpleMediaCollectionTelevisionEpisodeMediaItem",
b =>
{
b.HasOne("ErsatzTV.Core.Domain.SimpleMediaCollection", null)
.WithMany()
.HasForeignKey("SimpleMediaCollectionsId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("ErsatzTV.Core.Domain.TelevisionEpisodeMediaItem", null)
.WithMany()
.HasForeignKey("TelevisionEpisodesId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity(
"SimpleMediaCollectionTelevisionSeason",
b =>
{
b.HasOne("ErsatzTV.Core.Domain.SimpleMediaCollection", null)
.WithMany()
.HasForeignKey("SimpleMediaCollectionsId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("ErsatzTV.Core.Domain.TelevisionSeason", null)
.WithMany()
.HasForeignKey("TelevisionSeasonsId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity(
"SimpleMediaCollectionTelevisionShow",
b =>
{
b.HasOne("ErsatzTV.Core.Domain.SimpleMediaCollection", null)
.WithMany()
.HasForeignKey("SimpleMediaCollectionsId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("ErsatzTV.Core.Domain.TelevisionShow", null)
.WithMany()
.HasForeignKey("TelevisionShowsId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity(
"ErsatzTV.Core.Domain.SimpleMediaCollection",
b =>
@@ -899,16 +1279,35 @@ namespace ErsatzTV.Infrastructure.Migrations
});
modelBuilder.Entity(
"ErsatzTV.Core.Domain.TelevisionMediaCollection",
"ErsatzTV.Core.Domain.MovieMediaItem",
b =>
{
b.HasOne("ErsatzTV.Core.Domain.MediaCollection", null)
b.HasOne("ErsatzTV.Core.Domain.MediaItem", null)
.WithOne()
.HasForeignKey("ErsatzTV.Core.Domain.TelevisionMediaCollection", "Id")
.HasForeignKey("ErsatzTV.Core.Domain.MovieMediaItem", "Id")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity(
"ErsatzTV.Core.Domain.TelevisionEpisodeMediaItem",
b =>
{
b.HasOne("ErsatzTV.Core.Domain.MediaItem", null)
.WithOne()
.HasForeignKey("ErsatzTV.Core.Domain.TelevisionEpisodeMediaItem", "Id")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("ErsatzTV.Core.Domain.TelevisionSeason", "Season")
.WithMany("Episodes")
.HasForeignKey("SeasonId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Season");
});
modelBuilder.Entity(
"ErsatzTV.Core.Domain.LocalMediaSource",
b =>
@@ -975,6 +1374,19 @@ namespace ErsatzTV.Infrastructure.Migrations
.IsRequired();
});
modelBuilder.Entity(
"ErsatzTV.Core.Domain.LocalTelevisionShowSource",
b =>
{
b.HasOne("ErsatzTV.Core.Domain.LocalMediaSource", "MediaSource")
.WithMany()
.HasForeignKey("MediaSourceId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("MediaSource");
});
modelBuilder.Entity("ErsatzTV.Core.Domain.Channel", b => { b.Navigation("Playouts"); });
modelBuilder.Entity(
@@ -995,6 +1407,23 @@ namespace ErsatzTV.Infrastructure.Migrations
b.Navigation("Playouts");
});
modelBuilder.Entity("ErsatzTV.Core.Domain.TelevisionSeason", b => { b.Navigation("Episodes"); });
modelBuilder.Entity(
"ErsatzTV.Core.Domain.TelevisionShow",
b =>
{
b.Navigation("Metadata");
b.Navigation("Seasons");
b.Navigation("Sources");
});
modelBuilder.Entity("ErsatzTV.Core.Domain.MovieMediaItem", b => { b.Navigation("Metadata"); });
modelBuilder.Entity("ErsatzTV.Core.Domain.TelevisionEpisodeMediaItem", b => { b.Navigation("Metadata"); });
modelBuilder.Entity(
"ErsatzTV.Core.Domain.PlexMediaSource",
b =>