{"id":6432,"date":"2024-02-03T19:46:37","date_gmt":"2024-02-03T18:46:37","guid":{"rendered":"https:\/\/olivier.hoarau.site\/?p=6432"},"modified":"2024-02-04T09:34:13","modified_gmt":"2024-02-04T08:34:13","slug":"taguer-ses-fichiers-audio-en-ligne-de-commande-avec-beets","status":"publish","type":"post","link":"https:\/\/olivier.hoarau.org\/?p=6432","title":{"rendered":"Taguer ses fichiers audio en ligne de commande avec beets"},"content":{"rendered":"\n<p>Apr\u00e8s mon<a href=\"https:\/\/olivier.hoarau.org\/?p=6417\"> post pour taguer les fichiers audio via via une interface graphique<\/a>, voici le compl\u00e9ment pour taguer les fichiers en ligne de commande avec l&rsquo;outil <strong>beets<\/strong> avec quelques scripts utiles.<br><a href=\"https:\/\/beets.io\/\">Beets<\/a> est un outil \u00e9crit en <strong>python<\/strong> qui tout comme <a href=\"https:\/\/picard.musicbrainz.org\/\">MusicBrainz Picard <\/a>permet de taguer automatiquement les fichiers audio \u00e0 partir de la base de donn\u00e9es musicales de <a href=\"https:\/\/musicbrainz.org\/\">MusicBrainz<\/a>. Rappelons que <strong>MusicBrainz<\/strong> est une vaste biblioth\u00e8que musicale totalement libre qui collecte des m\u00e9tadonn\u00e9es musicales que tout un chacun peut alimenter.<\/p>\n\n\n\n<p><strong>Beets<\/strong> utilise une base de donn\u00e9es locales o\u00f9 sont stock\u00e9es les m\u00e9tadatas par fichier audio, les m\u00eames m\u00e9tadatas peuvent \u00eatre enregistr\u00e9s dans chaque fichier. Je l&rsquo;ai install\u00e9 sur ma mageia 9 tout simplement en tapant <strong>pip install beets<\/strong><\/p>\n\n\n\n<p>Le fichier de configuration se trouve sous<strong> \/home\/olivier\/.config\/beets\/config.yaml <\/strong>et contiendra a minima<\/p>\n\n\n\n<div style=\"height: 250px; position:relative; margin-bottom: 50px;\" class=\"wp-block-simple-code-block-ace\"><pre class=\"wp-block-simple-code-block-ace\" style=\"position:absolute;top:0;right:0;bottom:0;left:0\" data-mode=\"sh\" data-theme=\"monokai\" data-fontsize=\"14\" data-lines=\"Infinity\" data-showlines=\"true\" data-copy=\"false\">directory : \/anatole\/beets-music #le r\u00e9pertoire contenant les fichiers audio qui seront copi\u00e9s ou d\u00e9plac\u00e9s\nlibrary: \/anatole\/beets-music\/music-database.db #la base de donn\u00e9es\n\nimport:\n    copy: no #si yes les fichiers audio modifi\u00e9s seront copi\u00e9s dans le r\u00e9pertoire d\u00e9fini plus haut\n    move: no #si yes les fichiers audio modifi\u00e9es seront d\u00e9plac\u00e9s dans le r\u00e9pertoire d\u00e9fini plus haut\n    write: no #si yes les m\u00e9tadatas seront enregistr\u00e9s dans le fichier, si no elles seront seulement enregistr\u00e9es dans la base de donn\u00e9es<\/pre><\/div>\n\n\n\n<p>Maintenant pour importer des fichiers audio, il suffit d&rsquo;indiquer le r\u00e9pertoire o\u00f9 se trouvent les fichiers audio en tapant <strong>beet import -s \/anatole\/musiques\/classement\\ par\\ genre\/rock<\/strong><\/p>\n\n\n\n<p>L&rsquo;option <strong>-s <\/strong>pour singleton permet de traiter chaque fichier comme une piste ind\u00e9pendante, sinon par d\u00e9faut il va consid\u00e9rer que toutes les pistes du r\u00e9pertoire font partie d&rsquo;un unique album. Le traitement va se lancer de mani\u00e8re plus ou moins automatique, quand il identifie sans ambigu\u00eft\u00e9 un fichier audio, on va avoir quelque chose comme cela<\/p>\n\n\n\n<div style=\"height: 250px; position:relative; margin-bottom: 50px;\" class=\"wp-block-simple-code-block-ace\"><pre class=\"wp-block-simple-code-block-ace\" style=\"position:absolute;top:0;right:0;bottom:0;left:0\" data-mode=\"text\" data-theme=\"monokai\" data-fontsize=\"14\" data-lines=\"Infinity\" data-showlines=\"true\" data-copy=\"false\">\/anatole\/musiques\/classement par genre\/rock\/ACDC - hell bells.mp3\nTagging track: AC\/DC - Hells Bells\nURL:\n    https:\/\/musicbrainz.org\/recording\/5da479ac-3b98-43f6-88d8-6afeb9ccfcc7\n(Similarity: 100.0%)\n\n\/anatole\/musiques\/classement par genre\/rock\/ACDC - highway to hell.mp3\nTagging track: AC\/DC - Highway to Hell\nURL:\n    https:\/\/musicbrainz.org\/recording\/5935ec91-8124-42ff-937f-f31a20ffe58f\n(Similarity: 100.0%)\n\n\/anatole\/musiques\/classement par genre\/rock\/ACDC - Let Me Put My Love Into You.mp3\nTagging track: AC\/DC - Let Me Put My Love Into You\nURL:\n    https:\/\/musicbrainz.org\/recording\/69de4ab7-bfce-424e-b109-d96b34801516\n(Similarity: 100.0%)<\/pre><\/div>\n\n\n\n<!--more-->\n\n\n\n<p>parfois il peut demander de modifier automatiquement l&rsquo;intitul\u00e9 pour trouver le bon fichier<\/p>\n\n\n\n<div style=\"height: 250px; position:relative; margin-bottom: 50px;\" class=\"wp-block-simple-code-block-ace\"><pre class=\"wp-block-simple-code-block-ace\" style=\"position:absolute;top:0;right:0;bottom:0;left:0\" data-mode=\"plain_text\" data-theme=\"monokai\" data-fontsize=\"14\" data-lines=\"Infinity\" data-showlines=\"true\" data-copy=\"false\">\/anatole\/musiques\/classement par genre\/rock\/ACDC - shot down in flames.mp3\nCorrecting track tags from:\n    AC\/DC - shot down in flames\nTo:\n    AC\/DC - Shot Down in Flames\nURL:\n    https:\/\/musicbrainz.org\/recording\/bf80d304-2c72-4352-9ced-3aaed8632346\n(Similarity: 100.0%)<\/pre><\/div>\n\n\n\n<p>Quand il n&rsquo;a pas trouv\u00e9 une similarit\u00e9 \u00e0 100%, il demande une confirmation<\/p>\n\n\n\n<div style=\"height: 250px; position:relative; margin-bottom: 50px;\" class=\"wp-block-simple-code-block-ace\"><pre class=\"wp-block-simple-code-block-ace\" style=\"position:absolute;top:0;right:0;bottom:0;left:0\" data-mode=\"plain_text\" data-theme=\"monokai\" data-fontsize=\"14\" data-lines=\"Infinity\" data-showlines=\"true\" data-copy=\"false\">\/anatole\/musiques\/classement par genre\/rock\/3 door's down - when I'm gone.mp3\nCorrecting track tags from:\n    3 Doors Down - When I'm Gone\nTo:\n    3 Doors Down - When I\u2019m Gone\nURL:\n    https:\/\/musicbrainz.org\/recording\/aa82cd16-2777-4bd2-8068-851810fadae6\n(Similarity: 93.6%) (length)\n[A]pply, More candidates, Skip, Use as-is, Enter search, enter Id, aBort? A<\/pre><\/div>\n\n\n\n<p>et quand il trouve plusieurs similarit\u00e9s, il nous laisse le choix<\/p>\n\n\n\n<div style=\"height: 250px; position:relative; margin-bottom: 50px;\" class=\"wp-block-simple-code-block-ace\"><pre class=\"wp-block-simple-code-block-ace\" style=\"position:absolute;top:0;right:0;bottom:0;left:0\" data-mode=\"text\" data-theme=\"monokai\" data-fontsize=\"14\" data-lines=\"Infinity\" data-showlines=\"true\" data-copy=\"false\">\/anatole\/musiques\/classement par genre\/rock\/ACDC - Big Gun.mp3\nFinding tags for track \"AC\/DC - Big Gun\".\nCandidates:\n1. AC\/DC - Big Gun (58.3%) (id)\n2. AC\/DC - Big Gun (58.3%) (id)\n3. AC\/DC - Big Gun (58.3%) (id)\n4. AC\/DC - Big Gun (54.9%) (id, length)\n5. AC\/DC - Big Gun (50.0%) (id)\n# selection (default 1), Skip, Use as-is, Enter search, enter Id, aBort? 1\nTagging track: AC\/DC - Big Gun\nURL:\n    https:\/\/musicbrainz.org\/recording\/0588b976-c15a-4ca4-89fc-46ca10dac2da\n(Similarity: 58.3%) (id)\nApply, More candidates, Skip, Use as-is, Enter search, enter Id, aBort? A<\/pre><\/div>\n\n\n\n<p>parfois il ne trouve pas du tout et dans ce cas il faut aller sur le site de <strong>MusicBrainz<\/strong>, trouver le morceau en question et relever son \u00ab\u00a0recording Id\u00a0\u00bb<\/p>\n\n\n\n<div style=\"height: 250px; position:relative; margin-bottom: 50px;\" class=\"wp-block-simple-code-block-ace\"><pre class=\"wp-block-simple-code-block-ace\" style=\"position:absolute;top:0;right:0;bottom:0;left:0\" data-mode=\"text\" data-theme=\"monokai\" data-fontsize=\"14\" data-lines=\"Infinity\" data-showlines=\"true\" data-copy=\"false\">\/anatole\/musiques\/classement par genre\/rock\/Jimi Hendrix - hey joe.mp3\nTagging track: The Jimi Hendrix Experience - Hey Joe\nURL:\n    https:\/\/musicbrainz.org\/recording\/98839598-c702-4666-ba7f-1da11a1d6611\n(Similarity: 83.3%) (length)\n[A]pply, More candidates, Skip, Use as-is, Enter search, enter Id, aBort? m\nFinding tags for track \"The Jimi Hendrix Experience - Hey Joe\".\nCandidates:\n1. The Jimi Hendrix Experience - Hey Joe (83.3%) (length)\n2. The Jimi Hendrix Experience - Hey Joe (50.0%) (id)\n3. The Jimi Hendrix Experience - Hey Joe (50.0%) (id)\n4. The Jimi Hendrix Experience - Hey Joe (50.0%) (id)\n5. The Jimi Hendrix Experience - Hey Joe (41.7%) (id, length)\n6. The Jimi Hendrix Experience - Hey Joe (41.7%) (id, length)\n# selection (default 1), Skip, Use as-is, Enter search, enter Id, aBort? e\nArtist: Jimi Hendrix\nTrack: Hey Joe\nTagging track: The Jimi Hendrix Experience - Hey Joe\nURL:\n    https:\/\/musicbrainz.org\/recording\/98839598-c702-4666-ba7f-1da11a1d6611\n(Similarity: 83.3%) (length)\n[A]pply, More candidates, Skip, Use as-is, Enter search, enter Id, aBort? i\nEnter recording ID: 0a0d07ea-2933-4b4c-8f7f-b68a68013bfd\nCorrecting track tags from:\n    The Jimi Hendrix Experience - Hey Joe\nTo:\n    Jimi Hendrix - Hey Joe\nURL:\n    https:\/\/musicbrainz.org\/recording\/0a0d07ea-2933-4b4c-8f7f-b68a68013bfd\n(Similarity: 33.6%) (id, length, artist)\nApply, More candidates, Skip, Use as-is, Enter search, enter Id, aBort? a<\/pre><\/div>\n\n\n\n<p>On peut \u00e9galement avoir ce cas de figure<\/p>\n\n\n\n<div style=\"height: 250px; position:relative; margin-bottom: 50px;\" class=\"wp-block-simple-code-block-ace\"><pre class=\"wp-block-simple-code-block-ace\" style=\"position:absolute;top:0;right:0;bottom:0;left:0\" data-mode=\"text\" data-theme=\"monokai\" data-fontsize=\"14\" data-lines=\"Infinity\" data-showlines=\"true\" data-copy=\"false\">\/anatole\/musiques\/classement par genre\/rock\/Chuck Berry - roll over Beethoven.mp3\nFinding tags for track \"Chuck Berry - Roll over Beethoven\".\nCandidates:\n1. Chuck Berry - Roll Over Beethoven (70.6%) (id)\n2. Chuck Berry - Roll Over Beethoven (70.6%) (id)\n3. Chuck Berry - Roll Over Beethoven (68.7%) (id, length)\n4. Chuck Berry - Roll Over Beethoven (41.2%) (id)\n5. Chuck Berry - Roll Over Beethoven (41.2%) (id)\n6. Chuck Berry - Roll Over Beethoven (39.7%) (id, length)\n7. Chuck Berry - Roll Over Beethoven (29.4%) (id, length)\n8. The Swing Commanders - Roll Over Beethoven (Berry) (18.4%) (id, length, artist, ...)\n# selection (default 1), Skip, Use as-is, Enter search, enter Id, aBort? \nCorrecting track tags from:\n    Chuck Berry - Roll over Beethoven\nTo:\n    Chuck Berry - Roll Over Beethoven\nURL:\n    https:\/\/musicbrainz.org\/recording\/f4c25958-5e6e-4890-8937-62507c9f41e1\n(Similarity: 70.6%) (id)\nApply, More candidates, Skip, Use as-is, Enter search, enter Id, aBort? a\nThis item is already in the library!\nOld: MP3, 128kbps, 2:31, 2.4 MiB\nNew: MP3, 252kbps, 2:23, 4.4 MiB\n[S]kip new, Keep all, Remove old, Merge all? R<\/pre><\/div>\n\n\n\n<p>une fois que c&rsquo;est termin\u00e9, on peut lister le contenu de la base de donn\u00e9es en tapant<strong>  beet list<\/strong> et pour chercher une cha\u00eene de caract\u00e8re dans la base, on tapera simplement <strong>beet list grange<\/strong> qui donnera<\/p>\n\n\n\n<div style=\"height: 250px; position:relative; margin-bottom: 50px;\" class=\"wp-block-simple-code-block-ace\"><pre class=\"wp-block-simple-code-block-ace\" style=\"position:absolute;top:0;right:0;bottom:0;left:0\" data-mode=\"text\" data-theme=\"monokai\" data-fontsize=\"14\" data-lines=\"Infinity\" data-showlines=\"true\" data-copy=\"false\">ZZ Top - Tres hombres - La Grange<\/pre><\/div>\n\n\n\n<p>Pour connaitre les titres dat\u00e9s de 1977 on tapera<strong> beet list year:1977 <\/strong>et pour une plage de dates <strong>beet list year:1970..1980<\/strong>. Il suffira de compl\u00e9ter la commande par &#8211;<strong>-f &lsquo;$path<\/strong>&lsquo; pour que les fichiers apparaissent avec un chemin en absolu et rediriger vers un fichier \u00e0 l&rsquo;extension <strong>.m3u<\/strong> pour cr\u00e9er ainsi une playlist pr\u00eate \u00e0 l&#8217;emploi. Cela donne :<\/p>\n\n\n\n<div style=\"height: 250px; position:relative; margin-bottom: 50px;\" class=\"wp-block-simple-code-block-ace\"><pre class=\"wp-block-simple-code-block-ace\" style=\"position:absolute;top:0;right:0;bottom:0;left:0\" data-mode=\"sh\" data-theme=\"monokai\" data-fontsize=\"14\" data-lines=\"Infinity\" data-showlines=\"true\" data-copy=\"false\"> beet list -f '$path' year:1970..1980 > playlist-ann\u00e9es70.m3u<\/pre><\/div>\n\n\n\n<p>Pour connaitre les champs sur lesquels on peut filtre, il faudra activer le plugins info en rajoutant <strong>info<\/strong> \u00e0 la ligne <strong>plugins<\/strong> du fichier de configuration. Et un <strong>beet info zz top legs<\/strong> donnera<\/p>\n\n\n\n<div style=\"height: 250px; position:relative; margin-bottom: 50px;\" class=\"wp-block-simple-code-block-ace\"><pre class=\"wp-block-simple-code-block-ace\" style=\"position:absolute;top:0;right:0;bottom:0;left:0\" data-mode=\"text\" data-theme=\"monokai\" data-fontsize=\"14\" data-lines=\"Infinity\" data-showlines=\"true\" data-copy=\"false\">\/anatole\/musiques\/classement par genre\/rock\/ZZ top - leggs.mp3\n            album: Eliminator\n      albumartist: ZZ Top\n      albumstatus: official\n        albumtype: album\n       albumtypes: album\n              art: True\n           artist: ZZ Top\n      artist_sort: ZZ Top\n          artists: ZZ Top\n         bitdepth: 0\n          bitrate: 128000\n     bitrate_mode: \n       catalognum: CD 23774\n      catalognums: CD 23774\n         channels: 2\n          country: US\n             date: 1983-03-23\n              day: 23\n             disc: 1\n        disctotal: 1\n     encoder_info: \n encoder_settings: \n           format: MP3\n            genre: Rock\n           genres: Rock\n             isrc: USWB10702822\n            label: Warner Bros. Records\n           length: 273.901875\n mb_albumartistid: a81259a0-a2f5-464b-866e-71220f2739f1\nmb_albumartistids: a81259a0-a2f5-464b-866e-71220f2739f1\n       mb_albumid: ac85b905-13c2-48f6-8951-d45612205fc2\n      mb_artistid: a81259a0-a2f5-464b-866e-71220f2739f1\n     mb_artistids: a81259a0-a2f5-464b-866e-71220f2739f1\nmb_releasegroupid: c58b50f0-d7a4-322c-b281-d86ebe3b8acf\nmb_releasetrackid: c1ced785-f7cb-3180-94f7-a9814419f949\n       mb_trackid: b7072e8d-39f8-4e7c-8c30-4317ca590d2e\n            media: CD\n            month: 3\n    original_date: 1983-01-01\n    original_year: 1983\n       samplerate: 44100\n           script: Latn\n            title: Legs\n            track: 6\n       tracktotal: 11\n             year: 1983\n<\/pre><\/div>\n\n\n\n<p>Pour filtrer sur le genre musical on tapera ainsi <strong>beet list genre:rock<\/strong>.<\/p>\n\n\n\n<p><strong>beets<\/strong> b\u00e9n\u00e9ficie de pas mal de plugins comme on peut le voir sur cette <a href=\"https:\/\/beets.readthedocs.io\/en\/stable\/plugins\/index.html\">page<\/a>. Le plugin <a href=\"https:\/\/github.com\/adamjakab\/BeetsPluginBpmAnalyser\">bpmanalyser<\/a> permet ainsi  calculer le tempo d&rsquo;un morceau et d&rsquo;inscrire cette information dans un tag <strong>bpm<\/strong> dans les m\u00e9tadatas.  Sur ma Mageia 9, je l&rsquo;ai install\u00e9 en tapant:<\/p>\n\n\n\n<div style=\"height: 250px; position:relative; margin-bottom: 50px;\" class=\"wp-block-simple-code-block-ace\"><pre class=\"wp-block-simple-code-block-ace\" style=\"position:absolute;top:0;right:0;bottom:0;left:0\" data-mode=\"sh\" data-theme=\"monokai\" data-fontsize=\"14\" data-lines=\"Infinity\" data-showlines=\"true\" data-copy=\"false\">python3-numpy-devel\npython3-aubio\npip install beets-bpmanalyser<\/pre><\/div>\n\n\n\n<p>On active le plugins en rajoutant <strong>bpmanalyser<\/strong> au niveau de la ligne <strong>plugins<\/strong> du fichier de configuration<\/p>\n\n\n\n<div style=\"height: 250px; position:relative; margin-bottom: 50px;\" class=\"wp-block-simple-code-block-ace\"><pre class=\"wp-block-simple-code-block-ace\" style=\"position:absolute;top:0;right:0;bottom:0;left:0\" data-mode=\"php\" data-theme=\"monokai\" data-fontsize=\"14\" data-lines=\"Infinity\" data-showlines=\"true\" data-copy=\"false\">plugins: info bpmanalyser<\/pre><\/div>\n\n\n\n<p>Par exemple pour afficher simplement le tempo des chansons de AC\/DC sans modification de la base de donn\u00e9es ou des fichiers (option <strong>dry-run<\/strong>), on tapera <strong>beet bpmanalyser &#8211;dry-run artist:AC\/DC<\/strong> voil\u00e0 le r\u00e9sultat<\/p>\n\n\n\n<div style=\"height: 250px; position:relative; margin-bottom: 50px;\" class=\"wp-block-simple-code-block-ace\"><pre class=\"wp-block-simple-code-block-ace\" style=\"position:absolute;top:0;right:0;bottom:0;left:0\" data-mode=\"php\" data-theme=\"monokai\" data-fontsize=\"14\" data-lines=\"Infinity\" data-showlines=\"true\" data-copy=\"false\">bpmanalyser: Bpm[128]: \/anatole\/musiques\/classement par genre\/rock\/ACDC - You Shook Me All Night Long.mp3\nbpmanalyser: Bpm[ERROR]: - \/anatole\/musiques\/classement par genre\/rock\/ACDC - Let Me Put My Love Into You.mp3\nbpmanalyser: Bpm[135]: \/anatole\/musiques\/classement par genre\/rock\/ACDC - Big Gun.mp3\nbpmanalyser: Bpm[128]: \/anatole\/musiques\/classement par genre\/rock\/ACDC - hell bells.mp3\nbpmanalyser: Bpm[132]: \/anatole\/musiques\/classement par genre\/rock\/ACDC - shot down in flames.mp3\nbpmanalyser: Bpm[135]: \/anatole\/musiques\/classement par genre\/rock\/ACDC - thunderstruck.mp3<\/pre><\/div>\n\n\n\n<p>Si on souhaite modifier seulement les fichiers qui n&rsquo;ont pas le tag <strong>bpm<\/strong>, on tapera <strong>beet bpmanalyser bpm:0<\/strong> cela va donner quelque chose comme cela<\/p>\n\n\n\n<div style=\"height: 250px; position:relative; margin-bottom: 50px;\" class=\"wp-block-simple-code-block-ace\"><pre class=\"wp-block-simple-code-block-ace\" style=\"position:absolute;top:0;right:0;bottom:0;left:0\" data-mode=\"php\" data-theme=\"monokai\" data-fontsize=\"14\" data-lines=\"Infinity\" data-showlines=\"true\" data-copy=\"false\">Update tempo information on all songs where it is missing\n\nbpmanalyser: Bpm[123]: \/anatole\/musiques\/classement par genre\/rock\/Aerosmith - jaded.mp3\nbpmanalyser: Bpm[157]: \/anatole\/musiques\/classement par genre\/kitsch\/Antoine - la moto godille.mp3\nbpmanalyser: Bpm[107]: \/anatole\/musiques\/classement par genre\/rock\/Aerosmith - cryin'.mp3\nbpmanalyser: Bpm[ERROR]: - \/anatole\/musiques\/classement par genre\/rock\/Aerosmith - I don't wanna miss a thing.mp3<\/pre><\/div>\n\n\n\n<p>Certains fichiers peuvent g\u00e9n\u00e9rer une erreur qui est visible en rajoutant les options <strong>-vv<\/strong><\/p>\n\n\n\n<div style=\"height: 250px; position:relative; margin-bottom: 50px;\" class=\"wp-block-simple-code-block-ace\"><pre class=\"wp-block-simple-code-block-ace\" style=\"position:absolute;top:0;right:0;bottom:0;left:0\" data-mode=\"php\" data-theme=\"monokai\" data-fontsize=\"14\" data-lines=\"Infinity\" data-showlines=\"true\" data-copy=\"false\">RuntimeError: AUBIO ERROR: source_avcodec: error when sending packet for<\/pre><\/div>\n\n\n\n<p>Pour les fichiers en question <strong>ffprobe<\/strong> donne ce warning<\/p>\n\n\n\n<div style=\"height: 250px; position:relative; margin-bottom: 50px;\" class=\"wp-block-simple-code-block-ace\"><pre class=\"wp-block-simple-code-block-ace\" style=\"position:absolute;top:0;right:0;bottom:0;left:0\" data-mode=\"php\" data-theme=\"monokai\" data-fontsize=\"14\" data-lines=\"Infinity\" data-showlines=\"true\" data-copy=\"false\">[mp3 @ 0x1c2b4c0] Skipping 351 bytes of junk at 24586.\n[mp3 @ 0x1c2b4c0] Estimating duration from bitrate, this may be inaccurate<\/pre><\/div>\n\n\n\n<p>On peut penser qu&rsquo;il est pr\u00e9f\u00e9rable de r\u00e9g\u00e9n\u00e9rer les dits fichiers. Pour relancer une analyse pour l&rsquo;ensemble des fichiers de la base avec \u00e9criture dans chacun des fichiers on tapera <strong>beet bpmanalyser &#8211;force &#8211;write<\/strong><\/p>\n\n\n\n<p>Maintenant quelques scripts utiles bas\u00e9s sur ce qu&rsquo;on vient de voir. Le script pour cr\u00e9er une playlist avec des fichiers musicaux dans une fourchette de tempo bas\u00e9 sur la commande <strong>ffprobe<\/strong><\/p>\n\n\n\n<div style=\"height: 250px; position:relative; margin-bottom: 50px;\" class=\"wp-block-simple-code-block-ace\"><pre class=\"wp-block-simple-code-block-ace\" style=\"position:absolute;top:0;right:0;bottom:0;left:0\" data-mode=\"sh\" data-theme=\"monokai\" data-fontsize=\"14\" data-lines=\"Infinity\" data-showlines=\"true\" data-copy=\"false\">#!\/bin\/bash\nread -p \"Valeur tempo min (par d\u00e9faut 0): \" min \nread -p \"Valeur tempo max (par d\u00e9faut 200): \" max\nread -p \"Chemin absolu ou relatif dans le fichier playlist (par d\u00e9faut relatif): \" chemin\nif [ -z \"$min\" ]\nthen \n   $min=0\nfi\nif [ -z \"$max\" ]\nthen\n   $max=200\nfi\nif [ \"$chemin\" = \"absolu\" ]\nthen\n    path=$(pwd)\nelse\n    path=\".\"\nfi\nIFS=$'\\n'\nplaylist=\"playlist\/playlist-tempo-entre-$min-$max.m3u\"\nrm -f $playlist\nfor fichier in $(find $path type f | grep '\/*.ogg\\|\/*.mp3\\|\/*.flac')\ndo\n      tempo=$(ffprobe -loglevel quiet -hide_banner -show_entries format_tags=TBPM -of default=noprint_wrappers=1:nokey=1 $fichier 2>&amp;1)\n      if [ -n \"$tempo\" ]\n      then\n      \tif [ $tempo -gt $min ] &amp;&amp; [ $tempo -lt $max ]\n      \tthen\n        \techo \"Fichier trouv\u00e9 $fichier tempo $tempo\"\n        \techo $fichier>>$playlist\n\tfi\n      fi\ndone;\nunset IFS<\/pre><\/div>\n\n\n\n<p>\u00c7a peut donner des r\u00e9sultats surprenants, rappelons que le <a href=\"https:\/\/fr.wikipedia.org\/wiki\/Tempo\">tempo<\/a> correspond au battement r\u00e9gulier qui rythme le morceau. Il s&rsquo;exprime en battement ou pulsation par minute et on peut tr\u00e8s bien avoir des chansons bien rythm\u00e9s avec du bon gros son de guitares satur\u00e9es avec un tempo plut\u00f4t lent. <br>Le tempo n&rsquo;est sans doute pas la valeur miracle pour cr\u00e9er des playlists de musiques qui sonnent de mani\u00e8re similaire \u00e0 l&rsquo;oreille et il sera sans doute utile de le compl\u00e9ter avec d&rsquo;autres caract\u00e9ristiques audio comme le rythme qui correspond \u00e0 la dur\u00e9e des notes.<br>Sans entrer dans des complications de traitement du signal pour analyser chaque fichier audio, il existe le plugin <a href=\"https:\/\/beets.readthedocs.io\/en\/stable\/plugins\/acousticbrainz.html\">acousticbrainz<\/a> qui permet de r\u00e9cup\u00e9rer l&rsquo;ensemble un certain nombre de champs d&rsquo;analyse audio disponibles dans la base <strong>MusicBrainz<\/strong>, dont le rythme, la tonalit\u00e9, la \u00ab\u00a0dan\u00e7abilit\u00e9\u00a0\u00bb d&rsquo;un morceau, etc.<\/p>\n\n\n\n<p>On activera tout d&rsquo;abord le plugin en rajoutant <strong>acousticbrainz<\/strong> au niveau de la ligne <strong>plugins<\/strong> du fichier de configuration<\/p>\n\n\n\n<div style=\"height: 250px; position:relative; margin-bottom: 50px;\" class=\"wp-block-simple-code-block-ace\"><pre class=\"wp-block-simple-code-block-ace\" style=\"position:absolute;top:0;right:0;bottom:0;left:0\" data-mode=\"sh\" data-theme=\"monokai\" data-fontsize=\"14\" data-lines=\"Infinity\" data-showlines=\"true\" data-copy=\"false\">plugins: info bpmanalyser acousticbrainz<\/pre><\/div>\n\n\n\n<p>on tape ensuite <strong>beet acousticbrainz<\/strong> pour t\u00e9l\u00e9charger les m\u00e9tadatas d&rsquo;analyse audio. Voil\u00e0 le r\u00e9sultat<\/p>\n\n\n\n<div style=\"height: 250px; position:relative; margin-bottom: 50px;\" class=\"wp-block-simple-code-block-ace\"><pre class=\"wp-block-simple-code-block-ace\" style=\"position:absolute;top:0;right:0;bottom:0;left:0\" data-mode=\"text\" data-theme=\"monokai\" data-fontsize=\"14\" data-lines=\"Infinity\" data-showlines=\"true\" data-copy=\"false\">acousticbrainz: getting data for: Antoine - La Motogodille - La Motogodille\nacousticbrainz: recording ID 5d89b304-4448-4605-b03e-c133f7e66c2e not found\nacousticbrainz: getting data for: Apollo 440 - Gettin' High on Your Own Supply - Stop the Rock\nacousticbrainz: getting data for: Aqua - Aquarius - Cartoon Heroes\nacousticbrainz: getting data for: Ash - Meltdown - Starcrossed\n\n(...)\n\nacousticbrainz: recording ID da9e7176-6495-4c54-8a23-41c2fa87bb02 not found\nacousticbrainz: getting data for: ZZ Top - Eliminator - Legs\nacousticbrainz: recording ID def311a4-58ed-4c3c-adf0-a00fb13b4fb0 not found\nacousticbrainz: getting data for: ZZ Top - Incinerator - Rough Boy\nacousticbrainz: recording ID c4d362b8-12c8-4b20-a2fa-b37f19ba39a0 not found\nacousticbrainz: getting data for: ZZ Top - Tres hombres - La Grange<\/pre><\/div>\n\n\n\n<p>Ces m\u00e9tadatas suppl\u00e9mentaires sont inscrites dans la base de donn\u00e9e et n&rsquo;apparaissent pas directement dans le fichier audio, pour les visualiser on tapera par exemple <strong>beet info -l zz top gimme all your lovin<\/strong>, l&rsquo;option <strong>-l <\/strong>indique qu&rsquo;il faut lire ce qu&rsquo;il y a dans la base de donn\u00e9e et non dans le fichier directement, voil\u00e0 ce que \u00e7a donnera<\/p>\n\n\n\n<div style=\"height: 250px; position:relative; margin-bottom: 50px;\" class=\"wp-block-simple-code-block-ace\"><pre class=\"wp-block-simple-code-block-ace\" style=\"position:absolute;top:0;right:0;bottom:0;left:0\" data-mode=\"text\" data-theme=\"monokai\" data-fontsize=\"14\" data-lines=\"Infinity\" data-showlines=\"true\" data-copy=\"false\">acoustid_id: e3f5a31c-7238-4815-8f6a-240211ed380f\n               added: 2024-01-27 17:34:48\n               album: Eliminator\n            album_id: \n         albumartist: ZZ Top\n  albumartist_credit: \n    albumartist_sort: \n       albumdisambig: \n         albumstatus: official\n           albumtype: album\n          albumtypes: ['album']\n            arranger: \n              artist: ZZ Top\n       artist_credit: ZZ Top\n         artist_sort: ZZ Top\n                asin: \n    average_loudness: 0.895212\n            bitdepth: 0\n             bitrate: 128kbps\n                 bpm: 0\n          catalognum: CD 23774\n            channels: 2\n chords_changes_rate: 0.039907\n          chords_key: C\n  chords_number_rate: 0.001550\n        chords_scale: major\n            comments: \n                comp: False\n            composer: \n       composer_sort: \n             country: US\n           danceable: 0.826061\n         data_source: MusicBrainz\n                 day: 23\n                disc: 01\n     discogs_albumid: 0\n    discogs_artistid: 0\n     discogs_labelid: 0\n           disctitle: \n           disctotal: 01\n             encoder: \n            filesize: 3850833\n              format: MP3\n              gender: male\n               genre: Rock\n    genre_rosamerica: pop\n            grouping: \n                  id: 1381\n         initial_key: \n                isrc: USRHD0709703;USWB10301934;USWB10702680;USWB11202723;USWB11300067;USWB11301286;USWB11901051;USWB19902780\n        key_strength: 0.792436\n               label: Warner Bros. Records\n            language: \n              length: 3:58\n            lyricist: \n              lyrics: \n    mb_albumartistid: a81259a0-a2f5-464b-866e-71220f2739f1\n          mb_albumid: ac85b905-13c2-48f6-8951-d45612205fc2\n         mb_artistid: a81259a0-a2f5-464b-866e-71220f2739f1\n   mb_releasegroupid: c58b50f0-d7a4-322c-b281-d86ebe3b8acf\n   mb_releasetrackid: \n          mb_trackid: 6dd73bac-956b-40ef-be01-860fcdd4990b\n           mb_workid: \n               media: CD\n               month: 03\n       mood_acoustic: 0.024929\n     mood_aggressive: 0.727396\n     mood_electronic: 0.762750\n          mood_happy: 0.305811\n          mood_party: 0.443847\n        mood_relaxed: 0.136193\n            mood_sad: 0.061455\n         moods_mirex: Cluster5\n               mtime: 1970-01-01 01:00:00\n        original_day: 00\n      original_month: 00\n       original_year: 1983\n                path: \/anatole\/musiques\/classement par genre\/rock\/ZZ Top - gimme all your lovin.mp3\n     r128_album_gain: 000000\n     r128_track_gain: 000000\nreleasegroupdisambig: \n       rg_album_gain: 0.0\n       rg_album_peak: 0.0\n       rg_track_gain: 0.0\n       rg_track_peak: 0.0\n              rhythm: 0.000000\n          samplerate: 44kHz\n              script: Latn\n           singleton: True\n               style: \n              timbre: bright\n               title: Gimme All Your Lovin\u2019\n               tonal: 0.420130\n               track: 01\n       trackdisambig: \n          tracktotal: 11\n  voice_instrumental: voice\n                work: \n       work_disambig: \n                year: 1983<\/pre><\/div>\n\n\n\n<p>Maintenant pour faire la liste des titres dans la valeur de <strong>danceable<\/strong> est entre 0.8 et 1, on tapera <strong>beet list -f &lsquo;$path&rsquo;<\/strong> <strong>danceable:0.8..1<\/strong>, cela va donner une liste de fichiers audio avec leur chemin absolu qui peut en l&rsquo;\u00e9tat constituer une playlist. \u00c7a sera similaire pour les autres valeurs d&rsquo;analyse audio. <\/p>\n\n\n\n<p>Ce n&rsquo;est qu&rsquo;un survol de <strong>beets<\/strong> qui permet une configuration assez pouss\u00e9e comme on peut en juger en visualisant ce floril\u00e8ge de fichier de configuration comme <a href=\"https:\/\/gist.github.com\/Kovrinic\/03d94cf203f99b709ce5\">ce fichier<\/a>, <a href=\"https:\/\/pastebin.com\/8ixAw3xj\">celui l\u00e0<\/a> et<a href=\"https:\/\/github.com\/florib779\/beets-config\/blob\/master\/config.yaml\"> celui l\u00e0 <\/a>encore.<\/p>\n\n\n\n<p>Pour terminer deux scripts pour classer les fichiers audio par ann\u00e9e de sortie et par artiste, \u00e7a va cr\u00e9er une arborescence avec un lien vers le fichier d&rsquo;origine qui seront \u00e0 adapter bien s\u00fbr avec vos chemins. Premier script avec classement par ann\u00e9e.<\/p>\n\n\n\n<div style=\"height: 250px; position:relative; margin-bottom: 50px;\" class=\"wp-block-simple-code-block-ace\"><pre class=\"wp-block-simple-code-block-ace\" style=\"position:absolute;top:0;right:0;bottom:0;left:0\" data-mode=\"sh\" data-theme=\"monokai\" data-fontsize=\"14\" data-lines=\"Infinity\" data-showlines=\"true\" data-copy=\"false\">#!\/bin\/bash\nIFS=$'\\n'\nchemin=\"\/ultra\/data\/musiques\"\nrep_genre=\"classement par genre\"\nrep_annee=\"classement par ann\u00e9e\"\nrep_sans_annee=\"_Titres non dat\u00e9s\"\nif [ -d \"$chemin\/$rep_annee\" ];then\n  rm -Rf $chemin\/$rep_annee\nfi\nfor fichier in $(find $chemin\/$rep_genre type f | grep '\/*.ogg\\|\/*.mp3\\|\/*.flac')\ndo\n  annee=$(ffprobe -loglevel quiet -hide_banner -show_entries format_tags=originalyear -of default=noprint_wrappers=1:nokey=1 $fichier 2>&amp;1)\n  if [ -z \"$annee\" ]\n  then\n     if [ ! -d \"$chemin\/$rep_annee\/$rep_sans_annee\" ];then\n         mkdir -p $chemin\/$rep_annee\/$rep_sans_annee\n     fi\n     ln -s $fichier $chemin\/$rep_annee\/$rep_sans_annee\n  else\n     if [ ! -d \"$chemin\/$rep_annee\/$annee\" ];then\n        mkdir -p $chemin\/$rep_annee\/$annee\n     fi\n     ln -s $fichier $chemin\/$rep_annee\/$annee\n   fi \ndone;\nunset IFS<\/pre><\/div>\n\n\n\n<p>Et le script avec classement par artiste<\/p>\n\n\n\n<div style=\"height: 250px; position:relative; margin-bottom: 50px;\" class=\"wp-block-simple-code-block-ace\"><pre class=\"wp-block-simple-code-block-ace\" style=\"position:absolute;top:0;right:0;bottom:0;left:0\" data-mode=\"sh\" data-theme=\"monokai\" data-fontsize=\"14\" data-lines=\"Infinity\" data-showlines=\"true\" data-copy=\"false\">#!\/bin\/bash\nIFS=$'\\n'\nchemin=\"\/ultra\/data\/musiques\"\nrep_genre=\"classement par genre\"\nrep_artiste=\"classement par artiste\"\nrep_sans_artiste=\"Artiste inconnu\"\nrm -Rf $chemin\/$rep_artiste\nfor fichier in $(find $chemin type f | grep '\/*.ogg\\|\/*.mp3\\|\/*.flac')\ndo\n  artiste=$(ffprobe -loglevel quiet -hide_banner -show_entries format_tags=artist -of default=noprint_wrappers=1:nokey=1 $fichier 2>&amp;1)\n  if [ -z \"$artiste\" ]\n  then\n     if [ ! -d \"$chemin\/$rep_artiste\/$rep_sans_artiste\" ];then\n         mkdir -p $chemin\/$rep_artiste\/$rep_sans_artiste\n     fi\n     ln -s $fichier $chemin\/$rep_artiste\/$rep_sans_artiste\n  else\n     if [ ! -d \"$chemin\/$rep_artiste\/$artiste\" ];then\n        mkdir -p $chemin\/$rep_artiste\/$artiste\n     fi\n     ln -s $fichier $chemin\/$rep_artiste\/$artiste\n   fi \ndone;\nunset IFS\n<\/pre><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Apr\u00e8s mon post pour taguer les fichiers audio via via une interface graphique, voici le compl\u00e9ment pour taguer les fichiers en ligne de commande avec l&rsquo;outil beets avec quelques scripts utiles.Beets est un outil \u00e9crit en python qui tout comme MusicBrainz Picard permet de taguer automatiquement les fichiers audio \u00e0 partir de la base de &hellip; <a href=\"https:\/\/olivier.hoarau.org\/?p=6432\" class=\"more-link\">Continuer la lecture de <span class=\"screen-reader-text\">Taguer ses fichiers audio en ligne de commande avec beets<\/span>  <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":4,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"ngg_post_thumbnail":0,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_post_was_ever_published":false,"_share_on_mastodon":"0"},"categories":[5],"tags":[44,27],"class_list":["post-6432","post","type-post","status-publish","format-standard","hentry","category-logiciels-libres","tag-audio","tag-linux"],"share_on_mastodon":{"url":"https:\/\/mastodon.social\/@funix\/111869034389942942","error":""},"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/peOjJ-1FK","jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/olivier.hoarau.org\/index.php?rest_route=\/wp\/v2\/posts\/6432","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/olivier.hoarau.org\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/olivier.hoarau.org\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/olivier.hoarau.org\/index.php?rest_route=\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/olivier.hoarau.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=6432"}],"version-history":[{"count":4,"href":"https:\/\/olivier.hoarau.org\/index.php?rest_route=\/wp\/v2\/posts\/6432\/revisions"}],"predecessor-version":[{"id":6446,"href":"https:\/\/olivier.hoarau.org\/index.php?rest_route=\/wp\/v2\/posts\/6432\/revisions\/6446"}],"wp:attachment":[{"href":"https:\/\/olivier.hoarau.org\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=6432"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/olivier.hoarau.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=6432"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/olivier.hoarau.org\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=6432"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}