54 lines
1.1 KiB
PHP
54 lines
1.1 KiB
PHP
|
<?php
|
||
|
|
||
|
declare(strict_types=1);
|
||
|
|
||
|
namespace OCA\RePod\Service;
|
||
|
|
||
|
use OCA\GPodderSync\Core\PodcastData\PodcastData;
|
||
|
use Psr\Log\LoggerInterface;
|
||
|
|
||
|
class MultiPodService implements IPodProvider
|
||
|
{
|
||
|
/**
|
||
|
* @var IPodProvider[]
|
||
|
*/
|
||
|
private array $providers = [];
|
||
|
|
||
|
public function __construct(
|
||
|
FyydService $fyydService,
|
||
|
ItunesService $itunesService,
|
||
|
private LoggerInterface $logger
|
||
|
) {
|
||
|
$this->providers = [$fyydService, $itunesService];
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @return PodcastData[]
|
||
|
*/
|
||
|
public function search(string $value): array {
|
||
|
$podcasts = [];
|
||
|
|
||
|
foreach ($this->providers as $provider) {
|
||
|
try {
|
||
|
$podcasts = [...$podcasts, ...$provider->search($value)];
|
||
|
} catch (\Exception $e) {
|
||
|
$this->logger->error($e->getMessage(), $e->getTrace());
|
||
|
}
|
||
|
}
|
||
|
|
||
|
usort($podcasts, fn (PodcastData $a, PodcastData $b) => $b->getFetchedAtUnix() <=> $a->getFetchedAtUnix());
|
||
|
|
||
|
return array_values(
|
||
|
array_intersect_key(
|
||
|
$podcasts,
|
||
|
array_unique(
|
||
|
array_map(
|
||
|
fn (PodcastData $feed) => $feed->getLink(),
|
||
|
array_filter($podcasts, fn (PodcastData $feed) => $feed->getLink())
|
||
|
)
|
||
|
)
|
||
|
)
|
||
|
);
|
||
|
}
|
||
|
}
|