// node module const fs = require("fs"); const https = require("https"); const resolve = require("path").resolve; const join = require("path").resolve; const extract = require("extract-zip"); // 函数参数 const dest = resolve(__dirname, "../"); const fileName = "NeteaseCloudMusicApi-master.zip"; const options = { hostname: "github.91chifun.workers.dev", path: `//https://github.com/Binaryify/NeteaseCloudMusicApi/archive/master.zip`, }; // 完整的流程控制 /** * 1. 检查本地文件是否已有 * 2. 下载默认/指定版本的 zip 压缩包,等待下载 * 3. 解压缩 * 4. 进入目录安装依赖 npm install */ function fix2(number) { return number.toFixed(2); } async function download(options, fileName, callback) { return await new Promise((resolve, reject) => { const destPath = join(__dirname, "../" + fileName); // Check if exist if (fs.existsSync(destPath)) return resolve(destPath); const file = fs.createWriteStream(destPath); const request = https.get(options, (res) => { let len = res.headers && parseInt(res.headers["content-length"], 10); let cur = 0; // 1048576 - bytes in 1Megabyte const MEGA = 1048576; let total = 0; if (len) { total = len / MEGA; } if (!len) { console.log( "Downloading, but can not get content-length, please be patient." ); } res.on("data", (chunk) => { if (len) { cur += chunk.length; console.log( `Downloading ${fix2((100.0 * cur) / len)}% ${fix2( cur / MEGA )}/${fix2(total)}mb` ); } }); res.on("end", () => { callback("Downloading complete!"); }); res.pipe(file); file.on("finish", () => { file.close(() => { callback("File wrote complete!"); resolve(destPath); }); }); file.on("error", (err) => { fs.unlink(destPath); reject(err); }); request.on("error", (err) => { console.log("Error: " + err.message); }); }); }); } async function unzip(source, target) { try { await extract(source, { dir: target, }); console.log("Extraction complete"); return true; } catch (err) { // handle any errors if (err.message === "end of central directory record signature not found") { console.log("Not a full_downloaded zip file, removed!"); fs.unlinkSync(source); } return false; } } // Download process download(options, fileName, (text) => { console.log(text); }).then((path) => { console.log(path); // Unzip process return unzip(path, dest); });