AzuraCast/src/Radio/Adapters.php

143 lines
3.7 KiB
PHP

<?php
declare(strict_types=1);
namespace App\Radio;
use App\Container\ContainerAwareTrait;
use App\Entity\Station;
use App\Entity\StationRemote;
use App\Exception\NotFoundException;
use App\Exception\StationUnsupportedException;
use App\Radio\Backend\Liquidsoap;
use App\Radio\Enums\AdapterTypeInterface;
use App\Radio\Enums\BackendAdapters;
use App\Radio\Enums\FrontendAdapters;
use App\Radio\Enums\RemoteAdapters;
/**
* Manager class for radio adapters.
*/
final class Adapters
{
use ContainerAwareTrait;
public function getFrontendAdapter(Station $station): ?Frontend\AbstractFrontend
{
$className = $station->getFrontendType()->getClass();
return (null !== $className && $this->di->has($className))
? $this->di->get($className)
: null;
}
/**
* @throws StationUnsupportedException
*/
public function requireFrontendAdapter(Station $station): Frontend\AbstractFrontend
{
$frontend = $this->getFrontendAdapter($station);
if (null === $frontend) {
throw StationUnsupportedException::generic();
}
return $frontend;
}
/**
* @param bool $checkInstalled
* @return mixed[]
*/
public function listFrontendAdapters(bool $checkInstalled = false): array
{
return $this->listAdaptersFromEnum(FrontendAdapters::cases(), $checkInstalled);
}
public function getBackendAdapter(Station $station): ?Liquidsoap
{
$className = $station->getBackendType()->getClass();
return (null !== $className && $this->di->has($className))
? $this->di->get($className)
: null;
}
/**
* @throws StationUnsupportedException
*/
public function requireBackendAdapter(Station $station): Liquidsoap
{
$backend = $this->getBackendAdapter($station);
if (null === $backend) {
throw StationUnsupportedException::generic();
}
return $backend;
}
/**
* @param bool $checkInstalled
* @return mixed[]
*/
public function listBackendAdapters(bool $checkInstalled = false): array
{
return $this->listAdaptersFromEnum(BackendAdapters::cases(), $checkInstalled);
}
public function getRemoteAdapter(StationRemote $remote): Remote\AbstractRemote
{
$className = $remote->getType()->getClass();
if ($this->di->has($className)) {
return $this->di->get($className);
}
throw new NotFoundException(
sprintf('Adapter not found: %s', $className)
);
}
/**
* @return mixed[]
*/
public function listRemoteAdapters(): array
{
return $this->listAdaptersFromEnum(RemoteAdapters::cases());
}
/**
* @param array<AdapterTypeInterface> $cases
* @param bool $checkInstalled
* @return mixed[]
*/
private function listAdaptersFromEnum(array $cases, bool $checkInstalled = false): array
{
$adapters = [];
foreach ($cases as $adapter) {
$adapters[$adapter->getValue()] = [
'enum' => $adapter,
'name' => $adapter->getName(),
'class' => $adapter->getClass(),
];
}
if ($checkInstalled) {
return array_filter(
$adapters,
function ($adapterInfo) {
if (null === $adapterInfo['class']) {
return true;
}
/** @var AbstractLocalAdapter $adapter */
$adapter = $this->di->get($adapterInfo['class']);
return $adapter->isInstalled();
}
);
}
return $adapters;
}
}