feat: add configurable HLS CORS allowlists

This commit is contained in:
root
2026-09-04 22:28:33 +02:00
parent 6fae6a3a43
commit 9710e8d228
24 changed files with 879 additions and 7 deletions
+57
View File
@@ -0,0 +1,57 @@
<?php
declare(strict_types=1);
namespace Plugin\AzuraCastOnDemandHls\Command;
use App\Console\Command\CommandAbstract;
use App\Entity\Repository\StationRepository;
use App\Entity\Station;
use App\Nginx\Nginx;
use Plugin\AzuraCastOnDemandHls\Repository\CorsConfigurationRepository;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Style\SymfonyStyle;
abstract class AbstractCorsCommand extends CommandAbstract
{
public function __construct(
protected readonly StationRepository $stationRepository,
protected readonly CorsConfigurationRepository $corsConfiguration,
private readonly Nginx $nginx,
) {
parent::__construct();
}
protected function configureStationArgument(): void
{
$this->addArgument('station', InputArgument::REQUIRED, 'Station ID or short name.');
}
protected function findStation(InputInterface $input, SymfonyStyle $io): ?Station
{
$station = $this->stationRepository->findByIdentifier((string)$input->getArgument('station'));
if (!$station instanceof Station) {
$io->error('Station not found.');
return null;
}
return $station;
}
protected function reloadNginx(Station $station, SymfonyStyle $io): void
{
$this->nginx->writeConfiguration($station, reloadIfChanged: true);
$io->note('Station Nginx configuration was regenerated; Nginx reloads only when it changed.');
}
/** @param list<string> $origins */
protected function renderOrigins(SymfonyStyle $io, array $origins): void
{
if ([] === $origins) {
$io->writeln('No cross-site origins are allowed. Same-origin playback remains available.');
return;
}
$io->listing($origins);
}
}