AzuraCast/src/Radio/Remote/AbstractRemote.php

96 lines
2.6 KiB
PHP

<?php
declare(strict_types=1);
namespace App\Radio\Remote;
use App\Container\EntityManagerAwareTrait;
use App\Container\LoggerAwareTrait;
use App\Entity\StationRemote;
use GuzzleHttp\Client;
use GuzzleHttp\Promise\PromiseInterface;
use NowPlaying\AdapterFactory;
use NowPlaying\Enums\AdapterTypes;
use NowPlaying\Result\Result;
abstract class AbstractRemote
{
use LoggerAwareTrait;
use EntityManagerAwareTrait;
public function __construct(
protected Client $http_client,
protected AdapterFactory $adapterFactory
) {
}
public function getNowPlayingAsync(
StationRemote $remote,
bool $includeClients = false
): PromiseInterface {
$adapterType = $this->getAdapterType();
$npAdapter = $this->adapterFactory->getAdapter(
$adapterType,
$remote->getUrl()
);
$npAdapter->setAdminPassword($remote->getAdminPassword());
return $npAdapter->getNowPlayingAsync($remote->getMount(), $includeClients)->then(
function (Result $result) use ($remote) {
if (!empty($result->clients)) {
foreach ($result->clients as $client) {
$client->mount = 'remote_' . $remote->getId();
}
}
$this->logger->debug('NowPlaying adapter response', ['response' => $result]);
$remote->setListenersTotal($result->listeners->total);
$remote->setListenersUnique($result->listeners->unique ?? 0);
$this->em->persist($remote);
return $result;
}
);
}
abstract protected function getAdapterType(): AdapterTypes;
/**
* Return the likely "public" listen URL for the remote.
*
* @param StationRemote $remote
*/
public function getPublicUrl(StationRemote $remote): string
{
$custom_listen_url = $remote->getCustomListenUrl();
return (!empty($custom_listen_url))
? $custom_listen_url
: $this->getRemoteUrl($remote, $remote->getMount());
}
/**
* Format and return a URL for the remote path.
*
* @param StationRemote $remote
* @param string|null $customPath
*/
protected function getRemoteUrl(StationRemote $remote, ?string $customPath = null): string
{
$uri = $remote->getUrlAsUri();
if (!empty($customPath)) {
return (string)$uri->withPath(
rtrim($uri->getPath(), '/')
. '/'
. ltrim($customPath, '/')
);
}
return (string)$uri;
}
}