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)); }
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"); } } }
private Task <Validation <BaseError, PlexMediaSource> > MediaSourceMustExist(SynchronizePlexLibraries request) => _mediaSourceRepository.GetPlex(request.PlexMediaSourceId) .Map(o => o.ToValidation <BaseError>("Plex media source does not exist."));
private Task <Validation <BaseError, ConnectionParameters> > Validate(SynchronizePlexLibraries request) => MediaSourceMustExist(request) .BindT(MediaSourceMustHaveActiveConnection) .BindT(MediaSourceMustHaveToken);
public Task <Either <BaseError, Unit> > Handle( SynchronizePlexLibraries request, CancellationToken cancellationToken) => Validate(request) .MapT(SynchronizeLibraries) .Bind(v => v.ToEitherAsync());