hls-streamer 2.2.0 → 3.1.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 (94) hide show
  1. package/README.md +105 -24
  2. package/dist/Interfaces/HlsStreamer.d.ts +4 -1
  3. package/dist/Interfaces/HlsStreamer.d.ts.map +1 -1
  4. package/dist/Libs/FileLib.d.ts +8 -1
  5. package/dist/Libs/FileLib.d.ts.map +1 -1
  6. package/dist/Libs/FileLib.js +35 -0
  7. package/dist/Libs/FileLib.js.map +1 -1
  8. package/dist/Libs/FormatDetector.d.ts +8 -0
  9. package/dist/Libs/FormatDetector.d.ts.map +1 -0
  10. package/dist/Libs/FormatDetector.js +70 -0
  11. package/dist/Libs/FormatDetector.js.map +1 -0
  12. package/dist/Parsers/AacParser.d.ts +15 -0
  13. package/dist/Parsers/AacParser.d.ts.map +1 -0
  14. package/dist/Parsers/AacParser.js +246 -0
  15. package/dist/Parsers/AacParser.js.map +1 -0
  16. package/dist/Parsers/FlacParser.d.ts +13 -0
  17. package/dist/Parsers/FlacParser.d.ts.map +1 -0
  18. package/dist/Parsers/FlacParser.js +200 -0
  19. package/dist/Parsers/FlacParser.js.map +1 -0
  20. package/dist/Parsers/IAudioParser.d.ts +31 -0
  21. package/dist/Parsers/IAudioParser.d.ts.map +1 -0
  22. package/dist/Parsers/IAudioParser.js +2 -0
  23. package/dist/Parsers/IAudioParser.js.map +1 -0
  24. package/dist/Parsers/Mp3Parser.d.ts +19 -0
  25. package/dist/Parsers/Mp3Parser.d.ts.map +1 -0
  26. package/dist/Parsers/Mp3Parser.js +270 -0
  27. package/dist/Parsers/Mp3Parser.js.map +1 -0
  28. package/dist/Parsers/OggParser.d.ts +11 -0
  29. package/dist/Parsers/OggParser.d.ts.map +1 -0
  30. package/dist/Parsers/OggParser.js +160 -0
  31. package/dist/Parsers/OggParser.js.map +1 -0
  32. package/dist/Parsers/ParserFactory.d.ts +10 -0
  33. package/dist/Parsers/ParserFactory.d.ts.map +1 -0
  34. package/dist/Parsers/ParserFactory.js +43 -0
  35. package/dist/Parsers/ParserFactory.js.map +1 -0
  36. package/dist/Parsers/WavParser.d.ts +9 -0
  37. package/dist/Parsers/WavParser.d.ts.map +1 -0
  38. package/dist/Parsers/WavParser.js +135 -0
  39. package/dist/Parsers/WavParser.js.map +1 -0
  40. package/dist/cjs/Interfaces/HlsStreamer.d.ts +4 -1
  41. package/dist/cjs/Interfaces/HlsStreamer.d.ts.map +1 -1
  42. package/dist/cjs/Libs/FileLib.d.ts +8 -1
  43. package/dist/cjs/Libs/FileLib.d.ts.map +1 -1
  44. package/dist/cjs/Libs/FileLib.js +35 -0
  45. package/dist/cjs/Libs/FileLib.js.map +1 -1
  46. package/dist/cjs/Libs/FormatDetector.d.ts +8 -0
  47. package/dist/cjs/Libs/FormatDetector.d.ts.map +1 -0
  48. package/dist/cjs/Libs/FormatDetector.js +74 -0
  49. package/dist/cjs/Libs/FormatDetector.js.map +1 -0
  50. package/dist/cjs/Parsers/AacParser.d.ts +15 -0
  51. package/dist/cjs/Parsers/AacParser.d.ts.map +1 -0
  52. package/dist/cjs/Parsers/AacParser.js +250 -0
  53. package/dist/cjs/Parsers/AacParser.js.map +1 -0
  54. package/dist/cjs/Parsers/FlacParser.d.ts +13 -0
  55. package/dist/cjs/Parsers/FlacParser.d.ts.map +1 -0
  56. package/dist/cjs/Parsers/FlacParser.js +204 -0
  57. package/dist/cjs/Parsers/FlacParser.js.map +1 -0
  58. package/dist/cjs/Parsers/IAudioParser.d.ts +31 -0
  59. package/dist/cjs/Parsers/IAudioParser.d.ts.map +1 -0
  60. package/dist/cjs/Parsers/IAudioParser.js +3 -0
  61. package/dist/cjs/Parsers/IAudioParser.js.map +1 -0
  62. package/dist/cjs/Parsers/Mp3Parser.d.ts +19 -0
  63. package/dist/cjs/Parsers/Mp3Parser.d.ts.map +1 -0
  64. package/dist/cjs/Parsers/Mp3Parser.js +274 -0
  65. package/dist/cjs/Parsers/Mp3Parser.js.map +1 -0
  66. package/dist/cjs/Parsers/OggParser.d.ts +11 -0
  67. package/dist/cjs/Parsers/OggParser.d.ts.map +1 -0
  68. package/dist/cjs/Parsers/OggParser.js +164 -0
  69. package/dist/cjs/Parsers/OggParser.js.map +1 -0
  70. package/dist/cjs/Parsers/ParserFactory.d.ts +10 -0
  71. package/dist/cjs/Parsers/ParserFactory.d.ts.map +1 -0
  72. package/dist/cjs/Parsers/ParserFactory.js +47 -0
  73. package/dist/cjs/Parsers/ParserFactory.js.map +1 -0
  74. package/dist/cjs/Parsers/WavParser.d.ts +9 -0
  75. package/dist/cjs/Parsers/WavParser.d.ts.map +1 -0
  76. package/dist/cjs/Parsers/WavParser.js +139 -0
  77. package/dist/cjs/Parsers/WavParser.js.map +1 -0
  78. package/dist/cjs/errors/HlsStreamerErrors.d.ts +3 -0
  79. package/dist/cjs/errors/HlsStreamerErrors.d.ts.map +1 -1
  80. package/dist/cjs/errors/HlsStreamerErrors.js +8 -1
  81. package/dist/cjs/errors/HlsStreamerErrors.js.map +1 -1
  82. package/dist/cjs/index.d.ts +1 -0
  83. package/dist/cjs/index.d.ts.map +1 -1
  84. package/dist/cjs/index.js +46 -12
  85. package/dist/cjs/index.js.map +1 -1
  86. package/dist/errors/HlsStreamerErrors.d.ts +3 -0
  87. package/dist/errors/HlsStreamerErrors.d.ts.map +1 -1
  88. package/dist/errors/HlsStreamerErrors.js +6 -0
  89. package/dist/errors/HlsStreamerErrors.js.map +1 -1
  90. package/dist/index.d.ts +1 -0
  91. package/dist/index.d.ts.map +1 -1
  92. package/dist/index.js +47 -13
  93. package/dist/index.js.map +1 -1
  94. package/package.json +10 -3
@@ -0,0 +1,270 @@
1
+ export class Mp3Parser {
2
+ getFormat() {
3
+ return 'mp3';
4
+ }
5
+ canParse(buffer) {
6
+ if (buffer.length < 2) {
7
+ return false;
8
+ }
9
+ if (buffer.length >= 10 && buffer.toString('ascii', 0, 3) === 'ID3') {
10
+ return true;
11
+ }
12
+ const byte1 = buffer[0];
13
+ const byte2 = buffer[1];
14
+ if (byte1 === 0xff && (byte2 & 0xe0) === 0xe0) {
15
+ const versionBits = (byte2 >> 3) & 0x3;
16
+ const layerBits = (byte2 >> 1) & 0x3;
17
+ return versionBits !== 0x1 && layerBits !== 0x0;
18
+ }
19
+ return false;
20
+ }
21
+ analyze(buffer, opts = {}) {
22
+ const warnings = [];
23
+ const size = opts.fileSize ?? buffer.length;
24
+ if (buffer.length === 0) {
25
+ return {
26
+ format: 'mp3',
27
+ size,
28
+ duration: 0,
29
+ audioDataSize: 0,
30
+ frames: []
31
+ };
32
+ }
33
+ const offsets = this.getId3Offsets(buffer);
34
+ const frames = [];
35
+ const payloadSize = Math.max(0, offsets.audioEnd - offsets.startOffset);
36
+ let offset = offsets.startOffset;
37
+ let frameIndex = 0;
38
+ let sampleRate;
39
+ let channels;
40
+ let totalDuration = 0;
41
+ let totalAudioBytes = 0;
42
+ while (offset + 4 <= offsets.audioEnd) {
43
+ if (!this.isFrameSync(buffer, offset)) {
44
+ offset++;
45
+ continue;
46
+ }
47
+ const header = buffer.readUInt32BE(offset);
48
+ const parsed = this.parseFrameHeader(header);
49
+ if (!parsed) {
50
+ offset++;
51
+ continue;
52
+ }
53
+ const frameLength = this.calculateFrameLength(parsed);
54
+ if (frameLength <= 0) {
55
+ warnings.push(`Encountered zero-length frame at offset ${offset}`);
56
+ offset++;
57
+ continue;
58
+ }
59
+ if (offset + frameLength > buffer.length) {
60
+ warnings.push(`Truncated frame at offset ${offset}`);
61
+ break;
62
+ }
63
+ sampleRate = sampleRate ?? parsed.sampleRate;
64
+ if (channels === undefined) {
65
+ const channelMode = (header >> 6) & 0x3;
66
+ channels = channelMode === 3 ? 1 : 2;
67
+ }
68
+ const frameDuration = parsed.samplesPerFrame / parsed.sampleRate;
69
+ frames.push({
70
+ index: frameIndex,
71
+ offset,
72
+ length: frameLength,
73
+ duration: frameDuration,
74
+ samples: parsed.samplesPerFrame,
75
+ sampleRate: parsed.sampleRate,
76
+ bitrate: parsed.bitrate
77
+ });
78
+ frameIndex++;
79
+ totalDuration += frameDuration;
80
+ totalAudioBytes += frameLength;
81
+ offset += frameLength;
82
+ }
83
+ if (frames.length === 0) {
84
+ const estimatedDuration = buffer.length / 16000;
85
+ warnings.push('Falling back to heuristic duration due to missing MP3 frames');
86
+ const metadata = {
87
+ format: 'mp3',
88
+ size,
89
+ duration: Math.max(0.001, estimatedDuration),
90
+ audioDataSize: payloadSize,
91
+ frames: []
92
+ };
93
+ if (warnings.length) {
94
+ metadata.warnings = warnings;
95
+ }
96
+ return metadata;
97
+ }
98
+ const duration = totalDuration;
99
+ const averageBitrate = duration > 0 ? (totalAudioBytes * 8) / duration / 1000 : undefined;
100
+ const metadata = {
101
+ format: 'mp3',
102
+ size,
103
+ duration,
104
+ audioDataSize: totalAudioBytes || payloadSize,
105
+ frames
106
+ };
107
+ if (sampleRate !== undefined) {
108
+ metadata.sampleRate = sampleRate;
109
+ }
110
+ if (channels !== undefined) {
111
+ metadata.channels = channels;
112
+ }
113
+ if (averageBitrate !== undefined) {
114
+ metadata.averageBitrate = averageBitrate;
115
+ }
116
+ if (offsets.id3v2Size > 0 || offsets.id3v1Size > 0) {
117
+ metadata.metadata = {};
118
+ if (offsets.id3v2Size > 0) {
119
+ metadata.metadata['id3v2Size'] = offsets.id3v2Size;
120
+ }
121
+ if (offsets.id3v1Size > 0) {
122
+ metadata.metadata['id3v1Size'] = offsets.id3v1Size;
123
+ }
124
+ }
125
+ if (warnings.length) {
126
+ metadata.warnings = warnings;
127
+ }
128
+ return metadata;
129
+ }
130
+ calculateFrameLength(frame) {
131
+ if (frame.layer === 1) {
132
+ return Math.floor(((12 * frame.bitrate * 1000) / frame.sampleRate + frame.padding) * 4);
133
+ }
134
+ const multiplier = frame.layer === 3 && frame.version !== 1 ? 72 : 144;
135
+ return Math.floor((multiplier * frame.bitrate * 1000) / frame.sampleRate + frame.padding);
136
+ }
137
+ getId3Offsets(buffer) {
138
+ let startOffset = 0;
139
+ let id3v2Size = 0;
140
+ if (buffer.length >= 10 && buffer.toString('ascii', 0, 3) === 'ID3') {
141
+ const sizeBytes = buffer.subarray(6, 10);
142
+ id3v2Size = this.syncSafeInteger(sizeBytes);
143
+ startOffset = Math.min(buffer.length, 10 + id3v2Size);
144
+ }
145
+ let id3v1Size = 0;
146
+ let audioEnd = buffer.length;
147
+ if (buffer.length >= 128) {
148
+ const tagOffset = buffer.length - 128;
149
+ if (buffer.toString('ascii', tagOffset, tagOffset + 3) === 'TAG') {
150
+ id3v1Size = 128;
151
+ audioEnd = tagOffset;
152
+ }
153
+ }
154
+ return {
155
+ startOffset,
156
+ id3v2Size,
157
+ audioEnd,
158
+ id3v1Size
159
+ };
160
+ }
161
+ syncSafeInteger(bytes) {
162
+ return ((bytes[0] & 0x7f) << 21) |
163
+ ((bytes[1] & 0x7f) << 14) |
164
+ ((bytes[2] & 0x7f) << 7) |
165
+ (bytes[3] & 0x7f);
166
+ }
167
+ isFrameSync(buffer, offset) {
168
+ const byte1 = buffer[offset];
169
+ const byte2 = buffer[offset + 1];
170
+ if (byte1 === undefined || byte2 === undefined) {
171
+ return false;
172
+ }
173
+ return byte1 === 0xff && (byte2 & 0xe0) === 0xe0;
174
+ }
175
+ parseFrameHeader(header) {
176
+ const versionBits = (header >> 19) & 0x3;
177
+ const layerBits = (header >> 17) & 0x3;
178
+ const bitrateIndex = (header >> 12) & 0xf;
179
+ const sampleRateIndex = (header >> 10) & 0x3;
180
+ const padding = ((header >> 9) & 0x1);
181
+ const version = this.decodeVersion(versionBits);
182
+ const layer = this.decodeLayer(layerBits);
183
+ if (!version || !layer) {
184
+ return null;
185
+ }
186
+ if (bitrateIndex === 0 || bitrateIndex === 15 || sampleRateIndex === 3) {
187
+ return null;
188
+ }
189
+ const bitrate = Mp3Parser.BITRATE_INDEX[version][layer][bitrateIndex];
190
+ const sampleRate = Mp3Parser.SAMPLE_RATE_INDEX[version][sampleRateIndex];
191
+ if (!bitrate || !sampleRate) {
192
+ return null;
193
+ }
194
+ const samplesPerFrame = this.getSamplesPerFrame(version, layer);
195
+ return {
196
+ version,
197
+ layer,
198
+ bitrate,
199
+ sampleRate,
200
+ padding,
201
+ samplesPerFrame
202
+ };
203
+ }
204
+ decodeVersion(bits) {
205
+ switch (bits) {
206
+ case 0b11:
207
+ return 1;
208
+ case 0b10:
209
+ return 2;
210
+ case 0b00:
211
+ return 25;
212
+ default:
213
+ return null;
214
+ }
215
+ }
216
+ decodeLayer(bits) {
217
+ switch (bits) {
218
+ case 0b11:
219
+ return 1;
220
+ case 0b10:
221
+ return 2;
222
+ case 0b01:
223
+ return 3;
224
+ default:
225
+ return null;
226
+ }
227
+ }
228
+ getSamplesPerFrame(version, layer) {
229
+ if (layer === 1) {
230
+ return 384;
231
+ }
232
+ if (layer === 2) {
233
+ return 1152;
234
+ }
235
+ return version === 1 ? 1152 : 576;
236
+ }
237
+ }
238
+ Object.defineProperty(Mp3Parser, "BITRATE_INDEX", {
239
+ enumerable: true,
240
+ configurable: true,
241
+ writable: true,
242
+ value: {
243
+ 1: {
244
+ 1: [0, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448],
245
+ 2: [0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384],
246
+ 3: [0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320]
247
+ },
248
+ 2: {
249
+ 1: [0, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256],
250
+ 2: [0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160],
251
+ 3: [0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160]
252
+ },
253
+ 25: {
254
+ 1: [0, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256],
255
+ 2: [0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160],
256
+ 3: [0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160]
257
+ }
258
+ }
259
+ });
260
+ Object.defineProperty(Mp3Parser, "SAMPLE_RATE_INDEX", {
261
+ enumerable: true,
262
+ configurable: true,
263
+ writable: true,
264
+ value: {
265
+ 1: [44100, 48000, 32000],
266
+ 2: [22050, 24000, 16000],
267
+ 25: [11025, 12000, 8000]
268
+ }
269
+ });
270
+ //# sourceMappingURL=Mp3Parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Mp3Parser.js","sourceRoot":"","sources":["../../src/Parsers/Mp3Parser.ts"],"names":[],"mappings":"AAsBA,MAAM,OAAO,SAAS;IAyBpB,SAAS;QACP,OAAO,KAAK,CAAC;IACf,CAAC;IAED,QAAQ,CAAC,MAAc;QACrB,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,OAAO,KAAK,CAAC;QACf,CAAC;QAGD,IAAI,MAAM,CAAC,MAAM,IAAI,EAAE,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC;YACpE,OAAO,IAAI,CAAC;QACd,CAAC;QAGD,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACxB,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACxB,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAM,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;YAC/C,MAAM,WAAW,GAAG,CAAC,KAAM,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC;YACxC,MAAM,SAAS,GAAG,CAAC,KAAM,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC;YACtC,OAAO,WAAW,KAAK,GAAG,IAAI,SAAS,KAAK,GAAG,CAAC;QAClD,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,CAAC,MAAc,EAAE,OAA8B,EAAE;QACtD,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,IAAI,MAAM,CAAC,MAAM,CAAC;QAE5C,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO;gBACL,MAAM,EAAE,KAAK;gBACb,IAAI;gBACJ,QAAQ,EAAE,CAAC;gBACX,aAAa,EAAE,CAAC;gBAChB,MAAM,EAAE,EAAE;aACX,CAAC;QACJ,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QAC3C,MAAM,MAAM,GAAqB,EAAE,CAAC;QACpC,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;QAExE,IAAI,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;QACjC,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,IAAI,UAA8B,CAAC;QACnC,IAAI,QAA4B,CAAC;QACjC,IAAI,aAAa,GAAG,CAAC,CAAC;QACtB,IAAI,eAAe,GAAG,CAAC,CAAC;QAExB,OAAO,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACtC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;gBACtC,MAAM,EAAE,CAAC;gBACT,SAAS;YACX,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;YAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;YAE7C,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,EAAE,CAAC;gBACT,SAAS;YACX,CAAC;YAED,MAAM,WAAW,GAAG,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;YAEtD,IAAI,WAAW,IAAI,CAAC,EAAE,CAAC;gBACrB,QAAQ,CAAC,IAAI,CAAC,2CAA2C,MAAM,EAAE,CAAC,CAAC;gBACnE,MAAM,EAAE,CAAC;gBACT,SAAS;YACX,CAAC;YAGD,IAAI,MAAM,GAAG,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;gBACzC,QAAQ,CAAC,IAAI,CAAC,6BAA6B,MAAM,EAAE,CAAC,CAAC;gBACrD,MAAM;YACR,CAAC;YAED,UAAU,GAAG,UAAU,IAAI,MAAM,CAAC,UAAU,CAAC;YAG7C,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAC3B,MAAM,WAAW,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC;gBACxC,QAAQ,GAAG,WAAW,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACvC,CAAC;YAED,MAAM,aAAa,GAAG,MAAM,CAAC,eAAe,GAAG,MAAM,CAAC,UAAU,CAAC;YAEjE,MAAM,CAAC,IAAI,CAAC;gBACV,KAAK,EAAE,UAAU;gBACjB,MAAM;gBACN,MAAM,EAAE,WAAW;gBACnB,QAAQ,EAAE,aAAa;gBACvB,OAAO,EAAE,MAAM,CAAC,eAAe;gBAC/B,UAAU,EAAE,MAAM,CAAC,UAAU;gBAC7B,OAAO,EAAE,MAAM,CAAC,OAAO;aACxB,CAAC,CAAC;YAEH,UAAU,EAAE,CAAC;YACb,aAAa,IAAI,aAAa,CAAC;YAC/B,eAAe,IAAI,WAAW,CAAC;YAC/B,MAAM,IAAI,WAAW,CAAC;QACxB,CAAC;QAED,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC;YAChD,QAAQ,CAAC,IAAI,CAAC,8DAA8D,CAAC,CAAC;YAC9E,MAAM,QAAQ,GAAkB;gBAC9B,MAAM,EAAE,KAAK;gBACb,IAAI;gBACJ,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,iBAAiB,CAAC;gBAC5C,aAAa,EAAE,WAAW;gBAC1B,MAAM,EAAE,EAAE;aACX,CAAC;YAEF,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;gBACpB,QAAQ,CAAC,QAAQ,GAAG,QAAQ,CAAC;YAC/B,CAAC;YAED,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,MAAM,QAAQ,GAAG,aAAa,CAAC;QAC/B,MAAM,cAAc,GAAG,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,eAAe,GAAG,CAAC,CAAC,GAAG,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;QAE1F,MAAM,QAAQ,GAAkB;YAC9B,MAAM,EAAE,KAAK;YACb,IAAI;YACJ,QAAQ;YACR,aAAa,EAAE,eAAe,IAAI,WAAW;YAC7C,MAAM;SACP,CAAC;QAEF,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAC7B,QAAQ,CAAC,UAAU,GAAG,UAAU,CAAC;QACnC,CAAC;QAED,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,QAAQ,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAC/B,CAAC;QAED,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;YACjC,QAAQ,CAAC,cAAc,GAAG,cAAc,CAAC;QAC3C,CAAC;QAED,IAAI,OAAO,CAAC,SAAS,GAAG,CAAC,IAAI,OAAO,CAAC,SAAS,GAAG,CAAC,EAAE,CAAC;YACnD,QAAQ,CAAC,QAAQ,GAAG,EAAE,CAAC;YACvB,IAAI,OAAO,CAAC,SAAS,GAAG,CAAC,EAAE,CAAC;gBAC1B,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC;YACrD,CAAC;YACD,IAAI,OAAO,CAAC,SAAS,GAAG,CAAC,EAAE,CAAC;gBAC1B,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC;YACrD,CAAC;QACH,CAAC;QAED,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;YACpB,QAAQ,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAC/B,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAEO,oBAAoB,CAAC,KAAwB;QACnD,IAAI,KAAK,CAAC,KAAK,KAAK,CAAC,EAAE,CAAC;YACtB,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1F,CAAC;QAED,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,KAAK,CAAC,IAAI,KAAK,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;QACvE,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,UAAU,GAAG,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;IAC5F,CAAC;IAEO,aAAa,CAAC,MAAc;QAClC,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,IAAI,SAAS,GAAG,CAAC,CAAC;QAElB,IAAI,MAAM,CAAC,MAAM,IAAI,EAAE,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC;YACpE,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACzC,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;YAC5C,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,GAAG,SAAS,CAAC,CAAC;QACxD,CAAC;QAGD,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,IAAI,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC;QAE7B,IAAI,MAAM,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;YACzB,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC;YACtC,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,GAAG,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC;gBACjE,SAAS,GAAG,GAAG,CAAC;gBAChB,QAAQ,GAAG,SAAS,CAAC;YACvB,CAAC;QACH,CAAC;QAED,OAAO;YACL,WAAW;YACX,SAAS;YACT,QAAQ;YACR,SAAS;SACV,CAAC;IACJ,CAAC;IAEO,eAAe,CAAC,KAAa;QACnC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,CAAE,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAC1B,CAAC,CAAC,KAAK,CAAC,CAAC,CAAE,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAC1B,CAAC,CAAC,KAAK,CAAC,CAAC,CAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;YACzB,CAAC,KAAK,CAAC,CAAC,CAAE,GAAG,IAAI,CAAC,CAAC;IAC5B,CAAC;IAEO,WAAW,CAAC,MAAc,EAAE,MAAc;QAChD,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;QAC7B,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAEjC,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YAC/C,OAAO,KAAK,CAAC;QACf,CAAC;QAED,OAAO,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,CAAC;IACnD,CAAC;IAEO,gBAAgB,CAAC,MAAc;QACrC,MAAM,WAAW,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,GAAG,GAAG,CAAC;QACzC,MAAM,SAAS,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,GAAG,GAAG,CAAC;QACvC,MAAM,YAAY,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,GAAG,GAAG,CAAC;QAC1C,MAAM,eAAe,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,GAAG,GAAG,CAAC;QAC7C,MAAM,OAAO,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,GAAG,CAAU,CAAC;QAE/C,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;QAChD,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;QAE1C,IAAI,CAAC,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC;YACvB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,YAAY,KAAK,CAAC,IAAI,YAAY,KAAK,EAAE,IAAI,eAAe,KAAK,CAAC,EAAE,CAAC;YACvE,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,OAAO,GAAG,SAAS,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC;QACtE,MAAM,UAAU,GAAG,SAAS,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,eAAe,CAAC,CAAC;QAEzE,IAAI,CAAC,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,eAAe,GAAG,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAEhE,OAAO;YACL,OAAO;YACP,KAAK;YACL,OAAO;YACP,UAAU;YACV,OAAO;YACP,eAAe;SAChB,CAAC;IACJ,CAAC;IAEO,aAAa,CAAC,IAAY;QAChC,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,IAAI;gBACP,OAAO,CAAC,CAAC;YACX,KAAK,IAAI;gBACP,OAAO,CAAC,CAAC;YACX,KAAK,IAAI;gBACP,OAAO,EAAE,CAAC;YACZ;gBACE,OAAO,IAAI,CAAC;QAChB,CAAC;IACH,CAAC;IAEO,WAAW,CAAC,IAAY;QAC9B,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,IAAI;gBACP,OAAO,CAAC,CAAC;YACX,KAAK,IAAI;gBACP,OAAO,CAAC,CAAC;YACX,KAAK,IAAI;gBACP,OAAO,CAAC,CAAC;YACX;gBACE,OAAO,IAAI,CAAC;QAChB,CAAC;IACH,CAAC;IAEO,kBAAkB,CAAC,OAAmB,EAAE,KAAgB;QAC9D,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;YAChB,OAAO,GAAG,CAAC;QACb,CAAC;QAED,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;YAChB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;IACpC,CAAC;;AA7TuB;;;;WAAiE;QACvF,CAAC,EAAE;YACD,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;YACzE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;YACtE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;SACtE;QACD,CAAC,EAAE;YACD,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;YACtE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;YACjE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;SAClE;QACD,EAAE,EAAE;YACF,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;YACtE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;YACjE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;SAClE;KACF;GAAC;AAEsB;;;;WAAkD;QACxE,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC;QACxB,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC;QACxB,EAAE,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC;KACzB;GAAC"}
@@ -0,0 +1,11 @@
1
+ import { IAudioParser, AudioFileInfo, AudioFormat } from './IAudioParser';
2
+ export declare class OggParser implements IAudioParser {
3
+ private static readonly OGG_SIGNATURE;
4
+ getFormat(): AudioFormat;
5
+ canParse(buffer: Buffer): boolean;
6
+ analyze(buffer: Buffer, opts?: {
7
+ fileSize?: number;
8
+ }): AudioFileInfo;
9
+ private parseVorbisIdHeader;
10
+ }
11
+ //# sourceMappingURL=OggParser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OggParser.d.ts","sourceRoot":"","sources":["../../src/Parsers/OggParser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAkB,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAM1F,qBAAa,SAAU,YAAW,YAAY;IAC5C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAU;IAE/C,SAAS,IAAI,WAAW;IAIxB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAIjC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAO,GAAG,aAAa;IAwKxE,OAAO,CAAC,mBAAmB;CAkC5B"}
@@ -0,0 +1,160 @@
1
+ export class OggParser {
2
+ getFormat() {
3
+ return 'ogg';
4
+ }
5
+ canParse(buffer) {
6
+ return buffer.length >= 4 && buffer.toString('ascii', 0, 4) === OggParser.OGG_SIGNATURE;
7
+ }
8
+ analyze(buffer, opts = {}) {
9
+ const warnings = [];
10
+ const size = opts.fileSize ?? buffer.length;
11
+ if (!this.canParse(buffer)) {
12
+ return {
13
+ format: 'ogg',
14
+ size,
15
+ duration: 0,
16
+ audioDataSize: 0,
17
+ frames: [],
18
+ warnings: ['Not a valid OGG file']
19
+ };
20
+ }
21
+ const pages = [];
22
+ let offset = 0;
23
+ let vorbisInfo = null;
24
+ while (offset + 27 <= buffer.length) {
25
+ if (buffer.toString('ascii', offset, offset + 4) !== OggParser.OGG_SIGNATURE) {
26
+ offset++;
27
+ continue;
28
+ }
29
+ const version = buffer[offset + 4];
30
+ const headerType = buffer[offset + 5];
31
+ const granulePosition = buffer.readBigUInt64LE(offset + 6);
32
+ const serialNumber = buffer.readUInt32LE(offset + 14);
33
+ const pageSequence = buffer.readUInt32LE(offset + 18);
34
+ const checksum = buffer.readUInt32LE(offset + 22);
35
+ const numSegments = buffer[offset + 26];
36
+ if (version !== 0) {
37
+ warnings.push(`Unknown OGG version: ${version}`);
38
+ offset++;
39
+ continue;
40
+ }
41
+ if (offset + 27 + numSegments > buffer.length) {
42
+ warnings.push('Truncated page header');
43
+ break;
44
+ }
45
+ const segmentTable = buffer.subarray(offset + 27, offset + 27 + numSegments);
46
+ const bodySize = segmentTable.reduce((sum, len) => sum + len, 0);
47
+ const headerSize = 27 + numSegments;
48
+ const isFirstPage = (headerType & 0x02) !== 0;
49
+ const isContinued = (headerType & 0x01) !== 0;
50
+ pages.push({
51
+ offset,
52
+ headerSize,
53
+ bodySize,
54
+ granulePosition,
55
+ serialNumber: serialNumber,
56
+ pageSequence: pageSequence,
57
+ isFirstPage,
58
+ isContinued
59
+ });
60
+ if (isFirstPage && !vorbisInfo && offset + headerSize + 30 <= buffer.length) {
61
+ const packetData = buffer.subarray(offset + headerSize, offset + headerSize + bodySize);
62
+ vorbisInfo = this.parseVorbisIdHeader(packetData);
63
+ }
64
+ offset += headerSize + bodySize;
65
+ }
66
+ if (pages.length === 0) {
67
+ return {
68
+ format: 'ogg',
69
+ size,
70
+ duration: 0,
71
+ audioDataSize: 0,
72
+ frames: [],
73
+ warnings: ['No valid OGG pages found']
74
+ };
75
+ }
76
+ const lastPage = pages[pages.length - 1];
77
+ const totalSamples = lastPage ? Number(lastPage.granulePosition) : 0;
78
+ const sampleRate = vorbisInfo?.sampleRate || 48000;
79
+ const duration = totalSamples > 0 && sampleRate > 0 ? totalSamples / sampleRate : 0;
80
+ const audioDataSize = pages.reduce((sum, page) => sum + page.bodySize, 0);
81
+ const averageBitrate = duration > 0
82
+ ? (audioDataSize * 8) / duration / 1000
83
+ : vorbisInfo?.bitrateNominal ? vorbisInfo.bitrateNominal / 1000 : undefined;
84
+ const frames = [];
85
+ let previousGranule = 0n;
86
+ for (let i = 0; i < pages.length; i++) {
87
+ const page = pages[i];
88
+ const currentGranule = Number(page.granulePosition);
89
+ const samplesInPage = currentGranule - Number(previousGranule);
90
+ const pageDuration = samplesInPage > 0 && sampleRate > 0
91
+ ? samplesInPage / sampleRate
92
+ : 0;
93
+ frames.push({
94
+ index: i,
95
+ offset: page.offset + page.headerSize,
96
+ length: page.bodySize,
97
+ duration: pageDuration,
98
+ samples: Math.max(0, samplesInPage),
99
+ sampleRate,
100
+ bitrate: Math.round(averageBitrate || 0)
101
+ });
102
+ if (page.granulePosition !== -1n) {
103
+ previousGranule = page.granulePosition;
104
+ }
105
+ }
106
+ const metadata = {
107
+ format: 'ogg',
108
+ size,
109
+ duration,
110
+ audioDataSize,
111
+ frames
112
+ };
113
+ if (vorbisInfo) {
114
+ metadata.sampleRate = vorbisInfo.sampleRate;
115
+ metadata.channels = vorbisInfo.channels;
116
+ if (averageBitrate !== undefined) {
117
+ metadata.averageBitrate = averageBitrate;
118
+ }
119
+ metadata.metadata = {
120
+ bitrateNominal: vorbisInfo.bitrateNominal,
121
+ totalPages: pages.length
122
+ };
123
+ }
124
+ if (warnings.length > 0) {
125
+ metadata.warnings = warnings;
126
+ }
127
+ return metadata;
128
+ }
129
+ parseVorbisIdHeader(packet) {
130
+ if (packet.length < 30) {
131
+ return null;
132
+ }
133
+ const packetType = packet[0];
134
+ const vorbisSignature = packet.toString('ascii', 1, 7);
135
+ if (packetType !== 1 || vorbisSignature !== 'vorbis') {
136
+ return null;
137
+ }
138
+ const version = packet.readUInt32LE(7);
139
+ if (version !== 0) {
140
+ return null;
141
+ }
142
+ const channels = packet[11];
143
+ const sampleRate = packet.readUInt32LE(12);
144
+ const bitrateMaximum = packet.readUInt32LE(16);
145
+ const bitrateNominal = packet.readUInt32LE(20);
146
+ const bitrateMinimum = packet.readUInt32LE(24);
147
+ return {
148
+ channels: channels,
149
+ sampleRate: sampleRate,
150
+ bitrateNominal: bitrateNominal || bitrateMaximum || 128000
151
+ };
152
+ }
153
+ }
154
+ Object.defineProperty(OggParser, "OGG_SIGNATURE", {
155
+ enumerable: true,
156
+ configurable: true,
157
+ writable: true,
158
+ value: 'OggS'
159
+ });
160
+ //# sourceMappingURL=OggParser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OggParser.js","sourceRoot":"","sources":["../../src/Parsers/OggParser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { IAudioParser, AudioFormat } from './IAudioParser';
2
+ export declare class ParserFactory {
3
+ private static parsers;
4
+ static getParser(format: AudioFormat): IAudioParser | null;
5
+ static detectParser(buffer: Buffer): IAudioParser | null;
6
+ static getParserByExtension(filePath: string): IAudioParser | null;
7
+ static getSupportedFormats(): AudioFormat[];
8
+ static isFormatSupported(format: string): boolean;
9
+ }
10
+ //# sourceMappingURL=ParserFactory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ParserFactory.d.ts","sourceRoot":"","sources":["../../src/Parsers/ParserFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAW3D,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAC,OAAO,CAMpB;IAOF,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,WAAW,GAAG,YAAY,GAAG,IAAI;IAY1D,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI;IAgBxD,MAAM,CAAC,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI;IAQlE,MAAM,CAAC,mBAAmB,IAAI,WAAW,EAAE;IAO3C,MAAM,CAAC,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;CAGlD"}
@@ -0,0 +1,43 @@
1
+ import { Mp3Parser } from './Mp3Parser';
2
+ import { AacParser } from './AacParser';
3
+ import { OggParser } from './OggParser';
4
+ import { FlacParser } from './FlacParser';
5
+ import { WavParser } from './WavParser';
6
+ import { FormatDetector } from '../Libs/FormatDetector';
7
+ export class ParserFactory {
8
+ static getParser(format) {
9
+ const searchFormat = format === 'm4a' ? 'aac' : format;
10
+ return this.parsers.find(parser => parser.getFormat() === searchFormat) || null;
11
+ }
12
+ static detectParser(buffer) {
13
+ for (const parser of this.parsers) {
14
+ if (parser.canParse(buffer)) {
15
+ return parser;
16
+ }
17
+ }
18
+ return null;
19
+ }
20
+ static getParserByExtension(filePath) {
21
+ const format = FormatDetector.detectFormatFromExtension(filePath);
22
+ return format ? this.getParser(format) : null;
23
+ }
24
+ static getSupportedFormats() {
25
+ return ['mp3', 'aac', 'm4a', 'ogg', 'flac', 'wav'];
26
+ }
27
+ static isFormatSupported(format) {
28
+ return this.getSupportedFormats().includes(format);
29
+ }
30
+ }
31
+ Object.defineProperty(ParserFactory, "parsers", {
32
+ enumerable: true,
33
+ configurable: true,
34
+ writable: true,
35
+ value: [
36
+ new Mp3Parser(),
37
+ new AacParser(),
38
+ new OggParser(),
39
+ new FlacParser(),
40
+ new WavParser()
41
+ ]
42
+ });
43
+ //# sourceMappingURL=ParserFactory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ParserFactory.js","sourceRoot":"","sources":["../../src/Parsers/ParserFactory.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAKxD,MAAM,OAAO,aAAa;IAcxB,MAAM,CAAC,SAAS,CAAC,MAAmB;QAElC,MAAM,YAAY,GAAG,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;QAEvD,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,YAAY,CAAC,IAAI,IAAI,CAAC;IAClF,CAAC;IAOD,MAAM,CAAC,YAAY,CAAC,MAAc;QAEhC,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAClC,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC5B,OAAO,MAAM,CAAC;YAChB,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAOD,MAAM,CAAC,oBAAoB,CAAC,QAAgB;QAC1C,MAAM,MAAM,GAAG,cAAc,CAAC,yBAAyB,CAAC,QAAQ,CAAC,CAAC;QAClE,OAAO,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAChD,CAAC;IAKD,MAAM,CAAC,mBAAmB;QACxB,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;IACrD,CAAC;IAKD,MAAM,CAAC,iBAAiB,CAAC,MAAc;QACrC,OAAO,IAAI,CAAC,mBAAmB,EAAE,CAAC,QAAQ,CAAC,MAAqB,CAAC,CAAC;IACpE,CAAC;;AA1Dc;;;;WAA0B;QACvC,IAAI,SAAS,EAAE;QACf,IAAI,SAAS,EAAE;QACf,IAAI,SAAS,EAAE;QACf,IAAI,UAAU,EAAE;QAChB,IAAI,SAAS,EAAE;KAChB;GAAC"}
@@ -0,0 +1,9 @@
1
+ import { IAudioParser, AudioFileInfo, AudioFormat } from './IAudioParser';
2
+ export declare class WavParser implements IAudioParser {
3
+ getFormat(): AudioFormat;
4
+ canParse(buffer: Buffer): boolean;
5
+ analyze(buffer: Buffer, opts?: {
6
+ fileSize?: number;
7
+ }): AudioFileInfo;
8
+ }
9
+ //# sourceMappingURL=WavParser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WavParser.d.ts","sourceRoot":"","sources":["../../src/Parsers/WavParser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAkB,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAM1F,qBAAa,SAAU,YAAW,YAAY;IAC5C,SAAS,IAAI,WAAW;IAIxB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAMjC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAO,GAAG,aAAa;CAgKzE"}