From a0a63869e844ec02f2569a9a51886ddbc894da7a Mon Sep 17 00:00:00 2001 From: Rajarshee Chatterjee Date: Tue, 27 Apr 2021 23:05:43 +0530 Subject: [PATCH] add: MTLNovel --- server.js | 1 + src/en/mtlnovel/icon.png | Bin 0 -> 3746 bytes src/en/mtlnovel/mtlnovel.js | 202 ++++++++++++++++++++++++++ src/en/readnovelfull/readnovelfull.js | 1 - src/extensions.js | 9 ++ 5 files changed, 212 insertions(+), 1 deletion(-) create mode 100644 src/en/mtlnovel/icon.png create mode 100644 src/en/mtlnovel/mtlnovel.js diff --git a/server.js b/server.js index 5699abd..319385f 100644 --- a/server.js +++ b/server.js @@ -22,6 +22,7 @@ app.use("/api/1/", require("./src/en/boxnovel/boxnovel")); app.use("/api/2/", require("./src/en/readlightnovel/readlightnovel")); app.use("/api/3/", require("./src/en/fastnovel/fastnovel")); app.use("/api/4/", require("./src/en/readnovelfull/readnovelfull")); +app.use("/api/5/", require("./src/en/mtlnovel/mtlnovel")); const PORT = process.env.PORT || 5000; diff --git a/src/en/mtlnovel/icon.png b/src/en/mtlnovel/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..8fb24068f49618fe6664ca0e9770c335da5489f4 GIT binary patch literal 3746 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 M07*qoM6N<$f}u}Pe*gdg literal 0 HcmV?d00001 diff --git a/src/en/mtlnovel/mtlnovel.js b/src/en/mtlnovel/mtlnovel.js new file mode 100644 index 0000000..eb3ec78 --- /dev/null +++ b/src/en/mtlnovel/mtlnovel.js @@ -0,0 +1,202 @@ +const express = require("express"); +const cheerio = require("cheerio"); +const request = require("request"); + +const router = express.Router(); + +const baseUrl = "https://mtlnovel.com"; + +// Top novels + +router.get("/novels/", (req, res) => { + const url = `${baseUrl}/alltime-rank/`; + + request(url, (err, response, body) => { + if (err) throw err; + + let novels = []; + + $ = cheerio.load(body); + + $("div.box.wide").each(function (result) { + let novelUrl = $(this).find("a.list-title").attr("href"); + novelUrl = novelUrl.replace("https://www.mtlnovel.com/", ""); + + let novelName = $(this).find("a.list-title").text().slice(4); + let novelCover = $(this).find("amp-img").attr("src"); + + novel = { + extensionId: 5, + novelUrl, + novelName, + novelCover, + }; + + novels.push(novel); + }); + + res.json(novels); + }); +}); + +router.get("/novel/:novelUrl", (req, res) => { + let novelUrl = req.params.novelUrl; + const url = `${baseUrl}/${novelUrl}`; + console.log(url); + + request(url, (err, response, body) => { + $ = cheerio.load(body); + + let novel = {}; + + novel.extensionId = 5; + + novel.sourceName = "MTLNovel"; + + novel.sourceUrl = url; + + novel.novelUrl = `${novelUrl}/`; + + novel.novelName = $("h1.entry-title").text(); + + novel.novelCover = $("amp-img").attr("src"); + + novel.novelSummary = $("div.desc > h2").next().text(); + + novel["Author(s)"] = $("tr > td") + .filter(function () { + return $(this).prev().text().trim() === "Author"; + }) + .next() + .text() + .replace("Auhtor:", ""); + + novel.Status = $("tr > td") + .filter(function () { + return $(this).prev().text().trim() === "Status"; + }) + .next() + .text() + .replace("Status:", ""); + + novel["Genre(s)"] = $("td") + .filter(function () { + return $(this).prev().text().trim() === "Genre"; + }) + .next() + .text() + .replace("Genre:", ""); + + novel["Artist(s)"] = null; + + function callback(res) { + console.log(res); + novel.novelChapters = res; + } + + request(`${url}/chapter-list/`, (err, response, body) => { + $ = cheerio.load(body); + console.log(`${url}/chapter-list/`); + // console.log($("div.ch-list").find("a.ch-link").next().html()); + let novelChapters = []; + + $("div.ch-list") + .find("a.ch-link") + .each(function (result) { + let chapterName = $(this).text().replace("~ ", ""); + + let releaseDate = null; + + let chapterUrl = $(this).attr("href"); + chapterUrl = chapterUrl.replace( + `https://www.mtlnovel.com/${novelUrl}/`, + "" + ); + + novelChapters.push({ + chapterUrl, + chapterName, + releaseDate, + }); + }); + + callback(novelChapters); + + return res.json(novel); + }); + }); +}); + +router.get("/novel/:novelUrl/:chapterUrl", (req, res) => { + let novelUrl = req.params.novelUrl; + const url = `https://www.mtlnovel.com/${novelUrl}/${req.params.chapterUrl}/`; + console.log(url); + request(url, (err, response, body) => { + if (err) throw err; + + $ = cheerio.load(body); + + let chapterName = $("h1.main-title").text(); + + let chapterText = $("div.par").text(); + + let nextChapter = null; + if ($("a.next").attr("href")) { + nextChapter = $("a.next").attr("href").replace(`/${novelUrl}/`, ""); + } + + let prevChapter = null; + if ($("a.prev").attr("href")) { + prevChapter = $("a.prev").attr("href").replace(`/${novelUrl}/`, ""); + } + + chapter = { + extensionId: 5, + novelUrl: `${req.params.novelUrl}`, + chapterUrl: `${req.params.chapterUrl}`, + chapterName, + chapterText, + nextChapter, + prevChapter, + }; + + res.json(chapter); + }); +}); + +router.get("/search/", (req, res) => { + searchTerm = req.query.s; + + const searchUrl = "https://www.mtlnovel.com"; + + request.post( + { url: searchUrl, form: { s: searchTerm } }, + (err, response, body) => { + if (err) throw err; + + $ = cheerio.load(body); + console.log(body); + let novels = []; + + $("div.box").each(function (result) { + let novelName = $(this).find("a.list-title").text(); + let novelCover = $(this).find("amp-img").attr("src"); + let novelUrl = $(this).find("a").attr("href"); + novelUrl = novelUrl.replace("https://www.mtlnovel.com/", ""); + + novel = { + extensionId: 5, + novelUrl, + novelName, + novelCover, + }; + + novels.push(novel); + }); + + res.json(novels); + } + ); +}); + +module.exports = router; diff --git a/src/en/readnovelfull/readnovelfull.js b/src/en/readnovelfull/readnovelfull.js index bec4fdb..c287af4 100644 --- a/src/en/readnovelfull/readnovelfull.js +++ b/src/en/readnovelfull/readnovelfull.js @@ -155,7 +155,6 @@ router.get("/novel/:novelUrl/:chapterUrl", (req, res) => { router.get("/search/", (req, res) => { let searchTerm = req.query.s; - console.log(searchTerm); searchUrl = `https://readnovelfull.com/search?keyword=`; url = `${searchUrl}${searchTerm}`; diff --git a/src/extensions.js b/src/extensions.js index 88ab766..16b1907 100644 --- a/src/extensions.js +++ b/src/extensions.js @@ -34,6 +34,15 @@ extensions = [ sourceLanguage: "English", status: 1, }, + { + sourceId: 5, + sourceUrl: "https://www.mtlnovel.com/", + sourceName: "MTLNovel", + sourceCover: + "https://github.com/rajarsheechatterjee/lnreader-extensions/blob/main/src/en/mtlnovel/icon.png?raw=true", + sourceLanguage: "English", + status: 1, + }, ]; module.exports = extensions;