Les scripts mp3cover et m3utospl ont leur page dédiée respective, accessible par le menu.

Fonctionnement du lecteur mp3 Samsung YP-P2 avec Linux Ubuntu

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...

Passage de MTP à UMS

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 :

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 :

et ensuite, à chaque fois :

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...

Transcodage de vidéos

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.

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

Ajout des covers des albums

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...

Utilisation de 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 ».

Utilisation de 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) :

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.

Transformation des playlists

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

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 :

Commentaires et questions

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.