Script mp3resample

Description

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.

Téléchargement

Télécharger mp3resample

mp3resample est distribué sous licence libre CeCILL.

Installation

Une fois le fichier téléchargé, vous devez

Ce logiciel nécessite l'utilisation des utilitaires lame, convert et eyeD3, installables sous Ubuntu ou Debian par

sudo aptitude install lame imagemagick eyed3

Aide en ligne

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

Transcript

#!/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