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 @@
+
+
+ {{
+ $gettext('No other program can be using this port. Leave blank to automatically assign a port.')
+ }}
+
+ {{
+ $gettext('Note: the port after this one will automatically be used for legacy connections.')
+ }}
+
+
+
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(),
];