@svta/cml-id3 0.19.0 → 0.21.0

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 (96) hide show
  1. package/README.md +17 -0
  2. package/dist/index.d.ts +221 -15
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +440 -13
  5. package/dist/index.js.map +1 -1
  6. package/package.json +4 -23
  7. package/NOTICE +0 -39
  8. package/dist/DecodedId3Frame.d.ts +0 -21
  9. package/dist/DecodedId3Frame.d.ts.map +0 -1
  10. package/dist/DecodedId3Frame.js +0 -2
  11. package/dist/DecodedId3Frame.js.map +0 -1
  12. package/dist/ID3_SCHEME_ID_URI.d.ts +0 -11
  13. package/dist/ID3_SCHEME_ID_URI.d.ts.map +0 -1
  14. package/dist/ID3_SCHEME_ID_URI.js +0 -11
  15. package/dist/ID3_SCHEME_ID_URI.js.map +0 -1
  16. package/dist/Id3Frame.d.ts +0 -9
  17. package/dist/Id3Frame.d.ts.map +0 -1
  18. package/dist/Id3Frame.js +0 -2
  19. package/dist/Id3Frame.js.map +0 -1
  20. package/dist/canParseId3.d.ts +0 -13
  21. package/dist/canParseId3.d.ts.map +0 -1
  22. package/dist/canParseId3.js +0 -18
  23. package/dist/canParseId3.js.map +0 -1
  24. package/dist/getId3Data.d.ts +0 -14
  25. package/dist/getId3Data.d.ts.map +0 -1
  26. package/dist/getId3Data.js +0 -35
  27. package/dist/getId3Data.js.map +0 -1
  28. package/dist/getId3Frames.d.ts +0 -13
  29. package/dist/getId3Frames.d.ts.map +0 -1
  30. package/dist/getId3Frames.js +0 -46
  31. package/dist/getId3Frames.js.map +0 -1
  32. package/dist/getId3Timestamp.d.ts +0 -12
  33. package/dist/getId3Timestamp.d.ts.map +0 -1
  34. package/dist/getId3Timestamp.js +0 -24
  35. package/dist/getId3Timestamp.js.map +0 -1
  36. package/dist/isId3TimestampFrame.d.ts +0 -13
  37. package/dist/isId3TimestampFrame.d.ts.map +0 -1
  38. package/dist/isId3TimestampFrame.js +0 -16
  39. package/dist/isId3TimestampFrame.js.map +0 -1
  40. package/dist/tsconfig.tsbuildinfo +0 -1
  41. package/dist/util/RawFrame.d.ts +0 -12
  42. package/dist/util/RawFrame.d.ts.map +0 -1
  43. package/dist/util/RawFrame.js +0 -2
  44. package/dist/util/RawFrame.js.map +0 -1
  45. package/dist/util/decodeId3Frame.d.ts +0 -14
  46. package/dist/util/decodeId3Frame.d.ts.map +0 -1
  47. package/dist/util/decodeId3Frame.js +0 -27
  48. package/dist/util/decodeId3Frame.js.map +0 -1
  49. package/dist/util/decodeId3ImageFrame.d.ts +0 -4
  50. package/dist/util/decodeId3ImageFrame.d.ts.map +0 -1
  51. package/dist/util/decodeId3ImageFrame.js +0 -46
  52. package/dist/util/decodeId3ImageFrame.js.map +0 -1
  53. package/dist/util/decodeId3PrivFrame.d.ts +0 -14
  54. package/dist/util/decodeId3PrivFrame.d.ts.map +0 -1
  55. package/dist/util/decodeId3PrivFrame.js +0 -23
  56. package/dist/util/decodeId3PrivFrame.js.map +0 -1
  57. package/dist/util/decodeId3TextFrame.d.ts +0 -14
  58. package/dist/util/decodeId3TextFrame.d.ts.map +0 -1
  59. package/dist/util/decodeId3TextFrame.js +0 -37
  60. package/dist/util/decodeId3TextFrame.js.map +0 -1
  61. package/dist/util/decodeId3UrlFrame.d.ts +0 -14
  62. package/dist/util/decodeId3UrlFrame.d.ts.map +0 -1
  63. package/dist/util/decodeId3UrlFrame.js +0 -35
  64. package/dist/util/decodeId3UrlFrame.js.map +0 -1
  65. package/dist/util/getId3FrameData.d.ts +0 -13
  66. package/dist/util/getId3FrameData.d.ts.map +0 -1
  67. package/dist/util/getId3FrameData.js +0 -24
  68. package/dist/util/getId3FrameData.js.map +0 -1
  69. package/dist/util/isId3Footer.d.ts +0 -13
  70. package/dist/util/isId3Footer.d.ts.map +0 -1
  71. package/dist/util/isId3Footer.js +0 -35
  72. package/dist/util/isId3Footer.js.map +0 -1
  73. package/dist/util/isId3Header.d.ts +0 -13
  74. package/dist/util/isId3Header.d.ts.map +0 -1
  75. package/dist/util/isId3Header.js +0 -45
  76. package/dist/util/isId3Header.js.map +0 -1
  77. package/dist/util/readId3Size.d.ts +0 -13
  78. package/dist/util/readId3Size.d.ts.map +0 -1
  79. package/dist/util/readId3Size.js +0 -20
  80. package/dist/util/readId3Size.js.map +0 -1
  81. package/dist/util/readId3Timestamp.d.ts +0 -13
  82. package/dist/util/readId3Timestamp.d.ts.map +0 -1
  83. package/dist/util/readId3Timestamp.js +0 -26
  84. package/dist/util/readId3Timestamp.js.map +0 -1
  85. package/dist/util/toArrayBuffer.d.ts +0 -4
  86. package/dist/util/toArrayBuffer.d.ts.map +0 -1
  87. package/dist/util/toArrayBuffer.js +0 -16
  88. package/dist/util/toArrayBuffer.js.map +0 -1
  89. package/dist/util/utf8.d.ts +0 -2
  90. package/dist/util/utf8.d.ts.map +0 -1
  91. package/dist/util/utf8.js +0 -31
  92. package/dist/util/utf8.js.map +0 -1
  93. package/dist/util/utf8ArrayToStr.d.ts +0 -12
  94. package/dist/util/utf8ArrayToStr.d.ts.map +0 -1
  95. package/dist/util/utf8ArrayToStr.js +0 -19
  96. package/dist/util/utf8ArrayToStr.js.map +0 -1
package/dist/index.js CHANGED
@@ -1,15 +1,442 @@
1
+ import { UTF_8, decodeText } from "@svta/cml-utils";
2
+
3
+ //#region src/util/isId3Header.ts
1
4
  /**
2
- * A collection of tools for working with ID3v2 tags.
3
- *
4
- * @see {@link https://mutagen-specs.readthedocs.io/en/latest/id3/id3v2.4.0-structure.html | ID3v2.4.0 Structure}
5
- * @see {@link https://mutagen-specs.readthedocs.io/en/latest/id3/id3v2.4.0-frames.html | ID3v2.4.0 Frames}
6
- *
7
- * @packageDocumentation
8
- */
9
- export * from './canParseId3.js';
10
- export * from './getId3Data.js';
11
- export * from './getId3Frames.js';
12
- export * from './getId3Timestamp.js';
13
- export * from './ID3_SCHEME_ID_URI.js';
14
- export * from './isId3TimestampFrame.js';
5
+ * Returns true if an ID3 header can be found at offset in data
6
+ *
7
+ * @param data - The data to search in
8
+ * @param offset - The offset at which to start searching
9
+ *
10
+ * @returns `true` if an ID3 header is found
11
+ *
12
+ * @internal
13
+ *
14
+ */
15
+ function isId3Header(data, offset) {
16
+ if (offset + 10 <= data.length) {
17
+ if (data[offset] === 73 && data[offset + 1] === 68 && data[offset + 2] === 51) {
18
+ if (data[offset + 3] < 255 && data[offset + 4] < 255) {
19
+ if (data[offset + 6] < 128 && data[offset + 7] < 128 && data[offset + 8] < 128 && data[offset + 9] < 128) return true;
20
+ }
21
+ }
22
+ }
23
+ return false;
24
+ }
25
+
26
+ //#endregion
27
+ //#region src/util/readId3Size.ts
28
+ /**
29
+ * Read ID3 size
30
+ *
31
+ * @param data - The data to read from
32
+ * @param offset - The offset at which to start reading
33
+ *
34
+ * @returns The size
35
+ *
36
+ * @internal
37
+ *
38
+ */
39
+ function readId3Size(data, offset) {
40
+ let size = 0;
41
+ size = (data[offset] & 127) << 21;
42
+ size |= (data[offset + 1] & 127) << 14;
43
+ size |= (data[offset + 2] & 127) << 7;
44
+ size |= data[offset + 3] & 127;
45
+ return size;
46
+ }
47
+
48
+ //#endregion
49
+ //#region src/canParseId3.ts
50
+ /**
51
+ * Checks if the given data contains an ID3 tag.
52
+ *
53
+ * @param data - The data to check
54
+ * @param offset - The offset at which to start checking
55
+ *
56
+ * @returns `true` if an ID3 tag is found
57
+ *
58
+ *
59
+ * @beta
60
+ */
61
+ function canParseId3(data, offset) {
62
+ return isId3Header(data, offset) && readId3Size(data, offset + 6) + 10 <= data.length - offset;
63
+ }
64
+
65
+ //#endregion
66
+ //#region src/util/isId3Footer.ts
67
+ /**
68
+ * Returns true if an ID3 footer can be found at offset in data
69
+ *
70
+ * @param data - The data to search in
71
+ * @param offset - The offset at which to start searching
72
+ *
73
+ * @returns `true` if an ID3 footer is found
74
+ *
75
+ * @internal
76
+ *
77
+ */
78
+ function isId3Footer(data, offset) {
79
+ if (offset + 10 <= data.length) {
80
+ if (data[offset] === 51 && data[offset + 1] === 68 && data[offset + 2] === 73) {
81
+ if (data[offset + 3] < 255 && data[offset + 4] < 255) {
82
+ if (data[offset + 6] < 128 && data[offset + 7] < 128 && data[offset + 8] < 128 && data[offset + 9] < 128) return true;
83
+ }
84
+ }
85
+ }
86
+ return false;
87
+ }
88
+
89
+ //#endregion
90
+ //#region src/getId3Data.ts
91
+ /**
92
+ * Returns any adjacent ID3 tags found in data starting at offset, as one block of data
93
+ *
94
+ * @param data - The data to search in
95
+ * @param offset - The offset at which to start searching
96
+ *
97
+ * @returns The block of data containing any ID3 tags found
98
+ * or `undefined` if no header is found at the starting offset
99
+ *
100
+ * @internal
101
+ *
102
+ */
103
+ function getId3Data(data, offset) {
104
+ const front = offset;
105
+ let length = 0;
106
+ while (isId3Header(data, offset)) {
107
+ length += 10;
108
+ const size = readId3Size(data, offset + 6);
109
+ length += size;
110
+ if (isId3Footer(data, offset + 10)) length += 10;
111
+ offset += length;
112
+ }
113
+ if (length > 0) return data.subarray(front, front + length);
114
+ }
115
+
116
+ //#endregion
117
+ //#region src/util/toArrayBuffer.ts
118
+ /**
119
+ * @internal
120
+ */
121
+ function toArrayBuffer(view$1) {
122
+ if (view$1 instanceof ArrayBuffer) return view$1;
123
+ else {
124
+ if (view$1.byteOffset == 0 && view$1.byteLength == view$1.buffer.byteLength) return view$1.buffer;
125
+ return new Uint8Array(view$1).buffer;
126
+ }
127
+ }
128
+
129
+ //#endregion
130
+ //#region src/util/utf8.ts
131
+ /**
132
+ * @internal
133
+ */
134
+ function toUint8(data, offset = 0, length = Infinity) {
135
+ return view(data, offset, length, Uint8Array);
136
+ }
137
+ function view(data, offset, length, Type) {
138
+ const buffer = unsafeGetArrayBuffer(data);
139
+ let bytesPerElement = 1;
140
+ if ("BYTES_PER_ELEMENT" in Type) bytesPerElement = Type.BYTES_PER_ELEMENT;
141
+ const dataOffset = isArrayBufferView(data) ? data.byteOffset : 0;
142
+ const dataEnd = (dataOffset + data.byteLength) / bytesPerElement;
143
+ const rawStart = (dataOffset + offset) / bytesPerElement;
144
+ const start = Math.floor(Math.max(0, Math.min(rawStart, dataEnd)));
145
+ return new Type(buffer, start, Math.floor(Math.min(start + Math.max(length, 0), dataEnd)) - start);
146
+ }
147
+ function unsafeGetArrayBuffer(view$1) {
148
+ if (view$1 instanceof ArrayBuffer) return view$1;
149
+ else return view$1.buffer;
150
+ }
151
+ function isArrayBufferView(obj) {
152
+ return obj && obj.buffer instanceof ArrayBuffer && obj.byteLength !== void 0 && obj.byteOffset !== void 0;
153
+ }
154
+
155
+ //#endregion
156
+ //#region src/util/utf8ArrayToStr.ts
157
+ /**
158
+ * Converts a UTF-8 array to a string.
159
+ *
160
+ * @param array - The UTF-8 array to convert
161
+ * @param exitOnNull - Whether to exit on the first null byte
162
+ *
163
+ * @returns The string
164
+ *
165
+ * @internal
166
+ */
167
+ function utf8ArrayToStr(array, exitOnNull = false) {
168
+ const byteLength = exitOnNull ? array.indexOf(0) : array.length;
169
+ const result = decodeText(new DataView(array.buffer, array.byteOffset, byteLength), { encoding: UTF_8 });
170
+ return exitOnNull ? result : result.replace(/\0/g, "");
171
+ }
172
+
173
+ //#endregion
174
+ //#region src/util/decodeId3ImageFrame.ts
175
+ function decodeId3ImageFrame(frame) {
176
+ const metadataFrame = {
177
+ key: frame.type,
178
+ description: "",
179
+ data: "",
180
+ mimeType: null,
181
+ pictureType: null
182
+ };
183
+ const utf8Encoding = 3;
184
+ if (frame.size < 2) return;
185
+ if (frame.data[0] !== utf8Encoding) {
186
+ console.log("Ignore frame with unrecognized character encoding");
187
+ return;
188
+ }
189
+ const mimeTypeEndIndex = frame.data.subarray(1).indexOf(0);
190
+ if (mimeTypeEndIndex === -1) return;
191
+ const mimeType = utf8ArrayToStr(toUint8(frame.data, 1, mimeTypeEndIndex));
192
+ const pictureType = frame.data[2 + mimeTypeEndIndex];
193
+ const descriptionEndIndex = frame.data.subarray(3 + mimeTypeEndIndex).indexOf(0);
194
+ if (descriptionEndIndex === -1) return;
195
+ const description = utf8ArrayToStr(toUint8(frame.data, 3 + mimeTypeEndIndex, descriptionEndIndex));
196
+ let data;
197
+ if (mimeType === "-->") data = utf8ArrayToStr(toUint8(frame.data, 4 + mimeTypeEndIndex + descriptionEndIndex));
198
+ else data = toArrayBuffer(frame.data.subarray(4 + mimeTypeEndIndex + descriptionEndIndex));
199
+ metadataFrame.mimeType = mimeType;
200
+ metadataFrame.pictureType = pictureType;
201
+ metadataFrame.description = description;
202
+ metadataFrame.data = data;
203
+ return metadataFrame;
204
+ }
205
+
206
+ //#endregion
207
+ //#region src/util/decodeId3PrivFrame.ts
208
+ /**
209
+ * Decode an ID3 PRIV frame.
210
+ *
211
+ * @param frame - the ID3 PRIV frame
212
+ *
213
+ * @returns The decoded ID3 PRIV frame
214
+ *
215
+ * @internal
216
+ *
217
+ */
218
+ function decodeId3PrivFrame(frame) {
219
+ if (frame.size < 2) return;
220
+ const owner = utf8ArrayToStr(frame.data, true);
221
+ const privateData = new Uint8Array(frame.data.subarray(owner.length + 1));
222
+ return {
223
+ key: frame.type,
224
+ info: owner,
225
+ data: privateData.buffer
226
+ };
227
+ }
228
+
229
+ //#endregion
230
+ //#region src/util/decodeId3TextFrame.ts
231
+ /**
232
+ * Decodes an ID3 text frame
233
+ *
234
+ * @param frame - the ID3 text frame
235
+ *
236
+ * @returns The decoded ID3 text frame
237
+ *
238
+ * @internal
239
+ *
240
+ */
241
+ function decodeId3TextFrame(frame) {
242
+ if (frame.size < 2) return;
243
+ if (frame.type === "TXXX") {
244
+ let index = 1;
245
+ const { data } = frame;
246
+ const description = utf8ArrayToStr(data.subarray(index), true);
247
+ index += description.length + 1;
248
+ const value = utf8ArrayToStr(data.subarray(index));
249
+ return {
250
+ key: frame.type,
251
+ info: description,
252
+ data: value
253
+ };
254
+ }
255
+ const text = utf8ArrayToStr(frame.data.subarray(1));
256
+ return {
257
+ key: frame.type,
258
+ info: "",
259
+ data: text
260
+ };
261
+ }
262
+
263
+ //#endregion
264
+ //#region src/util/decodeId3UrlFrame.ts
265
+ /**
266
+ * Decode a URL frame
267
+ *
268
+ * @param frame - the ID3 URL frame
269
+ *
270
+ * @returns The decoded ID3 URL frame
271
+ *
272
+ * @internal
273
+ *
274
+ */
275
+ function decodeId3UrlFrame(frame) {
276
+ if (frame.type === "WXXX") {
277
+ if (frame.size < 2) return;
278
+ let index = 1;
279
+ const description = utf8ArrayToStr(frame.data.subarray(index), true);
280
+ index += description.length + 1;
281
+ const value = utf8ArrayToStr(frame.data.subarray(index));
282
+ return {
283
+ key: frame.type,
284
+ info: description,
285
+ data: value
286
+ };
287
+ }
288
+ const url = utf8ArrayToStr(frame.data);
289
+ return {
290
+ key: frame.type,
291
+ info: "",
292
+ data: url
293
+ };
294
+ }
295
+
296
+ //#endregion
297
+ //#region src/util/decodeId3Frame.ts
298
+ /**
299
+ * Decode an ID3 frame.
300
+ *
301
+ * @param frame - the ID3 frame
302
+ *
303
+ * @returns The decoded ID3 frame
304
+ *
305
+ * @internal
306
+ *
307
+ */
308
+ function decodeId3Frame(frame) {
309
+ if (frame.type === "PRIV") return decodeId3PrivFrame(frame);
310
+ else if (frame.type[0] === "W") return decodeId3UrlFrame(frame);
311
+ else if (frame.type === "APIC") return decodeId3ImageFrame(frame);
312
+ return decodeId3TextFrame(frame);
313
+ }
314
+
315
+ //#endregion
316
+ //#region src/util/getId3FrameData.ts
317
+ /**
318
+ * Returns the data of an ID3 frame.
319
+ *
320
+ * @param data - The data to read from
321
+ *
322
+ * @returns The data of the ID3 frame
323
+ *
324
+ * @internal
325
+ *
326
+ */
327
+ function getId3FrameData(data) {
328
+ const type = String.fromCharCode(data[0], data[1], data[2], data[3]);
329
+ const size = readId3Size(data, 4);
330
+ const offset = 10;
331
+ return {
332
+ type,
333
+ size,
334
+ data: data.subarray(offset, offset + size)
335
+ };
336
+ }
337
+
338
+ //#endregion
339
+ //#region src/getId3Frames.ts
340
+ const HEADER_FOOTER_SIZE = 10;
341
+ const FRAME_SIZE = 10;
342
+ /**
343
+ * Returns an array of ID3 frames found in all the ID3 tags in the id3Data
344
+ *
345
+ * @param id3Data - The ID3 data containing one or more ID3 tags
346
+ *
347
+ * @returns Array of ID3 frame objects
348
+ *
349
+ *
350
+ * @beta
351
+ */
352
+ function getId3Frames(id3Data) {
353
+ let offset = 0;
354
+ const frames = [];
355
+ while (isId3Header(id3Data, offset)) {
356
+ const size = readId3Size(id3Data, offset + 6);
357
+ if (id3Data[offset + 5] >> 6 & 1) offset += HEADER_FOOTER_SIZE;
358
+ offset += HEADER_FOOTER_SIZE;
359
+ const end = offset + size;
360
+ while (offset + FRAME_SIZE < end) {
361
+ const frameData = getId3FrameData(id3Data.subarray(offset));
362
+ const frame = decodeId3Frame(frameData);
363
+ if (frame) frames.push(frame);
364
+ offset += frameData.size + HEADER_FOOTER_SIZE;
365
+ }
366
+ if (isId3Footer(id3Data, offset)) offset += HEADER_FOOTER_SIZE;
367
+ }
368
+ return frames;
369
+ }
370
+
371
+ //#endregion
372
+ //#region src/isId3TimestampFrame.ts
373
+ /**
374
+ * Returns true if the ID3 frame is an Elementary Stream timestamp frame
375
+ *
376
+ * @param frame - the ID3 frame
377
+ *
378
+ * @returns `true` if the ID3 frame is an Elementary Stream timestamp frame
379
+ *
380
+ * @internal
381
+ *
382
+ */
383
+ function isId3TimestampFrame(frame) {
384
+ return frame && frame.key === "PRIV" && frame.info === "com.apple.streaming.transportStreamTimestamp";
385
+ }
386
+
387
+ //#endregion
388
+ //#region src/util/readId3Timestamp.ts
389
+ /**
390
+ * Read a 33 bit timestamp from an ID3 frame.
391
+ *
392
+ * @param timeStampFrame - the ID3 frame
393
+ *
394
+ * @returns The timestamp
395
+ *
396
+ * @internal
397
+ *
398
+ */
399
+ function readId3Timestamp(timeStampFrame) {
400
+ if (timeStampFrame.data.byteLength === 8) {
401
+ const data = new Uint8Array(timeStampFrame.data);
402
+ const pts33Bit = data[3] & 1;
403
+ let timestamp = (data[4] << 23) + (data[5] << 15) + (data[6] << 7) + data[7];
404
+ timestamp /= 45;
405
+ if (pts33Bit) timestamp += 47721858.84;
406
+ return Math.round(timestamp);
407
+ }
408
+ }
409
+
410
+ //#endregion
411
+ //#region src/getId3Timestamp.ts
412
+ /**
413
+ * Searches for the Elementary Stream timestamp found in the ID3 data chunk
414
+ *
415
+ * @param data - Block of data containing one or more ID3 tags
416
+ *
417
+ * @returns The timestamp
418
+ *
419
+ *
420
+ * @beta
421
+ */
422
+ function getId3Timestamp(data) {
423
+ const frames = getId3Frames(data);
424
+ for (const frame of frames) if (isId3TimestampFrame(frame)) return readId3Timestamp(frame);
425
+ }
426
+
427
+ //#endregion
428
+ //#region src/ID3_SCHEME_ID_URI.ts
429
+ /**
430
+ * The scheme ID URI for ID3 tags.
431
+ *
432
+ *
433
+ * @beta
434
+ *
435
+ * @see {@link https://aomediacodec.github.io/id3-emsg/ | Carriage of ID3 Timed Metadata in the Common Media Application Format (CMAF)}
436
+ * @see {@link https://developer.apple.com/documentation/http-live-streaming/about-the-common-media-application-format-with-http-live-streaming-hls#CMAF-Tracks-Segments-Headers-and-Fragments | CMAF Tracks, Segments, Headers, and Fragments}
437
+ */
438
+ const ID3_SCHEME_ID_URI = "https://aomedia.org/emsg/ID3";
439
+
440
+ //#endregion
441
+ export { ID3_SCHEME_ID_URI, canParseId3, decodeId3Frame, decodeId3TextFrame, getId3Data, getId3Frames, getId3Timestamp, isId3Footer, isId3Header, isId3TimestampFrame, readId3Size, toArrayBuffer, toUint8, utf8ArrayToStr };
15
442
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,cAAc,kBAAkB,CAAC;AAEjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AAEvC,cAAc,0BAA0B,CAAC","sourcesContent":["/**\n * A collection of tools for working with ID3v2 tags.\n *\n * @see {@link https://mutagen-specs.readthedocs.io/en/latest/id3/id3v2.4.0-structure.html | ID3v2.4.0 Structure}\n * @see {@link https://mutagen-specs.readthedocs.io/en/latest/id3/id3v2.4.0-frames.html | ID3v2.4.0 Frames}\n *\n * @packageDocumentation\n */\nexport * from './canParseId3.js';\nexport type * from './DecodedId3Frame.js';\nexport * from './getId3Data.js';\nexport * from './getId3Frames.js';\nexport * from './getId3Timestamp.js';\nexport * from './ID3_SCHEME_ID_URI.js';\nexport type * from './Id3Frame.js';\nexport * from './isId3TimestampFrame.js';\n"]}
1
+ {"version":3,"file":"index.js","names":["view","bytesPerElement: any","view","metadataFrame: MetadataFrame","description: string","value: string","url: string","type: string","size: number","frames: Id3Frame[]","frameData: RawId3Frame","frame: Id3Frame | undefined","frames: Id3Frame[]"],"sources":["../src/util/isId3Header.ts","../src/util/readId3Size.ts","../src/canParseId3.ts","../src/util/isId3Footer.ts","../src/getId3Data.ts","../src/util/toArrayBuffer.ts","../src/util/utf8.ts","../src/util/utf8ArrayToStr.ts","../src/util/decodeId3ImageFrame.ts","../src/util/decodeId3PrivFrame.ts","../src/util/decodeId3TextFrame.ts","../src/util/decodeId3UrlFrame.ts","../src/util/decodeId3Frame.ts","../src/util/getId3FrameData.ts","../src/getId3Frames.ts","../src/isId3TimestampFrame.ts","../src/util/readId3Timestamp.ts","../src/getId3Timestamp.ts","../src/ID3_SCHEME_ID_URI.ts"],"sourcesContent":["/**\n * Returns true if an ID3 header can be found at offset in data\n *\n * @param data - The data to search in\n * @param offset - The offset at which to start searching\n *\n * @returns `true` if an ID3 header is found\n *\n * @internal\n *\n */\nexport function isId3Header(data: Uint8Array, offset: number): boolean {\n\t/*\n\t * http://id3.org/id3v2.3.0\n\t * [0] = 'I'\n\t * [1] = 'D'\n\t * [2] = '3'\n\t * [3,4] = {Version}\n\t * [5] = {Flags}\n\t * [6-9] = {ID3 Size}\n\t *\n\t * An ID3v2 tag can be detected with the following pattern:\n\t * $49 44 33 yy yy xx zz zz zz zz\n\t * Where yy is less than $FF, xx is the 'flags' byte and zz is less than $80\n\t */\n\tif (offset + 10 <= data.length) {\n\t\t// look for 'ID3' identifier\n\t\tif (\n\t\t\tdata[offset] === 0x49 &&\n\t\t\tdata[offset + 1] === 0x44 &&\n\t\t\tdata[offset + 2] === 0x33\n\t\t) {\n\t\t\t// check version is within range\n\t\t\tif (data[offset + 3] < 0xff && data[offset + 4] < 0xff) {\n\t\t\t\t// check size is within range\n\t\t\t\tif (\n\t\t\t\t\tdata[offset + 6] < 0x80 &&\n\t\t\t\t\tdata[offset + 7] < 0x80 &&\n\t\t\t\t\tdata[offset + 8] < 0x80 &&\n\t\t\t\t\tdata[offset + 9] < 0x80\n\t\t\t\t) {\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn false\n}\n","/**\n * Read ID3 size\n *\n * @param data - The data to read from\n * @param offset - The offset at which to start reading\n *\n * @returns The size\n *\n * @internal\n *\n */\nexport function readId3Size(data: Uint8Array, offset: number): number {\n\tlet size = 0\n\tsize = (data[offset] & 0x7f) << 21\n\tsize |= (data[offset + 1] & 0x7f) << 14\n\tsize |= (data[offset + 2] & 0x7f) << 7\n\tsize |= data[offset + 3] & 0x7f\n\treturn size\n}\n","import { isId3Header } from './util/isId3Header.ts'\nimport { readId3Size } from './util/readId3Size.ts'\n\n/**\n * Checks if the given data contains an ID3 tag.\n *\n * @param data - The data to check\n * @param offset - The offset at which to start checking\n *\n * @returns `true` if an ID3 tag is found\n *\n *\n * @beta\n */\nexport function canParseId3(data: Uint8Array, offset: number): boolean {\n\treturn (\n\t\tisId3Header(data, offset) &&\n\t\treadId3Size(data, offset + 6) + 10 <= data.length - offset\n\t)\n}\n","/**\n * Returns true if an ID3 footer can be found at offset in data\n *\n * @param data - The data to search in\n * @param offset - The offset at which to start searching\n *\n * @returns `true` if an ID3 footer is found\n *\n * @internal\n *\n */\nexport function isId3Footer(data: Uint8Array, offset: number): boolean {\n\t/*\n\t * The footer is a copy of the header, but with a different identifier\n\t */\n\tif (offset + 10 <= data.length) {\n\t\t// look for '3DI' identifier\n\t\tif (\n\t\t\tdata[offset] === 0x33 &&\n\t\t\tdata[offset + 1] === 0x44 &&\n\t\t\tdata[offset + 2] === 0x49\n\t\t) {\n\t\t\t// check version is within range\n\t\t\tif (data[offset + 3] < 0xff && data[offset + 4] < 0xff) {\n\t\t\t\t// check size is within range\n\t\t\t\tif (\n\t\t\t\t\tdata[offset + 6] < 0x80 &&\n\t\t\t\t\tdata[offset + 7] < 0x80 &&\n\t\t\t\t\tdata[offset + 8] < 0x80 &&\n\t\t\t\t\tdata[offset + 9] < 0x80\n\t\t\t\t) {\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn false\n}\n","import { isId3Footer } from './util/isId3Footer.ts'\nimport { isId3Header } from './util/isId3Header.ts'\nimport { readId3Size } from './util/readId3Size.ts'\n\n/**\n * Returns any adjacent ID3 tags found in data starting at offset, as one block of data\n *\n * @param data - The data to search in\n * @param offset - The offset at which to start searching\n *\n * @returns The block of data containing any ID3 tags found\n * or `undefined` if no header is found at the starting offset\n *\n * @internal\n *\n */\nexport function getId3Data(\n\tdata: Uint8Array,\n\toffset: number,\n): Uint8Array | undefined {\n\tconst front = offset\n\tlet length = 0\n\n\twhile (isId3Header(data, offset)) {\n\t\t// ID3 header is 10 bytes\n\t\tlength += 10\n\n\t\tconst size = readId3Size(data, offset + 6)\n\t\tlength += size\n\n\t\tif (isId3Footer(data, offset + 10)) {\n\t\t\t// ID3 footer is 10 bytes\n\t\t\tlength += 10\n\t\t}\n\n\t\toffset += length\n\t}\n\n\tif (length > 0) {\n\t\treturn data.subarray(front, front + length)\n\t}\n\n\treturn undefined\n}\n","/**\n * @internal\n */\nexport type TypedArray =\n\t| Int8Array\n\t| Uint8Array\n\t| Int16Array\n\t| Uint16Array\n\t| Int32Array\n\t| Uint32Array\n\t| Float32Array\n\t| Float64Array\n\t| Uint8ClampedArray;\n\n/**\n * @internal\n */\nexport function toArrayBuffer(view: ArrayBuffer | TypedArray): ArrayBuffer {\n\tif (view instanceof ArrayBuffer) {\n\t\treturn view\n\t}\n\telse {\n\t\tif (view.byteOffset == 0 && view.byteLength == view.buffer.byteLength) {\n\t\t\t// This is a TypedArray over the whole buffer.\n\t\t\treturn view.buffer as ArrayBuffer\n\t\t}\n\t\t// This is a 'view' on the buffer. Create a new buffer that only contains\n\t\t// the data. Note that since this isn't an ArrayBuffer, the 'new' call\n\t\t// will allocate a new buffer to hold the copy.\n\t\treturn new Uint8Array(view).buffer\n\t}\n}\n","/**\n * @internal\n */\nexport function toUint8(\n\tdata: BufferSource,\n\toffset: number = 0,\n\tlength: number = Infinity,\n): Uint8Array<ArrayBuffer> {\n\treturn view(data, offset, length, Uint8Array)\n}\n\nfunction view<T extends ArrayBufferView>(\n\tdata: BufferSource,\n\toffset: number,\n\tlength: number,\n\tType: new(buffer: ArrayBuffer, byteOffset: number, length: number) => T,\n): T {\n\tconst buffer = unsafeGetArrayBuffer(data)\n\tlet bytesPerElement: any = 1\n\tif ('BYTES_PER_ELEMENT' in Type) {\n\t\tbytesPerElement = Type.BYTES_PER_ELEMENT\n\t}\n\t// Absolute end of the |data| view within |buffer|.\n\tconst dataOffset = isArrayBufferView(data) ? data.byteOffset : 0\n\tconst dataEnd = ((dataOffset) + data.byteLength) / bytesPerElement\n\t// Absolute start of the result within |buffer|.\n\tconst rawStart = ((dataOffset) + offset) / bytesPerElement\n\tconst start = Math.floor(Math.max(0, Math.min(rawStart, dataEnd)))\n\t// Absolute end of the result within |buffer|.\n\tconst end = Math.floor(Math.min(start + Math.max(length, 0), dataEnd))\n\treturn new Type(buffer as ArrayBuffer, start, end - start)\n}\n\nfunction unsafeGetArrayBuffer(view: BufferSource) {\n\tif (view instanceof ArrayBuffer) {\n\t\treturn view\n\t}\n\telse {\n\t\treturn view.buffer\n\t}\n}\n\nfunction isArrayBufferView(obj: any): obj is ArrayBufferView {\n\treturn obj && obj.buffer instanceof ArrayBuffer && obj.byteLength !== undefined && obj.byteOffset !== undefined\n}\n","import { decodeText, UTF_8 } from '@svta/cml-utils'\n\n/**\n * Converts a UTF-8 array to a string.\n *\n * @param array - The UTF-8 array to convert\n * @param exitOnNull - Whether to exit on the first null byte\n *\n * @returns The string\n *\n * @internal\n */\nexport function utf8ArrayToStr(\n\tarray: Uint8Array<ArrayBuffer>,\n\texitOnNull: boolean = false,\n): string {\n\tconst byteLength = exitOnNull ? array.indexOf(0) : array.length\n\tconst view = new DataView<ArrayBuffer>(array.buffer, array.byteOffset, byteLength)\n\tconst result = decodeText(view, { encoding: UTF_8 })\n\n\treturn exitOnNull ? result : result.replace(/\\0/g, '')\n}\n","import type { DecodedId3Frame } from '../DecodedId3Frame.ts'\nimport type { RawId3Frame } from './RawFrame.ts'\nimport { toArrayBuffer } from './toArrayBuffer.ts'\nimport { toUint8 } from './utf8.ts'\nimport { utf8ArrayToStr } from './utf8ArrayToStr.ts'\n\ntype MetadataFrame = {\n\tkey: string;\n\tdescription: string;\n\tdata: string | ArrayBuffer;\n\tmimeType: string | null;\n\tpictureType: number | null;\n};\n\nexport function decodeId3ImageFrame(\n\tframe: RawId3Frame,\n): DecodedId3Frame<string | ArrayBuffer> | undefined {\n\tconst metadataFrame: MetadataFrame = {\n\t\tkey: frame.type,\n\t\tdescription: '',\n\t\tdata: '',\n\t\tmimeType: null,\n\t\tpictureType: null,\n\t}\n\n\tconst utf8Encoding = 0x03\n\n\tif (frame.size < 2) {\n\t\treturn undefined\n\t}\n\tif (frame.data[0] !== utf8Encoding) {\n\t\tconsole.log('Ignore frame with unrecognized character ' + 'encoding')\n\t\treturn undefined\n\t}\n\n\tconst mimeTypeEndIndex = frame.data.subarray(1).indexOf(0)\n\tif (mimeTypeEndIndex === -1) {\n\t\treturn undefined\n\t}\n\tconst mimeType = utf8ArrayToStr(toUint8(frame.data, 1, mimeTypeEndIndex))\n\tconst pictureType = frame.data[2 + mimeTypeEndIndex]\n\tconst descriptionEndIndex = frame.data\n\t\t.subarray(3 + mimeTypeEndIndex)\n\t\t.indexOf(0)\n\tif (descriptionEndIndex === -1) {\n\t\treturn undefined\n\t}\n\tconst description = utf8ArrayToStr(\n\t\ttoUint8(frame.data, 3 + mimeTypeEndIndex, descriptionEndIndex),\n\t)\n\n\tlet data\n\tif (mimeType === '-->') {\n\t\tdata = utf8ArrayToStr(\n\t\t\ttoUint8(frame.data, 4 + mimeTypeEndIndex + descriptionEndIndex),\n\t\t)\n\t}\n\telse {\n\t\tdata = toArrayBuffer(\n\t\t\tframe.data.subarray(4 + mimeTypeEndIndex + descriptionEndIndex),\n\t\t)\n\t}\n\n\tmetadataFrame.mimeType = mimeType\n\tmetadataFrame.pictureType = pictureType\n\tmetadataFrame.description = description\n\tmetadataFrame.data = data\n\treturn metadataFrame\n}\n","import type { DecodedId3Frame } from '../DecodedId3Frame.ts'\nimport type { RawId3Frame } from './RawFrame.ts'\nimport { utf8ArrayToStr } from './utf8ArrayToStr.ts'\n\n/**\n * Decode an ID3 PRIV frame.\n *\n * @param frame - the ID3 PRIV frame\n *\n * @returns The decoded ID3 PRIV frame\n *\n * @internal\n *\n */\nexport function decodeId3PrivFrame(\n\tframe: RawId3Frame,\n): DecodedId3Frame<ArrayBuffer> | undefined {\n\t/*\n\tFormat: <text string>\\0<binary data>\n\t*/\n\tif (frame.size < 2) {\n\t\treturn undefined\n\t}\n\n\tconst owner = utf8ArrayToStr(frame.data, true)\n\tconst privateData = new Uint8Array(frame.data.subarray(owner.length + 1))\n\n\treturn { key: frame.type, info: owner, data: privateData.buffer }\n}\n","import type { DecodedId3Frame } from '../DecodedId3Frame.ts'\nimport type { RawId3Frame } from './RawFrame.ts'\nimport { utf8ArrayToStr } from './utf8ArrayToStr.ts'\n\n/**\n * Decodes an ID3 text frame\n *\n * @param frame - the ID3 text frame\n *\n * @returns The decoded ID3 text frame\n *\n * @internal\n *\n */\nexport function decodeId3TextFrame(frame: RawId3Frame): DecodedId3Frame<string> | undefined {\n\tif (frame.size < 2) {\n\t\treturn undefined\n\t}\n\n\tif (frame.type === 'TXXX') {\n\t\t/*\n\t\tFormat:\n\t\t[0] = {Text Encoding}\n\t\t[1-?] = {Description}\\0{Value}\n\t\t*/\n\t\tlet index = 1\n\t\tconst { data } = frame\n\t\tconst description = utf8ArrayToStr(data.subarray(index), true)\n\n\t\tindex += description.length + 1\n\t\tconst value = utf8ArrayToStr(data.subarray(index))\n\n\t\treturn { key: frame.type, info: description, data: value }\n\t}\n\t/*\n\tFormat:\n\t[0] = {Text Encoding}\n\t[1-?] = {Value}\n\t*/\n\tconst text = utf8ArrayToStr(frame.data.subarray(1))\n\treturn { key: frame.type, info: '', data: text }\n}\n","import type { DecodedId3Frame } from '../DecodedId3Frame.ts'\nimport type { RawId3Frame } from './RawFrame.ts'\nimport { utf8ArrayToStr } from './utf8ArrayToStr.ts'\n\n/**\n * Decode a URL frame\n *\n * @param frame - the ID3 URL frame\n *\n * @returns The decoded ID3 URL frame\n *\n * @internal\n *\n */\nexport function decodeId3UrlFrame(frame: RawId3Frame): DecodedId3Frame<string> | undefined {\n\tif (frame.type === 'WXXX') {\n\t\t/*\n\t\tFormat:\n\t\t[0] = {Text Encoding}\n\t\t[1-?] = {Description}\\0{URL}\n\t\t*/\n\t\tif (frame.size < 2) {\n\t\t\treturn undefined\n\t\t}\n\n\t\tlet index = 1\n\t\tconst description: string = utf8ArrayToStr(\n\t\t\tframe.data.subarray(index),\n\t\t\ttrue,\n\t\t)\n\n\t\tindex += description.length + 1\n\t\tconst value: string = utf8ArrayToStr(frame.data.subarray(index))\n\n\t\treturn { key: frame.type, info: description, data: value }\n\t}\n\t/*\n\tFormat:\n\t[0-?] = {URL}\n\t*/\n\tconst url: string = utf8ArrayToStr(frame.data)\n\treturn { key: frame.type, info: '', data: url }\n}\n","import type { Id3Frame } from '../Id3Frame.ts'\nimport type { RawId3Frame } from './RawFrame.ts'\nimport { decodeId3ImageFrame } from './decodeId3ImageFrame.ts'\nimport { decodeId3PrivFrame } from './decodeId3PrivFrame.ts'\nimport { decodeId3TextFrame } from './decodeId3TextFrame.ts'\nimport { decodeId3UrlFrame } from './decodeId3UrlFrame.ts'\n\n/**\n * Decode an ID3 frame.\n *\n * @param frame - the ID3 frame\n *\n * @returns The decoded ID3 frame\n *\n * @internal\n *\n */\nexport function decodeId3Frame(frame: RawId3Frame): Id3Frame | undefined {\n\tif (frame.type === 'PRIV') {\n\t\treturn decodeId3PrivFrame(frame)\n\t}\n\telse if (frame.type[0] === 'W') {\n\t\treturn decodeId3UrlFrame(frame)\n\t}\n\n\telse if (frame.type === 'APIC') {\n\t\treturn decodeId3ImageFrame(frame)\n\t}\n\n\treturn decodeId3TextFrame(frame)\n}\n","import type { RawId3Frame } from './RawFrame.ts'\nimport { readId3Size } from './readId3Size.ts'\n\n/**\n * Returns the data of an ID3 frame.\n *\n * @param data - The data to read from\n *\n * @returns The data of the ID3 frame\n *\n * @internal\n *\n */\nexport function getId3FrameData(data: Uint8Array<ArrayBuffer>): RawId3Frame {\n\t/*\n\tFrame ID $xx xx xx xx (four characters)\n\tSize $xx xx xx xx\n\tFlags $xx xx\n\t*/\n\tconst type: string = String.fromCharCode(data[0], data[1], data[2], data[3])\n\tconst size: number = readId3Size(data, 4)\n\n\t// skip frame id, size, and flags\n\tconst offset = 10\n\n\treturn { type, size, data: data.subarray(offset, offset + size) }\n}\n","import type { Id3Frame } from './Id3Frame.ts'\nimport type { RawId3Frame } from './util/RawFrame.ts'\nimport { decodeId3Frame } from './util/decodeId3Frame.ts'\nimport { getId3FrameData } from './util/getId3FrameData.ts'\nimport { isId3Footer } from './util/isId3Footer.ts'\nimport { isId3Header } from './util/isId3Header.ts'\nimport { readId3Size } from './util/readId3Size.ts'\n\nconst HEADER_FOOTER_SIZE = 10\nconst FRAME_SIZE = 10\n\n/**\n * Returns an array of ID3 frames found in all the ID3 tags in the id3Data\n *\n * @param id3Data - The ID3 data containing one or more ID3 tags\n *\n * @returns Array of ID3 frame objects\n *\n *\n * @beta\n */\nexport function getId3Frames(id3Data: Uint8Array<ArrayBuffer>): Id3Frame[] {\n\tlet offset = 0\n\tconst frames: Id3Frame[] = []\n\n\twhile (isId3Header(id3Data, offset)) {\n\t\tconst size = readId3Size(id3Data, offset + 6)\n\n\t\tif ((id3Data[offset + 5] >> 6) & 1) {\n\t\t\t// skip extended header\n\t\t\toffset += HEADER_FOOTER_SIZE\n\t\t}\n\t\t// skip past ID3 header\n\t\toffset += HEADER_FOOTER_SIZE\n\t\tconst end = offset + size\n\t\t// loop through frames in the ID3 tag\n\t\twhile (offset + FRAME_SIZE < end) {\n\t\t\tconst frameData: RawId3Frame = getId3FrameData(id3Data.subarray(offset))\n\t\t\tconst frame: Id3Frame | undefined = decodeId3Frame(frameData)\n\t\t\tif (frame) {\n\t\t\t\tframes.push(frame)\n\t\t\t}\n\n\t\t\t// skip frame header and frame data\n\t\t\toffset += frameData.size + HEADER_FOOTER_SIZE\n\t\t}\n\n\t\tif (isId3Footer(id3Data, offset)) {\n\t\t\toffset += HEADER_FOOTER_SIZE\n\t\t}\n\t}\n\n\treturn frames\n}\n","import type { Id3Frame } from './Id3Frame.ts'\n\n/**\n * Returns true if the ID3 frame is an Elementary Stream timestamp frame\n *\n * @param frame - the ID3 frame\n *\n * @returns `true` if the ID3 frame is an Elementary Stream timestamp frame\n *\n * @internal\n *\n */\nexport function isId3TimestampFrame(frame: Id3Frame): boolean {\n\treturn (\n\t\tframe &&\n\t\tframe.key === 'PRIV' &&\n\t\tframe.info === 'com.apple.streaming.transportStreamTimestamp'\n\t)\n}\n","import type { DecodedId3Frame } from '../DecodedId3Frame.ts'\n\n/**\n * Read a 33 bit timestamp from an ID3 frame.\n *\n * @param timeStampFrame - the ID3 frame\n *\n * @returns The timestamp\n *\n * @internal\n *\n */\nexport function readId3Timestamp(\n\ttimeStampFrame: DecodedId3Frame<ArrayBuffer>,\n): number | undefined {\n\tif (timeStampFrame.data.byteLength === 8) {\n\t\tconst data = new Uint8Array(timeStampFrame.data)\n\t\t// timestamp is 33 bit expressed as a big-endian eight-octet number,\n\t\t// with the upper 31 bits set to zero.\n\t\tconst pts33Bit = data[3] & 0x1\n\t\tlet timestamp =\n\t\t\t(data[4] << 23) + (data[5] << 15) + (data[6] << 7) + data[7]\n\t\ttimestamp /= 45\n\n\t\tif (pts33Bit) {\n\t\t\ttimestamp += 47721858.84\n\t\t} // 2^32 / 90\n\n\t\treturn Math.round(timestamp)\n\t}\n\n\treturn undefined\n}\n","import type { DecodedId3Frame } from './DecodedId3Frame.ts'\nimport type { Id3Frame } from './Id3Frame.ts'\nimport { getId3Frames } from './getId3Frames.ts'\nimport { isId3TimestampFrame } from './isId3TimestampFrame.ts'\nimport { readId3Timestamp } from './util/readId3Timestamp.ts'\n\n/**\n * Searches for the Elementary Stream timestamp found in the ID3 data chunk\n *\n * @param data - Block of data containing one or more ID3 tags\n *\n * @returns The timestamp\n *\n *\n * @beta\n */\nexport function getId3Timestamp(data: Uint8Array<ArrayBuffer>): number | undefined {\n\tconst frames: Id3Frame[] = getId3Frames(data)\n\n\tfor (const frame of frames) {\n\t\tif (isId3TimestampFrame(frame)) {\n\t\t\treturn readId3Timestamp(frame as DecodedId3Frame<ArrayBuffer>)\n\t\t}\n\t}\n\n\treturn undefined\n}\n","/**\n * The scheme ID URI for ID3 tags.\n *\n *\n * @beta\n *\n * @see {@link https://aomediacodec.github.io/id3-emsg/ | Carriage of ID3 Timed Metadata in the Common Media Application Format (CMAF)}\n * @see {@link https://developer.apple.com/documentation/http-live-streaming/about-the-common-media-application-format-with-http-live-streaming-hls#CMAF-Tracks-Segments-Headers-and-Fragments | CMAF Tracks, Segments, Headers, and Fragments}\n */\nexport const ID3_SCHEME_ID_URI = 'https://aomedia.org/emsg/ID3'\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "@svta/cml-id3",
3
- "version": "0.19.0",
3
+ "version": "0.21.0",
4
4
  "description": "ID3 tag parsing functionality",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
7
- "homepage": "https://github.com/streaming-video-technology-alliance/common-media-library",
7
+ "homepage": "https://github.com/streaming-video-technology-alliance/common-media-library/tree/main/libs/id3",
8
8
  "authors": "Casey Occhialini <1508707+littlespex@users.noreply.github.com>",
9
9
  "repository": {
10
10
  "type": "git",
@@ -28,23 +28,6 @@
28
28
  "types": "./dist/index.d.ts",
29
29
  "import": "./dist/index.js",
30
30
  "default": "./dist/index.js"
31
- },
32
- "./*.js": {
33
- "import": "./dist/*.js",
34
- "default": "./dist/*.js"
35
- },
36
- "./*": {
37
- "types": "./dist/*.d.ts",
38
- "import": "./dist/*.js",
39
- "default": "./dist/*.js"
40
- }
41
- },
42
- "typesVersions": {
43
- "*": {
44
- "*": [
45
- "dist/*",
46
- "dist/cjs/*"
47
- ]
48
31
  }
49
32
  },
50
33
  "keywords": [
@@ -53,10 +36,8 @@
53
36
  "ID3"
54
37
  ],
55
38
  "scripts": {
56
- "build": "tsc",
57
- "postbuild": "api-extractor run --local",
58
- "test": "node --no-warnings --test **/*.test.ts",
59
- "prepublishOnly": "npm run build"
39
+ "build": "node ../../scripts/build.ts",
40
+ "test": "node ../../scripts/test.ts"
60
41
  },
61
42
  "engines": {
62
43
  "node": ">=20"
package/NOTICE DELETED
@@ -1,39 +0,0 @@
1
- Streaming Video Technology Alliance Common Media Library Copyright (c) 2023
2
- Streaming Video Technology Alliance
3
-
4
- ---
5
-
6
- Contains code derived from the `hls.js` library (https://github.com/video-dev/hls.js/)
7
-
8
- ```
9
- Copyright (c) 2017 Dailymotion (http://www.dailymotion.com)
10
-
11
- Licensed under the Apache License, Version 2.0 (the "License");
12
- you may not use this file except in compliance with the License.
13
- You may obtain a copy of the License at
14
-
15
- http://www.apache.org/licenses/LICENSE-2.0
16
-
17
- Unless required by applicable law or agreed to in writing, software
18
- distributed under the License is distributed on an "AS IS" BASIS,
19
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
20
- See the License for the specific language governing permissions and
21
- limitations under the License.
22
-
23
- src/remux/mp4-generator.js and src/demux/exp-golomb.ts implementation in this project
24
- are derived from the HLS library for video.js (https://github.com/videojs/videojs-contrib-hls)
25
-
26
- That work is also covered by the Apache 2 License, following copyright:
27
- Copyright (c) 2013-2015 Brightcove
28
-
29
-
30
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
31
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
32
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
33
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
34
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
35
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
36
- THE SOFTWARE.
37
- ```
38
-
39
- ---
@@ -1,21 +0,0 @@
1
- /**
2
- * Decoded ID3 frame.
3
- *
4
- *
5
- * @beta
6
- */
7
- export type DecodedId3Frame<T> = {
8
- /**
9
- * The four letter frame ID.
10
- */
11
- key: string;
12
- /**
13
- * The data payload.
14
- */
15
- data: T;
16
- /**
17
- * A text description of the frame if provided.
18
- */
19
- info?: any;
20
- };
21
- //# sourceMappingURL=DecodedId3Frame.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"DecodedId3Frame.d.ts","sourceRoot":"","sources":["../src/DecodedId3Frame.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,MAAM,eAAe,CAAC,CAAC,IAAI;IAChC;;OAEG;IACH,GAAG,EAAE,MAAM,CAAC;IAEZ;;OAEG;IACH,IAAI,EAAE,CAAC,CAAC;IAER;;OAEG;IACH,IAAI,CAAC,EAAE,GAAG,CAAC;CACX,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=DecodedId3Frame.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"DecodedId3Frame.js","sourceRoot":"","sources":["../src/DecodedId3Frame.ts"],"names":[],"mappings":"","sourcesContent":["/**\n * Decoded ID3 frame.\n *\n *\n * @beta\n */\nexport type DecodedId3Frame<T> = {\n\t/**\n\t * The four letter frame ID.\n\t */\n\tkey: string;\n\n\t/**\n\t * The data payload.\n\t */\n\tdata: T;\n\n\t/**\n\t * A text description of the frame if provided.\n\t */\n\tinfo?: any;\n};\n"]}
@@ -1,11 +0,0 @@
1
- /**
2
- * The scheme ID URI for ID3 tags.
3
- *
4
- *
5
- * @beta
6
- *
7
- * @see {@link https://aomediacodec.github.io/id3-emsg/ | Carriage of ID3 Timed Metadata in the Common Media Application Format (CMAF)}
8
- * @see {@link https://developer.apple.com/documentation/http-live-streaming/about-the-common-media-application-format-with-http-live-streaming-hls#CMAF-Tracks-Segments-Headers-and-Fragments | CMAF Tracks, Segments, Headers, and Fragments}
9
- */
10
- export declare const ID3_SCHEME_ID_URI = "https://aomedia.org/emsg/ID3";
11
- //# sourceMappingURL=ID3_SCHEME_ID_URI.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ID3_SCHEME_ID_URI.d.ts","sourceRoot":"","sources":["../src/ID3_SCHEME_ID_URI.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,eAAO,MAAM,iBAAiB,iCAAiC,CAAC"}
@@ -1,11 +0,0 @@
1
- /**
2
- * The scheme ID URI for ID3 tags.
3
- *
4
- *
5
- * @beta
6
- *
7
- * @see {@link https://aomediacodec.github.io/id3-emsg/ | Carriage of ID3 Timed Metadata in the Common Media Application Format (CMAF)}
8
- * @see {@link https://developer.apple.com/documentation/http-live-streaming/about-the-common-media-application-format-with-http-live-streaming-hls#CMAF-Tracks-Segments-Headers-and-Fragments | CMAF Tracks, Segments, Headers, and Fragments}
9
- */
10
- export const ID3_SCHEME_ID_URI = 'https://aomedia.org/emsg/ID3';
11
- //# sourceMappingURL=ID3_SCHEME_ID_URI.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ID3_SCHEME_ID_URI.js","sourceRoot":"","sources":["../src/ID3_SCHEME_ID_URI.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,8BAA8B,CAAC","sourcesContent":["/**\n * The scheme ID URI for ID3 tags.\n *\n *\n * @beta\n *\n * @see {@link https://aomediacodec.github.io/id3-emsg/ | Carriage of ID3 Timed Metadata in the Common Media Application Format (CMAF)}\n * @see {@link https://developer.apple.com/documentation/http-live-streaming/about-the-common-media-application-format-with-http-live-streaming-hls#CMAF-Tracks-Segments-Headers-and-Fragments | CMAF Tracks, Segments, Headers, and Fragments}\n */\nexport const ID3_SCHEME_ID_URI = 'https://aomedia.org/emsg/ID3';\n"]}