1import{_ as i,i as a,o as n,am as t}from"./chunks/framework.Dx2ObkfS.js";const g=JSON.parse('{"title":"Metadata Handling","description":"","frontmatter":{},"headers":[],"relativePath":"features/metadata-handling.md","filePath":"features/metadata-handling.md","lastUpdated":1768861450000}'),h={name:"features/metadata-handling.md"};function l(k,s,p,e,d,r){return n(),a("div",null,[...s[0]||(s[0]=[t(`<h1 id="metadata-handling" tabindex="-1">Metadata Handling <a class="header-anchor" href="#metadata-handling" aria-label="Permalink to "Metadata Handling"">â</a></h1><p>Audiox provides comprehensive metadata handling capabilities, allowing you to read, write, and modify audio file metadata including ID3 tags, artist information, album art references, and more.</p><h2 id="reading-metadata" tabindex="-1">Reading Metadata <a class="header-anchor" href="#reading-metadata" aria-label="Permalink to "Reading Metadata"">â</a></h2><h3 id="basic-metadata-retrieval" tabindex="-1">Basic Metadata Retrieval <a class="header-anchor" href="#basic-metadata-retrieval" aria-label="Permalink to "Basic Metadata Retrieval"">â</a></h3><p>Get audio file information including basic metadata:</p><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> { audioInfo } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> '@stacksjs/audiox'</span></span> 2<span class="line"></span> 3<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> info</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> await</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> audioInfo</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'music.mp3'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span> 4<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">console.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">log</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(info)</span></span> 5<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// [</span></span> 6<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// {</span></span> 7<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// codec: 'mp3',</span></span> 8<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// channels: 2,</span></span> 9<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// sampleRate: '44100',</span></span> 10<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// bitrate: '192000',</span></span> 11<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// duration: '180.5',</span></span> 12<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// }</span></span> 13<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// ]</span></span></code></pre></div><h3 id="extended-metadata" tabindex="-1">Extended Metadata <a class="header-anchor" href="#extended-metadata" aria-label="Permalink to "Extended Metadata"">â</a></h3><p>Request specific metadata tags:</p><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">
13import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> { audioInfo } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> '@stacksjs/audiox'</span></span> 14<span class="line"></span> 15<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> info</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> await</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> audioInfo</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'music.mp3'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, {</span></span> 16<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> metadataTags: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'title'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'artist'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'album'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'track'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'genre'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'year'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">],</span></span> 17<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">})</span></span> 18<span class="line"></span> 19<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">console.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">log</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(info)</span></span> 20<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// [</span></span> 21<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// {</span></span> 22<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// codec: 'mp3',</span></span> 23<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// channels: 2,</span></span> 24<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// sampleRate: '44100',</span></span> 25<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// bitrate: '192000',</span></span> 26<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// duration: '180.5',</span></span> 27<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// metadata: {</span></span> 28<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// title: 'Song Title',</span></span> 29<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// artist: 'Artist Name',</span></span> 30<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// album: 'Album Name',</span></span> 31<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// track: '1',</span></span> 32<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// genre: 'Pop',</span></span> 33<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// year: '2024'</span></span> 34<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// }</span></span> 35<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// }</span></span> 36<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// ]</span></span></code></pre></div><h3 id="cli-metadata-reading" tabindex="-1">
36CLI Metadata Reading <a class="header-anchor" href="#cli-metadata-reading" aria-label="Permalink to "CLI Metadata Reading"">â</a></h3><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Get basic info</span></span> 37<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">audiox</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> info</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> music.mp3</span></span> 38<span class="line"></span> 39<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Get specific metadata fields</span></span> 40<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">audiox</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> info</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> music.mp3</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --metadata</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> title,artist,album,year</span></span> 41<span class="line"></span> 42<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Verbose output with all available metadata</span></span> 43<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">audiox</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> info</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> music.mp3</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --verbose</span></span></code></pre></div><h2 id="writing-metadata" tabindex="-1">Writing Metadata <a class="header-anchor" href="#writing-metadata" aria-label="Permalink to "Writing Metadata"">â</a></h2><h3 id="embedding-metadata-during-conversion" tabindex="-1">Embedding Metadata During Conversion <a class="header-anchor" href="#embedding-metadata-during-conversion" aria-label="Permalink to "Embedding Metadata During Conversion"">â</a></h3><p>Add metadata when converting audio files:</p><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> { audio } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> '@stacksjs/audiox'</span></span> 44<span class="line"></span> 45<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">await</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> audio</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'input.wav'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'output.mp3'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, {</span></span> 46<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> codec: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'mp3'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span> 47<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> bitrate: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'320k'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span> 48<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> metadata: {</span></span> 49<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> title: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'My Song'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span> 50<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> artist: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'Artist Name'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span> 51<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> album: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'Album Title'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span> 52<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> year: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'2024'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span> 53<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> track: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'1'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span> 54<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> genre: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'Electronic'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span> 55<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> },</span></span> 56<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">})</span></span></code></pre></div><h3 id="cli-metadata-writing" tabindex="-1">CLI Metadata Writing <a class="header-anchor" href="#cli-metadata-writing" aria-label="Permalink to "CLI Metadata Writing"">â</a></h3><div class="language-bash vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">bash</span>
56<pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Add metadata during conversion</span></span> 57<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">audiox</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> convert</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> input.wav</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> output.mp3</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> \\</span></span> 58<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --codec</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> mp3</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> \\</span></span> 59<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --bitrate</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> 320k</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> \\</span></span> 60<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --metadata</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> "title=My Song"</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> \\</span></span> 61<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --metadata</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> "artist=Artist Name"</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> \\</span></span> 62<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --metadata</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> "album=Album Title"</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> \\</span></span> 63<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --metadata</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> "year=2024"</span></span> 64<span class="line"></span> 65<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># Alternative format</span></span> 66<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">audiox</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> convert</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">
66 input.wav</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> output.mp3</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> \\</span></span> 67<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --codec</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> mp3</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> \\</span></span> 68<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --metadata</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> title="My Song",artist="Artist Name",year=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">2024</span></span></code></pre></div><h2 id="common-metadata-fields" tabindex="-1">Common Metadata Fields <a class="header-anchor" href="#common-metadata-fields" aria-label="Permalink to "Common Metadata Fields"">â</a></h2><h3 id="standard-tags" tabindex="-1">Standard Tags <a class="header-anchor" href="#standard-tags" aria-label="Permalink to "Standard Tags"">â</a></h3><table tabindex="0"><thead><tr><th>Field</th><th>Description</th><th>Example</th></tr></thead><tbody><tr><td><code>title</code></td><td>Track title</td><td>"Bohemian Rhapsody"</td></tr><tr><td><code>artist</code></td><td>Performing artist</td><td>"Queen"</td></tr><tr><td><code>album</code></td><td>Album name</td><td>"A Night at the Opera"</td></tr><tr><td><code>album_artist</code></td><td>Album artist</td><td>"Queen"</td></tr><tr><td><code>year</code></td><td>Release year</td><td>"1975"</td></tr><tr><td><code>track</code></td><td>Track number</td><td>"11"</td></tr><tr><td><code>disc</code></td><td>Disc number</td><td>"1"</td></tr><tr><td><code>genre</code></td><td>Music genre</td><td>"Rock"</td></tr><tr><td><code>composer</code></td><td>Composer</td><td>"Freddie Mercury"</td></tr><tr><td><code>comment</code></td><td>Additional comments</td><td>"Remastered 2011"</td></tr></tbody></table><h3 id="extended-tags" tabindex="-1">Extended Tags <a class="header-anchor" href="#extended-tags" aria-label="Permalink to "Extended Tags"">â</a></h3><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">await</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> audio</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'input.wav'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'output.mp3'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, {</span></span> 69<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> codec: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'mp3'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span> 70<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> metadata: {</span></span> 71<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> title: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'Track Title'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span> 72<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> artist: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'Artist Name'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span> 73<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> album: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'Album Name'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span> 74<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> album_artist: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'Album Artist'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span> 75<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> year: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'2024'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span> 76<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> track: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'5'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span> 77<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> disc: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'1'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span> 78<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> genre: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'Electronic'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span> 79<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> composer: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'Composer Name'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span> 80<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> publisher: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'Record Label'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span> 81<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> copyright: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'2024 Record Label'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span> 82<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> comment: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'Encoded with audiox'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span> 83<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> encoded_by: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'audiox'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span> 84<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> },</span></span> 85<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">})</span></span></code></pre></div><h2 id="batch-metadata-operations" tabindex="-1">Batch Metadata Operations <a class="header-anchor" href="#batch-metadata-operations" aria-label="Permalink to "Batch Metadata Operations"">â</a></h2><h3 id="apply-consistent-metadata-to-multiple-files" tabindex="-1">Apply Consistent Metadata to Multiple Files <a class="header-anchor" href="#apply-consistent-metadata-to-multiple-files" aria-label="Permalink to "Apply Consistent Metadata to Multiple Files"">â</a></h3><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span>
85<pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> { audio } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> '@stacksjs/audiox'</span></span> 86<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> { readdir } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> 'node:fs/promises'</span></span> 87<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> { join, parse } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> 'node:path'</span></span> 88<span class="line"></span> 89<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">async</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> function</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> tagAlbum</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span></span> 90<span class="line"><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;"> inputDir</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">:</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> string</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span> 91<span class="line"><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;"> outputDir</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">:</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> string</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span> 92<span class="line"><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;"> albumInfo</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">:</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span> 93<span class="line"><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;"> artist</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">:</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> string</span></span> 94<span class="line"><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;"> album</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">:</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> string</span></span> 95<span class="line"><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;"> year</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">:</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> string</span></span> 96<span class="line"><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;"> genre</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">:</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> string</span></span> 97<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> },</span></span> 98<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) {</span></span> 99<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> files</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> await</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> readdir</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(inputDir)</span></span> 100<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> audioFiles</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> files.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">filter</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">f</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> f.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">endsWith</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'.mp3'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)).</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">
100sort</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">()</span></span> 101<span class="line"></span> 102<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">let</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> i </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> 0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">; i </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"><</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> audioFiles.</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">length</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">; i</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">++</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) {</span></span> 103<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> file</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> audioFiles[i]</span></span> 104<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> inputPath</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> join</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(inputDir, file)</span></span> 105<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> outputPath</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> join</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(outputDir, file)</span></span> 106<span class="line"></span> 107<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // Use filename as track title</span></span> 108<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> trackTitle</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> parse</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(file).name</span></span> 109<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> .</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">replace</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">/</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">^</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">\\d</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">+</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">[-_.\\s]</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">*</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">/</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">''</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// Remove leading track numbers</span></span> 110<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> .</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">replace</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">/</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">[-_]</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">/</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">g</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">' '</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// Replace separators with spaces</span></span> 111<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> .</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">trim</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">()</span></span> 112<span class="line"></span> 113<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> await</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> audio</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(inputPath, outputPath, {</span></span> 114<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> codec: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'mp3'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span> 115<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> bitrate: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'320k'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span> 116<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> metadata: {</span></span> 117<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> ...</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">albumInfo,</span></span> 118<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> title: trackTitle,</span></span> 119<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> track: </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">String</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(i </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">+</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> 1</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">),</span></span> 120<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> },</span></span> 121<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> })</span></span> 122<span class="line"></span> 123<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> console.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">log</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">\`Tagged: \${</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">file</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">}\`</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span> 124<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span> 125<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span> 126<span class="line"></span> 127<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">await</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> tagAlbum</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'./raw-tracks'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'./tagged-album'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">
127, {</span></span> 128<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> artist: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'The Band'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span> 129<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> album: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'Greatest Hits'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span> 130<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> year: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'2024'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span> 131<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> genre: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'Rock'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span> 132<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">})</span></span></code></pre></div><h3 id="reading-metadata-from-multiple-files" tabindex="-1">Reading Metadata from Multiple Files <a class="header-anchor" href="#reading-metadata-from-multiple-files" aria-label="Permalink to "Reading Metadata from Multiple Files"">â</a></h3><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> { audioInfo } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> '@stacksjs/audiox'</span></span> 133<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> { readdir } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> 'node:fs/promises'</span></span> 134<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> { join } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> 'node:path'</span></span> 135<span class="line"></span> 136<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">async</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> function</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> scanLibrary</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">directory</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">:</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> string</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) {</span></span> 137<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> files</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> await</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> readdir</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(directory)</span></span> 138<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> audioFiles</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> files.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">filter</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">f</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =></span></span> 139<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'.mp3'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'.flac'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'.m4a'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">].</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">some</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">ext</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> f.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">endsWith</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(ext)),</span></span> 140<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> )</span></span> 141<span class="line"></span> 142<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> library</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> []</span></span> 143<span class="line"></span> 144<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> file</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> of</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> audioFiles) {</span></span> 145<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> filePath</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> join</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(directory, file)</span></span> 146<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> info</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> await</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> audioInfo</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(filePath, {</span></span> 147<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> metadataTags: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'title'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'artist'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'album'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'year'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'genre'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">],</span></span> 148<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> })</span></span> 149<span class="line"></span> 150<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> library.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">push</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">
150({</span></span> 151<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> file,</span></span> 152<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> ...</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">info[</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">],</span></span> 153<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> })</span></span> 154<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span> 155<span class="line"></span> 156<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> library</span></span> 157<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span> 158<span class="line"></span> 159<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> tracks</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> await</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> scanLibrary</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'./music'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span> 160<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">console.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">table</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(tracks.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">map</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">t</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =></span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> ({</span></span> 161<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> File: t.file,</span></span> 162<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> Title: t.metadata?.title,</span></span> 163<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> Artist: t.metadata?.artist,</span></span> 164<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> Album: t.metadata?.album,</span></span> 165<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">})))</span></span></code></pre></div><h2 id="metadata-preservation" tabindex="-1">Metadata Preservation <a class="header-anchor" href="#metadata-preservation" aria-label="Permalink to "Metadata Preservation"">â</a></h2><h3 id="preserving-metadata-during-conversion" tabindex="-1">Preserving Metadata During Conversion <a class="header-anchor" href="#preserving-metadata-during-conversion" aria-label="Permalink to "Preserving Metadata During Conversion"">â</a></h3><p>When converting between formats, preserve existing metadata:</p><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> { audio, audioInfo } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> '@stacksjs/audiox'</span></span> 166<span class="line"></span> 167<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">async</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> function</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> convertWithMetadata</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">input</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">:</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> string</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">output</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">:</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> string</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) {</span></span> 168<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // Read existing metadata</span></span> 169<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> info</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> await</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> audioInfo</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(input, {</span></span> 170<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> metadataTags: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'title'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'artist'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'album'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'year'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'track'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'genre'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">],</span></span> 171<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> })</span></span> 172<span class="line"></span> 173<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> existingMetadata</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> info[</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">]?.metadata </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">||</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {}</span></span> 174<span class="line"></span> 175<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // Convert with preserved metadata</span></span> 176<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> await</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> audio</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(input, output, {</span></span> 177<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> codec: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'mp3'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span> 178<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> bitrate: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'320k'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span> 179<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> metadata: existingMetadata,</span></span> 180<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> })</span></span> 181<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span> 182<span class="line"></span> 183<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">await</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> convertWithMetadata</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'original.flac'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'converted.mp3'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span></code></pre></div><h2 id="configuration-default-metadata" tabindex="-1">Configuration Default Metadata <a class="header-anchor" href="#configuration-default-metadata" aria-label="Permalink to "Configuration Default Metadata"">â</a></h2><p>Set default metadata in your configuration file:</p><div class="language-ts vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">ts</span>
183<pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// audiox.config.ts</span></span> 184<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> type</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> { AudioxOptions } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> '@stacksjs/audiox'</span></span> 185<span class="line"></span> 186<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> config</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> AudioxOptions</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span> 187<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> codec: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'mp3'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span> 188<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> bitrate: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'192k'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span> 189<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> metadata: {</span></span> 190<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> encoded_by: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'My Studio'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span> 191<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> copyright: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">'2024 My Label'</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span> 192<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> },</span></span> 193<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span> 194<span class="line"></span> 195<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">export</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> default</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> config</span></span></code></pre></div><h2 id="best-practices" tabindex="-1">Best Practices <a class="header-anchor" href="#best-practices" aria-label="Permalink to "Best Practices"">â</a></h2><ol><li><strong>Consistent Formatting</strong>: Use consistent formatting for metadata fields across your library</li><li><strong>Character Encoding</strong>: Ensure proper UTF-8 encoding for international characters</li><li><strong>Backup Original Files</strong>: Keep backups before batch metadata operations</li><li><strong>Validate Metadata</strong>: Verify metadata was written correctly after conversion</li><li><strong>Use Standard Fields</strong>: Stick to standard metadata fields for better compatibility</li><li><strong>Handle Missing Data</strong>: Gracefully handle files with missing or incomplete metadata</li></ol>`,36)])])}const F=i(h,[["render",l]]);export{g as __pageData,F as default};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.