kv-music/js/taglib.ts
Daniel efa3521aff
feat(taglib): refactor and improve metadata handling, worker integration, and code quality
- Refactor metadata handling to use fetchTagLib and addMetadataWithTagLib for improved loading and worker-based processing
- Update prefetchMetadataObjects and addMetadataToAudio for simplified and more robust metadata extraction
- Add taglib.worker.ts for audio metadata processing in a worker
- Implement getMetadataWithTagLib function
- Auto-fix linting issues and remove unnecessary debugger statements
2026-03-09 00:35:20 +00:00

68 lines
2.1 KiB
TypeScript

import { TagLib } from 'taglib-wasm';
import { fetchBlobURL } from './utils';
import _TagLibWasm from '!/taglib-wasm/dist/taglib-web.wasm?url';
import type {
TagLibWorkerMessageType,
AddMetadataMessage,
GetMetadataMessage,
TagLibFileResponse,
TagLibMetadataResponse,
TagLibMetadata,
TagLibReadMetadata,
} from './taglib.worker';
import TagLibWorker from './taglib.worker.ts?url';
let tagLib: Promise<TagLib> | null = null;
async function fetchTagLib(): Promise<string> {
return fetchTagLib.blobUrl || (fetchTagLib.blobUrl = await fetchBlobURL(_TagLibWasm));
}
namespace fetchTagLib {
export let blobUrl = '';
}
export { fetchTagLib };
export async function addMetadataWithTagLib(
audioData: Uint8Array,
data: Omit<AddMetadataMessage, 'type' | 'wasmUrl' | 'audioData'>
) {
const worker = new Worker(new URL(TagLibWorker, import.meta.url), { type: 'module' });
const wasmUrl = await fetchTagLib();
return new Promise<Uint8Array>((resolve, reject) => {
worker.onmessage = (e: MessageEvent<TagLibFileResponse>) => {
const { data, error } = e.data;
if (error) {
reject(new Error(error));
} else {
resolve(data!);
}
};
worker.onerror = reject;
worker.onmessageerror = reject;
worker.postMessage({ ...data, type: 'Add', wasmUrl, audioData });
});
}
export async function getMetadataWithTagLib(audioData: Uint8Array) {
const worker = new Worker(new URL(TagLibWorker, import.meta.url), { type: 'module' });
const wasmUrl = await fetchTagLib();
return new Promise<TagLibReadMetadata>((resolve, reject) => {
worker.onmessage = (e: MessageEvent<TagLibMetadataResponse>) => {
const { data, error } = e.data;
if (error) {
reject(new Error(error));
} else {
resolve(data!);
}
};
worker.onerror = reject;
worker.onmessageerror = reject;
worker.postMessage({ type: 'Get', wasmUrl, audioData });
});
}