# 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!)
:uk: [TRANSLATE](https://translate.google.fr/translate?sl=auto&tl=en&u=https%3A%2F%2Fpad.p2p.legal%2Fs%2Frec-machine) :us:
## **Est-ce que c'est légal ? O U I !!!**
> Et oui, en France, 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.copylaradio.com/forum/copier-la-musique-2/question/utiliser-youtube-dl-depuis-son-navigateur-7) 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/
# SIMA
Sima feed MPD playlist with artist similar to your currently playing track, provided that this artist is found in MPD library.
https://gitlab.com/kaliko/sima