mp3resample
mp3resample
a pour but de réencoder en grand nombre des fichiers mp3, à bitrate constant. Tout comme mp3cover et m3utospl, il peut servir pour transformer des fichiers mp3 pour les rendre plus pratiques à utiliser sur un lecteur mp3 comme le YP-P2 de Samsung.
mp3resample
est distribué sous licence libre CeCILL.
Une fois le fichier téléchargé, vous devez
sudo mv mp3resample /usr/local/bin/
sudo chmod +x /usr/local/bin/mp3resample
Ce logiciel nécessite l'utilisation des utilitaires lame
, convert
et eyeD3
, installables sous Ubuntu ou Debian par
sudo aptitude install lame imagemagick eyed3
$ mp3resample -h Usage : mp3resample destination répertoire|fichier [répertoire|fichier ...] mp3resample -h Réencode des fichiers mp3, éventuellement contenus dans des répertoires, à bitrate constant. Les fichiers mp3 originaux ne sont pas modifiés. Les fichiers mp3 réencodés sont déposés dans le répertoire de destination, qui sera créé si besoin. Le comportement est récursif. Les fichiers non mp3 rencontrés sont recopiés avec préservation des droits et temps. L'encodage est effectué par défaut à 128 kbps. Les étiquettes id3 sont recopiées (id3v2.3). Si un fichier cover.jpg existe à côté d'un fichier mp3 original, il est inséré comme image au sein des étiquettes id3, après un redimensionnement à la taille de 250x250 pixels. Les paquets lame (pour l'encodage), imagemagick (pour la retouche d'image) et eyed3 (pour la modification des données id3) doivent être installés.
#!/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, <ravat@free.fr> (2007-2009) # Website : http://www.cyril-ravat.fr/scripts/mp3resample.php # Help : mp3resample -h # To do : # * bitrate différent # * pas d'intégration des covers # Valeur par défaut du bitrate audio (en kbps) BITRATE=128 # Taille maximale des images cover.jpg (en pixels) IMSIZE=250 if [ "$1" == "-h" ] || [ $# -lt 2 ]; then echo -e "Usage : $(basename "$0") \033[1mdestination\033[0m \033[1mrépertoire\033[0m|\033[1mfichier\033[0m [\033[1mrépertoire\033[0m|\033[1mfichier\033[0m ...]" echo " $(basename "$0") -h" echo echo -e "Réencode des \033[1mfichier\033[0ms mp3, éventuellement contenus dans des \033[1mrépertoire\033[0ms, à" echo -e "bitrate constant." echo echo "Les fichiers mp3 originaux ne sont pas modifiés. Les fichiers mp3 réencodés sont" echo -e "déposés dans le répertoire de \033[1mdestination\033[0m, qui sera créé si besoin." echo "Le comportement est récursif. Les fichiers non mp3 rencontrés sont recopiés avec" echo "préservation des droits et temps. L'encodage est effectué par défaut à $BITRATE kbps." echo "Les étiquettes id3 sont recopiées (id3v2.3). Si un fichier cover.jpg existe à" echo "côté d'un fichier mp3 original, il est inséré comme image au sein des étiquettes" echo "id3, après un redimensionnement à la taille de ${IMSIZE}x$IMSIZE pixels." echo "Les paquets lame (pour l'encodage), imagemagick (pour la retouche d'image) et" echo "eyed3 (pour la modification des données id3) doivent être installés." echo exit 0 fi # Répertoire de destination DEST="${1%/}" if [ ! -d "$DEST" ] && ( ! mkdir -p "$DEST" ); then echo "Le répertoire $DEST n'existe pas et ne peut être créé." exit 1 fi shift # Vérification des utilitaires lame, convert et eyeD3 if [ -z `which lame` ]; then echo -e "L'utilitaire \033[1mlame\033[0m n'existe pas." echo -e "Il faut installer le paquet du même nom." exit 1 fi 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 # Nombre de coeurs -> nombre de processus simultanés NPROC=`grep -c "^processor" /proc/cpuinfo` # Fonction d'encodage function encode () { # $1 : numéro du fichier dans la liste des fichiers à encoder # $2 : chemin complet du fichier FICHIER=$(basename "$2") # Ne pas réécrire par-dessus un fichier existant [ -e "$DEST/$FICHIER" ] && echo "$DEST/$FICHIER existe déjà, pas de modification" && return # Copie uniquement s'il ne s'agit pas d'un mp3 if [ $(echo "${FICHIER##*.}" | tr [:upper:] [:lower:]) != "mp3" ]; then echo "Copie de [$1] $FICHIER" cp -a "$2" "$DEST/$FICHIER" return fi # Réencodage lame -S --mp3input --cbr -b "$BITRATE" "$2" "$DEST/$FICHIER" & # Affichage du début d'encodage echo $(date "+%a %e, %T -> Encodage de [$1] $FICHIER") # Attente de la fin de l'encodage wait # Écriture des étiquettes id3 ID3=$(eyeD3 -v "$2") eyeD3 --to-v2.3 -a "$(echo "$ID3" | sed -n 's/^.*TPE1): \(.*\)>$/\1/p')" \ -A "$(echo "$ID3" | sed -n 's/^.*TALB): \(.*\)>$/\1/p')" \ -t "$(echo "$ID3" | sed -n 's/^.*TIT2): \(.*\)>$/\1/p')" \ -n "$(echo "$ID3" | sed -n 's/^.*TRCK): \(.*\)>$/\1/p')" \ -G "$(echo "$ID3" | sed -n 's/^.*TCON): \(.*\)>$/\1/p')" \ -Y "$(echo "$ID3" | sed -n 's/^.*\(TYER\|TDRC\)): \(.*\)>$/\2/p')" \ "$DEST/$FICHIER" > /dev/null 2> /dev/null # Image de l'album COVER="$(dirname "$2")/cover.jpg" COVERTMP="/tmp/$(echo "$COVER" | tr '/' '_')" [ ! -e "$COVERTMP" ] && [ -e "$COVER" ] && convert -resize "${IMSIZE}x$IMSIZE" -quality 85 "$COVER" "$COVERTMP" [ -e "$COVERTMP" ] && eyeD3 --add-image="$COVERTMP":FRONT_COVER "$DEST/$FICHIER" > /dev/null 2> /dev/null # Mise de l'heure de modification identique à celle du fichier original touch -r "$2" "$DEST/$FICHIER" } # Corps : description de la liste des fichiers à encoder for i in `seq $#`; do FICHIER="${!i%/}" # Gestion des répertoires : comportement récursif if [ -d "$FICHIER" ]; then DEST2="$DEST/$(basename "$FICHIER")" if [ ! -d "$DEST2" ] && ( ! mkdir -p "$DEST2" ); then echo "Le répertoire $DEST2 n'existe pas et ne peut être créé." continue fi find "$FICHIER/" -maxdepth 1 -mindepth 1 -print0 | xargs -0 "$0" "$DEST2" continue fi # Si on est arrivé au dernier fichier, il ne faut plus chercher # à lancer de nouveaux encodages pour les autres processeurs [ $# -eq $i ] && NPROC=1 # Encodage encode $i "$FICHIER" & sleep 0.5 # Gestion des processus while true; do PIDS=`jobs -rp` # Si pas encore assez de processus lancés, on continue [ `echo "$PIDS" | wc -w` -lt $NPROC ] && break sleep 1 done done