@yeci226/nhentai-ts
Version:
A scraper for NHentai with types
157 lines (156 loc) • 5.95 kB
JavaScript
;
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
// If the importer is in node compatibility mode or this is not an ESM
// file that has been converted to a CommonJS file using a Babel-
// compatible transform (i.e. "__esModule" has not been set), then set
// "default" to the CommonJS "module.exports" for node compatibility.
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
mod
));
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
var __accessCheck = (obj, member, msg) => {
if (!member.has(obj))
throw TypeError("Cannot " + msg);
};
var __privateGet = (obj, member, getter) => {
__accessCheck(obj, member, "read from private field");
return getter ? getter.call(obj) : member.get(obj);
};
var __privateAdd = (obj, member, value) => {
if (member.has(obj))
throw TypeError("Cannot add the same private member more than once");
member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
};
var __privateSet = (obj, member, value, setter) => {
__accessCheck(obj, member, "write to private field");
setter ? setter.call(obj, value) : member.set(obj, value);
return value;
};
var Pages_exports = {};
__export(Pages_exports, {
Pages: () => Pages
});
module.exports = __toCommonJS(Pages_exports);
var import_pdfkit = __toESM(require("pdfkit"));
var import_os = require("os");
var import_promises = require("fs/promises");
var import_fs = require("fs");
var import_axios = __toESM(require("axios"));
var import_jszip = __toESM(require("jszip"));
var import_path = require("path");
var _title;
class Pages {
/**
*
* @param pages An array of URLS of the doujin pages
*/
constructor(pages, __title) {
this.pages = pages;
__privateAdd(this, _title, void 0);
__privateSet(this, _title, __title);
}
async PDF(filename) {
const pdf = new import_pdfkit.default({ autoFirstPage: false });
const file = filename ? "".concat(filename).concat(filename.endsWith(".pdf") ? "" : ".pdf") : "".concat((0, import_os.tmpdir)(), "/").concat(Math.random().toString(36), ".pdf");
const stream = (0, import_fs.createWriteStream)(file);
pdf.pipe(stream);
for (const url of this.pages) {
const { data } = await import_axios.default.get(url, {
headers: url.includes("cdn.dogehls.xyz") ? { Referer: "https://nhentai.to" } : {},
responseType: "arraybuffer"
});
pdf.addPage();
pdf.image(new Uint8Array(data), 0, 0, {
fit: [pdf.page.width, pdf.page.height]
});
const index = this.pages.indexOf(url);
if (index === this.pages.length - 1)
pdf.end();
}
await new Promise((resolve, reject) => {
stream.on("finish", () => resolve(file));
stream.on("error", reject);
});
if (filename)
return file;
const buffer = await (0, import_promises.readFile)(file);
await (0, import_promises.unlink)(file);
return buffer;
}
async zip(filename) {
const zip = new import_jszip.default();
const folder = zip.folder(__privateGet(this, _title));
for (const url of this.pages)
folder.file(
"".concat(this.pages.indexOf(url) + 1, ".").concat(url.split(".")[url.split(".").length - 1]),
new Uint8Array(
(await import_axios.default.get(url, {
headers: url.includes("cdn.dogehls.xyz") ? { Referer: "https://nhentai.to" } : {},
responseType: "arraybuffer"
})).data
),
{ binary: true }
);
const buffer = await zip.generateAsync({ type: "nodebuffer" });
if (filename) {
await (0, import_promises.writeFile)(
"".concat(filename).concat(filename.endsWith(".zip") ? "" : ".zip"),
new Uint8Array(buffer)
);
return "".concat(filename).concat(filename.endsWith(".zip") ? "" : ".zip");
}
return buffer;
}
/**
* Downloads the pages of a doujin and saves all of it in a folder
* @param folderName The name of the folder in which all of the pages should be saved
*/
async download(folderName) {
if (!folderName)
throw new Error(
"No folder name provided to save the downloaded doujin pages"
);
if (!(0, import_fs.existsSync)(folderName))
await (0, import_promises.mkdir)(folderName, { recursive: true });
const isDirectory = (await (0, import_promises.stat)(folderName)).isDirectory();
if (!isDirectory)
throw new Error(
"Expected a directory for saving the downloads, but recieved a file."
);
for (const url of this.pages)
await (0, import_promises.writeFile)(
(0, import_path.join)(
folderName,
"".concat(this.pages.indexOf(url) + 1, ".").concat(url.split(".")[url.split(".").length - 1])
),
new Uint8Array(
(await import_axios.default.get(url, {
responseType: "arraybuffer"
})).data
)
);
}
}
_title = new WeakMap();
// Annotate the CommonJS export names for ESM import in node:
0 && (module.exports = {
Pages
});