Morceaux de musique

Où l’on va voir comment utiliser le nom du fichier de musique pour mettre à jour les tags ID3.

Le contexte

J’avais plein de fichiers musicaux dont le nom était correct, mais dont les méta-informations étaient fausses ou inexistantes. J’ai installé l’outil en ligne de commande id3v2 qui permet de positionner ces informations. Mais voilà, gérer 20 fichiers les uns après les autres, c’est gentil, 1500 c’est autre chose.

« Sers-toi du shell Luke »

Bien sûr qu’un shell script va m’aider. Mes fichiers sont classés dans des dossiers, par interprète, titre de l’album (avec l’année), et chaque nom de fichier est constitué avec le numéro de piste, la titre du morceaux et l’extension :

David Bowie/1972 The Rise And Fall Of Ziggy Stardust And The Spiders From Mars/01 Five Years.mp3
David Bowie/1972 The Rise And Fall Of Ziggy Stardust And The Spiders From Mars/02 Soul Love.mp3
David Bowie/1972 The Rise And Fall Of Ziggy Stardust And The Spiders From Mars/03 Moonage Daydream.mp3
David Bowie/1972 The Rise And Fall Of Ziggy Stardust And The Spiders From Mars/04 Starman.mp3
David Bowie/1972 The Rise And Fall Of Ziggy Stardust And The Spiders From Mars/05 It Ain’t Easy.mp3
David Bowie/1972 The Rise And Fall Of Ziggy Stardust And The Spiders From Mars/06 Lady Stardust.mp3
David Bowie/1972 The Rise And Fall Of Ziggy Stardust And The Spiders From Mars/07 Star.mp3
David Bowie/1972 The Rise And Fall Of Ziggy Stardust And The Spiders From Mars/08 Hang Onto Yourself.mp3
David Bowie/1972 The Rise And Fall Of Ziggy Stardust And The Spiders From Mars/09 Ziggy Stardust.mp3
David Bowie/1972 The Rise And Fall Of Ziggy Stardust And The Spiders From Mars/11 Rock ’N’ Roll Suicide.mp3
{{ < /highlight >}}

Nous connaissons l’interprète (David Bowie), l’année (1972) et le titre de l’album (The Rise And Fall Of Ziggy Stardust And The Spiders From Mars)
<br>
Il faut maintenant, dans le répertoire de l’album, faire une boucle sur les fichiers dont l’extension est <code>mp3</code>, en supprimer l’extension et en extraire le numéro de piste et le titre du morceaux. Si cela ne pose pas de problème pour <code>Starman.mp3</code>, c’est autre de chose pour <code>Rock ’N’ Roll Suicide.mp3</code> en raison des espaces que comprend le titre.
<br>
Nous allons utiliser plusieurs outils pour réaliser l’extraction des informations (<code>basename</code>, <code>awk</code>).
<br>
Une fois l’extraction terminée, nous passons les informations à <code>id3v2</code>.
<br>
Voici le scripts&nbsp;:

<div class="highlight"><div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code><span style="white-space:pre;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 1
</span><span style="white-space:pre;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 2
</span><span style="white-space:pre;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 3
</span><span style="white-space:pre;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 4
</span><span style="white-space:pre;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 5
</span><span style="white-space:pre;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 6
</span><span style="white-space:pre;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 7
</span><span style="white-space:pre;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 8
</span><span style="white-space:pre;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 9
</span><span style="white-space:pre;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">10
</span><span style="white-space:pre;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">11
</span><span style="white-space:pre;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">12
</span><span style="white-space:pre;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">13
</span><span style="white-space:pre;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">14
</span><span style="white-space:pre;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">15
</span><span style="white-space:pre;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">16
</span><span style="white-space:pre;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">17
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#75715e">#! /bin/sh
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span><span style="color:#66d9ef">for</span> i in ls *.mp3
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">do</span>
</span></span><span style="display:flex;"><span>	morceau<span style="color:#f92672">=</span><span style="color:#66d9ef">$(</span>basename $i .mp3<span style="color:#66d9ef">)</span>
</span></span><span style="display:flex;"><span>	echo $morceau
</span></span><span style="display:flex;"><span>	titre<span style="color:#f92672">=</span><span style="color:#66d9ef">$(</span>echo <span style="color:#e6db74">&#34;</span>$morceau<span style="color:#e6db74">&#34;</span> | awk <span style="color:#e6db74">&#39;{print substr($0,4)}&#39;</span><span style="color:#66d9ef">)</span>
</span></span><span style="display:flex;"><span>	echo <span style="color:#e6db74">&#34;titre == </span>$titre<span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span>	no_piste<span style="color:#f92672">=</span><span style="color:#66d9ef">$(</span>echo <span style="color:#e6db74">&#34;</span>$morceau<span style="color:#e6db74">&#34;</span> | awk <span style="color:#e6db74">&#39;{print $1}&#39;</span><span style="color:#66d9ef">)</span>
</span></span><span style="display:flex;"><span>	print $no_piste
</span></span><span style="display:flex;"><span>	id3v2 -t $titre -T $no_piste $i -g <span style="color:#ae81ff">62</span> -a <span style="color:#e6db74">&#34;David Bowie&#34;</span> -A <span style="color:#e6db74">&#34;The Rise And Fall Of Ziggy Stardust And The Spiders From Mars&#34;</span> -y <span style="color:#ae81ff">1972</span>
</span></span><span style="display:flex;"><span>	id3v2 -l $i
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">done</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">{{</span> &lt; /highlight &gt;<span style="color:#f92672">}}</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>Je vous laisse allez plus loin en faisant les boucles qui viennent au dessus pour extraire le nom de l’album et l’année, et celle qui va permettre d<span style="color:#960050;background-color:#1e0010">&#39;</span>extraire le nom de l’artiste <span style="color:#f92672">(</span>ou du groupe<span style="color:#f92672">)</span>.
</span></span><span style="display:flex;"><span>&lt;br&gt;
</span></span><span style="display:flex;"><span>Amusez-vous bien.</span></span></code></pre></td></tr></table>
</div>
</div>