Last active
April 16, 2020 18:50
-
-
Save spinitron/1950987cf8deb1013a350a698268e6e0 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/* | |
* Reverse proxy to terminate HTTP and forward a "Now playing" update to an RDS via UDP. | |
* | |
* Use this to push metadata to an RDS encoder. Run the script on an HTTPS server that can be | |
* reached from the Internet, e.g. in your DMZ or on a hardened server, that can itself reach | |
* the RDS encoder over a secure private LAN, e.g. on a different network interface from the | |
* web server. | |
* | |
* Send the Now Playing message in the "text" query parameter, e.g. configure a Spinitron | |
* metadata push template like this | |
* | |
* https://yourserver.foo/path/to/RDS-proxy.php?text=%an% - %sn% | |
* | |
* This script has no client authentication. You could check $_SERVER['REMOTE_ADDR'] for | |
* Spinitron's addresses. Since you are using HTTPS, you could add a secret key in a query | |
* parameter, e.g. set the push template | |
* | |
* https://example.foo/script/path.php?key=my-secret-key&text=%an% - %sn% | |
* | |
* and check that $_GET['key'] === 'my-secret-key'. Or you could check basic auth and set | |
* username and password in Spinitron. There are many ways. | |
*/ | |
// RDS network coordinates. You could send these from Spinitron to save configuring them here. | |
$rdsAddress = '127.0.0.1'; | |
$rdsPort = 5001; | |
// Text to display on the car radio. Inthis example it's sent in the "text" URI query param. | |
$displayText = $_GET['text']; | |
// Convert text encoding if needed. Spinitron sends UTF-8. Idk if the RDS encoder expects a | |
// specific encoding or if it is transparent, in which case what car radios expect. | |
$displayText = iconv('UTF-8', 'CP1252//TRANSLIT', $displayText); | |
// Form the commands to send to the RDS terminal server. We could also truncate over-long messages | |
// but I think they do no harm. How to terminate the command? CR or LF, or both, what order, how many? | |
$message = "DPSTEXT=$displayText\r\n"; | |
// Make sure strlen() returns the byte length. | |
ini_set('mbstring.func_overload', 0); | |
$sentBytes = socket_sendto(socket_create(AF_INET, SOCK_DGRAM, SOL_UDP), | |
$message, strlen($message), 0, $rdsAddress, $rdsPort); | |
echo "Sent $sentBytes bytes to udp:$rdsAddress:$rdsPort\r\n" . addcslashes($message, "\x00..\x1f\x7f") . "\r\n"; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment