Sorting option

This commit is contained in:
Simon Vieille 2015-11-18 20:53:37 +01:00
parent 985e3ebbea
commit 9713b92674
6 changed files with 65 additions and 9 deletions

View file

@ -180,6 +180,8 @@ Help:
Search torrents.
Usage: torrents:search QUERY [OPTIONS]
Sort values \"seed\", \"leech\", \"size\", \"name\", \"id\"
--terms does not work (API bug)
```
@ -272,7 +274,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\"
```

View file

@ -27,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("<info>%command.name%</info>
Search torrents.
Usage: <comment>torrents:search</comment> <info>QUERY</info> [OPTIONS]
<info>Sort values</info> \"seed\", \"leech\", \"size\", \"name\", \"id\"
<error>--terms does not work (API bug)</error>");
}
@ -95,8 +99,18 @@ Usage: <comment>torrents:search</comment> <info>QUERY</info> [OPTIONS]
return;
}
$options = [];
if ($input->getOption('sort')) {
$options['sort'] = $input->getOption('sort');
}
if ($input->getOption('asc')) {
$options['asc'] = true;
}
Render::torrents($response->getData()['torrents'], $output);
Render::torrents($response->getData()['torrents'], $output, $options);
} catch (ClientException $e) {
$output->writeln(sprintf('An error occured. <error>%s</error>', $e->getMessage()));
}

View file

@ -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("<info>%command.name%</info>
Search movies.
@ -37,7 +39,7 @@ Usage: <comment>torrents:search:movies</comment> <info>QUERY</info> [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) {

View file

@ -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("<info>%command.name%</info>
Search series.
@ -37,7 +39,7 @@ Usage: <comment>torrents:search:series</comment> <info>QUERY</info> [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) {

View file

@ -20,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("<info>%command.name%</info>
Show top torrents.
Usage: <comment>torrents:search:top</comment> [OPTIONS]
<info>Period values: \"100\" (default), \"day\", \"week\", \"month\"</info>");
<info>Period values</info> \"100\" (default), \"day\", \"week\", \"month\"
<info>Sort values</info> \"seed\", \"leech\", \"size\", \"name\", \"id\"
");
}
protected function execute(InputInterface $input, OutputInterface $output)
@ -61,7 +65,17 @@ Usage: <comment>torrents:search:top</comment> [OPTIONS]
return;
}
Render::torrents($response->getData(), $output);
$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. <error>%s</error>', $e->getMessage()));
}

View file

@ -3,7 +3,7 @@
namespace Helper;
use Symfony\Component\Console\Output\OutputInterface;
use Api\ClientResponse;
use InvalidArgumentException;
/**
* Class Render
@ -11,12 +11,34 @@ use Api\ClientResponse;
*/
class Render
{
public static function torrents(array $torrents, OutputInterface $output)
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) {
@ -31,4 +53,3 @@ class Render
}
}
}