Linux Quimper

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

(piero) #1

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 Like

(Michel) #2

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

1 Like

(l'homme réparé) #3

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

0 Likes

(vincent) #4

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

Scandale !

1 Like

(Otyugh) #5

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.

0 Likes

(Otyugh) #6

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

2 Likes

(piero) #7

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

0 Likes

(Otyugh) #8

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 Likes

(piero) #9

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

Un grand merci @Otyugh !!!

0 Likes

(Otyugh) #10

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 Likes

(piero) #11

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

0 Likes

(Otyugh) #12

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:

0 Likes

(vincent) #13

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 Like

(vincent) #14

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 Like

(piero) #15

et en plus, ça marche !

thanks, mister C-code :slight_smile:

1 Like

(piero) #16

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

(merci parallel)

0 Likes

(vincent) #17

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.

0 Likes