* starting database redesign * set season and episode numbers * use datetimes in db (utc); update movie metadata * get movie cards from new table * copy show/episode metadata * remove old movie metadata type * rename new movie metadata type * code cleanup * start to remove old television classes * remove old television tables from database * fix playout building * fix collection views * fix show/season views * clean up movie metadata table * fix scanner tests * add libraries ui * code cleanup * fix movie scanning/metadata * add library scan button to ui * delete library path from ui * temp disable movie scanning * remove orphan media items and prevent duplicate paths * attach artwork to metadata * fix split show/season display * fix television artwork * store year distinct from release date * fix collections ui * code cleanup * add library paths from ui * fix adding to collections from ui * fix schedule items loading * schedule editing works again * remove some todos * more cleanup * fix unit tests * fix episode sorting * fix deleting show library paths * remove unused class * fix playout list in ui * fix log viewer * start to use version/file instead of statistics * clean up old columns * fix playout display (time zone) * fix playback * fix channel guide time zone * cascade more deletes * fix compiler warnings * fix adding new seasons * use artwork for channel logo * clean cache folder on startup (move channel logos, delete everything else) * log database migration * update homepage docs for libraries * fix adding new channel with logo * fix episode numbers in epg
78 lines
2.9 KiB
C#
78 lines
2.9 KiB
C#
using System.Collections.Generic;
|
|
using System.Threading.Tasks;
|
|
using ErsatzTV.Core.Domain;
|
|
using ErsatzTV.Core.Interfaces.Plex;
|
|
using ErsatzTV.Core.Interfaces.Repositories;
|
|
using LanguageExt;
|
|
using Microsoft.Extensions.Logging;
|
|
using static LanguageExt.Prelude;
|
|
|
|
namespace ErsatzTV.Core.Plex
|
|
{
|
|
public class PlexMovieLibraryScanner : IPlexMovieLibraryScanner
|
|
{
|
|
private readonly ILogger<PlexMovieLibraryScanner> _logger;
|
|
private readonly IMovieRepository _movieRepository;
|
|
private readonly IPlexServerApiClient _plexServerApiClient;
|
|
|
|
public PlexMovieLibraryScanner(
|
|
IPlexServerApiClient plexServerApiClient,
|
|
IMovieRepository movieRepository,
|
|
ILogger<PlexMovieLibraryScanner> logger)
|
|
{
|
|
_plexServerApiClient = plexServerApiClient;
|
|
_movieRepository = movieRepository;
|
|
_logger = logger;
|
|
}
|
|
|
|
public async Task<Either<BaseError, Unit>> ScanLibrary(
|
|
PlexConnection connection,
|
|
PlexServerAuthToken token,
|
|
PlexLibrary plexMediaSourceLibrary)
|
|
{
|
|
Either<BaseError, List<PlexMovie>> entries = await _plexServerApiClient.GetLibraryContents(
|
|
plexMediaSourceLibrary,
|
|
connection,
|
|
token);
|
|
|
|
await entries.Match(
|
|
async movieEntries =>
|
|
{
|
|
foreach (PlexMovie entry 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);
|
|
|
|
maybeMovie.IfLeft(
|
|
error => _logger.LogWarning(
|
|
"Error processing plex movie at {Key}: {Error}",
|
|
entry.Key,
|
|
error.Value));
|
|
}
|
|
},
|
|
error =>
|
|
{
|
|
_logger.LogWarning(
|
|
"Error synchronizing plex library {Path}: {Error}",
|
|
plexMediaSourceLibrary.Name,
|
|
error.Value);
|
|
|
|
return Task.CompletedTask;
|
|
});
|
|
|
|
// need plex media item model that can be used to lookup by unique id (metadata key?)
|
|
|
|
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();
|
|
}
|
|
}
|