@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.
- package/README.md +17 -0
- package/dist/index.d.ts +221 -15
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +440 -13
- package/dist/index.js.map +1 -1
- package/package.json +4 -23
- package/NOTICE +0 -39
- package/dist/DecodedId3Frame.d.ts +0 -21
- package/dist/DecodedId3Frame.d.ts.map +0 -1
- package/dist/DecodedId3Frame.js +0 -2
- package/dist/DecodedId3Frame.js.map +0 -1
- package/dist/ID3_SCHEME_ID_URI.d.ts +0 -11
- package/dist/ID3_SCHEME_ID_URI.d.ts.map +0 -1
- package/dist/ID3_SCHEME_ID_URI.js +0 -11
- package/dist/ID3_SCHEME_ID_URI.js.map +0 -1
- package/dist/Id3Frame.d.ts +0 -9
- package/dist/Id3Frame.d.ts.map +0 -1
- package/dist/Id3Frame.js +0 -2
- package/dist/Id3Frame.js.map +0 -1
- package/dist/canParseId3.d.ts +0 -13
- package/dist/canParseId3.d.ts.map +0 -1
- package/dist/canParseId3.js +0 -18
- package/dist/canParseId3.js.map +0 -1
- package/dist/getId3Data.d.ts +0 -14
- package/dist/getId3Data.d.ts.map +0 -1
- package/dist/getId3Data.js +0 -35
- package/dist/getId3Data.js.map +0 -1
- package/dist/getId3Frames.d.ts +0 -13
- package/dist/getId3Frames.d.ts.map +0 -1
- package/dist/getId3Frames.js +0 -46
- package/dist/getId3Frames.js.map +0 -1
- package/dist/getId3Timestamp.d.ts +0 -12
- package/dist/getId3Timestamp.d.ts.map +0 -1
- package/dist/getId3Timestamp.js +0 -24
- package/dist/getId3Timestamp.js.map +0 -1
- package/dist/isId3TimestampFrame.d.ts +0 -13
- package/dist/isId3TimestampFrame.d.ts.map +0 -1
- package/dist/isId3TimestampFrame.js +0 -16
- package/dist/isId3TimestampFrame.js.map +0 -1
- package/dist/tsconfig.tsbuildinfo +0 -1
- package/dist/util/RawFrame.d.ts +0 -12
- package/dist/util/RawFrame.d.ts.map +0 -1
- package/dist/util/RawFrame.js +0 -2
- package/dist/util/RawFrame.js.map +0 -1
- package/dist/util/decodeId3Frame.d.ts +0 -14
- package/dist/util/decodeId3Frame.d.ts.map +0 -1
- package/dist/util/decodeId3Frame.js +0 -27
- package/dist/util/decodeId3Frame.js.map +0 -1
- package/dist/util/decodeId3ImageFrame.d.ts +0 -4
- package/dist/util/decodeId3ImageFrame.d.ts.map +0 -1
- package/dist/util/decodeId3ImageFrame.js +0 -46
- package/dist/util/decodeId3ImageFrame.js.map +0 -1
- package/dist/util/decodeId3PrivFrame.d.ts +0 -14
- package/dist/util/decodeId3PrivFrame.d.ts.map +0 -1
- package/dist/util/decodeId3PrivFrame.js +0 -23
- package/dist/util/decodeId3PrivFrame.js.map +0 -1
- package/dist/util/decodeId3TextFrame.d.ts +0 -14
- package/dist/util/decodeId3TextFrame.d.ts.map +0 -1
- package/dist/util/decodeId3TextFrame.js +0 -37
- package/dist/util/decodeId3TextFrame.js.map +0 -1
- package/dist/util/decodeId3UrlFrame.d.ts +0 -14
- package/dist/util/decodeId3UrlFrame.d.ts.map +0 -1
- package/dist/util/decodeId3UrlFrame.js +0 -35
- package/dist/util/decodeId3UrlFrame.js.map +0 -1
- package/dist/util/getId3FrameData.d.ts +0 -13
- package/dist/util/getId3FrameData.d.ts.map +0 -1
- package/dist/util/getId3FrameData.js +0 -24
- package/dist/util/getId3FrameData.js.map +0 -1
- package/dist/util/isId3Footer.d.ts +0 -13
- package/dist/util/isId3Footer.d.ts.map +0 -1
- package/dist/util/isId3Footer.js +0 -35
- package/dist/util/isId3Footer.js.map +0 -1
- package/dist/util/isId3Header.d.ts +0 -13
- package/dist/util/isId3Header.d.ts.map +0 -1
- package/dist/util/isId3Header.js +0 -45
- package/dist/util/isId3Header.js.map +0 -1
- package/dist/util/readId3Size.d.ts +0 -13
- package/dist/util/readId3Size.d.ts.map +0 -1
- package/dist/util/readId3Size.js +0 -20
- package/dist/util/readId3Size.js.map +0 -1
- package/dist/util/readId3Timestamp.d.ts +0 -13
- package/dist/util/readId3Timestamp.d.ts.map +0 -1
- package/dist/util/readId3Timestamp.js +0 -26
- package/dist/util/readId3Timestamp.js.map +0 -1
- package/dist/util/toArrayBuffer.d.ts +0 -4
- package/dist/util/toArrayBuffer.d.ts.map +0 -1
- package/dist/util/toArrayBuffer.js +0 -16
- package/dist/util/toArrayBuffer.js.map +0 -1
- package/dist/util/utf8.d.ts +0 -2
- package/dist/util/utf8.d.ts.map +0 -1
- package/dist/util/utf8.js +0 -31
- package/dist/util/utf8.js.map +0 -1
- package/dist/util/utf8ArrayToStr.d.ts +0 -12
- package/dist/util/utf8ArrayToStr.d.ts.map +0 -1
- package/dist/util/utf8ArrayToStr.js +0 -19
- 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
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
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":";;;;;;;;;;;;;;AAWA,SAAgB,YAAY,MAAkB,QAAyB;AActE,KAAI,SAAS,MAAM,KAAK,QAEvB;MACC,KAAK,YAAY,MACjB,KAAK,SAAS,OAAO,MACrB,KAAK,SAAS,OAAO,IAGrB;OAAI,KAAK,SAAS,KAAK,OAAQ,KAAK,SAAS,KAAK,KAEjD;QACC,KAAK,SAAS,KAAK,OACnB,KAAK,SAAS,KAAK,OACnB,KAAK,SAAS,KAAK,OACnB,KAAK,SAAS,KAAK,IAEnB,QAAO;;;;AAKX,QAAO;;;;;;;;;;;;;;;;ACnCR,SAAgB,YAAY,MAAkB,QAAwB;CACrE,IAAI,OAAO;AACX,SAAQ,KAAK,UAAU,QAAS;AAChC,UAAS,KAAK,SAAS,KAAK,QAAS;AACrC,UAAS,KAAK,SAAS,KAAK,QAAS;AACrC,SAAQ,KAAK,SAAS,KAAK;AAC3B,QAAO;;;;;;;;;;;;;;;;ACHR,SAAgB,YAAY,MAAkB,QAAyB;AACtE,QACC,YAAY,MAAM,OAAO,IACzB,YAAY,MAAM,SAAS,EAAE,GAAG,MAAM,KAAK,SAAS;;;;;;;;;;;;;;;;ACNtD,SAAgB,YAAY,MAAkB,QAAyB;AAItE,KAAI,SAAS,MAAM,KAAK,QAEvB;MACC,KAAK,YAAY,MACjB,KAAK,SAAS,OAAO,MACrB,KAAK,SAAS,OAAO,IAGrB;OAAI,KAAK,SAAS,KAAK,OAAQ,KAAK,SAAS,KAAK,KAEjD;QACC,KAAK,SAAS,KAAK,OACnB,KAAK,SAAS,KAAK,OACnB,KAAK,SAAS,KAAK,OACnB,KAAK,SAAS,KAAK,IAEnB,QAAO;;;;AAMX,QAAO;;;;;;;;;;;;;;;;;ACrBR,SAAgB,WACf,MACA,QACyB;CACzB,MAAM,QAAQ;CACd,IAAI,SAAS;AAEb,QAAO,YAAY,MAAM,OAAO,EAAE;AAEjC,YAAU;EAEV,MAAM,OAAO,YAAY,MAAM,SAAS,EAAE;AAC1C,YAAU;AAEV,MAAI,YAAY,MAAM,SAAS,GAAG,CAEjC,WAAU;AAGX,YAAU;;AAGX,KAAI,SAAS,EACZ,QAAO,KAAK,SAAS,OAAO,QAAQ,OAAO;;;;;;;;ACtB7C,SAAgB,cAAc,QAA6C;AAC1E,KAAIA,kBAAgB,YACnB,QAAOA;MAEH;AACJ,MAAIA,OAAK,cAAc,KAAKA,OAAK,cAAcA,OAAK,OAAO,WAE1D,QAAOA,OAAK;AAKb,SAAO,IAAI,WAAWA,OAAK,CAAC;;;;;;;;;AC1B9B,SAAgB,QACf,MACA,SAAiB,GACjB,SAAiB,UACS;AAC1B,QAAO,KAAK,MAAM,QAAQ,QAAQ,WAAW;;AAG9C,SAAS,KACR,MACA,QACA,QACA,MACI;CACJ,MAAM,SAAS,qBAAqB,KAAK;CACzC,IAAIC,kBAAuB;AAC3B,KAAI,uBAAuB,KAC1B,mBAAkB,KAAK;CAGxB,MAAM,aAAa,kBAAkB,KAAK,GAAG,KAAK,aAAa;CAC/D,MAAM,WAAY,aAAc,KAAK,cAAc;CAEnD,MAAM,YAAa,aAAc,UAAU;CAC3C,MAAM,QAAQ,KAAK,MAAM,KAAK,IAAI,GAAG,KAAK,IAAI,UAAU,QAAQ,CAAC,CAAC;AAGlE,QAAO,IAAI,KAAK,QAAuB,OAD3B,KAAK,MAAM,KAAK,IAAI,QAAQ,KAAK,IAAI,QAAQ,EAAE,EAAE,QAAQ,CAAC,GAClB,MAAM;;AAG3D,SAAS,qBAAqB,QAAoB;AACjD,KAAIC,kBAAgB,YACnB,QAAOA;KAGP,QAAOA,OAAK;;AAId,SAAS,kBAAkB,KAAkC;AAC5D,QAAO,OAAO,IAAI,kBAAkB,eAAe,IAAI,eAAe,UAAa,IAAI,eAAe;;;;;;;;;;;;;;;AC/BvG,SAAgB,eACf,OACA,aAAsB,OACb;CACT,MAAM,aAAa,aAAa,MAAM,QAAQ,EAAE,GAAG,MAAM;CAEzD,MAAM,SAAS,WADF,IAAI,SAAsB,MAAM,QAAQ,MAAM,YAAY,WAAW,EAClD,EAAE,UAAU,OAAO,CAAC;AAEpD,QAAO,aAAa,SAAS,OAAO,QAAQ,OAAO,GAAG;;;;;ACNvD,SAAgB,oBACf,OACoD;CACpD,MAAMC,gBAA+B;EACpC,KAAK,MAAM;EACX,aAAa;EACb,MAAM;EACN,UAAU;EACV,aAAa;EACb;CAED,MAAM,eAAe;AAErB,KAAI,MAAM,OAAO,EAChB;AAED,KAAI,MAAM,KAAK,OAAO,cAAc;AACnC,UAAQ,IAAI,oDAAyD;AACrE;;CAGD,MAAM,mBAAmB,MAAM,KAAK,SAAS,EAAE,CAAC,QAAQ,EAAE;AAC1D,KAAI,qBAAqB,GACxB;CAED,MAAM,WAAW,eAAe,QAAQ,MAAM,MAAM,GAAG,iBAAiB,CAAC;CACzE,MAAM,cAAc,MAAM,KAAK,IAAI;CACnC,MAAM,sBAAsB,MAAM,KAChC,SAAS,IAAI,iBAAiB,CAC9B,QAAQ,EAAE;AACZ,KAAI,wBAAwB,GAC3B;CAED,MAAM,cAAc,eACnB,QAAQ,MAAM,MAAM,IAAI,kBAAkB,oBAAoB,CAC9D;CAED,IAAI;AACJ,KAAI,aAAa,MAChB,QAAO,eACN,QAAQ,MAAM,MAAM,IAAI,mBAAmB,oBAAoB,CAC/D;KAGD,QAAO,cACN,MAAM,KAAK,SAAS,IAAI,mBAAmB,oBAAoB,CAC/D;AAGF,eAAc,WAAW;AACzB,eAAc,cAAc;AAC5B,eAAc,cAAc;AAC5B,eAAc,OAAO;AACrB,QAAO;;;;;;;;;;;;;;;ACrDR,SAAgB,mBACf,OAC2C;AAI3C,KAAI,MAAM,OAAO,EAChB;CAGD,MAAM,QAAQ,eAAe,MAAM,MAAM,KAAK;CAC9C,MAAM,cAAc,IAAI,WAAW,MAAM,KAAK,SAAS,MAAM,SAAS,EAAE,CAAC;AAEzE,QAAO;EAAE,KAAK,MAAM;EAAM,MAAM;EAAO,MAAM,YAAY;EAAQ;;;;;;;;;;;;;;;ACblE,SAAgB,mBAAmB,OAAyD;AAC3F,KAAI,MAAM,OAAO,EAChB;AAGD,KAAI,MAAM,SAAS,QAAQ;EAM1B,IAAI,QAAQ;EACZ,MAAM,EAAE,SAAS;EACjB,MAAM,cAAc,eAAe,KAAK,SAAS,MAAM,EAAE,KAAK;AAE9D,WAAS,YAAY,SAAS;EAC9B,MAAM,QAAQ,eAAe,KAAK,SAAS,MAAM,CAAC;AAElD,SAAO;GAAE,KAAK,MAAM;GAAM,MAAM;GAAa,MAAM;GAAO;;CAO3D,MAAM,OAAO,eAAe,MAAM,KAAK,SAAS,EAAE,CAAC;AACnD,QAAO;EAAE,KAAK,MAAM;EAAM,MAAM;EAAI,MAAM;EAAM;;;;;;;;;;;;;;;AC1BjD,SAAgB,kBAAkB,OAAyD;AAC1F,KAAI,MAAM,SAAS,QAAQ;AAM1B,MAAI,MAAM,OAAO,EAChB;EAGD,IAAI,QAAQ;EACZ,MAAMC,cAAsB,eAC3B,MAAM,KAAK,SAAS,MAAM,EAC1B,KACA;AAED,WAAS,YAAY,SAAS;EAC9B,MAAMC,QAAgB,eAAe,MAAM,KAAK,SAAS,MAAM,CAAC;AAEhE,SAAO;GAAE,KAAK,MAAM;GAAM,MAAM;GAAa,MAAM;GAAO;;CAM3D,MAAMC,MAAc,eAAe,MAAM,KAAK;AAC9C,QAAO;EAAE,KAAK,MAAM;EAAM,MAAM;EAAI,MAAM;EAAK;;;;;;;;;;;;;;;ACxBhD,SAAgB,eAAe,OAA0C;AACxE,KAAI,MAAM,SAAS,OAClB,QAAO,mBAAmB,MAAM;UAExB,MAAM,KAAK,OAAO,IAC1B,QAAO,kBAAkB,MAAM;UAGvB,MAAM,SAAS,OACvB,QAAO,oBAAoB,MAAM;AAGlC,QAAO,mBAAmB,MAAM;;;;;;;;;;;;;;;AChBjC,SAAgB,gBAAgB,MAA4C;CAM3E,MAAMC,OAAe,OAAO,aAAa,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,GAAG;CAC5E,MAAMC,OAAe,YAAY,MAAM,EAAE;CAGzC,MAAM,SAAS;AAEf,QAAO;EAAE;EAAM;EAAM,MAAM,KAAK,SAAS,QAAQ,SAAS,KAAK;EAAE;;;;;ACjBlE,MAAM,qBAAqB;AAC3B,MAAM,aAAa;;;;;;;;;;;AAYnB,SAAgB,aAAa,SAA8C;CAC1E,IAAI,SAAS;CACb,MAAMC,SAAqB,EAAE;AAE7B,QAAO,YAAY,SAAS,OAAO,EAAE;EACpC,MAAM,OAAO,YAAY,SAAS,SAAS,EAAE;AAE7C,MAAK,QAAQ,SAAS,MAAM,IAAK,EAEhC,WAAU;AAGX,YAAU;EACV,MAAM,MAAM,SAAS;AAErB,SAAO,SAAS,aAAa,KAAK;GACjC,MAAMC,YAAyB,gBAAgB,QAAQ,SAAS,OAAO,CAAC;GACxE,MAAMC,QAA8B,eAAe,UAAU;AAC7D,OAAI,MACH,QAAO,KAAK,MAAM;AAInB,aAAU,UAAU,OAAO;;AAG5B,MAAI,YAAY,SAAS,OAAO,CAC/B,WAAU;;AAIZ,QAAO;;;;;;;;;;;;;;;ACxCR,SAAgB,oBAAoB,OAA0B;AAC7D,QACC,SACA,MAAM,QAAQ,UACd,MAAM,SAAS;;;;;;;;;;;;;;;ACJjB,SAAgB,iBACf,gBACqB;AACrB,KAAI,eAAe,KAAK,eAAe,GAAG;EACzC,MAAM,OAAO,IAAI,WAAW,eAAe,KAAK;EAGhD,MAAM,WAAW,KAAK,KAAK;EAC3B,IAAI,aACF,KAAK,MAAM,OAAO,KAAK,MAAM,OAAO,KAAK,MAAM,KAAK,KAAK;AAC3D,eAAa;AAEb,MAAI,SACH,cAAa;AAGd,SAAO,KAAK,MAAM,UAAU;;;;;;;;;;;;;;;;ACZ9B,SAAgB,gBAAgB,MAAmD;CAClF,MAAMC,SAAqB,aAAa,KAAK;AAE7C,MAAK,MAAM,SAAS,OACnB,KAAI,oBAAoB,MAAM,CAC7B,QAAO,iBAAiB,MAAsC;;;;;;;;;;;;;;ACZjE,MAAa,oBAAoB"}
|
package/package.json
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@svta/cml-id3",
|
|
3
|
-
"version": "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": "
|
|
57
|
-
"
|
|
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"}
|
package/dist/DecodedId3Frame.js
DELETED
|
@@ -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"]}
|