UNPKG

music-metadata-search

Version:

Search in your local music library using quick filters on metadata tags

48 lines (44 loc) 1.5 kB
import { parseFile } from "music-metadata"; import { logger } from "./logger.mjs"; import { walkDir } from "./walk.mjs"; /** * @typedef TrackScanned * @property {string} path */ /** * @typedef Options * @property {string[]} ext Extensions of Audio files to load * * @param {string} path * @param {Options} opts * @returns {AsyncGenerator<import('../type.ts').Track>} */ export async function* scanAudioFiles(path, opts) { for await (const file of walkDir(path, { ext: opts.ext })) { logger.debug(`[insertTags] parsing ${file}`); /** @type {import("music-metadata").IAudioMetadata} */ try { const tags = await parseFile(file); yield { genre: tags.common.genre?.join(",") ?? "", path: file, album: tags.common.album, artist: tags.common.artist, title: tags.common.title, year: tags.common.year || undefined, bpm: tags.common.bpm || undefined, duration: tags.format.duration, bitrate: tags.format.bitrate, sampleRate: tags.format.sampleRate, musicbrainzArtistId: tags.common.musicbrainz_artistid?.join(","), musicbrainzTrackId: tags.common.musicbrainz_trackid, musicbrainzRecordingId: tags.common.musicbrainz_recordingid, musicbrainzAlbumId: tags.common.musicbrainz_albumid, comment: tags.common.comment?.at(0)?.text, }; } catch (err) { logger.error(err, "[insertTags] could not parse metadata"); return; } } }