diff --git a/types/player-api-events.ts b/types/player-api-events.ts new file mode 100644 index 00000000..af05c82b --- /dev/null +++ b/types/player-api-events.ts @@ -0,0 +1,15 @@ +export interface PlayerAPIEvents { + videodatachange: { + value: Record & { + videoId: string + title: string + author: string + + playlistId: string + isUpcoming: boolean + loading: boolean + + lengthSeconds: number + } + } & ({ name: 'dataloaded' } | { name: 'dataupdated ' }) +} diff --git a/types/video-details.ts b/types/video-details.ts new file mode 100644 index 00000000..97ab3fc3 --- /dev/null +++ b/types/video-details.ts @@ -0,0 +1,25 @@ +export interface VideoDetails { + video_id: string; + author: string; + title: string; + isPlayable: boolean; + errorCode: null; + video_quality: string; + video_quality_features: unknown[]; + list: string; + backgroundable: boolean; + eventId: string; + cpn: string; + isLive: boolean; + isWindowedLive: boolean; + isManifestless: boolean; + allowLiveDvr: boolean; + isListed: boolean; + isMultiChannelAudio: boolean; + hasProgressBarBoundaries: boolean; + isPremiere: boolean; + itct: string; + progressBarStartPositionUtcTimeMillis: number | null; + progressBarEndPositionUtcTimeMillis: number | null; + paidContentOverlayDurationMs: number; +} diff --git a/types/youtube-player.ts b/types/youtube-player.ts index f19a7db9..c46020bb 100644 --- a/types/youtube-player.ts +++ b/types/youtube-player.ts @@ -1,12 +1,14 @@ // TODO: fully type definitions for youtube-player +import { VideoDetails } from './video-details'; import { GetPlayerResponse } from './get-player-response'; +import { PlayerAPIEvents } from './player-api-events'; export interface YoutubePlayer { getInternalApiInterface: (...params: Parameters) => Return; getApiInterface: (...params: Parameters) => Return; - cueVideoByPlayerVars: (...params: Parameters) => Return; - loadVideoByPlayerVars: (...params: Parameters) => Return; + cueVideoByPlayerVars: () => void; + loadVideoByPlayerVars: () => void; preloadVideoByPlayerVars: (...params: Parameters) => Return; getAdState: (...params: Parameters) => Return; sendAbandonmentPing: (...params: Parameters) => Return; @@ -18,7 +20,7 @@ export interface YoutubePlayer { seekToStreamTime: (...params: Parameters) => Return; startSeekCsiAction: (...params: Parameters) => Return; getStreamTimeOffset: (...params: Parameters) => Return; - getVideoData: (...params: Parameters) => Return; + getVideoData: () => VideoDetails; setInlinePreview: (...params: Parameters) => Return; updateDownloadState: (...params: Parameters) => Return; queueOfflineAction: (...params: Parameters) => Return; @@ -95,82 +97,116 @@ export interface YoutubePlayer { setGlobalCrop: (...params: Parameters) => Return; setInternalSize: (...params: Parameters) => Return; seekBy: (seconds: number) => void; - showControls: (...params: Parameters) => Return; - hideControls: (...params: Parameters) => Return; - cancelPlayback: (...params: Parameters) => Return; - getProgressState: (...params: Parameters) => Return; - isInline: (...params: Parameters) => Return; - setInline: (...params: Parameters) => Return; - setLoopVideo: (...params: Parameters) => Return; - getLoopVideo: (...params: Parameters) => Return; - getVideoContentRect: (...params: Parameters) => Return; - getVideoStats: (...params: Parameters) => Return; - getStoryboardFormat: (...params: Parameters) => Return; - toggleFullscreen: (...params: Parameters) => Return; - isFullscreen: (...params: Parameters) => Return; - getPlayerSize: (...params: Parameters) => Return; - toggleSubtitles: (...params: Parameters) => Return; - setCenterCrop: (...params: Parameters) => Return; - setFauxFullscreen: (...params: Parameters) => Return; - setSizeStyle: (...params: Parameters) => Return; - handleGlobalKeyDown: (...params: Parameters) => Return; - handleGlobalKeyUp: (...params: Parameters) => Return; - wakeUpControls: (...params: Parameters) => Return; - cueVideoById: (...params: Parameters) => Return; - loadVideoById: (...params: Parameters) => Return; + showControls: () => void; + hideControls: () => void; + cancelPlayback: () => void; + getProgressState: () => Return; + isInline: () => boolean; + setInline: (isInline: boolean) => void; + setLoopVideo: (value: boolean) => void; + getLoopVideo: () => boolean; + getVideoContentRect: () => Return; + getVideoStats: () => Return; + getStoryboardFormat: () => Return; + toggleFullscreen: () => Return; + isFullscreen: () => boolean; + getPlayerSize: () => Return; + toggleSubtitles: () => void; + setCenterCrop: (param: Parameter) => void; + setFauxFullscreen: (param: Parameter) => void; + setSizeStyle: (params: Parameter) => void; + handleGlobalKeyDown: () => void; + handleGlobalKeyUp: () => void; + wakeUpControls: () => void; + cueVideoById: (videoId: string) => void; + loadVideoById: (videoId: string) => void; cueVideoByUrl: (...params: Parameters) => Return; loadVideoByUrl: (...params: Parameters) => Return; - playVideo: (...params: Parameters) => Return; - pauseVideo: (...params: Parameters) => Return; - stopVideo: (...params: Parameters) => Return; - clearVideo: (...params: Parameters) => Return; - getVideoBytesLoaded: (...params: Parameters) => Return; - getVideoBytesTotal: (...params: Parameters) => Return; - getVideoLoadedFraction: (...params: Parameters) => Return; - getVideoStartBytes: (...params: Parameters) => Return; - cuePlaylist: (...params: Parameters) => Return; - loadPlaylist: (...params: Parameters) => Return; - nextVideo: (...params: Parameters) => Return; - previousVideo: (...params: Parameters) => Return; - playVideoAt: (...params: Parameters) => Return; - setShuffle: (...params: Parameters) => Return; - setLoop: (...params: Parameters) => Return; - getPlaylist: (...params: Parameters) => Return; - getPlaylistIndex: (...params: Parameters) => Return; - getPlaylistId: (...params: Parameters) => Return; - loadModule: (...params: Parameters) => Return; - unloadModule: (...params: Parameters) => Return; + /** + * Note: This doesn't resume playback, it plays from the start. + */ + playVideo: () => void; + pauseVideo: () => void; + stopVideo: () => void; + clearVideo: () => void; + getVideoBytesLoaded: () => number; + getVideoBytesTotal: () => number; + getVideoLoadedFraction: () => number; + getVideoStartBytes: () => number; + cuePlaylist: () => void; + loadPlaylist: () => void; + nextVideo: () => void; + previousVideo: () => void; + playVideoAt: () => void; + setShuffle: (param: Parameter) => void; + setLoop: (param: Parameter) => void; + getPlaylist: () => Return; + getPlaylistIndex: () => number; + getPlaylistId: () => string | undefined; + loadModule: () => void; + unloadModule: () => void; setOption: (optionName: string, key: string, value: T) => void; getOption: (optionName: string, key: string) => T | null | undefined; getOptions: () => string[]; - mute: (...params: Parameters) => Return; - unMute: (...params: Parameters) => Return; - isMuted: (...params: Parameters) => Return; - setVolume: (...params: Parameters) => Return; + mute: () => void; + unMute: () => void; + isMuted: () => boolean; + /** + * @param volume 0-100 + */ + setVolume: (volume: number) => void; getVolume: () => number; seekTo: (seconds: number) => void; - getPlayerMode: (...params: Parameters) => Return; - getPlayerState: (...params: Parameters) => Return; - getAvailablePlaybackRates: (...params: Parameters) => Return; + getPlayerMode: () => Return; + getPlayerState: () => number; + getAvailablePlaybackRates: () => number[]; getPlaybackQuality: () => string; setPlaybackQuality: (quality: string) => void; getAvailableQualityLevels: () => string[]; - getCurrentTime: (...params: Parameters) => Return; - getDuration: (...params: Parameters) => Return; - addEventListener: (...params: Parameters) => Return; - removeEventListener: (...params: Parameters) => Return; - getDebugText: (...params: Parameters) => Return; + /** + * @return float between start and end in seconds + */ + getCurrentTime: () => number; + /** + * @return int song duration in seconds + */ + getDuration: () => number; + addEventListener: ( + type: K, + listener: ( + this: Document, + name: PlayerAPIEvents[K]['name'], + data: PlayerAPIEvents[K]['value'] + ) => void, + options?: boolean | AddEventListenerOptions | undefined, + ) => void; + removeEventListener: ( + type: K, + listener: ( + this: Document, + name: PlayerAPIEvents[K]['name'], + data: PlayerAPIEvents[K]['value'] + ) => void, + options?: boolean | EventListenerOptions | undefined, + ) => void; + getDebugText: () => string; addCueRange: (...params: Parameters) => Return; removeCueRange: (...params: Parameters) => Return; - setSize: (...params: Parameters) => Return; + setSize: (size: { width: number; height: number }) => void; destroy: (...params: Parameters) => Return; - getSphericalProperties: (...params: Parameters) => Return; - setSphericalProperties: (...params: Parameters) => Return; - mutedAutoplay: (...params: Parameters) => Return; - getVideoEmbedCode: (...params: Parameters) => Return; - getVideoUrl: (...params: Parameters) => Return; - getMediaReferenceTime: (...params: Parameters) => Return; - getSize: (...params: Parameters) => Return; + getSphericalProperties: () => Return; + setSphericalProperties: (param: Parameter) => void; + mutedAutoplay: () => void; + /** + * @return string HTMLIFrameElement + */ + getVideoEmbedCode: () => string; + /** + * @return string full URL of the video (include playlist id) + */ + getVideoUrl: () => string; + getMediaReferenceTime: () => number; + getSize: () => { width: number; height: number }; logImaAdEvent: (...params: Parameters) => Return; preloadVideoById: (...params: Parameters) => Return; setAccountLinkState: (...params: Parameters) => Return; @@ -178,11 +214,11 @@ export interface YoutubePlayer { getAvailableQualityData: (...params: Parameters) => Return; setCompositeParam: (...params: Parameters) => Return; getStatsForNerds: (...params: Parameters) => Return; - showVideoInfo: (...params: Parameters) => Return; - hideVideoInfo: (...params: Parameters) => Return; - isVideoInfoVisible: (...params: Parameters) => Return; - getPlaybackRate: (...params: Parameters) => Return; - setPlaybackRate: (...params: Parameters) => Return; + showVideoInfo: () => void; + hideVideoInfo: () => void; + isVideoInfoVisible: () => boolean; + getPlaybackRate: () => number; + setPlaybackRate: (playbackRate: number) => void; updateFullerscreenEduButtonSubtleModeState: (...params: Parameters) => Return; updateFullerscreenEduButtonVisibility: (...params: Parameters) => Return; addEmbedsConversionTrackingParams: (...params: Parameters) => Return;