-import * as videojs from 'video.js'
-import { VideoFile } from '../../../../shared/models/videos/video.model'
-import { PeerTubePlugin } from './peertube-videojs-plugin'
+import { HlsConfig, Level } from 'hls.js'
+import videojs from 'video.js'
+import { VideoFile, VideoPlaylist, VideoPlaylistElement } from '@shared/models'
+import { P2pMediaLoaderPlugin } from './p2p-media-loader/p2p-media-loader-plugin'
+import { RedundancyUrlManager } from './p2p-media-loader/redundancy-url-manager'
+import { PlayerMode } from './peertube-player-manager'
+import { PeerTubePlugin } from './peertube-plugin'
+import { PeerTubeResolutionsPlugin } from './peertube-resolutions-plugin'
+import { PlaylistPlugin } from './playlist/playlist-plugin'
+import { StatsCardOptions } from './stats/stats-card'
+import { StatsForNerdsPlugin } from './stats/stats-plugin'
+import { EndCardOptions } from './upnext/end-card'
+import { WebTorrentPlugin } from './webtorrent/webtorrent-plugin'
declare module 'video.js' {
- interface Player {
+
+ export interface VideoJsPlayer {
+ srOptions_: HlsjsConfigHandlerOptions
+
+ theaterEnabled: boolean
+
+ // FIXME: add it to upstream typings
+ posterImage: {
+ show (): void
+ hide (): void
+ }
+
+ handleTechSeeked_ (): void
+
+ // Plugins
+
peertube (): PeerTubePlugin
+
+ webtorrent (): WebTorrentPlugin
+
+ p2pMediaLoader (): P2pMediaLoaderPlugin
+
+ peertubeResolutions (): PeerTubeResolutionsPlugin
+
+ contextmenuUI (options: any): any
+
+ bezels (): void
+
+ stats (options?: StatsCardOptions): StatsForNerdsPlugin
+
+ textTracks (): TextTrackList & {
+ tracks_: (TextTrack & { id: string, label: string, src: string })[]
+ }
+
+ dock (options: { title: string, description: string }): void
+
+ upnext (options: Partial<EndCardOptions>): void
+
+ playlist (): PlaylistPlugin
}
}
-interface VideoJSComponentInterface {
- _player: videojs.Player
+export interface VideoJSTechHLS extends videojs.Tech {
+ hlsProvider: any // FIXME: typings
+}
- new (player: videojs.Player, options?: any)
+export interface HlsjsConfigHandlerOptions {
+ hlsjsConfig?: HlsConfig & { cueHandler: any }// FIXME: typings
+ captionConfig?: any // FIXME: typings
- registerComponent (name: string, obj: any)
+ levelLabelHandler?: (level: Level) => string
}
-type PeertubePluginOptions = {
- videoFiles: VideoFile[]
- playerElement: HTMLVideoElement
+type PeerTubeResolution = {
+ id: number
+
+ height?: number
+ label?: string
+ width?: number
+ bitrate?: number
+
+ selected: boolean
+ selectCallback: () => void
+}
+
+type VideoJSCaption = {
+ label: string
+ language: string
+ src: string
+}
+
+type UserWatching = {
+ url: string
+ authorizationHeader: string
+}
+
+type PeerTubePluginOptions = {
+ mode: PlayerMode
+
+ autoplay: boolean
videoViewUrl: string
videoDuration: number
- startTime: number
+
+ userWatching?: UserWatching
+ subtitle?: string
+
+ videoCaptions: VideoJSCaption[]
+
+ stopTime: number | string
+
+ isLive: boolean
+
+ videoUUID: string
+}
+
+type PlaylistPluginOptions = {
+ elements: VideoPlaylistElement[]
+
+ playlist: VideoPlaylist
+
+ getCurrentPosition: () => number
+
+ onItemClicked: (element: VideoPlaylistElement) => void
+}
+
+type NextPreviousVideoButtonOptions = {
+ type: 'next' | 'previous'
+ handler: () => void
+ isDisabled: () => boolean
+}
+
+type PeerTubeLinkButtonOptions = {
+ shortUUID: string
+}
+
+type WebtorrentPluginOptions = {
+ playerElement: HTMLVideoElement
+
autoplay: boolean
+ videoDuration: number
+
+ videoFiles: VideoFile[]
+
+ startTime: number | string
}
-// videojs typings don't have some method we need
-const videojsUntyped = videojs as any
+type P2PMediaLoaderPluginOptions = {
+ redundancyUrlManager: RedundancyUrlManager
+ type: string
+ src: string
+
+ startTime: number | string
+}
+
+type VideoJSPluginOptions = {
+ playlist?: PlaylistPluginOptions
+
+ peertube: PeerTubePluginOptions
+
+ webtorrent?: WebtorrentPluginOptions
+
+ p2pMediaLoader?: P2PMediaLoaderPluginOptions
+}
+
+type LoadedQualityData = {
+ qualitySwitchCallback: (resolutionId: number, type: 'video') => void
+ qualityData: {
+ video: {
+ id: number
+ label: string
+ selected: boolean
+ }[]
+ }
+}
+
+type ResolutionUpdateData = {
+ auto: boolean
+ resolutionId: number
+ id?: number
+}
+
+type AutoResolutionUpdateData = {
+ possible: boolean
+}
+
+type PlayerNetworkInfo = {
+ source: 'webtorrent' | 'p2p-media-loader'
+
+ http: {
+ downloadSpeed: number
+ uploadSpeed: number
+ downloaded: number
+ uploaded: number
+ }
+
+ p2p: {
+ downloadSpeed: number
+ uploadSpeed: number
+ downloaded: number
+ uploaded: number
+ numPeers: number
+ }
+
+ // In bytes
+ bandwidthEstimate: number
+}
+
+type PlaylistItemOptions = {
+ element: VideoPlaylistElement
+
+ onClicked: () => void
+}
export {
- VideoJSComponentInterface,
- PeertubePluginOptions,
- videojsUntyped
+ PlayerNetworkInfo,
+ PlaylistItemOptions,
+ NextPreviousVideoButtonOptions,
+ ResolutionUpdateData,
+ AutoResolutionUpdateData,
+ PlaylistPluginOptions,
+ VideoJSCaption,
+ UserWatching,
+ PeerTubePluginOptions,
+ WebtorrentPluginOptions,
+ P2PMediaLoaderPluginOptions,
+ PeerTubeResolution,
+ VideoJSPluginOptions,
+ LoadedQualityData,
+ PeerTubeLinkButtonOptions
}