FastNovel: add source

This commit is contained in:
Rajarshee Chatterjee
2021-04-02 08:46:28 +05:30
parent aca3fba58a
commit d9510de5a7
6 changed files with 212 additions and 51 deletions
+25 -25
View File
@@ -140,9 +140,9 @@
} }
}, },
"binary-extensions": { "binary-extensions": {
"version": "2.1.0", "version": "2.2.0",
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
"integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
"dev": true "dev": true
}, },
"body-parser": { "body-parser": {
@@ -304,14 +304,14 @@
} }
}, },
"chokidar": { "chokidar": {
"version": "3.4.3", "version": "3.5.1",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.3.tgz", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz",
"integrity": "sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==", "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==",
"dev": true, "dev": true,
"requires": { "requires": {
"anymatch": "~3.1.1", "anymatch": "~3.1.1",
"braces": "~3.0.2", "braces": "~3.0.2",
"fsevents": "~2.1.2", "fsevents": "~2.3.1",
"glob-parent": "~5.1.0", "glob-parent": "~5.1.0",
"is-binary-path": "~2.1.0", "is-binary-path": "~2.1.0",
"is-glob": "~4.0.1", "is-glob": "~4.0.1",
@@ -695,9 +695,9 @@
"integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
}, },
"fsevents": { "fsevents": {
"version": "2.1.3", "version": "2.3.2",
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
"integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
"dev": true, "dev": true,
"optional": true "optional": true
}, },
@@ -719,9 +719,9 @@
} }
}, },
"glob-parent": { "glob-parent": {
"version": "5.1.1", "version": "5.1.2",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
"integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
"dev": true, "dev": true,
"requires": { "requires": {
"is-glob": "^4.0.1" "is-glob": "^4.0.1"
@@ -756,9 +756,9 @@
} }
}, },
"graceful-fs": { "graceful-fs": {
"version": "4.2.4", "version": "4.2.6",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz",
"integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==",
"dev": true "dev": true
}, },
"har-schema": { "har-schema": {
@@ -936,9 +936,9 @@
"dev": true "dev": true
}, },
"is-path-inside": { "is-path-inside": {
"version": "3.0.2", "version": "3.0.3",
"resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.2.tgz", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
"integrity": "sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg==", "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
"dev": true "dev": true
}, },
"is-typedarray": { "is-typedarray": {
@@ -1100,9 +1100,9 @@
"integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw=="
}, },
"nodemon": { "nodemon": {
"version": "2.0.6", "version": "2.0.7",
"resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.6.tgz", "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.7.tgz",
"integrity": "sha512-4I3YDSKXg6ltYpcnZeHompqac4E6JeAMpGm8tJnB9Y3T0ehasLa4139dJOcCrB93HHrUMsCrKtoAlXTqT5n4AQ==", "integrity": "sha512-XHzK69Awgnec9UzHr1kc8EomQh4sjTQ8oRf8TsGrSmHDx9/UmiGG9E/mM3BuTfNeFwdNBvrqQq/RHL0xIeyFOA==",
"dev": true, "dev": true,
"requires": { "requires": {
"chokidar": "^3.2.2", "chokidar": "^3.2.2",
@@ -1502,9 +1502,9 @@
"integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
}, },
"string-width": { "string-width": {
"version": "4.2.0", "version": "4.2.2",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz",
"integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==",
"dev": true, "dev": true,
"requires": { "requires": {
"emoji-regex": "^8.0.0", "emoji-regex": "^8.0.0",
+1 -1
View File
@@ -15,6 +15,6 @@
"request": "^2.88.2" "request": "^2.88.2"
}, },
"devDependencies": { "devDependencies": {
"nodemon": "^2.0.6" "nodemon": "^2.0.7"
} }
} }
+3
View File
@@ -26,6 +26,9 @@ app.use("/api/1/", require("./src/en/boxnovel/boxnovel"));
// ReadLightNovel // ReadLightNovel
app.use("/api/2/", require("./src/en/readlightnovel/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; const PORT = process.env.PORT || 5000;
app.listen(PORT, () => console.log(`Server started on port ${PORT}`)); app.listen(PORT, () => console.log(`Server started on port ${PORT}`));
-20
View File
@@ -193,26 +193,6 @@ router.get("/search/", (req, res) => {
$(".c-tabs-item__content").each(function (result) { $(".c-tabs-item__content").each(function (result) {
novelName = $(this).find("h4 > a").text(); 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"); novelCover = $(this).find("img").attr("src");
novelUrl = $(this) novelUrl = $(this)
+183
View File
@@ -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;
-5
View File
@@ -104,11 +104,6 @@ router.get("/novel/:novelUrl", (req, res) => {
.trim(); .trim();
releaseDate = null; releaseDate = null;
// $(this)
// .find("span")
// .text()
// .replace(/[\t\n]/g, "")
// .trim();
chapterUrl = $(this) chapterUrl = $(this)
.find("a") .find("a")