diff --git a/plugins/english/novelhi.ts b/plugins/english/novelhi.ts
index 2e766283f..4879e000f 100644
--- a/plugins/english/novelhi.ts
+++ b/plugins/english/novelhi.ts
@@ -3,14 +3,14 @@ import { Plugin } from '@/types/plugin';
import { load as parseHTML } from 'cheerio';
import { NovelStatus } from '@libs/novelStatus';
import { defaultCover } from '@libs/defaultCover';
-import { Filters, FilterTypes } from '@/types/filters';
+import { Filters, FilterTypes } from '@libs/filterInputs';
class NovelHi implements Plugin.PluginBase {
id = 'novelhi';
name = 'NovelHi';
icon = 'src/en/novelhi/icon.png';
site = 'https://novelhi.com/';
- version = '1.1.0';
+ version = '1.1.1';
// flag indicates whether access to LocalStorage, SesesionStorage is required.
webStorageUtilized?: boolean;
@@ -20,13 +20,13 @@ class NovelHi implements Plugin.PluginBase {
private async getNovels(
pageNo: number,
- keyword = '',
+ keyword: string | undefined,
filters?: Plugin.PopularNovelsOptions['filters'],
): Promise {
const params = new URLSearchParams({
curr: pageNo.toString(),
limit: '10',
- keyword,
+ ...(keyword && { keyword }),
...(filters?.genres.value && { 'bookGenres[]': filters.genres.value }),
...(filters?.order.value && { bookStatus: filters.order.value }),
...(filters?.time.value && { updatePeriod: filters.time.value }),
@@ -58,7 +58,7 @@ class NovelHi implements Plugin.PluginBase {
pageNo: number,
{ filters }: Plugin.PopularNovelsOptions,
): Promise {
- return this.getNovels(pageNo, '', filters);
+ return this.getNovels(pageNo, undefined, filters);
}
async parseNovel(novelPath: string): Promise {
@@ -74,7 +74,10 @@ class NovelHi implements Plugin.PluginBase {
const novel: Plugin.SourceNovel = {
path: novelPath,
- name: loadedCheerio('meta[name=keywords]').attr('content') || 'Untitled',
+ name:
+ loadedCheerio('b.layui-icon').text().trim() ||
+ loadedCheerio('.tit h1').text().trim() ||
+ 'Untitled',
cover: loadedCheerio('.cover,.decorate-img').attr('src') || defaultCover,
};
@@ -126,10 +129,43 @@ class NovelHi implements Plugin.PluginBase {
const result = await fetchApi(url).then(res => res.text());
const loadedCheerio = parseHTML(result);
+ const path = loadedCheerio('#chapterContentPath').attr('value');
+ const token = loadedCheerio('#chapterContentToken').attr('value');
+
+ if (!path || !token) return '';
+
+ const contentPath = new URL(path, this.site).href;
+ const content: ApiContent = await fetchApi(
+ `${contentPath}?token=${token}`,
+ {
+ headers: {
+ 'Referer': url,
+ 'X-Requested-With': 'XMLHttpRequest',
+ },
+ },
+ ).then(r => r.json());
+
+ if (content) {
+ const rot13 = content.data.content.replace(
+ /(<[^>]+>)|([a-zA-Z])/g,
+ (_, tag, char) => {
+ if (tag) return tag;
+
+ const base = char <= 'Z' ? 65 : 97;
+ const shift = ((char.charCodeAt(0) - base + 13) % 26) + base;
+ return String.fromCharCode(shift);
+ },
+ );
+ const chapter = rot13
+ .replace(//gi, '
')
+ .replace(/
/gi, '');
+ loadedCheerio('#showReading').html(chapter);
+ }
loadedCheerio('#showReading script,ins').remove();
const chapterText = loadedCheerio('#showReading').html();
if (!chapterText) {
- return loadedCheerio('#translate <').html() || '';
+ return loadedCheerio('#translate').parent().html() || '';
}
return chapterText;
}
@@ -257,3 +293,10 @@ type ApiChapter = {
list: ChapterData[];
};
};
+
+type ApiContent = {
+ code: number;
+ data: {
+ content: string;
+ };
+};