Browse Source

get schedule blocks

block-scheduling
Jason Dove 3 years ago
parent
commit
bf409510d3
  1. 1
      ErsatzTV.Application/ErsatzTV.Application.csproj.DotSettings
  2. 22
      ErsatzTV.Application/Scheduling/Mapper.cs
  3. 5
      ErsatzTV.Application/Scheduling/Queries/GetAllScheduleBlocksForApi.cs
  4. 28
      ErsatzTV.Application/Scheduling/Queries/GetAllScheduleBlocksForApiHandler.cs
  5. 11
      ErsatzTV.Core/Api/Scheduling/ScheduleBlockItemResponseModel.cs
  6. 6
      ErsatzTV.Core/Api/Scheduling/ScheduleBlockResponseModel.cs
  7. 8
      ErsatzTV.Core/Domain/Scheduling/ScheduleBlock.cs
  8. 15
      ErsatzTV.Core/Domain/Scheduling/ScheduleBlockItem.cs
  9. 8
      ErsatzTV.Core/Domain/Scheduling/ScheduleBlockItemGuideMode.cs
  10. 3
      ErsatzTV.Core/Scheduling/PlayoutModeBlock.cs
  11. 20
      ErsatzTV.Infrastructure/Data/Configurations/Scheduling/ScheduleBlockConfiguration.cs
  12. 13
      ErsatzTV.Infrastructure/Data/Configurations/Scheduling/ScheduleBlockItemConfiguration.cs
  13. 2
      ErsatzTV.Infrastructure/Data/TvContext.cs
  14. 4402
      ErsatzTV.Infrastructure/Migrations/20230106181100_Add_ScheduleBlock.Designer.cs
  15. 72
      ErsatzTV.Infrastructure/Migrations/20230106181100_Add_ScheduleBlock.cs
  16. 560
      ErsatzTV.Infrastructure/Migrations/TvContextModelSnapshot.cs
  17. 21
      ErsatzTV/Controllers/Api/ScheduleController.cs
  18. BIN
      ErsatzTV/Resources/background.png

1
ErsatzTV.Application/ErsatzTV.Application.csproj.DotSettings

@ -34,6 +34,7 @@ @@ -34,6 +34,7 @@
<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=programschedules_005Ccommands/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=programschedules_005Cqueries/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=resolutions_005Cqueries/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=scheduling_005Cqueries/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=search_005Ccommands/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=search_005Cqueries/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=streaming_005Ccommands/@EntryIndexedValue">True</s:Boolean>

22
ErsatzTV.Application/Scheduling/Mapper.cs

@ -0,0 +1,22 @@ @@ -0,0 +1,22 @@
using ErsatzTV.Core.Api.Scheduling;
using ErsatzTV.Core.Domain.Scheduling;
namespace ErsatzTV.Application.Scheduling;
internal static class Mapper
{
internal static ScheduleBlockResponseModel ProjectToResponseModel(ScheduleBlock scheduleBlock) =>
new(
scheduleBlock.Id,
scheduleBlock.Name,
scheduleBlock.Items.Map(ProjectToResponseModel).ToList());
internal static ScheduleBlockItemResponseModel ProjectToResponseModel(ScheduleBlockItem scheduleBlockItem) =>
new(
scheduleBlockItem.Id,
scheduleBlockItem.Index,
scheduleBlockItem.Name,
scheduleBlockItem.Query,
scheduleBlockItem.PlayoutMode,
scheduleBlockItem.PlaybackOrder);
}

5
ErsatzTV.Application/Scheduling/Queries/GetAllScheduleBlocksForApi.cs

@ -0,0 +1,5 @@ @@ -0,0 +1,5 @@
using ErsatzTV.Core.Api.Scheduling;
namespace ErsatzTV.Application.Scheduling;
public record GetAllScheduleBlocksForApi : IRequest<List<ScheduleBlockResponseModel>>;

28
ErsatzTV.Application/Scheduling/Queries/GetAllScheduleBlocksForApiHandler.cs

@ -0,0 +1,28 @@ @@ -0,0 +1,28 @@
using ErsatzTV.Core.Api.Scheduling;
using ErsatzTV.Core.Domain.Scheduling;
using ErsatzTV.Infrastructure.Data;
using Microsoft.EntityFrameworkCore;
using static ErsatzTV.Application.Scheduling.Mapper;
namespace ErsatzTV.Application.Scheduling;
public class
GetAllScheduleBlocksForApiHandler : IRequestHandler<GetAllScheduleBlocksForApi, List<ScheduleBlockResponseModel>>
{
private readonly IDbContextFactory<TvContext> _dbContextFactory;
public GetAllScheduleBlocksForApiHandler(IDbContextFactory<TvContext> dbContextFactory) =>
_dbContextFactory = dbContextFactory;
public async Task<List<ScheduleBlockResponseModel>> Handle(
GetAllScheduleBlocksForApi request,
CancellationToken cancellationToken)
{
await using TvContext dbContext = await _dbContextFactory.CreateDbContextAsync(cancellationToken);
List<ScheduleBlock> scheduleBlocks = await dbContext.ScheduleBlocks
.AsNoTracking()
.Include(sb => sb.Items)
.ToListAsync(cancellationToken);
return scheduleBlocks.Map(ProjectToResponseModel).ToList();
}
}

11
ErsatzTV.Core/Api/Scheduling/ScheduleBlockItemResponseModel.cs

@ -0,0 +1,11 @@ @@ -0,0 +1,11 @@
using ErsatzTV.Core.Domain;
namespace ErsatzTV.Core.Api.Scheduling;
public record ScheduleBlockItemResponseModel(
int Id,
int Index,
string Name,
string Query,
PlayoutMode PlayoutMode,
PlaybackOrder PlaybackOrder);

6
ErsatzTV.Core/Api/Scheduling/ScheduleBlockResponseModel.cs

@ -0,0 +1,6 @@ @@ -0,0 +1,6 @@
namespace ErsatzTV.Core.Api.Scheduling;
public record ScheduleBlockResponseModel(
int Id,
string Name,
List<ScheduleBlockItemResponseModel> Items);

8
ErsatzTV.Core/Domain/Scheduling/ScheduleBlock.cs

@ -0,0 +1,8 @@ @@ -0,0 +1,8 @@
namespace ErsatzTV.Core.Domain.Scheduling;
public class ScheduleBlock
{
public int Id { get; set; }
public string Name { get; set; }
public List<ScheduleBlockItem> Items { get; set; }
}

15
ErsatzTV.Core/Domain/Scheduling/ScheduleBlockItem.cs

@ -0,0 +1,15 @@ @@ -0,0 +1,15 @@
namespace ErsatzTV.Core.Domain.Scheduling;
public class ScheduleBlockItem
{
public int Id { get; set; }
public int Index { get; set; }
public string Name { get; set; }
public string Query { get; set; }
// public ScheduleBlockItemGuideMode GuideMode { get; set; }
// public string CustomTitle { get; set; }
public PlayoutMode PlayoutMode { get; set; }
public PlaybackOrder PlaybackOrder { get; set; }
public int ScheduleBlockId { get; set; }
public ScheduleBlock ScheduleBlock { get; set; }
}

8
ErsatzTV.Core/Domain/Scheduling/ScheduleBlockItemGuideMode.cs

@ -0,0 +1,8 @@ @@ -0,0 +1,8 @@
namespace ErsatzTV.Core.Domain.Scheduling;
public enum ScheduleBlockItemGuideMode
{
Normal = 0,
UsePrevious = 1,
UseNext = 2
}

3
ErsatzTV.Core/Scheduling/PlayoutModeBlock.cs

@ -1,3 +0,0 @@ @@ -1,3 +0,0 @@
namespace ErsatzTV.Core.Scheduling;
public record PlayoutModeBlock(DateTimeOffset StartTime, DateTimeOffset FinishTime);

20
ErsatzTV.Infrastructure/Data/Configurations/Scheduling/ScheduleBlockConfiguration.cs

@ -0,0 +1,20 @@ @@ -0,0 +1,20 @@
using ErsatzTV.Core.Domain.Scheduling;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
namespace ErsatzTV.Infrastructure.Data.Configurations.Scheduling;
public class ScheduleBlockConfiguration : IEntityTypeConfiguration<ScheduleBlock>
{
public void Configure(EntityTypeBuilder<ScheduleBlock> builder)
{
builder.ToTable("ScheduleBlock");
builder.HasIndex(sb => sb.Name).IsUnique();
builder.HasMany(sb => sb.Items)
.WithOne(i => i.ScheduleBlock)
.HasForeignKey(i => i.ScheduleBlockId)
.OnDelete(DeleteBehavior.Cascade);
}
}

13
ErsatzTV.Infrastructure/Data/Configurations/Scheduling/ScheduleBlockItemConfiguration.cs

@ -0,0 +1,13 @@ @@ -0,0 +1,13 @@
using ErsatzTV.Core.Domain.Scheduling;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
namespace ErsatzTV.Infrastructure.Data.Configurations.Scheduling;
public class ScheduleBlockItemConfiguration : IEntityTypeConfiguration<ScheduleBlockItem>
{
public void Configure(EntityTypeBuilder<ScheduleBlockItem> builder)
{
builder.ToTable("ScheduleBlockItem");
}
}

2
ErsatzTV.Infrastructure/Data/TvContext.cs

@ -1,6 +1,7 @@ @@ -1,6 +1,7 @@
using System.Data;
using ErsatzTV.Core.Domain;
using ErsatzTV.Core.Domain.Filler;
using ErsatzTV.Core.Domain.Scheduling;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging;
@ -83,6 +84,7 @@ public class TvContext : DbContext @@ -83,6 +84,7 @@ public class TvContext : DbContext
public DbSet<LanguageCode> LanguageCodes { get; set; }
public DbSet<TraktList> TraktLists { get; set; }
public DbSet<FillerPreset> FillerPresets { get; set; }
public DbSet<ScheduleBlock> ScheduleBlocks { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) =>
optionsBuilder.UseLoggerFactory(_loggerFactory);

4402
ErsatzTV.Infrastructure/Migrations/20230106181100_Add_ScheduleBlock.Designer.cs generated

File diff suppressed because it is too large Load Diff

72
ErsatzTV.Infrastructure/Migrations/20230106181100_Add_ScheduleBlock.cs

@ -0,0 +1,72 @@ @@ -0,0 +1,72 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace ErsatzTV.Infrastructure.Migrations
{
/// <inheritdoc />
public partial class AddScheduleBlock : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "ScheduleBlock",
columns: table => new
{
Id = table.Column<int>(type: "INTEGER", nullable: false)
.Annotation("Sqlite:Autoincrement", true),
Name = table.Column<string>(type: "TEXT", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_ScheduleBlock", x => x.Id);
});
migrationBuilder.CreateTable(
name: "ScheduleBlockItem",
columns: table => new
{
Id = table.Column<int>(type: "INTEGER", nullable: false)
.Annotation("Sqlite:Autoincrement", true),
Index = table.Column<int>(type: "INTEGER", nullable: false),
Name = table.Column<string>(type: "TEXT", nullable: true),
Query = table.Column<string>(type: "TEXT", nullable: true),
PlayoutMode = table.Column<int>(type: "INTEGER", nullable: false),
PlaybackOrder = table.Column<int>(type: "INTEGER", nullable: false),
ScheduleBlockId = table.Column<int>(type: "INTEGER", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_ScheduleBlockItem", x => x.Id);
table.ForeignKey(
name: "FK_ScheduleBlockItem_ScheduleBlock_ScheduleBlockId",
column: x => x.ScheduleBlockId,
principalTable: "ScheduleBlock",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
});
migrationBuilder.CreateIndex(
name: "IX_ScheduleBlock_Name",
table: "ScheduleBlock",
column: "Name",
unique: true);
migrationBuilder.CreateIndex(
name: "IX_ScheduleBlockItem_ScheduleBlockId",
table: "ScheduleBlockItem",
column: "ScheduleBlockId");
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "ScheduleBlockItem");
migrationBuilder.DropTable(
name: "ScheduleBlock");
}
}
}

560
ErsatzTV.Infrastructure/Migrations/TvContextModelSnapshot.cs

@ -15,7 +15,7 @@ namespace ErsatzTV.Infrastructure.Migrations @@ -15,7 +15,7 @@ namespace ErsatzTV.Infrastructure.Migrations
protected override void BuildModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder.HasAnnotation("ProductVersion", "6.0.10");
modelBuilder.HasAnnotation("ProductVersion", "7.0.1");
modelBuilder.Entity("ErsatzTV.Core.Domain.Actor", b =>
{
@ -820,6 +820,8 @@ namespace ErsatzTV.Infrastructure.Migrations @@ -820,6 +820,8 @@ namespace ErsatzTV.Infrastructure.Migrations
b.HasIndex("MediaSourceId");
b.ToTable("Library", (string)null);
b.UseTptMappingStrategy();
});
modelBuilder.Entity("ErsatzTV.Core.Domain.LibraryFolder", b =>
@ -914,6 +916,8 @@ namespace ErsatzTV.Infrastructure.Migrations @@ -914,6 +916,8 @@ namespace ErsatzTV.Infrastructure.Migrations
.IsUnique();
b.ToTable("MediaFile", (string)null);
b.UseTptMappingStrategy();
});
modelBuilder.Entity("ErsatzTV.Core.Domain.MediaItem", b =>
@ -933,6 +937,8 @@ namespace ErsatzTV.Infrastructure.Migrations @@ -933,6 +937,8 @@ namespace ErsatzTV.Infrastructure.Migrations
b.HasIndex("LibraryPathId");
b.ToTable("MediaItem", (string)null);
b.UseTptMappingStrategy();
});
modelBuilder.Entity("ErsatzTV.Core.Domain.MediaSource", b =>
@ -944,6 +950,8 @@ namespace ErsatzTV.Infrastructure.Migrations @@ -944,6 +950,8 @@ namespace ErsatzTV.Infrastructure.Migrations
b.HasKey("Id");
b.ToTable("MediaSource", (string)null);
b.UseTptMappingStrategy();
});
modelBuilder.Entity("ErsatzTV.Core.Domain.MediaStream", b =>
@ -1692,6 +1700,8 @@ namespace ErsatzTV.Infrastructure.Migrations @@ -1692,6 +1700,8 @@ namespace ErsatzTV.Infrastructure.Migrations
b.HasIndex("WatermarkId");
b.ToTable("ProgramScheduleItem", (string)null);
b.UseTptMappingStrategy();
});
modelBuilder.Entity("ErsatzTV.Core.Domain.Resolution", b =>
@ -1714,6 +1724,54 @@ namespace ErsatzTV.Infrastructure.Migrations @@ -1714,6 +1724,54 @@ namespace ErsatzTV.Infrastructure.Migrations
b.ToTable("Resolution", (string)null);
});
modelBuilder.Entity("ErsatzTV.Core.Domain.Scheduling.ScheduleBlock", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER");
b.Property<string>("Name")
.HasColumnType("TEXT");
b.HasKey("Id");
b.HasIndex("Name")
.IsUnique();
b.ToTable("ScheduleBlock", (string)null);
});
modelBuilder.Entity("ErsatzTV.Core.Domain.Scheduling.ScheduleBlockItem", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER");
b.Property<int>("Index")
.HasColumnType("INTEGER");
b.Property<string>("Name")
.HasColumnType("TEXT");
b.Property<int>("PlaybackOrder")
.HasColumnType("INTEGER");
b.Property<int>("PlayoutMode")
.HasColumnType("INTEGER");
b.Property<string>("Query")
.HasColumnType("TEXT");
b.Property<int>("ScheduleBlockId")
.HasColumnType("INTEGER");
b.HasKey("Id");
b.HasIndex("ScheduleBlockId");
b.ToTable("ScheduleBlockItem", (string)null);
});
modelBuilder.Entity("ErsatzTV.Core.Domain.SeasonMetadata", b =>
{
b.Property<int>("Id")
@ -2265,13 +2323,6 @@ namespace ErsatzTV.Infrastructure.Migrations @@ -2265,13 +2323,6 @@ namespace ErsatzTV.Infrastructure.Migrations
b.ToTable("JellyfinPathInfo");
});
modelBuilder.Entity("ErsatzTV.Core.Domain.Artist", b =>
{
b.HasBaseType("ErsatzTV.Core.Domain.MediaItem");
b.ToTable("Artist", (string)null);
});
modelBuilder.Entity("ErsatzTV.Core.Domain.EmbyLibrary", b =>
{
b.HasBaseType("ErsatzTV.Core.Domain.Library");
@ -2285,69 +2336,69 @@ namespace ErsatzTV.Infrastructure.Migrations @@ -2285,69 +2336,69 @@ namespace ErsatzTV.Infrastructure.Migrations
b.ToTable("EmbyLibrary", (string)null);
});
modelBuilder.Entity("ErsatzTV.Core.Domain.EmbyMediaSource", b =>
modelBuilder.Entity("ErsatzTV.Core.Domain.JellyfinLibrary", b =>
{
b.HasBaseType("ErsatzTV.Core.Domain.MediaSource");
b.HasBaseType("ErsatzTV.Core.Domain.Library");
b.Property<string>("OperatingSystem")
b.Property<string>("ItemId")
.HasColumnType("TEXT");
b.Property<string>("ServerName")
.HasColumnType("TEXT");
b.Property<bool>("ShouldSyncItems")
.HasColumnType("INTEGER");
b.ToTable("EmbyMediaSource", (string)null);
b.ToTable("JellyfinLibrary", (string)null);
});
modelBuilder.Entity("ErsatzTV.Core.Domain.Episode", b =>
modelBuilder.Entity("ErsatzTV.Core.Domain.LocalLibrary", b =>
{
b.HasBaseType("ErsatzTV.Core.Domain.MediaItem");
b.Property<int>("SeasonId")
.HasColumnType("INTEGER");
b.HasIndex("SeasonId");
b.HasBaseType("ErsatzTV.Core.Domain.Library");
b.ToTable("Episode", (string)null);
b.ToTable("LocalLibrary", (string)null);
});
modelBuilder.Entity("ErsatzTV.Core.Domain.JellyfinLibrary", b =>
modelBuilder.Entity("ErsatzTV.Core.Domain.PlexLibrary", b =>
{
b.HasBaseType("ErsatzTV.Core.Domain.Library");
b.Property<string>("ItemId")
b.Property<string>("Key")
.HasColumnType("TEXT");
b.Property<bool>("ShouldSyncItems")
.HasColumnType("INTEGER");
b.ToTable("JellyfinLibrary", (string)null);
b.ToTable("PlexLibrary", (string)null);
});
modelBuilder.Entity("ErsatzTV.Core.Domain.JellyfinMediaSource", b =>
modelBuilder.Entity("ErsatzTV.Core.Domain.PlexMediaFile", b =>
{
b.HasBaseType("ErsatzTV.Core.Domain.MediaSource");
b.HasBaseType("ErsatzTV.Core.Domain.MediaFile");
b.Property<string>("OperatingSystem")
b.Property<string>("Key")
.HasColumnType("TEXT");
b.Property<string>("ServerName")
.HasColumnType("TEXT");
b.Property<int>("PlexId")
.HasColumnType("INTEGER");
b.ToTable("JellyfinMediaSource", (string)null);
b.ToTable("PlexMediaFile", (string)null);
});
modelBuilder.Entity("ErsatzTV.Core.Domain.LocalLibrary", b =>
modelBuilder.Entity("ErsatzTV.Core.Domain.Artist", b =>
{
b.HasBaseType("ErsatzTV.Core.Domain.Library");
b.HasBaseType("ErsatzTV.Core.Domain.MediaItem");
b.ToTable("LocalLibrary", (string)null);
b.ToTable("Artist", (string)null);
});
modelBuilder.Entity("ErsatzTV.Core.Domain.LocalMediaSource", b =>
modelBuilder.Entity("ErsatzTV.Core.Domain.Episode", b =>
{
b.HasBaseType("ErsatzTV.Core.Domain.MediaSource");
b.HasBaseType("ErsatzTV.Core.Domain.MediaItem");
b.ToTable("LocalMediaSource", (string)null);
b.Property<int>("SeasonId")
.HasColumnType("INTEGER");
b.HasIndex("SeasonId");
b.ToTable("Episode", (string)null);
});
modelBuilder.Entity("ErsatzTV.Core.Domain.Movie", b =>
@ -2376,30 +2427,66 @@ namespace ErsatzTV.Infrastructure.Migrations @@ -2376,30 +2427,66 @@ namespace ErsatzTV.Infrastructure.Migrations
b.ToTable("OtherVideo", (string)null);
});
modelBuilder.Entity("ErsatzTV.Core.Domain.PlexLibrary", b =>
modelBuilder.Entity("ErsatzTV.Core.Domain.Season", b =>
{
b.HasBaseType("ErsatzTV.Core.Domain.Library");
b.HasBaseType("ErsatzTV.Core.Domain.MediaItem");
b.Property<string>("Key")
.HasColumnType("TEXT");
b.Property<int>("SeasonNumber")
.HasColumnType("INTEGER");
b.Property<bool>("ShouldSyncItems")
b.Property<int>("ShowId")
.HasColumnType("INTEGER");
b.ToTable("PlexLibrary", (string)null);
b.HasIndex("ShowId");
b.ToTable("Season", (string)null);
});
modelBuilder.Entity("ErsatzTV.Core.Domain.PlexMediaFile", b =>
modelBuilder.Entity("ErsatzTV.Core.Domain.Show", b =>
{
b.HasBaseType("ErsatzTV.Core.Domain.MediaFile");
b.HasBaseType("ErsatzTV.Core.Domain.MediaItem");
b.Property<string>("Key")
b.ToTable("Show", (string)null);
});
modelBuilder.Entity("ErsatzTV.Core.Domain.Song", b =>
{
b.HasBaseType("ErsatzTV.Core.Domain.MediaItem");
b.ToTable("Song", (string)null);
});
modelBuilder.Entity("ErsatzTV.Core.Domain.EmbyMediaSource", b =>
{
b.HasBaseType("ErsatzTV.Core.Domain.MediaSource");
b.Property<string>("OperatingSystem")
.HasColumnType("TEXT");
b.Property<int>("PlexId")
.HasColumnType("INTEGER");
b.Property<string>("ServerName")
.HasColumnType("TEXT");
b.ToTable("PlexMediaFile", (string)null);
b.ToTable("EmbyMediaSource", (string)null);
});
modelBuilder.Entity("ErsatzTV.Core.Domain.JellyfinMediaSource", b =>
{
b.HasBaseType("ErsatzTV.Core.Domain.MediaSource");
b.Property<string>("OperatingSystem")
.HasColumnType("TEXT");
b.Property<string>("ServerName")
.HasColumnType("TEXT");
b.ToTable("JellyfinMediaSource", (string)null);
});
modelBuilder.Entity("ErsatzTV.Core.Domain.LocalMediaSource", b =>
{
b.HasBaseType("ErsatzTV.Core.Domain.MediaSource");
b.ToTable("LocalMediaSource", (string)null);
});
modelBuilder.Entity("ErsatzTV.Core.Domain.PlexMediaSource", b =>
@ -2461,46 +2548,43 @@ namespace ErsatzTV.Infrastructure.Migrations @@ -2461,46 +2548,43 @@ namespace ErsatzTV.Infrastructure.Migrations
b.ToTable("ProgramScheduleOneItem", (string)null);
});
modelBuilder.Entity("ErsatzTV.Core.Domain.Season", b =>
modelBuilder.Entity("ErsatzTV.Core.Domain.EmbyEpisode", b =>
{
b.HasBaseType("ErsatzTV.Core.Domain.MediaItem");
b.Property<int>("SeasonNumber")
.HasColumnType("INTEGER");
b.HasBaseType("ErsatzTV.Core.Domain.Episode");
b.Property<int>("ShowId")
.HasColumnType("INTEGER");
b.Property<string>("Etag")
.HasColumnType("TEXT");
b.HasIndex("ShowId");
b.Property<string>("ItemId")
.HasColumnType("TEXT");
b.ToTable("Season", (string)null);
b.ToTable("EmbyEpisode", (string)null);
});
modelBuilder.Entity("ErsatzTV.Core.Domain.Show", b =>
modelBuilder.Entity("ErsatzTV.Core.Domain.JellyfinEpisode", b =>
{
b.HasBaseType("ErsatzTV.Core.Domain.MediaItem");
b.HasBaseType("ErsatzTV.Core.Domain.Episode");
b.ToTable("Show", (string)null);
});
b.Property<string>("Etag")
.HasColumnType("TEXT");
modelBuilder.Entity("ErsatzTV.Core.Domain.Song", b =>
{
b.HasBaseType("ErsatzTV.Core.Domain.MediaItem");
b.Property<string>("ItemId")
.HasColumnType("TEXT");
b.ToTable("Song", (string)null);
b.ToTable("JellyfinEpisode", (string)null);
});
modelBuilder.Entity("ErsatzTV.Core.Domain.EmbyEpisode", b =>
modelBuilder.Entity("ErsatzTV.Core.Domain.PlexEpisode", b =>
{
b.HasBaseType("ErsatzTV.Core.Domain.Episode");
b.Property<string>("Etag")
.HasColumnType("TEXT");
b.Property<string>("ItemId")
b.Property<string>("Key")
.HasColumnType("TEXT");
b.ToTable("EmbyEpisode", (string)null);
b.ToTable("PlexEpisode", (string)null);
});
modelBuilder.Entity("ErsatzTV.Core.Domain.EmbyMovie", b =>
@ -2516,9 +2600,9 @@ namespace ErsatzTV.Infrastructure.Migrations @@ -2516,9 +2600,9 @@ namespace ErsatzTV.Infrastructure.Migrations
b.ToTable("EmbyMovie", (string)null);
});
modelBuilder.Entity("ErsatzTV.Core.Domain.EmbySeason", b =>
modelBuilder.Entity("ErsatzTV.Core.Domain.JellyfinMovie", b =>
{
b.HasBaseType("ErsatzTV.Core.Domain.Season");
b.HasBaseType("ErsatzTV.Core.Domain.Movie");
b.Property<string>("Etag")
.HasColumnType("TEXT");
@ -2526,25 +2610,25 @@ namespace ErsatzTV.Infrastructure.Migrations @@ -2526,25 +2610,25 @@ namespace ErsatzTV.Infrastructure.Migrations
b.Property<string>("ItemId")
.HasColumnType("TEXT");
b.ToTable("EmbySeason", (string)null);
b.ToTable("JellyfinMovie", (string)null);
});
modelBuilder.Entity("ErsatzTV.Core.Domain.EmbyShow", b =>
modelBuilder.Entity("ErsatzTV.Core.Domain.PlexMovie", b =>
{
b.HasBaseType("ErsatzTV.Core.Domain.Show");
b.HasBaseType("ErsatzTV.Core.Domain.Movie");
b.Property<string>("Etag")
.HasColumnType("TEXT");
b.Property<string>("ItemId")
b.Property<string>("Key")
.HasColumnType("TEXT");
b.ToTable("EmbyShow", (string)null);
b.ToTable("PlexMovie", (string)null);
});
modelBuilder.Entity("ErsatzTV.Core.Domain.JellyfinEpisode", b =>
modelBuilder.Entity("ErsatzTV.Core.Domain.EmbySeason", b =>
{
b.HasBaseType("ErsatzTV.Core.Domain.Episode");
b.HasBaseType("ErsatzTV.Core.Domain.Season");
b.Property<string>("Etag")
.HasColumnType("TEXT");
@ -2552,12 +2636,12 @@ namespace ErsatzTV.Infrastructure.Migrations @@ -2552,12 +2636,12 @@ namespace ErsatzTV.Infrastructure.Migrations
b.Property<string>("ItemId")
.HasColumnType("TEXT");
b.ToTable("JellyfinEpisode", (string)null);
b.ToTable("EmbySeason", (string)null);
});
modelBuilder.Entity("ErsatzTV.Core.Domain.JellyfinMovie", b =>
modelBuilder.Entity("ErsatzTV.Core.Domain.JellyfinSeason", b =>
{
b.HasBaseType("ErsatzTV.Core.Domain.Movie");
b.HasBaseType("ErsatzTV.Core.Domain.Season");
b.Property<string>("Etag")
.HasColumnType("TEXT");
@ -2565,23 +2649,23 @@ namespace ErsatzTV.Infrastructure.Migrations @@ -2565,23 +2649,23 @@ namespace ErsatzTV.Infrastructure.Migrations
b.Property<string>("ItemId")
.HasColumnType("TEXT");
b.ToTable("JellyfinMovie", (string)null);
b.ToTable("JellyfinSeason", (string)null);
});
modelBuilder.Entity("ErsatzTV.Core.Domain.JellyfinSeason", b =>
modelBuilder.Entity("ErsatzTV.Core.Domain.PlexSeason", b =>
{
b.HasBaseType("ErsatzTV.Core.Domain.Season");
b.Property<string>("Etag")
.HasColumnType("TEXT");
b.Property<string>("ItemId")
b.Property<string>("Key")
.HasColumnType("TEXT");
b.ToTable("JellyfinSeason", (string)null);
b.ToTable("PlexSeason", (string)null);
});
modelBuilder.Entity("ErsatzTV.Core.Domain.JellyfinShow", b =>
modelBuilder.Entity("ErsatzTV.Core.Domain.EmbyShow", b =>
{
b.HasBaseType("ErsatzTV.Core.Domain.Show");
@ -2591,51 +2675,25 @@ namespace ErsatzTV.Infrastructure.Migrations @@ -2591,51 +2675,25 @@ namespace ErsatzTV.Infrastructure.Migrations
b.Property<string>("ItemId")
.HasColumnType("TEXT");
b.ToTable("JellyfinShow", (string)null);
b.ToTable("EmbyShow", (string)null);
});
modelBuilder.Entity("ErsatzTV.Core.Domain.PlexEpisode", b =>
modelBuilder.Entity("ErsatzTV.Core.Domain.JellyfinShow", b =>
{
b.HasBaseType("ErsatzTV.Core.Domain.Episode");
b.HasBaseType("ErsatzTV.Core.Domain.Show");
b.Property<string>("Etag")
.HasColumnType("TEXT");
b.Property<string>("Key")
b.Property<string>("ItemId")
.HasColumnType("TEXT");
b.ToTable("PlexEpisode", (string)null);
b.ToTable("JellyfinShow", (string)null);
});
modelBuilder.Entity("ErsatzTV.Core.Domain.PlexMovie", b =>
modelBuilder.Entity("ErsatzTV.Core.Domain.PlexShow", b =>
{
b.HasBaseType("ErsatzTV.Core.Domain.Movie");
b.Property<string>("Etag")
.HasColumnType("TEXT");
b.Property<string>("Key")
.HasColumnType("TEXT");
b.ToTable("PlexMovie", (string)null);
});
modelBuilder.Entity("ErsatzTV.Core.Domain.PlexSeason", b =>
{
b.HasBaseType("ErsatzTV.Core.Domain.Season");
b.Property<string>("Etag")
.HasColumnType("TEXT");
b.Property<string>("Key")
.HasColumnType("TEXT");
b.ToTable("PlexSeason", (string)null);
});
modelBuilder.Entity("ErsatzTV.Core.Domain.PlexShow", b =>
{
b.HasBaseType("ErsatzTV.Core.Domain.Show");
b.HasBaseType("ErsatzTV.Core.Domain.Show");
b.Property<string>("Etag")
.HasColumnType("TEXT");
@ -3452,6 +3510,17 @@ namespace ErsatzTV.Infrastructure.Migrations @@ -3452,6 +3510,17 @@ namespace ErsatzTV.Infrastructure.Migrations
b.Navigation("Watermark");
});
modelBuilder.Entity("ErsatzTV.Core.Domain.Scheduling.ScheduleBlockItem", b =>
{
b.HasOne("ErsatzTV.Core.Domain.Scheduling.ScheduleBlock", "ScheduleBlock")
.WithMany("Items")
.HasForeignKey("ScheduleBlockId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("ScheduleBlock");
});
modelBuilder.Entity("ErsatzTV.Core.Domain.SeasonMetadata", b =>
{
b.HasOne("ErsatzTV.Core.Domain.Season", "Season")
@ -3675,15 +3744,6 @@ namespace ErsatzTV.Infrastructure.Migrations @@ -3675,15 +3744,6 @@ namespace ErsatzTV.Infrastructure.Migrations
.OnDelete(DeleteBehavior.Cascade);
});
modelBuilder.Entity("ErsatzTV.Core.Domain.Artist", b =>
{
b.HasOne("ErsatzTV.Core.Domain.MediaItem", null)
.WithOne()
.HasForeignKey("ErsatzTV.Core.Domain.Artist", "Id")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("ErsatzTV.Core.Domain.EmbyLibrary", b =>
{
b.HasOne("ErsatzTV.Core.Domain.Library", null)
@ -3693,66 +3753,66 @@ namespace ErsatzTV.Infrastructure.Migrations @@ -3693,66 +3753,66 @@ namespace ErsatzTV.Infrastructure.Migrations
.IsRequired();
});
modelBuilder.Entity("ErsatzTV.Core.Domain.EmbyMediaSource", b =>
modelBuilder.Entity("ErsatzTV.Core.Domain.JellyfinLibrary", b =>
{
b.HasOne("ErsatzTV.Core.Domain.MediaSource", null)
b.HasOne("ErsatzTV.Core.Domain.Library", null)
.WithOne()
.HasForeignKey("ErsatzTV.Core.Domain.EmbyMediaSource", "Id")
.HasForeignKey("ErsatzTV.Core.Domain.JellyfinLibrary", "Id")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("ErsatzTV.Core.Domain.Episode", b =>
modelBuilder.Entity("ErsatzTV.Core.Domain.LocalLibrary", b =>
{
b.HasOne("ErsatzTV.Core.Domain.MediaItem", null)
b.HasOne("ErsatzTV.Core.Domain.Library", null)
.WithOne()
.HasForeignKey("ErsatzTV.Core.Domain.Episode", "Id")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("ErsatzTV.Core.Domain.Season", "Season")
.WithMany("Episodes")
.HasForeignKey("SeasonId")
.HasForeignKey("ErsatzTV.Core.Domain.LocalLibrary", "Id")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Season");
});
modelBuilder.Entity("ErsatzTV.Core.Domain.JellyfinLibrary", b =>
modelBuilder.Entity("ErsatzTV.Core.Domain.PlexLibrary", b =>
{
b.HasOne("ErsatzTV.Core.Domain.Library", null)
.WithOne()
.HasForeignKey("ErsatzTV.Core.Domain.JellyfinLibrary", "Id")
.HasForeignKey("ErsatzTV.Core.Domain.PlexLibrary", "Id")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("ErsatzTV.Core.Domain.JellyfinMediaSource", b =>
modelBuilder.Entity("ErsatzTV.Core.Domain.PlexMediaFile", b =>
{
b.HasOne("ErsatzTV.Core.Domain.MediaSource", null)
b.HasOne("ErsatzTV.Core.Domain.MediaFile", null)
.WithOne()
.HasForeignKey("ErsatzTV.Core.Domain.JellyfinMediaSource", "Id")
.HasForeignKey("ErsatzTV.Core.Domain.PlexMediaFile", "Id")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("ErsatzTV.Core.Domain.LocalLibrary", b =>
modelBuilder.Entity("ErsatzTV.Core.Domain.Artist", b =>
{
b.HasOne("ErsatzTV.Core.Domain.Library", null)
b.HasOne("ErsatzTV.Core.Domain.MediaItem", null)
.WithOne()
.HasForeignKey("ErsatzTV.Core.Domain.LocalLibrary", "Id")
.HasForeignKey("ErsatzTV.Core.Domain.Artist", "Id")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("ErsatzTV.Core.Domain.LocalMediaSource", b =>
modelBuilder.Entity("ErsatzTV.Core.Domain.Episode", b =>
{
b.HasOne("ErsatzTV.Core.Domain.MediaSource", null)
b.HasOne("ErsatzTV.Core.Domain.MediaItem", null)
.WithOne()
.HasForeignKey("ErsatzTV.Core.Domain.LocalMediaSource", "Id")
.HasForeignKey("ErsatzTV.Core.Domain.Episode", "Id")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("ErsatzTV.Core.Domain.Season", "Season")
.WithMany("Episodes")
.HasForeignKey("SeasonId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Season");
});
modelBuilder.Entity("ErsatzTV.Core.Domain.Movie", b =>
@ -3790,100 +3850,109 @@ namespace ErsatzTV.Infrastructure.Migrations @@ -3790,100 +3850,109 @@ namespace ErsatzTV.Infrastructure.Migrations
.IsRequired();
});
modelBuilder.Entity("ErsatzTV.Core.Domain.PlexLibrary", b =>
modelBuilder.Entity("ErsatzTV.Core.Domain.Season", b =>
{
b.HasOne("ErsatzTV.Core.Domain.Library", null)
b.HasOne("ErsatzTV.Core.Domain.MediaItem", null)
.WithOne()
.HasForeignKey("ErsatzTV.Core.Domain.PlexLibrary", "Id")
.HasForeignKey("ErsatzTV.Core.Domain.Season", "Id")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("ErsatzTV.Core.Domain.Show", "Show")
.WithMany("Seasons")
.HasForeignKey("ShowId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Show");
});
modelBuilder.Entity("ErsatzTV.Core.Domain.PlexMediaFile", b =>
modelBuilder.Entity("ErsatzTV.Core.Domain.Show", b =>
{
b.HasOne("ErsatzTV.Core.Domain.MediaFile", null)
b.HasOne("ErsatzTV.Core.Domain.MediaItem", null)
.WithOne()
.HasForeignKey("ErsatzTV.Core.Domain.PlexMediaFile", "Id")
.HasForeignKey("ErsatzTV.Core.Domain.Show", "Id")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("ErsatzTV.Core.Domain.PlexMediaSource", b =>
modelBuilder.Entity("ErsatzTV.Core.Domain.Song", b =>
{
b.HasOne("ErsatzTV.Core.Domain.MediaSource", null)
b.HasOne("ErsatzTV.Core.Domain.MediaItem", null)
.WithOne()
.HasForeignKey("ErsatzTV.Core.Domain.PlexMediaSource", "Id")
.HasForeignKey("ErsatzTV.Core.Domain.Song", "Id")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("ErsatzTV.Core.Domain.ProgramScheduleItemDuration", b =>
modelBuilder.Entity("ErsatzTV.Core.Domain.EmbyMediaSource", b =>
{
b.HasOne("ErsatzTV.Core.Domain.ProgramScheduleItem", null)
b.HasOne("ErsatzTV.Core.Domain.MediaSource", null)
.WithOne()
.HasForeignKey("ErsatzTV.Core.Domain.ProgramScheduleItemDuration", "Id")
.HasForeignKey("ErsatzTV.Core.Domain.EmbyMediaSource", "Id")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("ErsatzTV.Core.Domain.ProgramScheduleItemFlood", b =>
modelBuilder.Entity("ErsatzTV.Core.Domain.JellyfinMediaSource", b =>
{
b.HasOne("ErsatzTV.Core.Domain.ProgramScheduleItem", null)
b.HasOne("ErsatzTV.Core.Domain.MediaSource", null)
.WithOne()
.HasForeignKey("ErsatzTV.Core.Domain.ProgramScheduleItemFlood", "Id")
.HasForeignKey("ErsatzTV.Core.Domain.JellyfinMediaSource", "Id")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("ErsatzTV.Core.Domain.ProgramScheduleItemMultiple", b =>
modelBuilder.Entity("ErsatzTV.Core.Domain.LocalMediaSource", b =>
{
b.HasOne("ErsatzTV.Core.Domain.ProgramScheduleItem", null)
b.HasOne("ErsatzTV.Core.Domain.MediaSource", null)
.WithOne()
.HasForeignKey("ErsatzTV.Core.Domain.ProgramScheduleItemMultiple", "Id")
.HasForeignKey("ErsatzTV.Core.Domain.LocalMediaSource", "Id")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("ErsatzTV.Core.Domain.ProgramScheduleItemOne", b =>
modelBuilder.Entity("ErsatzTV.Core.Domain.PlexMediaSource", b =>
{
b.HasOne("ErsatzTV.Core.Domain.ProgramScheduleItem", null)
b.HasOne("ErsatzTV.Core.Domain.MediaSource", null)
.WithOne()
.HasForeignKey("ErsatzTV.Core.Domain.ProgramScheduleItemOne", "Id")
.HasForeignKey("ErsatzTV.Core.Domain.PlexMediaSource", "Id")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("ErsatzTV.Core.Domain.Season", b =>
modelBuilder.Entity("ErsatzTV.Core.Domain.ProgramScheduleItemDuration", b =>
{
b.HasOne("ErsatzTV.Core.Domain.MediaItem", null)
b.HasOne("ErsatzTV.Core.Domain.ProgramScheduleItem", null)
.WithOne()
.HasForeignKey("ErsatzTV.Core.Domain.Season", "Id")
.HasForeignKey("ErsatzTV.Core.Domain.ProgramScheduleItemDuration", "Id")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
b.HasOne("ErsatzTV.Core.Domain.Show", "Show")
.WithMany("Seasons")
.HasForeignKey("ShowId")
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();
b.Navigation("Show");
});
modelBuilder.Entity("ErsatzTV.Core.Domain.Show", b =>
modelBuilder.Entity("ErsatzTV.Core.Domain.ProgramScheduleItemMultiple", b =>
{
b.HasOne("ErsatzTV.Core.Domain.MediaItem", null)
b.HasOne("ErsatzTV.Core.Domain.ProgramScheduleItem", null)
.WithOne()
.HasForeignKey("ErsatzTV.Core.Domain.Show", "Id")
.HasForeignKey("ErsatzTV.Core.Domain.ProgramScheduleItemMultiple", "Id")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("ErsatzTV.Core.Domain.Song", b =>
modelBuilder.Entity("ErsatzTV.Core.Domain.ProgramScheduleItemOne", b =>
{
b.HasOne("ErsatzTV.Core.Domain.MediaItem", null)
b.HasOne("ErsatzTV.Core.Domain.ProgramScheduleItem", null)
.WithOne()
.HasForeignKey("ErsatzTV.Core.Domain.Song", "Id")
.HasForeignKey("ErsatzTV.Core.Domain.ProgramScheduleItemOne", "Id")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
@ -3897,92 +3966,92 @@ namespace ErsatzTV.Infrastructure.Migrations @@ -3897,92 +3966,92 @@ namespace ErsatzTV.Infrastructure.Migrations
.IsRequired();
});
modelBuilder.Entity("ErsatzTV.Core.Domain.EmbyMovie", b =>
modelBuilder.Entity("ErsatzTV.Core.Domain.JellyfinEpisode", b =>
{
b.HasOne("ErsatzTV.Core.Domain.Movie", null)
b.HasOne("ErsatzTV.Core.Domain.Episode", null)
.WithOne()
.HasForeignKey("ErsatzTV.Core.Domain.EmbyMovie", "Id")
.HasForeignKey("ErsatzTV.Core.Domain.JellyfinEpisode", "Id")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("ErsatzTV.Core.Domain.EmbySeason", b =>
modelBuilder.Entity("ErsatzTV.Core.Domain.PlexEpisode", b =>
{
b.HasOne("ErsatzTV.Core.Domain.Season", null)
b.HasOne("ErsatzTV.Core.Domain.Episode", null)
.WithOne()
.HasForeignKey("ErsatzTV.Core.Domain.EmbySeason", "Id")
.HasForeignKey("ErsatzTV.Core.Domain.PlexEpisode", "Id")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("ErsatzTV.Core.Domain.EmbyShow", b =>
modelBuilder.Entity("ErsatzTV.Core.Domain.EmbyMovie", b =>
{
b.HasOne("ErsatzTV.Core.Domain.Show", null)
b.HasOne("ErsatzTV.Core.Domain.Movie", null)
.WithOne()
.HasForeignKey("ErsatzTV.Core.Domain.EmbyShow", "Id")
.HasForeignKey("ErsatzTV.Core.Domain.EmbyMovie", "Id")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("ErsatzTV.Core.Domain.JellyfinEpisode", b =>
modelBuilder.Entity("ErsatzTV.Core.Domain.JellyfinMovie", b =>
{
b.HasOne("ErsatzTV.Core.Domain.Episode", null)
b.HasOne("ErsatzTV.Core.Domain.Movie", null)
.WithOne()
.HasForeignKey("ErsatzTV.Core.Domain.JellyfinEpisode", "Id")
.HasForeignKey("ErsatzTV.Core.Domain.JellyfinMovie", "Id")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("ErsatzTV.Core.Domain.JellyfinMovie", b =>
modelBuilder.Entity("ErsatzTV.Core.Domain.PlexMovie", b =>
{
b.HasOne("ErsatzTV.Core.Domain.Movie", null)
.WithOne()
.HasForeignKey("ErsatzTV.Core.Domain.JellyfinMovie", "Id")
.HasForeignKey("ErsatzTV.Core.Domain.PlexMovie", "Id")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("ErsatzTV.Core.Domain.JellyfinSeason", b =>
modelBuilder.Entity("ErsatzTV.Core.Domain.EmbySeason", b =>
{
b.HasOne("ErsatzTV.Core.Domain.Season", null)
.WithOne()
.HasForeignKey("ErsatzTV.Core.Domain.JellyfinSeason", "Id")
.HasForeignKey("ErsatzTV.Core.Domain.EmbySeason", "Id")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("ErsatzTV.Core.Domain.JellyfinShow", b =>
modelBuilder.Entity("ErsatzTV.Core.Domain.JellyfinSeason", b =>
{
b.HasOne("ErsatzTV.Core.Domain.Show", null)
b.HasOne("ErsatzTV.Core.Domain.Season", null)
.WithOne()
.HasForeignKey("ErsatzTV.Core.Domain.JellyfinShow", "Id")
.HasForeignKey("ErsatzTV.Core.Domain.JellyfinSeason", "Id")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("ErsatzTV.Core.Domain.PlexEpisode", b =>
modelBuilder.Entity("ErsatzTV.Core.Domain.PlexSeason", b =>
{
b.HasOne("ErsatzTV.Core.Domain.Episode", null)
b.HasOne("ErsatzTV.Core.Domain.Season", null)
.WithOne()
.HasForeignKey("ErsatzTV.Core.Domain.PlexEpisode", "Id")
.HasForeignKey("ErsatzTV.Core.Domain.PlexSeason", "Id")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("ErsatzTV.Core.Domain.PlexMovie", b =>
modelBuilder.Entity("ErsatzTV.Core.Domain.EmbyShow", b =>
{
b.HasOne("ErsatzTV.Core.Domain.Movie", null)
b.HasOne("ErsatzTV.Core.Domain.Show", null)
.WithOne()
.HasForeignKey("ErsatzTV.Core.Domain.PlexMovie", "Id")
.HasForeignKey("ErsatzTV.Core.Domain.EmbyShow", "Id")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("ErsatzTV.Core.Domain.PlexSeason", b =>
modelBuilder.Entity("ErsatzTV.Core.Domain.JellyfinShow", b =>
{
b.HasOne("ErsatzTV.Core.Domain.Season", null)
b.HasOne("ErsatzTV.Core.Domain.Show", null)
.WithOne()
.HasForeignKey("ErsatzTV.Core.Domain.PlexSeason", "Id")
.HasForeignKey("ErsatzTV.Core.Domain.JellyfinShow", "Id")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
@ -4167,6 +4236,11 @@ namespace ErsatzTV.Infrastructure.Migrations @@ -4167,6 +4236,11 @@ namespace ErsatzTV.Infrastructure.Migrations
b.Navigation("Playouts");
});
modelBuilder.Entity("ErsatzTV.Core.Domain.Scheduling.ScheduleBlock", b =>
{
b.Navigation("Items");
});
modelBuilder.Entity("ErsatzTV.Core.Domain.SeasonMetadata", b =>
{
b.Navigation("Actors");
@ -4233,23 +4307,21 @@ namespace ErsatzTV.Infrastructure.Migrations @@ -4233,23 +4307,21 @@ namespace ErsatzTV.Infrastructure.Migrations
b.Navigation("Guids");
});
modelBuilder.Entity("ErsatzTV.Core.Domain.Artist", b =>
modelBuilder.Entity("ErsatzTV.Core.Domain.EmbyLibrary", b =>
{
b.Navigation("ArtistMetadata");
b.Navigation("MusicVideos");
b.Navigation("PathInfos");
});
modelBuilder.Entity("ErsatzTV.Core.Domain.EmbyLibrary", b =>
modelBuilder.Entity("ErsatzTV.Core.Domain.JellyfinLibrary", b =>
{
b.Navigation("PathInfos");
});
modelBuilder.Entity("ErsatzTV.Core.Domain.EmbyMediaSource", b =>
modelBuilder.Entity("ErsatzTV.Core.Domain.Artist", b =>
{
b.Navigation("Connections");
b.Navigation("ArtistMetadata");
b.Navigation("PathReplacements");
b.Navigation("MusicVideos");
});
modelBuilder.Entity("ErsatzTV.Core.Domain.Episode", b =>
@ -4259,18 +4331,6 @@ namespace ErsatzTV.Infrastructure.Migrations @@ -4259,18 +4331,6 @@ namespace ErsatzTV.Infrastructure.Migrations
b.Navigation("MediaVersions");
});
modelBuilder.Entity("ErsatzTV.Core.Domain.JellyfinLibrary", b =>
{
b.Navigation("PathInfos");
});
modelBuilder.Entity("ErsatzTV.Core.Domain.JellyfinMediaSource", b =>
{
b.Navigation("Connections");
b.Navigation("PathReplacements");
});
modelBuilder.Entity("ErsatzTV.Core.Domain.Movie", b =>
{
b.Navigation("MediaVersions");
@ -4292,13 +4352,6 @@ namespace ErsatzTV.Infrastructure.Migrations @@ -4292,13 +4352,6 @@ namespace ErsatzTV.Infrastructure.Migrations
b.Navigation("OtherVideoMetadata");
});
modelBuilder.Entity("ErsatzTV.Core.Domain.PlexMediaSource", b =>
{
b.Navigation("Connections");
b.Navigation("PathReplacements");
});
modelBuilder.Entity("ErsatzTV.Core.Domain.Season", b =>
{
b.Navigation("Episodes");
@ -4319,6 +4372,27 @@ namespace ErsatzTV.Infrastructure.Migrations @@ -4319,6 +4372,27 @@ namespace ErsatzTV.Infrastructure.Migrations
b.Navigation("SongMetadata");
});
modelBuilder.Entity("ErsatzTV.Core.Domain.EmbyMediaSource", b =>
{
b.Navigation("Connections");
b.Navigation("PathReplacements");
});
modelBuilder.Entity("ErsatzTV.Core.Domain.JellyfinMediaSource", b =>
{
b.Navigation("Connections");
b.Navigation("PathReplacements");
});
modelBuilder.Entity("ErsatzTV.Core.Domain.PlexMediaSource", b =>
{
b.Navigation("Connections");
b.Navigation("PathReplacements");
});
#pragma warning restore 612, 618
}
}

21
ErsatzTV/Controllers/Api/ScheduleController.cs

@ -0,0 +1,21 @@ @@ -0,0 +1,21 @@
using ErsatzTV.Application.Scheduling;
using ErsatzTV.Core.Api.Scheduling;
using MediatR;
using Microsoft.AspNetCore.Mvc;
namespace ErsatzTV.Controllers.Api;
[ApiController]
public class ScheduleController
{
private readonly IMediator _mediator;
public ScheduleController(IMediator mediator)
{
_mediator = mediator;
}
[HttpGet("/api/schedule/blocks")]
public async Task<List<ScheduleBlockResponseModel>> GetAll() =>
await _mediator.Send(new GetAllScheduleBlocksForApi());
}

BIN
ErsatzTV/Resources/background.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Loading…
Cancel
Save