Browse Source

remove old movie metadata type

pull/31/head
Jason Dove 6 years ago
parent
commit
f9c6724d74
  1. 2
      ErsatzTV.Application/MediaItems/Mapper.cs
  2. 12
      ErsatzTV.Application/Movies/Mapper.cs
  3. 2
      ErsatzTV.Application/Playouts/Mapper.cs
  4. 2
      ErsatzTV.Core.Tests/Scheduling/PlayoutBuilderTests.cs
  5. 4
      ErsatzTV.Core/Domain/MediaItem/Movie.cs
  6. 3
      ErsatzTV.Core/Domain/Metadata/MetadataKind.cs
  7. 17
      ErsatzTV.Core/Domain/MovieMetadata.cs
  8. 7
      ErsatzTV.Core/Iptv/ChannelGuide.cs
  9. 10
      ErsatzTV.Core/Metadata/FallbackMetadataProvider.cs
  10. 34
      ErsatzTV.Core/Metadata/LocalMetadataProvider.cs
  11. 11
      ErsatzTV.Core/Metadata/MovieFolderScanner.cs
  12. 8
      ErsatzTV.Core/Scheduling/ChronologicalMediaCollectionEnumerator.cs
  13. 4
      ErsatzTV.Core/Scheduling/PlayoutBuilder.cs
  14. 6
      ErsatzTV.Infrastructure/Data/Configurations/MediaItem/MovieConfiguration.cs
  15. 12
      ErsatzTV.Infrastructure/Data/Configurations/MovieMetadataConfiguration.cs
  16. 2
      ErsatzTV.Infrastructure/Data/Repositories/ChannelRepository.cs
  17. 2
      ErsatzTV.Infrastructure/Data/Repositories/MediaCollectionRepository.cs
  18. 9
      ErsatzTV.Infrastructure/Data/Repositories/MediaItemRepository.cs
  19. 6
      ErsatzTV.Infrastructure/Data/Repositories/MovieRepository.cs
  20. 2
      ErsatzTV.Infrastructure/Data/Repositories/PlayoutRepository.cs
  21. 1811
      ErsatzTV.Infrastructure/Migrations/20210226154155_Remove_OldMovieMetadata.Designer.cs
  22. 63
      ErsatzTV.Infrastructure/Migrations/20210226154155_Remove_OldMovieMetadata.cs
  23. 63
      ErsatzTV.Infrastructure/Migrations/TvContextModelSnapshot.cs
  24. 19
      ErsatzTV.Infrastructure/Plex/PlexServerApiClient.cs

2
ErsatzTV.Application/MediaItems/Mapper.cs

@ -43,7 +43,7 @@ namespace ErsatzTV.Application.MediaItems
TelevisionEpisodeMediaItem e => e.Metadata != null TelevisionEpisodeMediaItem e => e.Metadata != null
? $"{e.Metadata.Title} - s{e.Metadata.Season:00}e{e.Metadata.Episode:00}" ? $"{e.Metadata.Title} - s{e.Metadata.Season:00}e{e.Metadata.Episode:00}"
: Path.GetFileName(e.Path), : Path.GetFileName(e.Path),
Movie m => m.Metadata?.Title ?? Path.GetFileName(m.Path), Movie m => m.MovieMetadata.HeadOrNone().Map(mm => mm.Title).IfNone(Path.GetFileName(m.Path)),
_ => string.Empty _ => string.Empty
}; };

12
ErsatzTV.Application/Movies/Mapper.cs

@ -4,7 +4,15 @@ namespace ErsatzTV.Application.Movies
{ {
internal static class Mapper internal static class Mapper
{ {
internal static MovieViewModel ProjectToViewModel(Movie movie) => internal static MovieViewModel ProjectToViewModel(Movie movie)
new(movie.Metadata.Title, movie.Metadata.Year?.ToString(), movie.Metadata.Plot, movie.Poster); {
string title = movie.MovieMetadata.HeadOrNone().Map(m => m.Title).IfNone(string.Empty);
string year = movie.MovieMetadata.HeadOrNone()
.Map(m => m.ReleaseDate?.Year.ToString())
.IfNone(string.Empty);
string plot = movie.MovieMetadata.HeadOrNone().Map(m => m.Plot).IfNone(string.Empty);
return new MovieViewModel(title, year, plot, movie.Poster);
}
} }
} }

2
ErsatzTV.Application/Playouts/Mapper.cs

@ -27,7 +27,7 @@ namespace ErsatzTV.Application.Playouts
TelevisionEpisodeMediaItem e => e.Metadata != null TelevisionEpisodeMediaItem e => e.Metadata != null
? $"{e.Metadata.Title} - s{e.Metadata.Season:00}e{e.Metadata.Episode:00}" ? $"{e.Metadata.Title} - s{e.Metadata.Season:00}e{e.Metadata.Episode:00}"
: Path.GetFileName(e.Path), : Path.GetFileName(e.Path),
Movie m => m.Metadata?.Title ?? Path.GetFileName(m.Path), Movie m => m.MovieMetadata.HeadOrNone().Map(mm => mm.Title).IfNone(Path.GetFileName(m.Path)),
_ => string.Empty _ => string.Empty
}; };

2
ErsatzTV.Core.Tests/Scheduling/PlayoutBuilderTests.cs

@ -611,7 +611,7 @@ namespace ErsatzTV.Core.Tests.Scheduling
new() new()
{ {
Id = id, Id = id,
Metadata = new MovieMetadata { Premiered = aired }, MovieMetadata = new List<NewMovieMetadata> { new() { ReleaseDate = aired } },
Statistics = new MediaItemStatistics { Duration = duration } Statistics = new MediaItemStatistics { Duration = duration }
}; };

4
ErsatzTV.Core/Domain/MediaItem/Movie.cs

@ -4,10 +4,6 @@ namespace ErsatzTV.Core.Domain
{ {
public class Movie : MediaItem public class Movie : MediaItem
{ {
// TODO: remove MetadataId
public int MetadataId { get; set; }
// TODO: remove Metadata
public MovieMetadata Metadata { get; set; }
public List<NewMovieMetadata> MovieMetadata { get; set; } public List<NewMovieMetadata> MovieMetadata { get; set; }
public List<MediaVersion> MediaVersions { get; set; } public List<MediaVersion> MediaVersions { get; set; }

3
ErsatzTV.Core/Domain/Metadata/MetadataKind.cs

@ -3,6 +3,7 @@
public enum MetadataKind public enum MetadataKind
{ {
Fallback = 0, Fallback = 0,
Sidecar = 1 Sidecar = 1,
External
} }
} }

17
ErsatzTV.Core/Domain/MovieMetadata.cs

@ -1,17 +0,0 @@
using System;
namespace ErsatzTV.Core.Domain
{
public class MovieMetadata : MediaItemMetadata
{
public int Id { get; set; }
public int MovieId { get; set; }
public Movie Movie { get; set; }
public int? Year { get; set; }
public DateTime? Premiered { get; set; }
public string Plot { get; set; }
public string Outline { get; set; }
public string Tagline { get; set; }
public string ContentRating { get; set; }
}
}

7
ErsatzTV.Core/Iptv/ChannelGuide.cs

@ -60,21 +60,22 @@ namespace ErsatzTV.Core.Iptv
string title = playoutItem.MediaItem switch string title = playoutItem.MediaItem switch
{ {
Movie m => m.Metadata?.Title ?? m.Path, Movie m => m.MovieMetadata.HeadOrNone().Match(mm => mm.Title, () => m.Path),
TelevisionEpisodeMediaItem e => e.Metadata?.Title ?? e.Path, TelevisionEpisodeMediaItem e => e.Metadata?.Title ?? e.Path,
_ => "[unknown]" _ => "[unknown]"
}; };
string description = playoutItem.MediaItem switch string description = playoutItem.MediaItem switch
{ {
Movie m => m.Metadata?.Plot, Movie m => m.MovieMetadata.HeadOrNone().Map(mm => mm.Plot).IfNone(string.Empty),
TelevisionEpisodeMediaItem e => e.Metadata?.Plot, TelevisionEpisodeMediaItem e => e.Metadata?.Plot,
_ => string.Empty _ => string.Empty
}; };
string contentRating = playoutItem.MediaItem switch string contentRating = playoutItem.MediaItem switch
{ {
Movie m => m.Metadata?.ContentRating, // TODO: re-implement content rating
// Movie m => m.MovieMetadata.HeadOrNone().Map(mm => mm.ContentRating).IfNone(string.Empty),
_ => string.Empty _ => string.Empty
}; };

10
ErsatzTV.Core/Metadata/FallbackMetadataProvider.cs

@ -36,10 +36,10 @@ namespace ErsatzTV.Core.Metadata
return metadata; return metadata;
} }
public static MovieMetadata GetFallbackMetadata(Movie mediaItem) public static NewMovieMetadata GetFallbackMetadata(Movie movie)
{ {
string fileName = Path.GetFileName(mediaItem.Path); string fileName = Path.GetFileName(movie.Path);
var metadata = new MovieMetadata { Source = MetadataSource.Fallback, Title = fileName ?? mediaItem.Path }; var metadata = new NewMovieMetadata { MetadataKind = MetadataKind.Fallback, Title = fileName ?? movie.Path };
if (fileName != null) if (fileName != null)
{ {
@ -76,7 +76,7 @@ namespace ErsatzTV.Core.Metadata
return metadata; return metadata;
} }
private static MovieMetadata GetMovieMetadata(string fileName, MovieMetadata metadata) private static NewMovieMetadata GetMovieMetadata(string fileName, NewMovieMetadata metadata)
{ {
try try
{ {
@ -85,7 +85,7 @@ namespace ErsatzTV.Core.Metadata
if (match.Success) if (match.Success)
{ {
metadata.Title = match.Groups[1].Value; metadata.Title = match.Groups[1].Value;
metadata.Year = int.Parse(match.Groups[2].Value); metadata.ReleaseDate = new DateTime(int.Parse(match.Groups[2].Value), 1, 1);
} }
} }
catch (Exception) catch (Exception)

34
ErsatzTV.Core/Metadata/LocalMetadataProvider.cs

@ -1,4 +1,5 @@
using System; using System;
using System.Collections.Generic;
using System.IO; using System.IO;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Xml.Serialization; using System.Xml.Serialization;
@ -94,21 +95,10 @@ namespace ErsatzTV.Core.Metadata
await _televisionRepository.Update(mediaItem); await _televisionRepository.Update(mediaItem);
} }
private async Task ApplyMetadataUpdate(Movie mediaItem, MovieMetadata metadata) private async Task ApplyMetadataUpdate(Movie movie, NewMovieMetadata metadata)
{ {
mediaItem.Metadata ??= new MovieMetadata(); movie.MovieMetadata = new List<NewMovieMetadata> { metadata };
mediaItem.Metadata.Source = metadata.Source; await _mediaItemRepository.Update(movie);
mediaItem.Metadata.LastWriteTime = metadata.LastWriteTime;
mediaItem.Metadata.Title = metadata.Title;
mediaItem.Metadata.SortTitle = GetSortTitle(metadata.Title);
mediaItem.Metadata.Year = metadata.Year;
mediaItem.Metadata.Premiered = metadata.Premiered;
mediaItem.Metadata.Plot = metadata.Plot;
mediaItem.Metadata.Outline = metadata.Outline;
mediaItem.Metadata.Tagline = metadata.Tagline;
mediaItem.Metadata.ContentRating = metadata.ContentRating;
await _mediaItemRepository.Update(mediaItem);
} }
private async Task ApplyMetadataUpdate(TelevisionShow televisionShow, TelevisionShowMetadata metadata) private async Task ApplyMetadataUpdate(TelevisionShow televisionShow, TelevisionShowMetadata metadata)
@ -124,7 +114,7 @@ namespace ErsatzTV.Core.Metadata
await _televisionRepository.Update(televisionShow); await _televisionRepository.Update(televisionShow);
} }
private async Task<Option<MovieMetadata>> LoadMetadata(Movie mediaItem, string nfoFileName) private async Task<Option<NewMovieMetadata>> LoadMetadata(Movie mediaItem, string nfoFileName)
{ {
if (nfoFileName == null || !File.Exists(nfoFileName)) if (nfoFileName == null || !File.Exists(nfoFileName))
{ {
@ -225,24 +215,22 @@ namespace ErsatzTV.Core.Metadata
} }
} }
private async Task<Option<MovieMetadata>> LoadMovieMetadata(Movie mediaItem, string nfoFileName) private async Task<Option<NewMovieMetadata>> LoadMovieMetadata(Movie mediaItem, string nfoFileName)
{ {
try try
{ {
await using FileStream fileStream = File.Open(nfoFileName, FileMode.Open, FileAccess.Read); await using FileStream fileStream = File.Open(nfoFileName, FileMode.Open, FileAccess.Read);
Option<MovieNfo> maybeNfo = MovieSerializer.Deserialize(fileStream) as MovieNfo; Option<MovieNfo> maybeNfo = MovieSerializer.Deserialize(fileStream) as MovieNfo;
return maybeNfo.Match<Option<MovieMetadata>>( return maybeNfo.Match<Option<NewMovieMetadata>>(
nfo => new MovieMetadata nfo => new NewMovieMetadata
{ {
Source = MetadataSource.Sidecar, MetadataKind = MetadataKind.Sidecar,
LastWriteTime = File.GetLastWriteTimeUtc(nfoFileName), DateUpdated = File.GetLastWriteTimeUtc(nfoFileName),
Title = nfo.Title, Title = nfo.Title,
Year = nfo.Year, ReleaseDate = nfo.Premiered,
Premiered = nfo.Premiered,
Plot = nfo.Plot, Plot = nfo.Plot,
Outline = nfo.Outline, Outline = nfo.Outline,
Tagline = nfo.Tagline, Tagline = nfo.Tagline,
ContentRating = nfo.ContentRating
}, },
None); None);
} }

11
ErsatzTV.Core/Metadata/MovieFolderScanner.cs

@ -96,9 +96,12 @@ namespace ErsatzTV.Core.Metadata
await LocateNfoFile(movie).Match( await LocateNfoFile(movie).Match(
async nfoFile => async nfoFile =>
{ {
if (movie.Metadata == null || movie.Metadata.Source == MetadataSource.Fallback || bool shouldUpdate = movie.MovieMetadata.HeadOrNone().Match(
(movie.Metadata.LastWriteTime ?? DateTime.MinValue) < m => m.MetadataKind == MetadataKind.Fallback ||
_localFileSystem.GetLastWriteTime(nfoFile)) m.DateUpdated < _localFileSystem.GetLastWriteTime(nfoFile),
true);
if (shouldUpdate)
{ {
_logger.LogDebug("Refreshing {Attribute} from {Path}", "Sidecar Metadata", nfoFile); _logger.LogDebug("Refreshing {Attribute} from {Path}", "Sidecar Metadata", nfoFile);
await _localMetadataProvider.RefreshSidecarMetadata(movie, nfoFile); await _localMetadataProvider.RefreshSidecarMetadata(movie, nfoFile);
@ -106,7 +109,7 @@ namespace ErsatzTV.Core.Metadata
}, },
async () => async () =>
{ {
if (movie.Metadata == null) if (!movie.MovieMetadata.Any())
{ {
_logger.LogDebug("Refreshing {Attribute} for {Path}", "Fallback Metadata", movie.Path); _logger.LogDebug("Refreshing {Attribute} for {Path}", "Fallback Metadata", movie.Path);
await _localMetadataProvider.RefreshFallbackMetadata(movie); await _localMetadataProvider.RefreshFallbackMetadata(movie);

8
ErsatzTV.Core/Scheduling/ChronologicalMediaCollectionEnumerator.cs

@ -43,14 +43,18 @@ namespace ErsatzTV.Core.Scheduling
DateTime date1 = x switch DateTime date1 = x switch
{ {
TelevisionEpisodeMediaItem e => e.Metadata?.Aired ?? DateTime.MaxValue, TelevisionEpisodeMediaItem e => e.Metadata?.Aired ?? DateTime.MaxValue,
Movie m => m.Metadata?.Premiered ?? DateTime.MaxValue, Movie m => m.MovieMetadata.HeadOrNone().Match(
mm => mm.ReleaseDate ?? DateTime.MaxValue,
() => DateTime.MaxValue),
_ => DateTime.MaxValue _ => DateTime.MaxValue
}; };
DateTime date2 = y switch DateTime date2 = y switch
{ {
TelevisionEpisodeMediaItem e => e.Metadata?.Aired ?? DateTime.MaxValue, TelevisionEpisodeMediaItem e => e.Metadata?.Aired ?? DateTime.MaxValue,
Movie m => m.Metadata?.Premiered ?? DateTime.MaxValue, Movie m => m.MovieMetadata.HeadOrNone().Match(
mm => mm.ReleaseDate ?? DateTime.MaxValue,
() => DateTime.MaxValue),
_ => DateTime.MaxValue _ => DateTime.MaxValue
}; };

4
ErsatzTV.Core/Scheduling/PlayoutBuilder.cs

@ -388,7 +388,9 @@ namespace ErsatzTV.Core.Scheduling
TelevisionEpisodeMediaItem e => e.Metadata != null TelevisionEpisodeMediaItem e => e.Metadata != null
? $"{e.Metadata.Title} - s{e.Metadata.Season:00}e{e.Metadata.Episode:00}" ? $"{e.Metadata.Title} - s{e.Metadata.Season:00}e{e.Metadata.Episode:00}"
: Path.GetFileName(e.Path), : Path.GetFileName(e.Path),
Movie m => m.Metadata?.Title ?? Path.GetFileName(m.Path), Movie m => m.MovieMetadata.HeadOrNone().Match(
mm => mm.Title,
() => Path.GetFileName(m.Path)),
_ => string.Empty _ => string.Empty
}; };

6
ErsatzTV.Infrastructure/Data/Configurations/MediaItem/MovieConfiguration.cs

@ -10,12 +10,6 @@ namespace ErsatzTV.Infrastructure.Data.Configurations
{ {
builder.ToTable("Movie"); builder.ToTable("Movie");
// TODO: remove this
builder.HasOne(i => i.Metadata)
.WithOne(m => m.Movie)
.HasForeignKey<MovieMetadata>(m => m.MovieId)
.OnDelete(DeleteBehavior.Cascade);
builder.HasMany(m => m.MovieMetadata) builder.HasMany(m => m.MovieMetadata)
.WithOne(m => m.Movie) .WithOne(m => m.Movie)
.HasForeignKey(m => m.MovieId) .HasForeignKey(m => m.MovieId)

12
ErsatzTV.Infrastructure/Data/Configurations/MovieMetadataConfiguration.cs

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

2
ErsatzTV.Infrastructure/Data/Repositories/ChannelRepository.cs

@ -42,7 +42,7 @@ namespace ErsatzTV.Infrastructure.Data.Repositories
.Include(c => c.Playouts) .Include(c => c.Playouts)
.ThenInclude(p => p.Items) .ThenInclude(p => p.Items)
.ThenInclude(i => i.MediaItem) .ThenInclude(i => i.MediaItem)
.ThenInclude(i => (i as Movie).Metadata) .ThenInclude(i => (i as Movie).MovieMetadata)
.ToListAsync(); .ToListAsync();
public async Task Update(Channel channel) public async Task Update(Channel channel)

2
ErsatzTV.Infrastructure/Data/Repositories/MediaCollectionRepository.cs

@ -56,7 +56,7 @@ namespace ErsatzTV.Infrastructure.Data.Repositories
.Include(s => s.Movies) .Include(s => s.Movies)
.ThenInclude(i => i.LibraryPath) .ThenInclude(i => i.LibraryPath)
.Include(s => s.Movies) .Include(s => s.Movies)
.ThenInclude(m => m.Metadata) .ThenInclude(m => m.MovieMetadata)
.Include(s => s.TelevisionShows) .Include(s => s.TelevisionShows)
.ThenInclude(s => s.Metadata) .ThenInclude(s => s.Metadata)
.Include(s => s.TelevisionSeasons) .Include(s => s.TelevisionSeasons)

9
ErsatzTV.Infrastructure/Data/Repositories/MediaItemRepository.cs

@ -36,10 +36,11 @@ namespace ErsatzTV.Infrastructure.Data.Repositories
IQueryable<Movie> movieData = IQueryable<Movie> movieData =
from c in _dbContext.Movies.Include(c => c.LibraryPath) select c; from c in _dbContext.Movies.Include(c => c.LibraryPath) select c;
if (!string.IsNullOrEmpty(searchString)) // TODO: fix this when we need to search
{ // if (!string.IsNullOrEmpty(searchString))
movieData = movieData.Where(c => EF.Functions.Like(c.Metadata.Title, $"%{searchString}%")); // {
} // movieData = movieData.Where(c => EF.Functions.Like(c.Metadata.Title, $"%{searchString}%"));
// }
return episodeData.OfType<MediaItem>().Concat(movieData.OfType<MediaItem>()).ToListAsync(); return episodeData.OfType<MediaItem>().Concat(movieData.OfType<MediaItem>()).ToListAsync();
} }

6
ErsatzTV.Infrastructure/Data/Repositories/MovieRepository.cs

@ -26,7 +26,7 @@ namespace ErsatzTV.Infrastructure.Data.Repositories
public Task<Option<Movie>> GetMovie(int movieId) => public Task<Option<Movie>> GetMovie(int movieId) =>
_dbContext.Movies _dbContext.Movies
.Include(m => m.Metadata) .Include(m => m.MovieMetadata)
.SingleOrDefaultAsync(m => m.Id == movieId) .SingleOrDefaultAsync(m => m.Id == movieId)
.Map(Optional); .Map(Optional);
@ -34,7 +34,7 @@ namespace ErsatzTV.Infrastructure.Data.Repositories
public async Task<Either<BaseError, Movie>> GetOrAdd(LibraryPath libraryPath, string path) public async Task<Either<BaseError, Movie>> GetOrAdd(LibraryPath libraryPath, string path)
{ {
Option<Movie> maybeExisting = await _dbContext.Movies Option<Movie> maybeExisting = await _dbContext.Movies
.Include(i => i.Metadata) .Include(i => i.MovieMetadata)
.Include(i => i.LibraryPath) .Include(i => i.LibraryPath)
.SingleOrDefaultAsync(i => i.Path == path); .SingleOrDefaultAsync(i => i.Path == path);
@ -48,7 +48,7 @@ namespace ErsatzTV.Infrastructure.Data.Repositories
PlexMovie item) PlexMovie item)
{ {
Option<PlexMovie> maybeExisting = await _dbContext.PlexMovieMediaItems Option<PlexMovie> maybeExisting = await _dbContext.PlexMovieMediaItems
.Include(i => i.Metadata) .Include(i => i.MovieMetadata)
.Include(i => i.Part) .Include(i => i.Part)
.SingleOrDefaultAsync(i => i.Key == item.Key); .SingleOrDefaultAsync(i => i.Key == item.Key);

2
ErsatzTV.Infrastructure/Data/Repositories/PlayoutRepository.cs

@ -58,7 +58,7 @@ namespace ErsatzTV.Infrastructure.Data.Repositories
public Task<List<PlayoutItem>> GetPlayoutItems(int playoutId) => public Task<List<PlayoutItem>> GetPlayoutItems(int playoutId) =>
_dbContext.PlayoutItems _dbContext.PlayoutItems
.Include(i => i.MediaItem) .Include(i => i.MediaItem)
.ThenInclude(m => (m as Movie).Metadata) .ThenInclude(m => (m as Movie).MovieMetadata)
.Include(i => i.MediaItem) .Include(i => i.MediaItem)
.ThenInclude(m => (m as TelevisionEpisodeMediaItem).Metadata) .ThenInclude(m => (m as TelevisionEpisodeMediaItem).Metadata)
.Filter(i => i.PlayoutId == playoutId) .Filter(i => i.PlayoutId == playoutId)

1811
ErsatzTV.Infrastructure/Migrations/20210226154155_Remove_OldMovieMetadata.Designer.cs generated

File diff suppressed because it is too large Load Diff

63
ErsatzTV.Infrastructure/Migrations/20210226154155_Remove_OldMovieMetadata.cs

@ -0,0 +1,63 @@
using System;
using Microsoft.EntityFrameworkCore.Migrations;
namespace ErsatzTV.Infrastructure.Migrations
{
public partial class Remove_OldMovieMetadata : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
"MovieMetadata");
migrationBuilder.DropColumn(
"MetadataId",
"Movie");
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddColumn<int>(
"MetadataId",
"Movie",
"INTEGER",
nullable: false,
defaultValue: 0);
migrationBuilder.CreateTable(
"MovieMetadata",
table => new
{
Id = table.Column<int>("INTEGER", nullable: false)
.Annotation("Sqlite:Autoincrement", true),
ContentRating = table.Column<string>("TEXT", nullable: true),
LastWriteTime = table.Column<DateTime>("TEXT", nullable: true),
MovieId = table.Column<int>("INTEGER", nullable: false),
Outline = table.Column<string>("TEXT", nullable: true),
Plot = table.Column<string>("TEXT", nullable: true),
Premiered = table.Column<DateTime>("TEXT", nullable: true),
SortTitle = table.Column<string>("TEXT", nullable: true),
Source = table.Column<int>("INTEGER", nullable: false),
Tagline = table.Column<string>("TEXT", nullable: true),
Title = table.Column<string>("TEXT", nullable: true),
Year = table.Column<int>("INTEGER", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_MovieMetadata", x => x.Id);
table.ForeignKey(
"FK_MovieMetadata_Movie_MovieId",
x => x.MovieId,
"Movie",
"Id",
onDelete: ReferentialAction.Cascade);
});
migrationBuilder.CreateIndex(
"IX_MovieMetadata_MovieId",
"MovieMetadata",
"MovieId",
unique: true);
}
}
}

63
ErsatzTV.Infrastructure/Migrations/TvContextModelSnapshot.cs

@ -385,53 +385,6 @@ namespace ErsatzTV.Infrastructure.Migrations
b.ToTable("MediaVersion"); b.ToTable("MediaVersion");
}); });
modelBuilder.Entity("ErsatzTV.Core.Domain.MovieMetadata", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER");
b.Property<string>("ContentRating")
.HasColumnType("TEXT");
b.Property<DateTime?>("LastWriteTime")
.HasColumnType("TEXT");
b.Property<int>("MovieId")
.HasColumnType("INTEGER");
b.Property<string>("Outline")
.HasColumnType("TEXT");
b.Property<string>("Plot")
.HasColumnType("TEXT");
b.Property<DateTime?>("Premiered")
.HasColumnType("TEXT");
b.Property<string>("SortTitle")
.HasColumnType("TEXT");
b.Property<int>("Source")
.HasColumnType("INTEGER");
b.Property<string>("Tagline")
.HasColumnType("TEXT");
b.Property<string>("Title")
.HasColumnType("TEXT");
b.Property<int?>("Year")
.HasColumnType("INTEGER");
b.HasKey("Id");
b.HasIndex("MovieId")
.IsUnique();
b.ToTable("MovieMetadata");
});
modelBuilder.Entity("ErsatzTV.Core.Domain.NewMovieMetadata", b => modelBuilder.Entity("ErsatzTV.Core.Domain.NewMovieMetadata", b =>
{ {
b.Property<int>("Id") b.Property<int>("Id")
@ -999,9 +952,6 @@ namespace ErsatzTV.Infrastructure.Migrations
{ {
b.HasBaseType("ErsatzTV.Core.Domain.MediaItem"); b.HasBaseType("ErsatzTV.Core.Domain.MediaItem");
b.Property<int>("MetadataId")
.HasColumnType("INTEGER");
b.ToTable("Movie"); b.ToTable("Movie");
}); });
@ -1280,17 +1230,6 @@ namespace ErsatzTV.Infrastructure.Migrations
.OnDelete(DeleteBehavior.Cascade); .OnDelete(DeleteBehavior.Cascade);
}); });
modelBuilder.Entity("ErsatzTV.Core.Domain.MovieMetadata", b =>
{
b.HasOne("ErsatzTV.Core.Domain.Movie", "Movie")
.WithOne("Metadata")
.HasForeignKey("ErsatzTV.Core.Domain.MovieMetadata", "MovieId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Movie");
});
modelBuilder.Entity("ErsatzTV.Core.Domain.NewMovieMetadata", b => modelBuilder.Entity("ErsatzTV.Core.Domain.NewMovieMetadata", b =>
{ {
b.HasOne("ErsatzTV.Core.Domain.Movie", "Movie") b.HasOne("ErsatzTV.Core.Domain.Movie", "Movie")
@ -1840,8 +1779,6 @@ namespace ErsatzTV.Infrastructure.Migrations
{ {
b.Navigation("MediaVersions"); b.Navigation("MediaVersions");
b.Navigation("Metadata");
b.Navigation("MovieMetadata"); b.Navigation("MovieMetadata");
}); });

19
ErsatzTV.Infrastructure/Plex/PlexServerApiClient.cs

@ -123,20 +123,23 @@ namespace ErsatzTV.Infrastructure.Plex
PlexPartResponse part = media.Part.Head(); PlexPartResponse part = media.Part.Head();
DateTime lastWriteTime = DateTimeOffset.FromUnixTimeSeconds(response.UpdatedAt).DateTime; DateTime lastWriteTime = DateTimeOffset.FromUnixTimeSeconds(response.UpdatedAt).DateTime;
var metadata = new NewMovieMetadata
{
Title = response.Title,
Plot = response.Summary,
ReleaseDate = new DateTime(response.Year, 1, 1), // TODO: actual release date?
Tagline = response.Tagline,
DateAdded = DateTime.UtcNow, // TODO: actual date added?
DateUpdated = lastWriteTime
};
var movie = new PlexMovie var movie = new PlexMovie
{ {
Key = response.Key, Key = response.Key,
Poster = response.Thumb, Poster = response.Thumb,
LastWriteTime = lastWriteTime, LastWriteTime = lastWriteTime,
PosterLastWriteTime = lastWriteTime, PosterLastWriteTime = lastWriteTime,
Metadata = new MovieMetadata MovieMetadata = new List<NewMovieMetadata> { metadata },
{
Title = response.Title,
Plot = response.Summary,
Year = response.Year,
Tagline = response.Tagline,
LastWriteTime = lastWriteTime
},
Statistics = new MediaItemStatistics Statistics = new MediaItemStatistics
{ {
Duration = TimeSpan.FromMilliseconds(media.Duration), Duration = TimeSpan.FromMilliseconds(media.Duration),

Loading…
Cancel
Save