ReCast is a multi platform restreaming tool, you can stream with one servers to multiple services
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

135 lines
3.2 KiB

<?php
namespace App\Component\Nginx;
use App\Component\ServiceManager;
use App\Entity\Endpoint;
use App\Repository\StreamsRepository;
/**
* Class ConfigGenerator
* @author Soner Sayakci <shyim@posteo.de>
*/
class ConfigGenerator
{
private const VHOST = "\t\tapplication %s {
\t\t\tlive on;
\t\t\tmeta copy;
%s
\t\t}";
private const NGINX_CONF = "worker_processes 1;
pid /run/nginx-rtmp.pid;
events {
\tworker_connections 1024;
}
rtmp {
\tserver {
\t\tlisten 1935;
%s
\t}
}
http {
\tserver {
\t\tlisten 127.0.0.1:26765;
\t\tlocation /stat {
\t\t\trtmp_stat all;
\t\t}
\t}
}
";
/**
* @var StreamsRepository
*/
private $repository;
/**
* @var ServiceManager
*/
private $manager;
/**
* @var string
*/
private $nginxConfigFolder;
/**
* @var string
*/
private $appHost;
/**
* ConfigGenerator constructor.
* @param StreamsRepository $repository
* @param ServiceManager $manager
* @param string $nginxConfigFolder
* @param string $appHost
* @author Soner Sayakci <shyim@posteo.de>
*/
public function __construct(StreamsRepository $repository, ServiceManager $manager, string $nginxConfigFolder, string $appHost)
{
$this->repository = $repository;
$this->manager = $manager;
$this->nginxConfigFolder = $nginxConfigFolder;
$this->appHost = $appHost;
}
/**
* @author Soner Sayakci <shyim@posteo.de>
* @throws \Exception
*/
public function generate(): void
{
if (!file_exists($this->nginxConfigFolder)) {
if (!mkdir($this->nginxConfigFolder, 7777, true) && !is_dir($this->nginxConfigFolder)) {
throw new \RuntimeException(sprintf('Directory "%s" was not created', $this->nginxConfigFolder));
}
}
$vhost = '';
foreach ($this->getStreams() as $stream) {
if ($stream->getEndpoints()->count()) {
$configPush = [];
$configPush[] = "\n\t\t\t# Events";
$configPush[] = "\t\t\ton_publish " . $this->appHost . '/events/onPublish;';
$configPush[] = "\t\t\ton_done " . $this->appHost . '/events/onDone;';
$configPush[] = "\n\t\t\t# Pushes";
foreach ($stream->getEndpoints() as $endpoint) {
$configPush[] = "\t\t\tpush " . $this->buildUrl($endpoint) . ';';
}
$applicationName = sprintf('%s/%s', $stream->getUser()->getUsername(), $stream->getName());
$vhost .= sprintf(self::VHOST, $applicationName, implode("\n", $configPush));
}
}
file_put_contents($this->nginxConfigFolder . '/nginx.conf', sprintf(self::NGINX_CONF, $vhost));
}
/**
* @return \App\Entity\Streams[]
* @author Soner Sayakci <shyim@posteo.de>
*/
private function getStreams(): array
{
return $this->repository->getActiveStreams();
}
/**
* @param Endpoint $endpoint
* @return string
* @author Soner Sayakci <shyim@posteo.de>
*/
private function buildUrl(Endpoint $endpoint): string
{
$service = $this->manager->getServiceByName($endpoint->getType());
return $service->buildStreamUrl($endpoint);
}
}