music-metadata 7.12.5 → 8.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (152) hide show
  1. package/README.md +47 -31
  2. package/lib/ParserFactory.d.ts +3 -3
  3. package/lib/ParserFactory.js +37 -41
  4. package/lib/aiff/AiffParser.d.ts +2 -2
  5. package/lib/aiff/AiffParser.js +25 -17
  6. package/lib/aiff/AiffToken.d.ts +3 -2
  7. package/lib/aiff/AiffToken.js +13 -12
  8. package/lib/apev2/APEv2Parser.d.ts +5 -5
  9. package/lib/apev2/APEv2Parser.js +29 -32
  10. package/lib/apev2/APEv2TagMapper.d.ts +1 -1
  11. package/lib/apev2/APEv2TagMapper.js +2 -6
  12. package/lib/apev2/APEv2Token.d.ts +1 -1
  13. package/lib/apev2/APEv2Token.js +13 -19
  14. package/lib/asf/AsfObject.d.ts +5 -4
  15. package/lib/asf/AsfObject.js +42 -56
  16. package/lib/asf/AsfParser.d.ts +1 -1
  17. package/lib/asf/AsfParser.js +15 -19
  18. package/lib/asf/AsfTagMapper.d.ts +2 -2
  19. package/lib/asf/AsfTagMapper.js +2 -6
  20. package/lib/asf/AsfUtil.d.ts +3 -2
  21. package/lib/asf/AsfUtil.js +4 -7
  22. package/lib/asf/GUID.d.ts +1 -1
  23. package/lib/asf/GUID.js +1 -4
  24. package/lib/browser.js +99 -0
  25. package/lib/common/BasicParser.d.ts +4 -4
  26. package/lib/common/BasicParser.js +1 -5
  27. package/lib/common/CaseInsensitiveTagMap.d.ts +3 -3
  28. package/lib/common/CaseInsensitiveTagMap.js +2 -6
  29. package/lib/common/CombinedTagMapper.d.ts +4 -4
  30. package/lib/common/CombinedTagMapper.js +20 -24
  31. package/lib/common/FourCC.d.ts +1 -1
  32. package/lib/common/FourCC.js +3 -6
  33. package/lib/common/GenericTagMapper.d.ts +4 -4
  34. package/lib/common/GenericTagMapper.js +2 -6
  35. package/lib/common/GenericTagTypes.js +5 -10
  36. package/lib/common/MetadataCollector.d.ts +2 -2
  37. package/lib/common/MetadataCollector.js +20 -25
  38. package/lib/common/RandomFileReader.d.ts +2 -2
  39. package/lib/common/RandomFileReader.js +2 -6
  40. package/lib/common/RandomUint8ArrayReader.d.ts +1 -1
  41. package/lib/common/RandomUint8ArrayReader.js +1 -5
  42. package/lib/common/Util.d.ts +1 -1
  43. package/lib/common/Util.js +11 -25
  44. package/lib/core.d.ts +4 -4
  45. package/lib/core.js +18 -28
  46. package/lib/dsdiff/DsdiffParser.d.ts +1 -1
  47. package/lib/dsdiff/DsdiffParser.js +24 -28
  48. package/lib/dsdiff/DsdiffToken.d.ts +3 -3
  49. package/lib/dsdiff/DsdiffToken.js +4 -7
  50. package/lib/dsf/DsfChunk.d.ts +1 -1
  51. package/lib/dsf/DsfChunk.js +8 -11
  52. package/lib/dsf/DsfParser.d.ts +1 -1
  53. package/lib/dsf/DsfParser.js +13 -17
  54. package/lib/flac/FlacParser.d.ts +5 -5
  55. package/lib/flac/FlacParser.js +22 -26
  56. package/lib/id3v1/ID3v1Parser.d.ts +2 -2
  57. package/lib/id3v1/ID3v1Parser.js +16 -21
  58. package/lib/id3v1/ID3v1TagMap.d.ts +1 -1
  59. package/lib/id3v1/ID3v1TagMap.js +2 -6
  60. package/lib/id3v2/AbstractID3Parser.d.ts +2 -2
  61. package/lib/id3v2/AbstractID3Parser.js +13 -17
  62. package/lib/id3v2/FrameParser.d.ts +2 -2
  63. package/lib/id3v2/FrameParser.js +12 -17
  64. package/lib/id3v2/ID3v22TagMapper.d.ts +2 -2
  65. package/lib/id3v2/ID3v22TagMapper.js +4 -8
  66. package/lib/id3v2/ID3v24TagMapper.d.ts +3 -3
  67. package/lib/id3v2/ID3v24TagMapper.js +5 -9
  68. package/lib/id3v2/ID3v2Parser.d.ts +3 -3
  69. package/lib/id3v2/ID3v2Parser.js +10 -14
  70. package/lib/id3v2/ID3v2Token.d.ts +2 -2
  71. package/lib/id3v2/ID3v2Token.js +9 -12
  72. package/lib/iff/index.d.ts +1 -1
  73. package/lib/iff/index.js +4 -7
  74. package/lib/index.d.ts +4 -28
  75. package/lib/index.js +14 -44
  76. package/lib/lyrics3/Lyrics3.d.ts +1 -1
  77. package/lib/lyrics3/Lyrics3.js +3 -7
  78. package/lib/matroska/MatroskaDtd.d.ts +1 -1
  79. package/lib/matroska/MatroskaDtd.js +111 -114
  80. package/lib/matroska/MatroskaParser.d.ts +5 -5
  81. package/lib/matroska/MatroskaParser.js +20 -24
  82. package/lib/matroska/MatroskaTagMapper.d.ts +1 -1
  83. package/lib/matroska/MatroskaTagMapper.js +2 -6
  84. package/lib/matroska/types.d.ts +1 -1
  85. package/lib/matroska/types.js +6 -9
  86. package/lib/mp4/Atom.d.ts +2 -2
  87. package/lib/mp4/Atom.js +4 -8
  88. package/lib/mp4/AtomToken.d.ts +2 -2
  89. package/lib/mp4/AtomToken.js +29 -44
  90. package/lib/mp4/MP4Parser.d.ts +2 -2
  91. package/lib/mp4/MP4Parser.js +12 -16
  92. package/lib/mp4/MP4TagMapper.d.ts +1 -1
  93. package/lib/mp4/MP4TagMapper.js +4 -8
  94. package/lib/mpeg/ExtendedLameHeader.d.ts +2 -2
  95. package/lib/mpeg/ExtendedLameHeader.js +6 -9
  96. package/lib/mpeg/MpegParser.d.ts +1 -1
  97. package/lib/mpeg/MpegParser.js +17 -21
  98. package/lib/mpeg/ReplayGainDataFormat.d.ts +1 -1
  99. package/lib/mpeg/ReplayGainDataFormat.js +2 -5
  100. package/lib/mpeg/XingTag.d.ts +3 -3
  101. package/lib/mpeg/XingTag.js +9 -13
  102. package/lib/musepack/index.d.ts +1 -1
  103. package/lib/musepack/index.js +10 -12
  104. package/lib/musepack/sv7/BitReader.d.ts +1 -1
  105. package/lib/musepack/sv7/BitReader.js +2 -6
  106. package/lib/musepack/sv7/MpcSv7Parser.d.ts +1 -1
  107. package/lib/musepack/sv7/MpcSv7Parser.js +9 -13
  108. package/lib/musepack/sv7/StreamVersion7.d.ts +1 -1
  109. package/lib/musepack/sv7/StreamVersion7.js +3 -6
  110. package/lib/musepack/sv8/MpcSv8Parser.d.ts +1 -1
  111. package/lib/musepack/sv8/MpcSv8Parser.js +9 -13
  112. package/lib/musepack/sv8/StreamVersion8.d.ts +1 -1
  113. package/lib/musepack/sv8/StreamVersion8.js +5 -9
  114. package/lib/ogg/Ogg.js +1 -2
  115. package/lib/ogg/OggParser.d.ts +3 -3
  116. package/lib/ogg/OggParser.js +19 -24
  117. package/lib/ogg/opus/Opus.d.ts +1 -1
  118. package/lib/ogg/opus/Opus.js +2 -6
  119. package/lib/ogg/opus/OpusParser.d.ts +6 -6
  120. package/lib/ogg/opus/OpusParser.js +4 -8
  121. package/lib/ogg/speex/Speex.d.ts +1 -1
  122. package/lib/ogg/speex/Speex.js +3 -6
  123. package/lib/ogg/speex/SpeexParser.d.ts +6 -6
  124. package/lib/ogg/speex/SpeexParser.js +5 -9
  125. package/lib/ogg/theora/Theora.d.ts +1 -1
  126. package/lib/ogg/theora/Theora.js +2 -5
  127. package/lib/ogg/theora/TheoraParser.d.ts +5 -5
  128. package/lib/ogg/theora/TheoraParser.js +5 -9
  129. package/lib/ogg/vorbis/Vorbis.d.ts +3 -3
  130. package/lib/ogg/vorbis/Vorbis.js +6 -10
  131. package/lib/ogg/vorbis/VorbisDecoder.js +2 -6
  132. package/lib/ogg/vorbis/VorbisParser.d.ts +11 -11
  133. package/lib/ogg/vorbis/VorbisParser.js +18 -22
  134. package/lib/ogg/vorbis/VorbisTagMapper.d.ts +2 -2
  135. package/lib/ogg/vorbis/VorbisTagMapper.js +3 -7
  136. package/lib/riff/RiffChunk.d.ts +3 -3
  137. package/lib/riff/RiffChunk.js +3 -7
  138. package/lib/riff/RiffInfoTagMap.d.ts +2 -2
  139. package/lib/riff/RiffInfoTagMap.js +4 -8
  140. package/lib/type.d.ts +6 -5
  141. package/lib/type.js +1 -5
  142. package/lib/wav/BwfChunk.d.ts +1 -1
  143. package/lib/wav/BwfChunk.js +8 -11
  144. package/lib/wav/WaveChunk.d.ts +3 -3
  145. package/lib/wav/WaveChunk.js +4 -9
  146. package/lib/wav/WaveParser.d.ts +2 -2
  147. package/lib/wav/WaveParser.js +17 -21
  148. package/lib/wavpack/WavPackParser.d.ts +1 -1
  149. package/lib/wavpack/WavPackParser.js +17 -21
  150. package/lib/wavpack/WavPackToken.d.ts +1 -1
  151. package/lib/wavpack/WavPackToken.js +4 -8
  152. package/package.json +29 -41
package/README.md CHANGED
@@ -77,8 +77,9 @@ Support for encoding / format details:
77
77
 
78
78
  ## Compatibility
79
79
 
80
- The JavaScript in runtime is compliant with [ECMAScript 2017 (ES8)](https://en.wikipedia.org/wiki/ECMAScript#8th_Edition_-_ECMAScript_2017).
81
- Requires [Node.js®](https://nodejs.org/) version 6 or higher.
80
+ Module: version 8 migrated from [CommonJS](https://en.wikipedia.org/wiki/CommonJS) to [pure ECMAScript Module (ESM)](https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c).
81
+ JavaScript is compliant with [ECMAScript 2019 (ES10)](https://en.wikipedia.org/wiki/ECMAScript#10th_Edition_%E2%80%93_ECMAScript_2019).
82
+ Requires Node.js ≥ 12.20 engine.
82
83
 
83
84
  ### Browser Support
84
85
 
@@ -114,15 +115,11 @@ yarn add music-metadata
114
115
 
115
116
  ### Import music-metadata
116
117
 
117
- Import music-metadata in JavaScript:
118
+ Import music-metadata:
118
119
  ```JavaScript
119
- const mm = require('music-metadata');
120
- ```
121
-
122
- This is how it's done in TypeScript:
123
- ```ts
124
- import * as mm from 'music-metadata';
120
+ import { parseFile } from 'music-metadata';
125
121
  ```
122
+ Import the methods you need, like `parseFile` in this example.
126
123
 
127
124
  ### Module Functions
128
125
 
@@ -136,19 +133,19 @@ Direct file access tends to be a little faster, because it can 'jump' to various
136
133
 
137
134
  Parses the specified file (`filePath`) and returns a promise with the metadata result (`IAudioMetadata`).
138
135
 
139
- ```
136
+ ```ts
140
137
  parseFile(filePath: string, opts: IOptions = {}): Promise<IAudioMetadata>`
141
138
  ```
142
139
 
143
140
  Example:
144
141
  ```js
145
- const mm = require('music-metadata');
146
- const util = require('util');
142
+ import { parseFile } from 'music-metadata';
143
+ import { inspect } from 'util';
147
144
 
148
145
  (async () => {
149
146
  try {
150
- const metadata = await mm.parseFile('../music-metadata/test/samples/MusicBrainz - Beth Hart - Sinner\'s Prayer [id3v2.3].V2.mp3');
151
- console.log(util.inspect(metadata, { showHidden: false, depth: null }));
147
+ const metadata = await parseFile('../music-metadata/test/samples/MusicBrainz - Beth Hart - Sinner\'s Prayer [id3v2.3].V2.mp3');
148
+ console.log(inspect(metadata, { showHidden: false, depth: null }));
152
149
  } catch (error) {
153
150
  console.error(error.message);
154
151
  }
@@ -168,11 +165,11 @@ parseStream(stream: Stream.Readable, fileInfo?: IFileInfo | string, opts?: IOpti
168
165
 
169
166
  Example:
170
167
  ```js
171
- const mm = require('music-metadata');
168
+ import { parseStream } from 'music-metadata';
172
169
 
173
170
  (async () => {
174
171
  try {
175
- const metadata = await mm.parseStream(someReadStream, {mimeType: 'audio/mpeg', size: 26838});
172
+ const metadata = await parseStream(someReadStream, {mimeType: 'audio/mpeg', size: 26838});
176
173
  console.log(metadata);
177
174
  } catch (error) {
178
175
  console.error(error.message);
@@ -190,9 +187,11 @@ parseBuffer(buffer: Buffer, fileInfo?: IFileInfo | string, opts?: IOptions = {})
190
187
 
191
188
  Example:
192
189
  ```js
190
+ import { parseBuffer } from 'music-metadata';
191
+
193
192
  (async () => {
194
193
  try {
195
- const metadata = mm.parseBuffer(someBuffer, 'audio/mpeg');
194
+ const metadata = parseBuffer(someBuffer, 'audio/mpeg');
196
195
  console.log(metadata);
197
196
  } catch (error) {
198
197
  console.error(error.message);
@@ -215,6 +214,21 @@ Utility to Converts the native tags to a dictionary index on the tag identifier
215
214
  orderTags(nativeTags: ITag[]): [tagId: string]: any[]
216
215
  ```
217
216
 
217
+ ```js
218
+ import { parseFile, orderTags } from 'music-metadata';
219
+ import { inspect } from 'util';
220
+
221
+ (async () => {
222
+ try {
223
+ const metadata = await parseFile('../test/samples/MusicBrainz - Beth Hart - Sinner\'s Prayer [id3v2.3].V2.mp3');
224
+ const orderedTags = orderTags(metadata.native['ID3v2.3']);
225
+ console.log(inspect(orderedTags, { showHidden: false, depth: null }));
226
+ } catch (error) {
227
+ console.error(error.message);
228
+ }
229
+ })();
230
+ ```
231
+
218
232
  #### ratingToStars function
219
233
 
220
234
  Can be used to convert the normalized rating value to the 0..5 stars, where 0 an undefined rating, 1 the star the lowest rating and 5 the highest rating.
@@ -231,11 +245,11 @@ export function selectCover(pictures?: IPicture[]): IPicture | null
231
245
  ```
232
246
 
233
247
  ```js
234
- import * as mm from 'music-metadata';
248
+ import { parseFile, selectCover } from 'music-metadata';
235
249
 
236
250
  (async () => {
237
- const {common} = await mm.parseFile(filePath);
238
- const cover = mm.selectCover(common.picture); // pick the cover image
251
+ const {common} = await parseFile(filePath);
252
+ const cover = selectCover(common.picture); // pick the cover image
239
253
  }
240
254
  )();
241
255
  ```
@@ -327,11 +341,15 @@ Audio format information. Defined in the TypeScript `IFormat` interface:
327
341
 
328
342
  In order to read the duration of a stream (with the exception of file streams), in some cases you should pass the size of the file in bytes.
329
343
  ```js
330
- mm.parseStream(someReadStream, {mimeType: 'audio/mpeg', size: 26838}, {duration: true})
331
- .then( function (metadata) {
332
- console.log(util.inspect(metadata, {showHidden: false, depth: null}));
333
- someReadStream.close();
334
- });
344
+ import { parseStream } from 'music-metadata';
345
+ import { inspect } from 'util';
346
+
347
+ (async () => {
348
+ const metadata = await parseStream(someReadStream, {mimeType: 'audio/mpeg', size: 26838}, {duration: true});
349
+ console.log(inspect(metadata, {showHidden: false, depth: null}));
350
+ someReadStream.close();
351
+ }
352
+ )();
335
353
  ```
336
354
 
337
355
  ### Access cover art
@@ -379,20 +397,18 @@ img.src = `data:${picture.format};base64,${picture.data.toString('base64')}`;
379
397
  1. Using recursion
380
398
 
381
399
  ```js
382
- const mm = require('music-metadata')
400
+ import { parseFile } from 'music-metadata';
383
401
 
384
402
  function parseFiles(audioFiles) {
385
403
 
386
404
  const audioFile = audioFiles.shift();
387
405
 
388
406
  if (audioFile) {
389
- return mm.parseFile(audioFile).then(metadata => {
407
+ return parseFile(audioFile).then(metadata => {
390
408
  // Do great things with the metadata
391
409
  return parseFiles(audioFiles); // process rest of the files AFTER we are finished
392
410
  })
393
411
  }
394
-
395
- return Promise.resolve();
396
412
  }
397
413
 
398
414
  ```
@@ -402,7 +418,7 @@ img.src = `data:${picture.format};base64,${picture.data.toString('base64')}`;
402
418
  Use [async/await](https://javascript.info/async-await)
403
419
 
404
420
  ```js
405
- const mm = require('music-metadata');
421
+ import { parseFile } from 'music-metadata';
406
422
 
407
423
  // it is required to declare the function 'async' to allow the use of await
408
424
  async function parseFiles(audioFiles) {
@@ -410,7 +426,7 @@ img.src = `data:${picture.format};base64,${picture.data.toString('base64')}`;
410
426
  for (const audioFile of audioFiles) {
411
427
 
412
428
  // await will ensure the metadata parsing is completed before we move on to the next file
413
- const metadata = await mm.parseFile(audioFile);
429
+ const metadata = await parseFile(audioFile);
414
430
  // Do great things with the metadata
415
431
  }
416
432
  }
@@ -1,6 +1,6 @@
1
- import { IOptions, IAudioMetadata, ParserType } from './type';
2
- import { ITokenizer } from 'strtok3/lib/core';
3
- import { INativeMetadataCollector } from './common/MetadataCollector';
1
+ import { INativeMetadataCollector } from './common/MetadataCollector.js';
2
+ import { IOptions, IAudioMetadata, ParserType } from './type.js';
3
+ import { ITokenizer } from 'strtok3/core';
4
4
  export interface ITokenParser {
5
5
  /**
6
6
  * Initialize parser with output (metadata), input (tokenizer) & parsing options (options).
@@ -1,26 +1,24 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ParserFactory = exports.parseHttpContentType = void 0;
4
- const FileType = require("file-type/core");
5
- const ContentType = require("content-type");
6
- const MimeType = require("media-typer");
7
- const debug_1 = require("debug");
8
- const MetadataCollector_1 = require("./common/MetadataCollector");
9
- const AiffParser_1 = require("./aiff/AiffParser");
10
- const APEv2Parser_1 = require("./apev2/APEv2Parser");
11
- const AsfParser_1 = require("./asf/AsfParser");
12
- const FlacParser_1 = require("./flac/FlacParser");
13
- const MP4Parser_1 = require("./mp4/MP4Parser");
14
- const MpegParser_1 = require("./mpeg/MpegParser");
15
- const musepack_1 = require("./musepack");
16
- const OggParser_1 = require("./ogg/OggParser");
17
- const WaveParser_1 = require("./wav/WaveParser");
18
- const WavPackParser_1 = require("./wavpack/WavPackParser");
19
- const DsfParser_1 = require("./dsf/DsfParser");
20
- const DsdiffParser_1 = require("./dsdiff/DsdiffParser");
21
- const MatroskaParser_1 = require("./matroska/MatroskaParser");
22
- const debug = (0, debug_1.default)('music-metadata:parser:factory');
23
- function parseHttpContentType(contentType) {
1
+ import { fileTypeFromBuffer } from 'file-type';
2
+ import ContentType from 'content-type';
3
+ import MimeType from 'media-typer';
4
+ import initDebug from 'debug';
5
+ import { Buffer } from 'node:buffer';
6
+ import { MetadataCollector } from './common/MetadataCollector.js';
7
+ import { AIFFParser } from './aiff/AiffParser.js';
8
+ import { APEv2Parser } from './apev2/APEv2Parser.js';
9
+ import { AsfParser } from './asf/AsfParser.js';
10
+ import { FlacParser } from './flac/FlacParser.js';
11
+ import { MP4Parser } from './mp4/MP4Parser.js';
12
+ import { MpegParser } from './mpeg/MpegParser.js';
13
+ import MusepackParser from './musepack/index.js';
14
+ import { OggParser } from './ogg/OggParser.js';
15
+ import { WaveParser } from './wav/WaveParser.js';
16
+ import { WavPackParser } from './wavpack/WavPackParser.js';
17
+ import { DsfParser } from './dsf/DsfParser.js';
18
+ import { DsdiffParser } from './dsdiff/DsdiffParser.js';
19
+ import { MatroskaParser } from './matroska/MatroskaParser.js';
20
+ const debug = initDebug('music-metadata:parser:factory');
21
+ export function parseHttpContentType(contentType) {
24
22
  const type = ContentType.parse(contentType);
25
23
  const mime = MimeType.parse(type.type);
26
24
  return {
@@ -30,15 +28,14 @@ function parseHttpContentType(contentType) {
30
28
  parameters: type.parameters
31
29
  };
32
30
  }
33
- exports.parseHttpContentType = parseHttpContentType;
34
31
  async function parse(tokenizer, parserId, opts = {}) {
35
32
  // Parser found, execute parser
36
33
  const parser = await ParserFactory.loadParser(parserId);
37
- const metadata = new MetadataCollector_1.MetadataCollector(opts);
34
+ const metadata = new MetadataCollector(opts);
38
35
  await parser.init(metadata, tokenizer, opts).parse();
39
36
  return metadata.toCommonMetadata();
40
37
  }
41
- class ParserFactory {
38
+ export class ParserFactory {
42
39
  /**
43
40
  * Parse metadata from tokenizer
44
41
  * @param tokenizer - Tokenizer
@@ -64,7 +61,7 @@ class ParserFactory {
64
61
  parserId = this.getParserIdForExtension(tokenizer.fileInfo.path);
65
62
  }
66
63
  if (!parserId) {
67
- const guessedType = await FileType.fromBuffer(buf);
64
+ const guessedType = await fileTypeFromBuffer(buf);
68
65
  if (!guessedType) {
69
66
  throw new Error('Failed to determine audio format');
70
67
  }
@@ -142,21 +139,21 @@ class ParserFactory {
142
139
  }
143
140
  static async loadParser(moduleName) {
144
141
  switch (moduleName) {
145
- case 'aiff': return new AiffParser_1.AIFFParser();
142
+ case 'aiff': return new AIFFParser();
146
143
  case 'adts':
147
144
  case 'mpeg':
148
- return new MpegParser_1.MpegParser();
149
- case 'apev2': return new APEv2Parser_1.APEv2Parser();
150
- case 'asf': return new AsfParser_1.AsfParser();
151
- case 'dsf': return new DsfParser_1.DsfParser();
152
- case 'dsdiff': return new DsdiffParser_1.DsdiffParser();
153
- case 'flac': return new FlacParser_1.FlacParser();
154
- case 'mp4': return new MP4Parser_1.MP4Parser();
155
- case 'musepack': return new musepack_1.default();
156
- case 'ogg': return new OggParser_1.OggParser();
157
- case 'riff': return new WaveParser_1.WaveParser();
158
- case 'wavpack': return new WavPackParser_1.WavPackParser();
159
- case 'matroska': return new MatroskaParser_1.MatroskaParser();
145
+ return new MpegParser();
146
+ case 'apev2': return new APEv2Parser();
147
+ case 'asf': return new AsfParser();
148
+ case 'dsf': return new DsfParser();
149
+ case 'dsdiff': return new DsdiffParser();
150
+ case 'flac': return new FlacParser();
151
+ case 'mp4': return new MP4Parser();
152
+ case 'musepack': return new MusepackParser();
153
+ case 'ogg': return new OggParser();
154
+ case 'riff': return new WaveParser();
155
+ case 'wavpack': return new WavPackParser();
156
+ case 'matroska': return new MatroskaParser();
160
157
  default:
161
158
  throw new Error(`Unknown parser type: ${moduleName}`);
162
159
  }
@@ -249,4 +246,3 @@ class ParserFactory {
249
246
  }
250
247
  }
251
248
  }
252
- exports.ParserFactory = ParserFactory;
@@ -1,5 +1,5 @@
1
- import { BasicParser } from '../common/BasicParser';
2
- import * as iff from '../iff';
1
+ import { BasicParser } from '../common/BasicParser.js';
2
+ import * as iff from '../iff/index.js';
3
3
  /**
4
4
  * AIFF - Audio Interchange File Format
5
5
  *
@@ -1,15 +1,23 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.AIFFParser = void 0;
4
- const Token = require("token-types");
5
- const debug_1 = require("debug");
6
- const strtok3 = require("strtok3/lib/core");
7
- const ID3v2Parser_1 = require("../id3v2/ID3v2Parser");
8
- const FourCC_1 = require("../common/FourCC");
9
- const BasicParser_1 = require("../common/BasicParser");
10
- const AiffToken = require("./AiffToken");
11
- const iff = require("../iff");
12
- const debug = (0, debug_1.default)('music-metadata:parser:aiff');
1
+ import * as Token from 'token-types';
2
+ import initDebug from 'debug';
3
+ import * as strtok3 from 'strtok3/core';
4
+ import { ID3v2Parser } from '../id3v2/ID3v2Parser.js';
5
+ import { FourCcToken } from '../common/FourCC.js';
6
+ import { BasicParser } from '../common/BasicParser.js';
7
+ import * as AiffToken from './AiffToken.js';
8
+ import * as iff from '../iff/index.js';
9
+ const debug = initDebug('music-metadata:parser:aiff');
10
+ const compressionTypes = {
11
+ NONE: 'not compressed PCM Apple Computer',
12
+ sowt: 'PCM (byte swapped)',
13
+ fl32: '32-bit floating point IEEE 32-bit float',
14
+ fl64: '64-bit floating point IEEE 64-bit float Apple Computer',
15
+ alaw: 'ALaw 2:1 8-bit ITU-T G.711 A-law',
16
+ ulaw: 'µLaw 2:1 8-bit ITU-T G.711 µ-law Apple Computer',
17
+ ULAW: 'CCITT G.711 u-law 8-bit ITU-T G.711 µ-law',
18
+ ALAW: 'CCITT G.711 A-law 8-bit ITU-T G.711 A-law',
19
+ FL32: 'Float 32 IEEE 32-bit float '
20
+ };
13
21
  /**
14
22
  * AIFF - Audio Interchange File Format
15
23
  *
@@ -17,12 +25,12 @@ const debug = (0, debug_1.default)('music-metadata:parser:aiff');
17
25
  * - http://www-mmsp.ece.mcgill.ca/Documents/AudioFormats/AIFF/AIFF.html
18
26
  * - http://www-mmsp.ece.mcgill.ca/Documents/AudioFormats/AIFF/Docs/AIFF-1.3.pdf
19
27
  */
20
- class AIFFParser extends BasicParser_1.BasicParser {
28
+ export class AIFFParser extends BasicParser {
21
29
  async parse() {
22
30
  const header = await this.tokenizer.readToken(iff.Header);
23
31
  if (header.chunkID !== 'FORM')
24
32
  throw new Error('Invalid Chunk-ID, expected \'FORM\''); // Not AIFF format
25
- const type = await this.tokenizer.readToken(FourCC_1.FourCcToken);
33
+ const type = await this.tokenizer.readToken(FourCcToken);
26
34
  switch (type) {
27
35
  case 'AIFF':
28
36
  this.metadata.setFormat('container', type);
@@ -56,6 +64,7 @@ class AIFFParser extends BasicParser_1.BasicParser {
56
64
  }
57
65
  }
58
66
  async readData(header) {
67
+ var _a;
59
68
  switch (header.chunkID) {
60
69
  case 'COMM': // The Common Chunk
61
70
  const common = await this.tokenizer.readToken(new AiffToken.Common(header, this.isCompressed));
@@ -64,12 +73,12 @@ class AIFFParser extends BasicParser_1.BasicParser {
64
73
  this.metadata.setFormat('numberOfChannels', common.numChannels);
65
74
  this.metadata.setFormat('numberOfSamples', common.numSampleFrames);
66
75
  this.metadata.setFormat('duration', common.numSampleFrames / common.sampleRate);
67
- this.metadata.setFormat('codec', common.compressionName);
76
+ this.metadata.setFormat('codec', (_a = common.compressionName) !== null && _a !== void 0 ? _a : compressionTypes[common.compressionType]);
68
77
  return header.chunkSize;
69
78
  case 'ID3 ': // ID3-meta-data
70
79
  const id3_data = await this.tokenizer.readToken(new Token.Uint8ArrayType(header.chunkSize));
71
80
  const rst = strtok3.fromBuffer(id3_data);
72
- await new ID3v2Parser_1.ID3v2Parser().parse(this.metadata, rst, this.options);
81
+ await new ID3v2Parser().parse(this.metadata, rst, this.options);
73
82
  return header.chunkSize;
74
83
  case 'SSND': // Sound Data Chunk
75
84
  if (this.metadata.format.duration) {
@@ -81,4 +90,3 @@ class AIFFParser extends BasicParser_1.BasicParser {
81
90
  }
82
91
  }
83
92
  }
84
- exports.AIFFParser = AIFFParser;
@@ -1,6 +1,7 @@
1
- /// <reference types="node" />
1
+ /// <reference types="node" resolution-mode="require"/>
2
+ import { Buffer } from 'node:buffer';
3
+ import * as iff from '../iff/index.js';
2
4
  import { IGetToken } from 'strtok3';
3
- import * as iff from '../iff';
4
5
  /**
5
6
  * The Common Chunk.
6
7
  * Describes fundamental parameters of the waveform data such as sample rate, bit resolution, and how many channels of
@@ -1,9 +1,6 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Common = void 0;
4
- const Token = require("token-types");
5
- const FourCC_1 = require("../common/FourCC");
6
- class Common {
1
+ import * as Token from 'token-types';
2
+ import { FourCcToken } from '../common/FourCC.js';
3
+ export class Common {
7
4
  constructor(header, isAifc) {
8
5
  this.isAifc = isAifc;
9
6
  const minimumChunkSize = isAifc ? 22 : 18;
@@ -22,15 +19,20 @@ class Common {
22
19
  sampleRate: shift < 0 ? baseSampleRate >> Math.abs(shift) : baseSampleRate << shift
23
20
  };
24
21
  if (this.isAifc) {
25
- res.compressionType = FourCC_1.FourCcToken.get(buf, off + 18);
22
+ res.compressionType = FourCcToken.get(buf, off + 18);
26
23
  if (this.len > 22) {
27
24
  const strLen = buf.readInt8(off + 22);
28
- const padding = (strLen + 1) % 2;
29
- if (23 + strLen + padding === this.len) {
30
- res.compressionName = new Token.StringType(strLen, 'binary').get(buf, off + 23);
25
+ if (strLen > 0) {
26
+ const padding = (strLen + 1) % 2;
27
+ if (23 + strLen + padding === this.len) {
28
+ res.compressionName = new Token.StringType(strLen, 'binary').get(buf, off + 23);
29
+ }
30
+ else {
31
+ throw new Error('Illegal pstring length');
32
+ }
31
33
  }
32
34
  else {
33
- throw new Error('Illegal pstring length');
35
+ res.compressionName = undefined;
34
36
  }
35
37
  }
36
38
  }
@@ -40,4 +42,3 @@ class Common {
40
42
  return res;
41
43
  }
42
44
  }
43
- exports.Common = Common;
@@ -1,8 +1,8 @@
1
- import * as strtok3 from 'strtok3/lib/core';
2
- import { IOptions, IRandomReader, IApeHeader } from '../type';
3
- import { INativeMetadataCollector } from '../common/MetadataCollector';
4
- import { BasicParser } from '../common/BasicParser';
5
- import { IFooter, IHeader } from './APEv2Token';
1
+ import * as strtok3 from 'strtok3/core';
2
+ import { IOptions, IRandomReader, IApeHeader } from '../type.js';
3
+ import { INativeMetadataCollector } from '../common/MetadataCollector.js';
4
+ import { BasicParser } from '../common/BasicParser.js';
5
+ import { IFooter, IHeader } from './APEv2Token.js';
6
6
  export declare class APEv2Parser extends BasicParser {
7
7
  static tryParseApeHeader(metadata: INativeMetadataCollector, tokenizer: strtok3.ITokenizer, options: IOptions): Promise<void>;
8
8
  /**
@@ -1,16 +1,14 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.APEv2Parser = void 0;
4
- const debug_1 = require("debug");
5
- const strtok3 = require("strtok3/lib/core");
6
- const token_types_1 = require("token-types");
7
- const util = require("../common/Util");
8
- const BasicParser_1 = require("../common/BasicParser");
9
- const APEv2Token_1 = require("./APEv2Token");
10
- const debug = (0, debug_1.default)('music-metadata:parser:APEv2');
1
+ import initDebug from 'debug';
2
+ import * as strtok3 from 'strtok3/core';
3
+ import { StringType } from 'token-types';
4
+ import { Buffer } from 'node:buffer';
5
+ import * as util from '../common/Util.js';
6
+ import { BasicParser } from '../common/BasicParser.js';
7
+ import { DataType, DescriptorParser, Header, TagFooter, TagItemHeader } from './APEv2Token.js';
8
+ const debug = initDebug('music-metadata:parser:APEv2');
11
9
  const tagFormat = 'APEv2';
12
10
  const preamble = 'APETAGEX';
13
- class APEv2Parser extends BasicParser_1.BasicParser {
11
+ export class APEv2Parser extends BasicParser {
14
12
  constructor() {
15
13
  super(...arguments);
16
14
  this.ape = {};
@@ -37,16 +35,16 @@ class APEv2Parser extends BasicParser_1.BasicParser {
37
35
  */
38
36
  static async findApeFooterOffset(reader, offset) {
39
37
  // Search for APE footer header at the end of the file
40
- const apeBuf = Buffer.alloc(APEv2Token_1.TagFooter.len);
41
- await reader.randomRead(apeBuf, 0, APEv2Token_1.TagFooter.len, offset - APEv2Token_1.TagFooter.len);
42
- const tagFooter = APEv2Token_1.TagFooter.get(apeBuf, 0);
38
+ const apeBuf = Buffer.alloc(TagFooter.len);
39
+ await reader.randomRead(apeBuf, 0, TagFooter.len, offset - TagFooter.len);
40
+ const tagFooter = TagFooter.get(apeBuf, 0);
43
41
  if (tagFooter.ID === 'APETAGEX') {
44
42
  debug(`APE footer header at offset=${offset}`);
45
43
  return { footer: tagFooter, offset: offset - tagFooter.size };
46
44
  }
47
45
  }
48
46
  static parseTagFooter(metadata, buffer, options) {
49
- const footer = APEv2Token_1.TagFooter.get(buffer, buffer.length - APEv2Token_1.TagFooter.len);
47
+ const footer = TagFooter.get(buffer, buffer.length - TagFooter.len);
50
48
  if (footer.ID !== preamble)
51
49
  throw new Error('Unexpected APEv2 Footer ID preamble value.');
52
50
  strtok3.fromBuffer(buffer);
@@ -58,13 +56,13 @@ class APEv2Parser extends BasicParser_1.BasicParser {
58
56
  * Parse APEv1 / APEv2 header if header signature found
59
57
  */
60
58
  async tryParseApeHeader() {
61
- if (this.tokenizer.fileInfo.size && this.tokenizer.fileInfo.size - this.tokenizer.position < APEv2Token_1.TagFooter.len) {
59
+ if (this.tokenizer.fileInfo.size && this.tokenizer.fileInfo.size - this.tokenizer.position < TagFooter.len) {
62
60
  debug(`No APEv2 header found, end-of-file reached`);
63
61
  return;
64
62
  }
65
- const footer = await this.tokenizer.peekToken(APEv2Token_1.TagFooter);
63
+ const footer = await this.tokenizer.peekToken(TagFooter);
66
64
  if (footer.ID === preamble) {
67
- await this.tokenizer.ignore(APEv2Token_1.TagFooter.len);
65
+ await this.tokenizer.ignore(TagFooter.len);
68
66
  return this.parseTags(footer);
69
67
  }
70
68
  else {
@@ -79,42 +77,42 @@ class APEv2Parser extends BasicParser_1.BasicParser {
79
77
  }
80
78
  }
81
79
  async parse() {
82
- const descriptor = await this.tokenizer.readToken(APEv2Token_1.DescriptorParser);
80
+ const descriptor = await this.tokenizer.readToken(DescriptorParser);
83
81
  if (descriptor.ID !== 'MAC ')
84
82
  throw new Error('Unexpected descriptor ID');
85
83
  this.ape.descriptor = descriptor;
86
- const lenExp = descriptor.descriptorBytes - APEv2Token_1.DescriptorParser.len;
84
+ const lenExp = descriptor.descriptorBytes - DescriptorParser.len;
87
85
  const header = await (lenExp > 0 ? this.parseDescriptorExpansion(lenExp) : this.parseHeader());
88
86
  await this.tokenizer.ignore(header.forwardBytes);
89
87
  return this.tryParseApeHeader();
90
88
  }
91
89
  async parseTags(footer) {
92
90
  const keyBuffer = Buffer.alloc(256); // maximum tag key length
93
- let bytesRemaining = footer.size - APEv2Token_1.TagFooter.len;
91
+ let bytesRemaining = footer.size - TagFooter.len;
94
92
  debug(`Parse APE tags at offset=${this.tokenizer.position}, size=${bytesRemaining}`);
95
93
  for (let i = 0; i < footer.fields; i++) {
96
- if (bytesRemaining < APEv2Token_1.TagItemHeader.len) {
94
+ if (bytesRemaining < TagItemHeader.len) {
97
95
  this.metadata.addWarning(`APEv2 Tag-header: ${footer.fields - i} items remaining, but no more tag data to read.`);
98
96
  break;
99
97
  }
100
98
  // Only APEv2 tag has tag item headers
101
- const tagItemHeader = await this.tokenizer.readToken(APEv2Token_1.TagItemHeader);
102
- bytesRemaining -= APEv2Token_1.TagItemHeader.len + tagItemHeader.size;
99
+ const tagItemHeader = await this.tokenizer.readToken(TagItemHeader);
100
+ bytesRemaining -= TagItemHeader.len + tagItemHeader.size;
103
101
  await this.tokenizer.peekBuffer(keyBuffer, { length: Math.min(keyBuffer.length, bytesRemaining) });
104
102
  let zero = util.findZero(keyBuffer, 0, keyBuffer.length);
105
- const key = await this.tokenizer.readToken(new token_types_1.StringType(zero, 'ascii'));
103
+ const key = await this.tokenizer.readToken(new StringType(zero, 'ascii'));
106
104
  await this.tokenizer.ignore(1);
107
105
  bytesRemaining -= key.length + 1;
108
106
  switch (tagItemHeader.flags.dataType) {
109
- case APEv2Token_1.DataType.text_utf8: { // utf-8 text-string
110
- const value = await this.tokenizer.readToken(new token_types_1.StringType(tagItemHeader.size, 'utf8'));
107
+ case DataType.text_utf8: { // utf-8 text-string
108
+ const value = await this.tokenizer.readToken(new StringType(tagItemHeader.size, 'utf8'));
111
109
  const values = value.split(/\x00/g);
112
110
  for (const val of values) {
113
111
  this.metadata.addTag(tagFormat, key, val);
114
112
  }
115
113
  break;
116
114
  }
117
- case APEv2Token_1.DataType.binary: // binary (probably artwork)
115
+ case DataType.binary: // binary (probably artwork)
118
116
  if (this.options.skipCovers) {
119
117
  await this.tokenizer.ignore(tagItemHeader.size);
120
118
  }
@@ -130,11 +128,11 @@ class APEv2Parser extends BasicParser_1.BasicParser {
130
128
  });
131
129
  }
132
130
  break;
133
- case APEv2Token_1.DataType.external_info:
131
+ case DataType.external_info:
134
132
  debug(`Ignore external info ${key}`);
135
133
  await this.tokenizer.ignore(tagItemHeader.size);
136
134
  break;
137
- case APEv2Token_1.DataType.reserved:
135
+ case DataType.reserved:
138
136
  debug(`Ignore external info ${key}`);
139
137
  this.metadata.addWarning(`APEv2 header declares a reserved datatype for "${key}"`);
140
138
  await this.tokenizer.ignore(tagItemHeader.size);
@@ -147,7 +145,7 @@ class APEv2Parser extends BasicParser_1.BasicParser {
147
145
  return this.parseHeader();
148
146
  }
149
147
  async parseHeader() {
150
- const header = await this.tokenizer.readToken(APEv2Token_1.Header);
148
+ const header = await this.tokenizer.readToken(Header);
151
149
  // ToDo before
152
150
  this.metadata.setFormat('lossless', true);
153
151
  this.metadata.setFormat('container', 'Monkey\'s Audio');
@@ -161,4 +159,3 @@ class APEv2Parser extends BasicParser_1.BasicParser {
161
159
  };
162
160
  }
163
161
  }
164
- exports.APEv2Parser = APEv2Parser;
@@ -1,4 +1,4 @@
1
- import { CaseInsensitiveTagMap } from '../common/CaseInsensitiveTagMap';
1
+ import { CaseInsensitiveTagMap } from '../common/CaseInsensitiveTagMap.js';
2
2
  export declare class APEv2TagMapper extends CaseInsensitiveTagMap {
3
3
  constructor();
4
4
  }
@@ -1,7 +1,4 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.APEv2TagMapper = void 0;
4
- const CaseInsensitiveTagMap_1 = require("../common/CaseInsensitiveTagMap");
1
+ import { CaseInsensitiveTagMap } from '../common/CaseInsensitiveTagMap.js';
5
2
  /**
6
3
  * ID3v2.2 tag mappings
7
4
  */
@@ -78,10 +75,9 @@ const apev2TagMap = {
78
75
  MP3GAIN_MINMAX: 'replaygain_track_minmax',
79
76
  MP3GAIN_UNDO: 'replaygain_undo'
80
77
  };
81
- class APEv2TagMapper extends CaseInsensitiveTagMap_1.CaseInsensitiveTagMap {
78
+ export class APEv2TagMapper extends CaseInsensitiveTagMap {
82
79
  constructor() {
83
80
  super(['APEv2'], apev2TagMap);
84
81
  }
85
82
  }
86
- exports.APEv2TagMapper = APEv2TagMapper;
87
83
  //# sourceMappingURL=APEv2TagMapper.js.map
@@ -1,5 +1,5 @@
1
1
  import * as Token from 'token-types';
2
- import { IGetToken } from 'strtok3/lib/core';
2
+ import { IGetToken } from 'strtok3/core';
3
3
  /**
4
4
  * APETag versionIndex history / supported formats
5
5
  *