-import 'videojs-hotkeys/videojs.hotkeys'
import 'videojs-dock'
-import 'videojs-contextmenu-pt'
-import 'videojs-contrib-quality-levels'
+import '@peertube/videojs-contextmenu'
import './upnext/end-card'
import './upnext/upnext-plugin'
import './stats/stats-card'
import './stats/stats-plugin'
import './bezels/bezels-plugin'
import './peertube-plugin'
+import './peertube-resolutions-plugin'
import './videojs-components/next-previous-video-button'
import './videojs-components/p2p-info-button'
import './videojs-components/peertube-link-button'
import './videojs-components/settings-panel-child'
import './videojs-components/theater-button'
import './playlist/playlist-plugin'
+import './mobile/peertube-mobile-plugin'
+import './mobile/peertube-mobile-buttons'
+import './hotkeys/peertube-hotkeys-plugin'
import videojs from 'video.js'
import { HlsJsEngineSettings } from '@peertube/p2p-media-loader-hlsjs'
import { PluginsManager } from '@root-helpers/plugins-manager'
import { RedundancyUrlManager } from './p2p-media-loader/redundancy-url-manager'
import { segmentUrlBuilderFactory } from './p2p-media-loader/segment-url-builder'
import { segmentValidatorFactory } from './p2p-media-loader/segment-validator'
-import { getAverageBandwidthInStore, getStoredP2PEnabled, saveAverageBandwidth } from './peertube-player-local-storage'
+import { getAverageBandwidthInStore, saveAverageBandwidth } from './peertube-player-local-storage'
import {
NextPreviousVideoButtonOptions,
P2PMediaLoaderPluginOptions,
VideoJSPluginOptions
} from './peertube-videojs-typings'
import { TranslationsManager } from './translations-manager'
-import { buildVideoOrPlaylistEmbed, getRtcConfig, isIOS, isSafari } from './utils'
+import { buildVideoOrPlaylistEmbed, getRtcConfig, isIOS, isMobile, isSafari } from './utils'
// Change 'Playback Rate' to 'Speed' (smaller for our settings menu)
(videojs.getComponent('PlaybackRateMenuButton') as any).prototype.controlText_ = 'Speed'
onPlayerElementChange: (element: HTMLVideoElement) => void
autoplay: boolean
+ p2pEnabled: boolean
nextVideo?: () => void
hasNextVideo?: () => boolean
videoEmbedTitle: options.common.embedTitle
})
+ if (isMobile()) player.peertubeMobile()
+ if (options.common.enableHotkeys === true) player.peerTubeHotkeysPlugin()
+
player.bezels()
+
player.stats({
videoUUID: options.common.videoUUID,
videoIsLive: options.common.isLive,
- mode
+ mode,
+ p2pEnabled: options.common.p2pEnabled
})
player.on('p2pInfo', (_, data: PlayerNetworkInfo) => {
plugins.playlist = commonOptions.playlist
}
- if (commonOptions.enableHotkeys === true) {
- PeertubePlayerManager.addHotkeysOptions(plugins)
- }
-
if (isHLS) {
const { hlsjs } = PeertubePlayerManager.addP2PMediaLoaderOptions(plugins, options, p2pMediaLoaderModule)
controlBar: {
children: this.getControlBarChildren(mode, {
videoShortUUID: commonOptions.videoShortUUID,
+ p2pEnabled: commonOptions.p2pEnabled,
captions: commonOptions.captions,
peertubeLink: commonOptions.peertubeLink,
}
let consumeOnly = false
- // FIXME: typings
- if (navigator && (navigator as any).connection && (navigator as any).connection.type === 'cellular') {
+ if ((navigator as any)?.connection?.type === 'cellular') {
console.log('We are on a cellular connection: disabling seeding.')
consumeOnly = true
}
rtcConfig: getRtcConfig(),
requiredSegmentsPriority: 1,
simultaneousHttpDownloads: 1,
- segmentUrlBuilder: segmentUrlBuilderFactory(redundancyUrlManager),
- useP2P: getStoredP2PEnabled(),
+ segmentUrlBuilder: segmentUrlBuilderFactory(redundancyUrlManager, 1),
+ useP2P: commonOptions.p2pEnabled,
consumeOnly
},
segments: {
const webtorrent = {
autoplay,
+ playerRefusedP2P: commonOptions.p2pEnabled === false,
videoDuration: commonOptions.videoDuration,
playerElement: commonOptions.playerElement,
videoFiles: webtorrentOptions.videoFiles.length !== 0
}
private static getControlBarChildren (mode: PlayerMode, options: {
+ p2pEnabled: boolean
videoShortUUID: string
peertubeLink: boolean
}
},
- p2PInfoButton: {},
+ p2PInfoButton: {
+ p2pEnabled: options.p2pEnabled
+ },
muteToggle: {},
volumeControl: {},
player.contextmenuUI({ content })
}
- private static addHotkeysOptions (plugins: VideoJSPluginOptions) {
- const isNaked = (event: KeyboardEvent, key: string) =>
- (!event.ctrlKey && !event.altKey && !event.metaKey && !event.shiftKey && event.key === key)
-
- Object.assign(plugins, {
- hotkeys: {
- skipInitialFocus: true,
- enableInactiveFocus: false,
- captureDocumentHotkeys: true,
- documentHotkeysFocusElementFilter: (e: HTMLElement) => {
- const tagName = e.tagName.toLowerCase()
- return e.id === 'content' || tagName === 'body' || tagName === 'video'
- },
-
- enableVolumeScroll: false,
- enableModifiersForNumbers: false,
-
- rewindKey: function (event: KeyboardEvent) {
- return isNaked(event, 'ArrowLeft')
- },
-
- forwardKey: function (event: KeyboardEvent) {
- return isNaked(event, 'ArrowRight')
- },
-
- fullscreenKey: function (event: KeyboardEvent) {
- // fullscreen with the f key or Ctrl+Enter
- return isNaked(event, 'f') || (!event.altKey && event.ctrlKey && event.key === 'Enter')
- },
-
- customKeys: {
- increasePlaybackRateKey: {
- key: function (event: KeyboardEvent) {
- return isNaked(event, '>')
- },
- handler: function (player: videojs.Player) {
- const newValue = Math.min(player.playbackRate() + 0.1, 5)
- player.playbackRate(parseFloat(newValue.toFixed(2)))
- }
- },
- decreasePlaybackRateKey: {
- key: function (event: KeyboardEvent) {
- return isNaked(event, '<')
- },
- handler: function (player: videojs.Player) {
- const newValue = Math.max(player.playbackRate() - 0.1, 0.10)
- player.playbackRate(parseFloat(newValue.toFixed(2)))
- }
- },
- frameByFrame: {
- key: function (event: KeyboardEvent) {
- return isNaked(event, '.')
- },
- handler: function (player: videojs.Player) {
- player.pause()
- // Calculate movement distance (assuming 30 fps)
- const dist = 1 / 30
- player.currentTime(player.currentTime() + dist)
- }
- }
- }
- }
- })
- }
-
private static getAutoPlayValue (autoplay: any) {
if (autoplay !== true) return autoplay