import { AsyncEventEmitter } from "@joshuaavalon/async-event-emitter"; import { LoggableError } from "#error"; import type { Logger } from "pino"; import type { DateTime } from "luxon"; import type { File, ScrapedEpisode } from "#schema"; export interface EpisodeScraperContext { scraper: EpisodeScraper; logger: Logger; } export interface EpisodeMetadata { num: number; padNum: string; } export interface EpisodeScraperEpisodeContext { metadata: Readonly; result: Partial; } export interface EpisodeScraperPlugin { (scraper: EpisodeScraper, opts: T): Promise; } export interface EpisodeScraperEventResult { value?: T; } export interface EpisodeScraperEvents { init: [EpisodeScraperContext]; scrapeEpisodeStart: EpisodeScraperEventArgs; scrapeEpisodeEnd: EpisodeScraperEventArgs; scrapeEpisodeError: EpisodeScraperValueEventArgs>; preScrapeName: EpisodeScraperEventArgs; scrapeName: EpisodeScraperValueEventArgs; postScrapeName: EpisodeScraperEventArgs; preScrapeSortName: EpisodeScraperEventArgs; scrapeSortName: EpisodeScraperValueEventArgs; postScrapeSortName: EpisodeScraperEventArgs; preScrapeDescription: EpisodeScraperEventArgs; scrapeDescription: EpisodeScraperValueEventArgs; postScrapeDescription: EpisodeScraperEventArgs; preScrapeAirDate: EpisodeScraperEventArgs; scrapeAirDate: EpisodeScraperValueEventArgs>; postScrapeAirDate: EpisodeScraperEventArgs; preScrapeRating: EpisodeScraperEventArgs; scrapeRating: EpisodeScraperValueEventArgs; postScrapeRating: EpisodeScraperEventArgs; preScrapeLanguage: EpisodeScraperEventArgs; scrapeLanguage: EpisodeScraperValueEventArgs; postScrapeLanguage: EpisodeScraperEventArgs; preScrapeCountry: EpisodeScraperEventArgs; scrapeCountry: EpisodeScraperValueEventArgs; postScrapeCountry: EpisodeScraperEventArgs; preScrapeTvSeason: EpisodeScraperEventArgs; scrapeTvSeason: EpisodeScraperValueEventArgs; postScrapeTvSeason: EpisodeScraperEventArgs; preScrapePosters: EpisodeScraperEventArgs; scrapePosters: EpisodeScraperValueEventArgs; postScrapePosters: EpisodeScraperEventArgs; close: [EpisodeScraperContext]; } type KeyOfType = keyof { [P in keyof T as T[P] extends V ? P : never]: any; }; export type EpisodeScraperValueEventArgs = [EpisodeScraperContext, EpisodeScraperEpisodeContext, EpisodeScraperEventResult]; export type EpisodeScraperEventArgs = [EpisodeScraperContext, EpisodeScraperEpisodeContext]; export type EpisodeScraperValueEventKeys = KeyOfType>; type ValueEventValue = T extends EpisodeScraperValueEventArgs ? K : never; export type EpisodeScraperValueEventValue = ValueEventValue; export interface EpisodeScraperOptions { logger: Logger; } export declare class EpisodeScraper extends AsyncEventEmitter { private readonly logger; constructor(opts: EpisodeScraperOptions); register(plugin: EpisodeScraperPlugin, opts: T): Promise; scrape(fromEp: number, toEp: number, parallelLimit?: number): Promise<(LoggableError | ScrapedEpisode)[]>; private scrapeEpisode; emitValue(event: T, ctx: EpisodeScraperContext, epCtx: EpisodeScraperEpisodeContext): Promise | undefined>; private scrapeValue; } export {};