private async Task <Either <BaseError, Unit> > ScanSeasons( PlexLibrary plexMediaSourceLibrary, PlexShow show, PlexConnection connection, PlexServerAuthToken token) { Either <BaseError, List <PlexSeason> > entries = await _plexServerApiClient.GetShowSeasons( plexMediaSourceLibrary, show, connection, token); return(await entries.Match <Task <Either <BaseError, Unit> > >( async seasonEntries => { foreach (PlexSeason incoming in seasonEntries) { incoming.ShowId = show.Id; // TODO: figure out how to rebuild playlists Either <BaseError, PlexSeason> maybeSeason = await _televisionRepository .GetOrAddPlexSeason(plexMediaSourceLibrary, incoming) .BindT(existing => UpdateArtwork(existing, incoming)); await maybeSeason.Match( async season => await ScanEpisodes(plexMediaSourceLibrary, season, connection, token), error => { _logger.LogWarning( "Error processing plex show at {Key}: {Error}", incoming.Key, error.Value); return Task.CompletedTask; }); } var seasonKeys = seasonEntries.Map(s => s.Key).ToList(); await _televisionRepository.RemoveMissingPlexSeasons(show.Key, seasonKeys); return Unit.Default; }, error => { _logger.LogWarning( "Error synchronizing plex library {Path}: {Error}", plexMediaSourceLibrary.Name, error.Value); return Left <BaseError, Unit>(error).AsTask(); })); }
private async Task <Either <BaseError, Unit> > ScanSeasons( PlexLibrary library, List <PlexPathReplacement> pathReplacements, PlexShow show, PlexConnection connection, PlexServerAuthToken token, string ffmpegPath, string ffprobePath, bool deepScan, CancellationToken cancellationToken) { List <PlexItemEtag> existingSeasons = await _plexTelevisionRepository.GetExistingPlexSeasons(library, show); Either <BaseError, List <PlexSeason> > entries = await _plexServerApiClient.GetShowSeasons( library, show, connection, token); foreach (BaseError error in entries.LeftToSeq()) { return(error); } var seasonEntries = entries.RightToSeq().Flatten().ToList(); foreach (PlexSeason incoming in seasonEntries) { incoming.ShowId = show.Id; // TODO: figure out how to rebuild playlists Either <BaseError, PlexSeason> maybeSeason = await _televisionRepository .GetOrAddPlexSeason(library, incoming) .BindT(existing => UpdateMetadataAndArtwork(existing, incoming, deepScan)); foreach (BaseError error in maybeSeason.LeftToSeq()) { _logger.LogWarning( "Error processing plex season at {Key}: {Error}", incoming.Key, error.Value); return(error); } foreach (PlexSeason season in maybeSeason.RightToSeq()) { Either <BaseError, Unit> scanResult = await ScanEpisodes( library, pathReplacements, season, connection, token, ffmpegPath, ffprobePath, deepScan, cancellationToken); foreach (ScanCanceled error in scanResult.LeftToSeq().OfType <ScanCanceled>()) { return(error); } await _plexTelevisionRepository.SetPlexEtag(season, incoming.Etag); season.Show = show; // TODO: if any seasons are unavailable or not found, flag show as unavailable/not found await _searchIndex.AddItems(_searchRepository, new List <MediaItem> { season }); } } var fileNotFoundKeys = existingSeasons.Map(m => m.Key).Except(seasonEntries.Map(m => m.Key)).ToList(); List <int> ids = await _plexTelevisionRepository.FlagFileNotFoundSeasons(library, fileNotFoundKeys); await _searchIndex.RebuildItems(_searchRepository, ids); return(Unit.Default); }