UNPKG

rsshub

Version:
464 lines (420 loc) • 10.5 kB
import type { Context } from 'hono'; // Make sure it's synchronise with scripts/workflow/data.ts // and lib/routes/rsshub/routes.ts export type Category = | 'popular' | 'social-media' | 'new-media' | 'traditional-media' | 'bbs' | 'blog' | 'programming' | 'design' | 'live' | 'multimedia' | 'picture' | 'anime' | 'program-update' | 'university' | 'forecast' | 'travel' | 'shopping' | 'game' | 'reading' | 'government' | 'study' | 'journal' | 'finance' | 'other'; // rss export type DataItem = { title: string; description?: string; pubDate?: number | string | Date; link?: string; category?: string[]; author?: | string | { name: string; url?: string; avatar?: string; }[]; doi?: string; guid?: string; id?: string; content?: { html: string; text: string; }; image?: string; banner?: string; updated?: number | string | Date; language?: Language; enclosure_url?: string; enclosure_type?: string; enclosure_title?: string; enclosure_length?: number; itunes_duration?: number | string; itunes_item_image?: string; media?: Record<string, Record<string, string>>; attachments?: { url: string; mime_type: string; title?: string; size_in_bytes?: number; duration_in_seconds?: number; }[]; _extra?: Record<string, any> & { links?: { url: string; type: string; content_html?: string; }[]; }; }; export type Data = { title: string; description?: string; link?: string; item?: DataItem[]; allowEmpty?: boolean; image?: string; author?: string; language?: Language; feedLink?: string; lastBuildDate?: string; itunes_author?: string; itunes_category?: string; itunes_explicit?: string | boolean; id?: string; icon?: string; logo?: string; atomlink?: string; ttl?: number; }; export type Language = | 'af' | 'ar-DZ' | 'ar-IQ' | 'ar-KW' | 'ar-MA' | 'ar-SA' | 'ar-TN' | 'be' | 'bg' | 'ca' | 'cs' | 'da' | 'de' | 'de-at' | 'de-ch' | 'de-de' | 'de-li' | 'de-lu' | 'el' | 'en' | 'en-au' | 'en-bz' | 'en-ca' | 'en-gb' | 'en-ie' | 'en-jm' | 'en-nz' | 'en-ph' | 'en-tt' | 'en-us' | 'en-za' | 'en-zw' | 'es' | 'es-ar' | 'es-bo' | 'es-cl' | 'es-co' | 'es-cr' | 'es-do' | 'es-ec' | 'es-es' | 'es-gt' | 'es-hn' | 'es-mx' | 'es-ni' | 'es-pa' | 'es-pe' | 'es-pr' | 'es-py' | 'es-sv' | 'es-uy' | 'es-ve' | 'et' | 'eu' | 'fi' | 'fo' | 'fr' | 'fr-be' | 'fr-ca' | 'fr-ch' | 'fr-fr' | 'fr-lu' | 'fr-mc' | 'ga' | 'gd' | 'gl' | 'haw' | 'hi' | 'hr' | 'hu' | 'in' | 'is' | 'it' | 'it-ch' | 'it-it' | 'ja' | 'ko' | 'mk' | 'ne' | 'nl' | 'nl-be' | 'nl-nl' | 'no' | 'pl' | 'pt' | 'pt-br' | 'pt-pt' | 'ro' | 'ro-mo' | 'ro-ro' | 'ru' | 'ru-mo' | 'ru-ru' | 'sk' | 'sl' | 'sq' | 'sr' | 'sv' | 'sv-fi' | 'sv-se' | 'tr' | 'uk' | 'zh-CN' | 'zh-HK' | 'zh-TW' | 'other'; // namespace interface NamespaceItem { /** * The human-readable name of the namespace, should be the same as the secondary domain of the main website, * which will be used as the level 2 heading in the documentation */ name: string; /** * The website URL without protocol that corresponds */ url?: string; /** * The classification of the namespace, which will be written into the corresponding classification document */ categories?: Category[]; /** * Hints and additional explanations for users using this namespace, it will be inserted into the documentation */ description?: string; /** * Main Language of the namespace */ lang?: Language; } interface Namespace extends NamespaceItem { /** Documentation in languages other than English, it will be used to generate multilingual documents */ ja?: NamespaceItem; /** Documentation in languages other than English, it will be used to generate multilingual documents */ zh?: NamespaceItem; /** Documentation in languages other than English, it will be used to generate multilingual documents */ 'zh-TW'?: NamespaceItem; } export type { Namespace }; export enum ViewType { Articles = 0, SocialMedia = 1, Pictures = 2, Videos = 3, Audios = 4, Notifications = 5, } // route interface RouteItem { /** * The route path, using [Hono routing](https://hono.dev/api/routing) syntax */ path: string | string[]; /** * The human-readable name of the route, which will be used as the level 3 heading in the documentation * and radar rule title (can be overridden by `RadarRule[].title`) */ name: string; /** * The website URL without protocol that corresponds */ url?: string; /** * The GitHub handle of the people responsible for maintaining this route */ maintainers: string[]; /** * The handler function of the route */ handler: (ctx: Context) => Promise<Data | null> | Data | null; /** * An example URL of the route */ example: string; /** * The description of the route parameters */ parameters?: Record< string, | string | { description: string; default?: string; options?: { value: string; label: string; }[]; } >; /** * Hints and additional explanations for users using this route, it will be appended after the route component, supports markdown */ description?: string; /** * The classification of the route, which will be written into the corresponding classification documentation */ categories?: Category[]; /** * Special features of the route, such as what configuration items it depends on, whether it is strict anti-crawl, whether it supports a certain function and so on */ features?: { /** The extra configuration items required by the route */ requireConfig?: | { /** The environment variable name */ name: string; /** Whether the environment variable is optional */ optional?: boolean; /** The description of the environment variable */ description: string; }[] | false; /** set to `true` if the feed uses puppeteer */ requirePuppeteer?: boolean; /** set to `true` if the target website has an anti-crawler mechanism */ antiCrawler?: boolean; /** set to `true` if the feed has a radar rule */ supportRadar?: boolean; /** Set to `true` if the feed supports BitTorrent */ supportBT?: boolean; /** Set to `true` if the feed supports podcasts */ supportPodcast?: boolean; /** Set to `true` if the feed supports Sci-Hub */ supportScihub?: boolean; /** Set to `true` if this feed is not safe for work */ nsfw?: boolean; }; /** * The [RSSHub-Radar](https://github.com/DIYgod/RSSHub-Radar) rule of the route */ radar?: RadarItem[]; /** * The [Follow](https://github.com/RSSNext/follow) default view of the route, default to `ViewType.Articles` */ view?: ViewType; } export interface Route extends RouteItem { ja?: RouteItem; zh?: RouteItem; 'zh-TW'?: RouteItem; } // radar export type RadarItem = { /** * The overwriting title of the radar rule */ title?: string; /** * The URL path to the corresponding documentation */ docs?: string; /** * The source URL path of the radar rule * @see https://docs.rsshub.app/joinus/new-radar#source */ source: string[]; /** * The target RSSHub subscription URL path of the radar rule * * Will use RouteItem.path if not specified * @see https://docs.rsshub.app/joinus/new-radar#target * * Using `target` as a function is deprecated in RSSHub-Radar 2.0.19 * @see https://github.com/DIYgod/RSSHub-Radar/commit/5a97647f900bb2bca792787a322b2b1ca512e40b#diff-f84e3c1e16af314bc4ed7c706d7189844663cde9b5142463dc5c0db34c2e8d54L10 * @see https://github.com/DIYgod/RSSHub-Radar/issues/692 */ target?: | string | (( /** The parameters matched from the `source` field */ params: any, /** The current webpage URL string */ url: string, /** @deprecated Temporary removed @see https://github.com/DIYgod/RSSHub-Radar/commit/e6079ea1a8c96e89b1b2c2aa6d13c7967788ca3b */ document: Document ) => string); }; export type RadarDomain = { _name: string; } & { [subdomain: string]: RadarItem[]; }; export interface APIRoute { /** * The route path, using [Hono routing](https://hono.dev/api/routing) syntax */ path: string; /** * The GitHub handle of the people responsible for maintaining this route */ maintainers: string[]; /** * The handler function of the route */ handler: (ctx: Context) => | Promise<{ code: number; message?: string; data?: any; }> | { code: number; message?: string; data?: any; }; /** * The description of the route parameters */ parameters?: Record< string, { description: string; default?: string; options?: { value: string; label: string; }[]; } >; /** * Hints and additional explanations for users using this route, it will be appended after the route component, supports markdown */ description?: string; }