diff --git a/README.md b/README.md index 88f4f0e..23ddc8c 100644 --- a/README.md +++ b/README.md @@ -182,6 +182,8 @@ Help: Search torrents. Usage: torrents:search QUERY [OPTIONS] + + Sort values \"seed\", \"leech\", \"size\", \"name\", \"id\" --terms does not work (API bug) ``` @@ -274,7 +276,8 @@ Help: Usage: torrents:search:top [OPTIONS] - Period values: "100", "day", "week", "month" + Period values \"100\" (default), \"day\", \"week\", \"month\" + Sort values \"seed\", \"leech\", \"size\", \"name\", \"id\" ``` diff --git a/src/Console/Command/TorrentsSearchCommand.php b/src/Console/Command/TorrentsSearchCommand.php index 9baafdb..dc47f92 100644 --- a/src/Console/Command/TorrentsSearchCommand.php +++ b/src/Console/Command/TorrentsSearchCommand.php @@ -12,6 +12,7 @@ use Api\ConfigLoader; use Api\ClientResponse; use Api\ClientException; use Helper\Formater; +use Helper\Render; class TorrentsSearchCommand extends Command { @@ -26,12 +27,16 @@ class TorrentsSearchCommand extends Command ->addOption('sub-category', 's', InputOption::VALUE_REQUIRED, 'Filter by sub-category ID') ->addOption('category', 'c', InputOption::VALUE_REQUIRED, 'Filter by category ID') ->addOption('terms', 't', InputOption::VALUE_REQUIRED, 'Filter by terms IDs (separated by ",")') + ->addOption('sort', null, InputOption::VALUE_REQUIRED, 'Sort') + ->addOption('asc', null, InputOption::VALUE_NONE, 'Ascending sort') ->setHelp("%command.name% Search torrents. Usage: torrents:search QUERY [OPTIONS] +Sort values \"seed\", \"leech\", \"size\", \"name\", \"id\" + --terms does not work (API bug)"); } @@ -84,8 +89,28 @@ Usage: torrents:search QUERY [OPTIONS] } $response = $this->searchTorrents($client, $input, $termsTree); + + if ($response->hasError()) { + $output->writeln(sprintf( + '%s (%d)', + $response->getErrorMessage(), + $response->getErrorCode() + )); - $this->showResults($response, $output); + return; + } + + $options = []; + + if ($input->getOption('sort')) { + $options['sort'] = $input->getOption('sort'); + } + + if ($input->getOption('asc')) { + $options['asc'] = true; + } + + Render::torrents($response->getData()['torrents'], $output, $options); } catch (ClientException $e) { $output->writeln(sprintf('An error occured. %s', $e->getMessage())); } diff --git a/src/Console/Command/TorrentsSearchMoviesCommand.php b/src/Console/Command/TorrentsSearchMoviesCommand.php index 9e3c431..222b3e6 100644 --- a/src/Console/Command/TorrentsSearchMoviesCommand.php +++ b/src/Console/Command/TorrentsSearchMoviesCommand.php @@ -20,6 +20,8 @@ class TorrentsSearchMoviesCommand extends Command ->addOption('offset', 'o', InputOption::VALUE_REQUIRED, 'Page number') ->addOption('limit', 'l', InputOption::VALUE_REQUIRED, 'Number of results per page') ->addOption('terms', 't', InputOption::VALUE_REQUIRED, 'Filter by terms IDs (separated by ",")') + ->addOption('sort', null, InputOption::VALUE_REQUIRED, 'Sort') + ->addOption('asc', null, InputOption::VALUE_NONE, 'Ascending sort') ->setHelp("%command.name% Search movies. @@ -37,7 +39,7 @@ Usage: torrents:search:movies QUERY [OPTIONS] '--sub-category' => 631, ); - foreach (['offset', 'limit', 'terms'] as $p) { + foreach (['offset', 'limit', 'terms', 'sort', 'asc'] as $p) { $value = $input->getOption($p); if (null !== $value) { diff --git a/src/Console/Command/TorrentsSearchSeriesCommand.php b/src/Console/Command/TorrentsSearchSeriesCommand.php index ccb2dc3..e8def61 100644 --- a/src/Console/Command/TorrentsSearchSeriesCommand.php +++ b/src/Console/Command/TorrentsSearchSeriesCommand.php @@ -20,6 +20,8 @@ class TorrentsSearchSeriesCommand extends Command ->addOption('offset', 'o', InputOption::VALUE_REQUIRED, 'Page number') ->addOption('limit', 'l', InputOption::VALUE_REQUIRED, 'Number of results per page') ->addOption('terms', 't', InputOption::VALUE_REQUIRED, 'Filter by terms IDs (separated by ",")') + ->addOption('sort', null, InputOption::VALUE_REQUIRED, 'Sort') + ->addOption('asc', null, InputOption::VALUE_NONE, 'Ascending sort') ->setHelp("%command.name% Search series. @@ -37,7 +39,7 @@ Usage: torrents:search:series QUERY [OPTIONS] '--sub-category' => 433, ); - foreach (['offset', 'limit', 'terms'] as $p) { + foreach (['offset', 'limit', 'terms', 'sort', 'asc'] as $p) { $value = $input->getOption($p); if (null !== $value) { diff --git a/src/Console/Command/TorrentsTopCommand.php b/src/Console/Command/TorrentsTopCommand.php index 7123d82..8e1023c 100644 --- a/src/Console/Command/TorrentsTopCommand.php +++ b/src/Console/Command/TorrentsTopCommand.php @@ -10,6 +10,7 @@ use Api\Client; use Api\ConfigLoader; use Api\ClientResponse; use Api\ClientException; +use Helper\Render; class TorrentsTopCommand extends Command { @@ -19,13 +20,17 @@ class TorrentsTopCommand extends Command ->setName('torrents:top') ->setDescription('Top torrents') ->addOption('period', 'p', InputOption::VALUE_REQUIRED, 'Period') + ->addOption('sort', null, InputOption::VALUE_REQUIRED, 'Sort') + ->addOption('asc', null, InputOption::VALUE_NONE, 'Ascending sort') ->setHelp("%command.name% Show top torrents. Usage: torrents:search:top [OPTIONS] -Period values: \"100\" (default), \"day\", \"week\", \"month\""); +Period values \"100\" (default), \"day\", \"week\", \"month\" +Sort values \"seed\", \"leech\", \"size\", \"name\", \"id\" +"); } protected function execute(InputInterface $input, OutputInterface $output) @@ -49,35 +54,30 @@ Usage: torrents:search:top [OPTIONS] } $response = $client->getTopTorrents($period); + + if ($response->hasError()) { + $output->writeln(sprintf( + '%s (%d)', + $response->getErrorMessage(), + $response->getErrorCode() + )); - return $this->showResults($response, $output); + return; + } + + $options = []; + + if ($input->getOption('sort')) { + $options['sort'] = $input->getOption('sort'); + } + + if ($input->getOption('asc')) { + $options['asc'] = true; + } + + Render::torrents($response->getData(), $output, $options); } catch (ClientException $e) { $output->writeln(sprintf('An error occured. %s', $e->getMessage())); } } - - protected function showResults(ClientResponse $response, OutputInterface $output) - { - if ($response->hasError()) { - $output->writeln(sprintf( - '%s (%d)', - $response->getErrorMessage(), - $response->getErrorCode() - )); - - return; - } - - $output->writeln(' SEED LEECH ID NAME'); - - foreach ($response->getData() as $torrent) { - $output->writeln(sprintf( - '[%4d%6d] %9d %s', - $torrent['seeders'], - $torrent['leechers'], - $torrent['id'], - $torrent['name'] - )); - } - } } diff --git a/src/Helper/Render.php b/src/Helper/Render.php new file mode 100644 index 0000000..5fdb68c --- /dev/null +++ b/src/Helper/Render.php @@ -0,0 +1,55 @@ + + */ +class Render +{ + public static function torrents(array $torrents, OutputInterface $output, array $options = []) + { + if (empty($torrents)) { + return; + } + + if (isset($options['sort'])) { + $sort = $options['sort']; + + if (!in_array($sort, ['seed', 'leech', 'size', 'id', 'name'])) { + throw new InvalidArgumentException('Invalid option "sort".'); + } + + $sort = str_replace(['seed', 'leech'], ['seeders', 'leechers'], $sort); + $sortDatas = []; + + foreach ($torrents as $torrent) { + $sortDatas[] = $torrent[$sort]; + } + + array_multisort( + $sortDatas, + isset($options['asc']) ? SORT_ASC : SORT_DESC, + $sort === 'name' ? SORT_STRING : SORT_NUMERIC, + $torrents + ); + } + + $output->writeln(' SEED LEECH SIZE ID NAME'); + + foreach ($torrents as $torrent) { + $output->writeln(sprintf( + '[%4d%6d] [%8s] %7d %s', + $torrent['seeders'], + $torrent['leechers'], + Formater::humanSize((int) $torrent['size']), + $torrent['id'], + $torrent['name'] + )); + } + } +}