"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __generator = (this && this.__generator) || function (thisArg, body) { var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; function verb(n) { return function (v) { return step([n, v]); }; } function step(op) { if (f) throw new TypeError("Generator is already executing."); while (g && (g = 0, op[0] && (_ = 0)), _) try { if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; if (y = 0, t) op = [op[0] & 2, t.value]; switch (op[0]) { case 0: case 1: t = op; break; case 4: _.label++; return { value: op[1], done: false }; case 5: _.label++; y = op[1]; op = [0]; continue; case 7: op = _.ops.pop(); _.trys.pop(); continue; default: if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } if (t[2]) _.ops.pop(); _.trys.pop(); continue; } op = body.call(thisArg, _); } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; } }; Object.defineProperty(exports, "__esModule", { value: true }); var cheerio_1 = require("cheerio"); var fetch_1 = require("@libs/fetch"); var filterInputs_1 = require("@libs/filterInputs"); var showToast_1 = require("@libs/showToast"); var Linovelib = /** @class */ (function () { function Linovelib() { this.id = "linovelib"; this.name = "Linovelib"; this.icon = "src/cn/linovelib/icon.png"; this.site = "https://w.linovelib.com"; this.version = "1.0.0"; this.userAgent = ""; this.filters = { sort: { label: "Sort By", value: "monthvisit", options: [ { label: "月点击榜", value: "monthvisit" }, { label: "周点击榜", value: "weekvisit" }, { label: "月推荐榜", value: "monthvote" }, { label: "周推荐榜", value: "weekvote" }, { label: "月鲜花榜", value: "monthflower" }, { label: "周鲜花榜", value: "weekflower" }, { label: "月鸡蛋榜", value: "monthegg" }, { label: "周鸡蛋榜", value: "weekegg" }, { label: "最近更新", value: "lastupdate" }, { label: "最新入库", value: "postdate" }, { label: "收藏榜", value: "goodnum" }, { label: "新书榜", value: "newhot" }, ], type: filterInputs_1.FilterTypes.Picker, }, }; } Linovelib.prototype.popularNovels = function (pageNo, _a) { var filters = _a.filters; return __awaiter(this, void 0, void 0, function () { var link, headers, body, loadedCheerio, novels; var _this = this; return __generator(this, function (_b) { switch (_b.label) { case 0: link = "".concat(this.site, "/top/"); link += filters.sort; link += "/".concat(pageNo, ".html"); headers = new Headers(); return [4 /*yield*/, (0, fetch_1.fetchApi)(link, { headers: headers }).then(function (result) { return result.text(); })]; case 1: body = _b.sent(); loadedCheerio = (0, cheerio_1.load)(body); novels = []; loadedCheerio(".module-rank-booklist .book-layout").each(function (i, el) { var url = loadedCheerio(el).attr("href"); var novelName = loadedCheerio(el).find(".book-title").text(); var novelCover = loadedCheerio(el) .find("img.book-cover") .attr("data-src"); var novelUrl = _this.site + url; if (!url) return; var novel = { name: novelName, cover: novelCover, url: novelUrl, }; novels.push(novel); }); return [2 /*return*/, novels]; } }); }); }; Linovelib.prototype.parseNovelAndChapters = function (novelUrl) { var _a; return __awaiter(this, void 0, void 0, function () { var url, headers, result, body, loadedCheerio, novel, chapter, idPattern, novelId, chaptersUrl, chaptersResult, chaptersBody, chaptersLoadedCheerio, volumeName, chapterId; var _this = this; return __generator(this, function (_b) { switch (_b.label) { case 0: url = novelUrl; headers = new Headers(); return [4 /*yield*/, (0, fetch_1.fetchApi)(url, { headers: headers })]; case 1: result = _b.sent(); return [4 /*yield*/, result.text()]; case 2: body = _b.sent(); loadedCheerio = (0, cheerio_1.load)(body); novel = { url: url, chapters: [], }; novel.name = loadedCheerio("#bookDetailWrapper .book-title").text(); novel.cover = loadedCheerio("#bookDetailWrapper img.book-cover").attr("src"); novel.summary = loadedCheerio("#bookSummary content").text(); novel.author = loadedCheerio("#bookDetailWrapper .book-rand-a a").text(); // TODO: Need some regex and dirty selector to get it // Need to look into how to translate that message novel.status = undefined; novel.genres = loadedCheerio(".tag-small.red") .children("a") .map(function (i, el) { return loadedCheerio(el).text(); }) .toArray() .join(","); chapter = []; idPattern = /\/(\d+)\.html/; novelId = (_a = url.match(idPattern)) === null || _a === void 0 ? void 0 : _a[1]; chaptersUrl = this.site + loadedCheerio("#btnReadBook").attr("href"); return [4 /*yield*/, (0, fetch_1.fetchApi)(chaptersUrl, { headers: headers })]; case 3: chaptersResult = _b.sent(); return [4 /*yield*/, chaptersResult.text()]; case 4: chaptersBody = _b.sent(); chaptersLoadedCheerio = (0, cheerio_1.load)(chaptersBody); chaptersLoadedCheerio("#volumes .chapter-li").each(function (i, el) { if (chaptersLoadedCheerio(el).hasClass("chapter-bar")) { volumeName = chaptersLoadedCheerio(el).text(); } else { var urlPart = chaptersLoadedCheerio(el) .find(".chapter-li-a") .attr("href"); var chapterIdMatch = urlPart === null || urlPart === void 0 ? void 0 : urlPart.match(idPattern); // Sometimes the href attribute does not contain the url, but javascript:cid(0). // Increment the previous chapter ID should result in the right URL if (chapterIdMatch) { chapterId = +chapterIdMatch[1]; } else { chapterId++; } } var chapterUrl = "".concat(_this.site, "/novel/").concat(novelId, "/").concat(chapterId, ".html"); var chapterName = volumeName + " — " + chaptersLoadedCheerio(el).find(".chapter-index").text().trim(); var releaseDate = null; if (!chapterId) return; chapter.push({ name: chapterName, releaseTime: releaseDate, url: chapterUrl, }); }); novel.chapters = chapter; return [2 /*return*/, novel]; } }); }); }; Linovelib.prototype.parseChapter = function (chapterUrl) { return __awaiter(this, void 0, void 0, function () { var headers, chapterName, chapterText, hasNextPage, pageHasNextPage, pageText, pageNumber, skillgg, addPage, loadPage, url, page; var _this = this; return __generator(this, function (_a) { switch (_a.label) { case 0: headers = new Headers(); chapterText = "", pageText = ""; pageNumber = 1; skillgg = { "\u201c": "\u300c", "\u201d": "\u300d", "\u2018": "\u300e", "\u2019": "\u300f", "\ue82c": "\u7684", "\ue852": "\u4e00", "\ue82d": "\u662f", "\ue819": "\u4e86", "\ue856": "\u6211", "\ue857": "\u4e0d", "\ue816": "\u4eba", "\ue83c": "\u5728", "\ue830": "\u4ed6", "\ue82e": "\u6709", "\ue836": "\u8fd9", "\ue859": "\u4e2a", "\ue80a": "\u4e0a", "\ue855": "\u4eec", "\ue842": "\u6765", "\ue858": "\u5230", "\ue80b": "\u65f6", "\ue81f": "\u5927", "\ue84a": "\u5730", "\ue853": "\u4e3a", "\ue81e": "\u5b50", "\ue822": "\u4e2d", "\ue813": "\u4f60", "\ue85b": "\u8bf4", "\ue807": "\u751f", "\ue818": "\u56fd", "\ue810": "\u5e74", "\ue812": "\u7740", "\ue851": "\u5c31", "\ue801": "\u90a3", "\ue80c": "\u548c", "\ue815": "\u8981", "\ue84c": "\u5979", "\ue840": "\u51fa", "\ue848": "\u4e5f", "\ue835": "\u5f97", "\ue800": "\u91cc", "\ue826": "\u540e", "\ue863": "\u81ea", "\ue861": "\u4ee5", "\ue854": "\u4f1a", "\ue827": "\u5bb6", "\ue83b": "\u53ef", "\ue85d": "\u4e0b", "\ue84d": "\u800c", "\ue862": "\u8fc7", "\ue81c": "\u5929", "\ue81d": "\u53bb", "\ue860": "\u80fd", "\ue843": "\u5bf9", "\ue82f": "\u5c0f", "\ue802": "\u591a", "\ue831": "\u7136", "\ue84b": "\u4e8e", "\ue837": "\u5fc3", "\ue829": "\u5b66", "\ue85e": "\u4e48", "\ue83a": "\u4e4b", "\ue832": "\u90fd", "\ue808": "\u597d", "\ue841": "\u770b", "\ue821": "\u8d77", "\ue845": "\u53d1", "\ue803": "\u5f53", "\ue828": "\u6ca1", "\ue81b": "\u6210", "\ue83e": "\u53ea", "\ue820": "\u5982", "\ue84e": "\u4e8b", "\ue85a": "\u628a", "\ue806": "\u8fd8", "\ue83f": "\u7528", "\ue833": "\u7b2c", "\ue811": "\u6837", "\ue804": "\u9053", "\ue814": "\u60f3", "\ue80f": "\u4f5c", "\ue84f": "\u79cd", "\ue80e": "\u5f00", "\ue823": "\u7f8e", "\ue849": "\u4e73", "\ue805": "\u9634", "\ue809": "\u6db2", "\ue81a": "\u830e", "\ue844": "\u6b32", "\ue847": "\u547b", "\ue850": "\u8089", "\ue824": "\u4ea4", "\ue85f": "\u6027", "\ue817": "\u80f8", "\ue85c": "\u79c1", "\ue838": "\u7a74", "\ue82a": "\u6deb", "\ue83d": "\u81c0", "\ue82b": "\u8214", "\ue80d": "\u5c04", "\ue839": "\u8131", "\ue834": "\u88f8", "\ue846": "\u9a9a", "\ue825": "\u5507", }; addPage = function (pageCheerio) { return __awaiter(_this, void 0, void 0, function () { var formatPage; var _this = this; return __generator(this, function (_a) { switch (_a.label) { case 0: formatPage = function () { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_a) { // Remove JS pageCheerio("#ccacontent .cgo").remove(); // Load lazyloaded images pageCheerio("#ccacontent img.imagecontent").each(function (i, el) { // Sometimes images are either in data-src or src var imgSrc = pageCheerio(el).attr("data-src") || pageCheerio(el).attr("src"); if (imgSrc) { // The original CDN URL is locked behind a CF-like challenge, switch the URL to bypass that // There are no react-native-url-polyfill lib, can't use URL API var regex = /\/\/.+\.com\//; var imgUrl = imgSrc.replace(regex, "//img.linovelib.com/"); // Clean up img element pageCheerio(el) .attr("src", imgUrl) .removeAttr("data-src") .removeClass("lazyload"); } }); // Recover the original character pageText = pageCheerio("#ccacontent").html() || ""; pageText = pageText.replace(/./g, function (char) { return skillgg[char] || char; }); return [2 /*return*/, Promise.resolve()]; }); }); }; return [4 /*yield*/, formatPage()]; case 1: _a.sent(); chapterName = pageCheerio("#atitle + h3").text() + " — " + pageCheerio("#atitle").text(); if (chapterText === "") { chapterText = "