<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet title="XSL formatting" type="text/xsl" href="http://www.causeries-numeriques.fr/feed/rss2/xslt" ?><rss version="2.0"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:wfw="http://wellformedweb.org/CommentAPI/"
  xmlns:content="http://purl.org/rss/1.0/modules/content/">
<channel>
  <title>Causeries numériques - mp3</title>
  <link>http://www.causeries-numeriques.fr/</link>
  <description></description>
  <language>fr</language>
  <pubDate>Tue, 07 Feb 2012 14:32:21 +0100</pubDate>
  <copyright></copyright>
  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
  <generator>Dotclear</generator>
  
    
  <item>
    <title>Manipulation de tags mp3 avec Perl, Ruby et Python</title>
    <link>http://www.causeries-numeriques.fr/post/2007/06/13/Manipulation-de-tags-mp3-avec-Perl-Ruby-et-Python</link>
    <guid isPermaLink="false">urn:md5:2516246ceeeb3ede44e198d20a43a497</guid>
    <pubDate>Wed, 13 Jun 2007 08:49:00 +0200</pubDate>
    <dc:creator>jb</dc:creator>
        <category>Des pingouins et des hommes</category>
        <category>id3</category><category>mp3</category><category>perl</category><category>python</category><category>ruby</category>    
    <description>&lt;p&gt;Pour les petits scripts de quelques lignes, trois langages se partagent le terrain&amp;nbsp;: Perl, Python et Ruby. Le problème du jour est la modification de &lt;em&gt;tags&lt;/em&gt; ID3 ainsi que le renomage de fichiers.&lt;/p&gt;    &lt;h3&gt;Présentation du problème&lt;/h3&gt;

&lt;p&gt;Je podcast l'émission &lt;a href=&quot;http://www.rtl.fr/radio/emission.asp?dicid=504270&quot;&gt;Le grand juron&lt;/a&gt; en utilisant iPodder. Le problème est que les fichiers reçus sont stockés avec un nom du style&amp;nbsp;: &lt;code&gt;podcasting_temp_0000541_541680.mp3?podName=LEGDJURON&lt;/code&gt; et ils n'ont pas d'extension &lt;code&gt;.mp3&lt;/code&gt;.
Le nom n'est pas vraiment explicite pour retrouver une émission quelconque. Généralement, pendant l'écoute, je mets le tag &lt;em&gt;title&lt;/em&gt; à la date du jour.
Le but de ces scripts est de sauvegarder le fichier sous la forme &lt;code&gt;jour mois année.mp3&lt;/code&gt; et de mettre le nom de l'émission dans le tag &lt;em&gt;artist&lt;/em&gt;.&lt;/p&gt;


&lt;h3&gt;En Perl&lt;/h3&gt;


&lt;h4&gt;Pré requis&lt;/h4&gt;


&lt;p&gt;De nombreux module permettent de traiter les fichiers mp3, j'ai retenu &lt;code&gt;MP3::Info&lt;/code&gt; présent sur le CPAN à l'adresse &lt;a href=&quot;http://search.cpan.org/~daniel/MP3-Info-1.22/lib/MP3/Info.pm&quot;&gt;mp3info&lt;/a&gt;. Pour l'installer, il y a trois ligne de commande à taper&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt; perl Makefile.PL  
 make
 sudo make install&lt;/pre&gt;


&lt;h4&gt;Le script&lt;/h4&gt;


&lt;p&gt;Il est très simple, on construit la liste des fichiers à traiter avec un &lt;code&gt;glob&lt;/code&gt; et on utilise le module pour lire et modifier les tags.&lt;/p&gt;

&lt;code class=&quot;perl&quot;&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;#!/usr/bin/perl -w&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;use&lt;/span&gt; MP3::&lt;span style=&quot;color: #006600;&quot;&gt;Info&lt;/span&gt;;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #b1b100;&quot;&gt;foreach&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;$fichier&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;a href=&quot;http://www.perldoc.com/perl5.6/pod/func/glob.html&quot;&gt;&lt;span style=&quot;color: #000066;&quot;&gt;glob&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;'*LE*'&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://www.perldoc.com/perl5.6/pod/func/print.html&quot;&gt;&lt;span style=&quot;color: #000066;&quot;&gt;print&lt;/span&gt;&lt;/a&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;$fichier&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #b1b100;&quot;&gt;my&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;$mp3&lt;/span&gt; = MP3::&lt;span style=&quot;color: #006600;&quot;&gt;Info&lt;/span&gt;-&amp;gt;&lt;span style=&quot;color: #006600;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;$fichier&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #0000ff;&quot;&gt;$mp3&lt;/span&gt;-&amp;gt;&lt;span style=&quot;color: #006600;&quot;&gt;artist&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;'Le grand juron'&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;a href=&quot;http://www.perldoc.com/perl5.6/pod/func/rename.html&quot;&gt;&lt;span style=&quot;color: #000066;&quot;&gt;rename&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;$fichier&lt;/span&gt;, &lt;span style=&quot;color: #0000ff;&quot;&gt;$mp3&lt;/span&gt;-&amp;gt;&lt;span style=&quot;color: #006600;&quot;&gt;title&lt;/span&gt;.&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;.mp3&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;br /&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/code&gt;



&lt;h3&gt;En Ruby&lt;/h3&gt;


&lt;h4&gt;Pré requis&lt;/h4&gt;


&lt;p&gt;Un module (&lt;em&gt;gem&lt;/em&gt;) est nécessaire pour pouvoir lire et modifier les tags mp3. Pour installer le &lt;em&gt;gem&lt;/em&gt; &lt;code&gt;ruby-mp3info&lt;/code&gt;, il suffit d'utiliser la commande &lt;code&gt;sudo gem install ruby-mp3info&lt;/code&gt;&lt;/p&gt;


&lt;p&gt;L'API est disponible sur &lt;a href=&quot;http://ruby-mp3info.rubyforge.org/&quot; hreflang=&quot;en&quot;&gt;mp3info&lt;/a&gt;&lt;/p&gt;


&lt;h4&gt;Le script&lt;/h4&gt;


&lt;p&gt;Le script n'est pas très différent de celui en Perl, rien de bien sorcier.&lt;/p&gt;

&lt;code class=&quot;ruby&quot;&gt;&lt;span style=&quot;color:#008000; font-style:italic;&quot;&gt;#!/usr/bin/ruby -w&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color:#CC0066; font-weight:bold;&quot;&gt;require&lt;/span&gt; &lt;span style=&quot;color:#996600;&quot;&gt;&amp;quot;rubygems&amp;quot;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color:#CC0066; font-weight:bold;&quot;&gt;require&lt;/span&gt; &lt;span style=&quot;color:#996600;&quot;&gt;&amp;quot;mp3info&amp;quot;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Dir.&lt;span style=&quot;color:#9900CC;&quot;&gt;glob&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color:#996600;&quot;&gt;&amp;quot;*LE*&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;do&lt;/span&gt; |fichier|&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color:#CC0066; font-weight:bold;&quot;&gt;puts&lt;/span&gt; &lt;span style=&quot;color:#996600;&quot;&gt;&amp;quot;#{fichier}&amp;quot;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; nom = ''&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Mp3Info.&lt;span style=&quot;color:#CC0066; font-weight:bold;&quot;&gt;open&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#40;&lt;/span&gt;fichier&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;do&lt;/span&gt; |infos|&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;infos.&lt;span style=&quot;color:#9900CC;&quot;&gt;tag&lt;/span&gt;.&lt;span style=&quot;color:#9900CC;&quot;&gt;artist&lt;/span&gt; = &lt;span style=&quot;color:#996600;&quot;&gt;&amp;quot;Le grand juron&amp;quot;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; nom = infos.&lt;span style=&quot;color:#9900CC;&quot;&gt;tag&lt;/span&gt;.&lt;span style=&quot;color:#9900CC;&quot;&gt;title&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;end&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; File.&lt;span style=&quot;color:#9900CC;&quot;&gt;rename&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#40;&lt;/span&gt;fichier,nom+&lt;span style=&quot;color:#996600;&quot;&gt;&amp;quot;.mp3&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#006600; font-weight:bold;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;br /&gt;
&lt;span style=&quot;color:#9966CC; font-weight:bold;&quot;&gt;end&lt;/span&gt;&lt;/code&gt;


&lt;h3&gt;En Python&lt;/h3&gt;


&lt;h4&gt;Pré requis&lt;/h4&gt;


&lt;p&gt;J'ai un peu cherché pour trouver un module permettant de lire/modifier les tags. Mon choix s'est porté sur &lt;a href=&quot;http://id3-py.sourceforge.net/&quot;&gt;ID3&lt;/a&gt;. 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&amp;nbsp;? Un petit&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt; sudo aptitude install python-id3&lt;/pre&gt;

&lt;p&gt;me permet de constater que oui&amp;nbsp;!&lt;/p&gt;


&lt;h4&gt;Le script&lt;/h4&gt;


&lt;p&gt;Pas beaucoup de différences non plus...&lt;/p&gt;

&lt;code class=&quot;python&quot;&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;#!/usr/bin/python&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;import&lt;/span&gt; &lt;span style=&quot;color: #dc143c;&quot;&gt;glob&lt;/span&gt;, &lt;span style=&quot;color: #dc143c;&quot;&gt;os&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;from&lt;/span&gt; ID3 &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;import&lt;/span&gt; *&lt;br /&gt;
&lt;br /&gt;
fichiers = &lt;span style=&quot;color: #dc143c;&quot;&gt;glob&lt;/span&gt;.&lt;span style=&quot;color: #dc143c;&quot;&gt;glob&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;*LE*&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;for&lt;/span&gt; fichier &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;in&lt;/span&gt; fichiers:&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;print&lt;/span&gt; fichier&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; mp3 = ID3&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;fichier&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; mp3&lt;span style=&quot;color: black;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;'ARTIST'&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#93;&lt;/span&gt; = &lt;span style=&quot;color: #483d8b;&quot;&gt;'Le grand juron'&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; mp3.&lt;span style=&quot;color: black;&quot;&gt;write&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #dc143c;&quot;&gt;os&lt;/span&gt;.&lt;span style=&quot;color: black;&quot;&gt;rename&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;fichier,mp3&lt;span style=&quot;color: black;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;'TITLE'&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#93;&lt;/span&gt;+&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;.mp3&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;;&lt;/code&gt;


&lt;p&gt;Il n'est pas possible de simplifier les deux premières lignes en&amp;nbsp;:&lt;/p&gt;
&lt;code class=&quot;python&quot;&gt;&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;for&lt;/span&gt; fichier &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;in&lt;/span&gt; &lt;span style=&quot;color: #dc143c;&quot;&gt;glob&lt;/span&gt;.&lt;span style=&quot;color: #dc143c;&quot;&gt;glob&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;*LE*&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;:&lt;/code&gt;



&lt;h3&gt;Tests des différents scripts&lt;/h3&gt;


&lt;h4&gt;Version utilisées des différents langages&amp;nbsp;:&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Perl&amp;nbsp;: 5.8.7&lt;/li&gt;
&lt;li&gt;Ruby&amp;nbsp;: 1.8.4&lt;/li&gt;
&lt;li&gt;Python&amp;nbsp;: 2.4.3&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Système Ubuntu 6.06&lt;/p&gt;


&lt;h4&gt;Temps de conversion avec l'affichage du nom du fichier&lt;/h4&gt;

&lt;p&gt;Pour comparer (un peu...) les différents script, l'utilitaire &lt;code&gt;time&lt;/code&gt; 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&amp;nbsp;:&lt;/p&gt;
&lt;table&gt;
  &lt;tr&gt; &lt;td&gt;Langage&lt;/td&gt; &lt;td&gt;10 fichiers&lt;/td&gt; &lt;td&gt;20 fichiers&lt;/td&gt; &lt;td&gt;50 fichiers&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt; &lt;td&gt;Perl&lt;/td&gt; &lt;td&gt;env. 1s&lt;/td&gt; &lt;td&gt;env. 1.5s&lt;/td&gt; &lt;td&gt;end. 3s&lt;/td&gt; &lt;/tr&gt;
  &lt;tr&gt; &lt;td&gt;Python&lt;/td&gt; &lt;td&gt;env. 1s&lt;/td&gt; &lt;td&gt;env. 1s&lt;/td&gt; &lt;td&gt;env. 2s&lt;/td&gt; &lt;/tr&gt;
  &lt;tr&gt; &lt;td&gt;Ruby&lt;/td&gt; &lt;td&gt;env. 1s&lt;/td&gt; &lt;td&gt;env. 1s&lt;/td&gt; &lt;td&gt;env. 15s&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;



&lt;p&gt;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.&lt;/p&gt;


&lt;h4&gt;Temps de conversion sans affichage du nom du fichier&lt;/h4&gt;

&lt;table&gt;
  &lt;tr&gt; &lt;td&gt;Langage&lt;/td&gt; &lt;td&gt;10 fichiers&lt;/td&gt; &lt;td&gt;20 fichiers&lt;/td&gt; &lt;td&gt;50 fichiers&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt; &lt;td&gt;Perl&lt;/td&gt; &lt;td&gt;env. 1s&lt;/td&gt; &lt;td&gt;env. 1s&lt;/td&gt; &lt;td&gt;env. 2s&lt;/td&gt; &lt;/tr&gt;
  &lt;tr&gt; &lt;td&gt;Python&lt;/td&gt; &lt;td&gt;env. 1s&lt;/td&gt; &lt;td&gt;env. 1s&lt;/td&gt; &lt;td&gt;env. 1s&lt;/td&gt; &lt;/tr&gt;
  &lt;tr&gt; &lt;td&gt;Ruby&lt;/td&gt; &lt;td&gt;env. 1s&lt;/td&gt; &lt;td&gt;env. 1s&lt;/td&gt; &lt;td&gt;env. 14s&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;



&lt;h4&gt;Bilan&lt;/h4&gt;


&lt;p&gt;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 ?...&lt;/p&gt;</description>
    
    
    
          <comments>http://www.causeries-numeriques.fr/post/2007/06/13/Manipulation-de-tags-mp3-avec-Perl-Ruby-et-Python#comment-form</comments>
      <wfw:comment>http://www.causeries-numeriques.fr/post/2007/06/13/Manipulation-de-tags-mp3-avec-Perl-Ruby-et-Python#comment-form</wfw:comment>
      <wfw:commentRss>http://www.causeries-numeriques.fr/feed/rss2/comments/6</wfw:commentRss>
      </item>
    
</channel>
</rss>
