AzuraCast/src/Webhook/LocalWebhookHandler.php

84 lines
2.4 KiB
PHP

<?php
declare(strict_types=1);
namespace App\Webhook;
use App\Entity;
use App\Environment;
use App\Service\NChan;
use GuzzleHttp\Client;
use Monolog\Logger;
use Psr\SimpleCache\CacheInterface;
use RuntimeException;
use const JSON_PRETTY_PRINT;
class LocalWebhookHandler
{
public const NAME = 'local';
public function __construct(
protected Logger $logger,
protected Client $httpClient,
protected CacheInterface $cache,
protected Entity\Repository\SettingsRepository $settingsRepo
) {
}
public function dispatch(
Entity\Station $station,
Entity\Api\NowPlaying\NowPlaying $np
): void {
// Write local static file that the video stream (and other scripts) can use.
$this->logger->debug('Writing local nowplaying text file...');
$config_dir = $station->getRadioConfigDir();
$np_file = $config_dir . '/nowplaying.txt';
$np_text = implode(
' - ',
array_filter(
[
$np->now_playing->song->artist ?? null,
$np->now_playing->song->title ?? null,
]
)
);
if (empty($np_text)) {
$np_text = $station->getName();
}
// Atomic rename to ensure the file is always there.
file_put_contents($np_file . '.new', $np_text);
rename($np_file . '.new', $np_file);
// Write JSON file to disk so nginx can serve it without calling the PHP stack at all.
$this->logger->debug('Writing static nowplaying text file...');
$static_np_dir = Environment::getInstance()->getTempDirectory() . '/nowplaying';
if (!is_dir($static_np_dir) && !mkdir($static_np_dir) && !is_dir($static_np_dir)) {
throw new RuntimeException(sprintf('Directory "%s" was not created', $static_np_dir));
}
$static_path = $static_np_dir . '/' . $station->getShortName() . '.json';
file_put_contents(
$static_path,
json_encode($np, JSON_THROW_ON_ERROR | JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES)
);
// Send Nchan notification.
if (NChan::isSupported()) {
$this->logger->debug('Dispatching Nchan notification...');
$this->httpClient->post(
'http://localhost:9010/pub/' . urlencode($station->getShortName()),
[
'json' => $np,
]
);
}
}
}