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