예제 #1
0
    private async Task SynchronizeLibraries(SynchronizePlexLibraries request, CancellationToken cancellationToken)
    {
        using IServiceScope scope = _serviceScopeFactory.CreateScope();
        IMediator mediator = scope.ServiceProvider.GetRequiredService <IMediator>();

        Either <BaseError, Unit> result = await mediator.Send(request, cancellationToken);

        result.BiIter(
            _ => _logger.LogInformation(
                "Successfully synchronized plex libraries for source {MediaSourceId}",
                request.PlexMediaSourceId),
            error => _logger.LogWarning(
                "Unable to synchronize plex libraries for source {MediaSourceId}: {Error}",
                request.PlexMediaSourceId,
                error.Value));
    }
예제 #2
0
        protected override async Task ExecuteAsync(CancellationToken cancellationToken)
        {
            if (!File.Exists(FileSystemLayout.PlexSecretsPath))
            {
                await File.WriteAllTextAsync(FileSystemLayout.PlexSecretsPath, "{}", cancellationToken);
            }

            _logger.LogInformation(
                "Plex service started; secrets are at {PlexSecretsPath}",
                FileSystemLayout.PlexSecretsPath);

            // synchronize sources on startup
            await SynchronizeSources(new SynchronizePlexMediaSources(), cancellationToken);

            await foreach (IPlexBackgroundServiceRequest request in _channel.ReadAllAsync(cancellationToken))
            {
                try
                {
                    Task requestTask = request switch
                    {
                        TryCompletePlexPinFlow pinRequest => CompletePinFlow(pinRequest, cancellationToken),
                        SynchronizePlexMediaSources sourcesRequest => SynchronizeSources(
                            sourcesRequest,
                            cancellationToken),
                        SynchronizePlexLibraries synchronizePlexLibrariesRequest => SynchronizeLibraries(
                            synchronizePlexLibrariesRequest,
                            cancellationToken),
                        _ => throw new NotSupportedException($"Unsupported request type: {request.GetType().Name}")
                    };

                    await requestTask;
                }
                catch (Exception ex)
                {
                    _logger.LogWarning(ex, "Failed to process plex background service request");
                }
            }
        }
예제 #3
0
 private Task <Validation <BaseError, PlexMediaSource> > MediaSourceMustExist(SynchronizePlexLibraries request) =>
 _mediaSourceRepository.GetPlex(request.PlexMediaSourceId)
 .Map(o => o.ToValidation <BaseError>("Plex media source does not exist."));
예제 #4
0
 private Task <Validation <BaseError, ConnectionParameters> > Validate(SynchronizePlexLibraries request) =>
 MediaSourceMustExist(request)
 .BindT(MediaSourceMustHaveActiveConnection)
 .BindT(MediaSourceMustHaveToken);
예제 #5
0
 public Task <Either <BaseError, Unit> > Handle(
     SynchronizePlexLibraries request,
     CancellationToken cancellationToken) =>
 Validate(request)
 .MapT(SynchronizeLibraries)
 .Bind(v => v.ToEitherAsync());