fix global search provider

This commit is contained in:
Jonas Heinrich 2020-10-18 11:41:18 +02:00
parent 0bd0e8cad3
commit 7cddb4ccfa
2 changed files with 110 additions and 0 deletions

51
lib/Command/Search.php Normal file
View File

@ -0,0 +1,51 @@
<?php
declare(strict_types=1);
namespace OCA\Radio\Command;
use OCA\Radio\Service\SearchService;
use OCA\Mail\Service\CleanupService;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
class Search extends Command {
/** @var CleanupService */
private $cleanupService;
/**
* @var SearchService
*/
private $searchService;
public function __construct(SearchService $searchService) {
parent::__construct();
$this->searchService = $searchService;
}
/**
* @return void
*/
protected function configure() {
$this->setName('radio:search');
$this->setDescription('Search for radio stations');
$this->addArgument("term", InputArgument::OPTIONAL);
}
protected function execute(InputInterface $input, OutputInterface $output): int {
$radioStations = $this->searchService->findRadioStations(
$input->getArgument("term")
);
$output->writeln("Found radio stations");
foreach ($radioStations as $radioStation) {
$output->writeln("* $radioStation");
}
return 0;
}
}

View File

@ -0,0 +1,59 @@
<?php
declare(strict_types=1);
namespace OCA\Radio\Service;
use Exception;
use OCP\Http\Client\IClientService;
use Psr\Log\LoggerInterface;
use function array_filter;
use function array_map;
use function json_decode;
use function mb_strpos;
use function mb_strtolower;
class SearchService {
/** @var IClientService */
private $clientService;
/** @var LoggerInterface */
private $logger;
public function __construct(IClientService $clientService,
LoggerInterface $logger) {
$this->clientService = $clientService;
$this->logger = $logger;
}
public function findRadioStations(?string $term = null): array {
$this->logger->debug('searching radio stations');
$client = $this->clientService->newClient();
try {
$response = $client->get("https://cat-fact.herokuapp.com/facts?animal_type=cat");
} catch (Exception $e) {
$this->logger->error("Could not search for radio stations. Please check connection to radio-browser API.");
throw $e;
}
$body = $response->getBody();
$parsed = json_decode($body, true);
$mapped = array_map(function(array $radioStation) {
return $radioStation['text'];
}, $parsed['all']);
if (empty($term)) {
return $mapped;
}
return array_filter($mapped, function(string $radioStation) use ($term) {
return mb_strpos(mb_strtolower($radioStation), mb_strtolower($term));
});
}
}