UNPKG

@yeci226/nhentai-ts

Version:

A scraper for NHentai with types

157 lines (156 loc) 5.95 kB
"use strict"; 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 });