- customKeys: {
- increasePlaybackRateKey: {
- key: function (event: KeyboardEvent) {
- return event.key === '>'
- },
- handler: function (player: videojs.Player) {
- player.playbackRate((player.playbackRate() + 0.1).toFixed(2))
- }
- },
- decreasePlaybackRateKey: {
- key: function (event: KeyboardEvent) {
- return event.key === '<'
- },
- handler: function (player: videojs.Player) {
- player.playbackRate((player.playbackRate() - 0.1).toFixed(2))
- }
- },
- frameByFrame: {
- key: function (event: KeyboardEvent) {
- return event.key === '.'
- },
- handler: function (player: videojs.Player) {
- player.pause()
- // Calculate movement distance (assuming 30 fps)
- const dist = 1 / 30
- player.currentTime(player.currentTime() + dist)
- }
- }
- }
+ private static addP2PMediaLoaderOptions (
+ plugins: VideoJSPluginOptions,
+ options: PeertubePlayerManagerOptions,
+ p2pMediaLoaderModule: any
+ ) {
+ const p2pMediaLoaderOptions = options.p2pMediaLoader
+ const commonOptions = options.common
+
+ const trackerAnnounce = p2pMediaLoaderOptions.trackerAnnounce
+ .filter(t => t.startsWith('ws'))
+
+ const redundancyUrlManager = new RedundancyUrlManager(options.p2pMediaLoader.redundancyBaseUrls)
+
+ const p2pMediaLoader: P2PMediaLoaderPluginOptions = {
+ redundancyUrlManager,
+ type: 'application/x-mpegURL',
+ startTime: commonOptions.startTime,
+ src: p2pMediaLoaderOptions.playlistUrl
+ }
+
+ let consumeOnly = false
+ // FIXME: typings
+ if (navigator && (navigator as any).connection && (navigator as any).connection.type === 'cellular') {
+ console.log('We are on a cellular connection: disabling seeding.')
+ consumeOnly = true
+ }
+
+ const p2pMediaLoaderConfig = {
+ loader: {
+ trackerAnnounce,
+ segmentValidator: segmentValidatorFactory(options.p2pMediaLoader.segmentsSha256Url),
+ rtcConfig: getRtcConfig(),
+ requiredSegmentsPriority: 5,
+ segmentUrlBuilder: segmentUrlBuilderFactory(redundancyUrlManager),
+ useP2P: getStoredP2PEnabled(),
+ consumeOnly
+ },
+ segments: {
+ swarmId: p2pMediaLoaderOptions.playlistUrl
+ }
+ }
+ const hlsjs = {
+ levelLabelHandler: (level: { height: number, width: number }) => {
+ const resolution = Math.min(level.height || 0, level.width || 0)
+
+ const file = p2pMediaLoaderOptions.videoFiles.find(f => f.resolution.id === resolution)
+ if (!file) {
+ console.error('Cannot find video file for level %d.', level.height)
+ return level.height