feat: Plugins (#465)
* update * gitignore * base file * template * json generator * remove valid method * Update README.md README * update template * Update README.md * update template * not support async arrow function * remove valid method * basic plugin validation. * Update README.md * update template * Update README.md * add fetchFile lib. empy .language file * comment fetch * update * comment fetch * auto comment, update template, template.min * Update README.md * add option to test * reset version * Update README.md * small fix for LightNovelReader * comment fetch * minor: LL date format * refactor: rename project, remove html2text lib * fix: error if there's no plugin changed * implement cookies bypass * update template.min.js * add syosetu * fix: get last file in case removing. shorter id * shoter native language name * change app project name * testing with UI would be less painful :) * remove console.log * Update README.md for UI testing * fix Syosetu * remove try catch * add ranobehub * add json for ranobehub * wrong icon path :D * fix ranobehub * fix status ranobe * add french * fix css * add chireads * add indonesian * add sakura novel * add sakuranovel json * add spanish * add skynovels * fix skynovels * add agitoon * add turkish * add epiknovel * add portuguese * update template * cheerio_space * add novel Fullme * minor * lol, this source havent been finished before. cant help * cant bypass this * add hasutl * novelasligera not working properly * add novelpub, but no searching * add jaomix * fix jaomix * add ranoberf * add indowebnovel * add novelringan * add noveldeglace * search not work for this * add oasisTL, this should have better popularNovels * add tunovelaligera * this source need to fix search * add bestlightnovel * add comrade mao * minor fix * add divinedaolibrary * add freewebnovel * lol xD * minor * update json * fix icon novelawuxia * update site in for pluginItem * some changes for more convenient * remove try catch * Update README.md * remove * Update README.md * trying to use pre-commit * update README * feat: .env for repo config * add foxaholic (#2) * rebase fox * fox officially 1.0.0 --------- Co-authored-by: K1ngfish3r <trulyihu@gmail.com>
This commit is contained in:
@@ -0,0 +1,155 @@
|
||||
const cheerio = require('cheerio');
|
||||
const fetchApi = require('@libs/fetchApi');
|
||||
const fetchFile = require('@libs/fetchFile');
|
||||
const languages = require('@libs/languages');
|
||||
|
||||
const pluginId = 'agit.xyz';
|
||||
const sourceName = 'Agitoon';
|
||||
const baseUrl = 'https://agit501.xyz/';
|
||||
|
||||
async function popularNovels (page) {
|
||||
const list_limit = 20 * (page - 1);
|
||||
const day = new Date().getDay();
|
||||
|
||||
const res = await fetchApi(baseUrl + 'novel/index.update.php', {
|
||||
headers: {
|
||||
'content-type': 'application/x-www-form-urlencoded; charset=UTF-8',
|
||||
},
|
||||
body: `mode=get_data_novel_list_p&novel_menu=3&np_day=${day}&np_rank=1&np_distributor=0&np_genre=00&np_order=1&np_genre_ex_1=00&np_genre_ex_2=00&list_limit=${list_limit}&is_query_first=true`,
|
||||
method: 'POST',
|
||||
});
|
||||
|
||||
const resJson = await res.json();
|
||||
|
||||
const novels = resJson.list.map(novel => {
|
||||
return {
|
||||
url: baseUrl + 'novel/list/' + novel.wr_id,
|
||||
name: novel.wr_subject,
|
||||
cover: baseUrl + novel.np_dir + '/thumbnail/' + novel.np_thumbnail,
|
||||
};
|
||||
});
|
||||
|
||||
return novels ;
|
||||
};
|
||||
|
||||
async function parseNovelAndChapters (novelUrl) {
|
||||
const novelId = novelUrl.split('/').reverse()[0];
|
||||
|
||||
// cheerio
|
||||
const result = await fetchApi(novelUrl);
|
||||
const body = await result.text();
|
||||
|
||||
const loadedCheerio = cheerio.load(body, { decodeEntities: false });
|
||||
const name = loadedCheerio('h5.pt-2').text();
|
||||
const summary = loadedCheerio('.pt-1.mt-1.pb-1.mb-1').text();
|
||||
const author = loadedCheerio('.post-item-list-cate-v')
|
||||
.first()
|
||||
.text()
|
||||
.split(' : ')
|
||||
.reverse()[0];
|
||||
const cover =
|
||||
baseUrl.slice(0, baseUrl.length - 1) +
|
||||
loadedCheerio('div.col-5.pr-0.pl-0 img').attr('src');
|
||||
const genresTag = loadedCheerio('.col-7 > .post-item-list-cate > span');
|
||||
let genres = '';
|
||||
|
||||
genresTag.each((_, element) => {
|
||||
genres += loadedCheerio(element).text();
|
||||
genres += ', ';
|
||||
});
|
||||
genres = genres.slice(0, genres.length - 2);
|
||||
|
||||
// normal REST HTTP requests
|
||||
let chapters = [];
|
||||
|
||||
const res = await fetchApi(baseUrl + 'novel/list.update.php', {
|
||||
headers: {
|
||||
'content-type': 'application/x-www-form-urlencoded; charset=UTF-8',
|
||||
},
|
||||
body: `mode=get_data_novel_list_c&wr_id_p=${novelId}&page_no=1&cnt_list=10000&order_type=Asc`,
|
||||
method: 'POST',
|
||||
});
|
||||
|
||||
const resJson = await res.json();
|
||||
|
||||
chapters = resJson.list.map(chapter => {
|
||||
return {
|
||||
name: chapter.wr_subject,
|
||||
url: baseUrl + `novel/view/${chapter.wr_id}/2`,
|
||||
releaseTime: chapter.wr_datetime,
|
||||
};
|
||||
});
|
||||
|
||||
const novel = {
|
||||
url: novelUrl,
|
||||
name,
|
||||
cover,
|
||||
summary,
|
||||
author,
|
||||
status: '',
|
||||
genres: genres,
|
||||
chapters,
|
||||
};
|
||||
return novel;
|
||||
};
|
||||
|
||||
async function parseChapter (chapterUrl) {
|
||||
const result = await fetchApi(chapterUrl);
|
||||
const body = await result.text();
|
||||
|
||||
const loadedCheerio = cheerio.load(body);
|
||||
|
||||
const contentTag = loadedCheerio('#id_wr_content > p');
|
||||
|
||||
let content = '';
|
||||
contentTag.each((_, element) => {
|
||||
content += loadedCheerio(element).text();
|
||||
content += '<br />';
|
||||
});
|
||||
|
||||
// gets rid of the popup thingy
|
||||
content = content.replace(
|
||||
'팝업메뉴는 빈공간을 더치하거나 스크룰시 사라집니다',
|
||||
'',
|
||||
);
|
||||
|
||||
return content;
|
||||
};
|
||||
|
||||
async function searchNovels (searchTerm) {
|
||||
const rawResults = await fetchApi('https://agit501.xyz/novel/search.php', {
|
||||
headers: {
|
||||
'content-type': 'application/x-www-form-urlencoded; charset=UTF-8',
|
||||
},
|
||||
body: `mode=get_data_novel_list_p_sch&search_novel=${searchTerm}&list_limit=0`,
|
||||
method: 'POST',
|
||||
});
|
||||
|
||||
const results = await rawResults.json();
|
||||
if (results.list_count === 0) {
|
||||
return [];
|
||||
}
|
||||
|
||||
const novels = results.list.map(result => {
|
||||
return {
|
||||
url: baseUrl + 'novel/list/' + result.wr_id,
|
||||
name: result.wr_subject,
|
||||
cover: baseUrl + result.np_dir + '/thumbnail/' + result.np_thumbnail,
|
||||
};
|
||||
});
|
||||
return novels;
|
||||
};
|
||||
|
||||
module.exports = {
|
||||
id: pluginId,
|
||||
name: sourceName,
|
||||
site: baseUrl,
|
||||
version: '1.0.0',
|
||||
icon: 'src/kr/agitoon/agit.png',
|
||||
lang: languages.Korean,
|
||||
popularNovels,
|
||||
parseNovelAndChapters,
|
||||
parseChapter,
|
||||
searchNovels,
|
||||
fetchImage: fetchFile,
|
||||
};
|
||||
Reference in New Issue
Block a user