diff --git a/ErsatzTV.Infrastructure/Migrations/20210220220723_ScheduleCollectionTypes.cs b/ErsatzTV.Infrastructure/Migrations/20210220220723_ScheduleCollectionTypes.cs
index c3fb472a6..22c5aabe8 100644
--- a/ErsatzTV.Infrastructure/Migrations/20210220220723_ScheduleCollectionTypes.cs
+++ b/ErsatzTV.Infrastructure/Migrations/20210220220723_ScheduleCollectionTypes.cs
@@ -112,17 +112,6 @@ namespace ErsatzTV.Infrastructure.Migrations
"TelevisionShows",
principalColumn: "Id",
onDelete: ReferentialAction.Restrict);
-
- // delete program schedule items that referenced television collections (that no longer exist)
- migrationBuilder.Sql(
- "delete from ProgramScheduleItems where MediaCollectionId not in (select Id from SimpleMediaCollections)");
-
- // delete television collections that no longer exist/work
- migrationBuilder.Sql(
- "delete from MediaCollections where Id not in (select Id from SimpleMediaCollections)");
-
- // delete all posters so they are all re-cached with a higher resolution
- migrationBuilder.Sql("update MediaItems set Poster = null");
}
protected override void Down(MigrationBuilder migrationBuilder)
diff --git a/ErsatzTV.Infrastructure/Migrations/20210221215810_RemoveScheduleItemsAndPosters.Designer.cs b/ErsatzTV.Infrastructure/Migrations/20210221215810_RemoveScheduleItemsAndPosters.Designer.cs
new file mode 100644
index 000000000..43d14bf0f
--- /dev/null
+++ b/ErsatzTV.Infrastructure/Migrations/20210221215810_RemoveScheduleItemsAndPosters.Designer.cs
@@ -0,0 +1,1305 @@
+//
+using System;
+using ErsatzTV.Infrastructure.Data;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+
+namespace ErsatzTV.Infrastructure.Migrations
+{
+ [DbContext(typeof(TvContext))]
+ [Migration("20210221215810_RemoveScheduleItemsAndPosters")]
+ partial class RemoveScheduleItemsAndPosters
+ {
+ protected override void BuildTargetModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .HasAnnotation("ProductVersion", "5.0.3");
+
+ modelBuilder.Entity("ErsatzTV.Core.AggregateModels.GenericIntegerId", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("INTEGER");
+
+ b.ToView("No table or view exists for GenericIntegerId");
+ });
+
+ modelBuilder.Entity("ErsatzTV.Core.AggregateModels.MediaCollectionSummary", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("INTEGER");
+
+ b.Property("IsSimple")
+ .HasColumnType("INTEGER");
+
+ b.Property("ItemCount")
+ .HasColumnType("INTEGER");
+
+ b.Property("Name")
+ .HasColumnType("TEXT");
+
+ b.ToView("No table or view exists for MediaCollectionSummary");
+ });
+
+ modelBuilder.Entity("ErsatzTV.Core.AggregateModels.MediaItemSummary", b =>
+ {
+ b.Property("MediaItemId")
+ .HasColumnType("INTEGER");
+
+ b.Property("Poster")
+ .HasColumnType("TEXT");
+
+ b.Property("SortTitle")
+ .HasColumnType("TEXT");
+
+ b.Property("Subtitle")
+ .HasColumnType("TEXT");
+
+ b.Property("Title")
+ .HasColumnType("TEXT");
+
+ b.ToView("No table or view exists for MediaItemSummary");
+ });
+
+ modelBuilder.Entity("ErsatzTV.Core.Domain.Channel", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("FFmpegProfileId")
+ .HasColumnType("INTEGER");
+
+ b.Property("Logo")
+ .HasColumnType("TEXT");
+
+ b.Property("Name")
+ .HasColumnType("TEXT");
+
+ b.Property("Number")
+ .HasColumnType("INTEGER");
+
+ b.Property("StreamingMode")
+ .HasColumnType("INTEGER");
+
+ b.Property("UniqueId")
+ .HasColumnType("TEXT");
+
+ b.HasKey("Id");
+
+ b.HasIndex("FFmpegProfileId");
+
+ b.HasIndex("Number")
+ .IsUnique();
+
+ b.ToTable("Channels");
+ });
+
+ modelBuilder.Entity("ErsatzTV.Core.Domain.ConfigElement", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("Key")
+ .HasColumnType("TEXT");
+
+ b.Property("Value")
+ .HasColumnType("TEXT");
+
+ b.HasKey("Id");
+
+ b.HasIndex("Key")
+ .IsUnique();
+
+ b.ToTable("ConfigElements");
+ });
+
+ modelBuilder.Entity("ErsatzTV.Core.Domain.FFmpegProfile", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("AudioBitrate")
+ .HasColumnType("INTEGER");
+
+ b.Property("AudioBufferSize")
+ .HasColumnType("INTEGER");
+
+ b.Property("AudioChannels")
+ .HasColumnType("INTEGER");
+
+ b.Property("AudioCodec")
+ .HasColumnType("TEXT");
+
+ b.Property("AudioSampleRate")
+ .HasColumnType("INTEGER");
+
+ b.Property("AudioVolume")
+ .HasColumnType("INTEGER");
+
+ b.Property("Name")
+ .HasColumnType("TEXT");
+
+ b.Property("NormalizeAudio")
+ .HasColumnType("INTEGER");
+
+ b.Property("NormalizeAudioCodec")
+ .HasColumnType("INTEGER");
+
+ b.Property("NormalizeResolution")
+ .HasColumnType("INTEGER");
+
+ b.Property("NormalizeVideoCodec")
+ .HasColumnType("INTEGER");
+
+ b.Property("ResolutionId")
+ .HasColumnType("INTEGER");
+
+ b.Property("ThreadCount")
+ .HasColumnType("INTEGER");
+
+ b.Property("Transcode")
+ .HasColumnType("INTEGER");
+
+ b.Property("VideoBitrate")
+ .HasColumnType("INTEGER");
+
+ b.Property("VideoBufferSize")
+ .HasColumnType("INTEGER");
+
+ b.Property("VideoCodec")
+ .HasColumnType("TEXT");
+
+ b.HasKey("Id");
+
+ b.HasIndex("ResolutionId");
+
+ b.ToTable("FFmpegProfiles");
+ });
+
+ modelBuilder.Entity("ErsatzTV.Core.Domain.MediaCollection", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("Name")
+ .HasColumnType("TEXT");
+
+ b.HasKey("Id");
+
+ b.HasIndex("Name")
+ .IsUnique();
+
+ b.ToTable("MediaCollections");
+ });
+
+ modelBuilder.Entity("ErsatzTV.Core.Domain.MediaItem", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("LastWriteTime")
+ .HasColumnType("TEXT");
+
+ b.Property("MediaSourceId")
+ .HasColumnType("INTEGER");
+
+ b.Property("Path")
+ .HasColumnType("TEXT");
+
+ b.Property("Poster")
+ .HasColumnType("TEXT");
+
+ b.Property("PosterLastWriteTime")
+ .HasColumnType("TEXT");
+
+ b.HasKey("Id");
+
+ b.HasIndex("MediaSourceId");
+
+ b.ToTable("MediaItems");
+ });
+
+ modelBuilder.Entity("ErsatzTV.Core.Domain.MediaSource", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("Name")
+ .HasColumnType("TEXT");
+
+ b.Property("SourceType")
+ .HasColumnType("INTEGER");
+
+ b.HasKey("Id");
+
+ b.HasIndex("Name")
+ .IsUnique();
+
+ b.ToTable("MediaSources");
+ });
+
+ modelBuilder.Entity("ErsatzTV.Core.Domain.MovieMetadata", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("ContentRating")
+ .HasColumnType("TEXT");
+
+ b.Property("LastWriteTime")
+ .HasColumnType("TEXT");
+
+ b.Property("MovieId")
+ .HasColumnType("INTEGER");
+
+ b.Property("Outline")
+ .HasColumnType("TEXT");
+
+ b.Property("Plot")
+ .HasColumnType("TEXT");
+
+ b.Property("Premiered")
+ .HasColumnType("TEXT");
+
+ b.Property("SortTitle")
+ .HasColumnType("TEXT");
+
+ b.Property("Source")
+ .HasColumnType("INTEGER");
+
+ b.Property("Tagline")
+ .HasColumnType("TEXT");
+
+ b.Property("Title")
+ .HasColumnType("TEXT");
+
+ b.Property("Year")
+ .HasColumnType("INTEGER");
+
+ b.HasKey("Id");
+
+ b.HasIndex("MovieId")
+ .IsUnique();
+
+ b.ToTable("MovieMetadata");
+ });
+
+ modelBuilder.Entity("ErsatzTV.Core.Domain.Playout", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("ChannelId")
+ .HasColumnType("INTEGER");
+
+ b.Property("ProgramScheduleId")
+ .HasColumnType("INTEGER");
+
+ b.Property("ProgramSchedulePlayoutType")
+ .HasColumnType("INTEGER");
+
+ b.HasKey("Id");
+
+ b.HasIndex("ChannelId");
+
+ b.HasIndex("ProgramScheduleId");
+
+ b.ToTable("Playouts");
+ });
+
+ modelBuilder.Entity("ErsatzTV.Core.Domain.PlayoutItem", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("Finish")
+ .HasColumnType("TEXT");
+
+ b.Property("MediaItemId")
+ .HasColumnType("INTEGER");
+
+ b.Property("PlayoutId")
+ .HasColumnType("INTEGER");
+
+ b.Property("Start")
+ .HasColumnType("TEXT");
+
+ b.HasKey("Id");
+
+ b.HasIndex("MediaItemId");
+
+ b.HasIndex("PlayoutId");
+
+ b.ToTable("PlayoutItems");
+ });
+
+ modelBuilder.Entity("ErsatzTV.Core.Domain.PlayoutProgramScheduleAnchor", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("CollectionId")
+ .HasColumnType("INTEGER");
+
+ b.Property("CollectionType")
+ .HasColumnType("INTEGER");
+
+ b.Property("PlayoutId")
+ .HasColumnType("INTEGER");
+
+ b.Property("ProgramScheduleId")
+ .HasColumnType("INTEGER");
+
+ b.HasKey("Id");
+
+ b.HasIndex("PlayoutId");
+
+ b.HasIndex("ProgramScheduleId");
+
+ b.ToTable("PlayoutProgramScheduleItemAnchors");
+ });
+
+ modelBuilder.Entity("ErsatzTV.Core.Domain.PlexMediaSourceConnection", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("IsActive")
+ .HasColumnType("INTEGER");
+
+ b.Property("PlexMediaSourceId")
+ .HasColumnType("INTEGER");
+
+ b.Property("Uri")
+ .HasColumnType("TEXT");
+
+ b.HasKey("Id");
+
+ b.HasIndex("PlexMediaSourceId");
+
+ b.ToTable("PlexMediaSourceConnections");
+ });
+
+ modelBuilder.Entity("ErsatzTV.Core.Domain.PlexMediaSourceLibrary", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("Key")
+ .HasColumnType("TEXT");
+
+ b.Property("MediaType")
+ .HasColumnType("INTEGER");
+
+ b.Property("Name")
+ .HasColumnType("TEXT");
+
+ b.Property("PlexMediaSourceId")
+ .HasColumnType("INTEGER");
+
+ b.HasKey("Id");
+
+ b.HasIndex("PlexMediaSourceId");
+
+ b.ToTable("PlexMediaSourceLibraries");
+ });
+
+ modelBuilder.Entity("ErsatzTV.Core.Domain.ProgramSchedule", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("MediaCollectionPlaybackOrder")
+ .HasColumnType("INTEGER");
+
+ b.Property("Name")
+ .HasColumnType("TEXT");
+
+ b.HasKey("Id");
+
+ b.HasIndex("Name")
+ .IsUnique();
+
+ b.ToTable("ProgramSchedules");
+ });
+
+ modelBuilder.Entity("ErsatzTV.Core.Domain.ProgramScheduleItem", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("CollectionType")
+ .HasColumnType("INTEGER");
+
+ b.Property("Index")
+ .HasColumnType("INTEGER");
+
+ b.Property("MediaCollectionId")
+ .HasColumnType("INTEGER");
+
+ b.Property("ProgramScheduleId")
+ .HasColumnType("INTEGER");
+
+ b.Property("StartTime")
+ .HasColumnType("TEXT");
+
+ b.Property("TelevisionSeasonId")
+ .HasColumnType("INTEGER");
+
+ b.Property("TelevisionShowId")
+ .HasColumnType("INTEGER");
+
+ b.HasKey("Id");
+
+ b.HasIndex("MediaCollectionId");
+
+ b.HasIndex("ProgramScheduleId");
+
+ b.HasIndex("TelevisionSeasonId");
+
+ b.HasIndex("TelevisionShowId");
+
+ b.ToTable("ProgramScheduleItems");
+ });
+
+ modelBuilder.Entity("ErsatzTV.Core.Domain.Resolution", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("Height")
+ .HasColumnType("INTEGER");
+
+ b.Property("Name")
+ .HasColumnType("TEXT");
+
+ b.Property("Width")
+ .HasColumnType("INTEGER");
+
+ b.HasKey("Id");
+
+ b.ToTable("Resolutions");
+ });
+
+ modelBuilder.Entity("ErsatzTV.Core.Domain.TelevisionEpisodeMetadata", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("Aired")
+ .HasColumnType("TEXT");
+
+ b.Property("Episode")
+ .HasColumnType("INTEGER");
+
+ b.Property("LastWriteTime")
+ .HasColumnType("TEXT");
+
+ b.Property("Plot")
+ .HasColumnType("TEXT");
+
+ b.Property("Season")
+ .HasColumnType("INTEGER");
+
+ b.Property("SortTitle")
+ .HasColumnType("TEXT");
+
+ b.Property("Source")
+ .HasColumnType("INTEGER");
+
+ b.Property("TelevisionEpisodeId")
+ .HasColumnType("INTEGER");
+
+ b.Property("Title")
+ .HasColumnType("TEXT");
+
+ b.HasKey("Id");
+
+ b.HasIndex("TelevisionEpisodeId")
+ .IsUnique();
+
+ b.ToTable("TelevisionEpisodeMetadata");
+ });
+
+ modelBuilder.Entity("ErsatzTV.Core.Domain.TelevisionSeason", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("Number")
+ .HasColumnType("INTEGER");
+
+ b.Property("Path")
+ .HasColumnType("TEXT");
+
+ b.Property("Poster")
+ .HasColumnType("TEXT");
+
+ b.Property("PosterLastWriteTime")
+ .HasColumnType("TEXT");
+
+ b.Property("TelevisionShowId")
+ .HasColumnType("INTEGER");
+
+ b.HasKey("Id");
+
+ b.HasIndex("TelevisionShowId");
+
+ b.ToTable("TelevisionSeasons");
+ });
+
+ modelBuilder.Entity("ErsatzTV.Core.Domain.TelevisionShow", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("Poster")
+ .HasColumnType("TEXT");
+
+ b.Property("PosterLastWriteTime")
+ .HasColumnType("TEXT");
+
+ b.HasKey("Id");
+
+ b.ToTable("TelevisionShows");
+ });
+
+ modelBuilder.Entity("ErsatzTV.Core.Domain.TelevisionShowMetadata", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("LastWriteTime")
+ .HasColumnType("TEXT");
+
+ b.Property("Plot")
+ .HasColumnType("TEXT");
+
+ b.Property("SortTitle")
+ .HasColumnType("TEXT");
+
+ b.Property("Source")
+ .HasColumnType("INTEGER");
+
+ b.Property("TelevisionShowId")
+ .HasColumnType("INTEGER");
+
+ b.Property("Title")
+ .HasColumnType("TEXT");
+
+ b.Property("Year")
+ .HasColumnType("INTEGER");
+
+ b.HasKey("Id");
+
+ b.HasIndex("TelevisionShowId")
+ .IsUnique();
+
+ b.ToTable("TelevisionShowMetadata");
+ });
+
+ modelBuilder.Entity("ErsatzTV.Core.Domain.TelevisionShowSource", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("Discriminator")
+ .IsRequired()
+ .HasColumnType("TEXT");
+
+ b.Property("TelevisionShowId")
+ .HasColumnType("INTEGER");
+
+ b.HasKey("Id");
+
+ b.HasIndex("TelevisionShowId");
+
+ b.ToTable("TelevisionShowSource");
+
+ b.HasDiscriminator("Discriminator").HasValue("TelevisionShowSource");
+ });
+
+ modelBuilder.Entity("MovieMediaItemSimpleMediaCollection", b =>
+ {
+ b.Property("MoviesId")
+ .HasColumnType("INTEGER");
+
+ b.Property("SimpleMediaCollectionsId")
+ .HasColumnType("INTEGER");
+
+ b.HasKey("MoviesId", "SimpleMediaCollectionsId");
+
+ b.HasIndex("SimpleMediaCollectionsId");
+
+ b.ToTable("SimpleMediaCollectionMovies");
+ });
+
+ modelBuilder.Entity("SimpleMediaCollectionTelevisionEpisodeMediaItem", b =>
+ {
+ b.Property("SimpleMediaCollectionsId")
+ .HasColumnType("INTEGER");
+
+ b.Property("TelevisionEpisodesId")
+ .HasColumnType("INTEGER");
+
+ b.HasKey("SimpleMediaCollectionsId", "TelevisionEpisodesId");
+
+ b.HasIndex("TelevisionEpisodesId");
+
+ b.ToTable("SimpleMediaCollectionEpisodes");
+ });
+
+ modelBuilder.Entity("SimpleMediaCollectionTelevisionSeason", b =>
+ {
+ b.Property("SimpleMediaCollectionsId")
+ .HasColumnType("INTEGER");
+
+ b.Property("TelevisionSeasonsId")
+ .HasColumnType("INTEGER");
+
+ b.HasKey("SimpleMediaCollectionsId", "TelevisionSeasonsId");
+
+ b.HasIndex("TelevisionSeasonsId");
+
+ b.ToTable("SimpleMediaCollectionSeasons");
+ });
+
+ modelBuilder.Entity("SimpleMediaCollectionTelevisionShow", b =>
+ {
+ b.Property("SimpleMediaCollectionsId")
+ .HasColumnType("INTEGER");
+
+ b.Property("TelevisionShowsId")
+ .HasColumnType("INTEGER");
+
+ b.HasKey("SimpleMediaCollectionsId", "TelevisionShowsId");
+
+ b.HasIndex("TelevisionShowsId");
+
+ b.ToTable("SimpleMediaCollectionShows");
+ });
+
+ modelBuilder.Entity("ErsatzTV.Core.Domain.SimpleMediaCollection", b =>
+ {
+ b.HasBaseType("ErsatzTV.Core.Domain.MediaCollection");
+
+ b.ToTable("SimpleMediaCollections");
+ });
+
+ modelBuilder.Entity("ErsatzTV.Core.Domain.MovieMediaItem", b =>
+ {
+ b.HasBaseType("ErsatzTV.Core.Domain.MediaItem");
+
+ b.Property("MetadataId")
+ .HasColumnType("INTEGER");
+
+ b.ToTable("Movies");
+ });
+
+ modelBuilder.Entity("ErsatzTV.Core.Domain.TelevisionEpisodeMediaItem", b =>
+ {
+ b.HasBaseType("ErsatzTV.Core.Domain.MediaItem");
+
+ b.Property("SeasonId")
+ .HasColumnType("INTEGER");
+
+ b.HasIndex("SeasonId");
+
+ b.ToTable("TelevisionEpisodes");
+ });
+
+ modelBuilder.Entity("ErsatzTV.Core.Domain.LocalMediaSource", b =>
+ {
+ b.HasBaseType("ErsatzTV.Core.Domain.MediaSource");
+
+ b.Property("Folder")
+ .HasColumnType("TEXT");
+
+ b.Property("MediaType")
+ .HasColumnType("INTEGER");
+
+ b.ToTable("LocalMediaSources");
+ });
+
+ modelBuilder.Entity("ErsatzTV.Core.Domain.PlexMediaSource", b =>
+ {
+ b.HasBaseType("ErsatzTV.Core.Domain.MediaSource");
+
+ b.Property("ClientIdentifier")
+ .HasColumnType("TEXT");
+
+ b.Property("ProductVersion")
+ .HasColumnType("TEXT");
+
+ b.ToTable("PlexMediaSources");
+ });
+
+ modelBuilder.Entity("ErsatzTV.Core.Domain.ProgramScheduleItemDuration", b =>
+ {
+ b.HasBaseType("ErsatzTV.Core.Domain.ProgramScheduleItem");
+
+ b.Property("OfflineTail")
+ .HasColumnType("INTEGER");
+
+ b.Property("PlayoutDuration")
+ .HasColumnType("TEXT");
+
+ b.ToTable("ProgramScheduleDurationItems");
+ });
+
+ modelBuilder.Entity("ErsatzTV.Core.Domain.ProgramScheduleItemFlood", b =>
+ {
+ b.HasBaseType("ErsatzTV.Core.Domain.ProgramScheduleItem");
+
+ b.ToTable("ProgramScheduleFloodItems");
+ });
+
+ modelBuilder.Entity("ErsatzTV.Core.Domain.ProgramScheduleItemMultiple", b =>
+ {
+ b.HasBaseType("ErsatzTV.Core.Domain.ProgramScheduleItem");
+
+ b.Property("Count")
+ .HasColumnType("INTEGER");
+
+ b.ToTable("ProgramScheduleMultipleItems");
+ });
+
+ modelBuilder.Entity("ErsatzTV.Core.Domain.ProgramScheduleItemOne", b =>
+ {
+ b.HasBaseType("ErsatzTV.Core.Domain.ProgramScheduleItem");
+
+ b.ToTable("ProgramScheduleOneItems");
+ });
+
+ modelBuilder.Entity("ErsatzTV.Core.Domain.LocalTelevisionShowSource", b =>
+ {
+ b.HasBaseType("ErsatzTV.Core.Domain.TelevisionShowSource");
+
+ b.Property("MediaSourceId")
+ .HasColumnType("INTEGER");
+
+ b.Property("Path")
+ .HasColumnType("TEXT");
+
+ b.HasIndex("MediaSourceId");
+
+ b.HasDiscriminator().HasValue("LocalTelevisionShowSource");
+ });
+
+ modelBuilder.Entity("ErsatzTV.Core.Domain.Channel", b =>
+ {
+ b.HasOne("ErsatzTV.Core.Domain.FFmpegProfile", "FFmpegProfile")
+ .WithMany()
+ .HasForeignKey("FFmpegProfileId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.Navigation("FFmpegProfile");
+ });
+
+ modelBuilder.Entity("ErsatzTV.Core.Domain.FFmpegProfile", b =>
+ {
+ b.HasOne("ErsatzTV.Core.Domain.Resolution", "Resolution")
+ .WithMany()
+ .HasForeignKey("ResolutionId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.Navigation("Resolution");
+ });
+
+ modelBuilder.Entity("ErsatzTV.Core.Domain.MediaItem", b =>
+ {
+ b.HasOne("ErsatzTV.Core.Domain.MediaSource", "Source")
+ .WithMany()
+ .HasForeignKey("MediaSourceId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.OwnsOne("ErsatzTV.Core.Domain.MediaItemStatistics", "Statistics", b1 =>
+ {
+ b1.Property("MediaItemId")
+ .HasColumnType("INTEGER");
+
+ b1.Property("AudioCodec")
+ .HasColumnType("TEXT");
+
+ b1.Property("DisplayAspectRatio")
+ .HasColumnType("TEXT");
+
+ b1.Property("Duration")
+ .HasColumnType("TEXT");
+
+ b1.Property("Height")
+ .HasColumnType("INTEGER");
+
+ b1.Property("LastWriteTime")
+ .HasColumnType("TEXT");
+
+ b1.Property("SampleAspectRatio")
+ .HasColumnType("TEXT");
+
+ b1.Property("VideoCodec")
+ .HasColumnType("TEXT");
+
+ b1.Property("VideoScanType")
+ .HasColumnType("INTEGER");
+
+ b1.Property("Width")
+ .HasColumnType("INTEGER");
+
+ b1.HasKey("MediaItemId");
+
+ b1.ToTable("MediaItems");
+
+ b1.WithOwner()
+ .HasForeignKey("MediaItemId");
+ });
+
+ 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("ErsatzTV.Core.Domain.Playout", b =>
+ {
+ b.HasOne("ErsatzTV.Core.Domain.Channel", "Channel")
+ .WithMany("Playouts")
+ .HasForeignKey("ChannelId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.HasOne("ErsatzTV.Core.Domain.ProgramSchedule", "ProgramSchedule")
+ .WithMany("Playouts")
+ .HasForeignKey("ProgramScheduleId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.OwnsOne("ErsatzTV.Core.Domain.PlayoutAnchor", "Anchor", b1 =>
+ {
+ b1.Property("PlayoutId")
+ .HasColumnType("INTEGER");
+
+ b1.Property("NextScheduleItemId")
+ .HasColumnType("INTEGER");
+
+ b1.Property("NextStart")
+ .HasColumnType("TEXT");
+
+ b1.HasKey("PlayoutId");
+
+ b1.HasIndex("NextScheduleItemId");
+
+ b1.ToTable("Playouts");
+
+ b1.HasOne("ErsatzTV.Core.Domain.ProgramScheduleItem", "NextScheduleItem")
+ .WithMany()
+ .HasForeignKey("NextScheduleItemId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b1.WithOwner()
+ .HasForeignKey("PlayoutId");
+
+ b1.Navigation("NextScheduleItem");
+ });
+
+ b.Navigation("Anchor");
+
+ b.Navigation("Channel");
+
+ b.Navigation("ProgramSchedule");
+ });
+
+ modelBuilder.Entity("ErsatzTV.Core.Domain.PlayoutItem", b =>
+ {
+ b.HasOne("ErsatzTV.Core.Domain.MediaItem", "MediaItem")
+ .WithMany()
+ .HasForeignKey("MediaItemId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.HasOne("ErsatzTV.Core.Domain.Playout", "Playout")
+ .WithMany("Items")
+ .HasForeignKey("PlayoutId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.Navigation("MediaItem");
+
+ b.Navigation("Playout");
+ });
+
+ modelBuilder.Entity("ErsatzTV.Core.Domain.PlayoutProgramScheduleAnchor", b =>
+ {
+ b.HasOne("ErsatzTV.Core.Domain.Playout", "Playout")
+ .WithMany("ProgramScheduleAnchors")
+ .HasForeignKey("PlayoutId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.HasOne("ErsatzTV.Core.Domain.ProgramSchedule", "ProgramSchedule")
+ .WithMany()
+ .HasForeignKey("ProgramScheduleId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.OwnsOne("ErsatzTV.Core.Domain.MediaCollectionEnumeratorState", "EnumeratorState", b1 =>
+ {
+ b1.Property("PlayoutProgramScheduleAnchorId")
+ .HasColumnType("INTEGER");
+
+ b1.Property("Index")
+ .HasColumnType("INTEGER");
+
+ b1.Property("Seed")
+ .HasColumnType("INTEGER");
+
+ b1.HasKey("PlayoutProgramScheduleAnchorId");
+
+ b1.ToTable("PlayoutProgramScheduleItemAnchors");
+
+ b1.WithOwner()
+ .HasForeignKey("PlayoutProgramScheduleAnchorId");
+ });
+
+ b.Navigation("EnumeratorState");
+
+ b.Navigation("Playout");
+
+ b.Navigation("ProgramSchedule");
+ });
+
+ modelBuilder.Entity("ErsatzTV.Core.Domain.PlexMediaSourceConnection", b =>
+ {
+ b.HasOne("ErsatzTV.Core.Domain.PlexMediaSource", null)
+ .WithMany("Connections")
+ .HasForeignKey("PlexMediaSourceId");
+ });
+
+ modelBuilder.Entity("ErsatzTV.Core.Domain.PlexMediaSourceLibrary", b =>
+ {
+ b.HasOne("ErsatzTV.Core.Domain.PlexMediaSource", null)
+ .WithMany("Libraries")
+ .HasForeignKey("PlexMediaSourceId");
+ });
+
+ modelBuilder.Entity("ErsatzTV.Core.Domain.ProgramScheduleItem", b =>
+ {
+ b.HasOne("ErsatzTV.Core.Domain.MediaCollection", "MediaCollection")
+ .WithMany()
+ .HasForeignKey("MediaCollectionId");
+
+ b.HasOne("ErsatzTV.Core.Domain.ProgramSchedule", "ProgramSchedule")
+ .WithMany("Items")
+ .HasForeignKey("ProgramScheduleId")
+ .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("ErsatzTV.Core.Domain.TelevisionEpisodeMetadata", b =>
+ {
+ 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("MoviesId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.HasOne("ErsatzTV.Core.Domain.SimpleMediaCollection", null)
+ .WithMany()
+ .HasForeignKey("SimpleMediaCollectionsId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .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 =>
+ {
+ b.HasOne("ErsatzTV.Core.Domain.MediaCollection", null)
+ .WithOne()
+ .HasForeignKey("ErsatzTV.Core.Domain.SimpleMediaCollection", "Id")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+ });
+
+ modelBuilder.Entity("ErsatzTV.Core.Domain.MovieMediaItem", b =>
+ {
+ b.HasOne("ErsatzTV.Core.Domain.MediaItem", null)
+ .WithOne()
+ .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 =>
+ {
+ b.HasOne("ErsatzTV.Core.Domain.MediaSource", null)
+ .WithOne()
+ .HasForeignKey("ErsatzTV.Core.Domain.LocalMediaSource", "Id")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+ });
+
+ modelBuilder.Entity("ErsatzTV.Core.Domain.PlexMediaSource", b =>
+ {
+ b.HasOne("ErsatzTV.Core.Domain.MediaSource", null)
+ .WithOne()
+ .HasForeignKey("ErsatzTV.Core.Domain.PlexMediaSource", "Id")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+ });
+
+ modelBuilder.Entity("ErsatzTV.Core.Domain.ProgramScheduleItemDuration", b =>
+ {
+ b.HasOne("ErsatzTV.Core.Domain.ProgramScheduleItem", null)
+ .WithOne()
+ .HasForeignKey("ErsatzTV.Core.Domain.ProgramScheduleItemDuration", "Id")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+ });
+
+ modelBuilder.Entity("ErsatzTV.Core.Domain.ProgramScheduleItemFlood", b =>
+ {
+ b.HasOne("ErsatzTV.Core.Domain.ProgramScheduleItem", null)
+ .WithOne()
+ .HasForeignKey("ErsatzTV.Core.Domain.ProgramScheduleItemFlood", "Id")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+ });
+
+ modelBuilder.Entity("ErsatzTV.Core.Domain.ProgramScheduleItemMultiple", b =>
+ {
+ b.HasOne("ErsatzTV.Core.Domain.ProgramScheduleItem", null)
+ .WithOne()
+ .HasForeignKey("ErsatzTV.Core.Domain.ProgramScheduleItemMultiple", "Id")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+ });
+
+ modelBuilder.Entity("ErsatzTV.Core.Domain.ProgramScheduleItemOne", b =>
+ {
+ b.HasOne("ErsatzTV.Core.Domain.ProgramScheduleItem", null)
+ .WithOne()
+ .HasForeignKey("ErsatzTV.Core.Domain.ProgramScheduleItemOne", "Id")
+ .OnDelete(DeleteBehavior.Cascade)
+ .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("ErsatzTV.Core.Domain.Playout", b =>
+ {
+ b.Navigation("Items");
+
+ b.Navigation("ProgramScheduleAnchors");
+ });
+
+ modelBuilder.Entity("ErsatzTV.Core.Domain.ProgramSchedule", b =>
+ {
+ b.Navigation("Items");
+
+ 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 =>
+ {
+ b.Navigation("Connections");
+
+ b.Navigation("Libraries");
+ });
+#pragma warning restore 612, 618
+ }
+ }
+}
diff --git a/ErsatzTV.Infrastructure/Migrations/20210221215810_RemoveScheduleItemsAndPosters.cs b/ErsatzTV.Infrastructure/Migrations/20210221215810_RemoveScheduleItemsAndPosters.cs
new file mode 100644
index 000000000..d57bdccd1
--- /dev/null
+++ b/ErsatzTV.Infrastructure/Migrations/20210221215810_RemoveScheduleItemsAndPosters.cs
@@ -0,0 +1,25 @@
+using Microsoft.EntityFrameworkCore.Migrations;
+
+namespace ErsatzTV.Infrastructure.Migrations
+{
+ public partial class RemoveScheduleItemsAndPosters : Migration
+ {
+ protected override void Up(MigrationBuilder migrationBuilder)
+ {
+ // delete program schedule items that referenced television collections (that no longer exist)
+ migrationBuilder.Sql(
+ "delete from ProgramScheduleItems where MediaCollectionId not in (select Id from SimpleMediaCollections)");
+
+ // delete television collections that no longer exist/work
+ migrationBuilder.Sql(
+ "delete from MediaCollections where Id not in (select Id from SimpleMediaCollections)");
+
+ // delete all posters so they are all re-cached with a higher resolution
+ migrationBuilder.Sql("update MediaItems set Poster = null");
+ }
+
+ protected override void Down(MigrationBuilder migrationBuilder)
+ {
+ }
+ }
+}