@agentdocumentformat/cli 0.7.2
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/LICENSE +21 -0
- package/README.md +45 -0
- package/dist/adf.mjs +162 -0
- package/dist/chunks/APEv2Parser-2CNNHMXV.mjs +22 -0
- package/dist/chunks/AiffParser-7BR4RL6G.mjs +162 -0
- package/dist/chunks/App-L5L37JI5.mjs +16747 -0
- package/dist/chunks/AsfParser-VVRSLFOM.mjs +538 -0
- package/dist/chunks/DsdiffParser-CMD4AX7A.mjs +156 -0
- package/dist/chunks/DsfParser-UOGZDS2M.mjs +94 -0
- package/dist/chunks/FlacParser-HB3T3CD4.mjs +23 -0
- package/dist/chunks/MP4Parser-66HBRUSX.mjs +973 -0
- package/dist/chunks/MatroskaParser-J3HUIMEW.mjs +579 -0
- package/dist/chunks/MpegParser-YW6LIUEW.mjs +442 -0
- package/dist/chunks/MusepackParser-PAUSXP7D.mjs +252 -0
- package/dist/chunks/OggParser-NUBV3GWC.mjs +359 -0
- package/dist/chunks/WavPackParser-WQAGT7TC.mjs +171 -0
- package/dist/chunks/WaveParser-EWLQVDX4.mjs +238 -0
- package/dist/chunks/adf-schema-JRU2BTOG.mjs +62 -0
- package/dist/chunks/build-QF5W473T.mjs +60 -0
- package/dist/chunks/chatgpt-subscription-BQGWYZXE.mjs +23 -0
- package/dist/chunks/chunk-2DIECGFL.mjs +6 -0
- package/dist/chunks/chunk-2NAP2ZF7.mjs +60 -0
- package/dist/chunks/chunk-3AT7IIP7.mjs +25696 -0
- package/dist/chunks/chunk-3GNIDM53.mjs +35 -0
- package/dist/chunks/chunk-3M4ZPOA3.mjs +1477 -0
- package/dist/chunks/chunk-4MQPTCXY.mjs +510 -0
- package/dist/chunks/chunk-5PO5PKRV.mjs +366 -0
- package/dist/chunks/chunk-5QU5VY7N.mjs +52 -0
- package/dist/chunks/chunk-5W7KES6P.mjs +436 -0
- package/dist/chunks/chunk-62NE4LG4.mjs +61 -0
- package/dist/chunks/chunk-64OKE4X3.mjs +45 -0
- package/dist/chunks/chunk-6GJ4QHRI.mjs +1278 -0
- package/dist/chunks/chunk-6VQEXLE2.mjs +144 -0
- package/dist/chunks/chunk-6XUV6EK6.mjs +41 -0
- package/dist/chunks/chunk-776TSXEP.mjs +43 -0
- package/dist/chunks/chunk-7CV2SA3H.mjs +285 -0
- package/dist/chunks/chunk-7MTRVW2U.mjs +3103 -0
- package/dist/chunks/chunk-7N2R2VCG.mjs +1434 -0
- package/dist/chunks/chunk-7T2YMTWL.mjs +374 -0
- package/dist/chunks/chunk-7XYNI52E.mjs +149 -0
- package/dist/chunks/chunk-APHX6HSV.mjs +7731 -0
- package/dist/chunks/chunk-APRU6PHC.mjs +40 -0
- package/dist/chunks/chunk-AUYKRQPJ.mjs +499 -0
- package/dist/chunks/chunk-DXWDD5XJ.mjs +136 -0
- package/dist/chunks/chunk-EWL5FG4I.mjs +39 -0
- package/dist/chunks/chunk-EYX2YLJW.mjs +117 -0
- package/dist/chunks/chunk-F5ELW46V.mjs +27 -0
- package/dist/chunks/chunk-G426FACA.mjs +49 -0
- package/dist/chunks/chunk-GEKSJHIV.mjs +2472 -0
- package/dist/chunks/chunk-HBUENVQL.mjs +570 -0
- package/dist/chunks/chunk-HPVFJYXR.mjs +112 -0
- package/dist/chunks/chunk-HWLWPXQ7.mjs +721 -0
- package/dist/chunks/chunk-I2HJYHFT.mjs +665 -0
- package/dist/chunks/chunk-I3UYSITV.mjs +68 -0
- package/dist/chunks/chunk-IC4JDZCI.mjs +3864 -0
- package/dist/chunks/chunk-IHDDCZBS.mjs +112 -0
- package/dist/chunks/chunk-IIGMZHQQ.mjs +10416 -0
- package/dist/chunks/chunk-KWFOS5WC.mjs +41 -0
- package/dist/chunks/chunk-LAZIXV2F.mjs +5290 -0
- package/dist/chunks/chunk-LFMB4PAA.mjs +10814 -0
- package/dist/chunks/chunk-M2RX3S2T.mjs +49 -0
- package/dist/chunks/chunk-M3WPIJYM.mjs +65 -0
- package/dist/chunks/chunk-NBTUWMGP.mjs +263 -0
- package/dist/chunks/chunk-NGK6PVSF.mjs +2676 -0
- package/dist/chunks/chunk-NZ7JTHEO.mjs +85 -0
- package/dist/chunks/chunk-OQN33RGQ.mjs +52 -0
- package/dist/chunks/chunk-RIX34QHC.mjs +2935 -0
- package/dist/chunks/chunk-SGUTYISF.mjs +16 -0
- package/dist/chunks/chunk-SLJ5L7PY.mjs +1473 -0
- package/dist/chunks/chunk-SLUKGXKH.mjs +68 -0
- package/dist/chunks/chunk-TMT32MXT.mjs +419 -0
- package/dist/chunks/chunk-UYY5M2PB.mjs +151 -0
- package/dist/chunks/chunk-VAUOM3IN.mjs +298 -0
- package/dist/chunks/chunk-VMHTYDH4.mjs +172 -0
- package/dist/chunks/chunk-VZS54AA5.mjs +200 -0
- package/dist/chunks/chunk-WFQUVXML.mjs +295 -0
- package/dist/chunks/chunk-X34PDRUH.mjs +809 -0
- package/dist/chunks/chunk-XNPZBLYL.mjs +33 -0
- package/dist/chunks/chunk-XX7OSWTO.mjs +157 -0
- package/dist/chunks/chunk-XYTWGHFS.mjs +600 -0
- package/dist/chunks/chunk-XYV3VCIX.mjs +336 -0
- package/dist/chunks/chunk-Y5ZLKFLE.mjs +1469 -0
- package/dist/chunks/chunk-ZJKXHM4Q.mjs +230 -0
- package/dist/chunks/cli-TCMBNZF6.mjs +1030 -0
- package/dist/chunks/commands-DTEKM4ZL.mjs +20 -0
- package/dist/chunks/daemon-ZC3FZ2P4.mjs +112449 -0
- package/dist/chunks/daemon-control-WDX7PMTC.mjs +300 -0
- package/dist/chunks/daemon-token-WRSULP7G.mjs +23 -0
- package/dist/chunks/devtools-H7CI2ZVG.mjs +85 -0
- package/dist/chunks/discord-IWDQJA7A.mjs +70588 -0
- package/dist/chunks/dist-C57KYFS2.mjs +4952 -0
- package/dist/chunks/dist-I3XBAGDL.mjs +11 -0
- package/dist/chunks/email-V4Q4VJON.mjs +58679 -0
- package/dist/chunks/environment-NX277MQG.mjs +15 -0
- package/dist/chunks/grok-subscription-4PYX7TBF.mjs +19 -0
- package/dist/chunks/layout-EPJQNFAI.mjs +22 -0
- package/dist/chunks/lib-N7FCZWKH.mjs +4038 -0
- package/dist/chunks/open-OTQDGDH5.mjs +36 -0
- package/dist/chunks/parser-JVY2PWSM.mjs +19 -0
- package/dist/chunks/pipeline-executor-BHBSJX2K.mjs +19 -0
- package/dist/chunks/react-IUIDQ5LX.mjs +11 -0
- package/dist/chunks/screen-54BUTYCW.mjs +27 -0
- package/dist/chunks/slack-3L5QTDZX.mjs +8113 -0
- package/dist/chunks/store-WR7TZJZS.mjs +32 -0
- package/dist/chunks/telegram-5ISVFBV3.mjs +14918 -0
- package/dist/chunks/terminal-O5WO7C5U.mjs +48 -0
- package/dist/chunks/theme-NORU4J74.mjs +20 -0
- package/dist/chunks/themes-F2FKU7CP.mjs +23 -0
- package/dist/chunks/token-6G3HCMNX.mjs +54 -0
- package/dist/chunks/token-util-UXYSDQIW.mjs +12 -0
- package/dist/chunks/tui-ODVYUIMT.mjs +197 -0
- package/dist/chunks/welcome-XHXFV7SH.mjs +32 -0
- package/dist/chunks/whatsapp-XSAMNGPJ.mjs +85412 -0
- package/dist/chunks/xterm-headless-YF53XWXE.mjs +3353 -0
- package/package.json +53 -0
- package/resources/wasm/coreutils.LICENSE +18 -0
- package/resources/wasm/coreutils.wasm +0 -0
|
@@ -0,0 +1,600 @@
|
|
|
1
|
+
import { createRequire as __adfCreateRequire } from 'node:module';
|
|
2
|
+
import { fileURLToPath as __adfFileURLToPath } from 'node:url';
|
|
3
|
+
import { dirname as __adfDirname } from 'node:path';
|
|
4
|
+
const require = __adfCreateRequire(import.meta.url);
|
|
5
|
+
const __filename = __adfFileURLToPath(import.meta.url);
|
|
6
|
+
const __dirname = __adfDirname(__filename);
|
|
7
|
+
import {
|
|
8
|
+
Genres
|
|
9
|
+
} from "./chunk-VAUOM3IN.mjs";
|
|
10
|
+
import {
|
|
11
|
+
AttachedPictureType,
|
|
12
|
+
ExtendedHeader,
|
|
13
|
+
ID3v2Header,
|
|
14
|
+
SyncTextHeader,
|
|
15
|
+
TextEncodingToken,
|
|
16
|
+
TextHeader,
|
|
17
|
+
UINT32SYNCSAFE
|
|
18
|
+
} from "./chunk-DXWDD5XJ.mjs";
|
|
19
|
+
import {
|
|
20
|
+
decodeString,
|
|
21
|
+
decodeUintBE,
|
|
22
|
+
findZero,
|
|
23
|
+
getBit
|
|
24
|
+
} from "./chunk-XX7OSWTO.mjs";
|
|
25
|
+
import {
|
|
26
|
+
UINT24_BE,
|
|
27
|
+
UINT32_BE,
|
|
28
|
+
UINT8,
|
|
29
|
+
Uint8ArrayType,
|
|
30
|
+
makeUnexpectedFileContentError,
|
|
31
|
+
textDecode
|
|
32
|
+
} from "./chunk-I2HJYHFT.mjs";
|
|
33
|
+
import {
|
|
34
|
+
require_src
|
|
35
|
+
} from "./chunk-AUYKRQPJ.mjs";
|
|
36
|
+
import {
|
|
37
|
+
__toESM
|
|
38
|
+
} from "./chunk-M2RX3S2T.mjs";
|
|
39
|
+
|
|
40
|
+
// node_modules/music-metadata/lib/id3v2/FrameParser.js
|
|
41
|
+
var import_debug = __toESM(require_src(), 1);
|
|
42
|
+
|
|
43
|
+
// node_modules/music-metadata/lib/id3v2/ID3v2ChapterToken.js
|
|
44
|
+
var ChapterInfo = {
|
|
45
|
+
len: 16,
|
|
46
|
+
get: (buf, off) => {
|
|
47
|
+
let startOffset = UINT32_BE.get(buf, off + 8), endOffset = UINT32_BE.get(buf, off + 12);
|
|
48
|
+
return {
|
|
49
|
+
startTime: UINT32_BE.get(buf, off),
|
|
50
|
+
endTime: UINT32_BE.get(buf, off + 4),
|
|
51
|
+
startOffset: startOffset === 4294967295 ? void 0 : startOffset,
|
|
52
|
+
endOffset: endOffset === 4294967295 ? void 0 : endOffset
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
// node_modules/music-metadata/lib/id3v2/FrameHeader.js
|
|
58
|
+
function getFrameHeaderLength(majorVer) {
|
|
59
|
+
switch (majorVer) {
|
|
60
|
+
case 2:
|
|
61
|
+
return 6;
|
|
62
|
+
case 3:
|
|
63
|
+
case 4:
|
|
64
|
+
return 10;
|
|
65
|
+
default:
|
|
66
|
+
throw makeUnexpectedMajorVersionError(majorVer);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
function readFrameFlags(b, majorVer) {
|
|
70
|
+
return majorVer === 3 ? {
|
|
71
|
+
status: {
|
|
72
|
+
tag_alter_preservation: getBit(b, 0, 7),
|
|
73
|
+
file_alter_preservation: getBit(b, 0, 6),
|
|
74
|
+
read_only: getBit(b, 0, 5)
|
|
75
|
+
},
|
|
76
|
+
format: {
|
|
77
|
+
compression: getBit(b, 1, 7),
|
|
78
|
+
encryption: getBit(b, 1, 6),
|
|
79
|
+
grouping_identity: getBit(b, 1, 5),
|
|
80
|
+
// Unsynchronisation and data-length-indicator do not exist as per-frame flags in ID3v2.3.
|
|
81
|
+
unsynchronisation: !1,
|
|
82
|
+
data_length_indicator: !1
|
|
83
|
+
}
|
|
84
|
+
} : {
|
|
85
|
+
status: {
|
|
86
|
+
tag_alter_preservation: getBit(b, 0, 6),
|
|
87
|
+
file_alter_preservation: getBit(b, 0, 5),
|
|
88
|
+
read_only: getBit(b, 0, 4)
|
|
89
|
+
},
|
|
90
|
+
format: {
|
|
91
|
+
grouping_identity: getBit(b, 1, 6),
|
|
92
|
+
compression: getBit(b, 1, 3),
|
|
93
|
+
encryption: getBit(b, 1, 2),
|
|
94
|
+
unsynchronisation: getBit(b, 1, 1),
|
|
95
|
+
data_length_indicator: getBit(b, 1, 0)
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
function readFrameHeader(uint8Array, majorVer, warningCollector) {
|
|
100
|
+
switch (majorVer) {
|
|
101
|
+
case 2:
|
|
102
|
+
return parseFrameHeaderV22(uint8Array, majorVer, warningCollector);
|
|
103
|
+
case 3:
|
|
104
|
+
case 4:
|
|
105
|
+
return parseFrameHeaderV23V24(uint8Array, majorVer, warningCollector);
|
|
106
|
+
default:
|
|
107
|
+
throw makeUnexpectedMajorVersionError(majorVer);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
function parseFrameHeaderV22(uint8Array, majorVer, warningCollector) {
|
|
111
|
+
let header = {
|
|
112
|
+
id: textDecode(uint8Array.subarray(0, 3), "ascii"),
|
|
113
|
+
length: UINT24_BE.get(uint8Array, 3)
|
|
114
|
+
};
|
|
115
|
+
return header.id.match(/^[A-Z0-9]{3}$/) || warningCollector.addWarning(`Invalid ID3v2.${majorVer} frame-header-ID: ${header.id}`), header;
|
|
116
|
+
}
|
|
117
|
+
function parseFrameHeaderV23V24(uint8Array, majorVer, warningCollector) {
|
|
118
|
+
let header = {
|
|
119
|
+
id: textDecode(uint8Array.subarray(0, 4), "ascii"),
|
|
120
|
+
length: (majorVer === 4 ? UINT32SYNCSAFE : UINT32_BE).get(uint8Array, 4),
|
|
121
|
+
flags: readFrameFlags(uint8Array.subarray(8, 10), majorVer)
|
|
122
|
+
};
|
|
123
|
+
return header.id.match(/^[A-Z0-9]{4}$/) || warningCollector.addWarning(`Invalid ID3v2.${majorVer} frame-header-ID: ${header.id}`), header;
|
|
124
|
+
}
|
|
125
|
+
function makeUnexpectedMajorVersionError(majorVer) {
|
|
126
|
+
throw new Id3v2ContentError(`Unexpected majorVer: ${majorVer}`);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// node_modules/music-metadata/lib/id3v2/FrameParser.js
|
|
130
|
+
var debug = (0, import_debug.default)("music-metadata:id3v2:frame-parser"), defaultEnc = "latin1", urlEnc = { encoding: defaultEnc, bom: !1 };
|
|
131
|
+
function parseGenre(origVal) {
|
|
132
|
+
let genres = [], code, word = "";
|
|
133
|
+
for (let c of origVal)
|
|
134
|
+
if (typeof code == "string")
|
|
135
|
+
if (c === "(" && code === "")
|
|
136
|
+
word += "(", code = void 0;
|
|
137
|
+
else if (c === ")") {
|
|
138
|
+
word !== "" && (genres.push(word), word = "");
|
|
139
|
+
let genre = parseGenreCode(code);
|
|
140
|
+
genre && genres.push(genre), code = void 0;
|
|
141
|
+
} else
|
|
142
|
+
code += c;
|
|
143
|
+
else c === "(" ? code = "" : word += c;
|
|
144
|
+
return word && (genres.length === 0 && word.match(/^\d*$/) && (word = parseGenreCode(word)), word && genres.push(word)), genres;
|
|
145
|
+
}
|
|
146
|
+
function parseGenreCode(code) {
|
|
147
|
+
if (code === "RX")
|
|
148
|
+
return "Remix";
|
|
149
|
+
if (code === "CR")
|
|
150
|
+
return "Cover";
|
|
151
|
+
if (code.match(/^\d*$/))
|
|
152
|
+
return Genres[Number.parseInt(code, 10)];
|
|
153
|
+
}
|
|
154
|
+
var FrameParser = class _FrameParser {
|
|
155
|
+
/**
|
|
156
|
+
* Create id3v2 frame parser
|
|
157
|
+
* @param major - Major version, e.g. (4) for id3v2.4
|
|
158
|
+
* @param warningCollector - Used to collect decode issue
|
|
159
|
+
*/
|
|
160
|
+
constructor(major, warningCollector) {
|
|
161
|
+
this.major = major, this.warningCollector = warningCollector;
|
|
162
|
+
}
|
|
163
|
+
readData(uint8Array, type, includeCovers) {
|
|
164
|
+
if (uint8Array.length === 0) {
|
|
165
|
+
this.warningCollector.addWarning(`id3v2.${this.major} header has empty tag type=${type}`);
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
let { encoding, bom } = TextEncodingToken.get(uint8Array, 0), length = uint8Array.length, offset = 0, output = [], nullTerminatorLength = _FrameParser.getNullTerminatorLength(encoding), fzero;
|
|
169
|
+
switch (debug(`Parsing tag type=${type}, encoding=${encoding}, bom=${bom}`), type !== "TXXX" && type[0] === "T" ? "T*" : type) {
|
|
170
|
+
case "T*":
|
|
171
|
+
// 4.2.1. Text information frames - details
|
|
172
|
+
case "GRP1":
|
|
173
|
+
// iTunes-specific ID3v2 grouping field
|
|
174
|
+
case "GP1":
|
|
175
|
+
// iTunes-specific ID3v2.2 grouping field
|
|
176
|
+
case "IPLS":
|
|
177
|
+
// v2.3: Involved people list
|
|
178
|
+
case "MVIN":
|
|
179
|
+
case "MVNM":
|
|
180
|
+
case "PCS":
|
|
181
|
+
case "PCST": {
|
|
182
|
+
let text;
|
|
183
|
+
try {
|
|
184
|
+
text = _FrameParser.trimNullPadding(decodeString(uint8Array.subarray(1), encoding));
|
|
185
|
+
} catch (error) {
|
|
186
|
+
if (error instanceof Error) {
|
|
187
|
+
this.warningCollector.addWarning(`id3v2.${this.major} type=${type} header has invalid string value: ${error.message}`);
|
|
188
|
+
break;
|
|
189
|
+
}
|
|
190
|
+
throw error;
|
|
191
|
+
}
|
|
192
|
+
switch (type) {
|
|
193
|
+
case "TMCL":
|
|
194
|
+
// Musician credits list
|
|
195
|
+
case "TIPL":
|
|
196
|
+
// Involved people list
|
|
197
|
+
case "IPLS":
|
|
198
|
+
output = _FrameParser.functionList(this.splitValue(type, text));
|
|
199
|
+
break;
|
|
200
|
+
case "TRK":
|
|
201
|
+
case "TRCK":
|
|
202
|
+
case "TPOS":
|
|
203
|
+
case "TIT1":
|
|
204
|
+
case "TIT2":
|
|
205
|
+
case "TIT3":
|
|
206
|
+
output = text;
|
|
207
|
+
break;
|
|
208
|
+
case "TCOM":
|
|
209
|
+
case "TEXT":
|
|
210
|
+
case "TOLY":
|
|
211
|
+
case "TOPE":
|
|
212
|
+
case "TPE1":
|
|
213
|
+
case "TSRC":
|
|
214
|
+
output = this.splitValue(type, text);
|
|
215
|
+
break;
|
|
216
|
+
case "TCO":
|
|
217
|
+
case "TCON":
|
|
218
|
+
output = this.splitValue(type, text).map((v) => parseGenre(v)).reduce((acc, val) => acc.concat(val), []);
|
|
219
|
+
break;
|
|
220
|
+
case "PCS":
|
|
221
|
+
case "PCST":
|
|
222
|
+
output = this.major >= 4 ? this.splitValue(type, text) : [text], output = Array.isArray(output) && output[0] === "" ? 1 : 0;
|
|
223
|
+
break;
|
|
224
|
+
default:
|
|
225
|
+
output = this.major >= 4 ? this.splitValue(type, text) : [text];
|
|
226
|
+
}
|
|
227
|
+
break;
|
|
228
|
+
}
|
|
229
|
+
case "TXXX": {
|
|
230
|
+
let idAndData = _FrameParser.readIdentifierAndData(uint8Array.subarray(1), encoding);
|
|
231
|
+
output = {
|
|
232
|
+
description: idAndData.id,
|
|
233
|
+
text: this.splitValue(type, decodeString(idAndData.data, encoding).replace(/\x00+$/, ""))
|
|
234
|
+
};
|
|
235
|
+
break;
|
|
236
|
+
}
|
|
237
|
+
case "PIC":
|
|
238
|
+
case "APIC":
|
|
239
|
+
if (includeCovers) {
|
|
240
|
+
let pic = {};
|
|
241
|
+
switch (uint8Array = uint8Array.subarray(1), this.major) {
|
|
242
|
+
case 2:
|
|
243
|
+
pic.format = decodeString(uint8Array.subarray(0, 3), "latin1"), uint8Array = uint8Array.subarray(3);
|
|
244
|
+
break;
|
|
245
|
+
case 3:
|
|
246
|
+
case 4:
|
|
247
|
+
fzero = findZero(uint8Array, defaultEnc), pic.format = decodeString(uint8Array.subarray(0, fzero), defaultEnc), uint8Array = uint8Array.subarray(fzero + 1);
|
|
248
|
+
break;
|
|
249
|
+
default:
|
|
250
|
+
throw makeUnexpectedMajorVersionError2(this.major);
|
|
251
|
+
}
|
|
252
|
+
pic.format = _FrameParser.fixPictureMimeType(pic.format), pic.type = AttachedPictureType[uint8Array[0]], uint8Array = uint8Array.subarray(1), fzero = findZero(uint8Array, encoding), pic.description = decodeString(uint8Array.subarray(0, fzero), encoding), uint8Array = uint8Array.subarray(fzero + nullTerminatorLength), pic.data = uint8Array, output = pic;
|
|
253
|
+
}
|
|
254
|
+
break;
|
|
255
|
+
case "CNT":
|
|
256
|
+
case "PCNT":
|
|
257
|
+
output = decodeUintBE(uint8Array);
|
|
258
|
+
break;
|
|
259
|
+
case "SYLT": {
|
|
260
|
+
let syltHeader = SyncTextHeader.get(uint8Array, 0);
|
|
261
|
+
uint8Array = uint8Array.subarray(SyncTextHeader.len);
|
|
262
|
+
let result = {
|
|
263
|
+
descriptor: "",
|
|
264
|
+
language: syltHeader.language,
|
|
265
|
+
contentType: syltHeader.contentType,
|
|
266
|
+
timeStampFormat: syltHeader.timeStampFormat,
|
|
267
|
+
syncText: []
|
|
268
|
+
}, readSyllables = !1;
|
|
269
|
+
for (; uint8Array.length > 0; ) {
|
|
270
|
+
let nullStr = _FrameParser.readNullTerminatedString(uint8Array, syltHeader.encoding);
|
|
271
|
+
if (uint8Array = uint8Array.subarray(nullStr.len), readSyllables) {
|
|
272
|
+
let timestamp = UINT32_BE.get(uint8Array, 0);
|
|
273
|
+
uint8Array = uint8Array.subarray(UINT32_BE.len), result.syncText.push({
|
|
274
|
+
text: nullStr.text,
|
|
275
|
+
timestamp
|
|
276
|
+
});
|
|
277
|
+
} else
|
|
278
|
+
result.descriptor = nullStr.text, readSyllables = !0;
|
|
279
|
+
}
|
|
280
|
+
output = result;
|
|
281
|
+
break;
|
|
282
|
+
}
|
|
283
|
+
case "ULT":
|
|
284
|
+
case "USLT":
|
|
285
|
+
case "COM":
|
|
286
|
+
case "COMM": {
|
|
287
|
+
let textHeader = TextHeader.get(uint8Array, offset);
|
|
288
|
+
offset += TextHeader.len;
|
|
289
|
+
let descriptorStr = _FrameParser.readNullTerminatedString(uint8Array.subarray(offset), textHeader.encoding);
|
|
290
|
+
offset += descriptorStr.len;
|
|
291
|
+
let textStr = _FrameParser.readNullTerminatedString(uint8Array.subarray(offset), textHeader.encoding);
|
|
292
|
+
output = {
|
|
293
|
+
language: textHeader.language,
|
|
294
|
+
descriptor: descriptorStr.text,
|
|
295
|
+
text: textStr.text
|
|
296
|
+
};
|
|
297
|
+
break;
|
|
298
|
+
}
|
|
299
|
+
case "UFID": {
|
|
300
|
+
let ufid = _FrameParser.readIdentifierAndData(uint8Array, defaultEnc);
|
|
301
|
+
output = { owner_identifier: ufid.id, identifier: ufid.data };
|
|
302
|
+
break;
|
|
303
|
+
}
|
|
304
|
+
case "PRIV": {
|
|
305
|
+
let priv = _FrameParser.readIdentifierAndData(uint8Array, defaultEnc);
|
|
306
|
+
output = { owner_identifier: priv.id, data: priv.data };
|
|
307
|
+
break;
|
|
308
|
+
}
|
|
309
|
+
case "POPM": {
|
|
310
|
+
uint8Array = uint8Array.subarray(offset);
|
|
311
|
+
let emailStr = _FrameParser.readNullTerminatedString(uint8Array, urlEnc), email = emailStr.text;
|
|
312
|
+
if (uint8Array = uint8Array.subarray(emailStr.len), uint8Array.length === 0) {
|
|
313
|
+
this.warningCollector.addWarning(`id3v2.${this.major} type=${type} POPM frame missing rating byte`), output = { email, rating: 0, counter: void 0 };
|
|
314
|
+
break;
|
|
315
|
+
}
|
|
316
|
+
let rating = UINT8.get(uint8Array, 0), counterBytes = uint8Array.subarray(UINT8.len);
|
|
317
|
+
output = {
|
|
318
|
+
email,
|
|
319
|
+
rating,
|
|
320
|
+
counter: counterBytes.length > 0 ? decodeUintBE(counterBytes) : void 0
|
|
321
|
+
};
|
|
322
|
+
break;
|
|
323
|
+
}
|
|
324
|
+
case "GEOB": {
|
|
325
|
+
let encoding2 = TextEncodingToken.get(uint8Array, 0);
|
|
326
|
+
uint8Array = uint8Array.subarray(1);
|
|
327
|
+
let mimeTypeStr = _FrameParser.readNullTerminatedString(uint8Array, urlEnc), mimeType = mimeTypeStr.text;
|
|
328
|
+
uint8Array = uint8Array.subarray(mimeTypeStr.len);
|
|
329
|
+
let filenameStr = _FrameParser.readNullTerminatedString(uint8Array, encoding2), filename = filenameStr.text;
|
|
330
|
+
uint8Array = uint8Array.subarray(filenameStr.len);
|
|
331
|
+
let descriptionStr = _FrameParser.readNullTerminatedString(uint8Array, encoding2), description = descriptionStr.text;
|
|
332
|
+
uint8Array = uint8Array.subarray(descriptionStr.len), output = {
|
|
333
|
+
type: mimeType,
|
|
334
|
+
filename,
|
|
335
|
+
description,
|
|
336
|
+
data: uint8Array
|
|
337
|
+
};
|
|
338
|
+
break;
|
|
339
|
+
}
|
|
340
|
+
// W-Frames:
|
|
341
|
+
case "WCOM":
|
|
342
|
+
case "WCOP":
|
|
343
|
+
case "WOAF":
|
|
344
|
+
case "WOAR":
|
|
345
|
+
case "WOAS":
|
|
346
|
+
case "WORS":
|
|
347
|
+
case "WPAY":
|
|
348
|
+
case "WPUB":
|
|
349
|
+
output = _FrameParser.readNullTerminatedString(uint8Array, urlEnc).text;
|
|
350
|
+
break;
|
|
351
|
+
case "WXXX": {
|
|
352
|
+
let encoding2 = TextEncodingToken.get(uint8Array, 0);
|
|
353
|
+
uint8Array = uint8Array.subarray(1);
|
|
354
|
+
let descriptionStr = _FrameParser.readNullTerminatedString(uint8Array, encoding2), description = descriptionStr.text;
|
|
355
|
+
uint8Array = uint8Array.subarray(descriptionStr.len), output = { description, url: _FrameParser.trimNullPadding(decodeString(uint8Array, defaultEnc)) };
|
|
356
|
+
break;
|
|
357
|
+
}
|
|
358
|
+
case "WFD":
|
|
359
|
+
case "WFED": {
|
|
360
|
+
let encoding2 = TextEncodingToken.get(uint8Array, 0);
|
|
361
|
+
uint8Array = uint8Array.subarray(1), output = _FrameParser.readNullTerminatedString(uint8Array, encoding2).text;
|
|
362
|
+
break;
|
|
363
|
+
}
|
|
364
|
+
case "MCDI": {
|
|
365
|
+
output = uint8Array.subarray(0, length);
|
|
366
|
+
break;
|
|
367
|
+
}
|
|
368
|
+
// ID3v2 Chapters 1.0
|
|
369
|
+
// https://mutagen-specs.readthedocs.io/en/latest/id3/id3v2-chapters-1.0.html#chapter-frame
|
|
370
|
+
case "CHAP": {
|
|
371
|
+
debug("Reading CHAP"), fzero = findZero(uint8Array, defaultEnc);
|
|
372
|
+
let chapter = {
|
|
373
|
+
label: decodeString(uint8Array.subarray(0, fzero), defaultEnc),
|
|
374
|
+
info: ChapterInfo.get(uint8Array, fzero + 1),
|
|
375
|
+
frames: /* @__PURE__ */ new Map()
|
|
376
|
+
};
|
|
377
|
+
for (offset += fzero + 1 + ChapterInfo.len; offset < length; ) {
|
|
378
|
+
let subFrame = readFrameHeader(uint8Array.subarray(offset), this.major, this.warningCollector), headerSize = getFrameHeaderLength(this.major);
|
|
379
|
+
offset += headerSize;
|
|
380
|
+
let subOutput = this.readData(uint8Array.subarray(offset, offset + subFrame.length), subFrame.id, includeCovers);
|
|
381
|
+
offset += subFrame.length, chapter.frames.set(subFrame.id, subOutput);
|
|
382
|
+
}
|
|
383
|
+
output = chapter;
|
|
384
|
+
break;
|
|
385
|
+
}
|
|
386
|
+
// ID3v2 Chapters 1.0
|
|
387
|
+
// https://mutagen-specs.readthedocs.io/en/latest/id3/id3v2-chapters-1.0.html#table-of-contents-frame
|
|
388
|
+
case "CTOC": {
|
|
389
|
+
debug("Reading CTOC");
|
|
390
|
+
let idEnd = findZero(uint8Array, defaultEnc), label = decodeString(uint8Array.subarray(0, idEnd), defaultEnc);
|
|
391
|
+
offset = idEnd + 1;
|
|
392
|
+
let flags = uint8Array[offset++], topLevel = (flags & 2) !== 0, ordered = (flags & 1) !== 0, entryCount = uint8Array[offset++], childElementIds = [];
|
|
393
|
+
for (let i = 0; i < entryCount && offset < length; i++) {
|
|
394
|
+
let end = findZero(uint8Array.subarray(offset), defaultEnc), childId = decodeString(uint8Array.subarray(offset, offset + end), defaultEnc);
|
|
395
|
+
childElementIds.push(childId), offset += end + 1;
|
|
396
|
+
}
|
|
397
|
+
let toc = {
|
|
398
|
+
label,
|
|
399
|
+
flags: { topLevel, ordered },
|
|
400
|
+
childElementIds,
|
|
401
|
+
frames: /* @__PURE__ */ new Map()
|
|
402
|
+
};
|
|
403
|
+
for (; offset < length; ) {
|
|
404
|
+
let subFrame = readFrameHeader(uint8Array.subarray(offset), this.major, this.warningCollector), headerSize = getFrameHeaderLength(this.major);
|
|
405
|
+
offset += headerSize;
|
|
406
|
+
let subOutput = this.readData(uint8Array.subarray(offset, offset + subFrame.length), subFrame.id, includeCovers);
|
|
407
|
+
offset += subFrame.length, toc.frames.set(subFrame.id, subOutput);
|
|
408
|
+
}
|
|
409
|
+
output = toc;
|
|
410
|
+
break;
|
|
411
|
+
}
|
|
412
|
+
default:
|
|
413
|
+
debug(`Warning: unsupported id3v2-tag-type: ${type}`);
|
|
414
|
+
break;
|
|
415
|
+
}
|
|
416
|
+
return output;
|
|
417
|
+
}
|
|
418
|
+
static readNullTerminatedString(uint8Array, encoding) {
|
|
419
|
+
let bomSize = encoding.bom ? 2 : 0, originalLen = uint8Array.length, valueArray = uint8Array.subarray(bomSize), zeroIndex = findZero(valueArray, encoding.encoding);
|
|
420
|
+
if (zeroIndex >= valueArray.length)
|
|
421
|
+
return {
|
|
422
|
+
text: decodeString(uint8Array, encoding.encoding),
|
|
423
|
+
len: originalLen
|
|
424
|
+
};
|
|
425
|
+
let txt = uint8Array.subarray(0, bomSize + zeroIndex);
|
|
426
|
+
return {
|
|
427
|
+
text: decodeString(txt, encoding.encoding),
|
|
428
|
+
len: bomSize + zeroIndex + _FrameParser.getNullTerminatorLength(encoding.encoding)
|
|
429
|
+
};
|
|
430
|
+
}
|
|
431
|
+
static fixPictureMimeType(pictureType) {
|
|
432
|
+
switch (pictureType = pictureType.toLocaleLowerCase(), pictureType) {
|
|
433
|
+
case "jpg":
|
|
434
|
+
return "image/jpeg";
|
|
435
|
+
case "png":
|
|
436
|
+
return "image/png";
|
|
437
|
+
}
|
|
438
|
+
return pictureType;
|
|
439
|
+
}
|
|
440
|
+
/**
|
|
441
|
+
* Converts TMCL (Musician credits list) or TIPL (Involved people list)
|
|
442
|
+
* @param entries
|
|
443
|
+
*/
|
|
444
|
+
static functionList(entries) {
|
|
445
|
+
let res = {};
|
|
446
|
+
for (let i = 0; i + 1 < entries.length; i += 2) {
|
|
447
|
+
let names = entries[i + 1].split(",");
|
|
448
|
+
res[entries[i]] = res[entries[i]] ? res[entries[i]].concat(names) : names;
|
|
449
|
+
}
|
|
450
|
+
return res;
|
|
451
|
+
}
|
|
452
|
+
/**
|
|
453
|
+
* id3v2.4 defines that multiple T* values are separated by 0x00
|
|
454
|
+
* id3v2.3 defines that TCOM, TEXT, TOLY, TOPE & TPE1 values are separated by /
|
|
455
|
+
* @param tag - Tag name
|
|
456
|
+
* @param text - Concatenated tag value
|
|
457
|
+
* @returns Split tag value
|
|
458
|
+
*/
|
|
459
|
+
splitValue(tag, text) {
|
|
460
|
+
let values;
|
|
461
|
+
return this.major < 4 ? (values = text.split(/\x00/g), values.length > 1 ? this.warningCollector.addWarning(`ID3v2.${this.major} ${tag} uses non standard null-separator.`) : values = text.split(/\//g)) : values = text.split(/\x00/g), _FrameParser.trimArray(values);
|
|
462
|
+
}
|
|
463
|
+
static trimArray(values) {
|
|
464
|
+
return values.map((value) => _FrameParser.trimNullPadding(value).trim());
|
|
465
|
+
}
|
|
466
|
+
static trimNullPadding(value) {
|
|
467
|
+
let end = value.length;
|
|
468
|
+
for (; end > 0 && value.charCodeAt(end - 1) === 0; )
|
|
469
|
+
end--;
|
|
470
|
+
return end === value.length ? value : value.slice(0, end);
|
|
471
|
+
}
|
|
472
|
+
static readIdentifierAndData(uint8Array, encoding) {
|
|
473
|
+
let idStr = _FrameParser.readNullTerminatedString(uint8Array, { encoding, bom: !1 });
|
|
474
|
+
return { id: idStr.text, data: uint8Array.subarray(idStr.len) };
|
|
475
|
+
}
|
|
476
|
+
static getNullTerminatorLength(enc) {
|
|
477
|
+
return enc.startsWith("utf-16") ? 2 : 1;
|
|
478
|
+
}
|
|
479
|
+
}, Id3v2ContentError = class extends makeUnexpectedFileContentError("id3v2") {
|
|
480
|
+
};
|
|
481
|
+
function makeUnexpectedMajorVersionError2(majorVer) {
|
|
482
|
+
throw new Id3v2ContentError(`Unexpected majorVer: ${majorVer}`);
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
// node_modules/music-metadata/lib/id3v2/ID3v2Parser.js
|
|
486
|
+
var ID3v2Parser = class _ID3v2Parser {
|
|
487
|
+
constructor() {
|
|
488
|
+
this.tokenizer = void 0, this.id3Header = void 0, this.metadata = void 0, this.headerType = void 0, this.options = void 0;
|
|
489
|
+
}
|
|
490
|
+
static removeUnsyncBytes(buffer) {
|
|
491
|
+
let readI = 0, writeI = 0;
|
|
492
|
+
for (; readI < buffer.length - 1; )
|
|
493
|
+
readI !== writeI && (buffer[writeI] = buffer[readI]), readI += buffer[readI] === 255 && buffer[readI + 1] === 0 ? 2 : 1, writeI++;
|
|
494
|
+
return readI < buffer.length && (buffer[writeI++] = buffer[readI]), buffer.subarray(0, writeI);
|
|
495
|
+
}
|
|
496
|
+
static readFrameData(uint8Array, frameHeader, majorVer, includeCovers, warningCollector) {
|
|
497
|
+
let frameParser = new FrameParser(majorVer, warningCollector);
|
|
498
|
+
switch (majorVer) {
|
|
499
|
+
case 2:
|
|
500
|
+
return frameParser.readData(uint8Array, frameHeader.id, includeCovers);
|
|
501
|
+
case 3:
|
|
502
|
+
case 4:
|
|
503
|
+
return frameHeader.flags?.format.unsynchronisation && (uint8Array = _ID3v2Parser.removeUnsyncBytes(uint8Array)), frameHeader.flags?.format.data_length_indicator && (uint8Array = uint8Array.subarray(4, uint8Array.length)), frameParser.readData(uint8Array, frameHeader.id, includeCovers);
|
|
504
|
+
default:
|
|
505
|
+
throw makeUnexpectedMajorVersionError3(majorVer);
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
/**
|
|
509
|
+
* Create a combined tag key, of tag & description
|
|
510
|
+
* @param tag e.g.: COM
|
|
511
|
+
* @param description e.g. iTunPGAP
|
|
512
|
+
* @returns string e.g. COM:iTunPGAP
|
|
513
|
+
*/
|
|
514
|
+
static makeDescriptionTagName(tag, description) {
|
|
515
|
+
return tag + (description ? `:${description}` : "");
|
|
516
|
+
}
|
|
517
|
+
async parse(metadata, tokenizer, options) {
|
|
518
|
+
this.tokenizer = tokenizer, this.metadata = metadata, this.options = options;
|
|
519
|
+
let id3Header = await this.tokenizer.readToken(ID3v2Header);
|
|
520
|
+
if (id3Header.fileIdentifier !== "ID3")
|
|
521
|
+
throw new Id3v2ContentError("expected ID3-header file-identifier 'ID3' was not found");
|
|
522
|
+
this.id3Header = id3Header, this.headerType = `ID3v2.${id3Header.version.major}`, await (id3Header.flags.isExtendedHeader ? this.parseExtendedHeader() : this.parseId3Data(id3Header.size));
|
|
523
|
+
let chapters = _ID3v2Parser.mapId3v2Chapters(this.metadata.native[this.headerType]);
|
|
524
|
+
this.metadata.setFormat("chapters", chapters);
|
|
525
|
+
}
|
|
526
|
+
async parseExtendedHeader() {
|
|
527
|
+
let extendedHeader = await this.tokenizer.readToken(ExtendedHeader), dataRemaining = extendedHeader.size - ExtendedHeader.len;
|
|
528
|
+
return dataRemaining > 0 ? this.parseExtendedHeaderData(dataRemaining, extendedHeader.size) : this.parseId3Data(this.id3Header.size - extendedHeader.size);
|
|
529
|
+
}
|
|
530
|
+
async parseExtendedHeaderData(dataRemaining, extendedHeaderSize) {
|
|
531
|
+
return await this.tokenizer.ignore(dataRemaining), this.parseId3Data(this.id3Header.size - extendedHeaderSize);
|
|
532
|
+
}
|
|
533
|
+
async parseId3Data(dataLen) {
|
|
534
|
+
let uint8Array = await this.tokenizer.readToken(new Uint8ArrayType(dataLen));
|
|
535
|
+
for (let tag of this.parseMetadata(uint8Array))
|
|
536
|
+
tag.id === "TXXX" ? tag.value && await this.handleTag(tag, tag.value.text, () => tag.value.description) : await (Array.isArray(tag.value) ? Promise.all(tag.value.map((value) => this.addTag(tag.id, value))) : this.addTag(tag.id, tag.value));
|
|
537
|
+
}
|
|
538
|
+
async handleTag(tag, values, descriptor, resolveValue = (value) => value) {
|
|
539
|
+
await Promise.all(values.map((value) => this.addTag(_ID3v2Parser.makeDescriptionTagName(tag.id, descriptor(value)), resolveValue(value))));
|
|
540
|
+
}
|
|
541
|
+
async addTag(id, value) {
|
|
542
|
+
await this.metadata.addTag(this.headerType, id, value);
|
|
543
|
+
}
|
|
544
|
+
parseMetadata(data) {
|
|
545
|
+
let offset = 0, tags = [];
|
|
546
|
+
for (; offset !== data.length; ) {
|
|
547
|
+
let frameHeaderLength = getFrameHeaderLength(this.id3Header.version.major);
|
|
548
|
+
if (offset + frameHeaderLength > data.length) {
|
|
549
|
+
this.metadata.addWarning("Illegal ID3v2 tag length");
|
|
550
|
+
break;
|
|
551
|
+
}
|
|
552
|
+
let frameHeaderBytes = data.subarray(offset, offset + frameHeaderLength);
|
|
553
|
+
offset += frameHeaderLength;
|
|
554
|
+
let frameHeader = readFrameHeader(frameHeaderBytes, this.id3Header.version.major, this.metadata), frameDataBytes = data.subarray(offset, offset + frameHeader.length);
|
|
555
|
+
offset += frameHeader.length;
|
|
556
|
+
let values = _ID3v2Parser.readFrameData(frameDataBytes, frameHeader, this.id3Header.version.major, !this.options.skipCovers, this.metadata);
|
|
557
|
+
values && tags.push({ id: frameHeader.id, value: values });
|
|
558
|
+
}
|
|
559
|
+
return tags;
|
|
560
|
+
}
|
|
561
|
+
/**
|
|
562
|
+
* Convert parsed ID3v2 chapter frames (CHAP / CTOC) to generic `format.chapters`.
|
|
563
|
+
*
|
|
564
|
+
* This function expects the `native` tags already to contain parsed `CHAP` and `CTOC` frame values,
|
|
565
|
+
* as produced by `FrameParser.readData`.
|
|
566
|
+
*/
|
|
567
|
+
static mapId3v2Chapters(id3Tags) {
|
|
568
|
+
if (!id3Tags)
|
|
569
|
+
return;
|
|
570
|
+
let chapFrames = id3Tags.filter((t) => t.id === "CHAP");
|
|
571
|
+
if (!chapFrames?.length)
|
|
572
|
+
return;
|
|
573
|
+
let topLevelToc = id3Tags.filter((t) => t.id === "CTOC")?.find((t) => t.value.flags?.topLevel), chapterById = /* @__PURE__ */ new Map();
|
|
574
|
+
for (let chap of chapFrames)
|
|
575
|
+
chapterById.set(chap.value.label, chap.value);
|
|
576
|
+
let orderedIds = topLevelToc?.value.childElementIds, chapters = [], source = orderedIds ?? [...chapterById.keys()];
|
|
577
|
+
for (let id of source) {
|
|
578
|
+
let chap = chapterById.get(id);
|
|
579
|
+
if (!chap)
|
|
580
|
+
continue;
|
|
581
|
+
let frames = chap.frames, title = frames.get("TIT2");
|
|
582
|
+
title && chapters.push({
|
|
583
|
+
id,
|
|
584
|
+
title,
|
|
585
|
+
url: frames.get("WXXX"),
|
|
586
|
+
start: chap.info.startTime / 1e3,
|
|
587
|
+
end: chap.info.endTime / 1e3,
|
|
588
|
+
image: frames.get("APIC")
|
|
589
|
+
});
|
|
590
|
+
}
|
|
591
|
+
return orderedIds || chapters.sort((a, b) => a.start - b.start), chapters.length ? chapters : void 0;
|
|
592
|
+
}
|
|
593
|
+
};
|
|
594
|
+
function makeUnexpectedMajorVersionError3(majorVer) {
|
|
595
|
+
throw new Id3v2ContentError(`Unexpected majorVer: ${majorVer}`);
|
|
596
|
+
}
|
|
597
|
+
|
|
598
|
+
export {
|
|
599
|
+
ID3v2Parser
|
|
600
|
+
};
|