Comme je l’ai décrit ici avec Podracer et un petit script maison, il est aisé de mettre en place un système automatique de téléchargement de vos émission de radio ou internet préférées et de les traiter afin que les fichiers mp3 récupéré soient le plus aisément possible exploitable.
Dans le but d’en faire toujours moins, j’ai cherché à automatiser le transfert des fichiers mp3 téléchargés vers le lecteur mp3.
En pré-requis il faut évidemment que le lecteur mp3 soit reconnu comme un disque USB (adieu iPod et autre systèmes à base de MTP). Dans mon cas pas de problème puisqu’il s’agit de transférer les fichiers mp3 ver une carte SD (mon « lecteur »)
Après quelques recherches je me suis orienté vers l’écriture d’une règle udev pour réaliser ce transfert automatique…
Tout d’abord Udev qu’est-ce donc ?
Je vous conseil la lecture de ce long article dont je vais m’inspirer pour rédiger ce post.
Donc en gros udev est le système servant à décrire et monter le périphériques sous linux.
Dans notre exemple udev va nous servir à :
- identifier de façon unique le périphérique USB branché (dans mon cas un lecteur de carte SD 3 en 1 de Kingston)
- lancer un scripts qui va se charger de copier les fichiers mp3.
Identification du périphérique USB – écriture de la règle Udev
Il s’agit de la partie la plus « ardue » de la configuration et la partie pour laquelle chacun devra se débrouiller, il s’agit de trouver via udevinfo les informations qui permettront d’identifier de façon unique le périphérique USB dont le branchement déclenchera le transfert des fichiers.
Voici la trame des opérations à réaliser qui vous permettront d’y parvenir :
1 – Brancher le périphérique USB à identifier
2- Trouver le fichier /dev/sdxx correspondant à votre périphérique, pour cela analyser les messages affichés par dmesg lors du branchement du périphérique.
On aura alors quelque chose du genre :
SCSI device sda: 1003600 512-byte hdwr sectors (514 MB)
…
Attached scsi removable disk sda at scsi0, channel 0, id 0, lun 0
…
usb-storage: device scan complete
Le périphérique est donc accessible sur /dev/sda (ce qui est le cas dans la majorité des cas)
3- Analyser les données udevinfo. Cela se fait en exécutant :
udevinfo -a -p $(udevinfo -q path -n /dev/sda)
Cette commande sort tout un tas de données qu’il faut analyser pour trouver les informations pertinentes.
Vous trouverez ci-dessous le résultat de la commande udevinfo pour sda et sda1 pour mon lecteur de carte Kingston 3 en 1
udevinfo-sda-flashreader-kingston
udevinfo-sda1-flashreader-kingston
Dans mon cas j’ai identifié le périphérique par sa taille, ce qui est limite mais cela fonctionne.
Pour info pour le même lecteur de carte mais avec 2 cartes SD 2Go de marques différentes on a une taille différente dans le résultat du udevinfo (3870587 contre 3841911)
4 – Ecrire la règle udev, on créra le fichier 10-local.rules
sudo vim /etc/udev/rules.d/10-local.rules
Puis on ajoutera :
KERNEL=="sda1", SUBSYSTEM=="block", ATTR{size}=="3841911", RUN+="/root/transfert.sh"
Toute la première partie de la régle est dépendente de votre périphérique et de l’attribut que vous avez choisi pour l’identifier.
La dernière partie (RUN) est commune, on indique à udev que lorsqu’il détecte le périphérique sda1 ayant une taille de 3841911, il doit exécuter le script transfert.sh dans root.
Script de transfert des fichiers mp3 vers les lecteur
Créer le fichier script transfert.sh
sudo vim /root/transfert.sh
Et y copier ceci :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
| #!/bin/sh
# paramétrage
# point de montage du périphérique USB
MOUNTPOINT="/mnt/transfertPodcast"
# fichier de log
LOGFILE="/root/transfertPodcast.log"
echo "---------- debut ----------" >> $LOGFILE
date >> $LOGFILE
# nom du device
echo "devname =" $DEVNAME >> $LOGFILE
# si le point de montage n'existe pas on le crée
if (!(test -d $MOUNTPOINT)) then
echo "creation repertoire" $MOUNTPOINT >> $LOGFILE
mkdir $MOUNTPOINT;
fi
# montage du périphérique USB
mount $DEVNAME $MOUNTPOINT
if [ $? != 0 ]; then
echo "erreur de montage" $MOUNTPOINT >> $LOGFILE
exit 1
fi
# sauvegarde des anciens podcast
mv $MOUNTPOINT/Podcast/*.mp3 $MOUNTPOINT/Podcast/_save/
# déplacement des nouveau podcast vers le périphérique USB
mv /home/mon_user/downloads/podcast/*.mp3 $MOUNTPOINT/Podcast/ >> $LOGFILE
# démontage du périphérique USB
umount $MOUNTPOINT
if [ $? != 0 ]; then
echo "erreur de démontage" >> $LOGFILE
/usr/bin/beep -f 1200 -n -f 1000 -n -f 1200
exit 1
fi
# c'est fini : musique maestro
/usr/bin/beep -f 1000 -r 2 -n -r 5 -l 10 --new
echo "-------- end - ok --------" >> $LOGFILE
echo "" >> $LOGFILE
exit 0 |
Ce script monte le périphérique USB identifié par la variable d’environnement DEVNAME dans le répertoire paramétré au début du script (MOUNTPOINT).
Les fichiers mp3 présents dans le répertoire Podcast du périphérique USB sont sauvegardés (déplacés) dans un sous répertoire _save
En effet on part de l’hypothèse que l’on garde pas les podcast une fois écoutés et que l’on ne branche notre lecteur mp3 en vue de le « recharger » en podcast que lorsque ceux présents dessus ont tous été écoutés.
On réalise donc une sauvegarde au cas où ce ne serait pas le cas mais c’est optionnel.
Le podcasts présents dans le sous-répertoire downloads/podcast du user réalisant le download sont ensuite transférés (déplacés) sur le périphérique monté.
Il faut bien sûr mettre en cohérence le chemin où l’on va chercher les podcasts avec celui paramétré dans votre script de téléchargement des podcasts.
Le prériphérique est alors démonté et une petite musique à base de beep (sudo aptitude install beep) est jouée
Le tout étant loggué dans fichier paramétré via LOGFILE
Ce script est très largement améliorable mais je ne pas pris le temps de le faire, on pourra citer comme axe d’amélioration :
- Purger le répertoire _save en se basant sur la date de copie des fichier pour ne garder que la date d-1 (est-ce faisable ?)
- Déplacement des logs
- Purge des logs
- …