Skip to content

Commit

Permalink
fix download error support.
Browse files Browse the repository at this point in the history
  • Loading branch information
ying_123 committed May 12, 2023
1 parent dffaec5 commit 527a5f8
Show file tree
Hide file tree
Showing 7 changed files with 177 additions and 109 deletions.
4 changes: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -46,3 +46,7 @@ hls2mp4.saveToFile(buffer, 'test.mp4')
const hls2mp4 = new Hls2Mp4({...})
</script>
```

### limitations

#### aes-128 encrypt doesn't support for now
65 changes: 38 additions & 27 deletions dist/hls2mp4.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -108,50 +108,61 @@ var Hls2Mp4 = /** @class */ (function () {
this.instance = ffmpeg.createFFmpeg(options);
this.onProgress = onProgress;
}
Hls2Mp4.prototype.transformBuffer = function (buffer) {
if (buffer[0] === 0x47) {
return buffer;
}
var bufferOffset = 0;
for (var i = 0; i < buffer.length; i++) {
if (buffer[i] === 0x47 && buffer[i + 1] === 0x40) {
bufferOffset = i;
break;
}
}
return buffer.slice(bufferOffset);
};
Hls2Mp4.prototype.downloadM3u8 = function (url) {
var _a, _b, _c;
return __awaiter(this, void 0, void 0, function () {
var _d, content, parsedUrl, keyMatch, key, keyUrl, keyName, _e, _f, _g, segs, i, tsUrl, segName, _h, _j, _k, m3u8;
return __generator(this, function (_l) {
switch (_l.label) {
var _d, content, parsedUrl, keyMatch, segs, i, tsUrl, segName, buffer, _e, m3u8;
return __generator(this, function (_f) {
switch (_f.label) {
case 0:
(_a = this.onProgress) === null || _a === void 0 ? void 0 : _a.call(this, exports.TaskType.parseM3u8, 0);
return [4 /*yield*/, parseM3u8File(url)];
case 1:
_d = _l.sent(), content = _d.content, parsedUrl = _d.url;
_d = _f.sent(), content = _d.content, parsedUrl = _d.url;
keyMatch = content.match(createFileUrlRegExp('key', 'i'));
if (!keyMatch) return [3 /*break*/, 3];
key = keyMatch[0];
keyUrl = parseUrl(parsedUrl, key);
keyName = 'key.key';
_f = (_e = this.instance).FS;
_g = ['writeFile', keyName];
return [4 /*yield*/, ffmpeg.fetchFile(keyUrl)];
case 2:
_f.apply(_e, _g.concat([_l.sent()]));
content = content.replace(key, keyName);
_l.label = 3;
case 3:
if (keyMatch) {
throw new Error('video encrypted did not supported for now');
/*
const key = keyMatch[0]
const keyUrl = parseUrl(parsedUrl, key)
const keyName = 'key.key'
this.instance.FS('writeFile', keyName, await fetchFile(keyUrl))
content = content.replace(key, keyName)
*/
}
(_b = this.onProgress) === null || _b === void 0 ? void 0 : _b.call(this, exports.TaskType.parseM3u8, 1);
segs = content.match(createFileUrlRegExp('ts', 'gi'));
i = 0;
_l.label = 4;
case 4:
if (!(i < segs.length)) return [3 /*break*/, 7];
_f.label = 2;
case 2:
if (!(i < segs.length)) return [3 /*break*/, 5];
tsUrl = parseUrl(parsedUrl, segs[i]);
segName = "seg-".concat(i, ".ts");
_j = (_h = this.instance).FS;
_k = ['writeFile', segName];
_e = this.transformBuffer;
return [4 /*yield*/, ffmpeg.fetchFile(tsUrl)];
case 5:
_j.apply(_h, _k.concat([_l.sent()]));
case 3:
buffer = _e.apply(this, [_f.sent()]);
this.instance.FS('writeFile', segName, buffer);
(_c = this.onProgress) === null || _c === void 0 ? void 0 : _c.call(this, exports.TaskType.downloadTs, (i + 1) / segs.length);
content = content.replace(segs[i], segName);
_l.label = 6;
case 6:
_f.label = 4;
case 4:
i++;
return [3 /*break*/, 4];
case 7:
return [3 /*break*/, 2];
case 5:
m3u8 = 'temp.m3u8';
this.instance.FS('writeFile', m3u8, content);
return [2 /*return*/, m3u8];
Expand Down
65 changes: 38 additions & 27 deletions dist/hls2mp4.js
Original file line number Diff line number Diff line change
Expand Up @@ -105,50 +105,61 @@
this.instance = ffmpeg.createFFmpeg(options);
this.onProgress = onProgress;
}
Hls2Mp4.prototype.transformBuffer = function (buffer) {
if (buffer[0] === 0x47) {
return buffer;
}
var bufferOffset = 0;
for (var i = 0; i < buffer.length; i++) {
if (buffer[i] === 0x47 && buffer[i + 1] === 0x40) {
bufferOffset = i;
break;
}
}
return buffer.slice(bufferOffset);
};
Hls2Mp4.prototype.downloadM3u8 = function (url) {
var _a, _b, _c;
return __awaiter(this, void 0, void 0, function () {
var _d, content, parsedUrl, keyMatch, key, keyUrl, keyName, _e, _f, _g, segs, i, tsUrl, segName, _h, _j, _k, m3u8;
return __generator(this, function (_l) {
switch (_l.label) {
var _d, content, parsedUrl, keyMatch, segs, i, tsUrl, segName, buffer, _e, m3u8;
return __generator(this, function (_f) {
switch (_f.label) {
case 0:
(_a = this.onProgress) === null || _a === void 0 ? void 0 : _a.call(this, exports.TaskType.parseM3u8, 0);
return [4 /*yield*/, parseM3u8File(url)];
case 1:
_d = _l.sent(), content = _d.content, parsedUrl = _d.url;
_d = _f.sent(), content = _d.content, parsedUrl = _d.url;
keyMatch = content.match(createFileUrlRegExp('key', 'i'));
if (!keyMatch) return [3 /*break*/, 3];
key = keyMatch[0];
keyUrl = parseUrl(parsedUrl, key);
keyName = 'key.key';
_f = (_e = this.instance).FS;
_g = ['writeFile', keyName];
return [4 /*yield*/, ffmpeg.fetchFile(keyUrl)];
case 2:
_f.apply(_e, _g.concat([_l.sent()]));
content = content.replace(key, keyName);
_l.label = 3;
case 3:
if (keyMatch) {
throw new Error('video encrypted did not supported for now');
/*
const key = keyMatch[0]
const keyUrl = parseUrl(parsedUrl, key)
const keyName = 'key.key'
this.instance.FS('writeFile', keyName, await fetchFile(keyUrl))
content = content.replace(key, keyName)
*/
}
(_b = this.onProgress) === null || _b === void 0 ? void 0 : _b.call(this, exports.TaskType.parseM3u8, 1);
segs = content.match(createFileUrlRegExp('ts', 'gi'));
i = 0;
_l.label = 4;
case 4:
if (!(i < segs.length)) return [3 /*break*/, 7];
_f.label = 2;
case 2:
if (!(i < segs.length)) return [3 /*break*/, 5];
tsUrl = parseUrl(parsedUrl, segs[i]);
segName = "seg-".concat(i, ".ts");
_j = (_h = this.instance).FS;
_k = ['writeFile', segName];
_e = this.transformBuffer;
return [4 /*yield*/, ffmpeg.fetchFile(tsUrl)];
case 5:
_j.apply(_h, _k.concat([_l.sent()]));
case 3:
buffer = _e.apply(this, [_f.sent()]);
this.instance.FS('writeFile', segName, buffer);
(_c = this.onProgress) === null || _c === void 0 ? void 0 : _c.call(this, exports.TaskType.downloadTs, (i + 1) / segs.length);
content = content.replace(segs[i], segName);
_l.label = 6;
case 6:
_f.label = 4;
case 4:
i++;
return [3 /*break*/, 4];
case 7:
return [3 /*break*/, 2];
case 5:
m3u8 = 'temp.m3u8';
this.instance.FS('writeFile', m3u8, content);
return [2 /*return*/, m3u8];
Expand Down
65 changes: 38 additions & 27 deletions dist/hls2mp4.umd.js
Original file line number Diff line number Diff line change
Expand Up @@ -108,50 +108,61 @@
this.instance = ffmpeg.createFFmpeg(options);
this.onProgress = onProgress;
}
Hls2Mp4.prototype.transformBuffer = function (buffer) {
if (buffer[0] === 0x47) {
return buffer;
}
var bufferOffset = 0;
for (var i = 0; i < buffer.length; i++) {
if (buffer[i] === 0x47 && buffer[i + 1] === 0x40) {
bufferOffset = i;
break;
}
}
return buffer.slice(bufferOffset);
};
Hls2Mp4.prototype.downloadM3u8 = function (url) {
var _a, _b, _c;
return __awaiter(this, void 0, void 0, function () {
var _d, content, parsedUrl, keyMatch, key, keyUrl, keyName, _e, _f, _g, segs, i, tsUrl, segName, _h, _j, _k, m3u8;
return __generator(this, function (_l) {
switch (_l.label) {
var _d, content, parsedUrl, keyMatch, segs, i, tsUrl, segName, buffer, _e, m3u8;
return __generator(this, function (_f) {
switch (_f.label) {
case 0:
(_a = this.onProgress) === null || _a === void 0 ? void 0 : _a.call(this, exports.TaskType.parseM3u8, 0);
return [4 /*yield*/, parseM3u8File(url)];
case 1:
_d = _l.sent(), content = _d.content, parsedUrl = _d.url;
_d = _f.sent(), content = _d.content, parsedUrl = _d.url;
keyMatch = content.match(createFileUrlRegExp('key', 'i'));
if (!keyMatch) return [3 /*break*/, 3];
key = keyMatch[0];
keyUrl = parseUrl(parsedUrl, key);
keyName = 'key.key';
_f = (_e = this.instance).FS;
_g = ['writeFile', keyName];
return [4 /*yield*/, ffmpeg.fetchFile(keyUrl)];
case 2:
_f.apply(_e, _g.concat([_l.sent()]));
content = content.replace(key, keyName);
_l.label = 3;
case 3:
if (keyMatch) {
throw new Error('video encrypted did not supported for now');
/*
const key = keyMatch[0]
const keyUrl = parseUrl(parsedUrl, key)
const keyName = 'key.key'
this.instance.FS('writeFile', keyName, await fetchFile(keyUrl))
content = content.replace(key, keyName)
*/
}
(_b = this.onProgress) === null || _b === void 0 ? void 0 : _b.call(this, exports.TaskType.parseM3u8, 1);
segs = content.match(createFileUrlRegExp('ts', 'gi'));
i = 0;
_l.label = 4;
case 4:
if (!(i < segs.length)) return [3 /*break*/, 7];
_f.label = 2;
case 2:
if (!(i < segs.length)) return [3 /*break*/, 5];
tsUrl = parseUrl(parsedUrl, segs[i]);
segName = "seg-".concat(i, ".ts");
_j = (_h = this.instance).FS;
_k = ['writeFile', segName];
_e = this.transformBuffer;
return [4 /*yield*/, ffmpeg.fetchFile(tsUrl)];
case 5:
_j.apply(_h, _k.concat([_l.sent()]));
case 3:
buffer = _e.apply(this, [_f.sent()]);
this.instance.FS('writeFile', segName, buffer);
(_c = this.onProgress) === null || _c === void 0 ? void 0 : _c.call(this, exports.TaskType.downloadTs, (i + 1) / segs.length);
content = content.replace(segs[i], segName);
_l.label = 6;
case 6:
_f.label = 4;
case 4:
i++;
return [3 /*break*/, 4];
case 7:
return [3 /*break*/, 2];
case 5:
m3u8 = 'temp.m3u8';
this.instance.FS('writeFile', m3u8, content);
return [2 /*return*/, m3u8];
Expand Down
1 change: 1 addition & 0 deletions dist/index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ export default class Hls2Mp4 {
private instance;
onProgress?: ProgressCallback;
constructor(options: CreateFFmpegOptions, onProgress?: ProgressCallback);
private transformBuffer;
private downloadM3u8;
download(url: string): Promise<ArrayBufferLike>;
saveToFile(buffer: ArrayBufferLike, filename: string): void;
Expand Down
65 changes: 38 additions & 27 deletions dist/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -104,50 +104,61 @@ var Hls2Mp4 = /** @class */ (function () {
this.instance = createFFmpeg(options);
this.onProgress = onProgress;
}
Hls2Mp4.prototype.transformBuffer = function (buffer) {
if (buffer[0] === 0x47) {
return buffer;
}
var bufferOffset = 0;
for (var i = 0; i < buffer.length; i++) {
if (buffer[i] === 0x47 && buffer[i + 1] === 0x40) {
bufferOffset = i;
break;
}
}
return buffer.slice(bufferOffset);
};
Hls2Mp4.prototype.downloadM3u8 = function (url) {
var _a, _b, _c;
return __awaiter(this, void 0, void 0, function () {
var _d, content, parsedUrl, keyMatch, key, keyUrl, keyName, _e, _f, _g, segs, i, tsUrl, segName, _h, _j, _k, m3u8;
return __generator(this, function (_l) {
switch (_l.label) {
var _d, content, parsedUrl, keyMatch, segs, i, tsUrl, segName, buffer, _e, m3u8;
return __generator(this, function (_f) {
switch (_f.label) {
case 0:
(_a = this.onProgress) === null || _a === void 0 ? void 0 : _a.call(this, TaskType.parseM3u8, 0);
return [4 /*yield*/, parseM3u8File(url)];
case 1:
_d = _l.sent(), content = _d.content, parsedUrl = _d.url;
_d = _f.sent(), content = _d.content, parsedUrl = _d.url;
keyMatch = content.match(createFileUrlRegExp('key', 'i'));
if (!keyMatch) return [3 /*break*/, 3];
key = keyMatch[0];
keyUrl = parseUrl(parsedUrl, key);
keyName = 'key.key';
_f = (_e = this.instance).FS;
_g = ['writeFile', keyName];
return [4 /*yield*/, fetchFile(keyUrl)];
case 2:
_f.apply(_e, _g.concat([_l.sent()]));
content = content.replace(key, keyName);
_l.label = 3;
case 3:
if (keyMatch) {
throw new Error('video encrypted did not supported for now');
/*
const key = keyMatch[0]
const keyUrl = parseUrl(parsedUrl, key)
const keyName = 'key.key'
this.instance.FS('writeFile', keyName, await fetchFile(keyUrl))
content = content.replace(key, keyName)
*/
}
(_b = this.onProgress) === null || _b === void 0 ? void 0 : _b.call(this, TaskType.parseM3u8, 1);
segs = content.match(createFileUrlRegExp('ts', 'gi'));
i = 0;
_l.label = 4;
case 4:
if (!(i < segs.length)) return [3 /*break*/, 7];
_f.label = 2;
case 2:
if (!(i < segs.length)) return [3 /*break*/, 5];
tsUrl = parseUrl(parsedUrl, segs[i]);
segName = "seg-".concat(i, ".ts");
_j = (_h = this.instance).FS;
_k = ['writeFile', segName];
_e = this.transformBuffer;
return [4 /*yield*/, fetchFile(tsUrl)];
case 5:
_j.apply(_h, _k.concat([_l.sent()]));
case 3:
buffer = _e.apply(this, [_f.sent()]);
this.instance.FS('writeFile', segName, buffer);
(_c = this.onProgress) === null || _c === void 0 ? void 0 : _c.call(this, TaskType.downloadTs, (i + 1) / segs.length);
content = content.replace(segs[i], segName);
_l.label = 6;
case 6:
_f.label = 4;
case 4:
i++;
return [3 /*break*/, 4];
case 7:
return [3 /*break*/, 2];
case 5:
m3u8 = 'temp.m3u8';
this.instance.FS('writeFile', m3u8, content);
return [2 /*return*/, m3u8];
Expand Down
Loading

0 comments on commit 527a5f8

Please sign in to comment.