ytgrab 0.3.1 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/downloader/hls.d.ts +0 -1
- package/dist/downloader/hls.d.ts.map +1 -1
- package/dist/downloader/hls.js +7 -45
- package/dist/downloader/hls.js.map +1 -1
- package/dist/downloader/mp4fix.d.ts +13 -0
- package/dist/downloader/mp4fix.d.ts.map +1 -0
- package/dist/downloader/mp4fix.js +263 -0
- package/dist/downloader/mp4fix.js.map +1 -0
- package/package.json +3 -3
package/dist/downloader/hls.d.ts
CHANGED
|
@@ -7,7 +7,6 @@ import { FileDownloader } from './common.js';
|
|
|
7
7
|
import type { InfoDict } from '../types.js';
|
|
8
8
|
export declare class HlsFD extends FileDownloader {
|
|
9
9
|
realDownload(filename: string, infoDict: InfoDict): Promise<boolean>;
|
|
10
|
-
private _transmuxToMp4;
|
|
11
10
|
private _parseMediaPlaylist;
|
|
12
11
|
}
|
|
13
12
|
//# sourceMappingURL=hls.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hls.d.ts","sourceRoot":"","sources":["../../src/downloader/hls.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"hls.d.ts","sourceRoot":"","sources":["../../src/downloader/hls.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAG7C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C,qBAAa,KAAM,SAAQ,cAAc;IACjC,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;IAmF1E,OAAO,CAAC,mBAAmB;CAoB5B"}
|
package/dist/downloader/hls.js
CHANGED
|
@@ -42,6 +42,7 @@ exports.HlsFD = void 0;
|
|
|
42
42
|
const fs = __importStar(require("node:fs"));
|
|
43
43
|
const common_js_1 = require("./common.js");
|
|
44
44
|
const index_js_1 = require("../networking/index.js");
|
|
45
|
+
const mp4fix_js_1 = require("./mp4fix.js");
|
|
45
46
|
class HlsFD extends common_js_1.FileDownloader {
|
|
46
47
|
async realDownload(filename, infoDict) {
|
|
47
48
|
const manifestUrl = (infoDict.url || infoDict.manifest_url);
|
|
@@ -96,13 +97,15 @@ class HlsFD extends common_js_1.FileDownloader {
|
|
|
96
97
|
// For other errors (network), continue
|
|
97
98
|
}
|
|
98
99
|
}
|
|
99
|
-
// Transmux TS→MP4 using
|
|
100
|
+
// Transmux TS→MP4 using toMp4 (pure JS, no FFmpeg)
|
|
100
101
|
const tsData = Buffer.concat(tsChunks);
|
|
101
102
|
if (filename.endsWith('.mp4')) {
|
|
102
103
|
try {
|
|
103
|
-
const
|
|
104
|
-
|
|
105
|
-
|
|
104
|
+
const toMp4 = (await import('@invintusmedia/tomp4')).default;
|
|
105
|
+
const result = await toMp4(new Uint8Array(tsData));
|
|
106
|
+
const fixed = (0, mp4fix_js_1.fixMp4ForQuickTime)(Buffer.from(result.data));
|
|
107
|
+
fs.writeFileSync(filename, fixed);
|
|
108
|
+
downloadedBytes = fixed.length;
|
|
106
109
|
this._log('Transmuxed to MP4');
|
|
107
110
|
}
|
|
108
111
|
catch (err) {
|
|
@@ -116,47 +119,6 @@ class HlsFD extends common_js_1.FileDownloader {
|
|
|
116
119
|
this.reportFinished(filename, downloadedBytes);
|
|
117
120
|
return true;
|
|
118
121
|
}
|
|
119
|
-
async _transmuxToMp4(tsData) {
|
|
120
|
-
// Dynamic import to avoid issues with ESM/CJS
|
|
121
|
-
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
122
|
-
const muxjs = require('mux.js');
|
|
123
|
-
const Transmuxer = muxjs.mp4?.Transmuxer || muxjs.default?.mp4?.Transmuxer;
|
|
124
|
-
if (!Transmuxer) {
|
|
125
|
-
throw new Error('mux.js Transmuxer not found');
|
|
126
|
-
}
|
|
127
|
-
return new Promise((resolve, reject) => {
|
|
128
|
-
const transmuxer = new Transmuxer();
|
|
129
|
-
const outputChunks = [];
|
|
130
|
-
let initSegment = null;
|
|
131
|
-
transmuxer.on('data', (segment) => {
|
|
132
|
-
if (!initSegment) {
|
|
133
|
-
initSegment = segment.initSegment;
|
|
134
|
-
outputChunks.push(segment.initSegment);
|
|
135
|
-
}
|
|
136
|
-
outputChunks.push(segment.data);
|
|
137
|
-
});
|
|
138
|
-
transmuxer.on('done', () => {
|
|
139
|
-
if (outputChunks.length === 0) {
|
|
140
|
-
reject(new Error('No output from transmuxer'));
|
|
141
|
-
return;
|
|
142
|
-
}
|
|
143
|
-
const totalLen = outputChunks.reduce((sum, c) => sum + c.length, 0);
|
|
144
|
-
const result = Buffer.alloc(totalLen);
|
|
145
|
-
let offset = 0;
|
|
146
|
-
for (const chunk of outputChunks) {
|
|
147
|
-
result.set(chunk, offset);
|
|
148
|
-
offset += chunk.length;
|
|
149
|
-
}
|
|
150
|
-
resolve(result);
|
|
151
|
-
});
|
|
152
|
-
transmuxer.on('error', (err) => {
|
|
153
|
-
reject(err);
|
|
154
|
-
});
|
|
155
|
-
// Feed all TS data and flush
|
|
156
|
-
transmuxer.push(new Uint8Array(tsData));
|
|
157
|
-
transmuxer.flush();
|
|
158
|
-
});
|
|
159
|
-
}
|
|
160
122
|
_parseMediaPlaylist(manifest, baseUrl) {
|
|
161
123
|
const fragments = [];
|
|
162
124
|
const lines = manifest.split('\n');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hls.js","sourceRoot":"","sources":["../../src/downloader/hls.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,4CAA8B;
|
|
1
|
+
{"version":3,"file":"hls.js","sourceRoot":"","sources":["../../src/downloader/hls.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MP4 post-processor: fix single-chunk MP4 files for QuickTime compatibility.
|
|
3
|
+
*
|
|
4
|
+
* Some JS-based MP4 muxers write all samples into a single chunk,
|
|
5
|
+
* which QuickTime can't render (black screen). This rewrites the
|
|
6
|
+
* stco/stsc boxes to create per-sample chunk offsets.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Fix MP4 for QuickTime: rewrite chunk tables so each sample is its own chunk.
|
|
10
|
+
* This modifies the buffer in-place and may return a new buffer if size changes.
|
|
11
|
+
*/
|
|
12
|
+
export declare function fixMp4ForQuickTime(input: Buffer): Buffer;
|
|
13
|
+
//# sourceMappingURL=mp4fix.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mp4fix.d.ts","sourceRoot":"","sources":["../../src/downloader/mp4fix.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAyCH;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAsPxD"}
|
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* MP4 post-processor: fix single-chunk MP4 files for QuickTime compatibility.
|
|
4
|
+
*
|
|
5
|
+
* Some JS-based MP4 muxers write all samples into a single chunk,
|
|
6
|
+
* which QuickTime can't render (black screen). This rewrites the
|
|
7
|
+
* stco/stsc boxes to create per-sample chunk offsets.
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.fixMp4ForQuickTime = fixMp4ForQuickTime;
|
|
11
|
+
function findBoxes(data, start, end) {
|
|
12
|
+
const boxes = [];
|
|
13
|
+
let offset = start;
|
|
14
|
+
while (offset < end - 8) {
|
|
15
|
+
const size = data.readUInt32BE(offset);
|
|
16
|
+
const type = data.toString('ascii', offset + 4, offset + 8);
|
|
17
|
+
if (size === 0 || size > end - offset)
|
|
18
|
+
break;
|
|
19
|
+
boxes.push({ type, offset, size });
|
|
20
|
+
offset += size;
|
|
21
|
+
}
|
|
22
|
+
return boxes;
|
|
23
|
+
}
|
|
24
|
+
function findBox(data, start, end, type) {
|
|
25
|
+
const boxes = findBoxes(data, start, end);
|
|
26
|
+
return boxes.find(b => b.type === type) || null;
|
|
27
|
+
}
|
|
28
|
+
function findBoxDeep(data, path) {
|
|
29
|
+
let start = 0;
|
|
30
|
+
let end = data.length;
|
|
31
|
+
for (let i = 0; i < path.length; i++) {
|
|
32
|
+
const box = findBox(data, start, end, path[i]);
|
|
33
|
+
if (!box)
|
|
34
|
+
return null;
|
|
35
|
+
if (i === path.length - 1)
|
|
36
|
+
return box;
|
|
37
|
+
// Container box: content starts after 8-byte header
|
|
38
|
+
start = box.offset + 8;
|
|
39
|
+
end = box.offset + box.size;
|
|
40
|
+
}
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Fix MP4 for QuickTime: rewrite chunk tables so each sample is its own chunk.
|
|
45
|
+
* This modifies the buffer in-place and may return a new buffer if size changes.
|
|
46
|
+
*/
|
|
47
|
+
function fixMp4ForQuickTime(input) {
|
|
48
|
+
// Find mdat to get the data offset
|
|
49
|
+
const mdatBox = findBox(input, 0, input.length, 'mdat');
|
|
50
|
+
if (!mdatBox)
|
|
51
|
+
return input;
|
|
52
|
+
const mdatDataStart = mdatBox.offset + 8;
|
|
53
|
+
// Find moov
|
|
54
|
+
const moovBox = findBox(input, 0, input.length, 'moov');
|
|
55
|
+
if (!moovBox)
|
|
56
|
+
return input;
|
|
57
|
+
// Process each trak
|
|
58
|
+
const traks = findBoxes(input, moovBox.offset + 8, moovBox.offset + moovBox.size)
|
|
59
|
+
.filter(b => b.type === 'trak');
|
|
60
|
+
const tracks = [];
|
|
61
|
+
for (const trak of traks) {
|
|
62
|
+
const mdia = findBox(input, trak.offset + 8, trak.offset + trak.size, 'mdia');
|
|
63
|
+
if (!mdia)
|
|
64
|
+
continue;
|
|
65
|
+
const minf = findBox(input, mdia.offset + 8, mdia.offset + mdia.size, 'minf');
|
|
66
|
+
if (!minf)
|
|
67
|
+
continue;
|
|
68
|
+
const stbl = findBox(input, minf.offset + 8, minf.offset + minf.size, 'stbl');
|
|
69
|
+
if (!stbl)
|
|
70
|
+
continue;
|
|
71
|
+
const stsz = findBox(input, stbl.offset + 8, stbl.offset + stbl.size, 'stsz');
|
|
72
|
+
const stco = findBox(input, stbl.offset + 8, stbl.offset + stbl.size, 'stco');
|
|
73
|
+
const stsc = findBox(input, stbl.offset + 8, stbl.offset + stbl.size, 'stsc');
|
|
74
|
+
if (!stsz || !stco || !stsc)
|
|
75
|
+
continue;
|
|
76
|
+
// Parse stsz: [size(4), type(4), version(1), flags(3), sample_size(4), sample_count(4), entries...]
|
|
77
|
+
const stszOffset = stsz.offset;
|
|
78
|
+
const uniformSize = input.readUInt32BE(stszOffset + 12);
|
|
79
|
+
const sampleCount = input.readUInt32BE(stszOffset + 16);
|
|
80
|
+
const sampleSizes = [];
|
|
81
|
+
if (uniformSize > 0) {
|
|
82
|
+
for (let i = 0; i < sampleCount; i++)
|
|
83
|
+
sampleSizes.push(uniformSize);
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
for (let i = 0; i < sampleCount; i++) {
|
|
87
|
+
sampleSizes.push(input.readUInt32BE(stszOffset + 20 + i * 4));
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
tracks.push({ trak, stbl, stsz, stco, stsc, sampleSizes, sampleCount });
|
|
91
|
+
}
|
|
92
|
+
if (tracks.length === 0)
|
|
93
|
+
return input;
|
|
94
|
+
// Check if already has proper chunks (stco entry count > 1)
|
|
95
|
+
const stco0 = tracks[0].stco;
|
|
96
|
+
const existingChunks = input.readUInt32BE(stco0.offset + 12);
|
|
97
|
+
if (existingChunks > 1)
|
|
98
|
+
return input; // Already fine
|
|
99
|
+
// Build interleaved chunk layout: alternate video/audio samples
|
|
100
|
+
// For simplicity, give each sample its own chunk offset
|
|
101
|
+
// We need to compute absolute offsets for each sample in mdat
|
|
102
|
+
// First, figure out sample order in mdat by parsing existing stco/stsc
|
|
103
|
+
// With single chunk, samples are sequential: all track0 samples then all track1 samples
|
|
104
|
+
// We need to build proper stco (one entry per sample) and stsc (one sample per chunk)
|
|
105
|
+
const newParts = [];
|
|
106
|
+
let currentOffset = 0;
|
|
107
|
+
// Copy everything before moov
|
|
108
|
+
const moovEnd = moovBox.offset + moovBox.size;
|
|
109
|
+
const beforeMoov = moovBox.offset < mdatBox.offset;
|
|
110
|
+
// Rebuild approach: reconstruct the entire file
|
|
111
|
+
// 1. Copy ftyp
|
|
112
|
+
const ftypBox = findBox(input, 0, input.length, 'ftyp');
|
|
113
|
+
if (!ftypBox)
|
|
114
|
+
return input;
|
|
115
|
+
newParts.push(input.subarray(ftypBox.offset, ftypBox.offset + ftypBox.size));
|
|
116
|
+
// 2. Keep mdat as-is, calculate sample offsets
|
|
117
|
+
// Figure out where each track's samples start in the original mdat
|
|
118
|
+
const trackOffsets = [];
|
|
119
|
+
let sampleDataOffset = mdatDataStart;
|
|
120
|
+
// In the original single-chunk layout, track0 samples come first, then track1
|
|
121
|
+
// (based on the stco having offset = mdatDataStart for both, stsc maps them)
|
|
122
|
+
// Actually with single stco entry, all samples of each track use the same base offset
|
|
123
|
+
// Let's read the original chunk offset for each track
|
|
124
|
+
for (const track of tracks) {
|
|
125
|
+
const origChunkOffset = input.readUInt32BE(track.stco.offset + 16); // first (only) entry
|
|
126
|
+
const offsets = [];
|
|
127
|
+
let pos = origChunkOffset;
|
|
128
|
+
for (const size of track.sampleSizes) {
|
|
129
|
+
offsets.push(pos);
|
|
130
|
+
pos += size;
|
|
131
|
+
}
|
|
132
|
+
trackOffsets.push(offsets);
|
|
133
|
+
}
|
|
134
|
+
// 3. Rebuild moov with proper stco and stsc for each track
|
|
135
|
+
// We'll rebuild the moov box by copying it and replacing stco/stsc in each trak
|
|
136
|
+
// Calculate new stco and stsc sizes for each track
|
|
137
|
+
const newStcoBuffers = [];
|
|
138
|
+
const newStscBuffers = [];
|
|
139
|
+
let moovSizeDelta = 0;
|
|
140
|
+
for (let t = 0; t < tracks.length; t++) {
|
|
141
|
+
const track = tracks[t];
|
|
142
|
+
const offsets = trackOffsets[t];
|
|
143
|
+
const n = track.sampleCount;
|
|
144
|
+
// New stco: header(12) + count(4) + n*4 bytes
|
|
145
|
+
const newStcoSize = 16 + n * 4;
|
|
146
|
+
const stcoBuf = Buffer.alloc(newStcoSize);
|
|
147
|
+
stcoBuf.writeUInt32BE(newStcoSize, 0); // box size
|
|
148
|
+
stcoBuf.write('stco', 4); // box type
|
|
149
|
+
stcoBuf.writeUInt32BE(0, 8); // version + flags
|
|
150
|
+
stcoBuf.writeUInt32BE(n, 12); // entry count
|
|
151
|
+
for (let i = 0; i < n; i++) {
|
|
152
|
+
stcoBuf.writeUInt32BE(offsets[i], 16 + i * 4);
|
|
153
|
+
}
|
|
154
|
+
newStcoBuffers.push(stcoBuf);
|
|
155
|
+
moovSizeDelta += newStcoSize - track.stco.size;
|
|
156
|
+
// New stsc: one sample per chunk → single entry (chunk=1, samples_per_chunk=1, desc=1)
|
|
157
|
+
const newStscSize = 28;
|
|
158
|
+
const stscBuf = Buffer.alloc(newStscSize);
|
|
159
|
+
stscBuf.writeUInt32BE(newStscSize, 0);
|
|
160
|
+
stscBuf.write('stsc', 4);
|
|
161
|
+
stscBuf.writeUInt32BE(0, 8); // version + flags
|
|
162
|
+
stscBuf.writeUInt32BE(1, 12); // entry count
|
|
163
|
+
stscBuf.writeUInt32BE(1, 16); // first chunk
|
|
164
|
+
stscBuf.writeUInt32BE(1, 20); // samples per chunk
|
|
165
|
+
stscBuf.writeUInt32BE(1, 24); // sample description index
|
|
166
|
+
newStscBuffers.push(stscBuf);
|
|
167
|
+
moovSizeDelta += newStscSize - track.stsc.size;
|
|
168
|
+
}
|
|
169
|
+
// Now rebuild the moov by copying pieces and replacing stco/stsc
|
|
170
|
+
// We need to update all parent box sizes too
|
|
171
|
+
// Simple approach: rebuild byte by byte
|
|
172
|
+
const moovData = input.subarray(moovBox.offset, moovBox.offset + moovBox.size);
|
|
173
|
+
const newMoovParts = [];
|
|
174
|
+
function rebuildBox(data, boxStart, boxEnd, parentData, trackIndex) {
|
|
175
|
+
const parts = [];
|
|
176
|
+
let pos = boxStart;
|
|
177
|
+
while (pos < boxEnd - 8) {
|
|
178
|
+
const size = parentData.readUInt32BE(pos);
|
|
179
|
+
const type = parentData.toString('ascii', pos + 4, pos + 8);
|
|
180
|
+
if (size === 0 || pos + size > boxEnd)
|
|
181
|
+
break;
|
|
182
|
+
if (type === 'stco') {
|
|
183
|
+
parts.push(newStcoBuffers[trackIndex.value]);
|
|
184
|
+
}
|
|
185
|
+
else if (type === 'stsc') {
|
|
186
|
+
parts.push(newStscBuffers[trackIndex.value]);
|
|
187
|
+
}
|
|
188
|
+
else if (['trak', 'mdia', 'minf', 'stbl'].includes(type)) {
|
|
189
|
+
if (type === 'trak')
|
|
190
|
+
trackIndex.value++;
|
|
191
|
+
// Rebuild container: header + rebuilt children
|
|
192
|
+
const childContent = rebuildBox(parentData, pos + 8, pos + size, parentData, trackIndex);
|
|
193
|
+
const header = Buffer.alloc(8);
|
|
194
|
+
header.writeUInt32BE(8 + childContent.length, 0);
|
|
195
|
+
header.write(type, 4);
|
|
196
|
+
parts.push(header);
|
|
197
|
+
parts.push(childContent);
|
|
198
|
+
}
|
|
199
|
+
else {
|
|
200
|
+
parts.push(parentData.subarray(pos, pos + size));
|
|
201
|
+
}
|
|
202
|
+
pos += size;
|
|
203
|
+
}
|
|
204
|
+
return Buffer.concat(parts);
|
|
205
|
+
}
|
|
206
|
+
const trackIdx = { value: -1 };
|
|
207
|
+
const moovContent = rebuildBox(input, moovBox.offset + 8, moovBox.offset + moovBox.size, input, trackIdx);
|
|
208
|
+
const moovHeader = Buffer.alloc(8);
|
|
209
|
+
moovHeader.writeUInt32BE(8 + moovContent.length, 0);
|
|
210
|
+
moovHeader.write('moov', 4);
|
|
211
|
+
// Now rebuild the file: ftyp + moov + mdat (same order as original)
|
|
212
|
+
const result = [];
|
|
213
|
+
// Walk original top-level boxes and replace moov
|
|
214
|
+
const topBoxes = findBoxes(input, 0, input.length);
|
|
215
|
+
// But we need to update stco offsets if moov size changed
|
|
216
|
+
// because mdat position shifts
|
|
217
|
+
const newMoovSize = 8 + moovContent.length;
|
|
218
|
+
const moovDiff = newMoovSize - moovBox.size;
|
|
219
|
+
// If moov is before mdat, mdat shifts by moovDiff
|
|
220
|
+
// We need to adjust all stco entries
|
|
221
|
+
let mdatShift = 0;
|
|
222
|
+
if (moovBox.offset < mdatBox.offset) {
|
|
223
|
+
mdatShift = moovDiff;
|
|
224
|
+
}
|
|
225
|
+
// Rebuild moov content with adjusted offsets
|
|
226
|
+
if (mdatShift !== 0) {
|
|
227
|
+
// Re-create stco buffers with adjusted offsets
|
|
228
|
+
for (let t = 0; t < tracks.length; t++) {
|
|
229
|
+
const offsets = trackOffsets[t];
|
|
230
|
+
const n = tracks[t].sampleCount;
|
|
231
|
+
const stcoBuf = newStcoBuffers[t];
|
|
232
|
+
for (let i = 0; i < n; i++) {
|
|
233
|
+
stcoBuf.writeUInt32BE(offsets[i] + mdatShift, 16 + i * 4);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
// Rebuild moov again with adjusted stco
|
|
237
|
+
const trackIdx2 = { value: -1 };
|
|
238
|
+
const moovContent2 = rebuildBox(input, moovBox.offset + 8, moovBox.offset + moovBox.size, input, trackIdx2);
|
|
239
|
+
moovHeader.writeUInt32BE(8 + moovContent2.length, 0);
|
|
240
|
+
for (const box of topBoxes) {
|
|
241
|
+
if (box.type === 'moov') {
|
|
242
|
+
result.push(moovHeader);
|
|
243
|
+
result.push(moovContent2);
|
|
244
|
+
}
|
|
245
|
+
else {
|
|
246
|
+
result.push(input.subarray(box.offset, box.offset + box.size));
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
else {
|
|
251
|
+
for (const box of topBoxes) {
|
|
252
|
+
if (box.type === 'moov') {
|
|
253
|
+
result.push(moovHeader);
|
|
254
|
+
result.push(moovContent);
|
|
255
|
+
}
|
|
256
|
+
else {
|
|
257
|
+
result.push(input.subarray(box.offset, box.offset + box.size));
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
return Buffer.concat(result);
|
|
262
|
+
}
|
|
263
|
+
//# sourceMappingURL=mp4fix.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mp4fix.js","sourceRoot":"","sources":["../../src/downloader/mp4fix.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ytgrab",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"description": "A Node.js YouTube video downloader ported from yt-dlp",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -35,10 +35,10 @@
|
|
|
35
35
|
"node": ">=18.0.0"
|
|
36
36
|
},
|
|
37
37
|
"dependencies": {
|
|
38
|
+
"@invintusmedia/tomp4": "^1.7.0",
|
|
38
39
|
"astring": "^1.9.0",
|
|
39
40
|
"got-scraping": "^4.2.1",
|
|
40
|
-
"meriyah": "^6.1.4"
|
|
41
|
-
"mux.js": "^6.3.0"
|
|
41
|
+
"meriyah": "^6.1.4"
|
|
42
42
|
},
|
|
43
43
|
"devDependencies": {
|
|
44
44
|
"@types/node": "^20.0.0",
|