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 @@ -43,7 +43,7 @@ namespace ErsatzTV.Application.MediaItems
TelevisionEpisodeMediaItem e => e.Metadata != null
? $"{e.Metadata.Title} - s{e.Metadata.Season:00}e{e.Metadata.Episode:00}"
: 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
};

12
ErsatzTV.Application/Movies/Mapper.cs

@ -4,7 +4,15 @@ namespace ErsatzTV.Application.Movies @@ -4,7 +4,15 @@ namespace ErsatzTV.Application.Movies
{
internal static class Mapper
{
internal static MovieViewModel ProjectToViewModel(Movie movie) =>
new(movie.Metadata.Title, movie.Metadata.Year?.ToString(), movie.Metadata.Plot, movie.Poster);
internal static MovieViewModel ProjectToViewModel(Movie movie)
{
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 @@ -27,7 +27,7 @@ namespace ErsatzTV.Application.Playouts
TelevisionEpisodeMediaItem e => e.Metadata != null
? $"{e.Metadata.Title} - s{e.Metadata.Season:00}e{e.Metadata.Episode:00}"
: 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
};

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

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

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

@ -4,10 +4,6 @@ namespace ErsatzTV.Core.Domain @@ -4,10 +4,6 @@ namespace ErsatzTV.Core.Domain
{
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<MediaVersion> MediaVersions { get; set; }

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

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

17
ErsatzTV.Core/Domain/MovieMetadata.cs

@ -1,17 +0,0 @@ @@ -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 @@ -60,21 +60,22 @@ namespace ErsatzTV.Core.Iptv
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,
_ => "[unknown]"
};
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,
_ => string.Empty
};
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
};

10
ErsatzTV.Core/Metadata/FallbackMetadataProvider.cs

@ -36,10 +36,10 @@ namespace ErsatzTV.Core.Metadata @@ -36,10 +36,10 @@ namespace ErsatzTV.Core.Metadata
return metadata;
}
public static MovieMetadata GetFallbackMetadata(Movie mediaItem)
public static NewMovieMetadata GetFallbackMetadata(Movie movie)
{
string fileName = Path.GetFileName(mediaItem.Path);
var metadata = new MovieMetadata { Source = MetadataSource.Fallback, Title = fileName ?? mediaItem.Path };
string fileName = Path.GetFileName(movie.Path);
var metadata = new NewMovieMetadata { MetadataKind = MetadataKind.Fallback, Title = fileName ?? movie.Path };
if (fileName != null)
{
@ -76,7 +76,7 @@ namespace ErsatzTV.Core.Metadata @@ -76,7 +76,7 @@ namespace ErsatzTV.Core.Metadata
return metadata;
}
private static MovieMetadata GetMovieMetadata(string fileName, MovieMetadata metadata)
private static NewMovieMetadata GetMovieMetadata(string fileName, NewMovieMetadata metadata)
{
try
{
@ -85,7 +85,7 @@ namespace ErsatzTV.Core.Metadata @@ -85,7 +85,7 @@ namespace ErsatzTV.Core.Metadata
if (match.Success)
{
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)

34
ErsatzTV.Core/Metadata/LocalMetadataProvider.cs

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

11
ErsatzTV.Core/Metadata/MovieFolderScanner.cs

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

8
ErsatzTV.Core/Scheduling/ChronologicalMediaCollectionEnumerator.cs

@ -43,14 +43,18 @@ namespace ErsatzTV.Core.Scheduling @@ -43,14 +43,18 @@ namespace ErsatzTV.Core.Scheduling
DateTime date1 = x switch
{
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 date2 = y switch
{
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
};

4
ErsatzTV.Core/Scheduling/PlayoutBuilder.cs

@ -388,7 +388,9 @@ namespace ErsatzTV.Core.Scheduling @@ -388,7 +388,9 @@ namespace ErsatzTV.Core.Scheduling
TelevisionEpisodeMediaItem e => e.Metadata != null
? $"{e.Metadata.Title} - s{e.Metadata.Season:00}e{e.Metadata.Episode:00}"
: 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
};

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

@ -10,12 +10,6 @@ namespace ErsatzTV.Infrastructure.Data.Configurations @@ -10,12 +10,6 @@ namespace ErsatzTV.Infrastructure.Data.Configurations
{
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)
.WithOne(m => m.Movie)
.HasForeignKey(m => m.MovieId)

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

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

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

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

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

@ -36,10 +36,11 @@ namespace ErsatzTV.Infrastructure.Data.Repositories @@ -36,10 +36,11 @@ namespace ErsatzTV.Infrastructure.Data.Repositories
IQueryable<Movie> movieData =
from c in _dbContext.Movies.Include(c => c.LibraryPath) select c;
if (!string.IsNullOrEmpty(searchString))
{
movieData = movieData.Where(c => EF.Functions.Like(c.Metadata.Title, $"%{searchString}%"));
}
// TODO: fix this when we need to search
// if (!string.IsNullOrEmpty(searchString))
// {
// movieData = movieData.Where(c => EF.Functions.Like(c.Metadata.Title, $"%{searchString}%"));
// }
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 @@ -26,7 +26,7 @@ namespace ErsatzTV.Infrastructure.Data.Repositories
public Task<Option<Movie>> GetMovie(int movieId) =>
_dbContext.Movies
.Include(m => m.Metadata)
.Include(m => m.MovieMetadata)
.SingleOrDefaultAsync(m => m.Id == movieId)
.Map(Optional);
@ -34,7 +34,7 @@ namespace ErsatzTV.Infrastructure.Data.Repositories @@ -34,7 +34,7 @@ namespace ErsatzTV.Infrastructure.Data.Repositories
public async Task<Either<BaseError, Movie>> GetOrAdd(LibraryPath libraryPath, string path)
{
Option<Movie> maybeExisting = await _dbContext.Movies
.Include(i => i.Metadata)
.Include(i => i.MovieMetadata)
.Include(i => i.LibraryPath)
.SingleOrDefaultAsync(i => i.Path == path);
@ -48,7 +48,7 @@ namespace ErsatzTV.Infrastructure.Data.Repositories @@ -48,7 +48,7 @@ namespace ErsatzTV.Infrastructure.Data.Repositories
PlexMovie item)
{
Option<PlexMovie> maybeExisting = await _dbContext.PlexMovieMediaItems
.Include(i => i.Metadata)
.Include(i => i.MovieMetadata)
.Include(i => i.Part)
.SingleOrDefaultAsync(i => i.Key == item.Key);

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

@ -58,7 +58,7 @@ namespace ErsatzTV.Infrastructure.Data.Repositories @@ -58,7 +58,7 @@ namespace ErsatzTV.Infrastructure.Data.Repositories
public Task<List<PlayoutItem>> GetPlayoutItems(int playoutId) =>
_dbContext.PlayoutItems
.Include(i => i.MediaItem)
.ThenInclude(m => (m as Movie).Metadata)
.ThenInclude(m => (m as Movie).MovieMetadata)
.Include(i => i.MediaItem)
.ThenInclude(m => (m as TelevisionEpisodeMediaItem).Metadata)
.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 @@ @@ -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 @@ -385,53 +385,6 @@ namespace ErsatzTV.Infrastructure.Migrations
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 =>
{
b.Property<int>("Id")
@ -999,9 +952,6 @@ namespace ErsatzTV.Infrastructure.Migrations @@ -999,9 +952,6 @@ namespace ErsatzTV.Infrastructure.Migrations
{
b.HasBaseType("ErsatzTV.Core.Domain.MediaItem");
b.Property<int>("MetadataId")
.HasColumnType("INTEGER");
b.ToTable("Movie");
});
@ -1280,17 +1230,6 @@ namespace ErsatzTV.Infrastructure.Migrations @@ -1280,17 +1230,6 @@ namespace ErsatzTV.Infrastructure.Migrations
.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 =>
{
b.HasOne("ErsatzTV.Core.Domain.Movie", "Movie")
@ -1840,8 +1779,6 @@ namespace ErsatzTV.Infrastructure.Migrations @@ -1840,8 +1779,6 @@ namespace ErsatzTV.Infrastructure.Migrations
{
b.Navigation("MediaVersions");
b.Navigation("Metadata");
b.Navigation("MovieMetadata");
});

19
ErsatzTV.Infrastructure/Plex/PlexServerApiClient.cs

@ -123,20 +123,23 @@ namespace ErsatzTV.Infrastructure.Plex @@ -123,20 +123,23 @@ namespace ErsatzTV.Infrastructure.Plex
PlexPartResponse part = media.Part.Head();
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
{
Key = response.Key,
Poster = response.Thumb,
LastWriteTime = lastWriteTime,
PosterLastWriteTime = lastWriteTime,
Metadata = new MovieMetadata
{
Title = response.Title,
Plot = response.Summary,
Year = response.Year,
Tagline = response.Tagline,
LastWriteTime = lastWriteTime
},
MovieMetadata = new List<NewMovieMetadata> { metadata },
Statistics = new MediaItemStatistics
{
Duration = TimeSpan.FromMilliseconds(media.Duration),

Loading…
Cancel
Save