小说下载器

一个可扩展的通用型小说下载器。

目前為 2021-04-27 提交的版本,檢視 最新版本

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name         小说下载器
// @version      3.5.1.1619538975233
// @author       bgme
// @description  一个可扩展的通用型小说下载器。
// @supportURL   https://github.com/yingziwu/novel-downloader
// @match        *://www.ciweimao.com/chapter-list/*
// @match        *://book.sfacg.com/Novel/*/MainIndex/
// @match        *://book.qidian.com/info/*
// @match        *://www.jjwxc.net/onebook.php?novelid=*
// @match        *://book.zongheng.com/showchapter/*.html
// @match        *://huayu.zongheng.com/showchapter/*.html
// @match        *://www.17k.com/list/*.html
// @match        *://www.shuhai.com/book/*.htm
// @match        *://mm.shuhai.com/book/*.htm
// @match        *://www.uukanshu.com/b/*/
// @match        *://www.yruan.com/article/*.html
// @match        *://www.biquwoo.com/bqw*/
// @match        *://www.shuquge.com/txt/*/index.html
// @match        *://www.dingdiann.net/ddk*/
// @match        *://www.xkzw.org/xkzw*/
// @match        *://www.266ks.com/*/
// @match        *://www.266ks.com/*/index*.html
// @match        *://www.hetushu.com/book/*/index.html
// @match        *://www.shouda8.com/*/
// @match        *://www.shouda88.com/*/
// @match        *://www.gebiqu.com/biquge_*/
// @match        *://www.meegoq.com/book*.html
// @match        *://www.viviyzw.com/book*.html
// @match        *://www.xiaoshuodaquan.com/*/
// @match        *://www.81book.com/book/*/
// @namespace    https://blog.bgme.me
// @icon         data:image/png;base64,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
// @license      AGPL-3.0
// @run-at       document-end
// @noframes     true
// @incompatible Greasemonkey
// @exclude      *://www.jjwxc.net/onebook.php?novelid=*&chapterid=*
// @exclude      *://www.meegoq.com/book/*.html
// @exclude      *://www.viviyzw.com/book/*.html
// @exclude      *://www.yruan.com/article/*/*.html
// @grant        unsafeWindow
// @grant        GM_info
// @grant        GM_xmlhttpRequest
// @grant        GM_getTab
// @grant        GM_saveTab
// @grant        GM_getTabs
// @grant        GM.info
// @grant        GM.xmlHttpRequest
// @connect      img.shouda8.com
// @connect      qidian.com
// @connect      yuewen.com
// @connect      kuangxiangit.com
// @connect      sinaimg.cn
// @connect      jjwxc.net
// @connect      image.gebiqu.com
// @connect      qidian.qpic.cn
// @connect      zongheng.com
// @connect      17k.com
// @connect      www.shuhai.com
// @connect      img.uukanshu.com
// @connect      oss-accelerate.aliyuncs.com
// @connect      cdn.bcebos.com
// @connect      rs.sfacg.com
// @connect      shuhai.com
// @require      https://cdn.jsdelivr.net/npm/[email protected]/dist/FileSaver.min.js#sha512-Qlv6VSKh1gDKGoJbnyA5RMXYcvnpIqhO++MhIM2fStMcGT9i2T//tSwYFlcyoRRDcDZ+TYHpH8azBBCyhpSeqw==
// @require      https://cdn.jsdelivr.net/npm/[email protected]/dist/jszip.min.js#sha512-uVSVjE7zYsGz4ag0HEzfugJ78oHCI1KhdkivjQro8ABL/PRiEO4ROwvrolYAcZnky0Fl/baWKYilQfWvESliRA==
// @require      https://cdn.jsdelivr.net/npm/[email protected]/crypto-js.min.js#sha512-s+p/j7+gSFJa1SUEwmPBAlitcUccgbaTTM3yRSmDHUp0UCcRdBMgI2toIT97ZKGKItfV3N66PEZbHcT/iS5thg==
// ==/UserScript==

/******/ (() => { // webpackBootstrap
/******/ 	"use strict";
/******/ 	var __webpack_modules__ = ({

/***/ 563:
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {


Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.sleep = exports.concurrencyRun = exports.gfetch = exports.rm = exports.cosCompare = exports.ggetHtmlDOM = exports.ggetHtmlText = exports.getHtmlDOM = exports.getHtmlText = exports.cleanDOM = exports._GM_info = void 0;
const main_1 = __webpack_require__(519);
try {
    exports._GM_info = GM_info;
}
catch (error) {
    try {
        exports._GM_info = GM.info;
    }
    catch (error) {
        console.error("未发现 _GM_info API");
    }
}
let _GM_xmlhttpRequest;
try {
    _GM_xmlhttpRequest = GM_xmlhttpRequest;
}
catch (error) {
    try {
        _GM_xmlhttpRequest = GM.xmlHttpRequest;
    }
    catch (error) {
        console.error("未发现 _GM_xmlhttpRequest API");
    }
}
class CleanerClass {
    constructor(imgMode) {
        this.imgMode = imgMode;
        this.statusType = {
            init: this.parse_init,
            p: this.parse_p,
            br: this.parse_br,
            hr: this.parse_hr,
        };
        this.typeParagraph = [
            "DIV",
            "P",
            "OL",
            "H1",
            "H1",
            "H2",
            "H3",
            "H4",
            "H5",
            "H6",
        ];
        this.typeInto = ["IMG", "HR", "BR"];
        this.currentHtml = document.createElement("p");
        this.currentText = "";
        this.br_count = 0;
        this.images = [];
        this.doms = [];
        this.texts = [];
        this.status = "init";
    }
    reset_current() {
        this.currentHtml = document.createElement("p");
        this.currentText = "";
    }
    create_pbr() {
        const p = document.createElement("p");
        const br = document.createElement("br");
        p.appendChild(br);
        return p;
    }
    parse_init(element) {
        var _a, _b;
        const nodeName = element.nodeName;
        if (nodeName === "#text" && ((_a = element.textContent) === null || _a === void 0 ? void 0 : _a.trim()) !== "") {
            this.br_count = 0;
            this.status = "p";
            this.currentText += (_b = element.textContent) === null || _b === void 0 ? void 0 : _b.trim();
        }
        else if (this.typeParagraph.includes(nodeName)) {
            this.meet_p(element, nodeName);
        }
        else if (nodeName === "BR") {
            this.br_count++;
            this.status = "br";
        }
        else if (nodeName === "IMG") {
            this.meet_img(element);
        }
        else if (nodeName === "HR") {
            this.meet_hr();
        }
    }
    parse_p(element) {
        const nodeName = element.nodeName;
        if (nodeName === "BR") {
            this.br_count++;
            this.status = "br";
            this.currentText += "\n";
        }
        else if (this.typeParagraph.includes(nodeName)) {
            this.meet_p(element, nodeName);
        }
        else if (nodeName === "IMG") {
            this.meet_img(element);
        }
        else if (nodeName === "HR") {
            this.meet_hr();
        }
    }
    parse_br(element) {
        var _a, _b;
        const nodeName = element.nodeName;
        if (nodeName === "BR") {
            this.br_count++;
            if (this.br_count <= 4) {
                this.currentText += "\n";
            }
        }
        else if (nodeName === "#text" && ((_a = element.textContent) === null || _a === void 0 ? void 0 : _a.trim()) !== "") {
            this.meet_br_push();
            this.status = "p";
            this.currentText += (_b = element.textContent) === null || _b === void 0 ? void 0 : _b.trim();
        }
        else if (this.typeParagraph.includes(nodeName)) {
            if (this.br_count > 2) {
                this.doms.push(this.create_pbr());
            }
            this.meet_p(element, nodeName);
        }
        else if (nodeName === "IMG") {
            this.meet_img(element);
        }
        else if (nodeName === "HR") {
            this.meet_hr();
        }
    }
    parse_hr(element) {
        var _a, _b;
        const nodeName = element.nodeName;
        if (nodeName === "#text" && ((_a = element.textContent) === null || _a === void 0 ? void 0 : _a.trim()) !== "") {
            this.br_count = 0;
            this.status = "p";
            this.currentText += (_b = element.textContent) === null || _b === void 0 ? void 0 : _b.trim();
            this.currentHtml.innerText = this.currentText;
        }
        else if (this.typeParagraph.includes(nodeName)) {
            this.meet_p(element, nodeName);
        }
        else if (nodeName === "IMG") {
            this.meet_img(element);
        }
    }
    meet_p(element, nodeName) {
        var _a;
        this.br_count = 0;
        const childrenNodeNamesSet = new Set(Array.from(element.children).map((ele) => ele.nodeName));
        const typeParagraphSet = new Set(this.typeParagraph);
        const intersectParagraph = Array.from(childrenNodeNamesSet).filter((x) => typeParagraphSet.has(x));
        const typeIntoSet = new Set(this.typeInto);
        const intersectInto = Array.from(childrenNodeNamesSet).filter((x) => typeIntoSet.has(x));
        if (intersectParagraph.length !== 0 || intersectInto.length != 0) {
            this.meet_text_push();
            const subcleaner = new CleanerClass(this.imgMode);
            const subcleanerBound = subcleaner.clean.bind(this);
            subcleanerBound(element);
            this.status = "init";
        }
        else {
            this.status = "p";
            this.currentText += "\n".repeat(2);
            this.currentText += (_a = element.textContent) === null || _a === void 0 ? void 0 : _a.trim();
            this.meet_text_push();
        }
    }
    meet_img(element) {
        function genImageName(url) {
            let t = btoa(new URL(url).pathname.split("/").slice(-2).join("/")) +
                `.${url.split(".").slice(-1)[0]}`;
            if (t.length >= 125) {
                t =
                    btoa(new URL(url).pathname.split("/").slice(-1)[0]) +
                        `.${url.split(".").slice(-1)[0]}`;
            }
            return t;
        }
        this.meet_br_push();
        this.br_count = 0;
        const imageUrl = element.src;
        const imageName = genImageName(imageUrl);
        const image = new main_1.attachmentClass(imageUrl, imageName, this.imgMode);
        image.init();
        this.images.push(image);
        const pimg = document.createElement("p");
        const img = document.createElement("img");
        img.src = imageName;
        img.alt = imageUrl;
        pimg.appendChild(img);
        this.doms.push(pimg);
        this.texts.push(`\n![${img.alt}](${img.src})\n`);
    }
    meet_hr() {
        this.meet_br_push();
        this.br_count = 0;
        this.status = "hr";
        this.texts.push(`\n${"-".repeat(20)}\n`);
        const hr = document.createElement("hr");
        this.doms.push(hr);
    }
    meet_text_push() {
        this.currentHtml.innerText = this.currentText.trim();
        this.doms.push(this.currentHtml);
        this.texts.push(this.currentText);
        this.reset_current();
    }
    meet_br_push() {
        if (this.br_count === 1) {
            this.br_count = 0;
            this.meet_text_push();
        }
        else if (this.br_count === 2) {
            this.br_count = 0;
            this.meet_text_push();
        }
        else if (this.br_count >= 3) {
            this.br_count = 0;
            this.meet_text_push();
            this.doms.push(this.create_pbr());
        }
    }
    clean(DOM) {
        let i = 0;
        while (i < DOM.childNodes.length) {
            const fn = this.statusType[this.status].bind(this);
            fn(DOM.childNodes[i]);
            i++;
        }
        this.meet_text_push();
        return { doms: this.doms, texts: this.texts, images: this.images };
    }
}
function cleanDOM(DOM, imgMode) {
    const cleaner = new CleanerClass(imgMode);
    const { doms, texts, images } = cleaner.clean(DOM);
    const outputDOM = document.createElement("div");
    for (const dom of doms) {
        outputDOM.appendChild(dom);
    }
    let outputText = "";
    for (const t of texts) {
        outputText += t;
    }
    outputText = outputText.trim();
    return { dom: outputDOM, text: outputText, images: images };
}
exports.cleanDOM = cleanDOM;
async function getHtmlText(url, charset) {
    if (charset === undefined) {
        return fetch(url).then((response) => {
            if (response.ok) {
                return response.text();
            }
            else {
                console.error(new Error(`Bad response! ${url}`));
                return response.text();
            }
        });
    }
    else {
        return fetch(url)
            .then((response) => {
            if (response.ok) {
                return response.arrayBuffer();
            }
            else {
                console.error(new Error(`Bad response! ${url}`));
                return response.arrayBuffer();
            }
        })
            .then((buffer) => {
            const decoder = new TextDecoder(charset);
            const text = decoder.decode(buffer);
            return text;
        });
    }
}
exports.getHtmlText = getHtmlText;
async function getHtmlDOM(url, charset) {
    const htmlText = await getHtmlText(url, charset);
    return new DOMParser().parseFromString(htmlText, "text/html");
}
exports.getHtmlDOM = getHtmlDOM;
async function ggetHtmlText(url, charset) {
    if (charset === undefined) {
        return gfetch(url).then((response) => {
            if (response.status >= 200 && response.status <= 299) {
                return response.responseText;
            }
            else {
                console.error(new Error(`Bad response! ${url}`));
                return response.responseText;
            }
        });
    }
    else {
        return gfetch(url, { responseType: "arraybuffer" })
            .then((response) => {
            if (response.status >= 200 && response.status <= 299) {
                return response.response;
            }
            else {
                console.error(new Error(`Bad response! ${url}`));
                return response.response;
            }
        })
            .then((buffer) => {
            const decoder = new TextDecoder(charset);
            const text = decoder.decode(buffer);
            return text;
        });
    }
}
exports.ggetHtmlText = ggetHtmlText;
async function ggetHtmlDOM(url, charset) {
    const htmlText = await ggetHtmlText(url, charset);
    return new DOMParser().parseFromString(htmlText, "text/html");
}
exports.ggetHtmlDOM = ggetHtmlDOM;
function cosCompare(a, b) {
    if (a.sectionNumber !== null && b.sectionNumber != null) {
        if (a.sectionNumber > b.sectionNumber) {
            return 1;
        }
        if (a.sectionNumber === b.sectionNumber) {
            if (a.sectionChapterNumber !== null && b.sectionChapterNumber !== null) {
                if (a.sectionChapterNumber > b.sectionChapterNumber) {
                    return 1;
                }
                if (a.sectionChapterNumber === b.sectionChapterNumber) {
                    return 0;
                }
                if (a.sectionChapterNumber < b.sectionChapterNumber) {
                    return -1;
                }
            }
        }
        if (a.sectionNumber < b.sectionNumber) {
            return -1;
        }
    }
    return 0;
}
exports.cosCompare = cosCompare;
function rm(selector, all = false, dom) {
    if (all) {
        let rs = dom.querySelectorAll(selector);
        rs.forEach((e) => e.remove());
    }
    else {
        let r = dom.querySelector(selector);
        if (r) {
            r.remove();
        }
    }
}
exports.rm = rm;
function gfetch(url, { method = "GET", headers, data, cookie, binary, nocache, revalidate, timeout, context, responseType, overrideMimeType, anonymous, username, password, } = {}) {
    return new Promise((resolve, reject) => {
        if (_GM_xmlhttpRequest) {
            _GM_xmlhttpRequest({
                url: url,
                method: method,
                headers: headers,
                data: data,
                cookie: cookie,
                binary: binary,
                nocache: nocache,
                revalidate: revalidate,
                timeout: timeout,
                context: context,
                responseType: responseType,
                overrideMimeType: overrideMimeType,
                anonymous: anonymous,
                username: username,
                password: password,
                onload: (obj) => {
                    resolve(obj);
                },
                onerror: (err) => {
                    reject(err);
                },
            });
        }
        else {
            throw new Error("未发现 _GM_xmlhttpRequest API");
        }
    });
}
exports.gfetch = gfetch;
function concurrencyRun(list, limit, asyncHandle) {
    function recursion(arr) {
        return asyncHandle(arr.shift()).then(() => {
            if (arr.length !== 0) {
                return recursion(arr);
            }
            else {
                return "finish!";
            }
        });
    }
    let listCopy = [...list];
    let asyncList = [];
    while (limit--) {
        asyncList.push(recursion(listCopy));
    }
    return Promise.all(asyncList);
}
exports.concurrencyRun = concurrencyRun;
function sleep(ms) {
    return new Promise((resolve) => setTimeout(resolve, ms));
}
exports.sleep = sleep;


/***/ }),

/***/ 519:
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {


Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.attachmentClass = exports.Chapter = exports.Book = exports.Status = void 0;
const rules_1 = __webpack_require__(489);
const lib_1 = __webpack_require__(563);
var Status;
(function (Status) {
    Status[Status["pending"] = 0] = "pending";
    Status[Status["downloading"] = 1] = "downloading";
    Status[Status["failed"] = 2] = "failed";
    Status[Status["finished"] = 3] = "finished";
    Status[Status["aborted"] = 4] = "aborted";
})(Status = exports.Status || (exports.Status = {}));
class Book {
    constructor(bookUrl, bookname, author, introduction, additionalMetadate, chapters) {
        this.bookUrl = bookUrl;
        this.bookname = bookname;
        this.author = author;
        this.introduction = introduction;
        this.additionalMetadate = additionalMetadate;
        this.chapters = chapters;
        console.debug("[Book]初始化完成");
    }
}
exports.Book = Book;
class Chapter {
    constructor(bookUrl, bookname, chapterUrl, chapterNumber, chapterName, isVIP, isPaid, sectionName, sectionNumber, sectionChapterNumber, chapterParse, charset) {
        this.bookUrl = bookUrl;
        this.bookname = bookname;
        this.chapterUrl = chapterUrl;
        this.chapterNumber = chapterNumber;
        this.chapterName = chapterName;
        this.isVIP = isVIP;
        this.isPaid = isPaid;
        this.sectionName = sectionName;
        this.sectionNumber = sectionNumber;
        this.sectionChapterNumber = sectionChapterNumber;
        this.chapterParse = chapterParse;
        this.charset = charset;
        this.status = Status.pending;
        this.retryTime = 0;
    }
    async init() {
        const obj = await this.parse();
        const { chapterName, contentRaw, contentText, contentHTML, contentImages, } = obj;
        this.chapterName = chapterName;
        this.contentRaw = contentRaw;
        this.contentText = contentText;
        this.contentHTML = contentHTML;
        this.contentImages = contentImages;
        console.debug(`[Chapter]${this.chapterName} 解析完成。`);
        return obj;
    }
    async parse() {
        this.status = Status.downloading;
        return this.chapterParse(this.chapterUrl, this.chapterName, this.isVIP, this.isPaid, this.charset)
            .then((obj) => {
            this.status = Status.finished;
            return obj;
        })
            .catch(async (err) => {
            this.retryTime++;
            console.error(`[Chapter]${this.chapterName}解析出错,第${this.retryTime}次重试,章节地址:${this.chapterUrl}`);
            if (this.status !== Status.failed && this.retryTime < rules_1.retryLimit) {
                await lib_1.sleep(this.retryTime * 1500);
                return this.parse();
            }
            else {
                this.status = Status.failed;
                console.error(err);
                return {
                    chapterName: this.chapterName,
                    contentRaw: null,
                    contentText: null,
                    contentHTML: null,
                    contentImages: null,
                };
            }
        });
    }
}
exports.Chapter = Chapter;
class attachmentClass {
    constructor(imageUrl, name, mode) {
        this.imageUrl = imageUrl;
        this.name = name;
        this.mode = mode;
        this.status = Status.pending;
        this.retryTime = 0;
    }
    async init() {
        if (this.mode === "naive") {
            this.imageBlob = await this.downloadImage();
        }
        else {
            this.imageBlob = await this.tmDownloadImage();
        }
        console.debug(`[Image] ${this.imageUrl} 下载完成。`);
        return this.imageBlob;
    }
    downloadImage() {
        this.status = Status.downloading;
        return fetch(this.imageUrl)
            .then((response) => {
            if (response.ok) {
                this.status = Status.finished;
                return response.blob();
            }
            else {
                if (response.status === 404) {
                    this.status = Status.failed;
                }
                throw new Error(`Image request response is not ok!\nImage url: ${this.imageUrl} .`);
            }
        })
            .catch(async (err) => {
            this.retryTime++;
            console.error(`[Image]下载 ${this.imageUrl} 出错,第${this.retryTime}次重试,下载模式:${this.mode}`);
            if (this.status !== Status.failed && this.retryTime < rules_1.retryLimit) {
                await lib_1.sleep(this.retryTime * 1500);
                return this.downloadImage();
            }
            else {
                this.status = Status.failed;
                console.error(err);
                return null;
            }
        });
    }
    tmDownloadImage() {
        this.status = Status.downloading;
        return lib_1.gfetch(this.imageUrl, { responseType: "blob" })
            .then((response) => {
            if (response.status >= 200 && response.status <= 299) {
                this.status = Status.finished;
                return response.response;
            }
            else {
                if (response.status === 404) {
                    this.status = Status.failed;
                }
                throw new Error(`Bad response!\nRequest url: ${this.imageUrl}`);
            }
        })
            .catch(async (err) => {
            this.retryTime++;
            console.error(`[Image]下载 ${this.imageUrl} 出错,第${this.retryTime}次重试,下载模式:${this.mode}`);
            if (this.status !== Status.failed && this.retryTime < rules_1.retryLimit) {
                await lib_1.sleep(this.retryTime * 1500);
                return this.tmDownloadImage();
            }
            else {
                this.status = Status.failed;
                console.error(err);
                return null;
            }
        });
    }
}
exports.attachmentClass = attachmentClass;


/***/ }),

/***/ 489:
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {


Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.getRule = exports.icon1 = exports.icon0 = exports.retryLimit = void 0;
const ciweimao_1 = __webpack_require__(444);
const uukanshu_1 = __webpack_require__(623);
const yruan_1 = __webpack_require__(514);
const biquge_1 = __webpack_require__(931);
const xkzw_1 = __webpack_require__(441);
const sfacg_1 = __webpack_require__(116);
const hetushu_1 = __webpack_require__(161);
const shouda8_1 = __webpack_require__(382);
const meegoq_1 = __webpack_require__(158);
const xiaoshuodaquan_1 = __webpack_require__(678);
const qidian_1 = __webpack_require__(839);
const jjwxc_1 = __webpack_require__(217);
const zongheng_1 = __webpack_require__(862);
const _17k_1 = __webpack_require__(528);
const shuhai_1 = __webpack_require__(113);
exports.retryLimit = 5;
exports.icon0 = "data:image/png;base64,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";
exports.icon1 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAMAAAD04JH5AAAAA3NCSVQICAjb4U/gAAAACXBIWXMAAANSAAADUgEQACRKAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAUdQTFRF////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiYSOVQAAAGx0Uk5TAAECAwQFCAkKCwwNDhETFRkaHB0fICMkKCwwNTg5PD1AQUZKTk9QV1tcX2BjZGhtb3B2eHl6fX6AgYKHi4+QlJicnaChpamur7C3uru+v8LEyMzP0NXZ3N3f4OTn6uvt7/Hy8/T2+Pn6/P3+VI4wmgAAAyxJREFUeNrtmVdT4zAUhTFs6BB6Cb13WLpooffeQjW9hMT//3mVJbsT4li6ahbD6D4y5p5vzrGuFDkry5QpznLSygAYAANgAAyAATAABsAAGAADYAAMgAEwAD8XADlChTQTIM0eIM0pIM3vAdL8JiLNawFpXo1I8zxAmicS0jwTkeapjDTvC8r0gQQK9UEESvUBBIr1qQTK9SkESvR/wQkQ5V95KhS+Q1AC14N34ZCYenD0LGNjoH7ij2ejQV71QPd2lNQapI8rut0d4LMe0Bz4CHMUSetZCGgPMESRYj1cAGARMIqv1kMlgK8pNQq39TARBB8VhCgyW59S414y6frjxDYeUYTCNnnKHw4WeUxl1/wtGjwk97LToyBan6irmRrPfSHj/K+ZuSJ3TImCav3zaqvlvTN57T9W6+ozJAqa9fH9/gLS3kja/wr69+PUKMhGXUxVie0mVVMXZAUSwONys4ztvHn5kQcgttubJ+tEkde7G2MEiExUyD3VVExE4AAPS40qTlaNSw8QgI+dnlxVx8ncnp0PCsD5WJnaI23Z2Lk3wP1igx83jA2L998V4G8E5WrVy0kRfIeXMLkMm1TIN8GWYXIQTVbKVa+cjLCO4r2+fFnq+X17MZ7N6GmlxRJXt1pWnjh3Q1yX09Vi8tXTl/zb8eeB5GCgkFe9cOAgTutPBcD1stbGEYXVtvYCaA4BwHU9W8smXzt7DesMBMB1NFQMVS8eOgK3hQM4zut6ezZdPbt9/ZWhKQsArpu5OrJ83dwNW0dGAFzHwyVe6iXDx8zt2AEc522jI8etntOx8cbRjAcA1+18/Vf5+vlbvk6cALhORkr/qZeOnHC34QdwnPfNTvzjLtC5+S7QRAQg8eNuYcEW6yAIIF4GQD8A9W5IZX3eFQW6tqI61KNbXf9vy4K/T/2Wd90X+hqFnfHG1K8oUq1nuqpVZD3zjal865nvjBVY74pC/qpg/nYkNQqb6+uZrChYrFcQhcBnOwlR2KIfLoUGlIj1EgaUsPVCUcixnjcKmdZzRCHdeqYo1FgPjUKl9YAolFtPjMIf672i8NP6DFH4br2pH1d/AAm28mJJn9pPAAAAAElFTkSuQmCC";
function getRule() {
    const host = document.location.host;
    let ruleClass;
    switch (host) {
        case "www.ciweimao.com":
            ruleClass = ciweimao_1.ciweimao;
            break;
        case "www.uukanshu.com":
            ruleClass = uukanshu_1.uukanshu;
            break;
        case "www.yruan.com":
            ruleClass = yruan_1.yrun;
            break;
        case "www.biquwoo.com":
            ruleClass = biquge_1.biquwo;
            break;
        case "www.shuquge.com":
            ruleClass = biquge_1.shuquge;
            break;
        case "www.dingdiann.net":
            ruleClass = biquge_1.dingdiann;
            break;
        case "www.xkzw.org":
            ruleClass = xkzw_1.xkzw;
            break;
        case "www.266ks.com":
            ruleClass = biquge_1.c226ks;
            break;
        case "book.sfacg.com":
            ruleClass = sfacg_1.sfacg;
            break;
        case "www.hetushu.com":
            ruleClass = hetushu_1.hetushu;
            break;
        case "www.shouda8.com":
        case "www.shouda88.com":
            ruleClass = shouda8_1.shouda8;
            break;
        case "www.gebiqu.com":
            ruleClass = biquge_1.gebiqu;
            break;
        case "www.meegoq.com":
        case "www.viviyzw.com":
            ruleClass = meegoq_1.meegoq;
            break;
        case "www.xiaoshuodaquan.com":
            ruleClass = xiaoshuodaquan_1.xiaoshuodaquan;
            break;
        case "book.qidian.com":
            ruleClass = qidian_1.qidian;
            break;
        case "www.jjwxc.net":
            ruleClass = jjwxc_1.jjwxc;
            break;
        case "www.81book.com":
            ruleClass = biquge_1.zwdu;
            break;
        case "book.zongheng.com":
        case "huayu.zongheng.com":
            ruleClass = zongheng_1.zongheng;
            break;
        case "www.17k.com":
            ruleClass = _17k_1.c17k;
            break;
        case "www.shuhai.com":
        case "mm.shuhai.com":
            ruleClass = shuhai_1.shuhai;
            break;
        default:
            throw new Error("Not Found Rule!");
    }
    const rule = new ruleClass();
    return rule;
}
exports.getRule = getRule;


/***/ }),

/***/ 528:
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {


Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.c17k = void 0;
const main_1 = __webpack_require__(519);
const lib_1 = __webpack_require__(563);
class c17k {
    constructor() {
        this.imageMode = "TM";
        this.concurrencyLimit = 5;
    }
    async bookParse(chapterParse) {
        const bookUrl = document.location.href.replace("/list/", "/book/");
        const bookname = (document.querySelector("h1.Title")).innerText.trim();
        const author = (document.querySelector("div.Author > a")).innerText.trim();
        const doc = await lib_1.getHtmlDOM(bookUrl, undefined);
        let introduction;
        const introDom = doc.querySelector("#bookInfo p.intro > a");
        if (introDom === null) {
            introduction = null;
        }
        else {
            let { dom: introCleanDom, text: introCleantext, images: introCleanimages, } = lib_1.cleanDOM(introDom, "TM");
            introduction = introCleantext;
        }
        const additionalMetadate = {};
        let coverUrl = doc.querySelector("#bookCover img.book")
            .src;
        additionalMetadate.cover = new main_1.attachmentClass(coverUrl, `cover.${coverUrl.split(".").slice(-1)[0]}`, "TM");
        additionalMetadate.cover.init();
        const chapters = [];
        const sections = document.querySelectorAll("dl.Volume");
        const cos = [];
        for (let i = 0; i < sections.length; i++) {
            const s = sections[i];
            const sectionNumber = i + 1;
            const sectionName = (s.querySelector("dt > span.tit")).innerText.trim();
            const cs = s.querySelectorAll("dd > a");
            for (let j = 0; j < cs.length; j++) {
                const a = cs[j];
                const span = a.firstElementChild;
                const chapterName = span.innerText.trim();
                const chapterUrl = a.href;
                const isVIP = () => {
                    if (span === null || span === void 0 ? void 0 : span.className.includes("vip")) {
                        return true;
                    }
                    else {
                        return false;
                    }
                };
                const isPaid = () => {
                    return false;
                };
                const co = {
                    bookUrl: bookUrl,
                    bookname: bookname,
                    chapterUrl: chapterUrl,
                    chapterName: chapterName,
                    isVIP: isVIP(),
                    isPaid: isPaid(),
                    sectionName: sectionName,
                    sectionNumber: sectionNumber,
                    sectionChapterNumber: j,
                };
                cos.push(co);
            }
        }
        cos.sort(lib_1.cosCompare);
        for (let i = 0; i < cos.length; i++) {
            const chapterNumber = i + 1;
            let { bookUrl, bookname, chapterUrl, chapterName, isVIP, isPaid, sectionName, sectionNumber, sectionChapterNumber, } = cos[i];
            const chapter = new main_1.Chapter(bookUrl, bookname, chapterUrl, chapterNumber, chapterName, isVIP, isPaid, sectionName, sectionNumber, sectionChapterNumber, chapterParse, "UTF-8");
            const isLogin = () => {
                return false;
            };
            if (isVIP && !(isLogin() && chapter.isPaid)) {
                chapter.status = main_1.Status.aborted;
            }
            chapters.push(chapter);
        }
        return {
            bookUrl: bookUrl,
            bookname: bookname,
            author: author,
            introduction: introduction,
            additionalMetadate: additionalMetadate,
            chapters: chapters,
        };
    }
    async chapterParse(chapterUrl, chapterName, isVIP, isPaid, charset) {
        async function publicChapter() {
            const doc = await lib_1.getHtmlDOM(chapterUrl, charset);
            const chapterName = (doc.querySelector("#readArea > div.readAreaBox.content > h1")).innerText.trim();
            const content = (doc.querySelector("#readArea > div.readAreaBox.content > div.p"));
            if (content) {
                lib_1.rm("p.copy", false, content);
                lib_1.rm("#banner_content", false, content);
                lib_1.rm("div.qrcode", false, content);
                lib_1.rm("div.chapter_text_ad", false, content);
                let { dom, text, images } = lib_1.cleanDOM(content, "TM");
                return {
                    chapterName: chapterName,
                    contentRaw: content,
                    contentText: text,
                    contentHTML: dom,
                    contentImages: images,
                };
            }
            else {
                return {
                    chapterName: chapterName,
                    contentRaw: null,
                    contentText: null,
                    contentHTML: null,
                    contentImages: null,
                };
            }
        }
        async function vipChapter() {
            return {
                chapterName: chapterName,
                contentRaw: null,
                contentText: null,
                contentHTML: null,
                contentImages: null,
            };
        }
        if (isVIP) {
            return vipChapter();
        }
        else {
            return publicChapter();
        }
    }
}
exports.c17k = c17k;


/***/ }),

/***/ 931:
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {


Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.zwdu = exports.c226ks = exports.gebiqu = exports.dingdiann = exports.shuquge = exports.biquwo = void 0;
const main_1 = __webpack_require__(519);
const lib_1 = __webpack_require__(563);
class biquwo {
    constructor() {
        this.imageMode = "TM";
    }
    async bookParse(chapterParse) {
        const bookUrl = document.location.href;
        const bookname = (document.querySelector("#info > h1:nth-child(1)")).innerText.trim();
        const author = (document.querySelector("#info > p:nth-child(2)")).innerText
            .replace(/作(\s+)?者[::]/, "")
            .trim();
        let introduction;
        const introDom = document.querySelector("#intro");
        if (introDom === null) {
            introduction = null;
        }
        else {
            let { dom: introCleanDom, text: introCleantext, images: introCleanimages, } = lib_1.cleanDOM(introDom, "TM");
            introduction = introCleantext;
        }
        const additionalMetadate = {};
        const coverUrl = document.querySelector("#fmimg > img")
            .src;
        additionalMetadate.cover = new main_1.attachmentClass(coverUrl, `cover.${coverUrl.split(".").slice(-1)[0]}`, "TM");
        additionalMetadate.cover.init();
        const chapters = [];
        const dl = document.querySelector("#list>dl");
        if (dl === null || dl === void 0 ? void 0 : dl.childElementCount) {
            const dlc = Array.from(dl.children);
            if (dlc[0].nodeName === "DT" &&
                dlc[0].innerText.includes("最新章节")) {
                for (let i = 0; i < (dl === null || dl === void 0 ? void 0 : dl.childElementCount); i++) {
                    if (i !== 0 && dlc[i].nodeName === "DT") {
                        delete dlc[0];
                        break;
                    }
                    delete dlc[i];
                }
            }
            const chapterList = dlc.filter((obj) => obj !== undefined);
            let chapterNumber = 0;
            let sectionNumber = 0;
            let sectionName = null;
            let sectionChapterNumber = 0;
            for (let i = 0; i < chapterList.length; i++) {
                const node = chapterList[i];
                if (node.nodeName === "DT") {
                    sectionNumber++;
                    sectionChapterNumber = 0;
                    sectionName = node.innerText.replace(`《${bookname}》`, "").trim();
                }
                else if (node.nodeName === "DD") {
                    chapterNumber++;
                    sectionChapterNumber++;
                    const a = node.firstElementChild;
                    const chapterName = a.innerText;
                    const chapterUrl = a.href;
                    const isVIP = false;
                    const isPaid = false;
                    const chapter = new main_1.Chapter(bookUrl, bookname, chapterUrl, chapterNumber, chapterName, isVIP, isPaid, sectionName, sectionNumber, sectionChapterNumber, chapterParse, "UTF-8");
                    chapters.push(chapter);
                }
            }
        }
        return {
            bookUrl: bookUrl,
            bookname: bookname,
            author: author,
            introduction: introduction,
            additionalMetadate: additionalMetadate,
            chapters: chapters,
        };
    }
    async chapterParse(chapterUrl, chapterName, isVIP, isPaid, charset) {
        const dom = await lib_1.getHtmlDOM(chapterUrl, charset);
        chapterName = (dom.querySelector(".bookname > h1:nth-child(1)")).innerText.trim();
        const content = dom.querySelector("#content");
        if (content) {
            let { dom, text, images } = lib_1.cleanDOM(content, "TM");
            return {
                chapterName: chapterName,
                contentRaw: content,
                contentText: text,
                contentHTML: dom,
                contentImages: images,
            };
        }
        else {
            return {
                chapterName: chapterName,
                contentRaw: null,
                contentText: null,
                contentHTML: null,
                contentImages: null,
            };
        }
    }
}
exports.biquwo = biquwo;
class shuquge {
    constructor() {
        this.imageMode = "TM";
    }
    async bookParse(chapterParse) {
        const bookUrl = document.location.href;
        const bookname = (document.querySelector(".info > h2")).innerText.trim();
        const author = (document.querySelector(".small > span:nth-child(1)")).innerText
            .replace(/作(\s+)?者[::]/, "")
            .trim();
        let introduction;
        const introDom = document.querySelector(".intro");
        if (introDom === null) {
            introduction = null;
        }
        else {
            introDom.innerHTML = introDom.innerHTML.replace(/推荐地址:http:\/\/www.shuquge.com\/txt\/\d+\/index\.html/, "");
            let { dom: introCleanDom, text: introCleantext, images: introCleanimages, } = lib_1.cleanDOM(introDom, "TM");
            introduction = introCleantext;
        }
        const additionalMetadate = {};
        const coverUrl = (document.querySelector(".info > .cover > img")).src;
        additionalMetadate.cover = new main_1.attachmentClass(coverUrl, `cover.${coverUrl.split(".").slice(-1)[0]}`, "TM");
        additionalMetadate.cover.init();
        const chapters = [];
        const dl = document.querySelector(".listmain>dl");
        if (dl === null || dl === void 0 ? void 0 : dl.childElementCount) {
            const dlc = Array.from(dl.children);
            if (dlc[0].nodeName === "DT" &&
                dlc[0].innerText.includes("最新章节")) {
                for (let i = 0; i < (dl === null || dl === void 0 ? void 0 : dl.childElementCount); i++) {
                    if (i !== 0 && dlc[i].nodeName === "DT") {
                        delete dlc[0];
                        break;
                    }
                    delete dlc[i];
                }
            }
            const chapterList = dlc.filter((obj) => obj !== undefined);
            let chapterNumber = 0;
            let sectionNumber = 0;
            let sectionName = null;
            let sectionChapterNumber = 0;
            for (let i = 0; i < chapterList.length; i++) {
                const node = chapterList[i];
                if (node.nodeName === "DT") {
                    sectionNumber++;
                    sectionChapterNumber = 0;
                    sectionName = node.innerText.replace(`《${bookname}》`, "").trim();
                }
                else if (node.nodeName === "DD") {
                    chapterNumber++;
                    sectionChapterNumber++;
                    const a = node.firstElementChild;
                    const chapterName = a.innerText;
                    const chapterUrl = a.href;
                    const isVIP = false;
                    const isPaid = false;
                    const chapter = new main_1.Chapter(bookUrl, bookname, chapterUrl, chapterNumber, chapterName, isVIP, isPaid, sectionName, sectionNumber, sectionChapterNumber, chapterParse, "UTF-8");
                    chapters.push(chapter);
                }
            }
        }
        return {
            bookUrl: bookUrl,
            bookname: bookname,
            author: author,
            introduction: introduction,
            additionalMetadate: additionalMetadate,
            chapters: chapters,
        };
    }
    async chapterParse(chapterUrl, chapterName, isVIP, isPaid, charset) {
        const dom = await lib_1.getHtmlDOM(chapterUrl, charset);
        chapterName = (dom.querySelector(".content > h1:nth-child(1)")).innerText.trim();
        const content = dom.querySelector("#content");
        if (content) {
            content.innerHTML = content.innerHTML
                .replace("请记住本书首发域名:www.shuquge.com。书趣阁_笔趣阁手机版阅读网址:m.shuquge.com", "")
                .replace(/http:\/\/www.shuquge.com\/txt\/\d+\/\d+\.html/, "");
            let { dom, text, images } = lib_1.cleanDOM(content, "TM");
            return {
                chapterName: chapterName,
                contentRaw: content,
                contentText: text,
                contentHTML: dom,
                contentImages: images,
            };
        }
        else {
            return {
                chapterName: chapterName,
                contentRaw: null,
                contentText: null,
                contentHTML: null,
                contentImages: null,
            };
        }
    }
}
exports.shuquge = shuquge;
class dingdiann {
    constructor() {
        this.imageMode = "TM";
        this.concurrencyLimit = 5;
    }
    async bookParse(chapterParse) {
        const bookUrl = document.location.href;
        const bookname = (document.querySelector("#info > h1:nth-child(1)")).innerText.trim();
        const author = (document.querySelector("#info > p:nth-child(2)")).innerText
            .replace(/作(\s+)?者[::]/, "")
            .trim();
        let introduction;
        const introDom = document.querySelector("#intro");
        if (introDom === null) {
            introduction = null;
        }
        else {
            let { dom: introCleanDom, text: introCleantext, images: introCleanimages, } = lib_1.cleanDOM(introDom, "TM");
            introduction = introCleantext;
        }
        const additionalMetadate = {};
        const coverUrl = document.querySelector("#fmimg > img")
            .src;
        additionalMetadate.cover = new main_1.attachmentClass(coverUrl, `cover.${coverUrl.split(".").slice(-1)[0]}`, "TM");
        additionalMetadate.cover.init();
        const chapters = [];
        const dl = document.querySelector("#list>dl");
        if (dl === null || dl === void 0 ? void 0 : dl.childElementCount) {
            const dlc = Array.from(dl.children);
            if (dlc[0].nodeName === "DT" &&
                dlc[0].innerText.includes("最新章节")) {
                for (let i = 0; i < (dl === null || dl === void 0 ? void 0 : dl.childElementCount); i++) {
                    if (i !== 0 && dlc[i].nodeName === "DT") {
                        delete dlc[0];
                        break;
                    }
                    delete dlc[i];
                }
            }
            const chapterList = dlc.filter((obj) => obj !== undefined);
            let chapterNumber = 0;
            let sectionNumber = 0;
            let sectionName = null;
            let sectionChapterNumber = 0;
            for (let i = 0; i < chapterList.length; i++) {
                const node = chapterList[i];
                if (node.nodeName === "DT") {
                    sectionNumber++;
                    sectionChapterNumber = 0;
                    sectionName = node.innerText.replace(`《${bookname}》`, "").trim();
                }
                else if (node.nodeName === "DD") {
                    chapterNumber++;
                    sectionChapterNumber++;
                    const a = node.firstElementChild;
                    const chapterName = a.innerText;
                    const chapterUrl = a.href;
                    const isVIP = false;
                    const isPaid = false;
                    const chapter = new main_1.Chapter(bookUrl, bookname, chapterUrl, chapterNumber, chapterName, isVIP, isPaid, sectionName, sectionNumber, sectionChapterNumber, chapterParse, "UTF-8");
                    chapters.push(chapter);
                }
            }
        }
        return {
            bookUrl: bookUrl,
            bookname: bookname,
            author: author,
            introduction: introduction,
            additionalMetadate: additionalMetadate,
            chapters: chapters,
        };
    }
    async chapterParse(chapterUrl, chapterName, isVIP, isPaid, charset) {
        const dom = await lib_1.getHtmlDOM(chapterUrl, charset);
        chapterName = (dom.querySelector(".bookname > h1:nth-child(1)")).innerText.trim();
        const content = dom.querySelector("#content");
        const ad = '<div align="center"><a href="javascript:postError();" style="text-align:center;color:red;">章节错误,点此举报(免注册)</a>,举报后维护人员会在两分钟内校正章节内容,请耐心等待,并刷新页面。</div>';
        content.innerHTML = content.innerHTML
            .replace(ad, "")
            .replace(/http:\/\/www.shuquge.com\/txt\/\d+\/\d+\.html/, "");
        if (content) {
            let { dom, text, images } = lib_1.cleanDOM(content, "TM");
            return {
                chapterName: chapterName,
                contentRaw: content,
                contentText: text,
                contentHTML: dom,
                contentImages: images,
            };
        }
        else {
            return {
                chapterName: chapterName,
                contentRaw: null,
                contentText: null,
                contentHTML: null,
                contentImages: null,
            };
        }
    }
}
exports.dingdiann = dingdiann;
class gebiqu {
    constructor() {
        this.imageMode = "TM";
        this.concurrencyLimit = 5;
    }
    async bookParse(chapterParse) {
        const bookUrl = document.location.href;
        const bookname = (document.querySelector("#info > h1:nth-child(1)")).innerText.trim();
        const author = (document.querySelector("#info > p:nth-child(2)")).innerText
            .replace(/作(\s+)?者[::]/, "")
            .trim();
        let introduction;
        const introDom = document.querySelector("#intro");
        if (introDom === null) {
            introduction = null;
        }
        else {
            introDom.innerHTML = introDom.innerHTML.replace(/如果您喜欢.+,别忘记分享给朋友/, "");
            lib_1.rm('a[href^="http://down.gebiqu.com"]', false, introDom);
            let { dom: introCleanDom, text: introCleantext, images: introCleanimages, } = lib_1.cleanDOM(introDom, "TM");
            introduction = introCleantext;
        }
        const additionalMetadate = {};
        const coverUrl = document.querySelector("#fmimg > img")
            .src;
        additionalMetadate.cover = new main_1.attachmentClass(coverUrl, `cover.${coverUrl.split(".").slice(-1)[0]}`, "TM");
        additionalMetadate.cover.init();
        const chapters = [];
        const dl = document.querySelector("#list>dl");
        if (dl === null || dl === void 0 ? void 0 : dl.childElementCount) {
            const dlc = Array.from(dl.children);
            if (dlc[0].nodeName === "DT" &&
                dlc[0].innerText.includes("最新的八个章节")) {
                for (let i = 0; i < (dl === null || dl === void 0 ? void 0 : dl.childElementCount); i++) {
                    if (i !== 0 && dlc[i].nodeName === "DT") {
                        delete dlc[0];
                        break;
                    }
                    delete dlc[i];
                }
            }
            const chapterList = dlc.filter((obj) => obj !== undefined);
            let chapterNumber = 0;
            let sectionNumber = 0;
            let sectionName = null;
            let sectionChapterNumber = 0;
            for (let i = 0; i < chapterList.length; i++) {
                const node = chapterList[i];
                if (node.nodeName === "DT") {
                    sectionNumber++;
                    sectionChapterNumber = 0;
                    sectionName = node.innerText.replace(`《${bookname}》`, "").trim();
                }
                else if (node.nodeName === "DD") {
                    chapterNumber++;
                    sectionChapterNumber++;
                    const a = node.firstElementChild;
                    const chapterName = a.innerText;
                    const chapterUrl = a.href;
                    const isVIP = false;
                    const isPaid = false;
                    const chapter = new main_1.Chapter(bookUrl, bookname, chapterUrl, chapterNumber, chapterName, isVIP, isPaid, sectionName, sectionNumber, sectionChapterNumber, chapterParse, "UTF-8");
                    chapters.push(chapter);
                }
            }
        }
        return {
            bookUrl: bookUrl,
            bookname: bookname,
            author: author,
            introduction: introduction,
            additionalMetadate: additionalMetadate,
            chapters: chapters,
        };
    }
    async chapterParse(chapterUrl, chapterName, isVIP, isPaid, charset) {
        const dom = await lib_1.getHtmlDOM(chapterUrl, charset);
        chapterName = (dom.querySelector(".bookname > h1:nth-child(1)")).innerText.trim();
        const content = dom.querySelector("#content");
        content.innerHTML = content.innerHTML.replace("www.gebiqu.com", "");
        if (content) {
            let { dom, text, images } = lib_1.cleanDOM(content, "TM");
            return {
                chapterName: chapterName,
                contentRaw: content,
                contentText: text,
                contentHTML: dom,
                contentImages: images,
            };
        }
        else {
            return {
                chapterName: chapterName,
                contentRaw: null,
                contentText: null,
                contentHTML: null,
                contentImages: null,
            };
        }
    }
}
exports.gebiqu = gebiqu;
class c226ks {
    constructor() {
        this.imageMode = "TM";
    }
    async bookParse(chapterParse) {
        const bookUrl = document.location.href.replace(/index_\d+\.html/, "index_1.html");
        const bookname = (document.querySelector(".info > .top > h1")).innerText.trim();
        const author = (document.querySelector(".info > .top > .fix > p:nth-child(1)")).innerText
            .replace(/作(\s+)?者[::]/, "")
            .trim();
        let introduction;
        const introDom = document.querySelector(".desc");
        if (introDom === null) {
            introduction = null;
        }
        else {
            let { dom: introCleanDom, text: introCleantext, images: introCleanimages, } = lib_1.cleanDOM(introDom, "TM");
            introduction = introCleantext;
        }
        const additionalMetadate = {};
        const coverUrl = document.querySelector(".imgbox > img")
            .src;
        additionalMetadate.cover = new main_1.attachmentClass(coverUrl, `cover.${coverUrl.split(".").slice(-1)[0]}`, "TM");
        additionalMetadate.cover.init();
        const chapters = [];
        const indexUrls = Array.from(document.querySelectorAll('[name="pageselect"] > option')).map((opt) => document.location.origin + opt.getAttribute("value"));
        let lis = [];
        for (const indexUrl of indexUrls) {
            const dom = await lib_1.getHtmlDOM(indexUrl, "UTF-8");
            const ul = dom.querySelector("div.row.row-section > div > div:nth-child(4) > ul");
            if (ul === null || ul === void 0 ? void 0 : ul.childElementCount) {
                lis = lis.concat(Array.from(ul.children));
            }
        }
        const chapterList = lis.filter((obj) => obj !== undefined);
        let chapterNumber = 0;
        for (let i = 0; i < chapterList.length; i++) {
            const node = chapterList[i];
            chapterNumber++;
            const a = node.firstElementChild;
            const chapterName = a.innerText;
            const chapterUrl = a.href;
            const isVIP = false;
            const isPaid = false;
            const chapter = new main_1.Chapter(bookUrl, bookname, chapterUrl, chapterNumber, chapterName, isVIP, isPaid, null, null, null, chapterParse, "UTF-8");
            chapters.push(chapter);
        }
        return {
            bookUrl: bookUrl,
            bookname: bookname,
            author: author,
            introduction: introduction,
            additionalMetadate: additionalMetadate,
            chapters: chapters,
        };
    }
    async chapterParse(chapterUrl, chapterName, isVIP, isPaid, charset) {
        const dom = await lib_1.getHtmlDOM(chapterUrl, charset);
        chapterName = dom.querySelector("h1.title").innerText.trim();
        const content = dom.querySelector("#content");
        const ad = '<div class="posterror"><a href="javascript:postError();" class="red">章节错误,点此举报(免注册)</a>,举报后维护人员会在两分钟内校正章节内容,请耐心等待,并刷新页面。</div>';
        content.innerHTML = content.innerHTML.replace(ad, "");
        if (content) {
            let { dom, text, images } = lib_1.cleanDOM(content, "TM");
            return {
                chapterName: chapterName,
                contentRaw: content,
                contentText: text,
                contentHTML: dom,
                contentImages: images,
            };
        }
        else {
            return {
                chapterName: chapterName,
                contentRaw: null,
                contentText: null,
                contentHTML: null,
                contentImages: null,
            };
        }
    }
}
exports.c226ks = c226ks;
class zwdu {
    constructor() {
        this.imageMode = "TM";
        this.charset = "GBK";
    }
    async bookParse(chapterParse) {
        const bookUrl = document.location.href;
        const bookname = (document.querySelector("#info > h1:nth-child(1)")).innerText.trim();
        const author = (document.querySelector("#info > p:nth-child(2)")).innerText
            .replace(/作(\s+)?者[::]/, "")
            .trim();
        let introduction;
        const introDom = document.querySelector("#intro");
        if (introDom === null) {
            introduction = null;
        }
        else {
            let { dom: introCleanDom, text: introCleantext, images: introCleanimages, } = lib_1.cleanDOM(introDom, "TM");
            introduction = introCleantext;
        }
        const additionalMetadate = {};
        const coverUrl = document.querySelector("#fmimg > img")
            .src;
        additionalMetadate.cover = new main_1.attachmentClass(coverUrl, `cover.${coverUrl.split(".").slice(-1)[0]}`, "TM");
        additionalMetadate.cover.init();
        const chapters = [];
        const dl = document.querySelector("#list>dl");
        if (dl === null || dl === void 0 ? void 0 : dl.childElementCount) {
            const dlc = Array.from(dl.children);
            if (dlc[0].nodeName === "DT" &&
                dlc[0].innerText.includes("最新章节")) {
                for (let i = 0; i < (dl === null || dl === void 0 ? void 0 : dl.childElementCount); i++) {
                    if (i !== 0 && dlc[i].nodeName === "DT") {
                        delete dlc[0];
                        break;
                    }
                    delete dlc[i];
                }
            }
            const chapterList = dlc.filter((obj) => obj !== undefined);
            let chapterNumber = 0;
            let sectionNumber = 0;
            let sectionName = null;
            let sectionChapterNumber = 0;
            for (let i = 0; i < chapterList.length; i++) {
                const node = chapterList[i];
                if (node.nodeName === "DT") {
                    sectionNumber++;
                    sectionChapterNumber = 0;
                    sectionName = node.innerText.replace(`《${bookname}》`, "").trim();
                }
                else if (node.nodeName === "DD") {
                    chapterNumber++;
                    sectionChapterNumber++;
                    const a = node.firstElementChild;
                    const chapterName = a.innerText;
                    const chapterUrl = a.href;
                    const isVIP = false;
                    const isPaid = false;
                    const chapter = new main_1.Chapter(bookUrl, bookname, chapterUrl, chapterNumber, chapterName, isVIP, isPaid, sectionName, sectionNumber, sectionChapterNumber, chapterParse, "GBK");
                    chapters.push(chapter);
                }
            }
        }
        return {
            bookUrl: bookUrl,
            bookname: bookname,
            author: author,
            introduction: introduction,
            additionalMetadate: additionalMetadate,
            chapters: chapters,
        };
    }
    async chapterParse(chapterUrl, chapterName, isVIP, isPaid, charset) {
        const dom = await lib_1.getHtmlDOM(chapterUrl, charset);
        chapterName = (dom.querySelector(".bookname > h1:nth-child(1)")).innerText.trim();
        const content = dom.querySelector("#content");
        if (content) {
            let { dom, text, images } = lib_1.cleanDOM(content, "TM");
            return {
                chapterName: chapterName,
                contentRaw: content,
                contentText: text,
                contentHTML: dom,
                contentImages: images,
            };
        }
        else {
            return {
                chapterName: chapterName,
                contentRaw: null,
                contentText: null,
                contentHTML: null,
                contentImages: null,
            };
        }
    }
}
exports.zwdu = zwdu;


/***/ }),

/***/ 444:
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {


Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.ciweimao = void 0;
const main_1 = __webpack_require__(519);
const lib_1 = __webpack_require__(563);
class ciweimao {
    constructor() {
        this.imageMode = "TM";
        this.concurrencyLimit = 1;
        this.maxRunLimit = 1;
    }
    async bookParse(chapterParse) {
        var _a, _b;
        const bookid = unsafeWindow.HB.book.book_id;
        const bookUrl = `https://www.ciweimao.com/book/${bookid}`;
        const bookname = (document.querySelector(".book-catalog .hd h3")).innerText.trim();
        const author = (document.querySelector(".book-catalog .hd > p > a")).innerText.trim();
        let introduction;
        const dom = await lib_1.getHtmlDOM(bookUrl, undefined);
        const introDom = dom.querySelector(".book-intro-cnt .book-desc");
        if (introDom === null) {
            introduction = null;
        }
        else {
            let { dom: introCleanDom, text: introCleantext, images: introCleanimages, } = lib_1.cleanDOM(introDom, "TM");
            introduction = introCleantext;
        }
        const additionalMetadate = {};
        const coverUrl = dom.querySelector(".cover > img").src;
        additionalMetadate.cover = new main_1.attachmentClass(coverUrl, `cover.${coverUrl.split(".").slice(-1)[0]}`, "TM");
        additionalMetadate.cover.init();
        additionalMetadate.tags = Array.from(dom.querySelectorAll(".label-box > .label")).map((span) => span.innerText.trim());
        const chapters = [];
        const sections = document.querySelectorAll(".book-chapter > .book-chapter-box");
        const cos = [];
        for (let i = 0; i < sections.length; i++) {
            const s = sections[i];
            const sectionNumber = i + 1;
            const sectionName = s.querySelector(".sub-tit").innerText;
            const cs = s.querySelectorAll(".book-chapter-list > li > a");
            for (let j = 0; j < cs.length; j++) {
                const c = cs[j];
                const chapterName = c.innerText.trim();
                const chapterUrl = c.href;
                let isVIP = false;
                let isPaid = false;
                if (c.childElementCount) {
                    isVIP = true;
                    if (((_a = c.firstElementChild) === null || _a === void 0 ? void 0 : _a.className) === "icon-unlock") {
                        isPaid = true;
                    }
                }
                const co = {
                    bookUrl: bookUrl,
                    bookname: bookname,
                    chapterUrl: chapterUrl,
                    chapterName: chapterName,
                    isVIP: isVIP,
                    isPaid: isPaid,
                    sectionName: sectionName,
                    sectionNumber: sectionNumber,
                    sectionChapterNumber: j,
                };
                cos.push(co);
            }
        }
        cos.sort(lib_1.cosCompare);
        for (let i = 0; i < cos.length; i++) {
            const chapterNumber = i + 1;
            let { bookUrl, bookname, chapterUrl, chapterName, isVIP, isPaid, sectionName, sectionNumber, sectionChapterNumber, } = cos[i];
            const chapter = new main_1.Chapter(bookUrl, bookname, chapterUrl, chapterNumber, chapterName, isVIP, isPaid, sectionName, sectionNumber, sectionChapterNumber, chapterParse, "UTF-8");
            const isLogin = ((_b = document.querySelector(".login-info.ly-fr")) === null || _b === void 0 ? void 0 : _b.childElementCount) === 1
                ? true
                : false;
            if (isVIP && !(isLogin && isPaid)) {
                chapter.status = main_1.Status.aborted;
            }
            chapters.push(chapter);
        }
        return {
            bookUrl: bookUrl,
            bookname: bookname,
            author: author,
            introduction: introduction,
            additionalMetadate: additionalMetadate,
            chapters: chapters,
        };
    }
    async chapterParse(chapterUrl, chapterName, isVIP, isPaid, charset) {
        function decrypt(item) {
            let message = item.content;
            let keys = item.keys;
            let len = item.keys.length;
            let accessKey = item.accessKey;
            let accessKeyList = accessKey.split("");
            let charsNotLatinNum = accessKeyList.length;
            let output = new Array();
            output.push(keys[accessKeyList[charsNotLatinNum - 1].charCodeAt(0) % len]);
            output.push(keys[accessKeyList[0].charCodeAt(0) % len]);
            for (let i = 0; i < output.length; i++) {
                message = atob(message);
                let data = output[i];
                let iv = btoa(message.substr(0, 16));
                let keys255 = btoa(message.substr(16));
                let pass = CryptoJS.format.OpenSSL.parse(keys255);
                message = CryptoJS.AES.decrypt(pass, CryptoJS.enc.Base64.parse(data), {
                    iv: CryptoJS.enc.Base64.parse(iv),
                    format: CryptoJS.format.OpenSSL,
                });
                if (i < output.length - 1) {
                    message = message.toString(CryptoJS.enc.Base64);
                    message = atob(message);
                }
            }
            return message.toString(CryptoJS.enc.Utf8);
        }
        async function getChapterAuthorSay() {
            const doc = await lib_1.getHtmlDOM(chapterUrl, undefined);
            const _chapter_author_says = doc.querySelectorAll("#J_BookCnt .chapter.author_say");
            let div_chapter_author_say;
            if (_chapter_author_says.length !== 0) {
                let hr = document.createElement("hr");
                div_chapter_author_say = document.createElement("div");
                div_chapter_author_say.appendChild(hr);
                for (let _chapter_author_say of Array.from(_chapter_author_says)) {
                    lib_1.rm("i", true, _chapter_author_say);
                    div_chapter_author_say.appendChild(_chapter_author_say);
                }
            }
            return div_chapter_author_say;
        }
        const chapter_id = chapterUrl.split("/").slice(-1)[0];
        async function publicChapter() {
            async function chapterDecrypt(chapter_id, refererUrl) {
                const rootPath = "https://www.ciweimao.com/";
                const access_key_url = rootPath + "chapter/ajax_get_session_code";
                const chapter_content_url = rootPath + "chapter/get_book_chapter_detail_info";
                console.debug(`[Chapter]请求 ${access_key_url} Referer ${refererUrl}`);
                const access_key_obj = await lib_1.gfetch(access_key_url, {
                    method: "POST",
                    headers: {
                        Accept: "application/json, text/javascript, */*; q=0.01",
                        "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
                        Referer: refererUrl,
                        Origin: "https://www.ciweimao.com",
                        "X-Requested-With": "XMLHttpRequest",
                    },
                    data: `chapter_id=${chapter_id}`,
                    responseType: "json",
                }).then((response) => response.response);
                const chapter_access_key = access_key_obj
                    .chapter_access_key;
                console.debug(`[Chapter]请求 ${chapter_content_url} Referer ${refererUrl}`);
                const chapter_content_obj = await lib_1.gfetch(chapter_content_url, {
                    method: "POST",
                    headers: {
                        Accept: "application/json, text/javascript, */*; q=0.01",
                        "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
                        Referer: refererUrl,
                        Origin: "https://www.ciweimao.com",
                        "X-Requested-With": "XMLHttpRequest",
                    },
                    data: `chapter_id=${chapter_id}&chapter_access_key=${chapter_access_key}`,
                    responseType: "json",
                }).then((response) => response.response);
                if (chapter_content_obj.code !== 100000) {
                    console.error(chapter_content_obj);
                    throw new Error(`下载 ${refererUrl} 失败`);
                }
                return decrypt({
                    content: chapter_content_obj.chapter_content,
                    keys: chapter_content_obj.encryt_keys,
                    accessKey: chapter_access_key,
                });
            }
            const div_chapter_author_say = await getChapterAuthorSay();
            let content = document.createElement("div");
            let decryptDate = await chapterDecrypt(chapter_id, chapterUrl);
            content.innerHTML = decryptDate;
            lib_1.rm(".chapter span", true, content);
            if (div_chapter_author_say) {
                content.appendChild(div_chapter_author_say);
            }
            let { dom, text, images } = lib_1.cleanDOM(content, "TM");
            return {
                chapterName: chapterName,
                contentRaw: content,
                contentText: text,
                contentHTML: dom,
                contentImages: images,
            };
        }
        async function vipChapter() {
            var _a;
            const isLogin = ((_a = document.querySelector(".login-info.ly-fr")) === null || _a === void 0 ? void 0 : _a.childElementCount) === 1
                ? true
                : false;
            if (isLogin && isPaid) {
                async function vipChapterDecrypt(chapter_id, refererUrl) {
                    const HB = unsafeWindow.HB;
                    const parentWidth = 871;
                    const setFontSize = "14";
                    const image_session_code_url = HB.config.rootPath + "chapter/ajax_get_image_session_code";
                    console.debug(`[Chapter]请求 ${image_session_code_url} Referer ${refererUrl}`);
                    const image_session_code_object = await lib_1.gfetch(image_session_code_url, {
                        method: "POST",
                        headers: {
                            Accept: "application/json, text/javascript, */*; q=0.01",
                            Referer: refererUrl,
                            Origin: "https://www.ciweimao.com",
                            "X-Requested-With": "XMLHttpRequest",
                        },
                        responseType: "json",
                    }).then((response) => response.response);
                    if (image_session_code_object.code !==
                        100000) {
                        console.error(image_session_code_object);
                        throw new Error(`下载 ${refererUrl} 失败`);
                    }
                    const imageCode = decrypt({
                        content: image_session_code_object
                            .image_code,
                        keys: image_session_code_object
                            .encryt_keys,
                        accessKey: image_session_code_object
                            .access_key,
                    });
                    const vipCHapterImageUrl = HB.config.rootPath +
                        "chapter/book_chapter_image?chapter_id=" +
                        chapter_id +
                        "&area_width=" +
                        parentWidth +
                        "&font=undefined" +
                        "&font_size=" +
                        setFontSize +
                        "&image_code=" +
                        imageCode +
                        "&bg_color_name=white" +
                        "&text_color_name=white";
                    return vipCHapterImageUrl;
                }
                const div_chapter_author_say = await getChapterAuthorSay();
                const vipCHapterImageUrl = await vipChapterDecrypt(chapter_id, chapterUrl);
                console.debug(`[Chapter]请求 ${vipCHapterImageUrl} Referer ${chapterUrl}`);
                const vipCHapterImageBlob = await lib_1.gfetch(vipCHapterImageUrl, {
                    method: "GET",
                    headers: {
                        Referer: chapterUrl,
                        Accept: "image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8",
                    },
                    responseType: "blob",
                }).then((response) => response.response);
                const vipCHapterName = `vipCHapter${chapter_id}.png`;
                const vipCHapterImage = new main_1.attachmentClass(vipCHapterImageUrl, vipCHapterName, "TM");
                if (vipCHapterImageBlob) {
                    vipCHapterImage.imageBlob = vipCHapterImageBlob;
                    vipCHapterImage.status = main_1.Status.finished;
                }
                const contentImages = [vipCHapterImage];
                let ddom, dtext, dimages;
                if (div_chapter_author_say) {
                    let { dom, text, images } = lib_1.cleanDOM(div_chapter_author_say, "TM");
                    [ddom, dtext, dimages] = [dom, text, images];
                }
                const img = document.createElement("img");
                img.src = vipCHapterName;
                img.alt = vipCHapterImageUrl;
                const contentHTML = document.createElement("div");
                contentHTML.appendChild(img);
                if (ddom) {
                    contentHTML.appendChild(ddom);
                }
                let contentText = `VIP章节,请打开HTML文件查看。\n![${vipCHapterImageUrl}](${vipCHapterName})`;
                if (dtext) {
                    contentText = contentText + "\n\n" + dtext;
                }
                return {
                    chapterName: chapterName,
                    contentRaw: contentHTML,
                    contentText: contentText,
                    contentHTML: contentHTML,
                    contentImages: contentImages,
                };
            }
            else {
                return {
                    chapterName: chapterName,
                    contentRaw: null,
                    contentText: null,
                    contentHTML: null,
                    contentImages: null,
                };
            }
        }
        if (isVIP) {
            return vipChapter();
        }
        else {
            return publicChapter();
        }
    }
}
exports.ciweimao = ciweimao;


/***/ }),

/***/ 161:
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {


Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.hetushu = void 0;
const main_1 = __webpack_require__(519);
const lib_1 = __webpack_require__(563);
class hetushu {
    constructor() {
        this.imageMode = "TM";
    }
    async bookParse(chapterParse) {
        var _a;
        const bookUrl = document.location.href;
        const bookname = (document.querySelector(".book_info > h2")).innerText.trim();
        const author = (document.querySelector(".book_info > div:nth-child(3) > a:nth-child(1)")).innerText.trim();
        let introduction;
        const introDom = document.querySelector(".intro");
        if (introDom === null) {
            introduction = null;
        }
        else {
            let { dom: introCleanDom, text: introCleantext, images: introCleanimages, } = lib_1.cleanDOM(introDom, "TM");
            introduction = introCleantext;
        }
        const additionalMetadate = {};
        const coverUrl = (document.querySelector(".book_info > img")).src;
        additionalMetadate.cover = new main_1.attachmentClass(coverUrl, `cover.${coverUrl.split(".").slice(-1)[0]}`, "TM");
        additionalMetadate.cover.init();
        const chapters = [];
        const chapterList = ((_a = document.querySelector("#dir")) === null || _a === void 0 ? void 0 : _a.childNodes);
        if (chapterList && chapterList.length !== 0) {
            let chapterNumber = 0;
            let sectionNumber = 0;
            let sectionName = null;
            let sectionChapterNumber = 0;
            for (let i = 0; i < chapterList.length; i++) {
                const node = chapterList[i];
                if (node.nodeName === "DT") {
                    sectionNumber++;
                    sectionChapterNumber = 0;
                    sectionName = node.innerText.trim();
                }
                else if (node.nodeName === "DD") {
                    chapterNumber++;
                    sectionChapterNumber++;
                    const a = node.firstElementChild;
                    const chapterName = a.innerText;
                    const chapterUrl = a.href;
                    const isVIP = false;
                    const isPaid = false;
                    const chapter = new main_1.Chapter(bookUrl, bookname, chapterUrl, chapterNumber, chapterName, isVIP, isPaid, sectionName, sectionNumber, sectionChapterNumber, chapterParse, "UTF-8");
                    chapters.push(chapter);
                }
            }
        }
        return {
            bookUrl: bookUrl,
            bookname: bookname,
            author: author,
            introduction: introduction,
            additionalMetadate: additionalMetadate,
            chapters: chapters,
        };
    }
    async chapterParse(chapterUrl, chapterName, isVIP, isPaid, charset) {
        const dom = await lib_1.getHtmlDOM(chapterUrl, charset);
        chapterName = (dom.querySelector("#content .h2")).innerText.trim();
        const content = dom.querySelector("#content");
        if (content) {
            lib_1.rm("h2", true, content);
            lib_1.rm("tt", true, content);
            let { dom, text, images } = lib_1.cleanDOM(content, "TM");
            return {
                chapterName: chapterName,
                contentRaw: content,
                contentText: text,
                contentHTML: dom,
                contentImages: images,
            };
        }
        else {
            return {
                chapterName: chapterName,
                contentRaw: null,
                contentText: null,
                contentHTML: null,
                contentImages: null,
            };
        }
    }
}
exports.hetushu = hetushu;


/***/ }),

/***/ 217:
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {


Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.jjwxc = void 0;
const main_1 = __webpack_require__(519);
const lib_1 = __webpack_require__(563);
const rules_1 = __webpack_require__(489);
class jjwxc {
    constructor() {
        this.imageMode = "TM";
        this.concurrencyLimit = 5;
        this.charset = "GB18030";
    }
    async bookParse(chapterParse) {
        var _a;
        const bookUrl = document.location.href;
        const bookname = (document.querySelector('h1[itemprop="name"] > span')).innerText.trim();
        let introduction;
        const author = (document.querySelector("td.sptd h2 a span")).innerText
            .replace(/作\s+者:/, "")
            .trim();
        const introDom = document.querySelector("#novelintro");
        if (introDom === null) {
            introduction = null;
        }
        else {
            lib_1.rm("img", true, introDom);
            let { dom: introCleanDom, text: introCleantext, images: introCleanimages, } = lib_1.cleanDOM(introDom, "TM");
            introduction = introCleantext;
        }
        const additionalMetadate = {};
        let coverUrl = (document.querySelector(".noveldefaultimage")).src;
        additionalMetadate.cover = new main_1.attachmentClass(coverUrl, `cover.${coverUrl.split(".").slice(-1)[0]}`, "TM");
        additionalMetadate.cover.init();
        const chapters = [];
        const cos = [];
        const trList = document.querySelectorAll("#oneboolt > tbody > tr");
        let chapterNumber = 0;
        let sectionNumber = 0;
        let sectionName = null;
        let sectionChapterNumber = 0;
        for (let i = 0; i < trList.length; i++) {
            const tr = trList[i];
            if (tr.getAttribute("bgcolor")) {
                sectionNumber++;
                sectionChapterNumber = 0;
                sectionName = (_a = (tr.querySelector("b.volumnfont"))) === null || _a === void 0 ? void 0 : _a.innerText.trim();
            }
            else if (tr.getAttribute("itemprop")) {
                chapterNumber++;
                sectionChapterNumber++;
                const td = tr.querySelector("td:nth-child(2)");
                const a = td === null || td === void 0 ? void 0 : td.querySelector("a:nth-child(1)");
                const isLocked = () => {
                    var _a;
                    if (((_a = td) === null || _a === void 0 ? void 0 : _a.innerText.trim()) === "[锁]") {
                        return true;
                    }
                    else {
                        return false;
                    }
                };
                const isVIP = () => {
                    if (a === null || a === void 0 ? void 0 : a.getAttribute("onclick")) {
                        return true;
                    }
                    else {
                        return false;
                    }
                };
                if (!isLocked()) {
                    if (isVIP()) {
                        const chapterName = a.innerText.trim();
                        const chapterUrl = a.getAttribute("rel");
                        if (chapterUrl) {
                            const co = {
                                bookUrl: bookUrl,
                                bookname: bookname,
                                chapterUrl: chapterUrl,
                                chapterName: chapterName,
                                isVIP: isVIP(),
                                isPaid: null,
                                sectionName: sectionName,
                                sectionNumber: sectionNumber,
                                sectionChapterNumber: sectionChapterNumber,
                            };
                            cos.push(co);
                        }
                    }
                    else {
                        const chapterName = a.innerText.trim();
                        const chapterUrl = a.href;
                        const co = {
                            bookUrl: bookUrl,
                            bookname: bookname,
                            chapterUrl: chapterUrl,
                            chapterName: chapterName,
                            isVIP: isVIP(),
                            isPaid: null,
                            sectionName: sectionName,
                            sectionNumber: sectionNumber,
                            sectionChapterNumber: sectionChapterNumber,
                        };
                        cos.push(co);
                    }
                }
            }
        }
        cos.sort(lib_1.cosCompare);
        for (let i = 0; i < cos.length; i++) {
            const chapterNumber = i + 1;
            let { bookUrl, bookname, chapterUrl, chapterName, isVIP, isPaid, sectionName, sectionNumber, sectionChapterNumber, } = cos[i];
            const chapter = new main_1.Chapter(bookUrl, bookname, chapterUrl, chapterNumber, chapterName, isVIP, isPaid, sectionName, sectionNumber, sectionChapterNumber, chapterParse, "GB18030");
            const isLogin = () => {
                if (document.getElementById("jj_login")) {
                    return false;
                }
                else {
                    return true;
                }
            };
            if (isVIP && !isLogin()) {
                chapter.status = main_1.Status.aborted;
            }
            chapters.push(chapter);
        }
        return {
            bookUrl: bookUrl,
            bookname: bookname,
            author: author,
            introduction: introduction,
            additionalMetadate: additionalMetadate,
            chapters: chapters,
        };
    }
    async chapterParse(chapterUrl, chapterName, isVIP, isPaid, charset) {
        async function publicChapter() {
            const dom = await lib_1.getHtmlDOM(chapterUrl, charset);
            const chapterName = (dom.querySelector("div.noveltext h2")).innerText.trim();
            const content = dom.querySelector("div.noveltext");
            if (content) {
                lib_1.rm("div", true, content);
                content.innerHTML = content.innerHTML.replace("@无限好文,尽在晋江文学城", "");
                let { dom, text, images } = lib_1.cleanDOM(content, "TM");
                return {
                    chapterName: chapterName,
                    contentRaw: content,
                    contentText: text,
                    contentHTML: dom,
                    contentImages: images,
                };
            }
            return {
                chapterName: chapterName,
                contentRaw: null,
                contentText: null,
                contentHTML: null,
                contentImages: null,
            };
        }
        async function vipChapter() {
            async function getFont() {
                function getFontInfo() {
                    var _a;
                    const s = dom.querySelectorAll("body > style")[1];
                    let fontName, fontUrl;
                    if (s.sheet) {
                        const f = s.sheet.cssRules[s.sheet.cssRules.length - 2];
                        const m1 = f.cssText.match(/jjwxcfont_[\d\w]+/);
                        const m2 = f.cssText.match(/{(.*)}/);
                        if (m1 && m2) {
                            fontName = m1[0];
                            const ft = m2[1];
                            for (const k of ft.split(",")) {
                                if (k.includes('format("woff2")')) {
                                    const m3 = k.match(/url\("(.*)"\)\s/);
                                    if (m3) {
                                        fontUrl = document.location.protocol + m3[1];
                                        return [fontName, fontUrl];
                                    }
                                }
                            }
                        }
                    }
                    const _fontName = (_a = document.querySelector("div.noveltext")) === null || _a === void 0 ? void 0 : _a.classList[1];
                    if (_fontName) {
                        fontName = _fontName;
                        fontUrl =
                            document.location.protocol +
                                `//static.jjwxc.net/tmp/fonts/${fontName}.woff2?h=my.jjwxc.net`;
                        return [fontName, fontUrl];
                    }
                    return [null, null];
                }
                let retryTime = 0;
                function fetchFont(fontUrl) {
                    console.debug(`[Chapter]请求 ${fontUrl} Referer ${chapterUrl} 重试次数 ${retryTime}`);
                    return lib_1.gfetch(fontUrl, {
                        headers: {
                            accept: "*/*",
                            Referer: chapterUrl,
                        },
                        responseType: "blob",
                    }).then((response) => {
                        if (response.status >= 200 && response.status <= 299) {
                            return response.response;
                        }
                        else {
                            console.error(`[Chapter]请求 ${fontUrl} 失败 Referer ${chapterUrl}`);
                            if (retryTime < rules_1.retryLimit) {
                                retryTime++;
                                return fetchFont(fontUrl);
                            }
                            else {
                                return null;
                            }
                        }
                    });
                }
                const [fontName, fontUrl] = getFontInfo();
                if (fontName && fontUrl) {
                    const fontBlob = await fetchFont(fontUrl);
                    const fontFileName = `${fontName}.woff2`;
                    if (fontBlob) {
                        const fontClassObj = new main_1.attachmentClass(fontUrl, fontFileName, "TM");
                        fontClassObj.imageBlob = fontBlob;
                        fontClassObj.status = main_1.Status.finished;
                        const fontStyleDom = document.createElement("style");
                        fontStyleDom.innerHTML = `.${fontName} {
  font-family: ${fontName}, 'Microsoft YaHei', PingFangSC-Regular, HelveticaNeue-Light, 'Helvetica Neue Light', sans-serif !important;
}
@font-face {
  font-family: ${fontName};
  src: url('${fontFileName}') format('woff2');
}`;
                        return [fontName, fontClassObj, fontStyleDom];
                    }
                }
                return [null, null, null];
            }
            const dom = await lib_1.ggetHtmlDOM(chapterUrl, charset);
            const isPaid = () => {
                if (!dom.querySelector("#buy_content") &&
                    dom.querySelector("div.noveltext")) {
                    return true;
                }
                else {
                    return false;
                }
            };
            if (isPaid()) {
                const chapterName = (dom.querySelector("div.noveltext h2")).innerText.trim();
                const content = dom.querySelector("div.noveltext");
                if (content) {
                    lib_1.rm("div", true, content);
                    content.innerHTML = content.innerHTML.replace("@无限好文,尽在晋江文学城", "");
                    let { dom: cdom, text, images } = lib_1.cleanDOM(content, "TM");
                    let [fontName, fontClassObj, fontStyleDom] = await getFont();
                    if (fontName && fontClassObj && fontStyleDom) {
                        images.push(fontClassObj);
                        cdom.appendChild(fontStyleDom);
                        cdom.className = fontName;
                    }
                    return {
                        chapterName: chapterName,
                        contentRaw: content,
                        contentText: text,
                        contentHTML: cdom,
                        contentImages: images,
                    };
                }
            }
            return {
                chapterName: chapterName,
                contentRaw: null,
                contentText: null,
                contentHTML: null,
                contentImages: null,
            };
        }
        if (isVIP) {
            return vipChapter();
        }
        else {
            return publicChapter();
        }
    }
}
exports.jjwxc = jjwxc;


/***/ }),

/***/ 158:
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {


Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.meegoq = void 0;
const main_1 = __webpack_require__(519);
const lib_1 = __webpack_require__(563);
class meegoq {
    constructor() {
        this.imageMode = "TM";
        this.concurrencyLimit = 3;
    }
    async bookParse(chapterParse) {
        const bookUrl = document.location.href.replace("/book", "/info");
        const bookname = (document.querySelector("article.info > header > h1")).innerText.trim();
        const dom = await lib_1.getHtmlDOM(bookUrl, "GBK");
        const author = (dom.querySelector("article.info > p.detail.pt20 > i:nth-child(1) > a")).innerText.trim();
        let introduction;
        const introDom = dom.querySelector("article.info > p.desc");
        if (introDom === null) {
            introduction = null;
        }
        else {
            lib_1.rm("b", false, introDom);
            let { dom: introCleanDom, text: introCleantext, images: introCleanimages, } = lib_1.cleanDOM(introDom, "TM");
            introduction = introCleantext;
        }
        const additionalMetadate = {};
        const coverUrl = (dom.querySelector("article.info > div.cover > img")).src;
        additionalMetadate.cover = new main_1.attachmentClass(coverUrl, `cover.${coverUrl.split(".").slice(-1)[0]}`, "TM");
        additionalMetadate.cover.init();
        const chapters = [];
        const ul = document.querySelector("ul.mulu");
        if (ul === null || ul === void 0 ? void 0 : ul.childElementCount) {
            const ulc = Array.from(ul.children);
            if (Array.from(ulc[0].classList).includes("volumn") &&
                ulc[0].innerText.match(/最新.章/)) {
                for (let i = 0; i < (ul === null || ul === void 0 ? void 0 : ul.childElementCount); i++) {
                    if (i !== 0 &&
                        Array.from(ulc[i].classList).includes("volumn") &&
                        ulc[i].innerText.trim() !== "全部章节") {
                        delete ulc[0];
                        break;
                    }
                    delete ulc[i];
                }
            }
            const chapterList = ulc.filter((obj) => obj !== undefined);
            let chapterNumber = 0;
            let sectionNumber = 0;
            let sectionName = null;
            let sectionChapterNumber = 0;
            for (let i = 0; i < chapterList.length; i++) {
                const li = chapterList[i];
                if (Array.from(li.classList).includes("volumn")) {
                    sectionNumber++;
                    sectionChapterNumber = 0;
                    sectionName = li.innerText.trim();
                }
                else {
                    chapterNumber++;
                    sectionChapterNumber++;
                    const a = li.firstElementChild;
                    const chapterName = a.innerText;
                    const chapterUrl = a.href;
                    const isVIP = false;
                    const isPaid = false;
                    const chapter = new main_1.Chapter(bookUrl, bookname, chapterUrl, chapterNumber, chapterName, isVIP, isPaid, sectionName, sectionNumber, sectionChapterNumber, chapterParse, "GBK");
                    chapters.push(chapter);
                }
            }
        }
        return {
            bookUrl: bookUrl,
            bookname: bookname,
            author: author,
            introduction: introduction,
            additionalMetadate: additionalMetadate,
            chapters: chapters,
        };
    }
    async chapterParse(chapterUrl, chapterName, isVIP, isPaid, charset) {
        const dom = await lib_1.getHtmlDOM(chapterUrl, charset);
        chapterName = (dom.querySelector("article > header > h1")).innerText.trim();
        const content = dom.querySelector("#content");
        if (content) {
            let { dom, text, images } = lib_1.cleanDOM(content, "TM");
            return {
                chapterName: chapterName,
                contentRaw: content,
                contentText: text,
                contentHTML: dom,
                contentImages: images,
            };
        }
        else {
            return {
                chapterName: chapterName,
                contentRaw: null,
                contentText: null,
                contentHTML: null,
                contentImages: null,
            };
        }
    }
}
exports.meegoq = meegoq;


/***/ }),

/***/ 839:
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {


Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.qidian = void 0;
const main_1 = __webpack_require__(519);
const lib_1 = __webpack_require__(563);
class qidian {
    constructor() {
        this.imageMode = "TM";
        this.concurrencyLimit = 5;
    }
    async bookParse(chapterParse) {
        const bookUrl = document.location.href;
        const bookname = (document.querySelector(".book-info > h1 > em")).innerText.trim();
        let introduction;
        const author = (document.querySelector(".book-info .writer")).innerText
            .replace(/作\s+者:/, "")
            .trim();
        const introDom = document.querySelector(".book-info-detail .book-intro");
        if (introDom === null) {
            introduction = null;
        }
        else {
            let { dom: introCleanDom, text: introCleantext, images: introCleanimages, } = lib_1.cleanDOM(introDom, "TM");
            introduction = introCleantext;
        }
        const additionalMetadate = {};
        let coverUrl = document.querySelector("#bookImg > img")
            .src;
        additionalMetadate.cover = new main_1.attachmentClass(coverUrl, `cover.${coverUrl.split(".").slice(-1)[0]}`, "TM");
        additionalMetadate.cover.init();
        additionalMetadate.tags = Array.from(document.querySelectorAll(".tag-wrap>.tags")).map((a) => a.innerText.trim());
        const chapters = [];
        const liLength = document.querySelectorAll("#j-catalogWrap li").length;
        const getChapterTotalNumber = () => {
            const span = (document.querySelector("#J-catalogCount")).innerText.match(/\d+/);
            if (span) {
                return Number(span[0]);
            }
        };
        if (!(liLength && getChapterTotalNumber() === liLength)) {
            await lib_1.sleep(3000);
        }
        const sections = document.querySelectorAll("#j-catalogWrap > .volume-wrap > .volume");
        const cos = [];
        for (let i = 0; i < sections.length; i++) {
            const s = sections[i];
            const sectionNumber = i + 1;
            const sectionName = s.querySelector("h3").innerText
                .trim()
                .split("·")[0];
            const cs = s.querySelectorAll("ul.cf > li");
            for (let j = 0; j < cs.length; j++) {
                const c = cs[j];
                const a = c.firstElementChild;
                const chapterName = a.innerText.trim();
                const chapterUrl = a.href;
                const isVIP = () => {
                    const host = new URL(chapterUrl).host;
                    if (host === "vipreader.qidian.com") {
                        return true;
                    }
                    return false;
                };
                const isPaid = () => {
                    if (isVIP()) {
                        if (c.childElementCount === 2) {
                            return false;
                        }
                        else {
                            return true;
                        }
                    }
                    return false;
                };
                const co = {
                    bookUrl: bookUrl,
                    bookname: bookname,
                    chapterUrl: chapterUrl,
                    chapterName: chapterName,
                    isVIP: isVIP(),
                    isPaid: isPaid(),
                    sectionName: sectionName,
                    sectionNumber: sectionNumber,
                    sectionChapterNumber: j,
                };
                cos.push(co);
            }
        }
        cos.sort(lib_1.cosCompare);
        for (let i = 0; i < cos.length; i++) {
            const chapterNumber = i + 1;
            let { bookUrl, bookname, chapterUrl, chapterName, isVIP, isPaid, sectionName, sectionNumber, sectionChapterNumber, } = cos[i];
            const chapter = new main_1.Chapter(bookUrl, bookname, chapterUrl, chapterNumber, chapterName, isVIP, isPaid, sectionName, sectionNumber, sectionChapterNumber, chapterParse, "UTF-8");
            const isLogin = () => {
                const sign_in_dom = document.querySelector(".sign-in");
                const sign_out_dom = document.querySelector(".sign-out");
                if (sign_in_dom && sign_out_dom) {
                    if (Array.from(sign_out_dom.classList).includes("hidden")) {
                        return true;
                    }
                }
                return false;
            };
            if (isVIP && !(isLogin() && chapter.isPaid)) {
                chapter.status = main_1.Status.aborted;
            }
            chapters.push(chapter);
        }
        return {
            bookUrl: bookUrl,
            bookname: bookname,
            author: author,
            introduction: introduction,
            additionalMetadate: additionalMetadate,
            chapters: chapters,
        };
    }
    async chapterParse(chapterUrl, chapterName, isVIP, isPaid, charset) {
        async function publicChapter() {
            const dom = await lib_1.ggetHtmlDOM(chapterUrl, charset);
            const chapterName = (dom.querySelector(".j_chapterName > .content-wrap")).innerText.trim();
            const content = dom.querySelector(".read-content");
            const author_say_wrap = (dom.querySelector(".author-say-wrap"));
            if (content) {
                if (author_say_wrap) {
                    const author_say = author_say_wrap.querySelector("div.author-say > p:nth-child(3)");
                    const hr = document.createElement("hr");
                    content.appendChild(hr);
                    content.appendChild(author_say);
                }
                let { dom, text, images } = lib_1.cleanDOM(content, "TM");
                return {
                    chapterName: chapterName,
                    contentRaw: content,
                    contentText: text,
                    contentHTML: dom,
                    contentImages: images,
                };
            }
            else {
                return {
                    chapterName: chapterName,
                    contentRaw: null,
                    contentText: null,
                    contentHTML: null,
                    contentImages: null,
                };
            }
        }
        async function vipChapter() {
            var _a;
            const _csrfToken = unsafeWindow.jQuery.ajaxSettings.data
                ._csrfToken;
            const bookId = document.location.pathname.split("/").slice(-1)[0];
            const authorId = (_a = document
                .querySelector("#authorId")) === null || _a === void 0 ? void 0 : _a.getAttribute("data-authorid");
            const chapterId = chapterUrl.split("/").slice(-1)[0];
            async function getChapterInfo() {
                const baseUrl = "https://vipreader.qidian.com/ajax/chapter/chapterInfo";
                const search = new URLSearchParams({
                    _csrfToken: _csrfToken,
                    bookId: bookId,
                    chapterId: chapterId,
                    authorId: authorId,
                });
                const url = baseUrl + "?" + search.toString();
                console.debug(`[Chapter]请求 ${url} Referer ${chapterUrl}`);
                return lib_1.gfetch(url, {
                    headers: {
                        accept: "application/json, text/javascript, */*; q=0.01",
                        "x-requested-with": "XMLHttpRequest",
                        Referer: chapterUrl,
                    },
                    responseType: "json",
                }).then((response) => response.response);
            }
            if (isPaid) {
                const chapterInfo = await getChapterInfo();
                if (chapterInfo.code === 0) {
                    const authorSay = chapterInfo.data.chapterInfo.authorSay;
                    const _content = chapterInfo.data.chapterInfo.content;
                    const content = document.createElement("div");
                    content.innerHTML = _content;
                    if (authorSay) {
                        const hr = document.createElement("hr");
                        content.appendChild(hr);
                        const authorSayDom = document.createElement("p");
                        authorSayDom.innerHTML = authorSay;
                        content.appendChild(authorSayDom);
                    }
                    const { dom, text, images } = lib_1.cleanDOM(content, "TM");
                    return {
                        chapterName: chapterName,
                        contentRaw: content,
                        contentText: text,
                        contentHTML: dom,
                        contentImages: images,
                    };
                }
            }
            return {
                chapterName: chapterName,
                contentRaw: null,
                contentText: null,
                contentHTML: null,
                contentImages: null,
            };
        }
        if (isVIP) {
            return vipChapter();
        }
        else {
            return publicChapter();
        }
    }
}
exports.qidian = qidian;


/***/ }),

/***/ 116:
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {


Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.sfacg = void 0;
const main_1 = __webpack_require__(519);
const lib_1 = __webpack_require__(563);
const rules_1 = __webpack_require__(489);
class sfacg {
    constructor() {
        this.imageMode = "TM";
        this.concurrencyLimit = 1;
    }
    async bookParse(chapterParse) {
        var _a, _b, _c;
        const bookUrl = document.location.href.replace("/MainIndex/", "");
        const bookname = (document.querySelector("h1.story-title")).innerText.trim();
        let introduction;
        const dom = await lib_1.getHtmlDOM(bookUrl, undefined);
        const author = (dom.querySelector(".author-name")).innerText.trim();
        const introDom = dom.querySelector(".introduce");
        if (introDom === null) {
            introduction = null;
        }
        else {
            let { dom: introCleanDom, text: introCleantext, images: introCleanimages, } = lib_1.cleanDOM(introDom, "TM");
            introduction = introCleantext;
        }
        const additionalMetadate = {};
        let coverUrl = (dom.querySelector("#hasTicket div.pic img")).src;
        additionalMetadate.cover = new main_1.attachmentClass(coverUrl, `cover.${coverUrl.split(".").slice(-1)[0]}`, "TM");
        additionalMetadate.cover.init();
        additionalMetadate.tags = Array.from(dom.querySelectorAll("ul.tag-list > li.tag > a")).map((a) => a.innerText.trim());
        const chapters = [];
        const sections = document.querySelectorAll(".story-catalog");
        const cos = [];
        for (let i = 0; i < sections.length; i++) {
            const s = sections[i];
            const sectionNumber = i + 1;
            const sectionName = (s.querySelector(".catalog-title")).innerText
                .replace(`【${bookname}】`, "")
                .trim();
            const cs = s.querySelectorAll(".catalog-list > ul > li > a");
            for (let j = 0; j < cs.length; j++) {
                const c = cs[j];
                const _chapterName = (_a = c.getAttribute("title")) === null || _a === void 0 ? void 0 : _a.trim();
                const chapterName = _chapterName ? _chapterName : "";
                const chapterUrl = c.href;
                let isVIP = false;
                let isPaid = null;
                if (c.childElementCount &&
                    ((_b = c.firstElementChild) === null || _b === void 0 ? void 0 : _b.getAttribute("class")) === "icn_vip") {
                    isVIP = true;
                }
                const co = {
                    bookUrl: bookUrl,
                    bookname: bookname,
                    chapterUrl: chapterUrl,
                    chapterName: chapterName,
                    isVIP: isVIP,
                    isPaid: isPaid,
                    sectionName: sectionName,
                    sectionNumber: sectionNumber,
                    sectionChapterNumber: j,
                };
                cos.push(co);
            }
        }
        let chapterNumber = 0;
        cos.sort(lib_1.cosCompare);
        for (let i = 0; i < cos.length; i++) {
            chapterNumber++;
            let { bookUrl, bookname, chapterUrl, chapterName, isVIP, isPaid, sectionName, sectionNumber, sectionChapterNumber, } = cos[i];
            const chapter = new main_1.Chapter(bookUrl, bookname, chapterUrl, chapterNumber, chapterName, isVIP, isPaid, sectionName, sectionNumber, sectionChapterNumber, chapterParse, "UTF-8");
            const isLogin = ((_c = document.querySelector(".user-bar > .top-link > .normal-link")) === null || _c === void 0 ? void 0 : _c.childElementCount) === 3
                ? true
                : false;
            if (isVIP && !isLogin) {
                chapter.status = main_1.Status.aborted;
            }
            chapters.push(chapter);
        }
        return {
            bookUrl: bookUrl,
            bookname: bookname,
            author: author,
            introduction: introduction,
            additionalMetadate: additionalMetadate,
            chapters: chapters,
        };
    }
    async chapterParse(chapterUrl, chapterName, isVIP, isPaid, charset) {
        const chapter_id = chapterUrl.split("/").slice(-2, -1)[0];
        async function publicChapter() {
            const dom = await lib_1.getHtmlDOM(chapterUrl, charset);
            const chapterName = (dom.querySelector("h1.article-title")).innerText.trim();
            const content = dom.querySelector(".article-content");
            if (content) {
                let { dom, text, images } = lib_1.cleanDOM(content, "TM");
                return {
                    chapterName: chapterName,
                    contentRaw: content,
                    contentText: text,
                    contentHTML: dom,
                    contentImages: images,
                };
            }
            else {
                return {
                    chapterName: chapterName,
                    contentRaw: null,
                    contentText: null,
                    contentHTML: null,
                    contentImages: null,
                };
            }
        }
        async function vipChapter() {
            var _a;
            async function getvipChapterImage(vipChapterImageUrl, vipChapterName) {
                let retryTime = 0;
                function fetchVipChapterImage(vipChapterImageUrl) {
                    console.debug(`[Chapter]请求 ${vipChapterImageUrl} Referer ${chapterUrl} 重试次数 ${retryTime}`);
                    return fetch(vipChapterImageUrl, {
                        headers: {
                            accept: "image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8",
                        },
                        referrer: chapterUrl,
                        body: null,
                        method: "GET",
                        mode: "cors",
                        credentials: "include",
                    })
                        .then((response) => response.blob())
                        .then((blob) => {
                        if (blob.size === 53658 || blob.size === 42356) {
                            console.error(`[Chapter]请求 ${vipChapterImageUrl} 失败 Referer ${chapterUrl}`);
                            if (retryTime < rules_1.retryLimit) {
                                retryTime++;
                                return fetchVipChapterImage(vipChapterImageUrl);
                            }
                            else {
                                return null;
                            }
                        }
                        else {
                            return blob;
                        }
                    });
                }
                const vipChapterImageBlob = await fetchVipChapterImage(vipChapterImageUrl);
                const vipChapterImage = new main_1.attachmentClass(vipChapterImageUrl, vipChapterName, "naive");
                if (vipChapterImageBlob) {
                    vipChapterImage.imageBlob = vipChapterImageBlob;
                    vipChapterImage.status = main_1.Status.finished;
                }
                else {
                    vipChapterImage.status = main_1.Status.failed;
                }
                return vipChapterImage;
            }
            const isLogin = ((_a = document.querySelector(".user-bar > .top-link > .normal-link")) === null || _a === void 0 ? void 0 : _a.childElementCount) === 3
                ? true
                : false;
            if (isLogin) {
                const dom = await lib_1.getHtmlDOM(chapterUrl, charset);
                const chapterName = (dom.querySelector("h1.article-title")).innerText.trim();
                const isPaid = dom.querySelector(".pay-section") === null;
                if (isPaid) {
                    const vipChapterDom = (dom.querySelector(".article-content > #vipImage"));
                    if (vipChapterDom) {
                        const vipChapterImageUrl = vipChapterDom.src;
                        const vipChapterName = `vipCHapter${chapter_id}.gif`;
                        const vipChapterImage = await getvipChapterImage(vipChapterImageUrl, vipChapterName);
                        const contentImages = [vipChapterImage];
                        const img = document.createElement("img");
                        img.src = vipChapterName;
                        img.alt = vipChapterImageUrl;
                        const contentHTML = document.createElement("div");
                        contentHTML.appendChild(img);
                        const contentText = `VIP章节,请打开HTML文件查看。\n![${vipChapterImageUrl}](${vipChapterName})`;
                        return {
                            chapterName: chapterName,
                            contentRaw: contentHTML,
                            contentText: contentText,
                            contentHTML: contentHTML,
                            contentImages: contentImages,
                        };
                    }
                    else {
                        return publicChapter();
                    }
                }
            }
            return {
                chapterName: chapterName,
                contentRaw: null,
                contentText: null,
                contentHTML: null,
                contentImages: null,
            };
        }
        if (isVIP) {
            return vipChapter();
        }
        else {
            return publicChapter();
        }
    }
}
exports.sfacg = sfacg;


/***/ }),

/***/ 382:
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {


Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.shouda8 = void 0;
const main_1 = __webpack_require__(519);
const lib_1 = __webpack_require__(563);
class shouda8 {
    constructor() {
        this.imageMode = "TM";
    }
    async bookParse(chapterParse) {
        const bookUrl = document.location.href;
        const bookname = (document.querySelector(".bread-crumbs > li:nth-child(4)")).innerText.trim();
        const author = (document.querySelector("div.bookname > h1 > em")).innerText
            .replace("作者:", "")
            .trim();
        let introduction;
        const introDom = document.querySelector(".intro");
        if (introDom === null) {
            introduction = null;
        }
        else {
            lib_1.rm(".book_keywords", false, introDom);
            lib_1.rm("script", true, introDom);
            lib_1.rm("#cambrian0", false, introDom);
            let { dom: introCleanDom, text: introCleantext, images: introCleanimages, } = lib_1.cleanDOM(introDom, "TM");
            introduction = introCleantext;
        }
        const additionalMetadate = {};
        const coverUrl = (document.querySelector(".pic > img:nth-child(1)")).src;
        additionalMetadate.cover = new main_1.attachmentClass(coverUrl, `cover.${coverUrl.split(".").slice(-1)[0]}`, "TM");
        additionalMetadate.cover.init();
        const chapters = [];
        const chapterList = document.querySelectorAll(".link_14 > dl dd a");
        for (let i = 0; i < chapterList.length; i++) {
            const a = chapterList[i];
            const chapterName = a.innerText;
            const chapterUrl = a.href;
            const isVIP = false;
            const isPaid = false;
            const chapter = new main_1.Chapter(bookUrl, bookname, chapterUrl, i + 1, chapterName, isVIP, isPaid, null, null, null, chapterParse, "UTF-8");
            chapters.push(chapter);
        }
        return {
            bookUrl: bookUrl,
            bookname: bookname,
            author: author,
            introduction: introduction,
            additionalMetadate: additionalMetadate,
            chapters: chapters,
        };
    }
    async chapterParse(chapterUrl, chapterName, isVIP, isPaid, charset) {
        const dom = await lib_1.getHtmlDOM(chapterUrl, charset);
        chapterName = (dom.querySelector(".kfyd > h2:nth-child(1)")).innerText.trim();
        const content = dom.querySelector("#content");
        if (content) {
            lib_1.rm("p:last-child", false, content);
            let { dom, text, images } = lib_1.cleanDOM(content, "TM");
            return {
                chapterName: chapterName,
                contentRaw: content,
                contentText: text,
                contentHTML: dom,
                contentImages: images,
            };
        }
        else {
            return {
                chapterName: chapterName,
                contentRaw: null,
                contentText: null,
                contentHTML: null,
                contentImages: null,
            };
        }
    }
}
exports.shouda8 = shouda8;


/***/ }),

/***/ 113:
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {


Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.shuhai = void 0;
const main_1 = __webpack_require__(519);
const lib_1 = __webpack_require__(563);
class shuhai {
    constructor() {
        this.imageMode = "TM";
        this.concurrencyLimit = 5;
        this.charset = "GBK";
    }
    async bookParse(chapterParse) {
        var _a;
        const bookUrl = document.location.href;
        const bookname = (document.querySelector("div.book-info-bookname > span:nth-child(1)")).innerText.trim();
        let introduction;
        const author = (document.querySelector("div.book-info-bookname > span:nth-child(2)")).innerText
            .replace("作者: ", "")
            .trim();
        const introDom = document.querySelector("div.book-info-bookintro") ||
            document.querySelector("div.book-info-bookintro-all");
        if (introDom === null) {
            introduction = null;
        }
        else {
            let { dom: introCleanDom, text: introCleantext, images: introCleanimages, } = lib_1.cleanDOM(introDom, "TM");
            introduction = introCleantext;
        }
        const additionalMetadate = {};
        let coverUrl = (document.querySelector(".book-cover-wrapper > img")).getAttribute("data-original");
        if (coverUrl) {
            additionalMetadate.cover = new main_1.attachmentClass(coverUrl, `cover.${coverUrl.split(".").slice(-1)[0]}`, "TM");
            additionalMetadate.cover.init();
        }
        additionalMetadate.tags = Array.from(document.querySelectorAll(".book-info-bookstate > .tag")).map((span) => span.innerText.trim());
        const chapters = [];
        if (document.querySelectorAll("#catalog > .chapter-item").length === 0) {
            await lib_1.sleep(3000);
        }
        const cos = [];
        const dsList = document.querySelectorAll("#catalog > .chapter-item");
        let chapterNumber = 0;
        let sectionNumber = 0;
        let sectionName = null;
        let sectionChapterNumber = 0;
        for (let i = 0; i < dsList.length; i++) {
            const node = dsList[i];
            if (node.nodeName === "SPAN") {
                sectionNumber++;
                sectionChapterNumber = 0;
                sectionName = (_a = node) === null || _a === void 0 ? void 0 : _a.innerText.trim();
            }
            else if (node.nodeName === "DIV") {
                chapterNumber++;
                sectionChapterNumber++;
                const a = node.querySelector("a");
                const isVIP = () => {
                    if (node.childElementCount === 2) {
                        return true;
                    }
                    else {
                        return false;
                    }
                };
                const isPaid = () => {
                    return false;
                };
                const chapterName = a.innerText.trim();
                const chapterUrl = a.href;
                const co = {
                    bookUrl: bookUrl,
                    bookname: bookname,
                    chapterUrl: chapterUrl,
                    chapterName: chapterName,
                    isVIP: isVIP(),
                    isPaid: isPaid(),
                    sectionName: sectionName,
                    sectionNumber: sectionNumber,
                    sectionChapterNumber: sectionChapterNumber,
                };
                cos.push(co);
            }
        }
        cos.sort(lib_1.cosCompare);
        for (let i = 0; i < cos.length; i++) {
            const chapterNumber = i + 1;
            let { bookUrl, bookname, chapterUrl, chapterName, isVIP, isPaid, sectionName, sectionNumber, sectionChapterNumber, } = cos[i];
            const chapter = new main_1.Chapter(bookUrl, bookname, chapterUrl, chapterNumber, chapterName, isVIP, isPaid, sectionName, sectionNumber, sectionChapterNumber, chapterParse, "GBK");
            const isLogin = () => {
                return false;
            };
            if (isVIP && !(isLogin() && chapter.isPaid)) {
                chapter.status = main_1.Status.aborted;
            }
            chapters.push(chapter);
        }
        return {
            bookUrl: bookUrl,
            bookname: bookname,
            author: author,
            introduction: introduction,
            additionalMetadate: additionalMetadate,
            chapters: chapters,
        };
    }
    async chapterParse(chapterUrl, chapterName, isVIP, isPaid, charset) {
        async function publicChapter() {
            const dom = await lib_1.ggetHtmlDOM(chapterUrl, charset);
            const chapterName = (dom.querySelector("div.chapter-name")).innerText
                .replace("正文 ", "")
                .trim();
            const content = (dom.querySelector("#reader-content > div:nth-child(1)"));
            if (content) {
                lib_1.rm("div.chaper-info", false, content);
                let { dom, text, images } = lib_1.cleanDOM(content, "TM");
                return {
                    chapterName: chapterName,
                    contentRaw: content,
                    contentText: text,
                    contentHTML: dom,
                    contentImages: images,
                };
            }
            else {
                return {
                    chapterName: chapterName,
                    contentRaw: null,
                    contentText: null,
                    contentHTML: null,
                    contentImages: null,
                };
            }
        }
        async function vipChapter() {
            return {
                chapterName: chapterName,
                contentRaw: null,
                contentText: null,
                contentHTML: null,
                contentImages: null,
            };
        }
        if (isVIP) {
            return vipChapter();
        }
        else {
            return publicChapter();
        }
    }
}
exports.shuhai = shuhai;


/***/ }),

/***/ 623:
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {


Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.uukanshu = void 0;
const main_1 = __webpack_require__(519);
const lib_1 = __webpack_require__(563);
class uukanshu {
    constructor() {
        this.imageMode = "TM";
        this.charset = "GBK";
    }
    async bookParse(chapterParse) {
        var _a;
        const bookUrl = document.location.href;
        const bookname = (document.querySelector("dd.jieshao_content > h1 > a")).innerText
            .replace("最新章节", "")
            .trim();
        const author = (document.querySelector("dd.jieshao_content > h2 > a")).innerText.trim();
        let introduction;
        const introDom = (document.querySelector("dd.jieshao_content > h3"));
        if (introDom === null) {
            introduction = null;
        }
        else {
            introDom.innerHTML = introDom.innerHTML
                .replace(/^.+简介:\s+www.uukanshu.com\s+/, "")
                .replace(/\s+https:\/\/www.uukanshu.com/, "")
                .replace(/-+/, "");
            let { dom: introCleanDom, text: introCleantext, images: introCleanimages, } = lib_1.cleanDOM(introDom, "TM");
            introduction = introCleantext;
        }
        const additionalMetadate = {};
        const coverUrl = (document.querySelector("a.bookImg > img")).src;
        additionalMetadate.cover = new main_1.attachmentClass(coverUrl, `cover.${coverUrl.split(".").slice(-1)[0]}`, "TM");
        additionalMetadate.cover.init();
        const chapters = [];
        const button = (document.querySelector('span[onclick="javascript:reverse(this);"]'));
        const reverse = unsafeWindow.reverse;
        if (button.innerText === "顺序排列") {
            reverse(button);
        }
        const chapterList = ((_a = document.getElementById("chapterList")) === null || _a === void 0 ? void 0 : _a.childNodes);
        if (chapterList && chapterList.length !== 0) {
            let chapterNumber = 0;
            let sectionNumber = 0;
            let sectionName = null;
            let sectionChapterNumber = 0;
            for (let i = 0; i < chapterList.length; i++) {
                const li = chapterList[i];
                if (li.className === "volume") {
                    sectionNumber++;
                    sectionChapterNumber = 0;
                    sectionName = li.innerText;
                }
                else {
                    chapterNumber++;
                    sectionChapterNumber++;
                    const a = li.firstElementChild;
                    const chapterName = a.innerText;
                    const chapterUrl = a.href;
                    const isVIP = false;
                    const isPaid = false;
                    const chapter = new main_1.Chapter(bookUrl, bookname, chapterUrl, chapterNumber, chapterName, isVIP, isPaid, sectionName, sectionNumber, sectionChapterNumber, chapterParse, "GBK");
                    chapters.push(chapter);
                }
            }
        }
        return {
            bookUrl: bookUrl,
            bookname: bookname,
            author: author,
            introduction: introduction,
            additionalMetadate: additionalMetadate,
            chapters: chapters,
        };
    }
    async chapterParse(chapterUrl, chapterName, isVIP, isPaid, charset) {
        const dom = await lib_1.getHtmlDOM(chapterUrl, charset);
        chapterName = dom.querySelector("#timu").innerText.trim();
        const content = dom.querySelector("#contentbox");
        if (content) {
            lib_1.rm(".ad_content", true, content);
            const contentReplace = [
                /[UuUu]+看书\s*[ww]+.[UuUu]+[kk][aa][nn][ss][hh][UuUu].[nn][ee][tt]/g,
                /[UuUu]+看书\s*[ww]+.[UuUu]+[kk][aa][nn][ss][hh][UuUu].[cCc][oOo][mMm]/g,
                /[UU]*看书[(\\(].*?[)\\)]文字首发。/,
                "请记住本书首发域名:。",
                "笔趣阁手机版阅读网址:",
                "小说网手机版阅读网址:",
                "https://",
                "http://",
            ];
            for (let r of contentReplace) {
                content.innerHTML = content.innerHTML.replace(r, "");
            }
            let { dom, text, images } = lib_1.cleanDOM(content, "TM");
            return {
                chapterName: chapterName,
                contentRaw: content,
                contentText: text,
                contentHTML: dom,
                contentImages: images,
            };
        }
        else {
            return {
                chapterName: chapterName,
                contentRaw: null,
                contentText: null,
                contentHTML: null,
                contentImages: null,
            };
        }
    }
}
exports.uukanshu = uukanshu;


/***/ }),

/***/ 678:
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {


Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.xiaoshuodaquan = void 0;
const main_1 = __webpack_require__(519);
const lib_1 = __webpack_require__(563);
class xiaoshuodaquan {
    constructor() {
        this.imageMode = "TM";
        this.charset = "GBK";
        this.concurrencyLimit = 5;
    }
    async bookParse(chapterParse) {
        var _a, _b;
        const ccount = (_a = document.querySelector(".crumbswrap")) === null || _a === void 0 ? void 0 : _a.childElementCount;
        let bookUrl = document.location.href;
        if (ccount) {
            bookUrl = (document.querySelector(`.crumbswrap > a:nth-child(${ccount - 2})`)).href;
        }
        const bookname = (document.querySelector("div.dirwraps > h1")).innerText
            .replace("《", "")
            .replace("》", "")
            .trim();
        const author = (document.querySelector(".smallcons > span:nth-child(1) > a:nth-child(1)")).innerText.trim();
        let introduction;
        const introDom = document.querySelector(".bookintro");
        if (introDom === null) {
            introduction = null;
        }
        else {
            introDom.innerHTML = introDom.innerHTML.replace("内容简介:", "");
            let { dom: introCleanDom, text: introCleantext, images: introCleanimages, } = lib_1.cleanDOM(introDom, "TM");
            introduction = introCleantext;
        }
        const additionalMetadate = {};
        let coverUrl;
        if (ccount) {
            const dom = await lib_1.getHtmlDOM(bookUrl, "GBK");
            coverUrl = dom.querySelector(".con_limg > img").src;
        }
        if (coverUrl) {
            additionalMetadate.cover = new main_1.attachmentClass(coverUrl, `cover.${coverUrl.split(".").slice(-1)[0]}`, "TM");
            additionalMetadate.cover.init();
        }
        const chapters = [];
        const sectionNames = document.querySelectorAll(".dirwraps > div.dirtitone");
        const sections = document.querySelectorAll(".dirwraps > div.clearfix.dirconone");
        let chapterNumber = 0;
        for (let i = 0; i < sections.length; i++) {
            const sectionNameObj = sectionNames[i];
            const sectionObj = sections[i];
            const sectionNumber = i + 1;
            const sectionName = (_b = (sectionNameObj.firstElementChild)) === null || _b === void 0 ? void 0 : _b.innerText.replace(bookname, "").trim();
            let sectionChapterNumber = 0;
            const cos = sectionObj.querySelectorAll("ul>li>a");
            for (let j = 0; j < cos.length; j++) {
                chapterNumber++;
                sectionChapterNumber++;
                const a = cos[j];
                const chapterName = a.innerText;
                const chapterUrl = a.href;
                const isVIP = false;
                const isPaid = false;
                const chapter = new main_1.Chapter(bookUrl, bookname, chapterUrl, chapterNumber, chapterName, isVIP, isPaid, sectionName, sectionNumber, sectionChapterNumber, chapterParse, "GBK");
                chapters.push(chapter);
            }
        }
        return {
            bookUrl: bookUrl,
            bookname: bookname,
            author: author,
            introduction: introduction,
            additionalMetadate: additionalMetadate,
            chapters: chapters,
        };
    }
    async chapterParse(chapterUrl, chapterName, isVIP, isPaid, charset) {
        const dom = await lib_1.getHtmlDOM(chapterUrl, charset);
        chapterName = (dom.querySelector(".page-body > h1:nth-child(4)")).innerText.trim();
        const _content = dom.querySelector("#content");
        if (_content) {
            lib_1.rm("div", true, _content);
            lib_1.rm("script", true, _content);
            const content = document.createElement("div");
            content.innerHTML = _content.innerHTML.replace(/\n/g, "<br/>");
            let { dom, text, images } = lib_1.cleanDOM(content, "TM");
            return {
                chapterName: chapterName,
                contentRaw: content,
                contentText: text,
                contentHTML: dom,
                contentImages: images,
            };
        }
        else {
            return {
                chapterName: chapterName,
                contentRaw: null,
                contentText: null,
                contentHTML: null,
                contentImages: null,
            };
        }
    }
}
exports.xiaoshuodaquan = xiaoshuodaquan;


/***/ }),

/***/ 441:
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {


Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.xkzw = void 0;
const main_1 = __webpack_require__(519);
const lib_1 = __webpack_require__(563);
class xkzw {
    constructor() {
        this.imageMode = "TM";
    }
    async bookParse(chapterParse) {
        const bookUrl = document.location.href;
        const bookname = (document.querySelector("#info > h1:nth-child(1)")).innerText.trim();
        const author = (document.querySelector("#info > p:nth-child(2)")).innerText
            .replace(/作(\s+)?者[::]/, "")
            .trim();
        let introduction;
        const introDom = document.querySelector("#intro");
        if (introDom === null) {
            introduction = null;
        }
        else {
            let { dom: introCleanDom, text: introCleantext, images: introCleanimages, } = lib_1.cleanDOM(introDom, "TM");
            introduction = introCleantext;
        }
        const additionalMetadate = {};
        const coverUrl = document.querySelector("#fmimg > img")
            .src;
        additionalMetadate.cover = new main_1.attachmentClass(coverUrl, `cover.${coverUrl.split(".").slice(-1)[0]}`, "TM");
        additionalMetadate.cover.init();
        const chapters = [];
        const bookid = unsafeWindow.bookId;
        const siteChapterList = await fetch("http://www.xkzw.org/action.php", {
            headers: {
                accept: "application/json, text/javascript, */*",
                "content-type": "application/x-www-form-urlencoded",
                "x-requested-with": "XMLHttpRequest",
            },
            body: `action=clist&bookid=${bookid}`,
            method: "POST",
            mode: "cors",
            credentials: "include",
        }).then((response) => response.json());
        const dl = document.querySelector("#wrapper > div.box_con:nth-child(7) > div:nth-child(1) > dl:nth-child(1)");
        let tmpColumnName = "";
        let tmpColumnList = [];
        let tmpChapterList = [];
        if (dl === null || dl === void 0 ? void 0 : dl.childElementCount) {
            const dlc = Array.from(dl.children);
            for (let i = 0; i < dl.childElementCount; i++) {
                const node = dlc[i];
                if (i !== 0) {
                    if (node.nodeName === "DD") {
                        const a = node.firstElementChild;
                        const chapterName = a.innerText;
                        const chapterUrl = a.href;
                        const chapterid = chapterUrl
                            .split("/")
                            .slice(-1)[0]
                            .replace(".html", "");
                        tmpChapterList.push({
                            chapterid: Number(chapterid) - bookid * 11,
                            chaptername: chapterName,
                            isempty: 0,
                            originalurl: "",
                            currenturl: "",
                        });
                    }
                    else if (node.nodeName === "DT") {
                        const tmpColumnObj = {
                            columnname: tmpColumnName,
                            columnid: 0,
                            chapterlist: tmpChapterList,
                        };
                        tmpColumnList.push(tmpColumnObj);
                        tmpColumnName = node.innerText
                            .replace(`《${bookname}》`, "")
                            .trim();
                        tmpChapterList = [];
                    }
                }
                else {
                    tmpColumnName = node.innerText
                        .replace(`《${bookname}》`, "")
                        .trim();
                }
            }
        }
        const tcl = tmpChapterList.length;
        for (let i = 0; i < tcl; i++) {
            const tmpChapterObject = tmpChapterList.pop();
            if (tmpChapterObject) {
                siteChapterList.columnlist[0].chapterlist.unshift(tmpChapterObject);
            }
        }
        if (tmpColumnList.length !== 0) {
            const tmpColumnListLenght = tmpColumnList.length;
            for (let i = 0; i < tmpColumnListLenght; i++) {
                const tmpColumnObject = tmpColumnList.pop();
                if (tmpColumnObject) {
                    siteChapterList.columnlist.unshift(tmpColumnObject);
                }
            }
        }
        let chapterNumber = 0;
        let sectionNumber = 0;
        let sectionName = null;
        let sectionChapterNumber = 0;
        for (const column of siteChapterList.columnlist) {
            sectionNumber++;
            sectionName = column.columnname;
            for (const sitechapter of column.chapterlist) {
                chapterNumber++;
                sectionChapterNumber++;
                const chapterName = sitechapter.chaptername;
                const chapterUrl = bookUrl + (sitechapter.chapterid + bookid * 11) + ".html";
                const isVIP = false;
                const isPaid = false;
                const chapter = new main_1.Chapter(bookUrl, bookname, chapterUrl, chapterNumber, chapterName, isVIP, isPaid, sectionName, sectionNumber, sectionChapterNumber, chapterParse, "UTF-8");
                chapters.push(chapter);
            }
        }
        return {
            bookUrl: bookUrl,
            bookname: bookname,
            author: author,
            introduction: introduction,
            additionalMetadate: additionalMetadate,
            chapters: chapters,
        };
    }
    async chapterParse(chapterUrl, chapterName, isVIP, isPaid, charset) {
        function runEval(CryptoJS) {
            function gettt1(str, keyStr, ivStr) {
                let key = CryptoJS.enc.Utf8.parse(keyStr);
                let iv = CryptoJS.enc.Utf8.parse(ivStr);
                let encryptedHexStr = CryptoJS.enc.Hex.parse(str);
                let srcs = CryptoJS.enc.Base64.stringify(encryptedHexStr);
                let decrypt = CryptoJS.DES.decrypt(srcs, key, {
                    iv: iv,
                    mode: CryptoJS.mode.CBC,
                    padding: CryptoJS.pad.Pkcs7,
                });
                let decryptedStr = decrypt.toString(CryptoJS.enc.Utf8);
                return decryptedStr.toString();
            }
            function gettt2(str, keyStr, ivStr) {
                let key = CryptoJS.enc.Utf8.parse(keyStr);
                let iv = CryptoJS.enc.Utf8.parse(ivStr);
                let encryptedHexStr = CryptoJS.enc.Hex.parse(str);
                let srcs = CryptoJS.enc.Base64.stringify(encryptedHexStr);
                let decrypt = CryptoJS.AES.decrypt(srcs, key, {
                    iv: iv,
                    mode: CryptoJS.mode.CBC,
                    padding: CryptoJS.pad.Pkcs7,
                });
                let decryptedStr = decrypt.toString(CryptoJS.enc.Utf8);
                return decryptedStr.toString();
            }
            function gettt3(str, keyStr, ivStr) {
                let key = CryptoJS.enc.Utf8.parse(keyStr);
                let iv = CryptoJS.enc.Utf8.parse(ivStr);
                let encryptedHexStr = CryptoJS.enc.Hex.parse(str);
                let srcs = CryptoJS.enc.Base64.stringify(encryptedHexStr);
                let decrypt = CryptoJS.RC4.decrypt(srcs, key, {
                    iv: iv,
                    mode: CryptoJS.mode.CBC,
                    padding: CryptoJS.pad.Pkcs7,
                });
                let decryptedStr = decrypt.toString(CryptoJS.enc.Utf8);
                return decryptedStr.toString();
            }
            function getttn(str, keyStr, ivStr) {
                let key = CryptoJS.enc.Utf8.parse(keyStr);
                let iv = CryptoJS.enc.Utf8.parse(ivStr);
                let encryptedHexStr = CryptoJS.enc.Hex.parse(str);
                let srcs = CryptoJS.enc.Base64.stringify(encryptedHexStr);
                let decrypt = CryptoJS.TripleDES.decrypt(srcs, key, {
                    iv: iv,
                    mode: CryptoJS.mode.CBC,
                    padding: CryptoJS.pad.Pkcs7,
                });
                let decryptedStr = decrypt.toString(CryptoJS.enc.Utf8);
                return decryptedStr.toString();
            }
            function showttt1(dom) {
                let obj = dom.getElementById("other");
                let objTips = dom.getElementById("contenttips");
                if (obj) {
                    let content = obj.innerHTML.trim();
                    let type = parseInt(content.substring(0, 1));
                    let key;
                    let iv;
                    if (type === 1) {
                        key = content.substring(1, 9);
                        iv = content.substring(9, 17);
                        content = content.substring(17);
                        obj.innerHTML = gettt1(content, key, iv);
                        obj.style.display = "block";
                        if (objTips) {
                            objTips.remove();
                        }
                    }
                    else if (type === 2) {
                        key = content.substring(1, 33);
                        iv = content.substring(33, 49);
                        content = content.substring(49);
                        obj.innerHTML = gettt2(content, key, iv);
                        obj.style.display = "block";
                        if (objTips) {
                            objTips.remove();
                        }
                    }
                    else if (type === 3) {
                        key = content.substring(1, 9);
                        iv = content.substring(9, 17);
                        content = content.substring(17);
                        obj.innerHTML = gettt3(content, key, iv);
                        obj.style.display = "block";
                        if (objTips) {
                            objTips.remove();
                        }
                    }
                    else {
                        key = content.substring(1, 25);
                        iv = content.substring(25, 33);
                        content = content.substring(33);
                        obj.innerHTML = getttn(content, key, iv);
                        obj.style.display = "block";
                        if (objTips) {
                            objTips.remove();
                        }
                    }
                }
            }
            showttt1(dom);
        }
        const dom = await lib_1.getHtmlDOM(chapterUrl, charset);
        runEval(CryptoJS);
        chapterName = (dom.querySelector(".bookname > h1:nth-child(1)")).innerText.trim();
        const content = dom.querySelector("#content");
        if (content) {
            let { dom, text, images } = lib_1.cleanDOM(content, "TM");
            return {
                chapterName: chapterName,
                contentRaw: content,
                contentText: text,
                contentHTML: dom,
                contentImages: images,
            };
        }
        else {
            return {
                chapterName: chapterName,
                contentRaw: null,
                contentText: null,
                contentHTML: null,
                contentImages: null,
            };
        }
    }
}
exports.xkzw = xkzw;


/***/ }),

/***/ 514:
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {


Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.yrun = void 0;
const main_1 = __webpack_require__(519);
const lib_1 = __webpack_require__(563);
class yrun {
    constructor() {
        this.imageMode = "naive";
    }
    async bookParse(chapterParse) {
        const bookUrl = document.location.href;
        const bookname = (document.querySelector("#info > h1:nth-child(1)")).innerText.trim();
        const author = (document.querySelector("#info > p:nth-child(2)")).innerText
            .replace(/作(\s+)?者[::]/, "")
            .trim();
        let introduction;
        const introDom = document.querySelector("#intro > p");
        if (introDom === null) {
            introduction = null;
        }
        else {
            let { dom: introCleanDom, text: introCleantext, images: introCleanimages, } = lib_1.cleanDOM(introDom, "naive");
            introduction = introCleantext;
        }
        const additionalMetadate = {};
        const coverUrl = document.querySelector("#fmimg > img")
            .src;
        additionalMetadate.cover = new main_1.attachmentClass(coverUrl, `cover.${coverUrl.split(".").slice(-1)[0]}`, "naive");
        additionalMetadate.cover.init();
        const chapters = [];
        const chapterList = document.querySelectorAll("#list>dl>dd>a");
        if (chapterList && chapterList.length !== 0) {
            for (let i = 0; i < chapterList.length; i++) {
                const a = chapterList[i];
                const chapterName = a.innerText;
                const chapterUrl = a.href;
                const isVIP = false;
                const isPaid = false;
                const chapter = new main_1.Chapter(bookUrl, bookname, chapterUrl, i, chapterName, isVIP, isPaid, null, null, null, chapterParse, "UTF-8");
                chapters.push(chapter);
            }
        }
        return {
            bookUrl: bookUrl,
            bookname: bookname,
            author: author,
            introduction: introduction,
            additionalMetadate: additionalMetadate,
            chapters: chapters,
        };
    }
    async chapterParse(chapterUrl, chapterName, isVIP, isPaid, charset) {
        const dom = await lib_1.getHtmlDOM(chapterUrl, charset);
        chapterName = (dom.querySelector(".bookname > h1:nth-child(1)")).innerText.trim();
        const content = dom.querySelector("#content");
        if (content) {
            let { dom, text, images } = lib_1.cleanDOM(content, "TM");
            return {
                chapterName: chapterName,
                contentRaw: content,
                contentText: text,
                contentHTML: dom,
                contentImages: images,
            };
        }
        else {
            return {
                chapterName: chapterName,
                contentRaw: null,
                contentText: null,
                contentHTML: null,
                contentImages: null,
            };
        }
    }
}
exports.yrun = yrun;


/***/ }),

/***/ 862:
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {


Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.zongheng = void 0;
const main_1 = __webpack_require__(519);
const lib_1 = __webpack_require__(563);
class zongheng {
    constructor() {
        this.imageMode = "TM";
        this.concurrencyLimit = 5;
    }
    async bookParse(chapterParse) {
        const bookUrl = document.location.href.replace("/showchapter/", "/book/");
        const bookname = (document.querySelector("div.book-meta > h1")).innerText.trim();
        const author = (document.querySelector("div.book-meta > p > span:nth-child(1) > a")).innerText.trim();
        const doc = await lib_1.getHtmlDOM(bookUrl, undefined);
        let introduction;
        const introDom = doc.querySelector("div.book-info > div.book-dec");
        if (introDom === null) {
            introduction = null;
        }
        else {
            let { dom: introCleanDom, text: introCleantext, images: introCleanimages, } = lib_1.cleanDOM(introDom, "TM");
            introduction = introCleantext;
        }
        const additionalMetadate = {};
        let coverUrl = doc.querySelector("div.book-img > img")
            .src;
        additionalMetadate.cover = new main_1.attachmentClass(coverUrl, `cover.${coverUrl.split(".").slice(-1)[0]}`, "TM");
        additionalMetadate.cover.init();
        additionalMetadate.tags = Array.from(doc.querySelectorAll(".book-info>.book-label a")).map((a) => a.innerText.trim());
        const chapters = [];
        const sections = document.querySelectorAll(".volume-list");
        const cos = [];
        for (let i = 0; i < sections.length; i++) {
            const s = sections[i];
            const sectionNumber = i + 1;
            const sectionLabel = s.querySelector("div.volume");
            Array.from(sectionLabel.children).forEach((ele) => ele.remove());
            const sectionName = sectionLabel.innerText.trim();
            const cs = s.querySelectorAll("ul.chapter-list > li");
            for (let j = 0; j < cs.length; j++) {
                const c = cs[j];
                const a = c.querySelector("a");
                const chapterName = a.innerText.trim();
                const chapterUrl = a.href;
                const isVIP = () => {
                    if (c.className.includes("vip")) {
                        return true;
                    }
                    else {
                        return false;
                    }
                };
                const isPaid = () => {
                    return false;
                };
                const co = {
                    bookUrl: bookUrl,
                    bookname: bookname,
                    chapterUrl: chapterUrl,
                    chapterName: chapterName,
                    isVIP: isVIP(),
                    isPaid: isPaid(),
                    sectionName: sectionName,
                    sectionNumber: sectionNumber,
                    sectionChapterNumber: j,
                };
                cos.push(co);
            }
        }
        cos.sort(lib_1.cosCompare);
        for (let i = 0; i < cos.length; i++) {
            const chapterNumber = i + 1;
            let { bookUrl, bookname, chapterUrl, chapterName, isVIP, isPaid, sectionName, sectionNumber, sectionChapterNumber, } = cos[i];
            const chapter = new main_1.Chapter(bookUrl, bookname, chapterUrl, chapterNumber, chapterName, isVIP, isPaid, sectionName, sectionNumber, sectionChapterNumber, chapterParse, "UTF-8");
            const isLogin = () => {
                return false;
            };
            if (isVIP && !(isLogin() && chapter.isPaid)) {
                chapter.status = main_1.Status.aborted;
            }
            chapters.push(chapter);
        }
        return {
            bookUrl: bookUrl,
            bookname: bookname,
            author: author,
            introduction: introduction,
            additionalMetadate: additionalMetadate,
            chapters: chapters,
        };
    }
    async chapterParse(chapterUrl, chapterName, isVIP, isPaid, charset) {
        async function publicChapter() {
            const dom = await lib_1.ggetHtmlDOM(chapterUrl, charset);
            const chapterName = (dom.querySelector("div.title_txtbox")).innerText.trim();
            const content = dom.querySelector("div.content");
            if (content) {
                let { dom, text, images } = lib_1.cleanDOM(content, "TM");
                return {
                    chapterName: chapterName,
                    contentRaw: content,
                    contentText: text,
                    contentHTML: dom,
                    contentImages: images,
                };
            }
            else {
                return {
                    chapterName: chapterName,
                    contentRaw: null,
                    contentText: null,
                    contentHTML: null,
                    contentImages: null,
                };
            }
        }
        async function vipChapter() {
            return {
                chapterName: chapterName,
                contentRaw: null,
                contentText: null,
                contentHTML: null,
                contentImages: null,
            };
        }
        if (isVIP) {
            return vipChapter();
        }
        else {
            return publicChapter();
        }
    }
}
exports.zongheng = zongheng;


/***/ })

/******/ 	});
/************************************************************************/
/******/ 	// The module cache
/******/ 	var __webpack_module_cache__ = {};
/******/ 	
/******/ 	// The require function
/******/ 	function __webpack_require__(moduleId) {
/******/ 		// Check if module is in cache
/******/ 		var cachedModule = __webpack_module_cache__[moduleId];
/******/ 		if (cachedModule !== undefined) {
/******/ 			return cachedModule.exports;
/******/ 		}
/******/ 		// Create a new module (and put it into the cache)
/******/ 		var module = __webpack_module_cache__[moduleId] = {
/******/ 			// no module.id needed
/******/ 			// no module.loaded needed
/******/ 			exports: {}
/******/ 		};
/******/ 	
/******/ 		// Execute the module function
/******/ 		__webpack_modules__[moduleId](module, module.exports, __webpack_require__);
/******/ 	
/******/ 		// Return the exports of the module
/******/ 		return module.exports;
/******/ 	}
/******/ 	
/************************************************************************/
var __webpack_exports__ = {};
// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk.
(() => {
var exports = __webpack_exports__;
var __webpack_unused_export__;

__webpack_unused_export__ = ({ value: true });
const rules_1 = __webpack_require__(489);
const main_1 = __webpack_require__(519);
const lib_1 = __webpack_require__(563);
function printEnvironments() {
    if (lib_1._GM_info) {
        console.log(`开始载入小说下载器……
当前浏览器UA:${navigator.userAgent}
当前脚本管理器:${lib_1._GM_info.scriptHandler}
当前脚本管理器版本:${lib_1._GM_info.version}
当前脚本名称:${lib_1._GM_info.script.name}
当前脚本版本:${lib_1._GM_info.script.version}
当前脚本最后更新时间:${lib_1._GM_info.script.lastModified}
是否处于隐私模式:${lib_1._GM_info.isIncognito}
是否启用调试:${enaleDebug}`);
    }
}
async function initBook(rule) {
    console.log(`[initBook]开始初始化图书`);
    const bookParse = rule.bookParse;
    const chapterParse = rule.chapterParse;
    return bookParse(chapterParse).then((obj) => {
        const { bookUrl, bookname, author, introduction, additionalMetadate, chapters, } = obj;
        const book = new main_1.Book(bookUrl, bookname, author, introduction, additionalMetadate, chapters);
        return book;
    });
}
async function initChapters(rule, book) {
    console.log(`[initChapters]开始初始化章节`);
    let concurrencyLimit = 10;
    if (rule.concurrencyLimit !== undefined) {
        concurrencyLimit = rule.concurrencyLimit;
    }
    const chapters = book.chapters.filter((chapter) => chapter.status === main_1.Status.pending);
    if (chapters.length === 0) {
        console.error(`[initChapters]初始化章节出错,未找到需初始化章节`);
        return [];
    }
    if (concurrencyLimit === 1) {
        for (let chapter of chapters) {
            const obj = await chapter.init();
            if (obj.contentHTML !== undefined) {
                finishedChapterNumber++;
                updateProgress(finishedChapterNumber, totalChapterNumber, null);
            }
        }
    }
    else {
        await lib_1.concurrencyRun(chapters, concurrencyLimit, (curChapter) => {
            return curChapter.init().then((obj) => {
                if (obj.contentHTML !== undefined) {
                    finishedChapterNumber++;
                    updateProgress(finishedChapterNumber, totalChapterNumber, null);
                }
                return obj;
            });
        });
    }
    console.log(`[initChapters]章节初始化完毕`);
    return chapters;
}
function save(book) {
    function chapterSort(a, b) {
        if (a.chapterNumber > b.chapterNumber) {
            return 1;
        }
        if (a.chapterNumber === b.chapterNumber) {
            return 0;
        }
        if (a.chapterNumber < b.chapterNumber) {
            return -1;
        }
        return 0;
    }
    function addImageToZip(image, zip) {
        if (image.status === main_1.Status.finished && image.imageBlob) {
            console.debug(`[save]添加附件,文件名:${image.name},对象`, image.imageBlob);
            zip.file(image.name, image.imageBlob);
        }
        else {
            console.error("[save]附件下载失败!");
            console.error(image);
        }
    }
    function genSectionText(sectionName) {
        return `${"=".repeat(20)}\n\n\n\n# ${sectionName}\n\n\n\n${"=".repeat(20)}`;
    }
    function genChapterText(chapterName, contentText) {
        return `## ${chapterName}\n\n${contentText}\n\n`;
    }
    function genSectionHtmlFile(sectionName) {
        let htmlFile = new DOMParser().parseFromString(`<!DOCTYPE html><html><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="https://github.com/yingziwu/novel-downloader"><link href="style.css" type="text/css" rel="stylesheet"/><title>${sectionName}</title></head><body><div class="main"><h1>${sectionName}</h1></div></body></html>`, "text/html");
        return new Blob([htmlFile.documentElement.outerHTML], {
            type: "text/html; charset=UTF-8",
        });
    }
    function genHtmlFile(chapterName, DOM, chapterUrl) {
        var _a;
        let htmlFile = new DOMParser().parseFromString(`<!DOCTYPE html><html><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="https://github.com/yingziwu/novel-downloader"><meta name="source" content="${chapterUrl}"><link href="style.css" type="text/css" rel="stylesheet"/><title>${chapterName}</title></head><body><div class="main"><h2>${chapterName}</h2></div></body></html>`, "text/html");
        (_a = htmlFile.querySelector(".main")) === null || _a === void 0 ? void 0 : _a.appendChild(DOM);
        return new Blob([htmlFile.documentElement.outerHTML], {
            type: "text/html; charset=UTF-8",
        });
    }
    console.log("[save]开始保存");
    console.debug("book Object:", book);
    const chapters = book.chapters;
    chapters.sort(chapterSort);
    let savedTextArray = [];
    let savedZip = new JSZip();
    let infoText = `题名:${book.bookname}\n作者:${book.author}\n简介:${book.introduction}\n来源:${book.bookUrl}\n下载时间:${new Date().toISOString()}\n本文件由小说下载器生成,软件地址:https://github.com/yingziwu/novel-downloader\n\n`;
    savedTextArray.push(infoText);
    if (book.additionalMetadate.cover) {
        const cover = book.additionalMetadate.cover;
        if (cover.imageBlob) {
            console.debug(`[save]添加封面图片,文件名:${`cover.${cover.imageBlob.type.split("/").slice(-1)[0]}`},对象`, cover.imageBlob);
            savedZip.file(`cover.${cover.imageBlob.type.split("/").slice(-1)[0]}`, cover.imageBlob);
        }
        else {
            console.error("[save]图片下载失败!");
            console.error(cover);
        }
    }
    savedZip.file("info.txt", new Blob([infoText], { type: "text/plain;charset=utf-8" }));
    const styleCSS = `body {
  background-color: #f0f0f2;
  margin: 0;
  padding: 0;
  font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI",
    "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
}
div.main {
  width: 900px;
  margin: 5em auto;
  padding: 2em;
  background-color: #fdfdff;
  border-radius: 0.5em;
  box-shadow: 2px 3px 7px 2px rgba(0, 0, 0, 0.02);
}
@media (max-width: 700px) {
  div.main {
    margin: 0 auto;
    width: auto;
  }
}
h1 {
  line-height: 130%;
  text-align: center;
  font-weight: bold;
  font-size: xxx-large;
  margin-top: 3.2em;
  margin-bottom: 3.3em;
}
h2 {
  line-height: 130%;
  text-align: center;
  font-weight: bold;
  font-size: x-large;
  margin-top: 1.2em;
  margin-bottom: 2.3em;
}
div {
  margin: 0px;
  padding: 0px;
  text-align: justify;
}
p {
  text-indent: 2em;
  display: block;
  line-height: 1.3em;
  margin-top: 0.4em;
  margin-bottom: 0.4em;
}`;
    savedZip.file("style.css", new Blob([styleCSS], { type: "text/css;charset=utf-8" }));
    let preSectionName = "";
    for (const c of chapters) {
        if (c.status === main_1.Status.finished) {
            const sectionName = c.sectionName;
            const chapterNumber = c.chapterNumber;
            const chapterUrl = c.chapterUrl;
            const chapterName = c.chapterName
                ? c.chapterName
                : chapterNumber.toString();
            const contentText = c.contentText;
            const contentHTML = c.contentHTML;
            const contentImages = c.contentImages;
            const fileNameBase = `${"0".repeat(chapters.length.toString().length - chapterNumber.toString().length)}${chapterNumber.toString()}.html`;
            if (sectionName && contentText && sectionName !== preSectionName) {
                savedTextArray.push(genSectionText(sectionName));
                const sectionHTMLBlob = genSectionHtmlFile(sectionName);
                if (sectionHTMLBlob) {
                    console.debug(`[save]添加卷HTML,文件名:${"Section" + fileNameBase},对象`, sectionHTMLBlob);
                    savedZip.file(`Section${fileNameBase}`, sectionHTMLBlob);
                }
            }
            preSectionName = sectionName;
            if (contentText) {
                savedTextArray.push(genChapterText(chapterName, contentText));
            }
            if (contentHTML) {
                const chapterHTMLBlob = genHtmlFile(chapterName, contentHTML, chapterUrl);
                if (chapterHTMLBlob) {
                    console.debug(`[save]添加章节HTML,文件名:${"Chapter" + fileNameBase},对象`, chapterHTMLBlob);
                    savedZip.file(`Chapter${fileNameBase}`, chapterHTMLBlob);
                }
            }
            if (contentImages !== null) {
                for (const image of contentImages) {
                    addImageToZip(image, savedZip);
                }
            }
        }
    }
    console.log("[save]开始生成下载文件");
    const saveFileNameBase = `[${book.author}]${book.bookname}`;
    console.debug("[save]开始保存TXT文件");
    const savedText = savedTextArray.join("\n");
    saveAs(new Blob([savedText], { type: "text/plain;charset=utf-8" }), `${saveFileNameBase}.txt`);
    console.debug("[save]保存TXT文件完毕");
    console.debug("[save]开始生成ZIP文件");
    savedZip
        .generateAsync({
        type: "blob",
        compression: "DEFLATE",
        compressionOptions: {
            level: 6,
        },
    }, (metadata) => updateProgress(finishedChapterNumber, totalChapterNumber, metadata.percent))
        .then((blob) => {
        console.debug("[save]ZIP文件生成完毕,开始保存ZIP文件");
        saveAs(blob, `${saveFileNameBase}.zip`);
    })
        .then(() => {
        var _a;
        console.debug("[save]保存ZIP文件完毕");
        finishedChapterNumber = 0;
        (_a = document.querySelector("#nd-progress")) === null || _a === void 0 ? void 0 : _a.remove();
    })
        .catch((err) => console.error("saveZip: " + err));
}
function setTabMark() {
    return new Promise((resolve, reject) => {
        GM_getTab((curTabObject) => {
            curTabObject.novel_downloader =
                document.location.href;
            GM_saveTab(curTabObject);
            resolve(curTabObject);
        });
    });
}
function getNowRunNumber() {
    return new Promise((resolve, reject) => {
        GM_getTabs((curTabObjects) => {
            let nowRunNumber = 0;
            for (let i in curTabObjects) {
                const novel_downloader_url = curTabObjects[i]
                    .novel_downloader;
                if (novel_downloader_url !== undefined &&
                    new URL(novel_downloader_url).hostname === document.location.hostname) {
                    nowRunNumber++;
                }
            }
            resolve(nowRunNumber);
        });
    });
}
function removeTabMark() {
    return new Promise((resolve, reject) => {
        GM_getTab((curTabObject) => {
            if (curTabObject.novel_downloader) {
                delete curTabObject.novel_downloader;
            }
            GM_saveTab(curTabObject);
            resolve(curTabObject);
        });
    });
}
let totalChapterNumber;
let finishedChapterNumber = 0;
function updateProgress(finishedChapterNumber, totalChapterNumber, zipPercent) {
    if (!document.querySelector("#nd-progress")) {
        console.debug("[progress]初始化进度条");
        let progress = document.createElement("div");
        progress.id = "nd-progress";
        progress.innerHTML = `
        <div id='chapter-progress' title="章节"></div>
        <div id='zip-progress' title="ZIP"></div>
        `;
        let progressStyle = document.createElement("style");
        progressStyle.innerHTML = `#nd-progress {
    position: fixed;
    bottom: 8%;
    right: 3%;
    z-index: 99;
    border-style: none;
    text-align: center;
    vertical-align: baseline;
    background-color: rgba(210, 210, 210, 0.2);
    padding: 6px;
    border-radius: 12px;
}
#chapter-progress{
    --color:green;
    --position:0%;
    width:200px;
    height:10px;
    border-radius:30px;
    background-color:#ccc;
    background-image:radial-gradient(closest-side circle at var(--position),var(--color),var(--color) 100%,transparent),linear-gradient(var(--color),var(--color));
    background-image:-webkit-radial-gradient(var(--position),circle closest-side,var(--color),var(--color) 100%,transparent),-webkit-linear-gradient(var(--color),var(--color));
    background-size:100% ,var(--position);
    background-repeat: no-repeat;
}
#zip-progress{
    --color:yellow;
    --position:0%;
    width:200px;
    height:10px;
    border-radius:30px;
    background-color:#ccc;
    background-image:radial-gradient(closest-side circle at var(--position),var(--color),var(--color) 100%,transparent),linear-gradient(var(--color),var(--color));
    background-image:-webkit-radial-gradient(var(--position),circle closest-side,var(--color),var(--color) 100%,transparent),-webkit-linear-gradient(var(--color),var(--color));
    background-size:100% ,var(--position);
    background-repeat: no-repeat;
    margin-top: 5px;
}`;
        document.head.appendChild(progressStyle);
        document.body.appendChild(progress);
    }
    let pagePercent = `${(finishedChapterNumber / totalChapterNumber) * 100}%`;
    document.querySelector("#chapter-progress").style.cssText = `--position:${pagePercent};`;
    if (zipPercent) {
        document.querySelector("#zip-progress").style.cssText = `--position:${zipPercent}%;`;
    }
    else {
        document.querySelector("#zip-progress").style.cssText =
            "display:none;";
    }
}
async function run() {
    console.log(`[run]下载开始`);
    const rule = rules_1.getRule();
    console.log(`[run]获取规则成功`);
    let maxRunLimit = null;
    let nowRunNumber;
    if (lib_1._GM_info.scriptHandler === "Tampermonkey") {
        console.log(`[run]添加运行标志`);
        await setTabMark();
        nowRunNumber = await getNowRunNumber();
        if (rule.maxRunLimit !== undefined && nowRunNumber !== undefined) {
            maxRunLimit = rule.maxRunLimit;
            if (nowRunNumber > maxRunLimit) {
                const alertText = `当前网站目前已有${nowRunNumber - 1}个下载任务正在运行,当前站点最多允许${maxRunLimit}下载任务同时进行。\n请待其它下载任务完成后,再行尝试。`;
                alert(alertText);
                console.log(`[run]${alertText}`);
                return;
            }
        }
    }
    const book = await initBook(rule);
    totalChapterNumber = book.chapters.filter((chapter) => chapter.status === main_1.Status.pending).length;
    await initChapters(rule, book);
    save(book);
    if (lib_1._GM_info.scriptHandler === "Tampermonkey") {
        console.log(`[run]移除运行标志`);
        await removeTabMark();
    }
    console.log(`[run]下载完毕`);
    return book;
}
function catchError(error) {
    var _a, _b;
    downloading = false;
    if (lib_1._GM_info.scriptHandler === "Tampermonkey") {
        removeTabMark();
    }
    finishedChapterNumber = 0;
    (_a = document.querySelector("#nd-progress")) === null || _a === void 0 ? void 0 : _a.remove();
    (_b = document.getElementById("novel-downloader")) === null || _b === void 0 ? void 0 : _b.remove();
    console.error("运行过程出错,请附上相关日志至支持地址进行反馈。\n支持地址:https://github.com/yingziwu/novel-downloader");
    console.error(error);
}
function addButton() {
    let button = document.createElement("button");
    button.id = "novel-downloader";
    button.style.cssText = `position: fixed; top: 15%; right: 5%; z-index: 99; border-style: none; text-align:center; vertical-align:baseline; background-color: rgba(128, 128, 128, 0.2); padding: 5px; border-radius: 12px;`;
    let img = document.createElement("img");
    img.src = rules_1.icon0;
    img.style.cssText = "height: 2em;";
    button.onclick = function () {
        if (downloading) {
            alert("正在下载中,请耐心等待……");
        }
        else {
            downloading = true;
            img.src = rules_1.icon1;
            try {
                run()
                    .then((book) => {
                    downloading = false;
                    img.src = rules_1.icon0;
                })
                    .catch(catchError);
            }
            catch (error) {
                catchError(error);
            }
        }
    };
    button.appendChild(img);
    document.body.appendChild(button);
}
async function debug() {
    const rule = rules_1.getRule();
    const book = await initBook(rule);
    unsafeWindow.rule = rule;
    unsafeWindow.book = book;
    unsafeWindow.save = save;
    unsafeWindow.saveAs = saveAs;
    return;
}
let downloading = false;
const enaleDebug = false;
window.addEventListener("DOMContentLoaded", () => {
    if (lib_1._GM_info.scriptHandler === "Greasemonkey") {
        console.error("小说下载器脚本与Greasemonkey脚本管理器不兼容,请改用其它脚本管理器,如:Tampermonkey、Violentmonkey。");
        alert("小说下载器脚本与Greasemonkey脚本管理器不兼容,请改用其它脚本管理器,如:Tampermonkey、Violentmonkey。");
        return;
    }
    printEnvironments();
    addButton();
    if (enaleDebug) {
        debug();
    }
});

})();

/******/ })()
;