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
112 videoViewIntervalMs: number
115 type MetricsPluginOptions = {
121 type PlaylistPluginOptions = {
122 elements: VideoPlaylistElement[]
124 playlist: VideoPlaylist
126 getCurrentPosition: () => number
128 onItemClicked: (element: VideoPlaylistElement) => void
131 type NextPreviousVideoButtonOptions = {
132 type: 'next' | 'previous'
134 isDisabled: () => boolean
137 type PeerTubeLinkButtonOptions = {
142 type PeerTubeP2PInfoButtonOptions = {
146 type WebtorrentPluginOptions = {
147 playerElement: HTMLVideoElement
149 autoplay: videojs.Autoplay
150 videoDuration: number
152 videoFiles: VideoFile[]
154 startTime: number | string
156 playerRefusedP2P: boolean
158 requiresAuth: boolean
159 videoFileToken: () => string
161 buildWebSeedUrls: (file: VideoFile) => string[]
164 type P2PMediaLoaderPluginOptions = {
165 redundancyUrlManager: RedundancyUrlManager
169 startTime: number | string
171 loader: P2PMediaLoader
173 requiresAuth: boolean
174 videoFileToken: () => string
177 export type P2PMediaLoader = {
181 type VideoJSPluginOptions = {
182 playlist?: PlaylistPluginOptions
184 peertube: PeerTubePluginOptions
185 metrics: MetricsPluginOptions
187 webtorrent?: WebtorrentPluginOptions
189 p2pMediaLoader?: P2PMediaLoaderPluginOptions
192 type LoadedQualityData = {
193 qualitySwitchCallback: (resolutionId: number, type: 'video') => void
203 type ResolutionUpdateData = {
209 type AutoResolutionUpdateData = {
213 type PlayerNetworkInfo = {
214 source: 'webtorrent' | 'p2p-media-loader'
217 downloadSpeed: number
222 downloadSpeed: number
230 bandwidthEstimate: number
233 type PlaylistItemOptions = {
234 element: VideoPlaylistElement
236 onClicked: () => void
242 NextPreviousVideoButtonOptions,
243 ResolutionUpdateData,
244 AutoResolutionUpdateData,
245 PlaylistPluginOptions,
246 MetricsPluginOptions,
248 PeerTubePluginOptions,
249 WebtorrentPluginOptions,
250 P2PMediaLoaderPluginOptions,
252 VideoJSPluginOptions,
254 PeerTubeLinkButtonOptions,
255 PeerTubeP2PInfoButtonOptions