import fs from "fs"; import { languages } from "@libs/languages"; import path from "path"; import { PluginList } from "@typings/types"; import { Plugin } from "@typings/plugin"; import { Filters } from "@libs/filterInputs"; const root = path.dirname(require?.main?.filename || ""); export const fetchHeaders: Record = {}; export const all_plugins = (): PluginList => { const res: PluginList = {}; for (let languageEnglish in languages) { //language with English name const languageNative = languages[languageEnglish as keyof typeof languages]; const langPath = path.join( root, "plugins", languageEnglish.toLowerCase() ); if (!fs.existsSync(langPath)) continue; const plugins = fs.readdirSync(langPath); res[languageEnglish] = []; plugins.forEach((plugin) => { if (plugin.startsWith(".")) return; const requirePath = `@plugins/${languageEnglish.toLowerCase()}/${ plugin.split(".")[0] }`; const instance = require(requirePath).default; const { id, name, version, icon } = instance; const info: Plugin.PluginItem = { id, name: name + (plugin.match(/(\[.+\])/)?.[1] || ''), lang: languageNative, version, requirePath, icon, }; // lang: language with native name res[languageEnglish].push(info); }); } return res; }; const getPlugin = async ( requirePath: string ): Promise => { const plugin = await require(requirePath).default; return plugin; }; export const getFilter = async (pluginRequirePath: string) => (await getPlugin(pluginRequirePath))?.filters; export const popularNovels = async ( pluginRequirePath: string, page: number, options: Plugin.PopularNovelsOptions ) => (await getPlugin(pluginRequirePath))?.popularNovels(page, options); export const searchNovels = async ( pluginRequirePath: string, page: number, searchTerm: string ) => (await getPlugin(pluginRequirePath))?.searchNovels(searchTerm, page); export const parseNovel = async ( pluginRequirePath: string, novelPath: string ) => (await getPlugin(pluginRequirePath))?.parseNovel(novelPath); export const hasParsePage = async ( pluginRequirePath: string, ) => (await getPlugin(pluginRequirePath) as Plugin.PagePlugin | null)?.parsePage; export const parsePage = async( pluginRequirePath: string, novelPath: string, page: string ) => (await getPlugin(pluginRequirePath) as Plugin.PagePlugin | null)?.parsePage(novelPath, page); export const parseChapter = async ( pluginRequirePath: string, chapterPath: string ) => (await getPlugin(pluginRequirePath))?.parseChapter(chapterPath); export const fetchImage = async (pluginRequirePath: string, url: string) => (await getPlugin(pluginRequirePath))?.fetchImage(url); export const resolveUrl = async ( pluginRequirePath: string, path: string, isNovel?: boolean, ) => { const plugin = await getPlugin(pluginRequirePath); if (!plugin) return path; if (plugin.resolveUrl) return plugin.resolveUrl(path, isNovel); return plugin.site + path; };