821 views
# Fabriquer une [REC] Machine / [CopyLaRadio](https://www.copylaradio.com/) Ce tutorial explique comment fabriquer la [[REC] Machine: Lecteur / Enregistreur Webradio](https://www.copylaradio.com/blog/blog-1/post/fabriquer-la-rec-machine-3) à partir du kit ["Pirate Radio" de Pimoroni](https://www.amazon.fr/dp/B06Y18QGGN?tag=z0d-21). Puis invite le lecteur bidouilleur à découvrir IPFS et les merveilles d'un essaim de Radios formant un Jukebox Interplanétaire Libre (carrément!) >**Est-ce que c'est légal??** > OUI! En accord avec [les taxes prélevées](https://www.adami.fr/les-droitsdes-artistes/remuneration-copie-privee/) sur les supports vierges et dans le respect de l'article [L. 122-5 du Code de Propriété Intellectuelle](https://www.legifrance.gouv.fr/affichCodeArticle.do?cidTexte=LEGITEXT000006069414&idArticle=LEGIARTI000006278917&dateTexte=20081211), l'exception du droit à la copie privée est autorisée à chacun. [On peut déjà le faire](https://www.nextinpact.com/news/106174-youtube-dl-comment-recuperer-legalement-flux-audio-et-video-depuis-millier-sites.htm) mais la procédure reste plutôt complexe... ## Construisez votre Radio :musical_note: Après avoir reçu et déballé votre KIT ([à commander ici](https://www.amazon.fr/dp/B06Y18QGGN?tag=z0d-21)). Vous allez raccorder tous les éléments puis installer les logiciels libres tel que décrit ensuite... Comptez entre 1 à 2 heures selon votre dextérité. 1. Soudure et montage du KIT :warning: Pour construire ce kit vous devrez être muni d'un fer à souder ([ajouter à votre commande](https://www.amazon.fr/dp/B0018S7G6E?tag=z0d-21)) et [suivre le pas à pas du fabricant](https://translate.google.fr/translate?sl=en&tl=fr&u=https%3A%2F%2Flearn.pimoroni.com%2Ftutorial%2Fsandyj%2Fassembling-pirate-radio)... ![](https://i.imgur.com/EmzyiGg.jpg) > :orange_book: A chaque fois que vous verrez ce petit livre orange, il indique la présence d'une option ou d'un paramètre à nous transmettre si finalement vous décidez de [commander votre [REC] Machine](https://www.copylaradio.com/shop/product/rec-machine-1?category=2). ## Installez les logiciels ### 1. Installer Raspbian (15 mn) 1. Téléchargez "[Raspbian Stretch Lite](https://www.raspberrypi.org/downloads/raspbian/)" et flashez l'image sur une carte microSD ([de qualité!](https://www.amazon.fr/dp/B073JYC4XM?tag=z0d-21)) 2. Installez Raspbian ([comment faire sur un RaspberryPi Zero sans écran?](https://projetsdiy.fr/comment-installer-raspbian-raspberry-pi-zero-sans-ecran-clavier/)). :warning: Pour activer l'accès réseau, vous devez ajouter ces fichiers dans la partition /boot de la carte SD fraichement initialisée avec Raspbian. >cd /media/$USER/boot/ > >touch ssh >nano wpa_supplicant.conf country=fr update_config=1 ctrl_interface=/var/run/wpa_supplicant network={ scan_ssid=1 ssid="NOM_DU_WIFI" psk="MOT_DE_PASSE_WIFI" } > Renouveler cette action à chaque changement de réseau WIFI, chaque configuration s'ajoute à la précédente !! Une fois connecté à votre Raspberry, par la commande "ssh pi@raspberrypi.local" (mot de passe "raspberry"), on peut continuer l'installation... > :warning: Si la connection ne fonctionne pas, redémarrez votre BOX WIFI !! Patentiez quelques minutes (le Pi redémarre plusieurs fois au départ)... On commence par mettre à jour et changer le nom et le mot de passe de notre Machine (10 mn): # Mise à Jour Syteme sudo apt update && sudo apt upgrade -y # Donner un nom à votre Radio ( "copylaradio" ) sudo nano /etc/hostname sudo nano /etc/hosts # Changer le mot de passe ( "Zrad10" ) passwd Redémarrez, connectez-vous "ssh pi@copylaradio.local" > :orange_book: > NOM_DU_WIFI > MOT_DE_PASSE_WIFI > hostname > (Clef publique SSH) ### 2. Installer [pHAT BEAT](https://pinout.xyz/pinout/phat_beat#) (15 mn) curl -sS get.pimoroni.com/phatbeat | bash Répondez "Y" à toutes les questions et tout devrait bien se passer... Après redémarrage, reconnectez-vous et testez le son pour savoir si tout est en ordre. aplay ~/Pimoroni/phatbeat/test/test.wav > :notebook: Suivez [la procédure de prise en main détaillée sur le site de Pimoroni](https://translate.google.fr/translate?sl=en&tl=fr&u=https%3A%2F%2Flearn.pimoroni.com%2Ftutorial%2Fsandyj%2Fgetting-started-with-phat-beat) > OPTION: Sauter cette étape pour utilisez alsa comme sortie son de mpd. Cela réduira la charge CPU prise par pulseaudio... Et offrira plus de puissance pour étendre votre Jukebox. Mais vous perdez le VU-METRE!? > :orange_book: VU-METRE remplacé par un autre logiciel (il faudrait essayer NextCloud) ### 3. Installer mpd (10 mn) Nous allons utiliser **mpd** (le media player daemon de GNU) pour gérer les lectures en streaming et la gestion de notre collection de musique! sudo apt install mpd mpc mkdir ~/music/ mkdir ~/playlists/ Configurer mpd > **sudo nano /etc/mpd.conf** music_directory "/home/pi/music" playlist_directory "/home/pi/playlists" user "pi" bind_to_address "any" auto_update "yes" zeroconf_enabled "yes" zeroconf_name "CopyLaRadio Music Player" filesystem_charset "UTF-8" id3v1_encoding "UTF-8" ############################### audio_output { type "pulse" name "My Pulse Output" server "127.0.0.1" } audio_output { type "httpd" name "CopyLaRadio HTTP Stream" encoder "lame" port "8000" quality "5.0" # bitrate "128" format "44100:16:1" } Comme nous avons choisi l'utilisateur "pi" pour exécuter "mpd", il faut corriger l'appartenance des fichiers... # SET GOOD FILE OWNER chown -R pi /var/lib/mpd/ /var/run/mpd /run/mpd /var/log/mpd Relancez le serveur: > **sudo service mpd restart** ### 4. Installer nginx + autres logiciels (10 mn)... sudo apt-get install nginx php-curl php-sqlite3 php-gd php-json php-xml php-mbstring php-fpm sqlite sudo apt-get install lame sox libsox-fmt-mp3 eyed3 python-chardet libav-tools imagemagick curl sudo apt-get install ca-certificates git-core binutils rsync alsa-utils bc libid3-tools espeak mpg321 fuse libttspico-utils atomicparsley ### 5. Installer youtube-dl (3 mn) [Youtube-dl](https://github.com/ytdl-org/youtube-dl/) est un formidable logiciel (plein de scrapers) qui offre la capacité d'extraire et copier les vidéos proposées sur Youtube et de [dizaines d'autres sites](http://ytdl-org.github.io/youtube-dl/supportedsites.html). sudo wget https://yt-dl.org/downloads/latest/youtube-dl -O /usr/local/bin/youtube-dl sudo chmod a+rx /usr/local/bin/youtube-dl ### 6. Faire fonctionner les boutons Le script shell "watch . sh" (bash) sera chargé de surveiller l'état des boutons du pHAT BEAT (sans consommer de CPU) et déclencher les commandes correspondantes (appui court ou long). > nano /home/pi/watch.sh #!/bin/bash # BUTTONS GPIO NUMBERS FOR PHAT BEAT # https://pinout.xyz/pinout/phat_beat# # ADD TO /etc/local for autostart # ONOFF=12 VOLUP=16 VOLDO=26 BCK=13 PLAY=6 FWD=5 # ADD YOUR DEFAULT RADIO STREAM / PLAYLIST HERE - TRACK INFORMATION FOR RECORDING ;) PLAYLIST="/home/pi/playlists/default.m3u" function trim() { local var="$*" # remove leading whitespace characters var="${var#"${var%%[![:space:]]*}"}" # remove trailing whitespace characters var="${var%"${var##*[![:space:]]}"}" echo -n "$var" } function button() { pin=$1 gpio -g mode $pin in # make sure pin is configured as an input gpio -g mode $pin up # enable pull-up resistor boucle=0 while :; do gpio -g wfi $pin falling # wait for a button action sleep 0.2 echo $pin while [[ $(gpio -g read $pin) -eq 0 ]] do aplay bip.wav sleep 0.5 # COUNT 1/2 SECOND PRESSED boucle=$(bc -l <<< "$boucle + 1") done if [[ $boucle -gt 0 ]]; then echo "LP-$pin-$boucle" fi boucle=0 done } boucle=0 # --- main loop --- while :; do read numbut # LOOK WHAT IS LISTENEND watch=$(mpc | head -1) watch=$(trim "$watch") # EXTRACT ($radio :) $artist - $song radio=$(echo "$watch" | cut -d ":" -f 1 | xargs) if [[ "$radio" != "$watch" && $radio != "volume" ]]; then RADIO="$radio"; else RADIO=""; fi play=$(echo "$watch" | cut -d ":" -f 2) artist=$(echo "$play" | cut -d "-" -f 1) artist=$(trim "$artist") song=$(echo "$play" | cut -d "-" -f 2) song=$(trim "$song") if [[ "$song" == "" ]]; then song=$(echo "$play" | cut -d " " -f 2) song=$(trim "$song") fi echo "(CLICK $numbut) $RADIO: $artist / $song" case "$numbut" in $ONOFF) echo "REC" # BUTTON QUICK RELEASE if [[ $(gpio -g read $ONOFF) -eq 1 ]]; then # RECORD STREAMING SONG::GENERIC # TODO: ADAPT BEHAVIOUR TO EACH RADIO STREAM if [[ "$RADIO" != "" && "$artist" != "" && "$song" != "" ]]; then len=$(bc -l <<< "${#artist} + ${#song}") if [ $len -gt 6 ]; then # DELAYED COPY espeak "RECORDING" echo "$RADIO|$artist|$song" >> /tmp/ytdl.list else espeak "SORRY! TRACK IDENTIFICATION FAILED... COPY CANCELED" fi else # CALL SPECIAL RADIO SCRAPER HERE (LIKE IN youtube-dl.php) case "$radio" in "novazz") espeak "EXTERNAL SEARCH FOR Radio Nova" php ~/libradio/radionova.php ;; *) espeak "TRACK FAILED OR PLAYING LOCAL FILES. NOT RECORDING..." ;; esac fi fi ;; LP-$ONOFF-*) espeak "PLAYING: $artist, TRACK: $song, RADIO: $RADIO" ;; $VOLUP) echo "VOLUP" if [[ $(gpio -g read $VOLUP) -eq 1 ]]; then mpc -q volume +10 vol=$(mpc volume | cut -f 2 -d ":") vol=$(trim "$vol") if [ "$vol" == "100%" ]; then espeak "VOLUME MAXIMUM"; fi fi ;; LP-$VOLUP-*) sec=$(echo "$numbut" | cut -d "-" -f 3) sec=+$(bc -l <<< "$sec * 10") mpc -q volume $sec ;; $VOLDO) echo "VOLDO" if [[ $(gpio -g read $VOLDO) -eq 1 ]]; then mpc -q volume -10 vol=$(mpc volume | cut -f 2 -d ":") vol=$(trim "$vol") if [ "$vol" == "0%" ]; then espeak "VOLUME MINIMUM"; fi fi ;; LP-$VOLDO-*) sec=$(echo "$numbut" | cut -d "-" -f 3) sec=-$(bc -l <<< "$sec * 10") mpc -q volume $sec ;; $PLAY) echo "PLAY" if [[ $(gpio -g read $PLAY) -eq 1 ]]; then if [[ "$press" == "pause" ]]; then mpc play press="" else mpc pause press="pause" fi fi ;; LP-$PLAY-*) sec=$(echo "$numbut" | cut -d "-" -f 3) case "$sec" in 1) # 1SEC = PLAY LOCAL FILES OR DEFAULT PLAYLIST if [[ "$mode" == "" ]]; then mode="LOCAL" espeak "PLAY LOCAL MUSIC" mpc clear mpc listall | mpc add mpc shuffle espeak "SHUFFLE" mpc play else mode="" mpc clear mpc load default espeak "PLAY DEFAULT PLAYLIST" mpc play fi ;; 2) # 2SEC = STOP MUSIC espeak "STOP" mpc stop press="pause" ;; *) # > 3SEC = HALT SYSTEM sudo halt ;; esac ;; $BCK) echo "BCK" if [[ $(gpio -g read $BCK) -eq 1 ]]; then mpc -q prev fi ;; $FWD) echo "FWD" if [[ $(gpio -g read $FWD) -eq 1 ]]; then mpc -q next fi ;; *) echo $numbut ;; esac done < <( button $ONOFF & button $VOLUP & button $VOLDO & button $BCK & button $PLAY & button $FWD & ) # buttons on GPIOs to monitor Ainsi sont associées aux boutons du pHAT BEAT les actions de Changement de piste (<</>>), Lecture/Stop/Changement de playlist (>||), Volume (+/-) + Identification, recherche et enregistrement youtube du morceau (REC). >:orange_book: On pourra désactiver ou [adapter les sons](http://www.universal-soundbank.com/), ajouter d'autres fonctions selon le temps d'appuie sur les boutons... ### 7. Script de copie "COPY . SH" va surveiller le fichier **""/tmp/ytdl.list"** et à chaque nouvelle va faire appel à **youtube-dl** (ou module externe qui ira cherche les metadata sur le site de la webradio). Il est asynchrone et enchaine simplement les copies. > nano **/home/pi/copy.sh** #!/bin/bash # SCAN NEW LINE IN NEW RECORD LIST AND RUN youtube-dl search and copy tail -fn 1 /tmp/ytdl.list | while read -r line do # GET TRANSMITTED PARAM ( radio | artist | song ) radio=$(echo $line | cut -d "|" -f 1) artist=$(echo $line | cut -d "|" -f 2) song=$(echo $line | cut -d "|" -f 3) echo "######## $radio ########" >> /tmp/youtube-dl.log 2>&1 echo $(date) >> /tmp/youtube-dl.log 2>&1 if [[ "$artist" != "" && "$song" != "" && "$radio" != "" && "$radio" != "undefined" ]]; then espeak "COPY $artist - $song" echo "Copy youtube-dl: $artist | $song ($radio)" >> /tmp/youtube-dl.log 2>&1 # Search & Download bestaudio (ogg / opus): MEDIUM CPU youtube-dl --default-search ytsearch1: --download-archive /home/pi/.ytdl.list --embed-thumbnail --metadata-from-title "%(artist)s - %(title)s" --add-metadata --continue --no-overwrites --ignore-errors -f bestaudio --extract-audio -o "/home/pi/music/$artist/$song/%(title)s.%(ext)s" "$artist $song" >> /tmp/youtube-dl.log 2>&1 espeak "COPY OK!" else # LINK COPY espeak "COPY LINK" youtube-dl --continue --no-overwrites --embed-thumbnail --metadata-from-title "%(artist)s - %(title)s" --add-metadata --download-archive /home/pi/.ytdl.list -o "/home/pi/download/%(title)s.%(ext)s" "$song" >> /tmp/youtube-dl.log 2>&1 espeak "COPY LINK OK!" fi done Rendre ces scripts éxécutables chmod 755 /home/pi/copy.sh chmod 755 /home/pi/watch.sh :musical_note: Une conversion mp3 prend quasiment autant de temps que la durée du morceau copié... youtube-dl utilise ffmpeg qui avec pulseaudio seront les 2 taches les plus consommatrices de ressoures processeur. Heureusement pour nous, elles cohabitent bien sur le Raspberry Pi Zero W :smile: >:orange_book: On pourra choisir son format de fichier préféré (--audio-format mp3, vorbis, ... "best" by default;) Pour finir, on ajoute le lancement de "watch . sh" et "copy . sh" ainsi que quelques options au démarrage. > sudo nano **/etc/rc.local** # mpd Runs like pi and some rights are bad!! chown -R pi /var/run/mpd chown -R pi /run/mpd # RESET LOG echo "" > /var/log/mpd/mpd.log # CREATE EXCHANGE FILEs for pi & www-data touch /tmp/ytdl.list chmod 664 /tmp/ytdl.list chown pi:www-data /tmp/ytdl.list touch /tmp/youtube-dl.log chmod 664 /tmp/youtube-dl.log chown pi:www-data /tmp/youtube-dl.log # LAUNCH BUTTONS WATCH su pi -c "/home/pi/watch.sh &" # LAUNCH COPY SCRIPT su pi -c "/home/pi/copy.sh &" # Print the IP address _IP=$(hostname -I | cut -d " " -f 1) || true if [ "$_IP" ]; then printf "My IP address is %s\n" "$_IP" espeak -v mb/mb-fr1 "Adresse IP: $_IP" youtube-dl -U else espeak -v mb/mb-fr1 "CONNECTION INTERNET IMPOSSIBLE" fi exit 0 ### 8. ON REDEMARRE ET VOILA !!! https://www.youtube.com/watch?v=Q0Ojt5a7Kng # Installez le Web Jukebox, ajoutez [REC] ## Installer [Rompr](https://fatg3erman.github.io/RompR/) avec son patch [REC] (20 mn) Pour contrôler notre Radio, on utilise Rompr qui est un Jukebox contrôlera parfaitement notre [[REC] Machine](https://www.copylaradio.com/) depuis un simple navigateur web. # Install ROMPR PHP code cd /var/www sudo wget https://github.com/fatg3erman/RompR/releases/download/1.26/rompr-1.26.zip sudo unzip rompr-1.26.zip sudo chown -R pi:www-data ./rompr mkdir -p ./rompr/prefs mkdir -p ./rompr/albumart sudo chown -R www-data /var/www/rompr/prefs sudo chown -R www-data /var/www/rompr/albumart Pour ajouter le lien [REC]* à l'interface de rompr, nous allons ajouter quelques lignes de code à son interface. ![](https://i.imgur.com/1anOAM0.jpg) > Avant "return lines;" de la fonction getLines, ligne 158. > nano **/var/www/rompr/ui/infobar2.js** // ZEEBOX HACK ZONE var ysearch = npinfo.artist+" "+npinfo.title; if ( ! npinfo.artist ) { ysearch = npinfo.stream; } var reclink = '/youtube-dl.php?q=REC&artist=' + escape(encodeURIComponent(npinfo.artist)) + '&title=' + escape(encodeURIComponent(npinfo.title)) + '&radio='+ escape(encodeURIComponent(npinfo.album)) +'&maxResults=1'; var zcopylink = ' <a id="REC" title="Enregistrer sur Youtube" href="#" onclick=\'javascript:window.open("'+ reclink +'","REC","menubar=no, scrollbars=no, top=10, left=10, width=320, height=400");return false;\'>[REC]</a>'; zcopylink += ' <a title="RECHERCHE LIBRE" href="/youtube-dl.php" target="youtube">*</a>'; lines[0].text += zcopylink; // ZEEBOX HACK ZONE ### HACK:: Insérer dans le code de RompR (./browser/ui)et à d'autres endroits le lien [REC]... Pour augmenter la vie de la carte SD (au dépend de la RAM dispo) > Activer tmpfs dans votre /etc/fstab tmpfs /tmp tmpfs defaults,noatime,nosuid,size=100m 0 0 tmpfs /var/tmp tmpfs defaults,noatime,nosuid,size=30m 0 0 tmpfs /var/log tmpfs defaults,noatime,nosuid,mode=0755,size=100m 0 0 tmpfs /var/run tmpfs defaults,noatime,nosuid,mode=0755,size=2m 0 0 tmpfs /var/spool/mqueue tmpfs defaults,noatime,nosuid,mode=0700,gid=12,size=30m 0 0 > Optimisation de php, vérifiez vos paramètres... > sudo nano **/etc/php/7.0/fpm/php.ini** allow_url_fopen = On memory_limit = 128M max_execution_time = 1800 post_max_size = 256M upload_max_filesize = 8M max_file_uploads = 50 ## Activation du serveur web > On ajoute le site aux fichiers de config de nginx > sudo nano **/etc/nginx/sites-available/rompr** server { listen 80 default_server; listen [::]:80 default_server; root /var/www/rompr; index index.php index.html index.htm; server_name copylaradio; # This section can be copied into an existing default setup location / { allow all; index index.php; location ~ \.php { try_files $uri index.php =404; fastcgi_pass unix:/var/run/php/php7.0-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $request_filename; include /etc/nginx/fastcgi_params; fastcgi_read_timeout 1800; } error_page 404 = /404.php; try_files $uri $uri/ =404; location ~ /albumart/* { expires -1s; } } } Activation de la config nginx > **sudo rm /etc/nginx/sites-enabled/default** > **sudo ln -s /etc/nginx/sites-available/rompr /etc/nginx/sites-enabled/default** > **sudo service nginx restart** VOUS Y ETES!! Rendez-vous sur http://copylaradio.local. Ecoutez Préparez vos playlist, abonnez vous aux Podcasts... Définissez votre liste de lecture par défault dans "~/pi/playlists/default.m3u" Enfin le lien **[REC]** ne fonctionne pas encore... Nous allons remédier à cela! ![](https://i.imgur.com/WCqo0wP.png) ## Gérer le clic sur [REC] : youtube-dl.php Ce fichier va récupèrer les informations sur le morceau joué envoyés par un clic sur [REC], puis comme watch . sh écrire ces demandes **(Radio|Artiste|Titre)** dans le fichier **""/tmp/ytdl.list"** > nano **/home/pi/youtube-dl.php** <?php // RUN CLI if($argc>1) parse_str(implode('&',array_slice($argv, 1)), $_REQUEST); $radio = trim(urldecode($_REQUEST['radio'])); $artist = trim(urldecode($_REQUEST['artist'])); $title = trim(urldecode($_REQUEST['title'])); $lnk = trim(urldecode($_REQUEST['lnk'])); $cmd="$radio|$artist|$title"; $len=strlen($artist.$title); if ($radio && $artist && $title) { if($len > 6) { shell_exec('espeak "OK! RECORDING RADIO TRACK: '.$title.'"'); if( ! exec('grep '.escapeshellarg($cmd).' /tmp/ytdl.list') ) { file_put_contents("/tmp/ytdl.list","$cmd\n", FILE_APPEND); } } else { shell_exec('espeak "SORRY! TRACK IDENTIFICATION FAILED... COPY CANCELED"'); } $result='<a href="https://www.youtube.com/results?search_query='.$artist.'%20'.$title.'" target="check"> RECORDING OK! Check Youtube results for '.$artist.' / '.$title.'... </a>'; } else { $result='<img src="./REC.png" />'; } ?> <!doctype html> <html> <head> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="description" content=""> <meta name="author" content="fred" > <meta http-equiv="Content-Type" content="text/html; charset=utf-8" > <title><?php echo $_REQUEST['q'];?> - Recherche & Copie YouTube</title> <link href="./bootstrap.css" rel="stylesheet"> <?php echo $hpub;?> </head> <body style='background: rgb(0, 0, 0); color: white; '> <section class="content-section text-center"> <div class="container-fluid"> <div class="container" id="result" > <div class="col-lg-8 col-lg-offset-2 page-scroll"> <ul> <?php echo '<form action="./youtube-dl.php" method="GET"> <div> ARTISTE: <input type="search" id="artist" name="artist" placeholder="Indiquez un artiste" value="'.$artist.'"> </div> <div> CHANSON: <input type="search" id="title" name="title" placeholder="Titre de la chanson" value="'.$title.'"> </div> <input type="hidden" id="radio" name="radio" value="CopyLaRadio"> <br><input type="submit" value="Lancer Recherche / Copie Youtube"> </form> '; ?> <hr> </ul> <ul> <?php echo $result; ?> </ul> </div> </div> </div> </section> </body> </html> Reliez ce fichier et ceux qui lui sont associés à rompr ln -s /home/pi/youtube-dl.php /var/www/rompr/youtube-dl.php ln -s /home/pi/REC.png /var/www/rompr/REC.png ln -s /home/pi/bootstrap.css /var/www/rompr/bootstrap.css > :orange_book: Choisissez quelles webradios mettre à votre playlist par défaut. ### HACK:: Ce script confirme vocalement la copie :dancer: Vous pouvez à loisir, désactiver, améliorer ou personnaliser les scripts. ## + Accédez à votre Jukebox depuis Android, iOS, PC, etc... Contrôlez votre musique depuis http://copylaradio.local De nombreux client mpd existent. Je n'ai pas pu tous les essayer... - ANDROID: [M.A.L.P. - MPD Client](https://play.google.com/store/apps/details?id=org.gateshipone.malp) - APPLE, ETC: [Essayez la sélection de Mopidy](https://docs.mopidy.com/en/latest/clients/mpd/#mpd-ios-clients) - Le meilleur client mpd selon vous? [Partagez votre avis sur le FORUM](https://www.copylaradio.com/forum). ## + Activer le montage automatique d'une clef USB Nous allons ajouter l'action de copier la discothèque et démonter la clef à l'un des boutons de la Radio (ajouter dans watch à l'action "1 bip" du bouton PLAY) # Check if USB drive connected if [[ -b /dev/sda1 ]]; then ~/parle.sh "Synchronisation musique sur clé U S B. Veuillez patienter" sudo mount /dev/sda1 /mnt sudo mkdir -p /mnt/CopyLaRadio sudo rsync -rtgoDv /home/pi/music/ /mnt/CopyLaRadio sudo umount /dev/sda1 ~/parle.sh "Transfert terminé. Vous pouvez débrancher votre clé..." else # STOP MUSIC ~/parle.sh "STOP" mpc stop fi PiZeroKey: Utilisation d'un watchdog filesystem? https://pad.p2p.legal/rpi-zero-w-usb-disk#UMOUNT-WATCHDOG # :warning: BETA ZONE ## Noob IPFS - **Découvrir IPFS**: https://hackernoon.com/understanding-ipfs-in-depth-3-6-what-is-interplanetary-naming-system-ipns-9aca71e4c13b - **Installer et mettre à jour IPFS automatiquement** # ipfs-update wget https://dist.ipfs.io/ipfs-update/v1.5.2/ipfs-update_v1.5.2_linux-arm.tar.gz tar -xvzf ipfs-update_v1.5.2_linux-arm.tar.gz cd ipfs-update/ sudo ./install.sh sudo ipfs-update install latest On pourra lancer une mise à jour automatique en ajoutant "ipfs-update install latest" à /etc/rc.local (avant le démon ipfs) - **IPFS COMMANDES CLI** : https://docs.ipfs.io/reference/api/cli/ - **OPTIONS** : https://github.com/ipfs/go-ipfs/blob/master/docs/experimental-features.md#ipfs-p2p - **G1sms+ Swarm IPFS ZEN** : https://pad.p2p.legal/s/G1sms-install # :alien: Work In Progress... Vers un [Jukebox Interplanétaire Libre](https://www.copylaradio.com/blog/blog-1/post/jukebox-interplanetaire-9)! ## Remplacer mpd par [beets](http://beets.io/) sudo apt install python3-pip pip3 install beets # https://beets.readthedocs.io/en/v1.4.7/plugins/lyrics.html?highlight=lyrics pip3 install requests # https://beets.readthedocs.io/en/v1.4.7/plugins/lastgenre.html?highlight=install%20requests pip3 install pylast # https://beets.readthedocs.io/en/v1.4.7/plugins/web.html?highlight=web pip3 install flask # Setup Chromaprint/Acoustid Plugin pip3 install pyacoustid wget https://github.com/acoustid/chromaprint/releases/download/v1.4.3/chromaprint-fpcalc-1.4.3-linux-armhf.tar.gz tar xvzf chromaprint-fpcalc-1.4.3-linux-armhf.tar.gz sudo cp chromaprint-fpcalc-1.4.3-linux-armhf/fpcalc /usr/local/bin/ > La configuration de beet > nano /home/pi/.config/beets/config.yaml directory: /home/pi/music/ library: /home/pi/music/musiclibrary.blb import: move: yes write: yes log: /home/pi/beetslog.txt plugins: lastgenre chroma fetchart embedart ftintitle ipfs replaygain replace lyrics web replaygain: backend: gstreamer replace: '[\\/]': _ '^\.': _ '[\x00-\x1f]': _ '[<>:"\?\*\|]': _ '\.$': _ '\s+$': '' '^\s+': '' '^-': _ Web UI : https://github.com/irskep/summertunes ... Beet: Importation manuelle (-s : Single) beet import ~/IMPORT/ ... Beet: Importer automatiquement ses copies REC (sans question) > nano /home/pi/beet.sh #!/bin/bash ### BEET IMPORT ### ## !!! M4A NOT IMPORTING ;( ## CORRECT beet OR CHANGE CODING to supported one. rm -f /tmp/import.log beet -vvvv import -sq ~/IMPORT/ ## Stocker les Enregistrements des Radios dans IPFS Pour associer la gestion des [G1Tag](https://g1sms.fr) en parallèle de l'enregistrement lecture des fichiers du Jukebox :dancer: CopyLaRadio.com mode **"ipfs dag put ./music/track.metadata.json"** **CF. MERKLE DAG and json CBOR = Metadata + File** :smile: + https://docs.ipfs.io/guides/concepts/merkle-dag/ + https://ethereum.stackexchange.com/questions/63109/ipfs-versioning-how-to-get-all-files-from-the-ipfs-key ## Gérer les TX entre Radios et Fichiers IPFS/G1Tag: Patcher le [plugin beets-ipfs](https://github.com/beetbox/beets/blob/master/beetsplug/ipfs.py) et développer un cron pour réaliser ces actions. :red_circle: - **REC**: Chaque Radio qui copie un morceau, lui attribue un G1Tag de 1000 ZEN contenant la valeur du couple "H/L" (ex:10/2) définissant le prix Hébergement/Lecture du fichier au moment de l'ajouter à IPFS. :musical_note: - **PLAY**: Chaque Radio qui au moment de trouver un nouveau morceau le lira sur IPFS, versera 2 Zen au Wallet de fichier et PIN sa ressource :pushpin: - **PIN**: Chaque jour les Radio qui ont introduit un Fichier dans l'essaim calculent selon le reversement H de ce Fichiers la part à verser aux noeuds qui le PIN et opère les virements du G1Tag (H=10, 5 Radios ont le PIN => 10/5= 2 Zen versé à chaque G1Tag des Radios). On pourra développer plusieurs algo de conservation des PIN pourront être proposés à chaque Radio (keepall, keepbest, keeplast, ... ) qui opérera sur ses PIN. Profil de gestion de son G1Tag (et G1smsWallet d'appro). g1sms.fr --- ### HACK: L'index aux Fichiers proposé sera dans un premier temps : Artiste, Titre, Qualité, YoutubeID ## ++ UNIVERSALISER L'INDEXATION DES MORCEAUX - Reconnaitre le morceau: Intégrer [pyacoustid](https://pypi.org/project/pyacoustid/) / [AcousticBrainz](https://acousticbrainz.org/) (il n'existe pas encore de binaire armhf pécompilé !!) ou [DejaVu](https://github.com/worldveil/dejavu) pour compléter MusicBrainz si son titre n'est pas fourni. - Essayer [Modipy](https://mopidy.com/) pour se connecter à Spotify... [Ajouter la copie](https://github.com/ritiek/spotify-downloader) :corn: - Récupérer le titre du flux sur le site web de la radio si il n'est pas fourni par le streaming. **DONE** = [~/libradio/*](https://www.copylaradio.com/forum/aide-1/question/je-n-arrive-pas-a-enregistrer-ma-webradio-comment-ajouter-un-module-3) expliqué sur le Forum. On pourrait aussi s'intéresser à **[AdblockRadio](https://www.adblockradio.com/player/)** qui intégre tout un système de tracking & suppression de pub Radio !! - Faire un script d'Install distribué sur IPFS par **curl | bash** Interfaces pour remplacer RompR ? Il faudrait pour un Dapp complète coder un client qui intègre js-ipfs FullJS... - Comme https://diffuse.sh contacté sur le forum ipfs: https://discuss.ipfs.io/t/music-player-with-ipfs-backend/793/12 - J'ai pu penser utiliser https://www.textile.photos/ pour l'étendre à la gestion de musique? https://textile-public.slack.com/archives/C4R0Z1U5Q/p1557676005159000 en fait on revient à gérer du CBOR dans DAG... Mais autant directement utiliser les clefs des G1Tag pour chiffrer que rajouter des surcouches d'emballage. ## USEFULL LINKS & DUSTBIN - Mettre un formulaire dans "youtube-dl.php" pour permettre la copie youtube libre. **DONE** - Activation du port USB DATA en mode périphérique de masse. **DONE** [PiZeroKey](https://pad.p2p.legal/rpi-zero-w-usb-disk) - Rétrécir les images **[REC]Machine**: https://github.com/framps/raspiBackup ou https://github.com/Drewsif/PiShrink - CJDNS https://github.com/tomeshnet/prototype-cjdns-pi - RESEAU MAILLE PRIVE: https://yggdrasil-network.github.io/ https://docs.ipfs.io/guides/examples/websites/ https://docs.ipfs.io/guides/concepts/dnslink/ * Collection of scraping recipes to get metadata about what is being streamed on webradios https://github.com/adblockradio/webradio-metadata https://hackernoon.com/understanding-ipfs-in-depth-3-6-what-is-interplanetary-naming-system-ipns-9aca71e4c13b Créer des références "Immutable", monter une Gateway DNSLink Apps Régler CORs (pour interface 5001) https://github.com/ipfs-shipyard/ipfs-webui#configure-ipfs-api-cors-headers https://steemit.com/ipfs/@berkes/mirror-files-from-the-web-to-ifps-with-wget-to-ipfs PROXY NGINX LETSENCRYPT: https://www.nginx.com/blog/using-free-ssltls-certificates-from-lets-encrypt-with-nginx/ https://www.abyssproject.net/2019/01/installation-dun-serveur-ipfs-sous-debian-9-et-mise-a-jour/ http://blog.klaehn.org/2018/06/08/running-ipfs-gateway/