UNPKG

@asicupv/paella-core

Version:
838 lines (670 loc) 27.7 kB
declare module "@asicupv/paella-core" { export type PluginConfig = Record<string, unknown> & { enabled?: boolean; order?: number; }; export class PlayerResource { constructor(player: Paella); get player(): Paella; } export class Plugin extends PlayerResource { constructor(player: Paella, name: string); getPluginModuleInstance(): PluginModule; get config(): PluginConfig; get type(): string; get order(): number | null; get description(): string; get name(): string; isEnabled(): Promise<boolean>; load(): Promise<void>; unload(): Promise<void>; } export type PluginHelpData = { title: string; description?: string; }; export type Language = "aa" | "ab" | "ae" | "af" | "ak" | "am" | "an" | "ar" | "as" | "av" | "ay" | "az" | "ba" | "be" | "bg" | "bh" | "bi" | "bm" | "bn" | "bo" | "br" | "bs" | "ca" | "ce" | "ch" | "co" | "cr" | "cs" | "cu" | "cv" | "cy" | "da" | "de" | "dv" | "dz" | "ee" | "el" | "en" | "eo" | "es" | "et" | "eu" | "fa" | "ff" | "fi" | "fj" | "fo" | "fr" | "fy" | "ga" | "gd" | "gl" | "gn" | "gu" | "gv" | "ha" | "he" | "hi" | "ho" | "hr" | "ht" | "hu" | "hy" | "hz" | "ia" | "id" | "ie" | "ig" | "ii" | "ik" | "io" | "is" | "it" | "iu" | "ja" | "jv" | "ka" | "kg" | "ki" | "kj" | "kk" | "kl" | "km" | "kn" | "ko" | "kr" | "ks" | "ku" | "kv" | "kw" | "ky" | "la" | "lb" | "lg" | "li" | "ln" | "lo" | "lt" | "lu" | "lv" | "mg" | "mh" | "mi" | "mk" | "ml" | "mn" | "mr" | "ms" | "mt" | "my" | "na" | "nb" | "nd" | "ne" | "ng" | "nl" | "nn" | "no" | "nr" | "nv" | "ny" | "oc" | "oj" | "om" | "or" | "os" | "pa" | "pi" | "pl" | "ps" | "pt" | "qu" | "rm" | "rn" | "ro" | "ru" | "rw" | "sa" | "sc" | "sd" | "se" | "sg" | "si" | "sk" | "sl" | "sm" | "sn" | "so" | "sq" | "sr" | "ss" | "st" | "su" | "sv" | "sw" | "ta" | "te" | "tg" | "th" | "ti" | "tk" | "tl" | "tn" | "to" | "tr" | "ts" | "tt" | "tw" | "ty" | "ug" | "uk" | "ur" | "uz" | "ve" | "vi" | "vo" | "wa" | "wo" | "xh" | "yi" | "yo" | "za" | "zh" | "zu"; export type Dictionary = Record<string, string>; export type Dictionaries = Partial<Record<Language, Dictionary>>; export class UserInterfacePlugin extends Plugin { getHelp(): Promise<PluginHelpData | null>; getTranslatedHelp(): Promise<PluginHelpData | null>; getDictionaries(): Promise<Dictionaries>; } export class VideoLayout extends UserInterfacePlugin { get type(): string; get layoutType(): string; get tabIndexStart(): number; get identifier(): string; get icon(): string; // get validContent():; get validContentIds(): string[]; public getValidContentIds(streamData: Stream): string[]; public getValidStreams(streamData: Stream): Stream[]; public getLayoutStructure(streamData: Stream[], contentId: string, mainContent: any): VideoLayoutStructure; // public getVideoCanvasButtons(content, video, videoCanvas): any[]; } export interface VideoLayoutStructure { hidden: boolean; videos: Array<{ content: string; visible: boolean; size: number; }>; } export class ButtonPlugin extends UserInterfacePlugin { get interactive(): boolean; get dynamicWidth(): boolean; getId(): string | null; getButtonName(): string | null; getAriaLabel(): string | null; getDescription(): string | null; getMinContainerSize(): number | null; icon: string | null; get haveIcon(): boolean; menuIcon: string | null; get haveMenuIcon(): boolean; get titleSize(): "small" | "medium" | "large"; get side(): ButtonPluginSide; get parentContainer(): string | null; enable(): void; disable(): void; hide(): void; show(): void; readonly hidden: boolean; setState({ text, icon,} : { text: string | null, icon: string | null}): void; focus(): void; blur(): void; isFocus(): boolean; action(): Promise<void>; } export class CanvasButtonPlugin extends UserInterfacePlugin { get content(): string[]; get ariaLabel() : string | null; getAriaLabel() : string | null; get description(): string; getDescription() : string; get icon() : string | null; set icon(icon); get side() : "left" | "center" | "right"; get buttonName() : string | null; get position() : "left" | "center" | "right"; action(content) : Promise<void>; get targetContent() : string | null; } export class Canvas { loadCanvas(player: Paella) : Promise<void>; get userArea() : HTMLElement; get buttonsArea() : HTMLElement; showButtons(); hideButtons(); } export class CanvasPlugin extends Plugin { get canvasType() : string; isCompatible(stream: any) : boolean; getCanvasInstance(videoContainer: Paella) : Promise<Canvas>; } export class PopUpButtonPlugin extends ButtonPlugin { getContent(): Promise<HTMLElement> get popUpType(): "modal" | "timeline"; showPopUp(): Promise<void>; } export class MenuButtonPlugin extends PopUpButtonPlugin { get menuTitle(): string | null getMenu(): Promise<{ id: string | number title: string icon?: string iconText?: string showTitle?: boolean stateText?: string stateIcon?: string selected?: boolean data?: any }[]> closeMenu(): void } export class ButtonGroupPlugin extends MenuButtonPlugin { get groupName(): string; // Note: This functions returns an empty array if the menu has never been displayed get buttons(): HTMLButtonElement[]; get buttonPlugins() :ButtonPlugin[]; getButtons(): Promise<HTMLButtonElement[]>; getButtonPlugins(): Promise<ButtonPlugin[]>; getVisibleButtonPlugins(): Promise<ButtonPlugin[]>; } export class EventLogPlugin extends Plugin { get events(): EventName[] onEvent(event: EventName, params: object) } export class DataPlugin extends Plugin { get context(): string | string[] read(context: string, key: string): Promise<any> write(context: string, key: string, data: any): Promise<void> remove(context: string, key: string): Promise<void> } export class VideoPlugin extends Plugin { get streamType(): string isCompatible(streamData: Stream): Promise<boolean> getVideoInstance(playerContainer: any, isMainAudio: boolean): Promise<any> getCompatibleFileExtensions(): string[] } export type LogLevel = "DISABLED" | "ERROR" | "WARN" | "INFO" | "DEBUG" | "VERBOSE"; export type DynamicLayoutAlignment = "align-center" | "align-top" | "align-bottom" | "align-left" | "align-right"; export type ButtonPluginSide = "left" | "right"; export interface Config { /** Default video ID to be used when one is not specified explicitly */ fallbackId: string; /** Default directory with the manifest video repository */ repositoryUrl: string; /** Default manifest file name */ manifestFileName: string; /** Default layout to be used when one has not yet been configured. */ defaultLayout: string; /** Default translation language for text strings, when no translations are available for the current language. */ defaultLanguage: string; /** Default preview image, which is used when one has not been specified in the video manifest. */ defaultVideoPreview: string; /** Default preview image for the portrait mode, which is used when one has not been specified in the video manifest. */ defaultVideoPreviewPortrait: string; /** Log level to use */ logLevel: LogLevel; /** General user interface settings */ ui: { /** Timeout to hide the interface, from when the user stops interacting with the player. */ hideUITimer: number; /** Hide the interface when the mouse leaves the video area */ hideOnMouseLeave: boolean; }; /** Preference storage settings */ preferences: { /** Storage type to use for the preferences. */ currentSource: string; /** Storage types */ sources: { /** Store settings in cookies */ cookie?: { /** Consent type used to store the settings (see Cookie Consent settings) */ consentType: string; }, /** Store settings using a Data plugin */ dataPlugin?: { /** Context of the data plugin to use */ context: string; name: string; }; } }; /** Video container settings */ videoContainer: { /** Place the video container above or below the playback bar. */ overPlaybackBar: boolean; /** Restore the playback rate setting in the next player load */ restorePlaybackRate: boolean; /** Restore the volume setting in the next player load */ restoreVolume: boolean; /** Restore the video layout in the next load of the current video */ restoreVideoLayout: { /** Enable or disable this setting */ enabled: boolean; /** If global=false, then the layout is only restored the next load of the current video */ global: boolean; } restoreLastTime: { /** Enable or disable this setting */ enabled: boolean; /** Remaining video time after which the last known instant of playback will not be restored */ remainingSeconds: number; }; /** Alignment of the video canvas in dynamic layout mode */ dynamicLayout: { landscapeVerticalAlignment: DynamicLayoutAlignment; portraitHorizontalAlignment: DynamicLayoutAlignment; } }; /** Button groups */ buttonGroups: { /** Enable or disable the button group */ enabled: boolean; /** Button group name. This name will be used in the child buttons as `parentContainer` attribute */ groupName: string; /** Button group description */ description: string; /** Button group icon */ icon: string; /** Loading order */ order: number; /** Button group position */ side: ButtonPluginSide; /** Parent button group name */ parentContainer: string; /** Title used in the menu title bar */ menuTitle: string; }[]; /** Cookie consent options */ cookieConsent: { /** Type of the cookie consent, for example `analytical` */ type: string; /** Human readable name of the cookie consent, for example 'Analytical Cookies' */ title: string; /** Description of the cookie consent, for example 'Cookies used to analyze the user behavior' */ description: string; /** Is this cookie group required for the website to work? */ required: boolean; /** Is enabled by default? */ value: boolean; }[]; plugins: Record<string, PluginConfig>; } export interface Transcription { index: number; preview: string; time: number; text: string; duration: number; } export interface Frame { id: string; time: number, mimetype: string, url: string, thumb: string } export interface FrameList { targetContent: string; frames: Frame[]; } export interface Source { src: string; // Currently unused... mimetype: string; res?: { w: number; h: number; }; } export interface Stream { content: string; role?: "mainAudio"; sources: { html?: Source[]; mp4?: Source[]; hls?: Source[]; hlsLive?: Source[]; }; } export interface CaptionManifestItem { id: string, format: string; url: string; lang: string; text: string; } export interface Manifest { metadata: { duration?: number; title?: string; preview?: string; } & Record<string, unknown>; streams: Stream[]; captions?: CaptionManifestItem[]; frameList?: FrameList; transcriptions?: Transcription[]; } export interface PluginRef { plugin: typeof Plugin; config: PluginConfig; } export interface InitParams { configResourcesUrl?: string; configUrl?: string; repositoryUrl?: string; manifestFileName?: string; loadConfig?: (configUrl: string, player: Paella) => Promise<Config>; getVideoId?: (config: Config, player: Paella) => Promise<string | null>; getManifestUrl?: (repoUrl: string, videoId: string) => Promise<string>; getManifestFileUrl?: (manifestUrl: string, manifestFileName: string) => Promise<string>; loadVideoManifest?: (manifestUrl: string, config: Config, player: Paella) => Promise<Manifest>; getCookieConsentFunction?: (type: string) => boolean; plugins?: (PluginRef | Plugin)[]; } export interface Log { setLevel(level: LogLevel | number): void; currentLevel(): number; error(msg: string, context?: string | null): void; warn(msg: string, context?: string | null): void; info(msg: string, context?: string | null): void; debug(msg: string, context?: string | null): void; verbose(msg: string, context?: string | null): void; } export class PluginModule { get moduleName(): string; get moduleVersion(): string; async getDictionaries(): Promise<Dictionaries>; } export interface Preferences { set(key: string, value: any, options?: { global?: boolean }): Promise<void>; get(key: string, options?: { global?: boolean }): Promise<any>; } export const Events: Readonly<{ PLAY: "paella:play"; PAUSE: "paella:pause"; STOP: "paella:stop"; ENDED: "paella:ended"; SEEK: "paella:seek"; FULLSCREEN_CHANGED: "paella:fullscreenchanged"; ENTER_FULLSCREEN: "paella:enterfullscreen"; EXIT_FULLSCREEN: "paella:exitfullscreen"; VOLUME_CHANGED: "paella:volumeChanged"; TIMEUPDATE: "paella:timeupdate"; TRIMMING_CHANGED: "paella:trimmingChanged"; CAPTIONS_CHANGED: "paella:captionsChanged"; CAPTIONS_ENABLED: "paella:captionsEnabled"; CAPTIONS_DISABLED: "paella:captionsDisabled"; BUTTON_PRESS: "paella:buttonPress"; SHOW_POPUP: "paella:showPopUp"; HIDE_POPUP: "paella:hidePopUp"; MANIFEST_LOADED: "paella:manifestLoaded"; STREAM_LOADED: "paella:streamLoaded"; PLAYER_LOADED: "paella:playerLoaded"; PLAYER_UNLOADED: "paella:playerUnloaded"; RESIZE: "paella:resize"; RESIZE_END: "paella:resizeEnd"; LAYOUT_CHANGED: "paella:layoutChanged"; PLAYBACK_RATE_CHANGED: "paella:playbackRateChanged"; VIDEO_QUALITY_CHANGED: "paella:videoQualityChanged"; HIDE_UI: "paella:hideUI"; SHOW_UI: "paella:showUI"; COOKIE_CONSENT_CHANGED: "paella:cookieConsentChanged"; LOG: "paella:log"; }>; type Events = typeof Events; type EventName = typeof Events[keyof typeof Events]; export const PlayerState: Readonly<{ UNLOADED: 0; LOADING_MANIFEST: 1; MANIFEST: 2; LOADING_PLAYER: 3; LOADED: 4; UNLOADING_MANIFEST: 5; UNLOADING_PLAYER: 6; ERROR: 7; }>; type PlayerState = typeof PlayerState; export type PlayerStateNames = [ "UNLOADED", "LOADING_MANIFEST", "MANIFEST", "LOADING_PLAYER", "LOADED", "UNLOADING_MANIFEST", "UNLOADING_PLAYER", "ERROR" ] type DeepPartial<T> = { [P in keyof T]?: T[P] extends object ? T[P] extends Function ? T[P] : DeepPartial<T[P]> : T[P]; }; export interface SkinThemeIcon { plugin: string; identifier: string; icon: string; } export interface SkinTheme { styleSheets?: string[]; configOverrides?: DeepPartial<Config>; icons?: SkinThemeIcon[]; } export interface Skin { loadSkin(skinParam: string | SkinTheme): Promise<void>; unloadSkin(): void; } export interface CookieConsent { updateConsentData(): void; getConsentForType(type: string): boolean; } export interface Data { read(context: string, key: string): Promise<any>; write(context: string, key: string, data: any): Promise<void>; remove(context: string, key: string): Promise<void>; } export interface StreamPlayer { readonly isEnabled: boolean; readonly isMainAudioPlayer: boolean; readonly isVisible: boolean; } export interface StreamProperties { readonly isMainAudio: boolean; readonly player: StreamPlayer; readonly stream: Stream; } export interface AudioTrack { readonly groupId: string; readonly id: number; readonly language: string; readonly name: string; readonly selected: boolean; } export interface StreamQuality { readonly bitrate: number; readonly index: number; readonly isAuto: boolean; readonly label: string; readonly shortLabel: string; } export interface TrimmingParams { enabled?: boolean; start?: number; end?: number; } export interface StreamProvider { // Properties readonly streamData: Stream[]; readonly streams: Record<string, StreamProperties>; readonly players: StreamPlayer[]; readonly mainAudioPlayer: any; readonly isTrimEnabled: boolean; readonly trimStart: number; readonly trimEnd: number; readonly isLiveStream: boolean; readonly currentAudioTrack: AudioTrack | null; // Basic playback control play(): Promise<any>; pause(): Promise<any>; stop(): Promise<void>; paused(): Promise<boolean>; setCurrentTime(t: number): Promise<{result: any, prevTime: number, newTime: number}>; currentTime(): Promise<number>; currentTimeIgnoringTrimming(): Promise<number>; volume(): Promise<number>; setVolume(v: number): Promise<any>; duration(): Promise<number>; durationIgnoringTrimming(): Promise<number>; playbackRate(): Promise<number>; setPlaybackRate(rate: number): Promise<any>; // Trimming setTrimming(options: TrimmingParams): Promise<void>; // Quality control getQualityReferencePlayer(): Promise<StreamPlayer>; getCurrentQuality(): Promise<StreamQuality>; getQualities(): Promise<StreamQuality[]>; setQuality(quality: StreamQuality): Promise<void>; // Audio tracks supportsMultiaudio(): Promise<boolean>; getAudioTracks(): Promise<AudioTrack[]>; setCurrentAudioTrack(track: AudioTrack): Promise<void>; } export interface VideoContainer { // Properties readonly streamProvider: StreamProvider; readonly streamData: any[]; readonly layoutId: string; readonly validContentIds: string[]; readonly validLayouts: any[]; readonly ready: boolean; readonly isTrimEnabled: boolean; readonly trimStart: number; readonly trimEnd: number; readonly layoutButtons: HTMLButtonElement[]; readonly layoutButtonPlugins: CanvasButtonPlugin[]; // Methods setLayout(layoutId: string): Promise<boolean>; // Video control play(): Promise<any>; pause(): Promise<any>; stop(): Promise<void>; paused(): Promise<boolean>; setCurrentTime(t: number): Promise<any>; currentTime(): Promise<number>; volume(): Promise<number>; setVolume(v: number): Promise<any>; duration(): Promise<number>; playbackRate(): Promise<number>; setPlaybackRate(r: number): Promise<any>; setTrimming(options: TrimmingParams): Promise<any>; // UI related showUserInterface(): void; hideUserInterface(): void; // Layout getVideoRect(target?: string | number | null): { x: number, y: number, width: number, height: number, element: HTMLElement } | null; appendChild(element: HTMLElement, rect?: { x: number, y: number, width: number, height: number } | null, zIndex?: number): HTMLElement; removeChild(element: HTMLElement): void; } export interface CaptionCue { readonly start: number; readonly end: number; readonly captions: string[]; } export type AddCueParams = { label: string start: number end: number captions: string | string[] } export interface Caption { readonly cues: CaptionCue[]; label: string; language: string; addCue(params : AddCueParams): void; getCue(instant: number): CaptionCue | null; } export type CaptionSearchOptions = { label?: string index?: number lang?: string } export interface CaptionsCanvas { addCaptions(captions: Caption): void; getCaptions(params : CaptionSearchOptions): Caption | null; enableCaptions(searchOptions: CaptionSearchOptions): void; disableCaptions(): void; readonly captions: Caption[]; readonly currentCaptions: Caption | null; } export interface PlaybackBar { getButtonPlugins(): ButtonPlugin[]; getVisibleButtonPlugins(): ButtonPlugin[]; } export class Paella { public constructor(node: string | HTMLElement, options?: InitParams); // Version and status readonly version: string; readonly ready: boolean; readonly state: number; readonly stateText: string; readonly playerLoaded: boolean; readonly configLoaded: boolean; readonly videoManifestLoaded: boolean; readonly videoLoaded: boolean; readonly isFullscreen: boolean; // Key components and managers readonly log: Log; readonly pluginModules: PluginModule[]; readonly preferences: Preferences; readonly skin: Skin; readonly Events: Events; readonly PlayerState: PlayerState; readonly PlayerStateNames: PlayerStateNames; readonly cookieConsent: CookieConsent; readonly data: Data; // Container and UI related readonly containerSize: { w: number, h: number }; readonly containsFocus: boolean; readonly hideUiTime: number; readonly videoContainer: VideoContainer; readonly captionsCanvas: CaptionsCanvas; readonly playbackBar: PlaybackBar; // Configuration related readonly initParams: InitParams; readonly config: Config; readonly configUrl: string; readonly configResourcesUrl: string; // Video and manifest related readonly videoId: string; readonly manifestUrl: string; readonly manifestFileName: string; readonly manifestFileUrl: string; readonly videoManifest: Manifest; readonly repositoryUrl: string; readonly defaultVideoPreview: string; readonly defaultVideoPreviewPortrait: string; // Manifest data getters readonly metadata: Record<string, any>; readonly streams: Stream[]; readonly frameList: FrameList; readonly captions: Caption[]; readonly trimming: { start?: number, end?: number, enabled?: boolean }; readonly visibleTimeLine: boolean; // Methods translate(word: string, keys?: Record<string, any> | null): string; setLanguage(lang: string): void; getLanguage(): string; addDictionary(lang: string, dict: Dictionary): void; getDictionaries(): Dictionaries; getDefaultLanguage(): string; bindEvent(eventName: string, fn: (eventParams: Record<string, any>) => void, unregisterOnUnload?: boolean): void; getPlugin(name: string, type?: string | null): Plugin | null; waitState(state: string | number): Promise<void>; // Player control methods loadUrl(url: string | string[], options?: { title?: string, duration?: number, preview?: string, previewPortrait?: string }): Promise<void>; loadManifest(): Promise<void>; loadPlayer(): Promise<void>; load(): Promise<void>; unload(): Promise<void>; destroy(): Promise<void>; unloadManifest(): Promise<void>; unloadPlayer(): Promise<void>; reload(onUnloadFn?: Function | null): Promise<void>; resize(): Promise<void>; hideUserInterface(): Promise<void>; showUserInterface(): Promise<void>; // Playback control methods play(): Promise<void>; pause(): Promise<void>; togglePlay(): Promise<void>; paused(): Promise<boolean>; stop(): Promise<void>; setCurrentTime(t: number): Promise<void>; currentTime(): Promise<number>; volume(): Promise<number>; setVolume(v: number): Promise<void>; duration(): Promise<number>; playbackRate(): Promise<number>; setPlaybackRate(r: number): Promise<void>; skipSeconds(s: number): Promise<void>; rewindSeconds(s: number): Promise<void>; // Fullscreen methods isFullScreenSupported(): boolean; enterFullscreen(): Promise<void>; exitFullscreen(): Promise<void>; // Custom plugin icons addCustomPluginIcon(pluginName: string, iconName: string, svgData: string): void; removeCustomPluginIcon(pluginName: string, iconName: string): void; getCustomPluginIcon(pluginName: string, iconName: string): string | null; } export function createElementWithHtmlText(htmlText:string , parent?: HTMLElement ): HTMLElement; }