From 1c0b633575070e2d78d760161915279b08784f36 Mon Sep 17 00:00:00 2001 From: Mimi <1119186082@qq.com> Date: Wed, 5 Apr 2023 15:01:41 +0800 Subject: [PATCH] Follow HTTP Redirect --- app/js/downloader.js | 31 +++++++++++++++++++------------ app/js/panel.js | 6 ++++-- 2 files changed, 23 insertions(+), 14 deletions(-) diff --git a/app/js/downloader.js b/app/js/downloader.js index 0fbc664..0af2376 100644 --- a/app/js/downloader.js +++ b/app/js/downloader.js @@ -137,10 +137,8 @@ class Downloader { return result; } - downloadByIndex(part) { - const { name, cid, url } = this; - const downloadPath = document.getElementById("downloadPath").value; - const filename = document.getElementById("videoName").value || name || cid; + downloadByIndex(part, downloadPath, filename) { + const { url } = this; const file = path.join(downloadPath, `${sanitize(filename)}-${part}.flv`); if (this.tasks.some(item => item.url === this.links[part])) return "DUPLICATE"; @@ -159,15 +157,15 @@ class Downloader { "Referer": url } }; - const downloads = fs.createWriteStream(file, state ? { flags: "a" } : {}), + const stream = fs.createWriteStream(file, state ? { flags: "a" } : {}), index = this.tasks.findIndex(item => item.url === options.url); - this.download(index, options, downloads); + this.download(index, options, stream); //console.log(this.cid, file, options.url); return state; } - download(index, options, downloads) { + download(index, options, stream) { // https://www.npmjs.com/package/progress-stream const proStream = progress({ time: 250 //单位ms @@ -185,11 +183,20 @@ class Downloader { } }); //先pipe到proStream再pipe到文件的写入流中 - (options.url.startsWith("https") ? https : http).get(options.url, options, res => { - proStream.setLength(res.headers["content-length"]); - res.pipe(proStream).pipe(downloads).on("error", error => { - console.error(error); + + let { url } = options; + function downloadLink(url) { + (url.startsWith("https") ? https : http).get(url, options, res => { + if (res.statusCode === 302) { + url = res.headers.location; + return downloadLink(url); + } + proStream.setLength(res.headers["content-length"]); + res.pipe(proStream).pipe(stream).on("error", error => { + console.error(error); + }); }); - }); + } + downloadLink(url); } } diff --git a/app/js/panel.js b/app/js/panel.js index 4c54aac..f571a54 100644 --- a/app/js/panel.js +++ b/app/js/panel.js @@ -69,11 +69,13 @@ class Panel { } downloadChecked() { - const { cid } = downloader; + const { name, cid } = downloader; + const downloadPath = document.getElementById("downloadPath").value; + const filename = document.getElementById("videoName").value || name || cid; let flag = true; document.querySelectorAll("tbody input[type=checkbox]").forEach((element, part) => { if (!element.checked) return; - const state = downloader.downloadByIndex(part); + const state = downloader.downloadByIndex(part, downloadPath, filename); if (state === "DUPLICATE") return; const addon = state ? `从 ${Math.round(state.size / 1e6)}MB 处恢复的下载` : ""; document.getElementById("download").insertAdjacentHTML("beforeend", `${cid}-${part}