be2dd52cd2
Co-authored-by: Claude <noreply@anthropic.com>
96 lines
2.6 KiB
TypeScript
96 lines
2.6 KiB
TypeScript
import { fetchApi, fetchProto, fetchText } from '@libs/fetch';
|
|
import { Plugin } from '@/types/plugin';
|
|
import { Filters } from '@libs/filterInputs';
|
|
import { load as loadCheerio } from 'cheerio';
|
|
import { defaultCover } from '@libs/defaultCover';
|
|
import { NovelStatus } from '@libs/novelStatus';
|
|
// import { isUrlAbsolute } from '@libs/isAbsoluteUrl';
|
|
// import { storage, localStorage, sessionStorage } from '@libs/storage';
|
|
// import { encode, decode } from 'urlencode';
|
|
// import dayjs from 'dayjs';
|
|
// import { Parser } from 'htmlparser2';
|
|
|
|
class TemplatePlugin implements Plugin.PluginBase {
|
|
id = '';
|
|
name = '';
|
|
icon = '';
|
|
site = 'https://example.com';
|
|
version = '1.0.0';
|
|
filters: Filters | undefined = undefined;
|
|
imageRequestInit?: Plugin.ImageRequestInit | undefined = undefined;
|
|
|
|
// Flag indicating whether access to localStorage/sessionStorage is required.
|
|
webStorageUtilized?: boolean;
|
|
|
|
async popularNovels(
|
|
pageNo: number,
|
|
{
|
|
showLatestNovels,
|
|
filters,
|
|
}: Plugin.PopularNovelsOptions<typeof this.filters>,
|
|
): Promise<Plugin.NovelItem[]> {
|
|
const novels: Plugin.NovelItem[] = [];
|
|
|
|
/** Add your fetching code here */
|
|
novels.push({
|
|
name: 'Novel1',
|
|
path: '/novels/1',
|
|
cover: defaultCover,
|
|
});
|
|
return novels;
|
|
}
|
|
async parseNovel(novelPath: string): Promise<Plugin.SourceNovel> {
|
|
const novel: Plugin.SourceNovel = {
|
|
path: novelPath,
|
|
name: 'Untitled',
|
|
};
|
|
|
|
// TODO: fetch the novel's data from the site, then
|
|
// un-comment and fill in the relevant fields below
|
|
|
|
// novel.name = '';
|
|
// novel.artist = '';
|
|
// novel.author = '';
|
|
novel.cover = defaultCover;
|
|
// novel.genres = '';
|
|
// novel.status = NovelStatus.Completed;
|
|
// novel.summary = '';
|
|
|
|
const chapters: Plugin.ChapterItem[] = [];
|
|
|
|
// TODO: parse the chapter list here
|
|
|
|
// TODO: add each chapter to `chapters`, e.g.:
|
|
const chapter: Plugin.ChapterItem = {
|
|
name: '',
|
|
path: '',
|
|
releaseTime: '',
|
|
chapterNumber: 0,
|
|
};
|
|
chapters.push(chapter);
|
|
|
|
novel.chapters = chapters;
|
|
return novel;
|
|
}
|
|
async parseChapter(chapterPath: string): Promise<string> {
|
|
// parse chapter text here
|
|
const chapterText = '';
|
|
return chapterText;
|
|
}
|
|
async searchNovels(
|
|
searchTerm: string,
|
|
pageNo: number,
|
|
): Promise<Plugin.NovelItem[]> {
|
|
const novels: Plugin.NovelItem[] = [];
|
|
|
|
// get novels using the search term
|
|
|
|
return novels;
|
|
}
|
|
|
|
resolveUrl = (path: string, isNovel?: boolean) =>
|
|
this.site + (isNovel ? '/book/' : '/chapter/') + path;
|
|
}
|
|
|
|
export default new TemplatePlugin();
|