{"id":527,"date":"2026-03-24T16:26:49","date_gmt":"2026-03-24T16:26:49","guid":{"rendered":"https:\/\/blog.nibelheim.fr\/?p=527"},"modified":"2026-03-24T16:26:49","modified_gmt":"2026-03-24T16:26:49","slug":"radio-auto-hebergee-la-totale-avec-vps","status":"publish","type":"post","link":"https:\/\/blog.nibelheim.fr\/?p=527","title":{"rendered":"Radio auto-h\u00e9berg\u00e9e : la totale (avec VPS)"},"content":{"rendered":"\n<p>Ceci est une mise \u00e0 jour se rapportant \u00e0 l&#8217;h\u00e9bergement d&#8217;une radio sur votre propre serveur.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Logiciels utilis\u00e9s<\/h2>\n\n\n\n<p>Apr\u00e8s avoir fait des avant-arri\u00e8re, voici ce avec quoi j&#8217;h\u00e9berge ma radio. Ce ne fut pas sans mal, mais apr\u00e8s plus d&#8217;un an en fonctionnel, il est content le monsieur!<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>mpd<\/strong> est toujours utilis\u00e9 pour cr\u00e9er le flux audio, et contr\u00f4l\u00e9 avec <strong>mpc<\/strong>, qui est une commande qui va avec;<\/li>\n\n\n\n<li><strong>ncmpc<\/strong> est l&#8217;\u00e9diteur de playlists que j&#8217;utilise en console. Il peut \u00eatre remplac\u00e9 par l&#8217;ex\u00e9cutable standalone ympc, qui cr\u00e9e une interface Web, mais \u00e7a me fout le bazar avec mes serveurs Web d\u00e9j\u00e0 tournant.<\/li>\n\n\n\n<li><strong>icecast2<\/strong> est finalement utilis\u00e9 pour r\u00e9cup\u00e9rer les informations genre titre, artiste, etc. qui m&#8217;int\u00e9ressent; mpd permet th\u00e9oriquement de le faire, mais je n&#8217;ai absolument jamais r\u00e9ussi \u00e0 r\u00e9cup\u00e9rer \u00e7a de mani\u00e8re fiable.<\/li>\n\n\n\n<li><strong>nginx<\/strong> me permet de cr\u00e9er mon propre site Ou\u00e8be, sur lequel j&#8217;ai bien entendu l&#8217;interface pour lancer\/arr\u00eater le flux audio en tant que client, mais aussi l&#8217;affichage des infos susnomm\u00e9es.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Configuration mpd<\/h2>\n\n\n\n<p>Voici les points-cl\u00e9s de la configuration de mpd dans <strong>\/etc\/mpd.conf <\/strong>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong>music_directory \"\/media\/Radio\"<\/strong> # plusieurs sous-niveaux de dossiers, aucun probl\u00e8me\n<strong>playlist_directory \"\/media\/Radio\"<\/strong> # les droits sont relou pour changer la playlist dans ncmpc, je dois passer par du 777 puis retour \u00e0 644\n<strong>metadata_to_use \"artist,album,title,name\"<\/strong> # pour l'affichage sur la page web, requis!\n<strong>follow_outside_symlinks \"yes\" <\/strong># j'ai trouv\u00e9 \u00e7a pratique mais c'est vous qui voyez\n<strong>follow_inside_symlinks \"yes\"<\/strong> # idem\n# Ci-apr\u00e8s le truc le plus important : la description de la source audio\n<strong>audio_output {\n    type \"shout\"\n    encoder \"mp3\"\n    name \"Petit nom comme vous voulez\"\n    host \"localhost\"\n    port \"60099\"\n    mount \"\/monstream\" <\/strong># SUPER important pour pointer vers le stream dans Icecast2\n    <strong>password \"MonSuperMotDePasse\" <\/strong># N\u00e9cessaire pour Icecast2\n    <strong>bitrate \"192\"\n    format \"44100:16:2\"\n    protocol \"icecast2\"\n    user \"source\"\n    genre \"VGM\"<\/strong> #Tout sauf obligatoire\n<strong>}<\/strong><\/code><\/pre>\n\n\n\n<p>Le reste est par d\u00e9faut.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Configuration Icecast2 (source)<\/h2>\n\n\n\n<p>Attention! La configuration d&#8217;Icecast que j&#8217;utilise est sp\u00e9cifique : comme je ne veux pas que ma radio tape directement sur le serveur qui est dans mon salon, j&#8217;utilise un VPS qui faire relais, c&#8217;est-\u00e0-dire que la radio tourne bien sur mon serveur, mais ne re\u00e7oit qu&#8217;un seul &#8220;client&#8221;, mon VPS.<br>Le VPS va ensuite servir de relais et encaisser le trafic issu d&#8217;Internet (nombre de clients mais aussi attaques potentielles).<br>Ceci n\u00e9cessite d&#8217;avoir 2 Icecast 2 : un en source sur mon serveur, et un second en relais sur mon VPS.<br>Voyons donc la configuration Icecast2 &#8220;source&#8221;, sur mon serveur.<br><br>Points-cl\u00e9s de la configuration de Icecast2 dans <strong>\/etc\/icecast2\/icecast.xml<\/strong> :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong>&lt;authentication&gt;\n    &lt;source-password&gt;IcecastSourceModpass&lt;\/source-password&gt;\n    &lt;relay-password&gt;IcecastRelayModpass&lt;\/relay-password&gt;\n    &lt;admin-user&gt;admin&lt;\/admin-user&gt;\n    &lt;admin-password&gt;IcecastAdminModpass&lt;\/admin-password&gt;\n&lt;\/authentication&gt;\n\n&lt;hostname&gt;domainesource.machin.com&lt;\/hostname&gt;\n\n&lt;listen-socket&gt;\n    &lt;port&gt;60099&lt;\/port&gt;\n&lt;\/listen-socket&gt;\n\n&lt;http-header&gt;\n    &lt;header name=\"Access-Control-Allow-Origin\" value=\"*\" \/&gt;\n&lt;http-header&gt;<\/strong><\/code><\/pre>\n\n\n\n<p>Note : le hostname peut \u00eatre <em>[IP publique de votre serveur] <\/em>OU <em>[domaine genre domaine.machin.com] <\/em>OU <em>[localhost si vous tournez en local 100%]<\/em>.<br>Moi, comme je suis sur le Web, j&#8217;utilise un domaine tiers, qui ne sert QUE au VPS <em>(qui est la &#8220;vraie&#8221; interface web)<\/em> \u00e0 acc\u00e9der \u00e0 la source et aux fichiers de statut <em>(musique en cours)<\/em>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Configuration Icecast2 (relais)<\/h2>\n\n\n\n<p>Maintenant, pour la partie relais (qui est sur le VPS), toujours dans <strong>\/etc\/icecast2\/icecast.xml<\/strong> :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong>&lt;authentication&gt;\n    &lt;source-password&gt;IcecastSourceModpass&lt;\/source-password&gt;\n    &lt;relay-password&gt;IcecastRelayModpass&lt;\/relay-password&gt;\n    &lt;admin-user&gt;admin&lt;\/admin-user&gt;\n    &lt;admin-password&gt;IcecastAdminModpass&lt;\/admin-password&gt;\n&lt;\/authentication&gt;\n\n&lt;hostname&gt;radioweb.machin.com&lt;\/hostname&gt;\n\n&lt;listen-socket&gt;\n    &lt;port&gt;60000&lt;\/port&gt;\n&lt;\/listen-socket&gt;\n\n&lt;http-header&gt;\n    &lt;header name=\"Access-Control-Allow-Origin\" value=\"*\" \/&gt;\n&lt;http-header&gt;\n\n&lt;relay&gt;\n    &lt;server&gt;&#91;adresse IP serveur]&lt;\/server&gt;\n    &lt;port&gt;60099&gt;\/port&gt;\n    &lt;mount&gt;\/monstream&lt;\/mount&gt;\n    &lt;localmount&gt;\/monstream&lt;\/mount&gt;\n    &lt;on-demand&gt;0&lt;\/on-demand&gt;\n    &lt;relay-shoutcast-metadata&gt;0&lt;\/relay-shoutcast-metadata&gt;\n&lt;\/relay&gt;\n<\/strong><\/code><\/pre>\n\n\n\n<p>Notes :<br>&#8211; <strong>source-password<\/strong> et <strong>relay-password <\/strong>sont \u00e9videmment les m\u00eames entre les deux instances d&#8217;Icecast2 (serveur et VPS).<br>&#8211; <strong>hostname<\/strong> devient celui du <strong>VPS<\/strong>, donc le &#8220;vrai domaine&#8221; via lequel votre radio sera accessible depuis le Web. D&#8217;ailleurs, il est aussi tout \u00e0 fait possible de n&#8217;utiliser QUE des IP au lieu de domaines, si vous le souhaitez!<br>&#8211; <strong>port<\/strong> passe \u00e0 60000, question de choix personnel.<br>&#8211; dans la partie <strong>Relay<\/strong> :<br>    &gt; le <strong>server<\/strong> ne prend pas d&#8217;adresse HTTPS. Comme je refuse de d\u00e9brayer le HTTPS pour mon domaine de serveur source, je rentre l&#8217;<strong>IP de chez moi<\/strong>.<br>    &gt; le <strong>port<\/strong> est celui que nous avons d\u00e9clar\u00e9 dans la partie source, donc 60099.<br>    &gt; <strong>mount<\/strong> est le chemin indiqu\u00e9 dans mpd.conf sur le serveur (ici <em><strong>monstream<\/strong><\/em>). Vous pouvez transformer \u00e7a entre <strong>mount<\/strong> et <strong>local-mount<\/strong> (genre \/monstream en mount et \/monputaindestream sur local-mount).<br>    &gt; <strong>relay-shoutcast-metadata<\/strong> semble \u00eatre un levier int\u00e9ressant pour plus tard, vu comment je m&#8217;emmerde pour la suite, vous verrez. Mais pour le moment, on reste sur un truc qui marche avant de partir sur de l&#8217;exp\u00e9rimental.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Fichiers statut et routines : source<\/h2>\n\n\n\n<p>Bien! Maintenant que nos source et relais sont configur\u00e9s, nous allons passer \u00e0 la configuration des pr\u00e9requis pour que \u00e7a fonctionne. Sur notre serveur source, celui qui fait tourner MPD, nous allons donc avoir besoin de deux fichiers \u00e0 r\u00e9cup\u00e9rer par le VPS : <strong>status-json.xsl<\/strong>, et<strong> radio-track.json<\/strong> qui contient les informations courantes de la piste en cours.<\/p>\n\n\n\n<p>status-json.xsl est g\u00e9r\u00e9 automatiquement par Icecast2 et est g\u00e9n\u00e9r\u00e9 selon la config de ce dernier dans <strong>\/usr\/share\/icecast2\/web\/status-json.xsl<\/strong> . On se garde \u00e7a sous le coude pour plus tard.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">radio-track.json : script de cr\u00e9ation<\/h3>\n\n\n\n<p>radio-track.json est issu d&#8217;un script maison qui va venir r\u00e9cup\u00e9rer les informations ID3 <em>(artiste, album&#8230;) <\/em>et les mettre dans un fichier json, lequel sera affich\u00e9 sur notre interface &#8220;officielle&#8221; de radio.<\/p>\n\n\n\n<p>Pour la suite, nous partirons donc du principe que le script est <strong>\/home\/user\/scripts\/triggerradioupdate.sh<\/strong>, et dispose des droits +x.<br>Son contenu est le suivant :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong>#!\/bin\/bash\ntouch \/run\/radio\/radio-track.json\n\nwhile mpc idle player; do\nOUT=\"\/run\/radio\/radio-track.json\"\nartist=$(mpc -f %artist% current)\ntitle=$(mpc -f %title% current)\nalbum=$(mpc -f %album% current)\n\n# Fallbacks\nartist=${artist:-Inconnu}\ntitle=${title:-Inconnu}\nalbum=${album:-Inconnu}\n\ncat &gt; \"$OUT\" &lt;&lt;EOF\n{\n  \"artist\": \"$(printf '%s' \"$artist\" | sed 's\/\"\/\\\\\"\/g')\",\n  \"title\": \"$(printf '%s' \"$title\" | sed 's\/\"\/\\\\\"\/g')\",\n  \"album\": \"$(printf '%s' \"$album\" | sed 's\/\"\/\\\\\"\/g')\"\n}<\/strong>\n\n<strong>EOF\ndone<\/strong><\/code><\/pre>\n\n\n\n<p>Notes :<br>&#8211; le fichier radio-track.json est cr\u00e9\u00e9 dans <strong>\/run\/radio\/,<\/strong> qui est un syst\u00e8me de fichier volatile, en RAM, et dispara\u00eet donc \u00e0 chaque reboot. Ceci permet \u00e0 chaque mise \u00e0 jour de ne pas &#8220;user&#8221; le support genre carte SD ou SSD.<br>&#8211; selon ce que vous voulez afficher niveau tags ID3, il faudra les changer dans la configuration de MPD, dans <strong>metadata_to_use<\/strong>.<br>&#8211; le script attend que mpc renvoie un \u00e9tat &#8220;idle&#8221;<em> (entre deux chansons)<\/em> pour appeler le script de mise \u00e0 jour des infos li\u00e9es \u00e0 la piste courante. C&#8217;est la seule mani\u00e8re l\u00e9g\u00e8re et un peu propre que j&#8217;ai trouv\u00e9&#8230;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">radio-track.json : service d&#8217;appel<\/h3>\n\n\n\n<p>J&#8217;ai essay\u00e9 sans passer par un service, genre <em><strong>bash script.sh &amp;<\/strong><\/em> pour lancer en background, mais cela finit immanquablement par quitter le script. De d\u00e9pit, ChatGPT m&#8217;a conseill\u00e9 de passer par un service d&#8217;appel et de surveillance, qui relancera d\u00e8s qu&#8217;il en aura besoin.<br>Il est recommand\u00e9 d&#8217;ajouter votre utilisateur au groupe media, dont beaucoup d&#8217;applications se servent.<br>Notez qu&#8217;il est possible de passer par une t\u00e2che cron, mais l&#8217;unit\u00e9 est la minute. A vous de voir.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong>sudo usermod -aG media $USER\nsudo nano \/etc\/systemd\/system\/radio-update.service<\/strong><\/code><\/pre>\n\n\n\n<p>Contenu de radio-update.service :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong>&#91;Unit]\nDescription=Radio Track Updater\nAfter=network.target mpd.service\nRequires=mpd.service\n\n&#91;Service]\nExecStart=\/home\/user\/scripts\/triggerradioupdate.sh\nRestart=always\nRestartSec=2\nUser=user\nGroup=media\n\nRuntimeDirectory=radio\nRuntimeDirectoryMode=0775\n\n&#91;Install]\nWantedBy=multi-user.target<\/strong><\/code><\/pre>\n\n\n\n<p>N&#8217;oubliez pas de mettre \u00e0 jour ExecStart et User!<br>Assurez-vous que MPD fonctionne et tourne <em>(via la simple commande mpc qui vous affichera le titre de la chanson en cours)<\/em>, sans quoi notre service ne d\u00e9marrera pas.<br>Puis :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong>sudo systemctl daemon-reexec\nsudo systemctl daemon-reload\nsudo systemctl enable radio-update\nsudo service radio-update start<\/strong><\/code><\/pre>\n\n\n\n<p>Ensuite, v\u00e9rifiez que \u00e7a fonctionne via :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code><strong>cat \/run\/radio\/radio-track.json<\/strong><\/code><\/pre>\n\n\n\n<p>Normalement, vous devriez avoir un fichier vide : tout va bien! Il faudra patienter jusqu&#8217;au passage au prochain morceau pour que les informations soient \u00e9crites.<br>Si cependant vous avez un &#8220;No such file or directory&#8221;, c&#8217;est que le service ne s&#8217;est pas lanc\u00e9. Vous pouvez voir pourquoi avec <strong>sudo service radio-update status<\/strong>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Configuration Nginx : source<\/h2>\n\n\n\n<p>Maintenant que nos fichiers originaux sont pr\u00e9par\u00e9s, nous allons donc passer \u00e0 leur mise \u00e0 disposition.<br>Notes :<br>&#8211; Pour l&#8217;exemple, j&#8217;utilise comme domaine qui pointe directement sur mon serveur &#8220;maison&#8221; le domaine <strong>domainesource.machin.com<\/strong> .<br>&#8211; Il est entendu que vous avez g\u00e9n\u00e9r\u00e9 pour cela les certificats SSL comme des grands via certbot et qu&#8217;ils sont plac\u00e9s dans <strong>\/etc\/letsencrypt\/live\/<\/strong> <em>(le truc par d\u00e9faut)<\/em>.<br>&#8211; Toujours pour l&#8217;exemple, la racine du site Web est <strong>\/website\/<\/strong> <em>(\u00e0 la racine du syst\u00e8me de fichiers).<\/em><br>&#8211; Les permissions pour les fichiers dans \/website\/ sont mises \u00e0 <strong>755 root:root<\/strong> <em>(mais vous pouvez probablement mettre www-data:www-data en owner, moi, c&#8217;est en root et \u00e7a marche)<\/em>.<br>&#8211; Les ports <strong>443<\/strong> et <strong>80<\/strong> sont ouverts sur votre box, et le routage NAT est fait vers votre serveur maison.<br>&#8211; Vous savez activer\/d\u00e9sactiver un site Web dans Nginx.<\/p>\n\n\n\n<p>Fichier de configuration Nginx : <\/p>\n\n\n\n<div class=\"wp-block-file\"><a id=\"wp-block-file--media-d944759f-9e1c-4e9e-91b0-e1a1ccce2f13\" href=\"https:\/\/blog.nibelheim.fr\/wp-content\/uploads\/2026\/03\/nginx.radio_.source.txt\">nginx.radio.source<\/a><a href=\"https:\/\/blog.nibelheim.fr\/wp-content\/uploads\/2026\/03\/nginx.radio_.source.txt\" class=\"wp-block-file__button wp-element-button\" download aria-describedby=\"wp-block-file--media-d944759f-9e1c-4e9e-91b0-e1a1ccce2f13\">Download<\/a><\/div>\n\n\n\n<p><br>Globalement, dans \/website\/, vous n&#8217;aurez besoin que d&#8217;un seul fichier que nous allons cr\u00e9er par lien symbolique :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cd \/website\/\nsudo ln -s \/run\/radio\/radio-track.json .\/radio-track.json<\/code><\/pre>\n\n\n\n<p>Vous pouvez cr\u00e9er un fichier index.php, histoire de dire, mais gardez en t\u00eate que dans mon exemple, ce serveur &#8220;source&#8221; n&#8217;est pas destin\u00e9 \u00e0 servir d&#8217;interface, juste de source de donn\u00e9es.<br>Moi, par exemple, j&#8217;ai juste mis \u00e7a dans mon index.php :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;html>&lt;body>Present&lt;\/body>&lt;\/html><\/code><\/pre>\n\n\n\n<p>Histoire de savoir si \u00e7a marchait bien.<br>Mais vous me direz : attends, mais il devient quoi de radio-track.json et status-json.xsl?<br>Gr\u00e2ce au fichier de config nginx, nous avons fait en sorte qu&#8217;en tapant l&#8217;adresse <strong>https:\/\/domainesource.machin.com\/status-json.xsl <\/strong>, on atterrisse sur le status-json produit par Icecast2 <em>(gr\u00e2ce \u00e0 un proxy-pass, dans nginx, donc)<\/em>, et que <strong>https:\/\/domainesource.machin.com\/radio-track.json<\/strong> tombe sur le lien symbolique dans <strong>\/website\/radio-track.json<\/strong>, lui-m\u00eame pointant sur <strong>\/run\/radio\/radio-track.json<\/strong>.<br>Bien s\u00fbr, on a aussi fait en sorte de faire un proxy-pass sur h<strong>ttps:\/\/domainesource.machin.com\/monstream<\/strong> vers <strong>localhost:60099\/monstream<\/strong>, soit l&#8217;adresse que nous avons d\u00e9fini pour notre stream dans MPD et Icecast2 \ud83d\ude42<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Configuration Nginx : VPS (relais)<\/h2>\n\n\n\n<p>Allez, \u00e9tape suivante : configurer notre frontend, notre v\u00e9ritable interface, celle qui est sur le VPS.<br>Notes :<br>&#8211; Notre site Web, le vrai, celui qui va servir l&#8217;interface officielle de notre radio, est toujours dans <strong>\/website <\/strong><em>(mais sur le VPS, t&#8217;as pig\u00e9 Roger)<\/em><br>&#8211; Le domaine bidon utilis\u00e9 est ici <strong>radioweb.machin.com<\/strong>, en coh\u00e9rence avec la config Icecast plus haut.<br>Les certificats SSL sont cr\u00e9\u00e9s, et tout \u00e7a.<\/p>\n\n\n\n<div class=\"wp-block-file\"><a id=\"wp-block-file--media-918594be-aec4-4da5-b26e-076ee860b6af\" href=\"https:\/\/blog.nibelheim.fr\/wp-content\/uploads\/2026\/03\/nginx.radio_.relay_.txt\">nginx.radio.relay<\/a><a href=\"https:\/\/blog.nibelheim.fr\/wp-content\/uploads\/2026\/03\/nginx.radio_.relay_.txt\" class=\"wp-block-file__button wp-element-button\" download aria-describedby=\"wp-block-file--media-918594be-aec4-4da5-b26e-076ee860b6af\">Download<\/a><\/div>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Site Web<\/h2>\n\n\n\n<p>Pour ce qui est de notre interface, je vais vous fournir celui qui me sert actuellement, \u00e7a sera plus simple.<br>Dans un premier temps, nous avons donc un r\u00e9pertoire \/website\/, lequel va contenir les fichiers suivants :<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">radio-info.php<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?php\nheader('Content-Type: application\/json');\n\n$trackfile = 'https:\/\/<strong>domainesource.machin.com<\/strong>\/radio-track.json';\n$statusfile = 'https:\/\/<strong>domainesource.machin.com<\/strong>\/status-json.xsl';\n\n$artist = $title = $album = 'Inconnu';\n\nif ($json = @file_get_contents($trackfile))\n{\n    $track_data = json_decode($json, true);\n    if (is_array($track_data))\n    {\n        $artist = $track_data&#91;'artist'] ?? 'Inconnu';\n        $title = $track_data&#91;'title'] ?? 'Inconnu';\n        $album = $track_data&#91;'album'] ?? 'Inconnu';\n    }\n}\n\n$listeners = 0;\n\nif ($json = @file_get_contents($statusfile))\n{\n    $data = json_decode($json, true);\n    if (isset($data&#91;'icestats']&#91;'source']))\n    {\n        $sources = $data&#91;'icestats']&#91;'source']\n        if (isset($sources&#91;0]))\n        {\n            foreach ($sources as $src)\n            {\n                if (isset($src&#91;'listenurl']) &amp;&amp; str_ends_with($src&#91;'listenurl'], '\/<strong>monstream<\/strong>'))\n               {\n                   $listeners = $src&#91;'listeners'] ?? 0;\n                   break;\n            }\n        }\n    }\n    elseif (isset($sources&#91;'listenurl']) &amp;&amp; str_ends_with($sources&#91;'listenurl'], '\/<strong>monstream<\/strong>'))\n    {\n        $listeners = $sources&#91;'listeners'] ?? 0;\n    }\n}\n\necho json_encode(&#91;\n    'artist' => $artist,\n    'title' => $title,\n    'album' => $album,\n    'listeners' => $listeners\n]);\n?><\/code><\/pre>\n\n\n\n<p>(D\u00e9sol\u00e9 pour la mise en page, c&#8217;est vraiment daub\u00e9 WordPress pour le code).<br>Notes : pensez bien \u00e0 changer le \/<strong>monstream<\/strong> dans l&#8217;URL <strong>(en gras dans le code)<\/strong> ainsi que les <strong>adresses des json<\/strong> en d\u00e9but de script.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">index.php<\/h3>\n\n\n\n<p>Vu le c\u00f4t\u00e9 p\u00e9nible de la mise en page de WordPress, je vais donc vous inviter \u00e0 tout simplement aller faire un clic droit -> voir le code source sur ma radio, \u00e7a sera plus simple, sur <a href=\"https:\/\/radio.nibelheim.fr\">https:\/\/radio.nibelheim.fr<\/a> .<\/p>\n\n\n\n<p>Copiez donc ce code dans votre propre <strong>index.php<\/strong>, adaptez l&#8217;URL de votre stream, mettez-le dans \/<strong>websites<\/strong> sur votre VPS, mettez \u00e0 jour l&#8217;image de background, et vous voil\u00e0 tout pr\u00eats pour votre propre radio!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ceci est une mise \u00e0 jour se rapportant \u00e0 l&#8217;h\u00e9bergement d&#8217;une radio sur votre propre serveur. Logiciels utilis\u00e9s Apr\u00e8s avoir fait des avant-arri\u00e8re, voici ce avec quoi j&#8217;h\u00e9berge ma radio. Ce ne fut pas sans mal, mais apr\u00e8s plus d&#8217;un an en fonctionnel, il est content le monsieur! Configuration mpd [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8],"tags":[],"class_list":["post-527","post","type-post","status-publish","format-standard","hentry","category-raspberry-pi"],"_links":{"self":[{"href":"https:\/\/blog.nibelheim.fr\/index.php?rest_route=\/wp\/v2\/posts\/527","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.nibelheim.fr\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.nibelheim.fr\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.nibelheim.fr\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.nibelheim.fr\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=527"}],"version-history":[{"count":15,"href":"https:\/\/blog.nibelheim.fr\/index.php?rest_route=\/wp\/v2\/posts\/527\/revisions"}],"predecessor-version":[{"id":544,"href":"https:\/\/blog.nibelheim.fr\/index.php?rest_route=\/wp\/v2\/posts\/527\/revisions\/544"}],"wp:attachment":[{"href":"https:\/\/blog.nibelheim.fr\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=527"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.nibelheim.fr\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=527"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.nibelheim.fr\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=527"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}