Exemple #1
0
        public async Task <Either <BaseError, Unit> > ScanLibrary(
            PlexConnection connection,
            PlexServerAuthToken token,
            PlexLibrary plexMediaSourceLibrary)
        {
            Either <BaseError, List <PlexShow> > entries = await _plexServerApiClient.GetShowLibraryContents(
                plexMediaSourceLibrary,
                connection,
                token);

            return(await entries.Match <Task <Either <BaseError, Unit> > >(
                       async showEntries =>
            {
                foreach (PlexShow incoming in showEntries)
                {
                    // TODO: figure out how to rebuild playlists
                    Either <BaseError, MediaItemScanResult <PlexShow> > maybeShow = await _televisionRepository
                                                                                    .GetOrAddPlexShow(plexMediaSourceLibrary, incoming)
                                                                                    .BindT(existing => UpdateMetadata(existing, incoming))
                                                                                    .BindT(existing => UpdateArtwork(existing, incoming));

                    await maybeShow.Match(
                        async result =>
                    {
                        if (result.IsAdded)
                        {
                            await _searchIndex.AddItems(new List <MediaItem> {
                                result.Item
                            });
                        }
                        else if (result.IsUpdated)
                        {
                            await _searchIndex.UpdateItems(new List <MediaItem> {
                                result.Item
                            });
                        }

                        await ScanSeasons(plexMediaSourceLibrary, result.Item, connection, token);
                    },
                        error =>
                    {
                        _logger.LogWarning(
                            "Error processing plex show at {Key}: {Error}",
                            incoming.Key,
                            error.Value);
                        return Task.CompletedTask;
                    });
                }

                var showKeys = showEntries.Map(s => s.Key).ToList();
                List <int> ids =
                    await _televisionRepository.RemoveMissingPlexShows(plexMediaSourceLibrary, showKeys);
                await _searchIndex.RemoveItems(ids);

                return Unit.Default;
            },
                       error =>
            {
                _logger.LogWarning(
                    "Error synchronizing plex library {Path}: {Error}",
                    plexMediaSourceLibrary.Name,
                    error.Value);

                return Left <BaseError, Unit>(error).AsTask();
            }));
        }