diff --git a/CHANGELOG.md b/CHANGELOG.md
index 68c0a8f5a..21b403f16 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -9,6 +9,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
### Fixed
- Ignore unsupported plex guids (this prevented some libraries from scanning correctly)
+- Ignore unsupported STRM files from Jellyfin
## [0.0.43-prealpha] - 2021-06-05
### Added
diff --git a/ErsatzTV.Infrastructure/Jellyfin/JellyfinApiClient.cs b/ErsatzTV.Infrastructure/Jellyfin/JellyfinApiClient.cs
index de035bb99..26160df82 100644
--- a/ErsatzTV.Infrastructure/Jellyfin/JellyfinApiClient.cs
+++ b/ErsatzTV.Infrastructure/Jellyfin/JellyfinApiClient.cs
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
+using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
@@ -235,6 +236,12 @@ namespace ErsatzTV.Infrastructure.Jellyfin
return None;
}
+ if (Path.GetExtension(item.Path)?.ToLowerInvariant() == ".strm")
+ {
+ _logger.LogInformation("STRM files are not supported; skipping {Path}", item.Path);
+ return None;
+ }
+
var version = new MediaVersion
{
Name = "Main",
@@ -543,6 +550,12 @@ namespace ErsatzTV.Infrastructure.Jellyfin
return None;
}
+ if (Path.GetExtension(item.Path)?.ToLowerInvariant() == ".strm")
+ {
+ _logger.LogWarning("STRM files are not supported; skipping {Path}", item.Path);
+ return None;
+ }
+
var version = new MediaVersion
{
Name = "Main",
diff --git a/ErsatzTV.Infrastructure/Migrations/20210607123805_Delete_JellyfinStrmFiles.Designer.cs b/ErsatzTV.Infrastructure/Migrations/20210607123805_Delete_JellyfinStrmFiles.Designer.cs
new file mode 100644
index 000000000..31357bae0
--- /dev/null
+++ b/ErsatzTV.Infrastructure/Migrations/20210607123805_Delete_JellyfinStrmFiles.Designer.cs
@@ -0,0 +1,2889 @@
+//
+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("20210607123805_Delete_JellyfinStrmFiles")]
+ partial class Delete_JellyfinStrmFiles
+ {
+ protected override void BuildTargetModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .HasAnnotation("ProductVersion", "5.0.6");
+
+ modelBuilder.Entity("ErsatzTV.Core.Domain.Actor", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("ArtistMetadataId")
+ .HasColumnType("INTEGER");
+
+ b.Property("ArtworkId")
+ .HasColumnType("INTEGER");
+
+ b.Property("EpisodeMetadataId")
+ .HasColumnType("INTEGER");
+
+ b.Property("MovieMetadataId")
+ .HasColumnType("INTEGER");
+
+ b.Property("MusicVideoMetadataId")
+ .HasColumnType("INTEGER");
+
+ b.Property("Name")
+ .HasColumnType("TEXT");
+
+ b.Property("Order")
+ .HasColumnType("INTEGER");
+
+ b.Property("Role")
+ .HasColumnType("TEXT");
+
+ b.Property("SeasonMetadataId")
+ .HasColumnType("INTEGER");
+
+ b.Property("ShowMetadataId")
+ .HasColumnType("INTEGER");
+
+ b.HasKey("Id");
+
+ b.HasIndex("ArtistMetadataId");
+
+ b.HasIndex("ArtworkId")
+ .IsUnique();
+
+ b.HasIndex("EpisodeMetadataId");
+
+ b.HasIndex("MovieMetadataId");
+
+ b.HasIndex("MusicVideoMetadataId");
+
+ b.HasIndex("SeasonMetadataId");
+
+ b.HasIndex("ShowMetadataId");
+
+ b.ToTable("Actor");
+ });
+
+ modelBuilder.Entity("ErsatzTV.Core.Domain.ArtistMetadata", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("ArtistId")
+ .HasColumnType("INTEGER");
+
+ b.Property("Biography")
+ .HasColumnType("TEXT");
+
+ b.Property("DateAdded")
+ .HasColumnType("TEXT");
+
+ b.Property("DateUpdated")
+ .HasColumnType("TEXT");
+
+ b.Property("Disambiguation")
+ .HasColumnType("TEXT");
+
+ b.Property("Formed")
+ .HasColumnType("TEXT");
+
+ b.Property("MetadataKind")
+ .HasColumnType("INTEGER");
+
+ b.Property("OriginalTitle")
+ .HasColumnType("TEXT");
+
+ b.Property("ReleaseDate")
+ .HasColumnType("TEXT");
+
+ b.Property("SortTitle")
+ .HasColumnType("TEXT");
+
+ b.Property("Title")
+ .HasColumnType("TEXT");
+
+ b.Property("Year")
+ .HasColumnType("INTEGER");
+
+ b.HasKey("Id");
+
+ b.HasIndex("ArtistId");
+
+ b.ToTable("ArtistMetadata");
+ });
+
+ modelBuilder.Entity("ErsatzTV.Core.Domain.Artwork", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("ArtistMetadataId")
+ .HasColumnType("INTEGER");
+
+ b.Property("ArtworkKind")
+ .HasColumnType("INTEGER");
+
+ b.Property("ChannelId")
+ .HasColumnType("INTEGER");
+
+ b.Property("DateAdded")
+ .HasColumnType("TEXT");
+
+ b.Property("DateUpdated")
+ .HasColumnType("TEXT");
+
+ b.Property("EpisodeMetadataId")
+ .HasColumnType("INTEGER");
+
+ b.Property("MovieMetadataId")
+ .HasColumnType("INTEGER");
+
+ b.Property("MusicVideoMetadataId")
+ .HasColumnType("INTEGER");
+
+ b.Property("Path")
+ .HasColumnType("TEXT");
+
+ b.Property("SeasonMetadataId")
+ .HasColumnType("INTEGER");
+
+ b.Property("ShowMetadataId")
+ .HasColumnType("INTEGER");
+
+ b.HasKey("Id");
+
+ b.HasIndex("ArtistMetadataId");
+
+ b.HasIndex("ChannelId");
+
+ b.HasIndex("EpisodeMetadataId");
+
+ b.HasIndex("MovieMetadataId");
+
+ b.HasIndex("MusicVideoMetadataId");
+
+ b.HasIndex("SeasonMetadataId");
+
+ b.HasIndex("ShowMetadataId");
+
+ b.ToTable("Artwork");
+ });
+
+ modelBuilder.Entity("ErsatzTV.Core.Domain.Channel", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("FFmpegProfileId")
+ .HasColumnType("INTEGER");
+
+ b.Property("Name")
+ .HasColumnType("TEXT");
+
+ b.Property("Number")
+ .HasColumnType("TEXT");
+
+ b.Property("PreferredLanguageCode")
+ .HasColumnType("TEXT");
+
+ b.Property("StreamingMode")
+ .HasColumnType("INTEGER");
+
+ b.Property("UniqueId")
+ .HasColumnType("TEXT");
+
+ b.HasKey("Id");
+
+ b.HasIndex("FFmpegProfileId");
+
+ b.HasIndex("Number")
+ .IsUnique();
+
+ b.ToTable("Channel");
+ });
+
+ modelBuilder.Entity("ErsatzTV.Core.Domain.Collection", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("Name")
+ .HasColumnType("TEXT");
+
+ b.Property("UseCustomPlaybackOrder")
+ .HasColumnType("INTEGER");
+
+ b.HasKey("Id");
+
+ b.ToTable("Collection");
+ });
+
+ modelBuilder.Entity("ErsatzTV.Core.Domain.CollectionItem", b =>
+ {
+ b.Property("CollectionId")
+ .HasColumnType("INTEGER");
+
+ b.Property("MediaItemId")
+ .HasColumnType("INTEGER");
+
+ b.Property("CustomIndex")
+ .HasColumnType("INTEGER");
+
+ b.HasKey("CollectionId", "MediaItemId");
+
+ b.HasIndex("MediaItemId");
+
+ b.ToTable("CollectionItem");
+ });
+
+ 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("ConfigElement");
+ });
+
+ modelBuilder.Entity("ErsatzTV.Core.Domain.Director", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("EpisodeMetadataId")
+ .HasColumnType("INTEGER");
+
+ b.Property("MovieMetadataId")
+ .HasColumnType("INTEGER");
+
+ b.Property("Name")
+ .HasColumnType("TEXT");
+
+ b.HasKey("Id");
+
+ b.HasIndex("EpisodeMetadataId");
+
+ b.HasIndex("MovieMetadataId");
+
+ b.ToTable("Director");
+ });
+
+ modelBuilder.Entity("ErsatzTV.Core.Domain.EmbyConnection", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("Address")
+ .HasColumnType("TEXT");
+
+ b.Property("EmbyMediaSourceId")
+ .HasColumnType("INTEGER");
+
+ b.HasKey("Id");
+
+ b.HasIndex("EmbyMediaSourceId");
+
+ b.ToTable("EmbyConnection");
+ });
+
+ modelBuilder.Entity("ErsatzTV.Core.Domain.EmbyPathReplacement", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("EmbyMediaSourceId")
+ .HasColumnType("INTEGER");
+
+ b.Property("EmbyPath")
+ .HasColumnType("TEXT");
+
+ b.Property("LocalPath")
+ .HasColumnType("TEXT");
+
+ b.HasKey("Id");
+
+ b.HasIndex("EmbyMediaSourceId");
+
+ b.ToTable("EmbyPathReplacement");
+ });
+
+ modelBuilder.Entity("ErsatzTV.Core.Domain.EpisodeMetadata", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("DateAdded")
+ .HasColumnType("TEXT");
+
+ b.Property("DateUpdated")
+ .HasColumnType("TEXT");
+
+ b.Property("EpisodeId")
+ .HasColumnType("INTEGER");
+
+ b.Property("EpisodeNumber")
+ .HasColumnType("INTEGER");
+
+ b.Property("MetadataKind")
+ .HasColumnType("INTEGER");
+
+ b.Property("OriginalTitle")
+ .HasColumnType("TEXT");
+
+ b.Property("Outline")
+ .HasColumnType("TEXT");
+
+ b.Property("Plot")
+ .HasColumnType("TEXT");
+
+ b.Property("ReleaseDate")
+ .HasColumnType("TEXT");
+
+ b.Property("SortTitle")
+ .HasColumnType("TEXT");
+
+ b.Property("Tagline")
+ .HasColumnType("TEXT");
+
+ b.Property("Title")
+ .HasColumnType("TEXT");
+
+ b.Property("Year")
+ .HasColumnType("INTEGER");
+
+ b.HasKey("Id");
+
+ b.HasIndex("EpisodeId");
+
+ b.ToTable("EpisodeMetadata");
+ });
+
+ 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("FrameRate")
+ .HasColumnType("TEXT");
+
+ b.Property("HardwareAcceleration")
+ .HasColumnType("INTEGER");
+
+ b.Property("Name")
+ .HasColumnType("TEXT");
+
+ b.Property("NormalizeAudio")
+ .HasColumnType("INTEGER");
+
+ b.Property("NormalizeLoudness")
+ .HasColumnType("INTEGER");
+
+ b.Property("NormalizeVideo")
+ .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("FFmpegProfile");
+ });
+
+ modelBuilder.Entity("ErsatzTV.Core.Domain.Genre", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("ArtistMetadataId")
+ .HasColumnType("INTEGER");
+
+ b.Property("EpisodeMetadataId")
+ .HasColumnType("INTEGER");
+
+ b.Property("MovieMetadataId")
+ .HasColumnType("INTEGER");
+
+ b.Property("MusicVideoMetadataId")
+ .HasColumnType("INTEGER");
+
+ b.Property("Name")
+ .HasColumnType("TEXT");
+
+ b.Property("SeasonMetadataId")
+ .HasColumnType("INTEGER");
+
+ b.Property("ShowMetadataId")
+ .HasColumnType("INTEGER");
+
+ b.HasKey("Id");
+
+ b.HasIndex("ArtistMetadataId");
+
+ b.HasIndex("EpisodeMetadataId");
+
+ b.HasIndex("MovieMetadataId");
+
+ b.HasIndex("MusicVideoMetadataId");
+
+ b.HasIndex("SeasonMetadataId");
+
+ b.HasIndex("ShowMetadataId");
+
+ b.ToTable("Genre");
+ });
+
+ modelBuilder.Entity("ErsatzTV.Core.Domain.JellyfinConnection", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("Address")
+ .HasColumnType("TEXT");
+
+ b.Property("JellyfinMediaSourceId")
+ .HasColumnType("INTEGER");
+
+ b.HasKey("Id");
+
+ b.HasIndex("JellyfinMediaSourceId");
+
+ b.ToTable("JellyfinConnection");
+ });
+
+ modelBuilder.Entity("ErsatzTV.Core.Domain.JellyfinPathReplacement", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("JellyfinMediaSourceId")
+ .HasColumnType("INTEGER");
+
+ b.Property("JellyfinPath")
+ .HasColumnType("TEXT");
+
+ b.Property("LocalPath")
+ .HasColumnType("TEXT");
+
+ b.HasKey("Id");
+
+ b.HasIndex("JellyfinMediaSourceId");
+
+ b.ToTable("JellyfinPathReplacement");
+ });
+
+ modelBuilder.Entity("ErsatzTV.Core.Domain.Library", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("LastScan")
+ .HasColumnType("TEXT");
+
+ b.Property("MediaKind")
+ .HasColumnType("INTEGER");
+
+ b.Property("MediaSourceId")
+ .HasColumnType("INTEGER");
+
+ b.Property("Name")
+ .HasColumnType("TEXT");
+
+ b.HasKey("Id");
+
+ b.HasIndex("MediaSourceId");
+
+ b.ToTable("Library");
+ });
+
+ modelBuilder.Entity("ErsatzTV.Core.Domain.LibraryFolder", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("Etag")
+ .HasColumnType("TEXT");
+
+ b.Property("LibraryPathId")
+ .HasColumnType("INTEGER");
+
+ b.Property("Path")
+ .HasColumnType("TEXT");
+
+ b.HasKey("Id");
+
+ b.HasIndex("LibraryPathId");
+
+ b.ToTable("LibraryFolder");
+ });
+
+ modelBuilder.Entity("ErsatzTV.Core.Domain.LibraryPath", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("LastScan")
+ .HasColumnType("TEXT");
+
+ b.Property("LibraryId")
+ .HasColumnType("INTEGER");
+
+ b.Property("Path")
+ .HasColumnType("TEXT");
+
+ b.HasKey("Id");
+
+ b.HasIndex("LibraryId");
+
+ b.ToTable("LibraryPath");
+ });
+
+ modelBuilder.Entity("ErsatzTV.Core.Domain.MediaFile", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("MediaVersionId")
+ .HasColumnType("INTEGER");
+
+ b.Property("Path")
+ .HasColumnType("TEXT");
+
+ b.HasKey("Id");
+
+ b.HasIndex("MediaVersionId");
+
+ b.HasIndex("Path")
+ .IsUnique();
+
+ b.ToTable("MediaFile");
+ });
+
+ modelBuilder.Entity("ErsatzTV.Core.Domain.MediaItem", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("LibraryPathId")
+ .HasColumnType("INTEGER");
+
+ b.HasKey("Id");
+
+ b.HasIndex("LibraryPathId");
+
+ b.ToTable("MediaItem");
+ });
+
+ modelBuilder.Entity("ErsatzTV.Core.Domain.MediaSource", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.HasKey("Id");
+
+ b.ToTable("MediaSource");
+ });
+
+ modelBuilder.Entity("ErsatzTV.Core.Domain.MediaStream", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("Channels")
+ .HasColumnType("INTEGER");
+
+ b.Property("Codec")
+ .HasColumnType("TEXT");
+
+ b.Property("Default")
+ .HasColumnType("INTEGER");
+
+ b.Property("Forced")
+ .HasColumnType("INTEGER");
+
+ b.Property("Index")
+ .HasColumnType("INTEGER");
+
+ b.Property("Language")
+ .HasColumnType("TEXT");
+
+ b.Property("MediaStreamKind")
+ .HasColumnType("INTEGER");
+
+ b.Property("MediaVersionId")
+ .HasColumnType("INTEGER");
+
+ b.Property("Profile")
+ .HasColumnType("TEXT");
+
+ b.Property("Title")
+ .HasColumnType("TEXT");
+
+ b.HasKey("Id");
+
+ b.HasIndex("MediaVersionId");
+
+ b.ToTable("MediaStream");
+ });
+
+ modelBuilder.Entity("ErsatzTV.Core.Domain.MediaVersion", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("DateAdded")
+ .HasColumnType("TEXT");
+
+ b.Property("DateUpdated")
+ .HasColumnType("TEXT");
+
+ b.Property("DisplayAspectRatio")
+ .HasColumnType("TEXT");
+
+ b.Property("Duration")
+ .HasColumnType("TEXT");
+
+ b.Property("EpisodeId")
+ .HasColumnType("INTEGER");
+
+ b.Property("Height")
+ .HasColumnType("INTEGER");
+
+ b.Property("MovieId")
+ .HasColumnType("INTEGER");
+
+ b.Property("MusicVideoId")
+ .HasColumnType("INTEGER");
+
+ b.Property("Name")
+ .HasColumnType("TEXT");
+
+ b.Property("SampleAspectRatio")
+ .HasColumnType("TEXT");
+
+ b.Property("VideoScanKind")
+ .HasColumnType("INTEGER");
+
+ b.Property("Width")
+ .HasColumnType("INTEGER");
+
+ b.HasKey("Id");
+
+ b.HasIndex("EpisodeId");
+
+ b.HasIndex("MovieId");
+
+ b.HasIndex("MusicVideoId");
+
+ b.ToTable("MediaVersion");
+ });
+
+ modelBuilder.Entity("ErsatzTV.Core.Domain.MetadataGuid", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("ArtistMetadataId")
+ .HasColumnType("INTEGER");
+
+ b.Property("EpisodeMetadataId")
+ .HasColumnType("INTEGER");
+
+ b.Property("Guid")
+ .HasColumnType("TEXT");
+
+ b.Property("MovieMetadataId")
+ .HasColumnType("INTEGER");
+
+ b.Property("MusicVideoMetadataId")
+ .HasColumnType("INTEGER");
+
+ b.Property("SeasonMetadataId")
+ .HasColumnType("INTEGER");
+
+ b.Property("ShowMetadataId")
+ .HasColumnType("INTEGER");
+
+ b.HasKey("Id");
+
+ b.HasIndex("ArtistMetadataId");
+
+ b.HasIndex("EpisodeMetadataId");
+
+ b.HasIndex("MovieMetadataId");
+
+ b.HasIndex("MusicVideoMetadataId");
+
+ b.HasIndex("SeasonMetadataId");
+
+ b.HasIndex("ShowMetadataId");
+
+ b.ToTable("MetadataGuid");
+ });
+
+ modelBuilder.Entity("ErsatzTV.Core.Domain.Mood", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("ArtistMetadataId")
+ .HasColumnType("INTEGER");
+
+ b.Property("Name")
+ .HasColumnType("TEXT");
+
+ b.HasKey("Id");
+
+ b.HasIndex("ArtistMetadataId");
+
+ b.ToTable("Mood");
+ });
+
+ modelBuilder.Entity("ErsatzTV.Core.Domain.MovieMetadata", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("ContentRating")
+ .HasColumnType("TEXT");
+
+ b.Property("DateAdded")
+ .HasColumnType("TEXT");
+
+ b.Property("DateUpdated")
+ .HasColumnType("TEXT");
+
+ b.Property("MetadataKind")
+ .HasColumnType("INTEGER");
+
+ b.Property("MovieId")
+ .HasColumnType("INTEGER");
+
+ b.Property("OriginalTitle")
+ .HasColumnType("TEXT");
+
+ b.Property("Outline")
+ .HasColumnType("TEXT");
+
+ b.Property("Plot")
+ .HasColumnType("TEXT");
+
+ b.Property("ReleaseDate")
+ .HasColumnType("TEXT");
+
+ b.Property("SortTitle")
+ .HasColumnType("TEXT");
+
+ b.Property("Tagline")
+ .HasColumnType("TEXT");
+
+ b.Property("Title")
+ .HasColumnType("TEXT");
+
+ b.Property("Year")
+ .HasColumnType("INTEGER");
+
+ b.HasKey("Id");
+
+ b.HasIndex("MovieId");
+
+ b.ToTable("MovieMetadata");
+ });
+
+ modelBuilder.Entity("ErsatzTV.Core.Domain.MusicVideoMetadata", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("Album")
+ .HasColumnType("TEXT");
+
+ b.Property("DateAdded")
+ .HasColumnType("TEXT");
+
+ b.Property("DateUpdated")
+ .HasColumnType("TEXT");
+
+ b.Property("MetadataKind")
+ .HasColumnType("INTEGER");
+
+ b.Property("MusicVideoId")
+ .HasColumnType("INTEGER");
+
+ b.Property("OriginalTitle")
+ .HasColumnType("TEXT");
+
+ b.Property("Plot")
+ .HasColumnType("TEXT");
+
+ b.Property("ReleaseDate")
+ .HasColumnType("TEXT");
+
+ b.Property("SortTitle")
+ .HasColumnType("TEXT");
+
+ b.Property("Title")
+ .HasColumnType("TEXT");
+
+ b.Property("Year")
+ .HasColumnType("INTEGER");
+
+ b.HasKey("Id");
+
+ b.HasIndex("MusicVideoId");
+
+ b.ToTable("MusicVideoMetadata");
+ });
+
+ 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("Playout");
+ });
+
+ modelBuilder.Entity("ErsatzTV.Core.Domain.PlayoutItem", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("CustomGroup")
+ .HasColumnType("INTEGER");
+
+ b.Property("CustomTitle")
+ .HasColumnType("TEXT");
+
+ 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("PlayoutItem");
+ });
+
+ 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("MediaItemId")
+ .HasColumnType("INTEGER");
+
+ b.Property("PlayoutId")
+ .HasColumnType("INTEGER");
+
+ b.Property("ProgramScheduleId")
+ .HasColumnType("INTEGER");
+
+ b.HasKey("Id");
+
+ b.HasIndex("CollectionId");
+
+ b.HasIndex("MediaItemId");
+
+ b.HasIndex("PlayoutId");
+
+ b.HasIndex("ProgramScheduleId");
+
+ b.ToTable("PlayoutProgramScheduleAnchor");
+ });
+
+ modelBuilder.Entity("ErsatzTV.Core.Domain.PlexConnection", 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("PlexConnection");
+ });
+
+ modelBuilder.Entity("ErsatzTV.Core.Domain.PlexPathReplacement", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("LocalPath")
+ .HasColumnType("TEXT");
+
+ b.Property("PlexMediaSourceId")
+ .HasColumnType("INTEGER");
+
+ b.Property("PlexPath")
+ .HasColumnType("TEXT");
+
+ b.HasKey("Id");
+
+ b.HasIndex("PlexMediaSourceId");
+
+ b.ToTable("PlexPathReplacement");
+ });
+
+ modelBuilder.Entity("ErsatzTV.Core.Domain.ProgramSchedule", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("KeepMultiPartEpisodesTogether")
+ .HasColumnType("INTEGER");
+
+ b.Property("MediaCollectionPlaybackOrder")
+ .HasColumnType("INTEGER");
+
+ b.Property("Name")
+ .HasColumnType("TEXT");
+
+ b.Property("TreatCollectionsAsShows")
+ .HasColumnType("INTEGER");
+
+ b.HasKey("Id");
+
+ b.HasIndex("Name")
+ .IsUnique();
+
+ b.ToTable("ProgramSchedule");
+ });
+
+ modelBuilder.Entity("ErsatzTV.Core.Domain.ProgramScheduleItem", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("CollectionId")
+ .HasColumnType("INTEGER");
+
+ b.Property("CollectionType")
+ .HasColumnType("INTEGER");
+
+ b.Property("CustomTitle")
+ .HasColumnType("TEXT");
+
+ b.Property("Index")
+ .HasColumnType("INTEGER");
+
+ b.Property("MediaItemId")
+ .HasColumnType("INTEGER");
+
+ b.Property("ProgramScheduleId")
+ .HasColumnType("INTEGER");
+
+ b.Property("StartTime")
+ .HasColumnType("TEXT");
+
+ b.HasKey("Id");
+
+ b.HasIndex("CollectionId");
+
+ b.HasIndex("MediaItemId");
+
+ b.HasIndex("ProgramScheduleId");
+
+ b.ToTable("ProgramScheduleItem");
+ });
+
+ 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("Resolution");
+ });
+
+ modelBuilder.Entity("ErsatzTV.Core.Domain.SeasonMetadata", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("DateAdded")
+ .HasColumnType("TEXT");
+
+ b.Property("DateUpdated")
+ .HasColumnType("TEXT");
+
+ b.Property("MetadataKind")
+ .HasColumnType("INTEGER");
+
+ b.Property("OriginalTitle")
+ .HasColumnType("TEXT");
+
+ b.Property("Outline")
+ .HasColumnType("TEXT");
+
+ b.Property("ReleaseDate")
+ .HasColumnType("TEXT");
+
+ b.Property("SeasonId")
+ .HasColumnType("INTEGER");
+
+ b.Property("SortTitle")
+ .HasColumnType("TEXT");
+
+ b.Property("Title")
+ .HasColumnType("TEXT");
+
+ b.Property("Year")
+ .HasColumnType("INTEGER");
+
+ b.HasKey("Id");
+
+ b.HasIndex("SeasonId");
+
+ b.ToTable("SeasonMetadata");
+ });
+
+ modelBuilder.Entity("ErsatzTV.Core.Domain.ShowMetadata", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("ContentRating")
+ .HasColumnType("TEXT");
+
+ b.Property("DateAdded")
+ .HasColumnType("TEXT");
+
+ b.Property("DateUpdated")
+ .HasColumnType("TEXT");
+
+ b.Property("MetadataKind")
+ .HasColumnType("INTEGER");
+
+ b.Property("OriginalTitle")
+ .HasColumnType("TEXT");
+
+ b.Property("Outline")
+ .HasColumnType("TEXT");
+
+ b.Property("Plot")
+ .HasColumnType("TEXT");
+
+ b.Property("ReleaseDate")
+ .HasColumnType("TEXT");
+
+ b.Property("ShowId")
+ .HasColumnType("INTEGER");
+
+ b.Property("SortTitle")
+ .HasColumnType("TEXT");
+
+ b.Property