hls-streamer 2.1.0 → 3.0.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 +189 -190
  2. package/dist/Interfaces/HlsStreamer.d.ts +20 -0
  3. package/dist/Interfaces/HlsStreamer.d.ts.map +1 -1
  4. package/dist/Libs/FileLib.d.ts +22 -1
  5. package/dist/Libs/FileLib.d.ts.map +1 -1
  6. package/dist/Libs/FileLib.js +273 -108
  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 +63 -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 +20 -0
  41. package/dist/cjs/Interfaces/HlsStreamer.d.ts.map +1 -1
  42. package/dist/cjs/Libs/FileLib.d.ts +22 -1
  43. package/dist/cjs/Libs/FileLib.d.ts.map +1 -1
  44. package/dist/cjs/Libs/FileLib.js +276 -108
  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 +67 -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 +6 -7
  83. package/dist/cjs/index.d.ts.map +1 -1
  84. package/dist/cjs/index.js +161 -138
  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 +6 -7
  91. package/dist/index.d.ts.map +1 -1
  92. package/dist/index.js +162 -139
  93. package/dist/index.js.map +1 -1
  94. package/package.json +10 -3
@@ -0,0 +1,19 @@
1
+ import { IAudioParser, AudioFileInfo, AudioFormat } from './IAudioParser';
2
+ export declare class Mp3Parser implements IAudioParser {
3
+ private static readonly BITRATE_INDEX;
4
+ private static readonly SAMPLE_RATE_INDEX;
5
+ getFormat(): AudioFormat;
6
+ canParse(buffer: Buffer): boolean;
7
+ analyze(buffer: Buffer, opts?: {
8
+ fileSize?: number;
9
+ }): AudioFileInfo;
10
+ private calculateFrameLength;
11
+ private getId3Offsets;
12
+ private syncSafeInteger;
13
+ private isFrameSync;
14
+ private parseFrameHeader;
15
+ private decodeVersion;
16
+ private decodeLayer;
17
+ private getSamplesPerFrame;
18
+ }
19
+ //# sourceMappingURL=Mp3Parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Mp3Parser.d.ts","sourceRoot":"","sources":["../../../src/Parsers/Mp3Parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAkB,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAsB1F,qBAAa,SAAU,YAAW,YAAY;IAC5C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAgBnC;IAEF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAIvC;IAEF,SAAS,IAAI,WAAW;IAIxB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAsBjC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAO,GAAG,aAAa;IAyIxE,OAAO,CAAC,oBAAoB;IAS5B,OAAO,CAAC,aAAa;IA8BrB,OAAO,CAAC,eAAe;IAOvB,OAAO,CAAC,WAAW;IAWnB,OAAO,CAAC,gBAAgB;IAqCxB,OAAO,CAAC,aAAa;IAarB,OAAO,CAAC,WAAW;IAanB,OAAO,CAAC,kBAAkB;CAW3B"}
@@ -0,0 +1,274 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Mp3Parser = void 0;
4
+ class Mp3Parser {
5
+ getFormat() {
6
+ return 'mp3';
7
+ }
8
+ canParse(buffer) {
9
+ if (buffer.length < 10) {
10
+ return false;
11
+ }
12
+ if (buffer.toString('ascii', 0, 3) === 'ID3') {
13
+ return true;
14
+ }
15
+ if (buffer.length >= 2) {
16
+ const byte1 = buffer[0];
17
+ const byte2 = buffer[1];
18
+ if (byte1 === 0xff && (byte2 & 0xe0) === 0xe0) {
19
+ return true;
20
+ }
21
+ }
22
+ return false;
23
+ }
24
+ analyze(buffer, opts = {}) {
25
+ const warnings = [];
26
+ const size = opts.fileSize ?? buffer.length;
27
+ if (buffer.length === 0) {
28
+ return {
29
+ format: 'mp3',
30
+ size,
31
+ duration: 0,
32
+ audioDataSize: 0,
33
+ frames: []
34
+ };
35
+ }
36
+ const offsets = this.getId3Offsets(buffer);
37
+ const frames = [];
38
+ const payloadSize = Math.max(0, offsets.audioEnd - offsets.startOffset);
39
+ let offset = offsets.startOffset;
40
+ let frameIndex = 0;
41
+ let sampleRate;
42
+ let channels;
43
+ let totalDuration = 0;
44
+ let totalAudioBytes = 0;
45
+ while (offset + 4 <= offsets.audioEnd) {
46
+ if (!this.isFrameSync(buffer, offset)) {
47
+ offset++;
48
+ continue;
49
+ }
50
+ const header = buffer.readUInt32BE(offset);
51
+ const parsed = this.parseFrameHeader(header);
52
+ if (!parsed) {
53
+ offset++;
54
+ continue;
55
+ }
56
+ const frameLength = this.calculateFrameLength(parsed);
57
+ if (frameLength <= 0) {
58
+ warnings.push(`Encountered zero-length frame at offset ${offset}`);
59
+ offset++;
60
+ continue;
61
+ }
62
+ if (offset + frameLength > buffer.length) {
63
+ warnings.push(`Truncated frame at offset ${offset}`);
64
+ break;
65
+ }
66
+ sampleRate = sampleRate ?? parsed.sampleRate;
67
+ if (channels === undefined) {
68
+ const channelMode = (header >> 6) & 0x3;
69
+ channels = channelMode === 3 ? 1 : 2;
70
+ }
71
+ const frameDuration = parsed.samplesPerFrame / parsed.sampleRate;
72
+ frames.push({
73
+ index: frameIndex,
74
+ offset,
75
+ length: frameLength,
76
+ duration: frameDuration,
77
+ samples: parsed.samplesPerFrame,
78
+ sampleRate: parsed.sampleRate,
79
+ bitrate: parsed.bitrate
80
+ });
81
+ frameIndex++;
82
+ totalDuration += frameDuration;
83
+ totalAudioBytes += frameLength;
84
+ offset += frameLength;
85
+ }
86
+ if (frames.length === 0) {
87
+ const estimatedDuration = buffer.length / 16000;
88
+ warnings.push('Falling back to heuristic duration due to missing MP3 frames');
89
+ const metadata = {
90
+ format: 'mp3',
91
+ size,
92
+ duration: Math.max(0.001, estimatedDuration),
93
+ audioDataSize: payloadSize,
94
+ frames: []
95
+ };
96
+ if (warnings.length) {
97
+ metadata.warnings = warnings;
98
+ }
99
+ return metadata;
100
+ }
101
+ const duration = totalDuration;
102
+ const averageBitrate = duration > 0 ? (totalAudioBytes * 8) / duration / 1000 : undefined;
103
+ const metadata = {
104
+ format: 'mp3',
105
+ size,
106
+ duration,
107
+ audioDataSize: totalAudioBytes || payloadSize,
108
+ frames
109
+ };
110
+ if (sampleRate !== undefined) {
111
+ metadata.sampleRate = sampleRate;
112
+ }
113
+ if (channels !== undefined) {
114
+ metadata.channels = channels;
115
+ }
116
+ if (averageBitrate !== undefined) {
117
+ metadata.averageBitrate = averageBitrate;
118
+ }
119
+ if (offsets.id3v2Size > 0 || offsets.id3v1Size > 0) {
120
+ metadata.metadata = {};
121
+ if (offsets.id3v2Size > 0) {
122
+ metadata.metadata['id3v2Size'] = offsets.id3v2Size;
123
+ }
124
+ if (offsets.id3v1Size > 0) {
125
+ metadata.metadata['id3v1Size'] = offsets.id3v1Size;
126
+ }
127
+ }
128
+ if (warnings.length) {
129
+ metadata.warnings = warnings;
130
+ }
131
+ return metadata;
132
+ }
133
+ calculateFrameLength(frame) {
134
+ if (frame.layer === 1) {
135
+ return Math.floor(((12 * frame.bitrate * 1000) / frame.sampleRate + frame.padding) * 4);
136
+ }
137
+ const multiplier = frame.layer === 3 && frame.version !== 1 ? 72 : 144;
138
+ return Math.floor((multiplier * frame.bitrate * 1000) / frame.sampleRate + frame.padding);
139
+ }
140
+ getId3Offsets(buffer) {
141
+ let startOffset = 0;
142
+ let id3v2Size = 0;
143
+ if (buffer.length >= 10 && buffer.toString('ascii', 0, 3) === 'ID3') {
144
+ const sizeBytes = buffer.subarray(6, 10);
145
+ id3v2Size = this.syncSafeInteger(sizeBytes);
146
+ startOffset = Math.min(buffer.length, 10 + id3v2Size);
147
+ }
148
+ let id3v1Size = 0;
149
+ let audioEnd = buffer.length;
150
+ if (buffer.length >= 128) {
151
+ const tagOffset = buffer.length - 128;
152
+ if (buffer.toString('ascii', tagOffset, tagOffset + 3) === 'TAG') {
153
+ id3v1Size = 128;
154
+ audioEnd = tagOffset;
155
+ }
156
+ }
157
+ return {
158
+ startOffset,
159
+ id3v2Size,
160
+ audioEnd,
161
+ id3v1Size
162
+ };
163
+ }
164
+ syncSafeInteger(bytes) {
165
+ return ((bytes[0] & 0x7f) << 21) |
166
+ ((bytes[1] & 0x7f) << 14) |
167
+ ((bytes[2] & 0x7f) << 7) |
168
+ (bytes[3] & 0x7f);
169
+ }
170
+ isFrameSync(buffer, offset) {
171
+ const byte1 = buffer[offset];
172
+ const byte2 = buffer[offset + 1];
173
+ if (byte1 === undefined || byte2 === undefined) {
174
+ return false;
175
+ }
176
+ return byte1 === 0xff && (byte2 & 0xe0) === 0xe0;
177
+ }
178
+ parseFrameHeader(header) {
179
+ const versionBits = (header >> 19) & 0x3;
180
+ const layerBits = (header >> 17) & 0x3;
181
+ const bitrateIndex = (header >> 12) & 0xf;
182
+ const sampleRateIndex = (header >> 10) & 0x3;
183
+ const padding = ((header >> 9) & 0x1);
184
+ const version = this.decodeVersion(versionBits);
185
+ const layer = this.decodeLayer(layerBits);
186
+ if (!version || !layer) {
187
+ return null;
188
+ }
189
+ if (bitrateIndex === 0 || bitrateIndex === 15 || sampleRateIndex === 3) {
190
+ return null;
191
+ }
192
+ const bitrate = Mp3Parser.BITRATE_INDEX[version][layer][bitrateIndex];
193
+ const sampleRate = Mp3Parser.SAMPLE_RATE_INDEX[version][sampleRateIndex];
194
+ if (!bitrate || !sampleRate) {
195
+ return null;
196
+ }
197
+ const samplesPerFrame = this.getSamplesPerFrame(version, layer);
198
+ return {
199
+ version,
200
+ layer,
201
+ bitrate,
202
+ sampleRate,
203
+ padding,
204
+ samplesPerFrame
205
+ };
206
+ }
207
+ decodeVersion(bits) {
208
+ switch (bits) {
209
+ case 0b11:
210
+ return 1;
211
+ case 0b10:
212
+ return 2;
213
+ case 0b00:
214
+ return 25;
215
+ default:
216
+ return null;
217
+ }
218
+ }
219
+ decodeLayer(bits) {
220
+ switch (bits) {
221
+ case 0b11:
222
+ return 1;
223
+ case 0b10:
224
+ return 2;
225
+ case 0b01:
226
+ return 3;
227
+ default:
228
+ return null;
229
+ }
230
+ }
231
+ getSamplesPerFrame(version, layer) {
232
+ if (layer === 1) {
233
+ return 384;
234
+ }
235
+ if (layer === 2) {
236
+ return 1152;
237
+ }
238
+ return version === 1 ? 1152 : 576;
239
+ }
240
+ }
241
+ exports.Mp3Parser = Mp3Parser;
242
+ Object.defineProperty(Mp3Parser, "BITRATE_INDEX", {
243
+ enumerable: true,
244
+ configurable: true,
245
+ writable: true,
246
+ value: {
247
+ 1: {
248
+ 1: [0, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448],
249
+ 2: [0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384],
250
+ 3: [0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320]
251
+ },
252
+ 2: {
253
+ 1: [0, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256],
254
+ 2: [0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160],
255
+ 3: [0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160]
256
+ },
257
+ 25: {
258
+ 1: [0, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256],
259
+ 2: [0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160],
260
+ 3: [0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160]
261
+ }
262
+ }
263
+ });
264
+ Object.defineProperty(Mp3Parser, "SAMPLE_RATE_INDEX", {
265
+ enumerable: true,
266
+ configurable: true,
267
+ writable: true,
268
+ value: {
269
+ 1: [44100, 48000, 32000],
270
+ 2: [22050, 24000, 16000],
271
+ 25: [11025, 12000, 8000]
272
+ }
273
+ });
274
+ //# sourceMappingURL=Mp3Parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Mp3Parser.js","sourceRoot":"","sources":["../../../src/Parsers/Mp3Parser.ts"],"names":[],"mappings":";;;AAsBA,MAAa,SAAS;IAyBpB,SAAS;QACP,OAAO,KAAK,CAAC;IACf,CAAC;IAED,QAAQ,CAAC,MAAc;QACrB,IAAI,MAAM,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;YACvB,OAAO,KAAK,CAAC;QACf,CAAC;QAGD,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC;YAC7C,OAAO,IAAI,CAAC;QACd,CAAC;QAGD,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YACvB,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YACxB,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YACxB,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAM,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;gBAC/C,OAAO,IAAI,CAAC;YACd,CAAC;QACH,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;;AA9TH,8BA+TC;AA9TyB;;;;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,164 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OggParser = void 0;
4
+ class OggParser {
5
+ getFormat() {
6
+ return 'ogg';
7
+ }
8
+ canParse(buffer) {
9
+ return buffer.length >= 4 && buffer.toString('ascii', 0, 4) === OggParser.OGG_SIGNATURE;
10
+ }
11
+ analyze(buffer, opts = {}) {
12
+ const warnings = [];
13
+ const size = opts.fileSize ?? buffer.length;
14
+ if (!this.canParse(buffer)) {
15
+ return {
16
+ format: 'ogg',
17
+ size,
18
+ duration: 0,
19
+ audioDataSize: 0,
20
+ frames: [],
21
+ warnings: ['Not a valid OGG file']
22
+ };
23
+ }
24
+ const pages = [];
25
+ let offset = 0;
26
+ let vorbisInfo = null;
27
+ while (offset + 27 <= buffer.length) {
28
+ if (buffer.toString('ascii', offset, offset + 4) !== OggParser.OGG_SIGNATURE) {
29
+ offset++;
30
+ continue;
31
+ }
32
+ const version = buffer[offset + 4];
33
+ const headerType = buffer[offset + 5];
34
+ const granulePosition = buffer.readBigUInt64LE(offset + 6);
35
+ const serialNumber = buffer.readUInt32LE(offset + 14);
36
+ const pageSequence = buffer.readUInt32LE(offset + 18);
37
+ const checksum = buffer.readUInt32LE(offset + 22);
38
+ const numSegments = buffer[offset + 26];
39
+ if (version !== 0) {
40
+ warnings.push(`Unknown OGG version: ${version}`);
41
+ offset++;
42
+ continue;
43
+ }
44
+ if (offset + 27 + numSegments > buffer.length) {
45
+ warnings.push('Truncated page header');
46
+ break;
47
+ }
48
+ const segmentTable = buffer.subarray(offset + 27, offset + 27 + numSegments);
49
+ const bodySize = segmentTable.reduce((sum, len) => sum + len, 0);
50
+ const headerSize = 27 + numSegments;
51
+ const isFirstPage = (headerType & 0x02) !== 0;
52
+ const isContinued = (headerType & 0x01) !== 0;
53
+ pages.push({
54
+ offset,
55
+ headerSize,
56
+ bodySize,
57
+ granulePosition,
58
+ serialNumber: serialNumber,
59
+ pageSequence: pageSequence,
60
+ isFirstPage,
61
+ isContinued
62
+ });
63
+ if (isFirstPage && !vorbisInfo && offset + headerSize + 30 <= buffer.length) {
64
+ const packetData = buffer.subarray(offset + headerSize, offset + headerSize + bodySize);
65
+ vorbisInfo = this.parseVorbisIdHeader(packetData);
66
+ }
67
+ offset += headerSize + bodySize;
68
+ }
69
+ if (pages.length === 0) {
70
+ return {
71
+ format: 'ogg',
72
+ size,
73
+ duration: 0,
74
+ audioDataSize: 0,
75
+ frames: [],
76
+ warnings: ['No valid OGG pages found']
77
+ };
78
+ }
79
+ const lastPage = pages[pages.length - 1];
80
+ const totalSamples = lastPage ? Number(lastPage.granulePosition) : 0;
81
+ const sampleRate = vorbisInfo?.sampleRate || 48000;
82
+ const duration = totalSamples > 0 && sampleRate > 0 ? totalSamples / sampleRate : 0;
83
+ const audioDataSize = pages.reduce((sum, page) => sum + page.bodySize, 0);
84
+ const averageBitrate = duration > 0
85
+ ? (audioDataSize * 8) / duration / 1000
86
+ : vorbisInfo?.bitrateNominal ? vorbisInfo.bitrateNominal / 1000 : undefined;
87
+ const frames = [];
88
+ let previousGranule = 0n;
89
+ for (let i = 0; i < pages.length; i++) {
90
+ const page = pages[i];
91
+ const currentGranule = Number(page.granulePosition);
92
+ const samplesInPage = currentGranule - Number(previousGranule);
93
+ const pageDuration = samplesInPage > 0 && sampleRate > 0
94
+ ? samplesInPage / sampleRate
95
+ : 0;
96
+ frames.push({
97
+ index: i,
98
+ offset: page.offset + page.headerSize,
99
+ length: page.bodySize,
100
+ duration: pageDuration,
101
+ samples: Math.max(0, samplesInPage),
102
+ sampleRate,
103
+ bitrate: Math.round(averageBitrate || 0)
104
+ });
105
+ if (page.granulePosition !== -1n) {
106
+ previousGranule = page.granulePosition;
107
+ }
108
+ }
109
+ const metadata = {
110
+ format: 'ogg',
111
+ size,
112
+ duration,
113
+ audioDataSize,
114
+ frames
115
+ };
116
+ if (vorbisInfo) {
117
+ metadata.sampleRate = vorbisInfo.sampleRate;
118
+ metadata.channels = vorbisInfo.channels;
119
+ if (averageBitrate !== undefined) {
120
+ metadata.averageBitrate = averageBitrate;
121
+ }
122
+ metadata.metadata = {
123
+ bitrateNominal: vorbisInfo.bitrateNominal,
124
+ totalPages: pages.length
125
+ };
126
+ }
127
+ if (warnings.length > 0) {
128
+ metadata.warnings = warnings;
129
+ }
130
+ return metadata;
131
+ }
132
+ parseVorbisIdHeader(packet) {
133
+ if (packet.length < 30) {
134
+ return null;
135
+ }
136
+ const packetType = packet[0];
137
+ const vorbisSignature = packet.toString('ascii', 1, 7);
138
+ if (packetType !== 1 || vorbisSignature !== 'vorbis') {
139
+ return null;
140
+ }
141
+ const version = packet.readUInt32LE(7);
142
+ if (version !== 0) {
143
+ return null;
144
+ }
145
+ const channels = packet[11];
146
+ const sampleRate = packet.readUInt32LE(12);
147
+ const bitrateMaximum = packet.readUInt32LE(16);
148
+ const bitrateNominal = packet.readUInt32LE(20);
149
+ const bitrateMinimum = packet.readUInt32LE(24);
150
+ return {
151
+ channels: channels,
152
+ sampleRate: sampleRate,
153
+ bitrateNominal: bitrateNominal || bitrateMaximum || 128000
154
+ };
155
+ }
156
+ }
157
+ exports.OggParser = OggParser;
158
+ Object.defineProperty(OggParser, "OGG_SIGNATURE", {
159
+ enumerable: true,
160
+ configurable: true,
161
+ writable: true,
162
+ value: 'OggS'
163
+ });
164
+ //# 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,47 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ParserFactory = void 0;
4
+ const Mp3Parser_1 = require("./Mp3Parser");
5
+ const AacParser_1 = require("./AacParser");
6
+ const OggParser_1 = require("./OggParser");
7
+ const FlacParser_1 = require("./FlacParser");
8
+ const WavParser_1 = require("./WavParser");
9
+ const FormatDetector_1 = require("../Libs/FormatDetector");
10
+ class ParserFactory {
11
+ static getParser(format) {
12
+ const searchFormat = format === 'm4a' ? 'aac' : format;
13
+ return this.parsers.find(parser => parser.getFormat() === searchFormat) || null;
14
+ }
15
+ static detectParser(buffer) {
16
+ for (const parser of this.parsers) {
17
+ if (parser.canParse(buffer)) {
18
+ return parser;
19
+ }
20
+ }
21
+ return null;
22
+ }
23
+ static getParserByExtension(filePath) {
24
+ const format = FormatDetector_1.FormatDetector.detectFormatFromExtension(filePath);
25
+ return format ? this.getParser(format) : null;
26
+ }
27
+ static getSupportedFormats() {
28
+ return ['mp3', 'aac', 'm4a', 'ogg', 'flac', 'wav'];
29
+ }
30
+ static isFormatSupported(format) {
31
+ return this.getSupportedFormats().includes(format);
32
+ }
33
+ }
34
+ exports.ParserFactory = ParserFactory;
35
+ Object.defineProperty(ParserFactory, "parsers", {
36
+ enumerable: true,
37
+ configurable: true,
38
+ writable: true,
39
+ value: [
40
+ new Mp3Parser_1.Mp3Parser(),
41
+ new AacParser_1.AacParser(),
42
+ new OggParser_1.OggParser(),
43
+ new FlacParser_1.FlacParser(),
44
+ new WavParser_1.WavParser()
45
+ ]
46
+ });
47
+ //# sourceMappingURL=ParserFactory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ParserFactory.js","sourceRoot":"","sources":["../../../src/Parsers/ParserFactory.ts"],"names":[],"mappings":";;;AACA,2CAAwC;AACxC,2CAAwC;AACxC,2CAAwC;AACxC,6CAA0C;AAC1C,2CAAwC;AACxC,2DAAwD;AAKxD,MAAa,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,+BAAc,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;;AA3DH,sCA4DC;AA3DgB;;;;WAA0B;QACvC,IAAI,qBAAS,EAAE;QACf,IAAI,qBAAS,EAAE;QACf,IAAI,qBAAS,EAAE;QACf,IAAI,uBAAU,EAAE;QAChB,IAAI,qBAAS,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"}