music-metadata 7.12.0 → 7.12.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.
@@ -294,7 +294,7 @@ export declare class ExtendedStreamPropertiesObjectState extends State<IExtended
294
294
  export declare class MetadataObjectState extends State<ITag[]> {
295
295
  static guid: GUID;
296
296
  constructor(header: IAsfObjectHeader);
297
- get(buf: Buffer, off: number): ITag[];
297
+ get(uint8Array: Uint8Array, off: number): ITag[];
298
298
  }
299
299
  export declare class MetadataLibraryObjectState extends MetadataObjectState {
300
300
  static guid: GUID;
@@ -311,8 +311,9 @@ class MetadataObjectState extends State {
311
311
  constructor(header) {
312
312
  super(header);
313
313
  }
314
- get(buf, off) {
314
+ get(uint8Array, off) {
315
315
  const tags = [];
316
+ const buf = Buffer.from(uint8Array);
316
317
  const descriptionRecordsCount = buf.readUInt16LE(off);
317
318
  let pos = off + 2;
318
319
  for (let i = 0; i < descriptionRecordsCount; i += 1) {
@@ -327,10 +328,6 @@ class MetadataObjectState extends State {
327
328
  pos += nameLen;
328
329
  const data = buf.slice(pos, pos + dataLen);
329
330
  pos += dataLen;
330
- const parseAttr = AsfUtil_1.AsfUtil.getParserForAttr(dataType);
331
- if (!parseAttr) {
332
- throw new Error('unexpected value headerType: ' + dataType);
333
- }
334
331
  this.postProcessTag(tags, name, dataType, data);
335
332
  }
336
333
  return tags;
@@ -3,7 +3,7 @@ import { DataType } from './AsfObject';
3
3
  export declare type AttributeParser = (buf: Buffer) => boolean | string | number | bigint | Buffer;
4
4
  export declare class AsfUtil {
5
5
  static getParserForAttr(i: DataType): AttributeParser;
6
- static parseUnicodeAttr(buf: any): string;
6
+ static parseUnicodeAttr(uint8Array: Uint8Array): string;
7
7
  private static attributeParsers;
8
8
  private static parseByteArrayAttr;
9
9
  private static parseBoolAttr;
@@ -7,13 +7,11 @@ class AsfUtil {
7
7
  static getParserForAttr(i) {
8
8
  return AsfUtil.attributeParsers[i];
9
9
  }
10
- static parseUnicodeAttr(buf) {
11
- return util.stripNulls(util.decodeString(buf, 'utf16le'));
10
+ static parseUnicodeAttr(uint8Array) {
11
+ return util.stripNulls(util.decodeString(uint8Array, 'utf16le'));
12
12
  }
13
13
  static parseByteArrayAttr(buf) {
14
- const newBuf = Buffer.alloc(buf.length);
15
- buf.copy(newBuf);
16
- return newBuf;
14
+ return Buffer.from(buf);
17
15
  }
18
16
  static parseBoolAttr(buf, offset = 0) {
19
17
  return AsfUtil.parseWordAttr(buf, offset) === 1;
@@ -23,22 +23,22 @@ export declare function stripNulls(str: string): string;
23
23
  /**
24
24
  * Read bit-aligned number start from buffer
25
25
  * Total offset in bits = byteOffset * 8 + bitOffset
26
- * @param buf Byte buffer
26
+ * @param source Byte buffer
27
27
  * @param byteOffset Starting offset in bytes
28
28
  * @param bitOffset Starting offset in bits: 0 = lsb
29
29
  * @param len Length of number in bits
30
- * @return {number} decoded bit aligned number
30
+ * @return Decoded bit aligned number
31
31
  */
32
- export declare function getBitAllignedNumber(buf: Uint8Array, byteOffset: number, bitOffset: number, len: number): number;
32
+ export declare function getBitAllignedNumber(source: Uint8Array, byteOffset: number, bitOffset: number, len: number): number;
33
33
  /**
34
34
  * Read bit-aligned number start from buffer
35
35
  * Total offset in bits = byteOffset * 8 + bitOffset
36
- * @param buf Byte buffer
36
+ * @param source Byte Uint8Array
37
37
  * @param byteOffset Starting offset in bytes
38
- * @param bitOffset Starting offset in bits: 0 = most significant bit, 7 is least significant bit
39
- * @return {number} decoded bit aligned number
38
+ * @param bitOffset Starting offset in bits: 0 = most significant bit, 7 is the least significant bit
39
+ * @return True if bit is set
40
40
  */
41
- export declare function isBitSet(buf: Uint8Array, byteOffset: number, bitOffset: number): boolean;
41
+ export declare function isBitSet(source: Uint8Array, byteOffset: number, bitOffset: number): boolean;
42
42
  export declare function a2hex(str: string): string;
43
43
  /**
44
44
  * Convert power ratio to DB
@@ -76,16 +76,16 @@ exports.stripNulls = stripNulls;
76
76
  /**
77
77
  * Read bit-aligned number start from buffer
78
78
  * Total offset in bits = byteOffset * 8 + bitOffset
79
- * @param buf Byte buffer
79
+ * @param source Byte buffer
80
80
  * @param byteOffset Starting offset in bytes
81
81
  * @param bitOffset Starting offset in bits: 0 = lsb
82
82
  * @param len Length of number in bits
83
- * @return {number} decoded bit aligned number
83
+ * @return Decoded bit aligned number
84
84
  */
85
- function getBitAllignedNumber(buf, byteOffset, bitOffset, len) {
85
+ function getBitAllignedNumber(source, byteOffset, bitOffset, len) {
86
86
  const byteOff = byteOffset + ~~(bitOffset / 8);
87
87
  const bitOff = bitOffset % 8;
88
- let value = buf[byteOff];
88
+ let value = source[byteOff];
89
89
  value &= 0xff >> bitOff;
90
90
  const bitsRead = 8 - bitOff;
91
91
  const bitsLeft = len - bitsRead;
@@ -94,7 +94,7 @@ function getBitAllignedNumber(buf, byteOffset, bitOffset, len) {
94
94
  }
95
95
  else if (bitsLeft > 0) {
96
96
  value <<= bitsLeft;
97
- value |= getBitAllignedNumber(buf, byteOffset, bitOffset + bitsRead, bitsLeft);
97
+ value |= getBitAllignedNumber(source, byteOffset, bitOffset + bitsRead, bitsLeft);
98
98
  }
99
99
  return value;
100
100
  }
@@ -102,13 +102,13 @@ exports.getBitAllignedNumber = getBitAllignedNumber;
102
102
  /**
103
103
  * Read bit-aligned number start from buffer
104
104
  * Total offset in bits = byteOffset * 8 + bitOffset
105
- * @param buf Byte buffer
105
+ * @param source Byte Uint8Array
106
106
  * @param byteOffset Starting offset in bytes
107
- * @param bitOffset Starting offset in bits: 0 = most significant bit, 7 is least significant bit
108
- * @return {number} decoded bit aligned number
107
+ * @param bitOffset Starting offset in bits: 0 = most significant bit, 7 is the least significant bit
108
+ * @return True if bit is set
109
109
  */
110
- function isBitSet(buf, byteOffset, bitOffset) {
111
- return getBitAllignedNumber(buf, byteOffset, bitOffset, 1) === 1;
110
+ function isBitSet(source, byteOffset, bitOffset) {
111
+ return getBitAllignedNumber(source, byteOffset, bitOffset, 1) === 1;
112
112
  }
113
113
  exports.isBitSet = isBitSet;
114
114
  function a2hex(str) {
@@ -1,4 +1,3 @@
1
- /// <reference types="node" />
2
1
  import { ID3v2MajorVersion } from './ID3v2Token';
3
2
  import { IWarningCollector } from '../common/MetadataCollector';
4
3
  export declare function parseGenre(origVal: string): string[];
@@ -11,7 +10,7 @@ export declare class FrameParser {
11
10
  * @param warningCollector - Used to collect decode issue
12
11
  */
13
12
  constructor(major: ID3v2MajorVersion, warningCollector: IWarningCollector);
14
- readData(b: Buffer, type: string, includeCovers: boolean): any;
13
+ readData(uint8Array: Uint8Array, type: string, includeCovers: boolean): any;
15
14
  protected static fixPictureMimeType(pictureType: string): string;
16
15
  /**
17
16
  * Converts TMCL (Musician credits list) or TIPL (Involved people list)
@@ -68,13 +68,13 @@ class FrameParser {
68
68
  this.major = major;
69
69
  this.warningCollector = warningCollector;
70
70
  }
71
- readData(b, type, includeCovers) {
72
- if (b.length === 0) {
71
+ readData(uint8Array, type, includeCovers) {
72
+ if (uint8Array.length === 0) {
73
73
  this.warningCollector.addWarning(`id3v2.${this.major} header has empty tag type=${type}`);
74
74
  return;
75
75
  }
76
- const { encoding, bom } = ID3v2Token_1.TextEncodingToken.get(b, 0);
77
- const length = b.length;
76
+ const { encoding, bom } = ID3v2Token_1.TextEncodingToken.get(uint8Array, 0);
77
+ const length = uint8Array.length;
78
78
  let offset = 0;
79
79
  let output = []; // ToDo
80
80
  const nullTerminatorLength = FrameParser.getNullTerminatorLength(encoding);
@@ -90,7 +90,7 @@ class FrameParser {
90
90
  case 'PCST':
91
91
  let text;
92
92
  try {
93
- text = util.decodeString(b.subarray(1), encoding).replace(/\x00+$/, '');
93
+ text = util.decodeString(uint8Array.slice(1), encoding).replace(/\x00+$/, '');
94
94
  }
95
95
  catch (error) {
96
96
  this.warningCollector.addWarning(`id3v2.${this.major} type=${type} header has invalid string value: ${error.message}`);
@@ -131,7 +131,7 @@ class FrameParser {
131
131
  }
132
132
  break;
133
133
  case 'TXXX':
134
- output = FrameParser.readIdentifierAndData(b, offset + 1, length, encoding);
134
+ output = FrameParser.readIdentifierAndData(uint8Array, offset + 1, length, encoding);
135
135
  output = {
136
136
  description: output.id,
137
137
  text: this.splitValue(type, util.decodeString(output.data, encoding).replace(/\x00+$/, ''))
@@ -144,31 +144,31 @@ class FrameParser {
144
144
  offset += 1;
145
145
  switch (this.major) {
146
146
  case 2:
147
- pic.format = util.decodeString(b.slice(offset, offset + 3), 'latin1'); // 'latin1'; // latin1 == iso-8859-1;
147
+ pic.format = util.decodeString(uint8Array.slice(offset, offset + 3), 'latin1'); // 'latin1'; // latin1 == iso-8859-1;
148
148
  offset += 3;
149
149
  break;
150
150
  case 3:
151
151
  case 4:
152
- fzero = util.findZero(b, offset, length, defaultEnc);
153
- pic.format = util.decodeString(b.slice(offset, fzero), defaultEnc);
152
+ fzero = util.findZero(uint8Array, offset, length, defaultEnc);
153
+ pic.format = util.decodeString(uint8Array.slice(offset, fzero), defaultEnc);
154
154
  offset = fzero + 1;
155
155
  break;
156
156
  default:
157
157
  throw new Error('Warning: unexpected major versionIndex: ' + this.major);
158
158
  }
159
159
  pic.format = FrameParser.fixPictureMimeType(pic.format);
160
- pic.type = ID3v2Token_1.AttachedPictureType[b[offset]];
160
+ pic.type = ID3v2Token_1.AttachedPictureType[uint8Array[offset]];
161
161
  offset += 1;
162
- fzero = util.findZero(b, offset, length, encoding);
163
- pic.description = util.decodeString(b.slice(offset, fzero), encoding);
162
+ fzero = util.findZero(uint8Array, offset, length, encoding);
163
+ pic.description = util.decodeString(uint8Array.slice(offset, fzero), encoding);
164
164
  offset = fzero + nullTerminatorLength;
165
- pic.data = Buffer.from(b.slice(offset, length));
165
+ pic.data = Buffer.from(uint8Array.slice(offset, length));
166
166
  output = pic;
167
167
  }
168
168
  break;
169
169
  case 'CNT':
170
170
  case 'PCNT':
171
- output = Token.UINT32_BE.get(b, 0);
171
+ output = Token.UINT32_BE.get(uint8Array, 0);
172
172
  break;
173
173
  case 'SYLT':
174
174
  // skip text encoding (1 byte),
@@ -179,7 +179,7 @@ class FrameParser {
179
179
  offset += 7;
180
180
  output = [];
181
181
  while (offset < length) {
182
- const txt = b.slice(offset, offset = util.findZero(b, offset, length, encoding));
182
+ const txt = uint8Array.slice(offset, offset = util.findZero(uint8Array, offset, length, encoding));
183
183
  offset += 5; // push offset forward one + 4 byte timestamp
184
184
  output.push(util.decodeString(txt, encoding));
185
185
  }
@@ -189,47 +189,47 @@ class FrameParser {
189
189
  case 'COM':
190
190
  case 'COMM':
191
191
  offset += 1;
192
- out.language = util.decodeString(b.slice(offset, offset + 3), defaultEnc);
192
+ out.language = util.decodeString(uint8Array.slice(offset, offset + 3), defaultEnc);
193
193
  offset += 3;
194
- fzero = util.findZero(b, offset, length, encoding);
195
- out.description = util.decodeString(b.slice(offset, fzero), encoding);
194
+ fzero = util.findZero(uint8Array, offset, length, encoding);
195
+ out.description = util.decodeString(uint8Array.slice(offset, fzero), encoding);
196
196
  offset = fzero + nullTerminatorLength;
197
- out.text = util.decodeString(b.slice(offset, length), encoding).replace(/\x00+$/, '');
197
+ out.text = util.decodeString(uint8Array.slice(offset, length), encoding).replace(/\x00+$/, '');
198
198
  output = [out];
199
199
  break;
200
200
  case 'UFID':
201
- output = FrameParser.readIdentifierAndData(b, offset, length, defaultEnc);
201
+ output = FrameParser.readIdentifierAndData(uint8Array, offset, length, defaultEnc);
202
202
  output = { owner_identifier: output.id, identifier: output.data };
203
203
  break;
204
204
  case 'PRIV': // private frame
205
- output = FrameParser.readIdentifierAndData(b, offset, length, defaultEnc);
205
+ output = FrameParser.readIdentifierAndData(uint8Array, offset, length, defaultEnc);
206
206
  output = { owner_identifier: output.id, data: output.data };
207
207
  break;
208
208
  case 'POPM': // Popularimeter
209
- fzero = util.findZero(b, offset, length, defaultEnc);
210
- const email = util.decodeString(b.slice(offset, fzero), defaultEnc);
209
+ fzero = util.findZero(uint8Array, offset, length, defaultEnc);
210
+ const email = util.decodeString(uint8Array.slice(offset, fzero), defaultEnc);
211
211
  offset = fzero + 1;
212
212
  const dataLen = length - offset;
213
213
  output = {
214
214
  email,
215
- rating: b.readUInt8(offset),
216
- counter: dataLen >= 5 ? b.readUInt32BE(offset + 1) : undefined
215
+ rating: Token.UINT8.get(uint8Array, offset),
216
+ counter: dataLen >= 5 ? Token.UINT32_BE.get(uint8Array, offset + 1) : undefined
217
217
  };
218
218
  break;
219
219
  case 'GEOB': { // General encapsulated object
220
- fzero = util.findZero(b, offset + 1, length, encoding);
221
- const mimeType = util.decodeString(b.slice(offset + 1, fzero), defaultEnc);
220
+ fzero = util.findZero(uint8Array, offset + 1, length, encoding);
221
+ const mimeType = util.decodeString(uint8Array.slice(offset + 1, fzero), defaultEnc);
222
222
  offset = fzero + 1;
223
- fzero = util.findZero(b, offset, length - offset, encoding);
224
- const filename = util.decodeString(b.slice(offset, fzero), defaultEnc);
223
+ fzero = util.findZero(uint8Array, offset, length - offset, encoding);
224
+ const filename = util.decodeString(uint8Array.slice(offset, fzero), defaultEnc);
225
225
  offset = fzero + 1;
226
- fzero = util.findZero(b, offset, length - offset, encoding);
227
- const description = util.decodeString(b.slice(offset, fzero), defaultEnc);
226
+ fzero = util.findZero(uint8Array, offset, length - offset, encoding);
227
+ const description = util.decodeString(uint8Array.slice(offset, fzero), defaultEnc);
228
228
  output = {
229
229
  type: mimeType,
230
230
  filename,
231
231
  description,
232
- data: b.slice(offset + 1, length)
232
+ data: uint8Array.slice(offset + 1, length)
233
233
  };
234
234
  break;
235
235
  }
@@ -243,23 +243,23 @@ class FrameParser {
243
243
  case 'WPAY':
244
244
  case 'WPUB':
245
245
  // Decode URL
246
- output = util.decodeString(b.slice(offset, fzero), defaultEnc);
246
+ output = util.decodeString(uint8Array.slice(offset, fzero), defaultEnc);
247
247
  break;
248
248
  case 'WXXX': {
249
249
  // Decode URL
250
- fzero = util.findZero(b, offset + 1, length, encoding);
251
- const description = util.decodeString(b.slice(offset + 1, fzero), encoding);
250
+ fzero = util.findZero(uint8Array, offset + 1, length, encoding);
251
+ const description = util.decodeString(uint8Array.slice(offset + 1, fzero), encoding);
252
252
  offset = fzero + (encoding === 'utf16le' ? 2 : 1);
253
- output = { description, url: util.decodeString(b.slice(offset, length), defaultEnc) };
253
+ output = { description, url: util.decodeString(uint8Array.slice(offset, length), defaultEnc) };
254
254
  break;
255
255
  }
256
256
  case 'WFD':
257
257
  case 'WFED':
258
- output = util.decodeString(b.slice(offset + 1, util.findZero(b, offset + 1, length, encoding)), encoding);
258
+ output = util.decodeString(uint8Array.slice(offset + 1, util.findZero(uint8Array, offset + 1, length, encoding)), encoding);
259
259
  break;
260
260
  case 'MCDI': {
261
261
  // Music CD identifier
262
- output = b.slice(0, length);
262
+ output = uint8Array.slice(0, length);
263
263
  break;
264
264
  }
265
265
  default:
@@ -316,11 +316,11 @@ class FrameParser {
316
316
  static trimArray(values) {
317
317
  return values.map(value => value.replace(/\x00+$/, '').trim());
318
318
  }
319
- static readIdentifierAndData(b, offset, length, encoding) {
320
- const fzero = util.findZero(b, offset, length, encoding);
321
- const id = util.decodeString(b.slice(offset, fzero), encoding);
319
+ static readIdentifierAndData(uint8Array, offset, length, encoding) {
320
+ const fzero = util.findZero(uint8Array, offset, length, encoding);
321
+ const id = util.decodeString(uint8Array.slice(offset, fzero), encoding);
322
322
  offset = fzero + FrameParser.getNullTerminatorLength(encoding);
323
- return { id, data: b.slice(offset, length) };
323
+ return { id, data: uint8Array.slice(offset, length) };
324
324
  }
325
325
  static getNullTerminatorLength(enc) {
326
326
  return enc === 'utf16le' ? 2 : 1;
@@ -1,9 +1,8 @@
1
- /// <reference types="node" />
2
1
  import { ITokenizer } from 'strtok3/lib/core';
3
2
  import { IOptions } from '../type';
4
3
  import { INativeMetadataCollector } from '../common/MetadataCollector';
5
4
  export declare class ID3v2Parser {
6
- static removeUnsyncBytes(buffer: Buffer): Buffer;
5
+ static removeUnsyncBytes(buffer: Uint8Array): Uint8Array;
7
6
  private static getFrameHeaderLength;
8
7
  private static readFrameFlags;
9
8
  private static readFrameData;
@@ -48,20 +48,20 @@ class ID3v2Parser {
48
48
  }
49
49
  };
50
50
  }
51
- static readFrameData(buf, frameHeader, majorVer, includeCovers, warningCollector) {
51
+ static readFrameData(uint8Array, frameHeader, majorVer, includeCovers, warningCollector) {
52
52
  const frameParser = new FrameParser_1.FrameParser(majorVer, warningCollector);
53
53
  switch (majorVer) {
54
54
  case 2:
55
- return frameParser.readData(buf, frameHeader.id, includeCovers);
55
+ return frameParser.readData(uint8Array, frameHeader.id, includeCovers);
56
56
  case 3:
57
57
  case 4:
58
58
  if (frameHeader.flags.format.unsynchronisation) {
59
- buf = ID3v2Parser.removeUnsyncBytes(buf);
59
+ uint8Array = ID3v2Parser.removeUnsyncBytes(uint8Array);
60
60
  }
61
61
  if (frameHeader.flags.format.data_length_indicator) {
62
- buf = buf.slice(4, buf.length);
62
+ uint8Array = uint8Array.slice(4, uint8Array.length);
63
63
  }
64
- return frameParser.readData(buf, frameHeader.id, includeCovers);
64
+ return frameParser.readData(uint8Array, frameHeader.id, includeCovers);
65
65
  default:
66
66
  throw new Error('Unexpected majorVer: ' + majorVer);
67
67
  }
@@ -93,14 +93,12 @@ class ID3v2Parser {
93
93
  return dataRemaining > 0 ? this.parseExtendedHeaderData(dataRemaining, extendedHeader.size) : this.parseId3Data(this.id3Header.size - extendedHeader.size);
94
94
  }
95
95
  async parseExtendedHeaderData(dataRemaining, extendedHeaderSize) {
96
- const buffer = Buffer.alloc(dataRemaining);
97
- await this.tokenizer.readBuffer(buffer, { length: dataRemaining });
96
+ await this.tokenizer.ignore(dataRemaining);
98
97
  return this.parseId3Data(this.id3Header.size - extendedHeaderSize);
99
98
  }
100
99
  async parseId3Data(dataLen) {
101
- const buffer = Buffer.alloc(dataLen);
102
- await this.tokenizer.readBuffer(buffer, { length: dataLen });
103
- for (const tag of this.parseMetadata(buffer)) {
100
+ const uint8Array = await this.tokenizer.readToken(new Token.Uint8ArrayType(dataLen));
101
+ for (const tag of this.parseMetadata(uint8Array)) {
104
102
  if (tag.id === 'TXXX') {
105
103
  if (tag.value) {
106
104
  for (const text of tag.value.text) {
@@ -152,13 +150,13 @@ class ID3v2Parser {
152
150
  }
153
151
  return tags;
154
152
  }
155
- readFrameHeader(v, majorVer) {
153
+ readFrameHeader(uint8Array, majorVer) {
156
154
  let header;
157
155
  switch (majorVer) {
158
156
  case 2:
159
157
  header = {
160
- id: v.toString('ascii', 0, 3),
161
- length: Token.UINT24_BE.get(v, 3)
158
+ id: Buffer.from(uint8Array.slice(0, 3)).toString('ascii'),
159
+ length: Token.UINT24_BE.get(uint8Array, 3)
162
160
  };
163
161
  if (!header.id.match(/[A-Z0-9]{3}/g)) {
164
162
  this.metadata.addWarning(`Invalid ID3v2.${this.id3Header.version.major} frame-header-ID: ${header.id}`);
@@ -167,9 +165,9 @@ class ID3v2Parser {
167
165
  case 3:
168
166
  case 4:
169
167
  header = {
170
- id: v.toString('ascii', 0, 4),
171
- length: (majorVer === 4 ? ID3v2Token_1.UINT32SYNCSAFE : Token.UINT32_BE).get(v, 4),
172
- flags: ID3v2Parser.readFrameFlags(v.slice(8, 10))
168
+ id: Buffer.from(uint8Array.slice(0, 4)).toString('ascii'),
169
+ length: (majorVer === 4 ? ID3v2Token_1.UINT32SYNCSAFE : Token.UINT32_BE).get(uint8Array, 4),
170
+ flags: ID3v2Parser.readFrameFlags(uint8Array.slice(8, 10))
173
171
  };
174
172
  if (!header.id.match(/[A-Z0-9]{4}/g)) {
175
173
  this.metadata.addWarning(`Invalid ID3v2.${this.id3Header.version.major} frame-header-ID: ${header.id}`);
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "music-metadata",
3
3
  "description": "Music metadata parser for Node.js, supporting virtual any audio and tag format.",
4
- "version": "7.12.0",
4
+ "version": "7.12.1",
5
5
  "author": {
6
6
  "name": "Borewit",
7
7
  "url": "https://github.com/Borewit"