fix plugins (#1524)

* fix: free web novel search interval

* fix: allnovelfull oversearch
This commit is contained in:
nyagami
2025-02-16 15:35:15 +07:00
committed by GitHub
parent b341fa67f7
commit ea4d453b1c
3 changed files with 40 additions and 8 deletions
@@ -9,13 +9,13 @@ export default function SearchNovels() {
const plugin = useAppStore(state => state.plugin);
const [searchTerm, setSearchTerm] = useState('');
const [page] = useState(1);
const [novels, setNovels] = useState<Plugin.NovelItem[]>([]);
const [currentPage, setCurrentPage] = useState(1);
const [novels, setNovels] = useState<Plugin.NovelItem[] | undefined>([]);
const [loading, setLoading] = useState(false);
const [fetchError, setFetchError] = useState('');
const fetchNovels = () => {
const fetchNovels = (page: number) => {
if (plugin) {
setLoading(true);
plugin
@@ -28,6 +28,10 @@ export default function SearchNovels() {
}
};
useEffect(() => {
setCurrentPage(1);
}, [plugin]);
return (
<AccordionContainer title="Search Novels" loading={loading}>
{fetchError && <span style={{ color: 'red' }}>{fetchError}</span>}
@@ -40,12 +44,19 @@ export default function SearchNovels() {
/>
<Button
disabled={plugin === undefined}
onClick={fetchNovels}
onClick={() => fetchNovels(currentPage)}
variant="contained"
>
Fetch
</Button>
<Button disabled={plugin === undefined} variant="outlined">
<Button
disabled={plugin === undefined}
variant="outlined"
onClick={() => {
fetchNovels(currentPage + 1);
setCurrentPage(pre => pre + 1);
}}
>
Next Page
</Button>
</Stack>
@@ -56,7 +67,7 @@ export default function SearchNovels() {
}}
>
<Stack sx={{ width: 'max-content' }} direction={'row'} spacing={2}>
{novels.map((novel, index) => (
{novels?.map((novel, index) => (
<NovelItemCard key={'searchedNovelItem_' + index} item={novel} />
))}
</Stack>
+10 -1
View File
@@ -9,7 +9,7 @@ class AllNovelFullPlugin implements Plugin.PluginBase {
name = 'AllNovelFull';
icon = 'src/en/allnovelfull/icon.png';
site = 'https://allnovelfull.net';
version = '1.0.0';
version = '1.0.1';
parseNovels(loadedCheerio: CheerioAPI) {
const novels: Plugin.NovelItem[] = [];
@@ -145,6 +145,15 @@ class AllNovelFullPlugin implements Plugin.PluginBase {
const body = await result.text();
const loadedCheerio = parseHTML(body);
const lastPage = loadedCheerio('.pagination-container ul li a')
.last()
.attr('data-page');
if (!lastPage) {
// no pagination
if (page > 1) return [];
} else {
if (parseInt(lastPage) && page > parseInt(lastPage)) return [];
}
return this.parseNovels(loadedCheerio);
}
+13 -1
View File
@@ -7,9 +7,16 @@ class FreeWebNovel implements Plugin.PluginBase {
id = 'FWN.com';
name = 'Free Web Novel';
site = 'https://freewebnovel.com/';
version = '1.1.1';
version = '1.1.2';
icon = 'src/en/freewebnovel/icon.png';
lastSearch: number | null = null;
searchInterval = 3200;
async sleep(ms: number) {
return new Promise(resolve => setTimeout(resolve, ms));
}
async getCheerio(url: string): Promise<CheerioAPI> {
const r = await fetchApi(url);
if (!r.ok)
@@ -124,6 +131,10 @@ class FreeWebNovel implements Plugin.PluginBase {
}
async searchNovels(searchTerm: string): Promise<Plugin.NovelItem[]> {
const now = Date.now();
if (this.lastSearch && now - this.lastSearch <= this.searchInterval) {
await this.sleep(this.searchInterval);
}
const r = await fetchApi(this.site + 'search', {
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
@@ -131,6 +142,7 @@ class FreeWebNovel implements Plugin.PluginBase {
method: 'POST',
body: new URLSearchParams({ searchkey: searchTerm }).toString(),
});
this.lastSearch = Date.now();
if (!r.ok)
throw new Error(
'Could not reach site (' + r.status + ') try to open in webview.',