{"_id":"@dantheman827/taglib-ts","_rev":"5-4d0df8177b661bdb0aa5cbc44c75e6ba","name":"@dantheman827/taglib-ts","dist-tags":{"latest":"0.1.5"},"versions":{"0.1.0":{"name":"@dantheman827/taglib-ts","version":"0.1.0","keywords":["audio","metadata","tags","id3","mp3","flac","mp4","ogg","wav","aiff"],"author":{"name":"DanTheMan827"},"license":"LGPL-2.1-or-later","_id":"@dantheman827/taglib-ts@0.1.0","maintainers":[{"name":"dantheman827","email":"daniel.radtke@gmail.com"}],"contributors":[{"name":"Scott Wheeler","email":"wheeler@kde.org"},{"name":"Author, maintainer"},{"name":"Lukas Lalinsky","email":"lalinsky@gmail.com"},{"name":"Implementation of multiple new file formats, many bug fixes, maintainer"},{"name":"Tsuda Kageyu","email":"tsuda.kageyu@gmail.com"},{"name":"A lot of bug fixes and performance improvements, maintainer."},{"name":"Stephen F. Booth","email":"me@sbooth.org"},{"name":"DSF metadata implementation, bug fixes, maintainer."},{"name":"Ismael Orenstein","email":"orenstein@kde.org"},{"name":"Xing header implementation"},{"name":"Allan Sandfeld Jensen","email":"kde@carewolf.org"},{"name":"FLAC metadata implementation"},{"name":"Teemu Tervo","email":"teemu.tervo@gmx.net"},{"name":"Numerous bug reports and fixes"},{"name":"Mathias Panzenböck","email":"grosser.meister.morti@gmx.net"},{"name":"Mod, S3M, IT and XM metadata implementations"},{"name":"Damien Plisson","email":"damien78@audirvana.com"},{"name":"DSDIFF metadata implementation"},{"name":"Urs Fleisch","email":"ufleisch@users.sourceforge.net"},{"name":"Bug fixes, maintainer."},{"name":"Please send all patches and questions to taglib-devel@kde.org rather than to"},{"name":"individual developers!"}],"homepage":"https://github.com/DanTheMan827/taglib-ts#readme","bugs":{"url":"https://github.com/DanTheMan827/taglib-ts/issues"},"dist":{"shasum":"110481d35d3ada0e5c40221be4cf4f58205efb1b","tarball":"https://registry.npmjs.org/@dantheman827/taglib-ts/-/taglib-ts-0.1.0.tgz","fileCount":108,"integrity":"sha512-rWN4FRsWmrAlXvJyBcxfjnHv8YPk6UTRwZuuD6APXRJkQgLu4vyqPepkcE3+inQ51DbNnuyoVZYJogV72WbqqQ==","signatures":[{"sig":"MEUCIA8/JYoyDDOWi/yJqzpxW4M4ym3bhdAinZfhtIEhFyuMAiEAv+UvqL8pbNMZOmhveR7QgrA5yWqPgPpFGTOZTsgcjVA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":761683},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","exports":{"./*":{"types":"./src/*","default":"./dist/*"}},"gitHead":"a8c20172125d64597a2f4d7613eb0153f6388970","scripts":{"lint":"eslint src/ tests/","test":"vitest run","build":"tsc","format":"eslint src/ tests/ --fix","lint:fix":"eslint src/ tests/ --fix","test:watch":"vitest"},"_npmUser":{"name":"dantheman827","email":"daniel.radtke@gmail.com"},"repository":{"url":"git+https://github.com/DanTheMan827/taglib-ts.git","type":"git"},"_npmVersion":"11.4.2","description":"A TypeScript audio metadata library for browsers, supporting MP3, FLAC, MP4, OGG, WAV, AIFF and more","directories":{},"_nodeVersion":"25.2.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^10.0.3","vitest":"^4.1.0","@eslint/js":"^10.0.1","typescript":"^5.9.3","@types/node":"^25.5.0","typescript-eslint":"^8.57.0","@stylistic/eslint-plugin":"^5.10.0"},"_npmOperationalInternal":{"tmp":"tmp/taglib-ts_0.1.0_1773596785190_0.604524538631203","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@dantheman827/taglib-ts","version":"0.1.2","keywords":["audio","metadata","tags","id3","mp3","flac","mp4","ogg","wav","aiff"],"author":{"name":"DanTheMan827"},"license":"LGPL-2.1-or-later","_id":"@dantheman827/taglib-ts@0.1.2","maintainers":[{"name":"dantheman827","email":"daniel.radtke@gmail.com"}],"contributors":[{"name":"Scott Wheeler","email":"wheeler@kde.org"},{"name":"Author, maintainer"},{"name":"Lukas Lalinsky","email":"lalinsky@gmail.com"},{"name":"Implementation of multiple new file formats, many bug fixes, maintainer"},{"name":"Tsuda Kageyu","email":"tsuda.kageyu@gmail.com"},{"name":"A lot of bug fixes and performance improvements, maintainer."},{"name":"Stephen F. Booth","email":"me@sbooth.org"},{"name":"DSF metadata implementation, bug fixes, maintainer."},{"name":"Ismael Orenstein","email":"orenstein@kde.org"},{"name":"Xing header implementation"},{"name":"Allan Sandfeld Jensen","email":"kde@carewolf.org"},{"name":"FLAC metadata implementation"},{"name":"Teemu Tervo","email":"teemu.tervo@gmx.net"},{"name":"Numerous bug reports and fixes"},{"name":"Mathias Panzenböck","email":"grosser.meister.morti@gmx.net"},{"name":"Mod, S3M, IT and XM metadata implementations"},{"name":"Damien Plisson","email":"damien78@audirvana.com"},{"name":"DSDIFF metadata implementation"},{"name":"Urs Fleisch","email":"ufleisch@users.sourceforge.net"},{"name":"Bug fixes, maintainer."},{"name":"Please send all patches and questions to taglib-devel@kde.org rather than to"},{"name":"individual developers!"}],"homepage":"https://github.com/DanTheMan827/taglib-ts#readme","bugs":{"url":"https://github.com/DanTheMan827/taglib-ts/issues"},"dist":{"shasum":"c2e2c29b77ab75cea93d52a65ee6b35d76b8e6b8","tarball":"https://registry.npmjs.org/@dantheman827/taglib-ts/-/taglib-ts-0.1.2.tgz","fileCount":524,"integrity":"sha512-rM49AzV8Aq9stFJVivDeEY3exH91WqpokFjtn3B9PeeX8a19o0ECVn/veZoAVOlI4arweOS1p1KsGu9q9cj1uw==","signatures":[{"sig":"MEUCIDaym4Yg9ZajAYv4vCywFCv1oQ/gp1DwtlRyS2U967IuAiEAklUgRaV3iMlor5q4NzYBwXoRYPvXa7CiQwLBYPXg+eY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2371318},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","exports":{"./*":{"types":"./src/*","default":"./dist/*"}},"gitHead":"2ba511a7e8a11806fbd083d835bd650f21dd346a","scripts":{"lint":"eslint src/ tests/","test":"vitest run","build":"tsc","format":"eslint src/ tests/ --fix","lint:fix":"eslint src/ tests/ --fix","test:watch":"vitest"},"_npmUser":{"name":"dantheman827","email":"daniel.radtke@gmail.com"},"repository":{"url":"git+https://github.com/DanTheMan827/taglib-ts.git","type":"git"},"_npmVersion":"11.4.2","description":"A TypeScript audio metadata library for browsers, supporting MP3, FLAC, MP4, OGG, WAV, AIFF and more","directories":{},"_nodeVersion":"25.2.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^10.0.3","vitest":"^4.1.0","@eslint/js":"^10.0.1","typescript":"^5.9.3","@types/node":"^25.5.0","typescript-eslint":"^8.57.0","@stylistic/eslint-plugin":"^5.10.0"},"_npmOperationalInternal":{"tmp":"tmp/taglib-ts_0.1.2_1773597749020_0.5361705896998508","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@dantheman827/taglib-ts","version":"0.1.3","keywords":["audio","metadata","tags","id3","mp3","flac","mp4","ogg","wav","aiff"],"author":{"name":"DanTheMan827"},"license":"LGPL-2.1-or-later","_id":"@dantheman827/taglib-ts@0.1.3","maintainers":[{"name":"dantheman827","email":"daniel.radtke@gmail.com"}],"contributors":[{"name":"Scott Wheeler","email":"wheeler@kde.org"},{"name":"Author, maintainer"},{"name":"Lukas Lalinsky","email":"lalinsky@gmail.com"},{"name":"Implementation of multiple new file formats, many bug fixes, maintainer"},{"name":"Tsuda Kageyu","email":"tsuda.kageyu@gmail.com"},{"name":"A lot of bug fixes and performance improvements, maintainer."},{"name":"Stephen F. Booth","email":"me@sbooth.org"},{"name":"DSF metadata implementation, bug fixes, maintainer."},{"name":"Ismael Orenstein","email":"orenstein@kde.org"},{"name":"Xing header implementation"},{"name":"Allan Sandfeld Jensen","email":"kde@carewolf.org"},{"name":"FLAC metadata implementation"},{"name":"Teemu Tervo","email":"teemu.tervo@gmx.net"},{"name":"Numerous bug reports and fixes"},{"name":"Mathias Panzenböck","email":"grosser.meister.morti@gmx.net"},{"name":"Mod, S3M, IT and XM metadata implementations"},{"name":"Damien Plisson","email":"damien78@audirvana.com"},{"name":"DSDIFF metadata implementation"},{"name":"Urs Fleisch","email":"ufleisch@users.sourceforge.net"},{"name":"Bug fixes, maintainer."},{"name":"Please send all patches and questions to taglib-devel@kde.org rather than to"},{"name":"individual developers!"}],"homepage":"https://github.com/DanTheMan827/taglib-ts#readme","bugs":{"url":"https://github.com/DanTheMan827/taglib-ts/issues"},"dist":{"shasum":"4d87407416a29a037efcadd115684ff494e854e3","tarball":"https://registry.npmjs.org/@dantheman827/taglib-ts/-/taglib-ts-0.1.3.tgz","fileCount":524,"integrity":"sha512-TKsuZwn15DNyxeR/fDv/TPpW54LR7h7UfMZaT8MEOjIXIcWBr7Xtc/iqj/zbdLr1XikJgJqAhutZCsCoclExSA==","signatures":[{"sig":"MEQCIBfBoUMrp3c3hm7x/YfF6ieAUzN0NDiVE/xoVsRZPEE7AiB/KpzJgwK/a2p2Xnt5+wotmOzoU8whydbippyQ6bV/2A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2394953},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","exports":{"./*":{"types":"./src/*","default":"./dist/*"}},"gitHead":"527416945fa37da64c938dafa951f27e4a4aea06","scripts":{"lint":"eslint src/ tests/","test":"vitest run","build":"tsc","format":"eslint src/ tests/ --fix","lint:fix":"eslint src/ tests/ --fix","test:watch":"vitest"},"_npmUser":{"name":"dantheman827","email":"daniel.radtke@gmail.com"},"repository":{"url":"git+https://github.com/DanTheMan827/taglib-ts.git","type":"git"},"_npmVersion":"11.4.2","description":"A TypeScript audio metadata library for browsers, supporting MP3, FLAC, MP4, OGG, WAV, AIFF and more","directories":{},"_nodeVersion":"25.2.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^10.0.3","vitest":"^4.1.0","@eslint/js":"^10.0.1","typescript":"^5.9.3","@types/node":"^25.5.0","typescript-eslint":"^8.57.0","@stylistic/eslint-plugin":"^5.10.0"},"_npmOperationalInternal":{"tmp":"tmp/taglib-ts_0.1.3_1773609044706_0.5991496121080118","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@dantheman827/taglib-ts","version":"0.1.4","keywords":["audio","metadata","tags","id3","mp3","flac","mp4","ogg","wav","aiff"],"author":{"name":"DanTheMan827"},"license":"LGPL-2.1-or-later","_id":"@dantheman827/taglib-ts@0.1.4","maintainers":[{"name":"dantheman827","email":"daniel.radtke@gmail.com"}],"contributors":[{"name":"Scott Wheeler","email":"wheeler@kde.org"},{"name":"Author, maintainer"},{"name":"Lukas Lalinsky","email":"lalinsky@gmail.com"},{"name":"Implementation of multiple new file formats, many bug fixes, maintainer"},{"name":"Tsuda Kageyu","email":"tsuda.kageyu@gmail.com"},{"name":"A lot of bug fixes and performance improvements, maintainer."},{"name":"Stephen F. Booth","email":"me@sbooth.org"},{"name":"DSF metadata implementation, bug fixes, maintainer."},{"name":"Ismael Orenstein","email":"orenstein@kde.org"},{"name":"Xing header implementation"},{"name":"Allan Sandfeld Jensen","email":"kde@carewolf.org"},{"name":"FLAC metadata implementation"},{"name":"Teemu Tervo","email":"teemu.tervo@gmx.net"},{"name":"Numerous bug reports and fixes"},{"name":"Mathias Panzenböck","email":"grosser.meister.morti@gmx.net"},{"name":"Mod, S3M, IT and XM metadata implementations"},{"name":"Damien Plisson","email":"damien78@audirvana.com"},{"name":"DSDIFF metadata implementation"},{"name":"Urs Fleisch","email":"ufleisch@users.sourceforge.net"},{"name":"Bug fixes, maintainer."},{"name":"Please send all patches and questions to taglib-devel@kde.org rather than to"},{"name":"individual developers!"}],"homepage":"https://github.com/DanTheMan827/taglib-ts#readme","bugs":{"url":"https://github.com/DanTheMan827/taglib-ts/issues"},"dist":{"shasum":"39e19533024352a994b05f77b27a4fad9e1edd7c","tarball":"https://registry.npmjs.org/@dantheman827/taglib-ts/-/taglib-ts-0.1.4.tgz","fileCount":529,"integrity":"sha512-YatUOfIypi7J0m46zXriykVE80GK4m8I4QzBbM5K+XJRl3IL2dYJr/9P0KrOs55woqzGQsku+0e3kJ+QRA/6qA==","signatures":[{"sig":"MEYCIQClP/Xyr1NlKPmfM9mQEnjxALbFI0gb1seIP/w4d8oRDgIhAJSGdrYeB27U6dVle2vZkMjybLEuJYsT3Hk1raOiUc/h","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2402845},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","exports":{"./*":{"types":"./src/*","default":"./dist/*"}},"gitHead":"75dcd761fa2749a670b6f91b63172544226c5726","scripts":{"lint":"eslint src/ tests/","test":"vitest run","build":"tsc","format":"eslint src/ tests/ --fix","lint:fix":"eslint src/ tests/ --fix","test:watch":"vitest"},"_npmUser":{"name":"dantheman827","email":"daniel.radtke@gmail.com"},"repository":{"url":"git+https://github.com/DanTheMan827/taglib-ts.git","type":"git"},"_npmVersion":"11.4.2","description":"A TypeScript audio metadata library for browsers, supporting MP3, FLAC, MP4, OGG, WAV, AIFF and more","directories":{},"_nodeVersion":"25.2.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^10.0.3","vitest":"^4.1.0","@eslint/js":"^10.0.1","typescript":"^5.9.3","@types/node":"^25.5.0","typescript-eslint":"^8.57.0","@stylistic/eslint-plugin":"^5.10.0"},"_npmOperationalInternal":{"tmp":"tmp/taglib-ts_0.1.4_1773697638358_0.06285371847127608","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"@dantheman827/taglib-ts","version":"0.1.5","publishConfig":{"access":"public"},"description":"A TypeScript audio metadata library for browsers, supporting MP3, FLAC, MP4, OGG, WAV, AIFF and more","main":"dist/index.js","types":"dist/index.d.ts","type":"module","exports":{"./*":{"types":"./src/*","default":"./dist/*"}},"scripts":{"build":"tsc","docs":"typedoc","test":"vitest run","test:ui":"vitest --ui","test:watch":"vitest","bench":"vitest bench --run","bench:ui":"vitest bench --ui","bench:watch":"vitest bench","lint":"eslint src/","lint:fix":"eslint src/ --fix","format":"eslint src/ --fix"},"repository":{"type":"git","url":"git+https://github.com/DanTheMan827/taglib-ts.git"},"keywords":["audio","metadata","tags","id3","mp3","flac","mp4","ogg","wav","aiff"],"author":{"name":"DanTheMan827"},"license":"LGPL-2.1-or-later","bugs":{"url":"https://github.com/DanTheMan827/taglib-ts/issues"},"homepage":"https://github.com/DanTheMan827/taglib-ts#readme","devDependencies":{"@eslint/js":"^10.0.1","@stylistic/eslint-plugin":"^5.10.0","@types/node":"^25.5.0","@vitest/ui":"^4.1.2","eslint":"^10.0.3","typedoc":"^0.28.17","typescript":"^5.9.3","typescript-eslint":"^8.57.0","vitest":"^4.1.0"},"_id":"@dantheman827/taglib-ts@0.1.5","contributors":[{"name":"Scott Wheeler","email":"wheeler@kde.org"},{"name":"Author, maintainer"},{"name":"Lukas Lalinsky","email":"lalinsky@gmail.com"},{"name":"Implementation of multiple new file formats, many bug fixes, maintainer"},{"name":"Tsuda Kageyu","email":"tsuda.kageyu@gmail.com"},{"name":"A lot of bug fixes and performance improvements, maintainer."},{"name":"Stephen F. Booth","email":"me@sbooth.org"},{"name":"DSF metadata implementation, bug fixes, maintainer."},{"name":"Ismael Orenstein","email":"orenstein@kde.org"},{"name":"Xing header implementation"},{"name":"Allan Sandfeld Jensen","email":"kde@carewolf.org"},{"name":"FLAC metadata implementation"},{"name":"Teemu Tervo","email":"teemu.tervo@gmx.net"},{"name":"Numerous bug reports and fixes"},{"name":"Mathias Panzenböck","email":"grosser.meister.morti@gmx.net"},{"name":"Mod, S3M, IT and XM metadata implementations"},{"name":"Damien Plisson","email":"damien78@audirvana.com"},{"name":"DSDIFF metadata implementation"},{"name":"Urs Fleisch","email":"ufleisch@users.sourceforge.net"},{"name":"Bug fixes, maintainer."},{"name":"Please send all patches and questions to taglib-devel@kde.org rather than to"},{"name":"individual developers!"}],"gitHead":"e9bd3324e0430b192abfa9755fd34a4f00388b20","_nodeVersion":"25.2.1","_npmVersion":"11.4.2","dist":{"integrity":"sha512-uOMzKccEE0AUsMZ6rTPSUB0ZqAvuRxih9ECn8N62lMNi0UsXQumuKN86F3CxNaF4y3LOkvtp45vplTjwEEUOlQ==","shasum":"2e777997accc3c58f90ff07f191d2b66e8ac77d1","tarball":"https://registry.npmjs.org/@dantheman827/taglib-ts/-/taglib-ts-0.1.5.tgz","fileCount":549,"unpackedSize":3465343,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDnfN8Ov3kS3nr8qZcFz1AKgGgUcLQUcBY2SJHjecRxaQIgKsecPh5zdO+k6urRrZJebM1jf1MKdtXDT+XaVI3UzuM="}]},"_npmUser":{"name":"dantheman827","email":"daniel.radtke@gmail.com"},"directories":{},"maintainers":[{"name":"dantheman827","email":"daniel.radtke@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/taglib-ts_0.1.5_1775332654947_0.564786649579565"},"_hasShrinkwrap":false}},"time":{"created":"2026-03-15T17:46:25.066Z","modified":"2026-04-04T19:57:35.268Z","0.1.0":"2026-03-15T17:46:25.414Z","0.1.2":"2026-03-15T18:02:29.209Z","0.1.3":"2026-03-15T21:10:44.947Z","0.1.4":"2026-03-16T21:47:18.523Z","0.1.5":"2026-04-04T19:57:35.140Z"},"bugs":{"url":"https://github.com/DanTheMan827/taglib-ts/issues"},"author":{"name":"DanTheMan827"},"license":"LGPL-2.1-or-later","homepage":"https://github.com/DanTheMan827/taglib-ts#readme","keywords":["audio","metadata","tags","id3","mp3","flac","mp4","ogg","wav","aiff"],"repository":{"type":"git","url":"git+https://github.com/DanTheMan827/taglib-ts.git"},"description":"A TypeScript audio metadata library for browsers, supporting MP3, FLAC, MP4, OGG, WAV, AIFF and more","contributors":[{"name":"Scott Wheeler","email":"wheeler@kde.org"},{"name":"Author, maintainer"},{"name":"Lukas Lalinsky","email":"lalinsky@gmail.com"},{"name":"Implementation of multiple new file formats, many bug fixes, maintainer"},{"name":"Tsuda Kageyu","email":"tsuda.kageyu@gmail.com"},{"name":"A lot of bug fixes and performance improvements, maintainer."},{"name":"Stephen F. Booth","email":"me@sbooth.org"},{"name":"DSF metadata implementation, bug fixes, maintainer."},{"name":"Ismael Orenstein","email":"orenstein@kde.org"},{"name":"Xing header implementation"},{"name":"Allan Sandfeld Jensen","email":"kde@carewolf.org"},{"name":"FLAC metadata implementation"},{"name":"Teemu Tervo","email":"teemu.tervo@gmx.net"},{"name":"Numerous bug reports and fixes"},{"name":"Mathias Panzenböck","email":"grosser.meister.morti@gmx.net"},{"name":"Mod, S3M, IT and XM metadata implementations"},{"name":"Damien Plisson","email":"damien78@audirvana.com"},{"name":"DSDIFF metadata implementation"},{"name":"Urs Fleisch","email":"ufleisch@users.sourceforge.net"},{"name":"Bug fixes, maintainer."},{"name":"Please send all patches and questions to taglib-devel@kde.org rather than to"},{"name":"individual developers!"}],"maintainers":[{"name":"dantheman827","email":"daniel.radtke@gmail.com"}],"readme":"# taglib-ts\r\n\r\n[![TypeScript Build & Test](https://github.com/DanTheMan827/taglib/actions/workflows/build.yml/badge.svg)](https://github.com/DanTheMan827/taglib/actions/workflows/build.yml)\r\n\r\nNative **TypeScript** port of [TagLib](https://taglib.org/) for browsers, Node.js, and any JavaScript runtime. Reads and writes audio metadata (ID3v1, ID3v2, APE, Vorbis comments, MP4 atoms, RIFF Info, ASF, Matroska tags, and more) for 21 container formats — no WASM, no native bindings.\r\n\r\n## Features\r\n\r\n- 🎵 **21 audio formats**: MP3, FLAC, MP4/AAC, OGG (Vorbis / Opus / Speex / FLAC), WAV, AIFF, MPC, WavPack, Monkey's Audio, TrueAudio, DSF, DSDIFF, ASF/WMA, Matroska/WebM, MOD, S3M, XM, IT, Shorten\r\n- 🏷️ **All major tag formats**: ID3v1, ID3v2 (v2.2 / v2.3 / v2.4), APEv2, Vorbis Comment, FLAC Picture, RIFF Info, DSDIFF DIIN, ASF, Matroska\r\n- 📦 **Code splitting**: format readers are lazy-loaded via dynamic `import()` — only the formats you use land in your bundle\r\n- 🌐 **Browser-first**: accepts `File`, `Blob`, and `Uint8Array` inputs\r\n- ✅ **360+ tests** ported from the C++ CppUnit suite\r\n\r\n---\r\n\r\n## Quick Start\r\n\r\n```bash\r\nnpm install @dantheman827/taglib-ts \r\n```\r\n\r\n### Simple API — read tags\r\n\r\n```ts\r\nimport { readTags } from '@dantheman827/taglib-ts/simpleApi.js';\r\n\r\n// Browser File picker\r\nconst [file] = await showOpenFilePicker({ types: [{ accept: { 'audio/*': [] } }] });\r\nconst tags = await readTags(await file.getFile());\r\n\r\nconsole.log(tags.title);                        // \"Bohemian Rhapsody\"\r\nconsole.log(tags.artist);                       // \"Queen\"\r\nconsole.log(tags.audioProperties?.bitrate);     // 320  (kb/s)\r\nconsole.log(tags.audioProperties?.lengthInSeconds); // 354\r\n```\r\n\r\n### Simple API — write tags\r\n\r\n```ts\r\nimport { writeTags } from '@dantheman827/taglib-ts/simpleApi.js';\r\n\r\nconst modified = await writeTags(file, {\r\n  title:  'My Track',\r\n  artist: 'My Artist',\r\n  album:  'My Album',\r\n  year:   2024,\r\n  track:  1,\r\n});\r\n\r\nif (modified) {\r\n  const blob = new Blob([modified], { type: 'audio/mpeg' });\r\n  // trigger a download, send to a server, etc.\r\n}\r\n```\r\n\r\n### Advanced API — FileRef\r\n\r\nUse `FileRef` when you need direct access to tags, audio properties, or\r\nformat-specific metadata.\r\n\r\n```ts\r\nimport { FileRef } from '@dantheman827/taglib-ts/fileRef.js';\r\nimport { ReadStyle } from \"@dantheman827/taglib-ts/toolkit/types.js\";\r\n\r\nconst ref = await FileRef.fromBlob(blob, 'track.mp3');\r\n\r\nif (ref.isValid) {\r\n  const tag  = ref.tag();\r\n  const ap   = ref.audioProperties();\r\n\r\n  console.log(tag?.title, tag?.artist);\r\n  console.log(ap?.sampleRate, ap?.channels);\r\n\r\n  // Modify and save\r\n  if (tag) {\r\n    tag.title  = 'Updated Title';\r\n    tag.artist = 'Updated Artist';\r\n  }\r\n  ref.save(); // writes into the in-memory stream\r\n\r\n  // Retrieve the modified bytes\r\n  const modified = ref.file()!.stream() as ByteVectorStream;\r\n  const bytes = modified.data().data; // Uint8Array\r\n}\r\n```\r\n\r\n---\r\n\r\n## API Reference\r\n\r\n### Simple API\r\n\r\n#### `readTags(input, readAudioProperties?): Promise<Tags>`\r\n\r\nRead tags and optionally audio properties from an audio file.\r\n\r\n| Parameter | Type | Default | Description |\r\n|-----------|------|---------|-------------|\r\n| `input` | `AudioInput` | — | Audio data (see below) |\r\n| `readAudioProperties` | `boolean` | `true` | Whether to extract audio properties |\r\n\r\n**`AudioInput`** can be:\r\n- `File` — browser `File` object; filename is used for format detection\r\n- `Blob` — content-based format detection\r\n- `Uint8Array` — raw bytes; content-based detection\r\n- `{ data: Uint8Array; filename: string }` — raw bytes with explicit filename\r\n\r\n**Returns** a `Tags` object:\r\n\r\n```ts\r\ninterface Tags {\r\n  title:            string;\r\n  artist:           string;\r\n  album:            string;\r\n  comment:          string;\r\n  genre:            string;\r\n  year:             number;   // 0 if not set\r\n  track:            number;   // 0 if not set\r\n  audioProperties:  AudioPropertiesInfo | null;\r\n}\r\n\r\ninterface AudioPropertiesInfo {\r\n  lengthInSeconds:      number;\r\n  lengthInMilliseconds: number;\r\n  bitrate:              number;  // kb/s\r\n  sampleRate:           number;  // Hz\r\n  channels:             number;\r\n}\r\n```\r\n\r\nIf the format is not recognised the function returns an object with all string\r\nfields as `\"\"`, numeric fields as `0`, and `audioProperties` as `null`.\r\n\r\n---\r\n\r\n#### `writeTags(input, tags): Promise<Uint8Array | null>`\r\n\r\nWrite tags to an audio file and return the modified bytes.\r\n\r\n| Parameter | Type | Description |\r\n|-----------|------|-------------|\r\n| `input` | `AudioInput` | Audio data to modify (never mutated in place) |\r\n| `tags` | `TagsToWrite` | Fields to update; `undefined` fields are left unchanged |\r\n\r\n```ts\r\ninterface TagsToWrite {\r\n  title?:   string;\r\n  artist?:  string;\r\n  album?:   string;\r\n  comment?: string;\r\n  genre?:   string;\r\n  year?:    number;\r\n  track?:   number;\r\n}\r\n```\r\n\r\nReturns `null` if the format is unknown, the file is invalid, or the save failed.\r\n\r\n---\r\n\r\n### Advanced API — `FileRef`\r\n\r\n`FileRef` is the main entry point for advanced usage.\r\n\r\n#### Static factory methods\r\n\r\n```ts\r\n// From an IOStream (any custom stream implementing IOStream)\r\nstatic async open(stream: IOStream, readProperties?: boolean, readStyle?: ReadStyle): Promise<FileRef>\r\n\r\n// From a Uint8Array (with optional filename for extension-based detection)\r\nstatic async fromByteArray(data: Uint8Array, filename?: string, readProperties?: boolean, readStyle?: ReadStyle): Promise<FileRef>\r\n\r\n// From a Blob or browser File\r\nstatic async fromBlob(blob: Blob, filename?: string, readProperties?: boolean, readStyle?: ReadStyle): Promise<FileRef>\r\n```\r\n\r\n#### Instance methods & properties\r\n\r\n| Member | Returns | Description |\r\n|--------|---------|-------------|\r\n| `isValid` | `boolean` | `true` if the file was parsed successfully |\r\n| `isNull` | `boolean` | `true` if no underlying file is attached |\r\n| `tag()` | `Tag \\| null` | The unified tag for this file |\r\n| `audioProperties()` | `AudioProperties \\| null` | Stream audio properties |\r\n| `file()` | `File \\| null` | The underlying format-specific `File` object |\r\n| `save()` | `boolean` | Save tag changes back to the in-memory stream |\r\n| `properties()` | `PropertyMap` | All tags as a key→string[] map |\r\n| `setProperties(map)` | `PropertyMap` | Set tags from a PropertyMap; returns unsupported keys |\r\n| `complexPropertyKeys()` | `string[]` | Keys with complex (non-string) values (e.g. `PICTURE`) |\r\n| `complexProperties(key)` | `VariantMap[]` | Get complex property values |\r\n| `setComplexProperties(key, value)` | `boolean` | Set complex property values |\r\n| `FileRef.defaultFileExtensions()` | `string[]` | All supported file extensions |\r\n\r\n---\r\n\r\n### Tag (`Tag`)\r\n\r\nThe `Tag` abstract class is implemented by all format-specific tag classes\r\nand exposed via `FileRef.tag()` and `readTags()`.\r\n\r\n```ts\r\nabstract class Tag {\r\n  // Getters / setters\r\n  abstract title:   string;\r\n  abstract artist:  string;\r\n  abstract album:   string;\r\n  abstract comment: string;\r\n  abstract genre:   string;\r\n  abstract year:    number;\r\n  abstract track:   number;\r\n\r\n  // Helpers\r\n  readonly isEmpty: boolean;\r\n\r\n  // PropertyMap interface\r\n  properties(): PropertyMap;\r\n  setProperties(map: PropertyMap): PropertyMap;\r\n  complexPropertyKeys(): string[];\r\n  complexProperties(key: string): VariantMap[];\r\n  setComplexProperties(key: string, value: VariantMap[]): boolean;\r\n\r\n  // Static utilities\r\n  static duplicate(source: Tag, target: Tag, overwrite: boolean): void;\r\n  static joinTagValues(values: string[]): string;\r\n}\r\n```\r\n\r\n---\r\n\r\n### AudioProperties (`AudioProperties`)\r\n\r\n```ts\r\nabstract class AudioProperties {\r\n  readonly lengthInSeconds:      number;  // rounded to nearest second\r\n  readonly lengthInMilliseconds: number;\r\n  readonly bitrate:              number;  // kb/s\r\n  readonly sampleRate:           number;  // Hz\r\n  abstract readonly channels:    number;\r\n}\r\n```\r\n\r\n---\r\n\r\n### PropertyMap\r\n\r\nA case-insensitive, ordered `Map<string, string[]>` for storing tag key/value pairs.\r\n\r\n```ts\r\nconst map = new PropertyMap();\r\nmap.replace('TITLE',  ['My Song']);\r\nmap.replace('ARTIST', ['My Artist', 'Another Artist']);\r\n\r\nfor (const [key, values] of map.entries()) {\r\n  console.log(key, values);\r\n}\r\n```\r\n\r\n---\r\n\r\n### Format Detection\r\n\r\n```ts\r\nimport { detectByExtension, detectByContent } from '@dantheman827/taglib-ts/formatDetection.js';\r\n\r\nconst format = detectByExtension('track.mp3');     // 'mpeg'\r\nconst format2 = detectByContent(stream);            // null | format string\r\n```\r\n\r\n---\r\n\r\n## Supported Formats\r\n\r\n| Extension(s) | Format | Tags |\r\n|---|---|---|\r\n| `.mp3`, `.mp2`, `.aac` | MPEG Audio | ID3v1, ID3v2, APEv2 |\r\n| `.flac` | FLAC | Vorbis Comment, FLAC Picture |\r\n| `.m4a`, `.m4b`, `.mp4`, `.aax` | MP4/AAC, ALAC | MP4 atoms (iTunes) |\r\n| `.ogg`, `.oga` | OGG Vorbis | Vorbis Comment |\r\n| `.opus` | OGG Opus | Vorbis Comment |\r\n| `.spx` | OGG Speex | Vorbis Comment |\r\n| `.flac` (in OGG) | OGG FLAC | Vorbis Comment |\r\n| `.wav` | WAV / RIFF | ID3v2, RIFF Info |\r\n| `.aif`, `.aiff`, `.aifc` | AIFF | ID3v2 |\r\n| `.mpc` | Musepack (SV4–SV8) | APEv2, ID3v1 |\r\n| `.wv` | WavPack | APEv2, ID3v1 |\r\n| `.ape` | Monkey's Audio | APEv2, ID3v1 |\r\n| `.tta` | TrueAudio | ID3v2, ID3v1 |\r\n| `.dsf` | DSF (DSD) | ID3v2 |\r\n| `.dff`, `.dsdiff` | DSDIFF (DSD) | ID3v2, DIIN |\r\n\r\n---\r\n\r\n## Streams & Browser Usage\r\n\r\nAll format readers work on an in-memory `ByteVectorStream`.  There is no file\r\nsystem access — audio data is passed in as a `Uint8Array` and the (possibly\r\nmodified) bytes are returned as a `Uint8Array`.\r\n\r\n```ts\r\nimport { ByteVectorStream } from \"@dantheman827/taglib-ts/toolkit/byteVectorStream.js\";\r\nimport { ByteVector } from '@dantheman827/taglib-ts/byteVector.js';\r\n\r\nconst bv     = ByteVector.fromByteArray(myUint8Array);\r\nconst stream = new ByteVectorStream(bv);\r\nconst ref    = await FileRef.open(stream);\r\n```\r\n\r\n---\r\n\r\n## ReadStyle\r\n\r\nControl how much of the file is scanned for audio properties:\r\n\r\n```ts\r\nimport { ReadStyle } from '@dantheman827/taglib-ts/toolkit/types.js';\r\n\r\nReadStyle.Fast     // Minimal scan — may be less accurate\r\nReadStyle.Average  // Default — good balance of speed and accuracy\r\nReadStyle.Accurate // Full scan — most accurate bitrate/duration for VBR\r\n```\r\n\r\n---\r\n\r\n## License\r\n\r\nLGPL-2.1-or-later (same as the original C++ TagLib)\r\n","readmeFilename":"README.md"}