* add camdict db & logic * refactor camdict * refactor media caption * display camdict result
112 lines
3.2 KiB
JavaScript
Executable File
112 lines
3.2 KiB
JavaScript
Executable File
#!/usr/bin/env zx
|
|
|
|
import axios from "axios";
|
|
import progress from "progress";
|
|
import { createHash } from "crypto";
|
|
|
|
const dict = "cam_dict.refined.sqlite";
|
|
const sha = "ff97dbd1e6b5357c4a0b42d3c6b1dce0dbc497dc";
|
|
|
|
const dir = path.join(process.cwd(), "lib/dictionaries");
|
|
|
|
console.info(chalk.blue(`=> Download dictionary ${dict}`));
|
|
|
|
fs.ensureDirSync(dir);
|
|
try {
|
|
if (fs.statSync(path.join(dir, dict)).isFile()) {
|
|
console.info(chalk.green(`✅ Dict ${dict} already exists`));
|
|
const hash = await hashFile(path.join(dir, dict), { algo: "sha1" });
|
|
if (hash === sha) {
|
|
console.info(chalk.green(`✅ Dict ${dict} valid`));
|
|
process.exit(0);
|
|
} else {
|
|
console.error(
|
|
chalk.red(`❌ Dict ${dict} not valid, start to redownload`)
|
|
);
|
|
fs.removeSync(path.join(dir, dict));
|
|
}
|
|
}
|
|
} catch (err) {
|
|
if (err && err.code !== "ENOENT") {
|
|
console.error(chalk.red(`❌ Error: ${err}`));
|
|
process.exit(1);
|
|
} else {
|
|
console.info(chalk.blue(`=> Start to download dict ${dict}`));
|
|
}
|
|
}
|
|
|
|
const proxyUrl =
|
|
process.env.HTTPS_PROXY ||
|
|
process.env.https_proxy ||
|
|
process.env.HTTP_PROXY ||
|
|
process.env.http_proxy;
|
|
|
|
if (proxyUrl) {
|
|
const { hostname, port, protocol } = new URL(proxyUrl);
|
|
axios.defaults.proxy = {
|
|
host: hostname,
|
|
port: port,
|
|
protocol: protocol,
|
|
};
|
|
}
|
|
|
|
const dictUrlPrefix = "https://enjoy-storage.baizhiheizi.com";
|
|
|
|
function hashFile(path, options) {
|
|
const algo = options.algo || "sha1";
|
|
return new Promise((resolve, reject) => {
|
|
const hash = createHash(algo);
|
|
const stream = fs.createReadStream(path);
|
|
stream.on("error", reject);
|
|
stream.on("data", (chunk) => hash.update(chunk));
|
|
stream.on("end", () => resolve(hash.digest("hex")));
|
|
});
|
|
}
|
|
|
|
const download = async (url, dest) => {
|
|
console.info(chalk.blue(`=> Start to download from ${url} to ${dest}`));
|
|
return axios
|
|
.get(url, { responseType: "stream" })
|
|
.then((response) => {
|
|
const totalLength = response.headers["content-length"];
|
|
|
|
const progressBar = new progress(`-> downloading [:bar] :percent :etas`, {
|
|
width: 40,
|
|
complete: "=",
|
|
incomplete: " ",
|
|
renderThrottle: 1,
|
|
total: parseInt(totalLength),
|
|
});
|
|
|
|
response.data.on("data", (chunk) => {
|
|
progressBar.tick(chunk.length);
|
|
});
|
|
|
|
response.data.pipe(fs.createWriteStream(dest)).on("close", async () => {
|
|
console.info(chalk.green(`✅ Dict ${dict} downloaded successfully`));
|
|
const hash = await hashFile(path.join(dir, dict), { algo: "sha1" });
|
|
if (hash === sha) {
|
|
console.info(chalk.green(`✅ Dict ${dict} valid`));
|
|
process.exit(0);
|
|
} else {
|
|
console.error(
|
|
chalk.red(
|
|
`❌ Dict ${dict} not valid, please try again using command \`yarn workspace enjoy download-dictionaries\``
|
|
)
|
|
);
|
|
process.exit(1);
|
|
}
|
|
});
|
|
})
|
|
.catch((err) => {
|
|
console.error(
|
|
chalk.red(
|
|
`❌ Failed to download ${url}: ${err}.\nPlease try again using command \`yarn workspace enjoy download-dictionaries\``
|
|
)
|
|
);
|
|
process.exit(1);
|
|
});
|
|
};
|
|
|
|
await download(`${dictUrlPrefix}/${dict}`, path.join(dir, dict));
|