Browse Source

synchronize genre from plex

pull/72/head
Jason Dove 5 years ago
parent
commit
d036156eb4
  1. 56
      ErsatzTV.Core/Plex/PlexMovieLibraryScanner.cs
  2. 1
      ErsatzTV.Infrastructure/Data/Repositories/MovieRepository.cs
  3. 9
      ErsatzTV.Infrastructure/Plex/Models/PlexGenreResponse.cs
  4. 1
      ErsatzTV.Infrastructure/Plex/Models/PlexMetadataResponse.cs
  5. 3
      ErsatzTV.Infrastructure/Plex/PlexServerApiClient.cs

56
ErsatzTV.Core/Plex/PlexMovieLibraryScanner.cs

@ -1,4 +1,5 @@ @@ -1,4 +1,5 @@
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using ErsatzTV.Core.Domain;
using ErsatzTV.Core.Interfaces.Plex;
@ -38,19 +39,26 @@ namespace ErsatzTV.Core.Plex @@ -38,19 +39,26 @@ namespace ErsatzTV.Core.Plex
await entries.Match(
async movieEntries =>
{
foreach (PlexMovie entry in movieEntries)
foreach (PlexMovie incoming in movieEntries)
{
// TODO: optimize dbcontext use here, do we need tracking? can we make partial updates with dapper?
// TODO: figure out how to rebuild playlists
Either<BaseError, PlexMovie> maybeMovie = await _movieRepository
.GetOrAdd(plexMediaSourceLibrary, entry)
.BindT(UpdateIfNeeded);
.GetOrAdd(plexMediaSourceLibrary, incoming)
.BindT(existing => UpdateStatistics(existing, incoming))
.BindT(existing => UpdateMetadata(existing, incoming))
.BindT(existing => UpdateArtwork(existing, incoming));
maybeMovie.IfLeft(
error => _logger.LogWarning(
"Error processing plex movie at {Key}: {Error}",
entry.Key,
error.Value));
await maybeMovie.Match(
async movie => await _movieRepository.Update(movie),
error =>
{
_logger.LogWarning(
"Error processing plex movie at {Key}: {Error}",
incoming.Key,
error.Value);
return Task.CompletedTask;
});
}
},
error =>
@ -68,10 +76,32 @@ namespace ErsatzTV.Core.Plex @@ -68,10 +76,32 @@ namespace ErsatzTV.Core.Plex
return Unit.Default;
}
private Task<Either<BaseError, PlexMovie>> UpdateIfNeeded(PlexMovie plexMovie) =>
// .BindT(movie => UpdateStatistics(movie, ffprobePath).MapT(_ => movie))
// .BindT(UpdateMetadata)
// .BindT(UpdatePoster);
Right<BaseError, PlexMovie>(plexMovie).AsTask();
private Task<Either<BaseError, PlexMovie>> UpdateStatistics(PlexMovie existing, PlexMovie incoming) =>
Right<BaseError, PlexMovie>(existing).AsTask();
private Task<Either<BaseError, PlexMovie>> UpdateMetadata(PlexMovie existing, PlexMovie incoming)
{
MovieMetadata existingMetadata = existing.MovieMetadata.Head();
MovieMetadata incomingMetadata = incoming.MovieMetadata.Head();
foreach (Genre genre in existingMetadata.Genres
.Filter(g => incomingMetadata.Genres.All(g2 => g2.Name != g.Name))
.ToList())
{
existingMetadata.Genres.Remove(genre);
}
foreach (Genre genre in incomingMetadata.Genres
.Filter(g => existingMetadata.Genres.All(g2 => g2.Name != g.Name))
.ToList())
{
existingMetadata.Genres.Add(genre);
}
return Right<BaseError, PlexMovie>(existing).AsTask();
}
private Task<Either<BaseError, PlexMovie>> UpdateArtwork(PlexMovie existing, PlexMovie incoming) =>
Right<BaseError, PlexMovie>(existing).AsTask();
}
}

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

@ -76,6 +76,7 @@ namespace ErsatzTV.Infrastructure.Data.Repositories @@ -76,6 +76,7 @@ namespace ErsatzTV.Infrastructure.Data.Repositories
Option<PlexMovie> maybeExisting = await context.PlexMovies
.AsNoTracking()
.Include(i => i.MovieMetadata)
.ThenInclude(mm => mm.Genres)
.Include(i => i.MediaVersions)
.ThenInclude(mv => mv.MediaFiles)
.OrderBy(i => i.Key)

9
ErsatzTV.Infrastructure/Plex/Models/PlexGenreResponse.cs

@ -0,0 +1,9 @@ @@ -0,0 +1,9 @@
namespace ErsatzTV.Infrastructure.Plex.Models
{
public class PlexGenreResponse
{
public int Id { get; set; }
public string Filter { get; set; }
public string Tag { get; set; }
}
}

1
ErsatzTV.Infrastructure/Plex/Models/PlexMetadataResponse.cs

@ -15,5 +15,6 @@ namespace ErsatzTV.Infrastructure.Plex.Models @@ -15,5 +15,6 @@ namespace ErsatzTV.Infrastructure.Plex.Models
public int AddedAt { get; set; }
public int UpdatedAt { get; set; }
public List<PlexMediaResponse> Media { get; set; }
public List<PlexGenreResponse> Genre { get; set; }
}
}

3
ErsatzTV.Infrastructure/Plex/PlexServerApiClient.cs

@ -99,7 +99,8 @@ namespace ErsatzTV.Infrastructure.Plex @@ -99,7 +99,8 @@ namespace ErsatzTV.Infrastructure.Plex
Year = response.Year,
Tagline = response.Tagline,
DateAdded = dateAdded,
DateUpdated = lastWriteTime
DateUpdated = lastWriteTime,
Genres = response.Genre.Map(g => new Genre { Name = g.Tag }).ToList()
};
if (!string.IsNullOrWhiteSpace(response.Thumb))

Loading…
Cancel
Save