Gestion de fichiers audio.

Aujourd'hui, un billet pas comme les autres. Un billet aux confins-carrefour de plusieurs de mes passions et aux limites de mes compétences. C'est ce qu'on appelle apprendre, justement. J'aime ranger des fichiers, sinon je ne me serais pas dirigé vers le monde étrange de l'ID, de l'information documentaire. Par ailleurs, je suis tombé dans l'informatique libre il n'y a pas si longtemps. Enfin, comme beaucoup de gens j'écoute de la musique, mais comme un peu moins de gens, j'ai des exigences assez poussées quant au "rangement" de celle-ci, d'autant plus depuis qu'on dématérialise, c'est-à-dire qu'on accumule des disques durs qu'il faut faire tourner rapidement en consommant passablement d'énergie...

Donc, voilà. À la création de ma collection musicale numérique, j'ai copié 30 Go du disque dur de personne très proches, qui contenait d'ailleurs un certain nombre de mes CD, le tout rippé et "géré" avec iTunes. Et un bon nombre de ces fichiers étaient en .m4a. Il semble que cela corresponde au format AAC. La majorité des fichiers encodés avec ce formats ont un débit de 128 kbps. Je ne sais s'il est vrai que le ACC est meilleur même à un débit inférieur au MP3, mais pourquoi pas.

Quoiqu'il en soit, les fichiers .m4a de ma collection ne sont pas tous reconnus par gmusicbrowser, le logiciel que j'utilise pour gérer ma collection et écouter de la musique. Ce logiciel est invraisemblablement bon ! Mais ce n'est pas le sujet du jour. Et donc, j'avais comme projet de les transcoder, de préférence en OGG. Ce que je faisais jusqu'ici, un album de temps à autre, avec soundconverter.

Mais, je savais qu'il devait être possible de convertir tout d'un coup grâce à la puissance de la ligne de commande. J'avais déjà cherché ici ou là, mais n'avais pas encore réussi à faire quelque chose. Puis, je me suis dit que j'allais y arriver. J'ai d'abord essayé de transcoder un fichier avec ffmpeg (fr.wikipedia - doc.ubuntu-fr.org). J'y suis parvenu, mais certaines metadata (tags) avaient disparu, comme l'année. Ce qui ne pouvait pas me convenir.
Grâce à la documentation, j'ai appris que ffmeg ne gére pas les tags, tandis que gstreamer le fait. Il se trouve que soundconverter utilise gstreamer... Et sur la page de documentation sur soundconverter, il y a des informations intéressantes : avec l'option -b, on peut utiliser soundconverter en ligne de commande. Et il y a même un script indiqué pour transformer les .wma en .mp3 :

#!/bin/bash
for i in *.wma; do
 		j="${i%.wma}"
soundconverter -b -m audio/mpeg -s .mp3 "$j.wma" && rm -f "$j.wma"  && echo "$i réencodé en mp3."
done

Ce script doit être lancé en étant positionné dans le bon répertoire. Il fait une boucle et quand il trouve un fichier en [n'importe quoi].wma, il le transcode en mp3 avec soundconverter en ligne de commande, en précisant que l'extension doit bien être .mp3, puis il supprime le fichier .wma, et enfin il affiche à l'écran que le fichier dont il a été question a été réencodé en mp3. Comme je voulais transcoder du .m4a en .ogg, je l'ai modifié comme suit :

#!/bin/bash
cd /home/igor/Bureau/testmp4
for i in *.m4a; do
                j="${i%.m4a}"
soundconverter -b -m audio/x-vorbis -s .ogg "$j.m4a" && rm -f "$j.m4a"  && echo "$i réencodé en ogg."
chown -R igor:jeanneigor /home/igor/Bureau/testmp4
done

Tout d'abord, on se place dans le bon répertoire (oui, d'abord un répertoire de test, faut pas déconner...). Puis, on va chercher les fichier .m4a, on les transcode en ogg, on les supprime, on affiche à l'écran le nom du fichier qui vient d'être "réencodé en ogg" et on modifie les propriétaires du répertoire, parce que le répertoire Musique doit être accessible à deux utilisateurs différents de l'ordinateur.
Nouveau problème : si dans le répertoire, il y a une arborescence avec des sous-répertoires, voire des sous-sous-répertoires, ce script ne va pas réussir à les atteindre. J'ai d'abord essayé de modifier comme cela : for i in */*.m4a; do, mais ça ne fonctionne que pour un niveau, s'il y en a deux, c'est foutu. Tout de suite on voit bien que je bidouille des choses que je ne comprends pas vraiment. Ich learn zu hablar comme je peux, non ? :

Et justement, en quelques clic, hop, je me dirige sur le forum ubuntu, et je décris mon problème, un lundi de Pâques à 11:58. Et la réponse arrive à 12:14 ! C'est particulièrement rapide... La solution - merci pingouinux - est la suivante :

shopt -s globstar # En tête du script
for i in **/*.m4a; do

Ce que je comprends, c'est qu'il faut préciser une option de comportement du shell (shopt) :

globstar If set, the pattern ‘**’ used in a filename expansion context will match a files and zero or more directories and subdirectories. If the pattern is followed by a ‘/’, only directories and subdirectories match.
Effectivement, ça fonctionne bien.

En faisant quelques tests, je découvre que l'utilisation en ligne de commande de sounconverter ne permet pas de choisir la qualité d'encodage, mais ça n'a pas une grande importance puisque les fichiers sources ne sont pas encodé avec une bonne qualité (m4a à 128 kbps). Pour autant, il serait dommage de diminuer drastiquement celle-ci. J'ai donc choisi le format .mp3. Sounconverter le fait par défaut à 128 kbps. J'ai pensé que le processus ne devait pas être trop mauvais. D'autant que dans la mesure du possible, je vais importer à nouveau les albums concernés en .flac.
Et dans un premier temps, je me suis dit que si je pouvais avoir une liste des fichiers traités, ce serait chouette. Ce qui donne, après vérification sur le répertoire test, ce script :

#!/bin/bash
shopt -s globstar
cd /home/igor/Musique
for i in **/*.m4a; do 
 		j="${i%.m4a}"
soundconverter -b -m audio/mpeg -s .mp3 "$j.m4a" && rm -f "$j.m4a"  && echo "$i réencodé en mp3." && echo $i réencodé en mp3 >> /home/igor/Bureau/reencode_mp3_list.txt
chown -R igor:jeanneigor /home/igor/Musique
done

Une fois lancé sur le répertoire Musique, qui compte plus de 1'200 répertoires de premier niveau (correspondant aux noms d'artistes d'albums) et plus de 31'000 fichiers, je me suis aperçu que ça prenait pas mal de temps au script de passer d'un fichier à l'autre. Je me suis dit qu'il devait "faire la boucle" complète de l'ensemble des fichiers (le for i). Je suis donc parti en quête d'une autre solution.

J'avais pu lire qu'on pouvait en ligne de commande chercher un type de fichier et lui appliquer un traitement au moyen de la commande find et de l'option -exec. Là aussi, j'ai fait quelques recherche sur le forum ubuntu et quelques tests sur un répertoire test (ben oui). Et ça donne ce qui suit :

find /home/igor/Musique -name "*.m4a" -exec soundconverter -b -m audio/mpeg -s .mp3 {} \; -exec rm -f {} \;
Cette commande fait moins de choses que le script, mais elle travaille bien plus rapidement. Donc, elle va chercher les fichiers dont l'extension est ".m4a" dans l'arborescence "Musique", et converti un à un une fois trouvés ces fichiers en .mp3, et les efface. Avec cette méthode, je ne suis pas parvenu à écrire le nom des fichiers traités dans un fichier texte, mais j'ai configuré un filtre dans gmusicbrowser qui me permet d'identifier tous les fichiers encodé à un bitrate trop faible pour envisager les importer en .flac.
Enfin, pour cette histoire de propriétaire du répertoire Musique, il me suffit de faire un chmod -R igor:jeanneigor /home/igor/Musique.

Mais pourquoi est-ce que je te parle de ce genre de chose ? D'abord parce que, tout en ayant conscience que ce n'est que de l'apprentissage autodidacte, et donc maladroit, incomplet, voire faux, de compétences assez basiques, je suis assez content de l'expérience. Eh bien oui.
Ensuite, parce que je trouve que c'est assez représentatif de ce qu'implique la gestions de fichiers numériques aujourd'hui. C'est l'exemple du son, mais ça aurait pu être le cas d'une collection de photographies digitales. Je dis ça comme ça... ;)
Je trouve également que c'est là une curiosité que devrait avoir des représentant des métiers ID (Information documentaire), mais pas seulement. Pour le pire et le meilleur, et surtout pour tout le spectre qu'il y a entre ces deux extrêmes, l'informatique devient de plus en plus centrale dans notre existence. Je ne parierais pas sur la durabilité de cette caractéristique (c'est une technologie qui repose passablement sur la consommation à grande échelle des hydrocarbures...), mais pour le moment, il n'est certainement pas inutile de s'y intéresser. Et encore moins de se libérer, même en partie, même pas à pas.

Pour autant que l'on soit d'accord de "perdre son temps à apprendre"..., comme toujours.

6 commentaires

#1 : 2012-04-11 @ 12:53
Jeanne a dit :

Ah, ah, ah! Je te reconnais bien là! J'ai beau ne pas tout comprendre... Sérieusement, ne pas comprendre grand chose... ;), je suis admirative du chemin que tu as parcouru, des recherches que tu as faites, de l'aide que tu as reçue et de ta simple volonté ("Puis, je me suis dit que j’allais y arriver") qui t'ont permis de parvenir à faire cela. Et merci d'en faire profiter d'autres! Evidemment j'ai été particulièrement interpelée par la remarque sur les photographies digitales... je dis ça comme ça ;) C'est que j'hésite à attendre d'atteindre les 1 téra pour sévir! :) P.S.: Ca fait plaisir d'inaugurer cette nouvelle apparence. Très agréable.

#2 : 2012-04-11 @ 13:26
William a dit :

Très intéressant. J'aurais voulu te le signaler autrement que dans les commentaires, mais je te recommande, pour les blocs de codes/commandes d'utiliser la balise code et /code. Puisque la balise <em><code></em> n'est destinée qu'aux codes/blocs sur une seule ligne.

#3 : 2012-04-11 @ 13:46
iGor milhit a dit :

Merci pour ton commentaire :
Pour se comprendre, je remplace l'ouverture et fermeture de balise par '
J'avais vu que la balise 'code' avait un comportement inhabituel (pour moi). Mais je ne comprends pas bien ton commentaire, même vu depuis l'admin.
Il y a la balise : 'code'... '/code' → block : http://www.w3.org/wiki/HTML/Elements/code
et la balise : 'code' → ligne ?

Parce que personnellement, je ne connais que la première, et c'est celle que j'ai utilisée...

#4 : 2012-04-11 @ 13:48
iGor milhit a dit :

Tu dis 1 To comme ça, ou tu fais références à qqch de précis ? ;) Parce que tu vas fatalement y arriver, et plus rapidement qu'on l'imagine ! :)

#5 : 2012-04-11 @ 16:35
William a dit :

Ce que je veux te dire, c'est que la balise code n'est en général utilisée que pour afficher du code sur une seule ligne. Ou alors pour afficher des morceaux de codes.

Puisqu'il s'agit ici d'une suite de plusieurs commandes, soit tu encadres chaque ligne par la balise code, soit tu encadres le tout dans une balise pre :)

#6 : 2012-04-11 @ 19:58
iGor milhit a dit :

Ok, je comprends mieux. J'ai fait les modifications. Merci pour cette précision !

No comment.