diff --git a/frontend/src/components/Admin/Stations/Form/StreamersForm.vue b/frontend/src/components/Admin/Stations/Form/StreamersForm.vue index 15b9304bf..d91d48cf2 100644 --- a/frontend/src/components/Admin/Stations/Form/StreamersForm.vue +++ b/frontend/src/components/Admin/Stations/Form/StreamersForm.vue @@ -90,6 +90,27 @@ + + + + set(self::DJ_PORT, $port); } + public const DJ_PORT_SECONDARY = 'dj_port_decondary'; + + public function getDjPortSecondary(): ?int + { + return Types::intOrNull($this->get(self::DJ_PORT_SECONDARY)); + } + + public function setDjPortSecondary(?int $port): void + { + $this->set(self::DJ_PORT_SECONDARY, $port); + } + public const TELNET_PORT = 'telnet_port'; public function getTelnetPort(): ?int diff --git a/src/Radio/Backend/Liquidsoap.php b/src/Radio/Backend/Liquidsoap.php index 45e540945..a1b765c3f 100644 --- a/src/Radio/Backend/Liquidsoap.php +++ b/src/Radio/Backend/Liquidsoap.php @@ -59,6 +59,27 @@ final class Liquidsoap extends AbstractLocalAdapter return $frontendPort + 5; } + /** + * Returns the port used for a second DJs/Streamers to connect to LiquidSoap for broadcasting. + * + * @param Station $station + * + * @return int The port number to use for this station. + */ + public function getStreamPortSecondary(Station $station): int + { + $djPortSecondary = $station->getBackendConfig()->getDjPortSecondary(); + if (null !== $djPortSecondary) { + return $djPortSecondary; + } + + // Default to frontend port + 7 + $frontendConfig = $station->getFrontendConfig(); + $frontendPort = $frontendConfig->getPort() ?? (8000 + (($station->getId() - 1) * 10)); + + return $frontendPort + 7; + } + /** * Execute the specified remote command on LiquidSoap via the telnet API. * diff --git a/src/Radio/Backend/Liquidsoap/ConfigWriter.php b/src/Radio/Backend/Liquidsoap/ConfigWriter.php index ce3f9d210..4d46fa751 100644 --- a/src/Radio/Backend/Liquidsoap/ConfigWriter.php +++ b/src/Radio/Backend/Liquidsoap/ConfigWriter.php @@ -1030,7 +1030,41 @@ final class ConfigWriter implements EventSubscriberInterface # Live Broadcasting live = input.harbor({$harborParams}) + LIQ + ); + + // Live Secondary Port + $streamPortSecondary = $this->liquidsoap->getStreamPortSecondary($station); + // Paramètres pour live Secondary + $harborSecondary_params = [ + '"' . self::cleanUpString($dj_mount) . '"', // Assurez-vous que $dj_mount est défini correctement + 'id = "input_streamer_live_secondary"', // ID unique pour live1 + 'port = ' . $streamPortSecondary, // Utilisation de getStreamPort1 pour le port + 'auth = dj_auth', // Authentification, assurez-vous que 'dj_auth' est correctement défini + 'icy = true', // Paramètres ICY + 'icy_metadata_charset = "' . $charset . '"', // Charset pour les métadonnées ICY, assurez-vous que $charset est défini + 'metadata_charset = "' . $charset . '"', // Charset pour les métadonnées, assurez-vous que $charset est défini + 'on_connect = live_connected', // Action à la connexion + 'on_disconnect = live_disconnected', // Action à la déconnexion + ]; + + // Ajouter des paramètres de buffer si nécessaire + $djBuffer = $settings->getDjBuffer(); // Assurez-vous que $settings est défini et a une méthode getDjBuffer + if (0 !== $djBuffer) { + $harborSecondary_params[] = 'buffer = ' . self::toFloat($djBuffer); + $harborSecondary_params[] = 'max = ' . self::toFloat(max($djBuffer + 5, 10)); + } + + // Concaténer les paramètres pour former la chaîne de configuration live1 + $harborSecondaryParams = implode(', ', $harborSecondary_params); + + // Ajout de la configuration live1 au fichier de configuration LiquidSoap + // Assurez-vous que cette ligne est placée au bon endroit dans votre script pour écrire dans le fichier de configuration + $event->appendBlock("live1 = input.harbor({$harbor1Params})\n"); + + $event->appendBlock( + <<setBackendConfig($backendConfig); } + $djPortSecondary = $backendConfig->getDjPortSecondary(); + if ($force || null === $djPortSecondary) { + $backendConfig->setDjPortSecondary($basePort + 7); + $station->setBackendConfig($backendConfig); + } + $telnetPort = $backendConfig->getTelnetPort(); if ($force || null === $telnetPort) { $backendConfig->setTelnetPort($basePort + 4); @@ -374,6 +380,11 @@ final class Configuration $usedPorts[$port] = $stationReference; $usedPorts[$port + 1] = $stationReference; } + if (!empty($backendConfig['dj_port_secondary'])) { + $port = (int)$backendConfig['dj_port_secondary']; + $usedPorts[$port] = $stationReference; + $usedPorts[$port + 1] = $stationReference; + } if (!empty($backendConfig['telnet_port'])) { $port = (int)$backendConfig['telnet_port']; $usedPorts[$port] = $stationReference; diff --git a/src/Validator/Constraints/StationPortCheckerValidator.php b/src/Validator/Constraints/StationPortCheckerValidator.php index b463b2242..ca8182ed9 100644 --- a/src/Validator/Constraints/StationPortCheckerValidator.php +++ b/src/Validator/Constraints/StationPortCheckerValidator.php @@ -32,6 +32,7 @@ final class StationPortCheckerValidator extends ConstraintValidator $portsToCheck = [ 'frontend_config_port' => $frontendConfig->getPort(), 'backend_config_dj_port' => $backendConfig->getDjPort(), + 'backend_config_dj_port_secondary' => $backendConfig->getDjPortSecondary(), 'backend_config_telnet_port' => $backendConfig->getTelnetPort(), ];