9Mai

Nautilus-script : FLAC2MP3 pour que ça sonne bien dans la voiture

Par , 9 mai 2014 | GNU/Linux, Informatique, Multimédia | 0 Commentaire

Je ne sais pas pour vous mais, de mon côté, je ne conçois point de dépla­ce­ment moto­ri­sé sans musique. De plus, j'ai depuis long­temps pris l'habitude d'archiver ma musique sous forme numé­rique dans mon ordi­na­teur. Et pour cela, j'ai choi­si l'excellent for­mat FLAC.

Le seul pro­blème avec le FLAC c'est qu'à l'instar du MKV pour la vidéo (et pas la peine de venir troll sur la dif­fé­rence conteneur/codec, ça ne change rien à mon exemple), il est très peu sup­por­té par les lec­teurs hard­ware des­ti­nés au grand public. En fait, je ne connais per­son­nel­le­ment que deux modèles d'autoradio qui lisent le FLAC (mais il est tout à fait pos­sible qu'il y en ait d'autres), des Ken­wood pour ne pas les citer (je n'ai pas pour habi­tude de citer des marques mais quand les­dites marques font un effort pour sup­por­ter les codecs et conte­neurs libres, elles le méritent un tan­ti­net). D'autre part, il faut bien avouer que de lire du FLAC dans sa voi­ture pré­sente un inté­rêt somme toute limi­té, la dif­fé­rence de qua­li­té sonore avec un MP3 au bitrate suf­fi­sant en ce milieu bruyant qu'est une auto­mo­bile en marche n'étant vrai­sem­bla­ble­ment à la por­tée que de ceux ayant une ouïe digne de celle de Dare­de­vil, ce qui n'est pas mon cas. Et puis, même si le prix des clefs USB a sérieu­se­ment bais­sé ces der­nières années, il n'empêche que 400 mor­ceaux en MP3 prennent 4Go alors qu'en FLAC, ils en prennent 16 (en gros, hein, ne cher­chez pas la petite bête).

Enfin, le conte­nu de ma clef USB dédiée à l'autoradio change régu­liè­re­ment, au gré de mes envies et humeurs : je par­cours ma média­thèque quand sou­dain, j'avise un mor­ceau ou un album et le besoin de l'envoyer sur ma clef me cha­touille. Que faire ? Ouvrir une inter­face gra­phique ? Non mer­ci. Pas­ser par un ter­mi­nal ? J'aime la ligne de com­mande mais ça peut vite deve­nir fas­ti­dieux, même avec les alias qui vont bien. Par contre — ô joie — j'utilise Nau­ti­lus comme ges­tion­naire de fichiers. Et j'aime beau­coup me faire des petits scripts pour y ajou­ter des fonc­tion­na­li­tés. Alors quoi de plus logique, simple et pra­tique que d'en miton­ner un qui me per­met­tra de trans­for­mer mes FLAC en MP3 sur un simple clic-droit ? D'autant que je veux :

- enco­der mes FLAC en MP3 en
+ gar­dant les Tags que je fais avec amour quand je trans­code mes CD/vinyles/K7/whatever
+ nor­ma­li­sant le volume
+ maxi­mi­sant le volume
+ évi­tant toute saturation

Ben oui parce que devoir (presque) à chaque fois ajus­ter le volume quand ça passe d'un mor­ceau à l'autre, ça me brouille l'écoute, si vous voyez c'que j'veux dire et si vous me per­met­tez de manier le contre­pet sur un sujet aus­si grave. Donc, trêve de digres­sions oiseuses, place au script en question :

#!/bin/bash

IFS='
'

printf %s "$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS" |

while read -r f
 do
  flac2mp3() {
  # Retrieve the tags from the FLAC file
  ARTIST=$(metaflac "$1" --show-tag=ARTIST | cut -d= -f2-)
  TITLE=$(metaflac "$1" --show-tag=TITLE | cut -d= -f2-)
  ALBUM=$(metaflac "$1" --show-tag=ALBUM | cut -d= -f2-)
  GENRE=$(metaflac "$1" --show-tag=GENRE | cut -d= -f2-)
  TRACKNUMBER=$(metaflac "$1" --show-tag=TRACKNUMBER | cut -d= -f2-)
  TOTALTRACKS=$(metaflac "$1" --show-tag=TOTALTRACKS| cut -d= -f2-)
  DATE=$(metaflac "$1" --show-tag=DATE | cut -d= -f2-)
  COMMENT=$(metaflac "$1" --show-tag=COMMENT | cut -d= -f2-)
  # Actually do something
  flac -dc "$1" | lame -m j -q 0 --replaygain-accurate --vbr-new -V 0 -\
  --add-id3v2 --pad-id3v2 --ignore-tag-errors\
  --ta "$ARTIST"\
  --tt "$TITLE"\
  --tl "$ALBUM"\
  --tg "$GENRE"\
  --tn "$TRACKNUMBER"/"$TOTALTRACKS"\
  --ty "$DATE"\
  --tc "$COMMENT"\
  "$2".mp3;
  # Normalize, maximize and prevent clipping
  mp3gain -e -r -k -m 20 "$2".mp3;
  }
 
  # File or folder?
  if [[ -d $f ]]; then
   # Folder
   find "$f" -type f |\
   grep flac |\
   egrep -v "(Instrumental)|(Inst.)|(Instru.)" |\
   while read -r file
    do
     name="${file##*/}";
     name="${name%.*}";
     mkdir -p "$f"/$(basename "$f");
     cd "$f"/$(basename "$f");
     flac2mp3 "$file" "$name";
    done
  else
   # File
   name="${f##*/}";
   name="${name%.*}";
   flac2mp3 "$f" "$name";
  fi
done

# Let me know when you're done, dude
zenity --info --title='FLAC to MP3' --text="Conversion FLAC vers MP3 terminée."

Quelques notes :

Que fait le script, concrè­te­ment ? C'est simple : on prend un fichier en FLAC (sauf les pistes ins­tru­men­tales, si elles sont cor­rec­te­ment nom­mées), on récu­père ses Tags, on le stream dans lame pour l'encodage en MP3 (joint-ste­reo, qua­li­té 0, VBR new 0 — bref, la meilleure qua­li­té pos­sible — et on ajoute les Tags) puis on le passe à mp3gain pour nor­ma­li­ser et maxi­mi­ser le volume tout en inter­di­sant la satu­ra­tion. De ce fait, on obtient des MP3 haute qua­li­té ayant tous le même volume per­çu. C'est‑y pas beau, ça ?

Pour que ce script fonc­tionne, il vous faut avoir ins­tal­lé flac, lame, mp3gain et zeni­ty. Vous pou­vez avan­ta­geu­se­ment rem­pla­cer ce der­nier par noti­fy-send, par exemple, mais comme le trai­te­ment d'un grand nombre de fichier peut être rela­ti­ve­ment long, j'aime que le script me pré­sente un « OK » à cli­quer pour me signi­fier qu'il a fini alors qu'une noti­fi­ca­tion, on peut tou­jours la rater.

Je ne suis pas un génie du bash, alors il est fort pro­bable qu'on puisse faire un script mieux, plus beau, qui vous assu­re­ra un franc suc­cès auprès de la gent fémi­nine ou que sais-je encore mais en tout cas, il fonc­tionne. Ceci dit, si vous par­lez en bash à votre femme et que vous l'avez appris même à votre chat et que vous avez une sug­ges­tion, elle est bienvenue.

Il y a une limi­ta­tion connue : si vous lan­cez le script sur un dos­sier conte­nant des sous-dos­sier, tous les mor­ceaux iront dans un sous-dos­sier du dos­sier sur lequel vous lan­cez le script et por­tant son nom. Vous sui­vez ? Concrè­te­ment, je lance le script sur dossier1 qui contient dossier2 et dossier3, les mor­ceaux de dossier2 et dossier3 vont tous dans ./dossier1/dossier1. Per­son­nel­le­ment, je m'en fiche parce que 1) je ne mets pas de dis­co­gra­phie com­plète sur ma clef et 2) même si je vou­lais en mettre, il suf­fit d'aller dans dossier1, de sélec­tion­ner dossier2 et dossier3 et de lan­cer le script des­sus, ça fonc­tionne très bien.

Enfin, ça n'a rien à voir mais j'irais volon­tiers mettre mon poing dans la figure de l'ingénieur sadique au cer­veau déran­gé qui a conçu le sys­tème de clas­se­ment des mor­ceaux de mon auto­ra­dio… L'ordre alpha­bé­tique ? Trop simple, pas inté­res­sant, has-been. Non, si on pre­nait plu­tôt l'ordre d'écriture des fichiers sur la par­ti­tion ? Enfoi­ré ! ‑_-

Back to top

Pas peur d'Hadopi

Ce site Web est accessible en




ipv6 ready