Les scripts mp3cover
et m3utospl
ont leur page dédiée respective, accessible par le menu.
Pour Noël 2008, j'ai eu un lecteur mp3 Samsung YP-P2. Il s'agit, comme présenté dans un très bon site dédié, d'un lecteur sorti fin 2007, dont l'interface est entièrement tactile, à l'instar de l'Ipod Touch. L'écran semble un peu moins « précis » que celui de l'Ipod, mais le comportement général le rend quand-même très agréable à utiliser.
Quatre problèmes majeurs :
Heureusement que sous Linux, il y a toujours une solution...
Le transfert de fichiers entre un périphérique usb de stockage de type lecteur mp3 et un ordinateur, peut être géré selon deux protocoles :
Le MTP est très bien géré par Ubuntu depuis au moins la version 7.10. Il suffit pour cela d'utiliser, au choix :
mtpfs
, avec l'utilitaire fuse
, qui
permettent de visualiser le lecteur presque comme une clé USB.Sous Windows, il faut obligatoirement (sauf erreur de ma part) utiliser le logiciel Emodio de Samsung. Heureusement, je n'utilise plus Windows depuis assez longtemps et j'ai donc le choix de mes logiciels...
Personnellement, le MTP ne me suffisait pas, car il est impossible d'envoyer un répertoire complet, ni d'organiser une arborescence. Or toute ma discothèque est ultra-organisée, et je n'avais pas envie de perdre cela dans mon lecteur (par exemple, je peux comme cela synchroniser mes mp3s sur mon ordinateur avec ceux sur mon lecteur). Total : passons à l'UMS !
Problème de taille, contrairement à un grand nombre de lecteurs ou d'appareils photo numériques, ce choix n'est pas disponible dans le menu du lecteur. Il faut donc ruser, et heureusement ceci est encore possible.
C'est marqué partout, mais moi-même je n'y croyais pas, alors autant le préciser une fois de plus ici. Il faut modifier plusieurs fois le firmware de l'appareil. Tout est très bien décrit sur le site en lien ci-dessus, mais précisons : le yp-p2 était lorsque je l'ai acheté avec le firmware 5.10-FR-MTP, le dernier en date en décembre 2008. Pour passer à l'UMS (et j'ai essayé plusieurs possibilités), il faut successivement :
Pour installer un firmware depuis Ubuntu, il faut, une première fois :
sudo aptitude install fuse mtpfs
sudo mkdir -m 777 /media/ypp2
et ensuite, à chaque fois :
mtpfs /media/ypp2(en UMS, c'est automatique...)
fusermount -u /media/ypp2
Pas la peine d'avoir peur de passer à un firmware 1.xx, c'est sans
risque. Et voilà : le lecteur est entièrement UMS, on peut sans problème
mettre des répertoires dans le répertoire Music
ou dans le
répertoire Videos
...
Le lecteur lit très bien les vidéos, mais uniquement à un format précis : SVI ou WMV9. Le premier étant simplement un fichier AVI avec des dimensions spéciales (480x272) et sans B-frames, il est assez facile de transformer n'importe quelle vidéo à ce format, sans passer par Emodio.
Je n'ai pas encore pris le temps d'essayer réellement les formules magiques trouvées sur le net (merci Google), utilisant ffmpeg ou mplayer.
ffmpeg -i fichier.avi -r 30 -s 480x272 -aspect 16:9 -vcodec mpeg4 -acodec mp3 -ab 128k -ac 2 -f avi résultat.avi
mencoder -noodml fichier.avi -o résultat.avi -ofps 25 -vf-add crop=0:0:-1:-1 -vf-add scale=480:272 -vf-add expand=480:272:-1:-1:1 -srate 44100 -ovc xvid -xvidencopts bitrate=128 -oac mp3lame -lameopts vbr=0 -lameopts br=128 -lameopts vol=0 -lameopts mode=0 -lameopts aq=7 -lameopts padding=3 -af volnorm -xvidencopts max_bframes=0:nogmc:noqpel -mc 0(je suspecte certaines options d'être légèrement inutiles...)
Dans les deux cas, « fichier.avi » et
« résultat.avi » sont respectivement le fichier à encoder
et le chemin pour le fichier de résultat. Vous pouvez utiliser ces lignes
directement en console, ou dans un script bash
du genre
#!/bin/bash ffmpeg -i $1 -r 30 -s 480x272 -aspect 16:9 -vcodec mpeg4 -acodec mp3 -ab 128k -ac 2 -f avi $2
que vous mettrez dans un fichier par exemple
/usr/local/bin/videoconv
et que vous appelerez par
videoconv fichier.avi résultat.avi
C'est un détail qui transforme un lecteur mp3 avec un grand écran
en un vrai appareil joli lorsqu'on l'utilise : l'affichage des pochettes
des albums ou covers. Avoir des fichiers
cover.jpg
dans les dossiers ne suffit pas, les images doivent être
contenues dans les étiquettes id3
. Si vous ne savez pas de quoi il
s'agit, je vous conseille la page de
Wikipédia sur le sujet). Vous y lirez qu'il faut utiliser la version 2 (id3v2
) des
id3
. Plus précisément, il existe deux sous-version actuellement
utilisable, id3v2.3
et id3v2.4
. D'après ce que j'ai pu
essayer, il faut visiblement utiliser la première pour que les genres musicaux
et les covers soient correctement comprises par le lecteur.
D'autres spécificités existent pour que les covers soient affichées :
Une fois que l'on sait tout cela, on se dit que nos répertoires de musique,
classés album par album, contiennent déjà chacun la pochette de l'album
correspondant dans le fichier cover.jpg
. On commence donc à
chercher des solutions pour ajouter cette image de façon automatique, en ligne
de commande, simple et rapide. Et on ne trouve pas grand chose...
gem
et tous les autres, impossible de vraiment
faire fonctionner l'histoire...php-reader
Cette classe, php-reader
, permet de lire et d'écrire des tags
id3
. Pour l'installer, il suffit de télécharger la
dernière version et de dézipper l'ensemble dans un répertoire que je propose
d'appeler cover
. Voici un script que l'on peut y ajouter, en
copiant le contenu par exemple dans un fichier mp3cover.php :
<?php require_once("ID3v2.php"); require_once("ID3/Frame/APIC.php"); // L'agument n°1 du script est le répertoire contenant la musique if ( ( $argc > 1 ) && ( is_dir($argv[1]) ) ) $rep = dirname("{$argv[1]}/."); else $rep = "/home/musique"; // Si aucun argument , répertoire par défaut echo "$rep\n"; function recherche($rep) { // Ajout de l'image uniquement si cover.jpg existe if ( file_exists("$rep/cover.jpg") ) ajoute($rep); // Récursivité $reps = glob("$rep/*", GLOB_ONLYDIR); foreach ( $reps as $nrep ) recherche($nrep); } function ajoute($rep) { // Pour un répertoire donc un album, une seule image $imag = new ID3_Frame_APIC(); $imag->setImageData(file_get_contents("$rep/cover.jpg")); $imag->setMimeType('image/jpeg'); $imag->setImageType(3); // Récupération de la liste des chansons $chansons = glob("$rep/*.mp3"); echo "Répertoire " . basename($rep) . "\n"; echo " -> " . count($chansons) . " chansons "; // Modification foreach ( $chansons as $chanson ) { // Vérification de l'absence d'image $id3 = new ID3v2($chanson); // Attention, si id3v2.4, problèmes pour l'image (et pour le genre) // Il faut passer en id3v2.3 (fait ci-dessous) et modifier le genre // en l'entourant de parenthèse s'il s'agit d'un numéro. if ( $id3->getHeader()->version == 4 ) { $id3->getHeader()->setVersion(3.0); $id3->getHeader()->setFlags(0); echo "*"; } if ( $id3->hasFrame("APIC") ) { echo "o"; continue; } else echo "+"; // Récupération de la date et de l'heure originales $mtime = filemtime($chanson); // Ajout de l'image $id3->addframe($imag); $id3->write(); // Remise de la date et de l'heure originales touch($chanson,$mtime); } echo "\n"; } recherche($rep);
Il faut ensuite installer l'interpréteur PHP en ligne de commande,
c'est-à-dire le package php-cli
sudo aptitude install php5-cli
Lorsque tout cela est fait, on peut, après s'être placé dans le répertoire
cover
, exécuter la transformation par
php mp3cover.php
si on a modifié le répertoire par défaut pour mettre le bon ou
php mp3cover.php /un/chemin/quelconque
si on a besoin de traiter un autre répertoire. Le comportement est récursif, tous les répertoires contenus dans le premier répertoire sont traités. Toutes les dates de dernière modification des fichiers sont conservées.
Les fichiers modifiés sont symbolisés lors de la transformation par un « + ». Ceux possédant déjà une image sont simplement évités (que cette image soit correcte ou non), et symbolisés pendant la transformation par un « o ».
eyeD3
Une autre possibilité, à laquelle j'ai pensé juste après en farfouillant dans
des vieux scripts est l'utilisation de l'utilitaire eyeD3
. Il s'agit d'un programme à
installer par
sudo aptitude install eyeD3
L'intérêt est que, avec un petit script bash
, cela fonctionne
mieux (j'ai eu pour une chanson une erreur qui faisait planter le script
précédent) et plus vite (environ 3 fois plus vite), en plus de pouvoir plus
facilement faire d'autres choses. Par exemple, le script ci-dessous propose,
pour gagner de la place sans que cela ne gêne (j'ai fait quelques essais), de
réduire la taille des images à 250 pixels de large et à une qualité d'image de
85%. L'image ainsi intégrée dans chaque fichier mp3 fait à peine quelques
ko. Pour que cela soit possible, il faut disposer de l'utilitaire
convert
, du package imagemagick
sudo aptitude install imagemagick
Le script en question est téléchargeable et utilisable librement (clic droit, enregistrer sous). En voici le contenu :
#!/bin/bash # This software is governed by the CeCILL license under French law and # abiding by the rules of distribution of free software. You can use, # modify and/ or redistribute the software under the terms of the CeCILL # license as circulated by CEA, CNRS and INRIA at the following URL # "http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt". # # Ce logiciel est régi par la licence CeCILL soumise au droit français et # respectant les principes de diffusion des logiciels libres. Vous pouvez # utiliser, modifier et/ou redistribuer ce programme sous les conditions # de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA # à l'adresse "http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt". # # Copyright Cyril Ravat,(2007-2009) # Website : http://www.cyril-ravat.fr/scripts/mp3cover.php # Help : mp3cover -h # Taille maximale des images redimensionnées (en pixels) IMSIZE=250 if [ "$1" == "-h" ]; then echo -e "Usage : $(basename "$0") [\033[1mrépertoire\033[0m] [\033[1mrépertoire\033[0m ...]" echo " $(basename "$0") -h" echo echo "Place un fichier cover.jpg comme étiquette id3 dans les fichiers mp3 contenus" echo -e "dans les \033[1mrépertoire\033[0ms donnés en argument, ou à défaut dans le répertoire courant." echo echo "Le comportement est récursif. Les étiquettes id3 ne sont modifiées que si le" echo "fichier cover.jpg existe, après redimensionnement à la taille de ${IMSIZE}x$IMSIZE pixels." echo "Les paquets imagemagick (pour la retouche d'image) et eyed3 (pour la" echo "modification des données id3) doivent être installés." echo exit 0 fi # Vérification des utilitaires convert et eyeD3 if [ -z `which convert` ]; then echo -e "L'utilitaire \033[1mconvert\033[0m n'existe pas." echo -e "Il faut installer le paquet \033[1mimagemagick\033[0m." exit 1 fi if [ -z `which eyeD3` ]; then echo -e "L'utilitaire \033[1meyeD3\033[0m n'existe pas." echo -e "Il faut installer le paquet \033[1meyed3\033[0m." exit 1 fi # Fonction d'encodage function ajoute () { REP="$1" convert -resize "${IMSIZE}x$IMSIZE>" -quality 85 "$REP/cover.jpg" "$REP/covertmp.jpg" for FICHIER in "$REP"/*.mp3; do touch -r "$FICHIER" "$REP/tmp" eyeD3 --remove-images "$FICHIER" > /dev/null 2> /dev/null eyeD3 --add-image="$REP/covertmp.jpg":FRONT_COVER "$FICHIER" > /dev/null 2> /dev/null touch -r "$REP/tmp" "$FICHIER" echo -n "*" done rm "$REP/covertmp.jpg" "$REP/tmp" } # Récursivité function recherche() { REP="$1" [ -d "$REP" ] || return echo -n "Répertoire $(basename "$REP") " # Ajout de l'image [ -e "$REP/cover.jpg" ] && ajoute "$REP" echo # Gestion des répertoires : comportement récursif for NREP in "$REP"/*; do [ -d "$NREP" ] && recherche "$NREP" done } # Corps : description de la liste des répertoires à traiter for i in `seq $#`; do recherche "${!i%/}" done [ $# -eq 0 ] && recherche `pwd`
Après avoir copié-collé ce texte ou le script
lui-même dans un fichier au bon endroit comme par
exemple /usr/local/bin/mp3cover
puis rendu exécutable par
sudo chmod +x /usr/local/bin/mp3cover
vous pouvez l'utiliser en tapant (sans se soucier du répertoire courant) :
mp3cover -h
mp3cover
mp3cover /un/premier/répertoire /un/deuxième/répertoire
Ici aussi, le comportement est récursif et les dates des fichiers ne sont pas
modifiées. Les fichiers sont par contre systématiquement modifiés, les images
éventuellement contenues sont supprimées pour être remplacées par l'image
cover.jpg
après redimensionnement.
Le script ne se soucie pas de savoir si les tags sont en id3v2.3
ou en id3v2.4
. Personnellement, j'utilise le très bon logiciel
EasyTag, qui permet de choisir ce format et de convertir automatiquement tous
les mp3 dans l'un ou dans l'autre si besoin.
Tous les logiciels de lecture de mp3 que je connais ont un format de playlist préféré. C'est une sorte de standard, un fichier très simple .m3u
. Par exemple, voilà à quoi ça correspond :
/home/musique/Radiohead/(2001) Amnesiac/01. Packt like sardines in a crushd tin box.mp3 /home/musique/Radiohead/(2001) Amnesiac/02. Pyramid song.mp3 /home/musique/Radiohead/(2001) Amnesiac/03. Pull pulk revolving doors.mp3
Mais le lecteur YP-P2 demande un autre format, pas vraiment original mais juste un peu différent
SPL PLAYLIST VERSION 1.00 \music\Radiohead\(2001) Amnesiac\01. Packt like sardines in a crushd tin box.mp3 \music\Radiohead\(2001) Amnesiac\02. Pyramid song.mp3 \music\Radiohead\(2001) Amnesiac\03. Pull pulk revolving doors.mp3 END PLAYLIST
La belle affaire me direz-vous ! Il s'agit simplement d'ajouter trois lignes avant et deux après... Ce n'est pas si simple. Le fichier à déposer dans le répertoire playlists
du YP-P2 doit en plus de cela
spl
Ce n'est pas si compliqué, mais deviendra vite usant à la longue si l'on doit s'occuper d'une quantité non négligeable de playlists. Alors que faire ? Automatisons cela !
#!/bin/bash # This software is governed by the CeCILL license under French law and # abiding by the rules of distribution of free software. You can use, # modify and/ or redistribute the software under the terms of the CeCILL # license as circulated by CEA, CNRS and INRIA at the following URL # "http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt". # # Ce logiciel est régi par la licence CeCILL soumise au droit français et # respectant les principes de diffusion des logiciels libres. Vous pouvez # utiliser, modifier et/ou redistribuer ce programme sous les conditions # de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA # à l'adresse "http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt". # # Copyright Cyril Ravat,(2007-2009) # Website : http://www.cyril-ravat.fr/scripts/mp3utospl.php # Help : m3utospl -h # Répertoire "racine" des fichiers musicaux sur l'ordinateur REP_LOCAL="/home/musique/" # Répertoire "racine" des fichiers musicaux sur le lecteur mp3 REP_LECT="/music/" if [ "$1" == "-h" ]; then echo -e "Usage : $(basename "$0") \033[1mfichier.m3u\033[0m [\033[1mrep_local\033[0m] [\033[1mrep_lect\033[0m]" echo " $(basename "$0") -h" echo echo -e "Transforme une liste de lecture \033[1mfichier.m3u\033[0m en un format fichier.spl, compatible" echo -e "avec certains lecteurs mp3." echo echo -e "Le fichier \033[1mfichier.m3u\033[0m n'est pas modifié. Dans le fichier spl, le répertoire" echo -e "racine des fichiers musicaux sur l'ordinateur \033[1mrep_local\033[0m est remplacé par son" echo -e "équivalent sur le lecteur mp3 \033[1mrep_lect\033[0m." echo "Les séparateurs de répertoires sont transformés en séparateurs Windows \, le" echo "fichier spl est encodé en UTF-16 et les retours à la ligne sont transformés" echo -e "grâce à l'utilitaire \033[1munix2dos\033[0m qui doit donc être installé." echo echo "Valeurs actuelles par défaut :" echo -e "\033[1mrep_local\033[0m : $REP_LOCAL" echo -e "\033[1mrep_lect\033[0m : $REP_LECT" echo exit 0 fi # Vérifications de l'existence du fichier mp3 et de unix2dos [ ! -e "$1" ] && echo "Le fichier $1 n'existe pas." && exit 1 if [ -z `which unix2dos` ]; then echo -e "L'utilitaire \033[1munix2dos\033[0m n'existe pas. Il faut installer le paquet \033[1mtofrodos\033[0m." exit 1 fi # Définition des variables PLAYLIST="${1%.m3u}.spl" TMP=/tmp/$RANDOM [ -n "$2" ] && REP_LOCAL="$2" [ -n "$3" ] && REP_LECT="$3" REP_LOCAL=$(echo "${REP_LOCAL%/}/" | tr '/' '|') REP_LECT=$(echo "${REP_LECT%/}/" | tr '/' '|') # Dans fichier.spl, l'entête, le corps et le pied de liste echo -e "SPL PLAYLIST\nVERSION 1.00\n" > "$PLAYLIST" cat "$1" >> "$PLAYLIST" echo -ne "\n\nEND PLAYLIST" >> "$PLAYLIST" # Remplacement des répertoires sed -i "s/\//|/g ; s/$REP_LOCAL/$REP_LECT/ ; s/|/\\\\/g" "$PLAYLIST" # Transformations unix2dos "$PLAYLIST" iconv -f latin1 -t utf16 "$PLAYLIST" > $TMP mv $TMP "$PLAYLIST"
Comme précédemment, après avoir collé ce script dans /usr/local/bin/m3utospl
puis l'avoir rendu exécutable par
sudo chmod +x /usr/local/bin/m3utospl
vous pouvez l'utiliser en tapant :
m3utospl -h
m3utospl fichier.m3u
/home/musique
mais dans /chemin/vers/musique
m3utospl fichier.m3u /chemin/vers/musique
J'espère que ces indications pourront aider ce qui souhaitent utiliser pleinement leur lecteur mp3 avec Linux (j'imagine les dernières manips sont possibles pour d'autres lecteurs que le mien). Tout ceci fonctionne parfaitement chez moi, mais je ne donne aucune garantie que cela fonctionne aussi du premier coup chez vous. Je vous conseille donc de faire des tests sur un répertoire isolé avant de faire retoucher l'ensemble de votre discothèque par ces scripts...
Enfin, pour tout commentaire ou question, n'hésitez pas à venir sur l'article correspondant sur mon blog. Je serais ravi d'améliorer tout ce qui précède.
[1] Tant que vous ne rajoutez pas de nouvelles indications par un fichier config.dat, votre firmware reste en UMS mais aussi en EU-EU. Intérêt de la chose : le firmware KR-KR, s'il possède un dictionnaire coréen-anglais d'une utilité moyenne pour nous, est dépourvu de la fonction RDS qui permet entre autre de voir les noms des radios FM. Ici, le lien est vers un firmware KR-KR, mais pas de soucis, il reste à la fin en EU-EU.