FLAC to MP3 dans des sous-dossiers en ligne de commande

Bonjour les zami, un peu de bash le dimanche matin.

Vu que je suis toujours hésitant là dessus, j’ai trouvé une jolie commande (c’est pas tout jeune, 2012-2014) pour convertir tout mes sous-dossiers de flac en mp3 320 (lame Qualität) :
Attention de ne pas la lancer depuis n’importe quel répertoire !

find -name "*.flac" -exec bash -c 'ffmpeg -i "{}" -y -acodec libmp3lame -ab 320k "${0/.flac}.mp3"' {} \;

Après, un petit coup de

find -name "*.flac" -exec bash -c 'rm "{}"' \;

pour supprimer les flac’s en trop, et le tour est joué :slight_smile:

1 « J'aime »

Joli ! Vive le bash !
Je ne sais pas si cela me servira un jour, mais je prends note.

1 « J'aime »

Quel est l’intérêt de convertir un fichier d’un format libre à un format propriétaire :slight_smile:

Sans compter l’empreinte carbone d’une telle conversion !

Scandale !

1 « J'aime »

Les lecteurs mp3 qui lisent que des mp3 - personnellement j’en utilise
beaucoup et ceux qui lisent du flac/ogg sont une rareté ou des
smartphones espions :stuck_out_tongue:

La plupart des auto-radios aussi son souvent seulement compatible mp3.

…Sans parler du fait que mp3 est tombé dans le domaine publique
depuis décembre 2017 : MP3 — Wikipédia

2 « J'aime »

Si y’a des volontaires savants, je cherche à intégrer la suppression du fichier .flac, au fur et à mesure après encodage, à la première ligne de commande. Ça sera plus propre et permettra l’interruption et la reprise (au pire y’aura un doublon incomplet).

find -name "*.flac" -exec bash -c 'ffmpeg -i "{}" -y -acodec libmp3lame -ab 320k "${0%.flac}.mp3" && rm "${0}"' {} \;

Ha ben si de suite tu sors la brosse à lustrer, moi j’accoure.

Edition : pour “normaliser” un peu l’écriture pour que ça soit plus simple à piger (parce qu’on appelle la même variable de deux manières, alors qu’une seule ça va très bien) :
find -name "*.flac" -exec bash -c 'ffmpeg -i "$0" -y -acodec libmp3lame -ab 320k "${0/.flac/.mp3}" && rm "$0"' {} \;

2 « J'aime »

Testé ta commande retouchée [dans ton Edit] : résiste à plusieurs interruption [(Ctrl + c) x 2]

Un grand merci @Otyugh !!!

résiste à plusieurs interruption [(Ctrl + c) x 2]

Normalement ça « change rien » pour l’ordinateur, c’est plus pour
l’élégance. En fait y a deux processus à arrêter, d’où les deux « ctrl+c » : y a
cella de « find » qui itère sur chaque fichier, et ffmpeg qui fait la
conversion. Si tu fais que arrêter ffmpeg, find embraye sur un second
à moins que tu ne l’arrêtes avant.

Pour empêcher ça… Mhhhhm.
Ben faut encore ajouter un truc à cette ligne de commande plus si
courte :stuck_out_tongue:

find -name "*.flac" -exec bash -c 'ffmpeg -i "$0" -y -acodec libmp3lame -ab 320k "${0/.flac/.mp3}" && rm "$0" || kill $PPID' {} \;

Pour expliquer en « humain » : find itère sur tout ce qui finit .flac ; à chaque fois il appelle ffmpeg pour la conversion ; si la conversion est un succès, on supprime l’original, si la conversion est une erreur; on arrêter tout.

Sauf qu’un AUTRE problème arrive si on fait ça. Vu que parfois si tu veux reprendre la conversion, ben il y aura des fichiers déjà convertis, et ffmpeg se rendra compte, et t’enverra probablement un code d’erreur, et là ça va tout interrompre.
Hum. Doooonc.
find -name "*.flac" -exec bash -c '[ ! -f "${0/.flac/.mp3}" ] && { ffmpeg -i "$0" -y -acodec libmp3lame -ab 320k "${0/.flac/.mp3}" && rm "$0" || kill $PPID }' {} \;

Mais c’est grave du bricolage et à ce niveau vaudrait ptéte mieux écrire un vrai script :stuck_out_tongue:

2 « J'aime »

Franchement, ton code, la version Édit ci dessus, est exactement ce que je cherchais, et fonctionne parfaitement.

Pis ça m’arrange, j’avais pas testé le truc que j’ai envoyé par la suite et je suis sûr qu’y aurait eu des trucs à corriger :smiley:

Avec parallel (à installer via le gestionnaire de paquets), on transcode sur les x coeurs du processeur (x fichiers à la fois, donc – puisque lame ne permet pas de paralléliser le transcodage d’un fichier) :

find -name "*.flac" | parallel ffmpeg -i "{}" -y -acodec libmp3lame -ab 320k "{}.mp3" \; rm {}

À noter qu’ici, le nom du fichier destination gardera la “double extension” .flac.mp3.

1 « J'aime »

Et un court programme en C, pour faire la même chose :

À compiler avec la librairie pthread :

gcc fflthread.c -o fflthread -lpthread

On l’utilise ainsi :

find -name "*.flac" | xargs -d '\n' fflthread
1 « J'aime »

et en plus, ça marche !

thanks, mister C-code :slight_smile:

1 « J'aime »

pour faire la même chose quatre fois plus vite !!!

(merci parallel)

Au fond, parallel fait la même chose que mon programme (je suppose), à la différence que tu peux lui passer n’importe quelle commande.