diff --git a/package-lock.json b/package-lock.json index 91bba2f..9fa9576 100644 --- a/package-lock.json +++ b/package-lock.json @@ -140,9 +140,9 @@ } }, "binary-extensions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", - "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "dev": true }, "body-parser": { @@ -304,14 +304,14 @@ } }, "chokidar": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.3.tgz", - "integrity": "sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", + "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", "dev": true, "requires": { "anymatch": "~3.1.1", "braces": "~3.0.2", - "fsevents": "~2.1.2", + "fsevents": "~2.3.1", "glob-parent": "~5.1.0", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", @@ -695,9 +695,9 @@ "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" }, "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, "optional": true }, @@ -719,9 +719,9 @@ } }, "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "requires": { "is-glob": "^4.0.1" @@ -756,9 +756,9 @@ } }, "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", "dev": true }, "har-schema": { @@ -936,9 +936,9 @@ "dev": true }, "is-path-inside": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.2.tgz", - "integrity": "sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true }, "is-typedarray": { @@ -1100,9 +1100,9 @@ "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" }, "nodemon": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.6.tgz", - "integrity": "sha512-4I3YDSKXg6ltYpcnZeHompqac4E6JeAMpGm8tJnB9Y3T0ehasLa4139dJOcCrB93HHrUMsCrKtoAlXTqT5n4AQ==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.7.tgz", + "integrity": "sha512-XHzK69Awgnec9UzHr1kc8EomQh4sjTQ8oRf8TsGrSmHDx9/UmiGG9E/mM3BuTfNeFwdNBvrqQq/RHL0xIeyFOA==", "dev": true, "requires": { "chokidar": "^3.2.2", @@ -1502,9 +1502,9 @@ "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" }, "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", "dev": true, "requires": { "emoji-regex": "^8.0.0", diff --git a/package.json b/package.json index 49487c8..797ffa9 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,6 @@ "request": "^2.88.2" }, "devDependencies": { - "nodemon": "^2.0.6" + "nodemon": "^2.0.7" } } diff --git a/server.js b/server.js index 34796d2..ea89aa6 100644 --- a/server.js +++ b/server.js @@ -26,6 +26,9 @@ app.use("/api/1/", require("./src/en/boxnovel/boxnovel")); // ReadLightNovel app.use("/api/2/", require("./src/en/readlightnovel/readlightnovel")); +// WuxiaWorld +app.use("/api/3/", require("./src/en/fastnovel/fastnovel")); + const PORT = process.env.PORT || 5000; app.listen(PORT, () => console.log(`Server started on port ${PORT}`)); diff --git a/src/en/boxnovel/boxnovel.js b/src/en/boxnovel/boxnovel.js index cc3eb41..5a756b5 100644 --- a/src/en/boxnovel/boxnovel.js +++ b/src/en/boxnovel/boxnovel.js @@ -193,26 +193,6 @@ router.get("/search/", (req, res) => { $(".c-tabs-item__content").each(function (result) { novelName = $(this).find("h4 > a").text(); - - // let novelDetails = {}; - - // $(this) - // .find(".post-content_item") - // .each(function (result) { - // detailName = $(this) - // .find(".summary-heading > h5") - // .text() - // .replace(/[\t\n]/g, "") - // .trim(); - // detail = $(this) - // .find(".summary-content") - // .text() - // .replace(/[\t\n]/g, "") - // .trim(); - - // novelDetails[detailName] = detail; - // }); - novelCover = $(this).find("img").attr("src"); novelUrl = $(this) diff --git a/src/en/fastnovel/fastnovel.js b/src/en/fastnovel/fastnovel.js new file mode 100644 index 0000000..bf78f48 --- /dev/null +++ b/src/en/fastnovel/fastnovel.js @@ -0,0 +1,183 @@ +const express = require("express"); +const cheerio = require("cheerio"); +const request = require("request"); + +const baseUrl = "https://fastnovel.net"; + +const router = express.Router(); +router.get("/novels/", (req, res) => { + let novels = []; + + url = `https://fastnovel.net/list/most-popular.html`; + + request(url, (err, response, body) => { + if (err) throw err; + + let novels = []; + + $ = cheerio.load(body); + + $(".film-item").each(function (result) { + let novelName = $(this).find("div.title > p.name").text(); + let novelCover = $(this).find(".img").attr("data-original"); + let novelUrl = $(this).find("a").attr("href").substring(1); + + novel = { + extensionId: 3, + novelName, + novelCover, + novelUrl, + }; + + novels.push(novel); + }); + + res.json(novels); + }); +}); + +// Novel + +router.get("/novel/:novelUrl", (req, res) => { + novelUrl = req.params.novelUrl; + url = `${baseUrl}/${novelUrl}/`; + + request(url, (err, response, body) => { + if (err) throw err; + + $ = cheerio.load(body); + + let novel = {}; + + novel.extensionId = 3; + + novel.sourceName = "FastNovel"; + + novel.sourceUrl = url; + + novel.novelUrl = `${novelUrl}/`; + + novel.novelName = $("h1").text(); + + novel.novelCover = $(".book-cover").attr("data-original"); + + novel.novelSummary = $("div.film-content > p").text(); + + novel["Author(s)"] = $("li > label") + .filter(function () { + return $(this).text().trim() === "Author:"; + }) + .next() + .text(); + + novel["Genre(s)"] = $("li") + .filter(function () { + return $(this).find("label").text().trim() === "Genre:"; + }) + .text() + .replace("Genre:", ""); + + novel["Artist(s)"] = null; + + novel.Status = null; + + let novelChapters = []; + + $(".chapter").each(function (result) { + chapterName = $(this).text(); + + releaseDate = null; + + chapterUrl = $(this).attr("href"); + + novelChapters.push({ + chapterName, + releaseDate, + chapterUrl: chapterUrl.replace(`/${novelUrl}/`, ""), + }); + }); + + novel.novelChapters = novelChapters; + + res.json({ novel }); + }); +}); + +router.get("/novel/:novelUrl/:chapterUrl", (req, res) => { + url = `${baseUrl}/${req.params.novelUrl}/${req.params.chapterUrl}`; + + request(url, (err, response, body) => { + if (err) throw err; + + $ = cheerio.load(body); + + chapterName = $(".episode-name").text(); + + chapterText = $("#chapter-body").text(); + + let nextChapter = null; + + nextChapter = $("div.btn-group > a") + .filter(function () { + return $(this).text().trim() === "Next Chapter"; + }) + .attr("href") + .replace("/", ""); + + let prevChapter = null; + + prevChapter = $("div.btn-group > a") + .filter(function () { + return $(this).text().trim() === "Prev Chapter"; + }) + .attr("href") + .replace("/", ""); + + chapter = { + extensionId: 3, + novelUrl: `${req.params.novelUrl}/`, + chapterUrl: `${req.params.chapterUrl}/`, + chapterName, + chapterText, + nextChapter, + prevChapter, + }; + + res.json(chapter); + }); +}); + +router.get("/search/", (req, res) => { + let searchTerm = req.query.s; + searchTerm = encodeURI(searchTerm); + searchUrl = `https://fastnovel.net/search/`; + + url = `${searchUrl}${searchTerm}`; + + request(url, (err, response, body) => { + if (err) throw err; + + $ = cheerio.load(body); + + let novels = []; + + $(".film-item").each(function (result) { + let novelName = $(this).find("div.title > p.name").text(); + let novelCover = $(this).find(".img").attr("data-original"); + let novelUrl = $(this).find("a").attr("href").substring(1); + + novel = { + extensionId: 3, + novelName, + novelCover, + novelUrl, + }; + + novels.push(novel); + }); + + res.json(novels); + }); +}); + +module.exports = router; diff --git a/src/en/readlightnovel/readlightnovel.js b/src/en/readlightnovel/readlightnovel.js index 9ecf217..ffd1346 100644 --- a/src/en/readlightnovel/readlightnovel.js +++ b/src/en/readlightnovel/readlightnovel.js @@ -104,11 +104,6 @@ router.get("/novel/:novelUrl", (req, res) => { .trim(); releaseDate = null; - // $(this) - // .find("span") - // .text() - // .replace(/[\t\n]/g, "") - // .trim(); chapterUrl = $(this) .find("a")