diff --git a/src/Backends/Plex/Action/Backup.php b/src/Backends/Plex/Action/Backup.php index 295853f2..58bc6a6c 100644 --- a/src/Backends/Plex/Action/Backup.php +++ b/src/Backends/Plex/Action/Backup.php @@ -8,9 +8,9 @@ use App\Backends\Common\Context; use App\Backends\Common\GuidInterface as iGuid; use App\Backends\Plex\PlexClient; use App\Libs\Entity\StateInterface as iState; +use App\Libs\Exceptions\Backends\InvalidArgumentException; use App\Libs\Mappers\ImportInterface as iImport; use App\Libs\Options; -use InvalidArgumentException; use Psr\Http\Message\StreamInterface; use Throwable; diff --git a/src/Backends/Plex/Action/Export.php b/src/Backends/Plex/Action/Export.php index d960a9d8..4a237a92 100644 --- a/src/Backends/Plex/Action/Export.php +++ b/src/Backends/Plex/Action/Export.php @@ -8,12 +8,12 @@ use App\Backends\Common\Context; use App\Backends\Common\GuidInterface as iGuid; use App\Backends\Plex\PlexClient; use App\Libs\Container; +use App\Libs\Exceptions\Backends\InvalidArgumentException; use App\Libs\Mappers\ImportInterface as iImport; use App\Libs\Message; use App\Libs\Options; use App\Libs\QueueRequests; use DateTimeInterface; -use InvalidArgumentException; use Throwable; final class Export extends Import diff --git a/src/Backends/Plex/Action/GetIdentifier.php b/src/Backends/Plex/Action/GetIdentifier.php index 629645bc..c70657f0 100644 --- a/src/Backends/Plex/Action/GetIdentifier.php +++ b/src/Backends/Plex/Action/GetIdentifier.php @@ -15,7 +15,7 @@ final class GetIdentifier { use CommonTrait; - private string $action = 'unique identifier'; + private string $action = 'plex.getIdentifier'; public function __construct( protected HttpClientInterface $http, diff --git a/src/Backends/Plex/Action/GetInfo.php b/src/Backends/Plex/Action/GetInfo.php index db53a6a1..1cd3031f 100644 --- a/src/Backends/Plex/Action/GetInfo.php +++ b/src/Backends/Plex/Action/GetInfo.php @@ -18,7 +18,7 @@ final class GetInfo { use CommonTrait; - private string $action = 'get info'; + private string $action = 'plex.getInfo'; public function __construct( protected HttpClientInterface $http, diff --git a/src/Backends/Plex/Action/GetLibrariesList.php b/src/Backends/Plex/Action/GetLibrariesList.php index 5223570d..0f97a651 100644 --- a/src/Backends/Plex/Action/GetLibrariesList.php +++ b/src/Backends/Plex/Action/GetLibrariesList.php @@ -20,6 +20,8 @@ final class GetLibrariesList { use CommonTrait; + private string $action = 'plex.getLibrariesList'; + public function __construct(protected HttpClientInterface $http, protected LoggerInterface $logger) { } @@ -34,7 +36,7 @@ final class GetLibrariesList */ public function __invoke(Context $context, array $opts = []): Response { - return $this->tryResponse(context: $context, fn: fn() => $this->action($context, $opts)); + return $this->tryResponse(context: $context, fn: fn() => $this->action($context, $opts), action: $this->action); } /** diff --git a/src/Backends/Plex/Action/GetLibrary.php b/src/Backends/Plex/Action/GetLibrary.php index 37ecd5f6..88977bde 100644 --- a/src/Backends/Plex/Action/GetLibrary.php +++ b/src/Backends/Plex/Action/GetLibrary.php @@ -12,6 +12,7 @@ use App\Backends\Common\Levels; use App\Backends\Common\Response; use App\Backends\Plex\PlexActionTrait; use App\Backends\Plex\PlexClient; +use App\Libs\Exceptions\Backends\RuntimeException; use App\Libs\Options; use JsonException; use JsonMachine\Exception\InvalidArgumentException; @@ -20,7 +21,6 @@ use JsonMachine\JsonDecoder\DecodingError; use JsonMachine\JsonDecoder\ErrorWrappingDecoder; use JsonMachine\JsonDecoder\ExtJsonDecoder; use Psr\Log\LoggerInterface as iLogger; -use RuntimeException; use Symfony\Contracts\HttpClient\Exception\ExceptionInterface; use Symfony\Contracts\HttpClient\Exception\HttpExceptionInterface; use Symfony\Contracts\HttpClient\HttpClientInterface as iHttp; @@ -30,6 +30,8 @@ final class GetLibrary use CommonTrait; use PlexActionTrait; + private string $action = 'plex.getLibrary'; + public function __construct(protected iHttp $http, protected iLogger $logger) { } @@ -46,12 +48,17 @@ final class GetLibrary */ public function __invoke(Context $context, iGuid $guid, string|int $id, array $opts = []): Response { - return $this->tryResponse(context: $context, fn: fn() => $this->action($context, $guid, $id, $opts)); + return $this->tryResponse( + context: $context, + fn: fn() => $this->action($context, $guid, $id, $opts), + action: $this->action + ); } /** * @throws ExceptionInterface * @throws InvalidArgumentException + * @throws RuntimeException */ private function action(Context $context, iGuid $guid, string|int $id, array $opts = []): Response { @@ -101,14 +108,14 @@ final class GetLibrary ); } - $url = $context->backendUrl->withPath( - r('/library/sections/{library_id}/all', ['library_id' => $id]) - )->withQuery( - http_build_query([ - 'type' => PlexClient::TYPE_MOVIE === ag($logContext, 'library.type') ? 1 : 2, - 'includeGuids' => 1, - ]) - ); + $url = $context->backendUrl + ->withPath(r('/library/sections/{library_id}/all', ['library_id' => $id])) + ->withQuery( + http_build_query([ + 'type' => PlexClient::TYPE_MOVIE === ag($logContext, 'library.type') ? 1 : 2, + 'includeGuids' => 1, + ]) + ); $logContext['library']['url'] = (string)$url; @@ -271,6 +278,18 @@ final class GetLibrary return new Response(status: true, response: $list); } + /** + * Process a single item. + * + * @param Context $context The context object. + * @param iGuid $guid The GUID object. + * @param array $item The item array. + * @param array $log The log array. Default is an empty array. + * @param array $opts The options array. Default is an empty array. + * + * @return array Returns an array containing the processed metadata. + * @throws RuntimeException Throws a RuntimeException if an unexpected item type is encountered while parsing the library. + */ private function process(Context $context, iGuid $guid, array $item, array $log = [], array $opts = []): array { $url = $context->backendUrl->withPath(r('/library/metadata/{item_id}', ['item_id' => ag($item, 'ratingKey')])); diff --git a/src/Backends/Plex/Action/GetMetaData.php b/src/Backends/Plex/Action/GetMetaData.php index db315cf9..da5c1959 100644 --- a/src/Backends/Plex/Action/GetMetaData.php +++ b/src/Backends/Plex/Action/GetMetaData.php @@ -18,6 +18,8 @@ final class GetMetaData { use CommonTrait; + private string $action = 'plex.getMetadata'; + public function __construct( protected HttpClientInterface $http, protected LoggerInterface $logger, @@ -111,6 +113,7 @@ final class GetMetaData return new Response(status: true, response: $item, extra: ['cached' => $fromCache]); }, + action: $this->action ); } } diff --git a/src/Backends/Plex/Action/GetUserToken.php b/src/Backends/Plex/Action/GetUserToken.php index a678c214..27d9e93b 100644 --- a/src/Backends/Plex/Action/GetUserToken.php +++ b/src/Backends/Plex/Action/GetUserToken.php @@ -18,6 +18,7 @@ use Throwable; final class GetUserToken { private int $maxRetry = 3; + private string $action = 'plex.getUserToken'; use CommonTrait; @@ -39,7 +40,8 @@ final class GetUserToken { return $this->tryResponse( context: $context, - fn: fn() => $this->getUserToken($context, $userId, $username) + fn: fn() => $this->getUserToken($context, $userId, $username), + action: $this->action, ); } diff --git a/src/Backends/Plex/Action/GetUsersList.php b/src/Backends/Plex/Action/GetUsersList.php index d5b68b9c..f3deeafc 100644 --- a/src/Backends/Plex/Action/GetUsersList.php +++ b/src/Backends/Plex/Action/GetUsersList.php @@ -20,6 +20,7 @@ use Symfony\Contracts\HttpClient\HttpClientInterface; final class GetUsersList { private int $maxRetry = 3; + private string $action = 'plex.getUsersList'; use CommonTrait; @@ -37,7 +38,11 @@ final class GetUsersList */ public function __invoke(Context $context, array $opts = []): Response { - return $this->tryResponse(context: $context, fn: fn() => $this->getUsers($context, $opts)); + return $this->tryResponse( + context: $context, + fn: fn() => $this->getUsers($context, $opts), + action: $this->action + ); } /** diff --git a/src/Backends/Plex/Action/GetVersion.php b/src/Backends/Plex/Action/GetVersion.php index 65dddde9..8994e709 100644 --- a/src/Backends/Plex/Action/GetVersion.php +++ b/src/Backends/Plex/Action/GetVersion.php @@ -15,7 +15,7 @@ final class GetVersion { use CommonTrait; - private string $action = 'get version'; + private string $action = 'plex.getVersion'; public function __construct( protected HttpClientInterface $http, diff --git a/src/Backends/Plex/Action/Import.php b/src/Backends/Plex/Action/Import.php index 63174eea..9e72f1e8 100644 --- a/src/Backends/Plex/Action/Import.php +++ b/src/Backends/Plex/Action/Import.php @@ -11,13 +11,13 @@ use App\Backends\Common\Response; use App\Backends\Plex\PlexActionTrait; use App\Backends\Plex\PlexClient; use App\Libs\Entity\StateInterface as iState; +use App\Libs\Exceptions\Backends\InvalidArgumentException; use App\Libs\Guid; use App\Libs\Mappers\ImportInterface as iImport; use App\Libs\Message; use App\Libs\Options; use Closure; use DateTimeInterface as iDate; -use InvalidArgumentException; use JsonException; use JsonMachine\Items; use JsonMachine\JsonDecoder\DecodingError; @@ -35,6 +35,8 @@ class Import use CommonTrait; use PlexActionTrait; + private string $action = 'plex.import'; + public function __construct(protected iHttp $http, protected iLogger $logger) { } @@ -55,42 +57,46 @@ class Import iDate|null $after = null, array $opts = [] ): Response { - return $this->tryResponse($context, fn() => $this->getLibraries( + return $this->tryResponse( context: $context, - handle: fn(array $logContext = []) => fn(iResponse $response) => $this->handle( + fn: fn() => $this->getLibraries( context: $context, - response: $response, - callback: fn(array $item, array $logContext = []) => $this->process( + handle: fn(array $logContext = []) => fn(iResponse $response) => $this->handle( context: $context, - guid: $guid, - mapper: $mapper, - item: $item, - logContext: $logContext, - opts: $opts + ['after' => $after], + response: $response, + callback: fn(array $item, array $logContext = []) => $this->process( + context: $context, + guid: $guid, + mapper: $mapper, + item: $item, + logContext: $logContext, + opts: $opts + ['after' => $after], + ), + logContext: $logContext + ), + error: fn(array $logContext = []) => fn(Throwable $e) => $this->logger->error( + message: 'Exception [{error.kind}] was thrown unhandled during [{client}: {backend}] library [{library.title}] request. Error [{error.message} @ {error.file}:{error.line}].', + context: [ + 'backend' => $context->backendName, + 'client' => $context->clientName, + 'error' => [ + 'kind' => $e::class, + 'line' => $e->getLine(), + 'message' => $e->getMessage(), + 'file' => after($e->getFile(), ROOT_PATH), + ], + ...$logContext, + 'exception' => [ + 'file' => $e->getFile(), + 'line' => $e->getLine(), + 'kind' => get_class($e), + 'message' => $e->getMessage(), + ], + ] ), - logContext: $logContext ), - error: fn(array $logContext = []) => fn(Throwable $e) => $this->logger->error( - message: 'Exception [{error.kind}] was thrown unhandled during [{client}: {backend}] library [{library.title}] request. Error [{error.message} @ {error.file}:{error.line}].', - context: [ - 'backend' => $context->backendName, - 'client' => $context->clientName, - 'error' => [ - 'kind' => $e::class, - 'line' => $e->getLine(), - 'message' => $e->getMessage(), - 'file' => after($e->getFile(), ROOT_PATH), - ], - ...$logContext, - 'exception' => [ - 'file' => $e->getFile(), - 'line' => $e->getLine(), - 'kind' => get_class($e), - 'message' => $e->getMessage(), - ], - ] - ), - )); + action: $this->action + ); } protected function getLibraries(Context $context, Closure $handle, Closure $error): array diff --git a/src/Backends/Plex/Action/InspectRequest.php b/src/Backends/Plex/Action/InspectRequest.php index 24529a7a..ce4cd325 100644 --- a/src/Backends/Plex/Action/InspectRequest.php +++ b/src/Backends/Plex/Action/InspectRequest.php @@ -13,6 +13,8 @@ final class InspectRequest { use CommonTrait; + private string $action = 'plex.inspectRequest'; + public function __invoke(Context $context, ServerRequestInterface $request): Response { return $this->tryResponse( @@ -59,7 +61,8 @@ final class InspectRequest } return new Response(status: true, response: $alteredRequest); - } + }, + action: $this->action ); } } diff --git a/src/Backends/Plex/Action/ParseWebhook.php b/src/Backends/Plex/Action/ParseWebhook.php index 996d0f8b..bbce94ce 100644 --- a/src/Backends/Plex/Action/ParseWebhook.php +++ b/src/Backends/Plex/Action/ParseWebhook.php @@ -46,6 +46,8 @@ final class ParseWebhook 'media.pause', ]; + private string $action = 'plex.parseWebhook'; + /** * Parse Webhook payload. * @@ -57,7 +59,11 @@ final class ParseWebhook */ public function __invoke(Context $context, iGuid $guid, iRequest $request): Response { - return $this->tryResponse(context: $context, fn: fn() => $this->parse($context, $guid, $request)); + return $this->tryResponse( + context: $context, + fn: fn() => $this->parse($context, $guid, $request), + action: $this->action + ); } private function parse(Context $context, iGuid $guid, iRequest $request): Response diff --git a/src/Backends/Plex/Action/Progress.php b/src/Backends/Plex/Action/Progress.php index 8b9585db..3d53fe5c 100644 --- a/src/Backends/Plex/Action/Progress.php +++ b/src/Backends/Plex/Action/Progress.php @@ -10,6 +10,8 @@ use App\Backends\Common\GuidInterface as iGuid; use App\Backends\Common\Response; use App\Backends\Plex\PlexActionTrait; use App\Libs\Entity\StateInterface as iState; +use App\Libs\Exceptions\Backends\InvalidArgumentException; +use App\Libs\Exceptions\Backends\RuntimeException; use App\Libs\Options; use App\Libs\QueueRequests; use DateTimeInterface; @@ -22,6 +24,8 @@ class Progress use CommonTrait; use PlexActionTrait; + private string $action = 'plex.progress'; + public function __construct(protected HttpClientInterface $http, protected LoggerInterface $logger) { } @@ -43,13 +47,11 @@ class Progress QueueRequests $queue, DateTimeInterface|null $after = null ): Response { - return $this->tryResponse(context: $context, fn: fn() => $this->action( - $context, - $guid, - $entities, - $queue, - $after - ), action: 'plex.progress'); + return $this->tryResponse( + context: $context, + fn: fn() => $this->action($context, $guid, $entities, $queue, $after), + action: $this->action + ); } private function action( @@ -160,7 +162,7 @@ class Progress ); continue; } - } catch (\RuntimeException $e) { + } catch (\App\Libs\Exceptions\RuntimeException|RuntimeException|InvalidArgumentException $e) { $this->logger->error( message: 'Exception [{error.kind}] was thrown unhandled during [{client}: {backend}] request to get {item.type} [{item.title}] status. Error [{error.message} @ {error.file}:{error.line}].', context: [ diff --git a/src/Backends/Plex/Action/Push.php b/src/Backends/Plex/Action/Push.php index c1e8e52e..019306db 100644 --- a/src/Backends/Plex/Action/Push.php +++ b/src/Backends/Plex/Action/Push.php @@ -19,6 +19,8 @@ final class Push { use CommonTrait; + private string $action = 'plex.push'; + public function __construct(protected HttpClientInterface $http, protected LoggerInterface $logger) { } @@ -38,7 +40,11 @@ final class Push QueueRequests $queue, DateTimeInterface|null $after = null ): Response { - return $this->tryResponse(context: $context, fn: fn() => $this->action($context, $entities, $queue, $after)); + return $this->tryResponse( + context: $context, + fn: fn() => $this->action($context, $entities, $queue, $after), + action: $this->action + ); } private function action( diff --git a/src/Backends/Plex/Action/SearchId.php b/src/Backends/Plex/Action/SearchId.php index 3738140e..ebdda4fd 100644 --- a/src/Backends/Plex/Action/SearchId.php +++ b/src/Backends/Plex/Action/SearchId.php @@ -17,6 +17,8 @@ final class SearchId use CommonTrait; use PlexActionTrait; + private string $action = 'plex.searchId'; + public function __construct(protected HttpClientInterface $http, protected LoggerInterface $logger) { } @@ -32,12 +34,22 @@ final class SearchId */ public function __invoke(Context $context, string|int $id, array $opts = []): Response { - return $this->tryResponse(context: $context, fn: fn() => $this->search($context, $id, $opts)); + return $this->tryResponse( + context: $context, + fn: fn() => $this->search($context, $id, $opts), + action: $this->action + ); } private function search(Context $context, string|int $id, array $opts = []): Response { - $item = $this->getItemDetails($context, $id, $opts); + $item = $this->getItemInfo($context, $id, $opts + [Options::NO_THROW => true]); + + if (!$item->isSuccessful()) { + return $item; + } + + $item = $item->response; $metadata = ag($item, 'MediaContainer.Metadata.0', []); diff --git a/src/Backends/Plex/Action/SearchQuery.php b/src/Backends/Plex/Action/SearchQuery.php index 906b722a..17b299b9 100644 --- a/src/Backends/Plex/Action/SearchQuery.php +++ b/src/Backends/Plex/Action/SearchQuery.php @@ -19,6 +19,8 @@ final class SearchQuery { use CommonTrait; + private string $action = 'plex.searchQuery'; + public function __construct(protected HttpClientInterface $http, protected LoggerInterface $logger) { } @@ -35,14 +37,18 @@ final class SearchQuery */ public function __invoke(Context $context, string $query, int $limit = 25, array $opts = []): Response { - return $this->tryResponse(context: $context, fn: fn() => $this->search($context, $query, $limit, $opts)); + return $this->tryResponse( + context: $context, + fn: fn() => $this->search($context, $query, $limit, $opts), + action: $this->action + ); } /** * Search Backend Titles. * - * @throws ExceptionInterface - * @throws JsonException + * @throws ExceptionInterface if the request failed + * @throws JsonException if the response cannot be parsed */ private function search(Context $context, string $query, int $limit = 25, array $opts = []): Response { diff --git a/src/Backends/Plex/Commands/AccessTokenCommand.php b/src/Backends/Plex/Commands/AccessTokenCommand.php index 8805e99c..1043454f 100644 --- a/src/Backends/Plex/Commands/AccessTokenCommand.php +++ b/src/Backends/Plex/Commands/AccessTokenCommand.php @@ -10,7 +10,6 @@ use App\Libs\Config; use App\Libs\Options; use App\Libs\Routable; use Psr\Log\LoggerInterface as iLogger; -use RuntimeException; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; @@ -79,12 +78,17 @@ final class AccessTokenCommand extends Command if (($config = $input->getOption('config'))) { try { Config::save('servers', Yaml::parseFile($this->checkCustomBackendsFile($config))); - } catch (RuntimeException $e) { - $this->logger->error($e->getMessage()); + } catch (\App\Libs\Exceptions\RuntimeException $e) { + $output->writeln(r('{message}', ['message' => $e->getMessage()])); return self::FAILURE; } } + if (null === ag(Config::get('servers', []), $backend, null)) { + $output->writeln(r("ERROR: Backend '{backend}' not found.", ['backend' => $backend])); + return self::FAILURE; + } + $opts = $backendOpts = []; if ($input->getOption('include-raw-response')) { diff --git a/src/Backends/Plex/Commands/DiscoverCommand.php b/src/Backends/Plex/Commands/DiscoverCommand.php index 94149483..c1fb6b2e 100644 --- a/src/Backends/Plex/Commands/DiscoverCommand.php +++ b/src/Backends/Plex/Commands/DiscoverCommand.php @@ -6,6 +6,7 @@ namespace App\Backends\Plex\Commands; use App\Backends\Plex\PlexClient; use App\Command; +use App\Libs\Exceptions\Backends\RuntimeException; use App\Libs\Options; use App\Libs\Routable; use Psr\Log\LoggerInterface as iLogger; @@ -66,6 +67,7 @@ final class DiscoverCommand extends Command * @throws RedirectionExceptionInterface * @throws ClientExceptionInterface * @throws ServerExceptionInterface + * @throws RuntimeException */ protected function runCommand(InputInterface $input, OutputInterface $output, null|array $rerun = null): int { diff --git a/src/Backends/Plex/PlexActionTrait.php b/src/Backends/Plex/PlexActionTrait.php index 095e5bb1..20af7b71 100644 --- a/src/Backends/Plex/PlexActionTrait.php +++ b/src/Backends/Plex/PlexActionTrait.php @@ -6,15 +6,16 @@ namespace App\Backends\Plex; use App\Backends\Common\Context; use App\Backends\Common\GuidInterface as iGuid; +use App\Backends\Common\Response; use App\Backends\Plex\Action\GetLibrariesList; use App\Backends\Plex\Action\GetMetaData; use App\Libs\Container; use App\Libs\Entity\StateEntity; use App\Libs\Entity\StateInterface as iState; +use App\Libs\Exceptions\Backends\InvalidArgumentException; +use App\Libs\Exceptions\Backends\RuntimeException; use App\Libs\Guid; use App\Libs\Options; -use InvalidArgumentException; -use RuntimeException; trait PlexActionTrait { @@ -33,6 +34,8 @@ trait PlexActionTrait * @param array $opts options * * @return iState Return object on successful creation. + * @throws InvalidArgumentException if no date was set on object. + * @throws RuntimeException if request failed. */ protected function createEntity(Context $context, iGuid $guid, array $item, array $opts = []): iState { @@ -46,7 +49,7 @@ trait PlexActionTrait } if (null === $date) { - throw new RuntimeException('No date was set on object.'); + throw new InvalidArgumentException('No date was set on object.'); } $year = (int)ag($item, ['grandParentYear', 'parentYear', 'year'], 0); @@ -195,11 +198,13 @@ trait PlexActionTrait * @param Context $context * @param string|int $id * @param array $opts + * * @return array + * @throws RuntimeException if request failed. */ protected function getItemDetails(Context $context, string|int $id, array $opts = []): array { - $response = Container::get(GetMetaData::class)(context: $context, id: $id, opts: $opts); + $response = $this->getItemInfo(context: $context, id: $id, opts: $opts); if ($response->isSuccessful()) { return $response->response; @@ -208,6 +213,19 @@ trait PlexActionTrait throw new RuntimeException(message: $response->error->format(), previous: $response->error->previous); } + /** + * Get item details. + * + * @param Context $context + * @param string|int $id + * @param array $opts + * @return Response + */ + protected function getItemInfo(Context $context, string|int $id, array $opts = []): Response + { + return Container::get(GetMetaData::class)(context: $context, id: $id, opts: $opts); + } + /** * Get episode parent external ids. * @@ -217,6 +235,7 @@ trait PlexActionTrait * @param array $logContext * * @return array + * @throws RuntimeException */ protected function getEpisodeParent(Context $context, iGuid $guid, int|string $id, array $logContext = []): array { @@ -278,6 +297,7 @@ trait PlexActionTrait /** * Get Backend Libraries details. + * @throws RuntimeException */ protected function getBackendLibraries(Context $context, array $opts = []): array { diff --git a/src/Backends/Plex/PlexClient.php b/src/Backends/Plex/PlexClient.php index 4d2ca37a..219a7630 100644 --- a/src/Backends/Plex/PlexClient.php +++ b/src/Backends/Plex/PlexClient.php @@ -29,6 +29,7 @@ use App\Backends\Plex\Action\SearchQuery; use App\Libs\Config; use App\Libs\Container; use App\Libs\Entity\StateInterface as iState; +use App\Libs\Exceptions\Backends\RuntimeException; use App\Libs\Exceptions\HttpException; use App\Libs\Mappers\ImportInterface as iImport; use App\Libs\Options; @@ -38,7 +39,9 @@ use DateTimeInterface as iDate; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Message\StreamInterface; use Psr\Log\LoggerInterface as iLogger; -use RuntimeException; +use Symfony\Contracts\HttpClient\Exception\ClientExceptionInterface; +use Symfony\Contracts\HttpClient\Exception\RedirectionExceptionInterface; +use Symfony\Contracts\HttpClient\Exception\ServerExceptionInterface; use Symfony\Contracts\HttpClient\Exception\TransportExceptionInterface; use Symfony\Contracts\HttpClient\HttpClientInterface; @@ -377,7 +380,7 @@ class PlexClient implements iClient { $response = Container::get(SearchId::class)(context: $this->context, id: $id, opts: $opts); - if ($response->hasError()) { + if ($response->hasError() && false === (bool)ag($opts, Options::NO_LOGGING, false)) { $this->logger->log($response->error->level(), $response->error->message, $response->error->context); } @@ -544,8 +547,11 @@ class PlexClient implements iClient * @param array $opts (Optional) options. * * @return array The list of Plex servers. - * @throws RuntimeException When an unexpected status code is returned or a network-related exception occurs. * + * @throws RuntimeException When an unexpected status code is returned or a network-related exception occurs. + * @throws ClientExceptionInterface When a client error is encountered. + * @throws RedirectionExceptionInterface When a redirection error is encountered. + * @throws ServerExceptionInterface When a server error is encountered. */ public static function discover(HttpClientInterface $http, string $token, array $opts = []): array { diff --git a/src/Backends/Plex/PlexManage.php b/src/Backends/Plex/PlexManage.php index a9d442c7..79ff7f1f 100644 --- a/src/Backends/Plex/PlexManage.php +++ b/src/Backends/Plex/PlexManage.php @@ -5,9 +5,9 @@ declare(strict_types=1); namespace App\Backends\Plex; use App\Backends\Common\ManageInterface; +use App\Libs\Exceptions\Backends\RuntimeException; use App\Libs\Options; use Psr\Log\LoggerInterface as iLogger; -use RuntimeException; use Symfony\Component\Console\Helper\QuestionHelper; use Symfony\Component\Console\Input\InputInterface as iInput; use Symfony\Component\Console\Output\OutputInterface as iOutput;