Manipulation de tags mp3 avec Perl, Ruby et Python
Par jb le mercredi 13 juin 2007, 08:49 - Des pingouins et des hommes - Lien permanent
Pour les petits scripts de quelques lignes, trois langages se partagent le terrain : Perl, Python et Ruby. Le problème du jour est la modification de tags ID3 ainsi que le renomage de fichiers.
Présentation du problème
Je podcast l'émission Le grand juron en utilisant iPodder. Le problème est que les fichiers reçus sont stockés avec un nom du style : podcasting_temp_0000541_541680.mp3?podName=LEGDJURON et ils n'ont pas d'extension .mp3.
Le nom n'est pas vraiment explicite pour retrouver une émission quelconque. Généralement, pendant l'écoute, je mets le tag title à la date du jour.
Le but de ces scripts est de sauvegarder le fichier sous la forme jour mois année.mp3 et de mettre le nom de l'émission dans le tag artist.
En Perl
Pré requis
De nombreux module permettent de traiter les fichiers mp3, j'ai retenu MP3::Info présent sur le CPAN à l'adresse mp3info. Pour l'installer, il y a trois ligne de commande à taper :
perl Makefile.PL make sudo make install
Le script
Il est très simple, on construit la liste des fichiers à traiter avec un glob et on utilise le module pour lire et modifier les tags.
#!/usr/bin/perl -w
use MP3::Info;
foreach $fichier (glob('*LE*')){
print $fichier;
my $mp3 = MP3::Info->new($fichier);
$mp3->artist('Le grand juron');
rename($fichier, $mp3->title.".mp3");
}
En Ruby
Pré requis
Un module (gem) est nécessaire pour pouvoir lire et modifier les tags mp3. Pour installer le gem ruby-mp3info, il suffit d'utiliser la commande sudo gem install ruby-mp3info
L'API est disponible sur mp3info
Le script
Le script n'est pas très différent de celui en Perl, rien de bien sorcier.
#!/usr/bin/ruby -w
require "rubygems"
require "mp3info"
Dir.glob("*LE*") do |fichier|
puts "#{fichier}"
nom = ''
Mp3Info.open(fichier) do |infos|
infos.tag.artist = "Le grand juron"
nom = infos.tag.title
end
File.rename(fichier,nom+".mp3")
end
En Python
Pré requis
J'ai un peu cherché pour trouver un module permettant de lire/modifier les tags. Mon choix s'est porté sur ID3. Sur le site web (un peu vieux), il est annoncé que ce module est présent dans les distributions Debian, l'est-il sur Ubuntu ? Un petit :
sudo aptitude install python-id3
me permet de constater que oui !
Le script
Pas beaucoup de différences non plus...
#!/usr/bin/python
import glob, os
from ID3 import *
fichiers = glob.glob("*LE*")
for fichier in fichiers:
print fichier
mp3 = ID3(fichier)
mp3['ARTIST'] = 'Le grand juron'
mp3.write()
os.rename(fichier,mp3['TITLE']+".mp3");
Il n'est pas possible de simplifier les deux premières lignes en :
for fichier in glob.glob("*LE*"):
Tests des différents scripts
Version utilisées des différents langages :
- Perl : 5.8.7
- Ruby : 1.8.4
- Python : 2.4.3
Système Ubuntu 6.06
Temps de conversion avec l'affichage du nom du fichier
Pour comparer (un peu...) les différents script, l'utilitaire time du shell a été utilisé. Les scripts ont été testés sur des paquets de 10,20 et 50 fichiers. Les résultats (approximatifs) sont dans le tableau ci-dessous :
| Langage | 10 fichiers | 20 fichiers | 50 fichiers |
| Perl | env. 1s | env. 1.5s | end. 3s |
| Python | env. 1s | env. 1s | env. 2s |
| Ruby | env. 1s | env. 1s | env. 15s |
Sur le lot de 50 fichiers, Ruby freine brutalement au milieu du lot de fichier et le disque dur s'affole. Le problème provient probablement de l'accès aux fichiers.
Temps de conversion sans affichage du nom du fichier
| Langage | 10 fichiers | 20 fichiers | 50 fichiers |
| Perl | env. 1s | env. 1s | env. 2s |
| Python | env. 1s | env. 1s | env. 1s |
| Ruby | env. 1s | env. 1s | env. 14s |
Bilan
Après plusieurs séries de tests, les temps sont dans le même ordre. Il n'y a pas de grosse différences entre les trois langages sauf sur les gros lots de fichier pour lesquels Ruby freine à mis parcours. D'ailleurs quelqu'un sait pourquoi ?...
Commentaires