1 import { HlsConfig, Level } from 'hls.js'
2 import videojs from 'video.js'
3 import { Engine } from '@peertube/p2p-media-loader-hlsjs'
4 import { VideoFile, VideoPlaylist, VideoPlaylistElement } from '@shared/models'
5 import { PeerTubeDockPluginOptions } from '../shared/dock/peertube-dock-plugin'
6 import { HotkeysOptions } from '../shared/hotkeys/peertube-hotkeys-plugin'
7 import { Html5Hlsjs } from '../shared/p2p-media-loader/hls-plugin'
8 import { P2pMediaLoaderPlugin } from '../shared/p2p-media-loader/p2p-media-loader-plugin'
9 import { RedundancyUrlManager } from '../shared/p2p-media-loader/redundancy-url-manager'
10 import { PeerTubePlugin } from '../shared/peertube/peertube-plugin'
11 import { PlaylistPlugin } from '../shared/playlist/playlist-plugin'
12 import { PeerTubeResolutionsPlugin } from '../shared/resolutions/peertube-resolutions-plugin'
13 import { StatsCardOptions } from '../shared/stats/stats-card'
14 import { StatsForNerdsPlugin } from '../shared/stats/stats-plugin'
15 import { EndCardOptions } from '../shared/upnext/end-card'
16 import { WebTorrentPlugin } from '../shared/webtorrent/webtorrent-plugin'
17 import { PlayerMode } from './manager-options'
19 declare module 'video.js' {
21 export interface VideoJsPlayer {
22 srOptions_: HlsjsConfigHandlerOptions
24 theaterEnabled: boolean
26 // FIXME: add it to upstream typings
32 handleTechSeeked_ (): void
36 peertube (): PeerTubePlugin
38 webtorrent (): WebTorrentPlugin
40 p2pMediaLoader (): P2pMediaLoaderPlugin
42 peertubeResolutions (): PeerTubeResolutionsPlugin
44 contextmenuUI (options: any): any
47 peertubeMobile (): void
48 peerTubeHotkeysPlugin (options?: HotkeysOptions): void
50 stats (options?: StatsCardOptions): StatsForNerdsPlugin
52 textTracks (): TextTrackList & {
53 tracks_: (TextTrack & { id: string, label: string, src: string })[]
56 peertubeDock (options: PeerTubeDockPluginOptions): void
58 upnext (options: Partial<EndCardOptions>): void
60 playlist (): PlaylistPlugin
64 export interface VideoJSTechHLS extends videojs.Tech {
65 hlsProvider: Html5Hlsjs
68 export interface HlsjsConfigHandlerOptions {
69 hlsjsConfig?: HlsConfig
71 levelLabelHandler?: (level: Level) => string
74 type PeerTubeResolution = {
83 selectCallback: () => void
86 type VideoJSCaption = {
92 type PeerTubePluginOptions = {
95 autoplay: videojs.Autoplay
99 authorizationHeader?: () => string
103 videoCaptions: VideoJSCaption[]
105 startTime: number | string
106 stopTime: number | string
113 type MetricsPluginOptions = {
119 type PlaylistPluginOptions = {
120 elements: VideoPlaylistElement[]
122 playlist: VideoPlaylist
124 getCurrentPosition: () => number
126 onItemClicked: (element: VideoPlaylistElement) => void
129 type NextPreviousVideoButtonOptions = {
130 type: 'next' | 'previous'
132 isDisabled: () => boolean
135 type PeerTubeLinkButtonOptions = {
140 type PeerTubeP2PInfoButtonOptions = {
144 type WebtorrentPluginOptions = {
145 playerElement: HTMLVideoElement
147 autoplay: videojs.Autoplay
148 videoDuration: number
150 videoFiles: VideoFile[]
152 startTime: number | string
154 playerRefusedP2P: boolean
156 requiresAuth: boolean
157 videoFileToken: () => string
159 buildWebSeedUrls: (file: VideoFile) => string[]
162 type P2PMediaLoaderPluginOptions = {
163 redundancyUrlManager: RedundancyUrlManager
167 startTime: number | string
169 loader: P2PMediaLoader
171 requiresAuth: boolean
172 videoFileToken: () => string
175 export type P2PMediaLoader = {
179 type VideoJSPluginOptions = {
180 playlist?: PlaylistPluginOptions
182 peertube: PeerTubePluginOptions
183 metrics: MetricsPluginOptions
185 webtorrent?: WebtorrentPluginOptions
187 p2pMediaLoader?: P2PMediaLoaderPluginOptions
190 type LoadedQualityData = {
191 qualitySwitchCallback: (resolutionId: number, type: 'video') => void
201 type ResolutionUpdateData = {
207 type AutoResolutionUpdateData = {
211 type PlayerNetworkInfo = {
212 source: 'webtorrent' | 'p2p-media-loader'
215 downloadSpeed: number
220 downloadSpeed: number
228 bandwidthEstimate: number
231 type PlaylistItemOptions = {
232 element: VideoPlaylistElement
234 onClicked: () => void
240 NextPreviousVideoButtonOptions,
241 ResolutionUpdateData,
242 AutoResolutionUpdateData,
243 PlaylistPluginOptions,
244 MetricsPluginOptions,
246 PeerTubePluginOptions,
247 WebtorrentPluginOptions,
248 P2PMediaLoaderPluginOptions,
250 VideoJSPluginOptions,
252 PeerTubeLinkButtonOptions,
253 PeerTubeP2PInfoButtonOptions