UNPKG

epg-grabber

Version:

Node.js CLI tool for grabbing EPG from different sites

720 lines (684 loc) 19.9 kB
import { CacheAxiosResponse, CacheRequestConfig, AxiosCacheInstance } from 'axios-cache-interceptor'; import { Dayjs } from 'dayjs'; import { AxiosResponseHeaders, AxiosRequestConfig } from 'axios'; import xmlJs from 'xml-js'; declare namespace ProgramData { export interface TextObject { value: string lang: string } export interface UrlObject { system: string value: string } export interface ImageObject { type: string size: string orient: string system: string value: string } export interface PersonObject { value: string urls: ProgramData.UrlObject[] images: ProgramData.ImageObject[] } export interface LenghtObject { units: string value: string } export interface EpisodeNumberObject { system: string value: string } export interface VideoObject { present: string colour: string aspect: string quality: string } export interface AudioObject { present: string stereo: string } export interface PreviouslyShownObject { start: string channel: string } export interface SubtitlesObject { type: string language: ProgramData.TextObject[] } export interface IconObject { src: string width: string height: string } export interface RatingObject { system: string icons: ProgramData.IconObject[] value: string } export interface ReviewObject { type: string source: string reviewer: string lang: string value: string } } interface ProgramData { site: string start: number stop: number channel: string titles: ProgramData.TextObject[] subTitles?: ProgramData.TextObject[] descriptions?: ProgramData.TextObject[] date?: number | null categories?: ProgramData.TextObject[] keywords?: ProgramData.TextObject[] languages?: ProgramData.TextObject[] origLanguages?: ProgramData.TextObject[] length?: ProgramData.LenghtObject[] urls?: ProgramData.UrlObject[] countries?: ProgramData.TextObject[] episodeNumbers?: ProgramData.EpisodeNumberObject[] video?: ProgramData.VideoObject | null audio?: ProgramData.AudioObject | null previouslyShown?: ProgramData.PreviouslyShownObject[] premiere?: ProgramData.TextObject[] lastChance?: ProgramData.TextObject[] new?: boolean subtitles?: ProgramData.SubtitlesObject[] ratings?: ProgramData.RatingObject[] starRatings?: ProgramData.RatingObject[] reviews?: ProgramData.ReviewObject[] directors?: ProgramData.PersonObject[] actors?: ProgramData.PersonObject[] writers?: ProgramData.PersonObject[] adapters?: ProgramData.PersonObject[] producers?: ProgramData.PersonObject[] composers?: ProgramData.PersonObject[] editors?: ProgramData.PersonObject[] presenters?: ProgramData.PersonObject[] commentators?: ProgramData.PersonObject[] guests?: ProgramData.PersonObject[] images?: ProgramData.ImageObject[] icons?: ProgramData.IconObject[] } declare namespace ProgramParserResult { type TextObject = ProgramData.TextObject | Partial<ProgramData.TextObject> type PersonObject = { value: string url?: | string | string[] | ProgramData.UrlObject | ProgramData.UrlObject[] | ProgramParserResult.UrlObject | ProgramParserResult.UrlObject[] urls?: | string | string[] | ProgramData.UrlObject | ProgramData.UrlObject[] | ProgramParserResult.UrlObject | ProgramParserResult.UrlObject[] image?: | string | string[] | ProgramData.ImageObject | ProgramData.ImageObject[] | ProgramParserResult.ImageObject | ProgramParserResult.ImageObject[] images?: | string | string[] | ProgramData.ImageObject | ProgramData.ImageObject[] | ProgramParserResult.ImageObject | ProgramParserResult.ImageObject[] } type ImageObject = ProgramData.ImageObject | Partial<ProgramData.ImageObject> type IconObject = | ProgramData.IconObject | Partial<ProgramData.IconObject> | { src: string; width?: number | string | null; height?: number | string | null } type EpisodeNumberObject = | ProgramData.EpisodeNumberObject | Partial<ProgramData.EpisodeNumberObject> type UrlObject = ProgramData.UrlObject | Partial<ProgramData.UrlObject> type LenghtObject = ProgramData.LenghtObject | Partial<ProgramData.LenghtObject> type RatingObject = { system?: string value: string icon?: string | IconObject icons?: string | IconObject } type ReviewObject = ProgramData.ReviewObject | Partial<ProgramData.ReviewObject> type VideoObject = ProgramData.VideoObject | Partial<ProgramData.VideoObject> type AudioObject = ProgramData.AudioObject | Partial<ProgramData.AudioObject> type PreviouslyShownObject = | ProgramData.PreviouslyShownObject | Partial<ProgramData.PreviouslyShownObject> type SubtitlesObject = ProgramData.SubtitlesObject | Partial<ProgramData.SubtitlesObject> } interface ProgramParserResult { start?: string | number | Date | Dayjs | null stop?: string | number | Date | Dayjs | null channel?: string | null title?: | string | string[] | ProgramParserResult.TextObject | ProgramParserResult.TextObject[] | null titles?: | string | string[] | ProgramParserResult.TextObject | ProgramParserResult.TextObject[] | null subTitles?: | string | string[] | ProgramParserResult.TextObject | ProgramParserResult.TextObject[] | null subTitle?: | string | string[] | ProgramParserResult.TextObject | ProgramParserResult.TextObject[] | null sub_titles?: | string | string[] | ProgramParserResult.TextObject | ProgramParserResult.TextObject[] | null sub_title?: | string | string[] | ProgramParserResult.TextObject | ProgramParserResult.TextObject[] | null descriptions?: | string | string[] | ProgramParserResult.TextObject | ProgramParserResult.TextObject[] | null description?: | string | string[] | ProgramParserResult.TextObject | ProgramParserResult.TextObject[] | null desc?: | string | string[] | ProgramParserResult.TextObject | ProgramParserResult.TextObject[] | null date?: string | number | Date | Dayjs | null categories?: | string | string[] | ProgramParserResult.TextObject | ProgramParserResult.TextObject[] | null category?: | string | string[] | ProgramParserResult.TextObject | ProgramParserResult.TextObject[] | null keywords?: | string | string[] | ProgramParserResult.TextObject | ProgramParserResult.TextObject[] | null keyword?: | string | string[] | ProgramParserResult.TextObject | ProgramParserResult.TextObject[] | null languages?: | string | string[] | ProgramParserResult.TextObject | ProgramParserResult.TextObject[] | null language?: | string | string[] | ProgramParserResult.TextObject | ProgramParserResult.TextObject[] | null origLanguages?: | string | string[] | ProgramParserResult.TextObject | ProgramParserResult.TextObject[] | null origLanguage?: | string | string[] | ProgramParserResult.TextObject | ProgramParserResult.TextObject[] | null length?: | string | string[] | ProgramParserResult.LenghtObject | ProgramParserResult.LenghtObject[] | null urls?: string | string[] | ProgramParserResult.UrlObject | ProgramParserResult.UrlObject[] | null url?: string | string[] | ProgramParserResult.UrlObject | ProgramParserResult.UrlObject[] | null countries?: | string | string[] | ProgramParserResult.TextObject | ProgramParserResult.TextObject[] | null country?: | string | string[] | ProgramParserResult.TextObject | ProgramParserResult.TextObject[] | null site?: string | null episodeNumbers?: | ProgramParserResult.EpisodeNumberObject | ProgramParserResult.EpisodeNumberObject[] | null episodeNumber?: | ProgramParserResult.EpisodeNumberObject | ProgramParserResult.EpisodeNumberObject[] | null episodeNum?: | ProgramParserResult.EpisodeNumberObject | ProgramParserResult.EpisodeNumberObject[] | null season?: string | number | null episode?: string | number | null video?: ProgramParserResult.VideoObject | null audio?: ProgramParserResult.AudioObject | null previouslyShown?: | ProgramParserResult.PreviouslyShownObject | ProgramParserResult.PreviouslyShownObject[] | null premiere?: ProgramParserResult.TextObject | null lastChance?: ProgramParserResult.TextObject | null new?: boolean subtitles?: ProgramParserResult.SubtitlesObject | ProgramParserResult.SubtitlesObject[] | null ratings?: | string | string[] | ProgramParserResult.RatingObject | ProgramParserResult.RatingObject[] | null rating?: | string | string[] | ProgramParserResult.RatingObject | ProgramParserResult.RatingObject[] | null starRatings?: | string | string[] | ProgramParserResult.RatingObject | ProgramParserResult.RatingObject[] | null starRating?: | string | string[] | ProgramParserResult.RatingObject | ProgramParserResult.RatingObject[] | null reviews?: ProgramParserResult.ReviewObject | ProgramParserResult.ReviewObject[] | null review?: ProgramParserResult.ReviewObject | ProgramParserResult.ReviewObject[] | null directors?: | string | string[] | ProgramParserResult.PersonObject | ProgramParserResult.PersonObject[] | null director?: | string | string[] | ProgramParserResult.PersonObject | ProgramParserResult.PersonObject[] | null actors?: | string | string[] | ProgramParserResult.PersonObject | ProgramParserResult.PersonObject[] | null actor?: | string | string[] | ProgramParserResult.PersonObject | ProgramParserResult.PersonObject[] | null writers?: | string | string[] | ProgramParserResult.PersonObject | ProgramParserResult.PersonObject[] | null writer?: | string | string[] | ProgramParserResult.PersonObject | ProgramParserResult.PersonObject[] | null adapters?: | string | string[] | ProgramParserResult.PersonObject | ProgramParserResult.PersonObject[] | null adapter?: | string | string[] | ProgramParserResult.PersonObject | ProgramParserResult.PersonObject[] | null producers?: | string | string[] | ProgramParserResult.PersonObject | ProgramParserResult.PersonObject[] | null producer?: | string | string[] | ProgramParserResult.PersonObject | ProgramParserResult.PersonObject[] | null composers?: | string | string[] | ProgramParserResult.PersonObject | ProgramParserResult.PersonObject[] | null composer?: | string | string[] | ProgramParserResult.PersonObject | ProgramParserResult.PersonObject[] | null editors?: | string | string[] | ProgramParserResult.PersonObject | ProgramParserResult.PersonObject[] | null editor?: | string | string[] | ProgramParserResult.PersonObject | ProgramParserResult.PersonObject[] | null presenters?: | string | string[] | ProgramParserResult.PersonObject | ProgramParserResult.PersonObject[] | null presenter?: | string | string[] | ProgramParserResult.PersonObject | ProgramParserResult.PersonObject[] | null commentators?: | string | string[] | ProgramParserResult.PersonObject | ProgramParserResult.PersonObject[] | null commentator?: | string | string[] | ProgramParserResult.PersonObject | ProgramParserResult.PersonObject[] | null guests?: | string | string[] | ProgramParserResult.PersonObject | ProgramParserResult.PersonObject[] | null guest?: | string | string[] | ProgramParserResult.PersonObject | ProgramParserResult.PersonObject[] | null images?: | string | string[] | ProgramParserResult.ImageObject | ProgramParserResult.ImageObject[] | null image?: | string | string[] | ProgramParserResult.ImageObject | ProgramParserResult.ImageObject[] | null icons?: | string | string[] | ProgramParserResult.IconObject | ProgramParserResult.IconObject[] | null icon?: | string | string[] | ProgramParserResult.IconObject | ProgramParserResult.IconObject[] | null } type LoggerOptions = { logLevel?: string; log?: string; }; declare class Logger { #private; constructor(options?: LoggerOptions); info(message: string): void; debug(message: string): void; error(message: string): void; } interface ChannelData { xmltv_id: string name: string site: string site_id: string lang: string | null logo: string | null url: string | null lcn: string | null index: number } declare class Channel { xmltv_id: string; name: string; site: string; site_id: string; lang: string | null; logo: string | null; url: string | null; lcn: string | null; index: number; constructor(data: ChannelData); static fromXmlJsElement(site: string, element: xmlJs.Element, index: number): Channel | undefined; toXML(): string; toObject(): ChannelData; } interface ClientRequestContext { channel: Channel date: Dayjs config: SiteConfig } interface ClientResponse { content: string buffer: Buffer headers: AxiosResponseHeaders | Partial<AxiosResponseHeaders> request: CacheAxiosResponse cached: boolean } type GrabCallback = (context: GrabCallbackContext, error: Error | null) => void interface GrabCallbackContext { channel: Channel programs: Program[] date: Dayjs } type XMLElement = | string | number | { name: string; attrs?: Record<string, string | undefined>; children?: (XMLElement | null)[] } type index_d_ChannelData = ChannelData; type index_d_ClientRequestContext = ClientRequestContext; type index_d_ClientResponse = ClientResponse; type index_d_GrabCallback = GrabCallback; type index_d_GrabCallbackContext = GrabCallbackContext; type index_d_ProgramData = ProgramData; type index_d_ProgramParserResult = ProgramParserResult; type index_d_SiteConfig = SiteConfig; type index_d_SiteConfigOptions = SiteConfigOptions; type index_d_SiteConfigParserContext = SiteConfigParserContext; type index_d_SiteConfigRequestConfig = SiteConfigRequestConfig; type index_d_SiteConfigRequestConfigData = SiteConfigRequestConfigData; type index_d_SiteConfigRequestContext = SiteConfigRequestContext; type index_d_XMLElement = XMLElement; declare namespace index_d { export type { index_d_ChannelData as ChannelData, index_d_ClientRequestContext as ClientRequestContext, index_d_ClientResponse as ClientResponse, index_d_GrabCallback as GrabCallback, index_d_GrabCallbackContext as GrabCallbackContext, index_d_ProgramData as ProgramData, index_d_ProgramParserResult as ProgramParserResult, index_d_SiteConfig as SiteConfig, index_d_SiteConfigOptions as SiteConfigOptions, index_d_SiteConfigParserContext as SiteConfigParserContext, index_d_SiteConfigRequestConfig as SiteConfigRequestConfig, index_d_SiteConfigRequestConfigData as SiteConfigRequestConfigData, index_d_SiteConfigRequestContext as SiteConfigRequestContext, index_d_XMLElement as XMLElement }; } declare class Program { site: string; start: number; stop: number; channel: string; titles: ProgramData.TextObject[]; subTitles: ProgramData.TextObject[]; descriptions: ProgramData.TextObject[]; date: number | null; categories: ProgramData.TextObject[]; keywords: ProgramData.TextObject[]; languages: ProgramData.TextObject[]; origLanguages: ProgramData.TextObject[]; length: ProgramData.LenghtObject[]; urls: ProgramData.UrlObject[]; countries: ProgramData.TextObject[]; episodeNumbers: ProgramData.EpisodeNumberObject[]; video: ProgramData.VideoObject | null; audio: ProgramData.AudioObject | null; previouslyShown: ProgramData.PreviouslyShownObject[]; premiere: ProgramData.TextObject[]; lastChance: ProgramData.TextObject[]; new: boolean; subtitles: ProgramData.SubtitlesObject[]; ratings: ProgramData.RatingObject[]; starRatings: ProgramData.RatingObject[]; reviews: ProgramData.ReviewObject[]; directors: ProgramData.PersonObject[]; actors: ProgramData.PersonObject[]; writers: ProgramData.PersonObject[]; adapters: ProgramData.PersonObject[]; producers: ProgramData.PersonObject[]; composers: ProgramData.PersonObject[]; editors: ProgramData.PersonObject[]; presenters: ProgramData.PersonObject[]; commentators: ProgramData.PersonObject[]; guests: ProgramData.PersonObject[]; images: ProgramData.ImageObject[]; icons: ProgramData.IconObject[]; constructor(data: ProgramData); static fromParserResult(data: ProgramParserResult, channel: Channel): Program; toXML(): string; toObject(): ProgramData; } interface SiteConfigOptions { logger: Logger } interface SiteConfig { site?: string url?: ((context: SiteConfigRequestContext) => string | Promise<string>) | string parser?: ( context: SiteConfigParserContext ) => ProgramParserResult[] | Promise<ProgramParserResult[]> days?: number delay?: number output?: string channels?: string | string[] request?: SiteConfigRequestConfig logo?: ((context: SiteConfigRequestContext) => string | Promise<string>) | string debug?: boolean curl?: boolean maxConnections?: number gzip?: boolean } type SiteConfigRequestConfigData = | ArrayBuffer | ArrayBufferView | Blob | FormData | URLSearchParams | string | Record<string, unknown> | null type SiteConfigRequestConfig = Omit<CacheRequestConfig, 'headers' | 'data'> & { data?: | (( context: SiteConfigRequestContext ) => SiteConfigRequestConfigData | Promise<SiteConfigRequestConfigData>) | SiteConfigRequestConfigData headers?: | (( context: SiteConfigRequestContext ) => Record<string, string> | Promise<Record<string, string>>) | Record<string, string> } interface SiteConfigRequestContext { channel: Channel date: Dayjs } interface SiteConfigParserContext { content?: string buffer?: Buffer headers?: AxiosResponseHeaders | Partial<AxiosResponseHeaders> request?: CacheRequestConfig cached: boolean channel: Channel config: SiteConfig date: Dayjs } declare class Client { instance: AxiosCacheInstance; constructor(); static buildRequest(context: ClientRequestContext): Promise<CacheRequestConfig>; sendRequest(request: AxiosRequestConfig): Promise<ClientResponse>; parseResponse(response: CacheAxiosResponse): ClientResponse; } declare class EPGGrabber { globalConfig: SiteConfig; client: Client; constructor(config?: SiteConfig); loadLogo(channel: Channel, date: string | number | Date | Dayjs | null, config?: SiteConfig): Promise<string | null>; grab(channel: Channel, date: string | number | Date | Dayjs | null, config?: SiteConfig | GrabCallback, callback?: GrabCallback): Promise<Program[]>; static parseChannelsXML(xml: string): Channel[]; static generateXMLTV(channels: Channel[], programs: Program[], headers?: Record<string, string>): string; } declare class EPGGrabberMock extends EPGGrabber { grab(channel: Channel, date: string | number | Date | Dayjs | null, config?: SiteConfig | GrabCallback, callback?: GrabCallback): Promise<Program[]>; } export { Channel, EPGGrabber, EPGGrabberMock, Program, index_d as Types };