Don't seed on cellular networks
This commit is contained in:
parent
6f3fe96f40
commit
39aad8cc85
|
@ -85,8 +85,6 @@ export class MarkdownService {
|
||||||
let html = this.markdownParsers[ name ].render(markdown)
|
let html = this.markdownParsers[ name ].render(markdown)
|
||||||
html = this.avoidTruncatedTags(html)
|
html = this.avoidTruncatedTags(html)
|
||||||
|
|
||||||
console.log(html)
|
|
||||||
|
|
||||||
if (config.escape) return this.htmlRenderer.toSafeHtml(html)
|
if (config.escape) return this.htmlRenderer.toSafeHtml(html)
|
||||||
|
|
||||||
return html
|
return html
|
||||||
|
|
|
@ -208,10 +208,8 @@ export class PeertubePlayerManager {
|
||||||
|
|
||||||
private static getVideojsOptions (mode: PlayerMode, options: PeertubePlayerManagerOptions, p2pMediaLoaderModule?: any) {
|
private static getVideojsOptions (mode: PlayerMode, options: PeertubePlayerManagerOptions, p2pMediaLoaderModule?: any) {
|
||||||
const commonOptions = options.common
|
const commonOptions = options.common
|
||||||
const webtorrentOptions = options.webtorrent
|
|
||||||
const p2pMediaLoaderOptions = options.p2pMediaLoader
|
|
||||||
|
|
||||||
let autoplay = options.common.autoplay
|
let autoplay = commonOptions.autoplay
|
||||||
let html5 = {}
|
let html5 = {}
|
||||||
|
|
||||||
const plugins: VideoJSPluginOptions = {
|
const plugins: VideoJSPluginOptions = {
|
||||||
|
@ -227,64 +225,18 @@ export class PeertubePlayerManager {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (commonOptions.enableHotkeys === true) {
|
||||||
|
PeertubePlayerManager.addHotkeysOptions(plugins)
|
||||||
|
}
|
||||||
|
|
||||||
if (mode === 'p2p-media-loader') {
|
if (mode === 'p2p-media-loader') {
|
||||||
const redundancyUrlManager = new RedundancyUrlManager(options.p2pMediaLoader.redundancyBaseUrls)
|
const { streamrootHls } = PeertubePlayerManager.addP2PMediaLoaderOptions(plugins, options, p2pMediaLoaderModule)
|
||||||
|
|
||||||
const p2pMediaLoader: P2PMediaLoaderPluginOptions = {
|
|
||||||
redundancyUrlManager,
|
|
||||||
type: 'application/x-mpegURL',
|
|
||||||
startTime: commonOptions.startTime,
|
|
||||||
src: p2pMediaLoaderOptions.playlistUrl
|
|
||||||
}
|
|
||||||
|
|
||||||
const trackerAnnounce = p2pMediaLoaderOptions.trackerAnnounce
|
|
||||||
.filter(t => t.startsWith('ws'))
|
|
||||||
|
|
||||||
const p2pMediaLoaderConfig = {
|
|
||||||
loader: {
|
|
||||||
trackerAnnounce,
|
|
||||||
segmentValidator: segmentValidatorFactory(options.p2pMediaLoader.segmentsSha256Url),
|
|
||||||
rtcConfig: getRtcConfig(),
|
|
||||||
requiredSegmentsPriority: 5,
|
|
||||||
segmentUrlBuilder: segmentUrlBuilderFactory(redundancyUrlManager),
|
|
||||||
useP2P: getStoredP2PEnabled()
|
|
||||||
},
|
|
||||||
segments: {
|
|
||||||
swarmId: p2pMediaLoaderOptions.playlistUrl
|
|
||||||
}
|
|
||||||
}
|
|
||||||
const streamrootHls = {
|
|
||||||
levelLabelHandler: (level: { height: number, width: number }) => {
|
|
||||||
const file = p2pMediaLoaderOptions.videoFiles.find(f => f.resolution.id === level.height)
|
|
||||||
|
|
||||||
let label = file.resolution.label
|
|
||||||
if (file.fps >= 50) label += file.fps
|
|
||||||
|
|
||||||
return label
|
|
||||||
},
|
|
||||||
html5: {
|
|
||||||
hlsjsConfig: {
|
|
||||||
capLevelToPlayerSize: true,
|
|
||||||
autoStartLoad: false,
|
|
||||||
liveSyncDurationCount: 7,
|
|
||||||
loader: new p2pMediaLoaderModule.Engine(p2pMediaLoaderConfig).createLoaderClass()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Object.assign(plugins, { p2pMediaLoader, streamrootHls })
|
|
||||||
html5 = streamrootHls.html5
|
html5 = streamrootHls.html5
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mode === 'webtorrent') {
|
if (mode === 'webtorrent') {
|
||||||
const webtorrent = {
|
PeertubePlayerManager.addWebTorrentOptions(plugins, options)
|
||||||
autoplay,
|
|
||||||
videoDuration: commonOptions.videoDuration,
|
|
||||||
playerElement: commonOptions.playerElement,
|
|
||||||
videoFiles: webtorrentOptions.videoFiles,
|
|
||||||
startTime: commonOptions.startTime
|
|
||||||
}
|
|
||||||
Object.assign(plugins, { webtorrent })
|
|
||||||
|
|
||||||
// WebTorrent plugin handles autoplay, because we do some hackish stuff in there
|
// WebTorrent plugin handles autoplay, because we do some hackish stuff in there
|
||||||
autoplay = false
|
autoplay = false
|
||||||
|
@ -302,11 +254,16 @@ export class PeertubePlayerManager {
|
||||||
? commonOptions.muted
|
? commonOptions.muted
|
||||||
: undefined, // Undefined so the player knows it has to check the local storage
|
: undefined, // Undefined so the player knows it has to check the local storage
|
||||||
|
|
||||||
|
autoplay: autoplay === true
|
||||||
|
? 'any' // Use 'any' instead of true to get notifier by videojs if autoplay fails
|
||||||
|
: autoplay,
|
||||||
|
|
||||||
poster: commonOptions.poster,
|
poster: commonOptions.poster,
|
||||||
autoplay: autoplay === true ? 'any' : autoplay, // Use 'any' instead of true to get notifier by videojs if autoplay fails
|
|
||||||
inactivityTimeout: commonOptions.inactivityTimeout,
|
inactivityTimeout: commonOptions.inactivityTimeout,
|
||||||
playbackRates: [ 0.5, 0.75, 1, 1.25, 1.5, 2 ],
|
playbackRates: [ 0.5, 0.75, 1, 1.25, 1.5, 2 ],
|
||||||
|
|
||||||
plugins,
|
plugins,
|
||||||
|
|
||||||
controlBar: {
|
controlBar: {
|
||||||
children: this.getControlBarChildren(mode, {
|
children: this.getControlBarChildren(mode, {
|
||||||
captions: commonOptions.captions,
|
captions: commonOptions.captions,
|
||||||
|
@ -316,63 +273,6 @@ export class PeertubePlayerManager {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (commonOptions.enableHotkeys === true) {
|
|
||||||
Object.assign(videojsOptions.plugins, {
|
|
||||||
hotkeys: {
|
|
||||||
enableVolumeScroll: false,
|
|
||||||
enableModifiersForNumbers: false,
|
|
||||||
|
|
||||||
fullscreenKey: function (event: KeyboardEvent) {
|
|
||||||
// fullscreen with the f key or Ctrl+Enter
|
|
||||||
return event.key === 'f' || (event.ctrlKey && event.key === 'Enter')
|
|
||||||
},
|
|
||||||
|
|
||||||
seekStep: function (event: KeyboardEvent) {
|
|
||||||
// mimic VLC seek behavior, and default to 5 (original value is 5).
|
|
||||||
if (event.ctrlKey && event.altKey) {
|
|
||||||
return 5 * 60
|
|
||||||
} else if (event.ctrlKey) {
|
|
||||||
return 60
|
|
||||||
} else if (event.altKey) {
|
|
||||||
return 10
|
|
||||||
} else {
|
|
||||||
return 5
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
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)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
if (commonOptions.language && !isDefaultLocale(commonOptions.language)) {
|
if (commonOptions.language && !isDefaultLocale(commonOptions.language)) {
|
||||||
Object.assign(videojsOptions, { language: commonOptions.language })
|
Object.assign(videojsOptions, { language: commonOptions.language })
|
||||||
}
|
}
|
||||||
|
@ -380,6 +280,87 @@ export class PeertubePlayerManager {
|
||||||
return videojsOptions
|
return videojsOptions
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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.effectiveType === '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 streamrootHls = {
|
||||||
|
levelLabelHandler: (level: { height: number, width: number }) => {
|
||||||
|
const file = p2pMediaLoaderOptions.videoFiles.find(f => f.resolution.id === level.height)
|
||||||
|
|
||||||
|
let label = file.resolution.label
|
||||||
|
if (file.fps >= 50) label += file.fps
|
||||||
|
|
||||||
|
return label
|
||||||
|
},
|
||||||
|
html5: {
|
||||||
|
hlsjsConfig: {
|
||||||
|
capLevelToPlayerSize: true,
|
||||||
|
autoStartLoad: false,
|
||||||
|
liveSyncDurationCount: 7,
|
||||||
|
loader: new p2pMediaLoaderModule.Engine(p2pMediaLoaderConfig).createLoaderClass()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const toAssign = { p2pMediaLoader, streamrootHls }
|
||||||
|
Object.assign(plugins, toAssign)
|
||||||
|
|
||||||
|
return toAssign
|
||||||
|
}
|
||||||
|
|
||||||
|
private static addWebTorrentOptions (plugins: VideoJSPluginOptions, options: PeertubePlayerManagerOptions) {
|
||||||
|
const commonOptions = options.common
|
||||||
|
const webtorrentOptions = options.webtorrent
|
||||||
|
|
||||||
|
const webtorrent = {
|
||||||
|
autoplay: commonOptions.autoplay,
|
||||||
|
videoDuration: commonOptions.videoDuration,
|
||||||
|
playerElement: commonOptions.playerElement,
|
||||||
|
videoFiles: webtorrentOptions.videoFiles,
|
||||||
|
startTime: commonOptions.startTime
|
||||||
|
}
|
||||||
|
|
||||||
|
Object.assign(plugins, { webtorrent })
|
||||||
|
}
|
||||||
|
|
||||||
private static getControlBarChildren (mode: PlayerMode, options: {
|
private static getControlBarChildren (mode: PlayerMode, options: {
|
||||||
peertubeLink: boolean
|
peertubeLink: boolean
|
||||||
theaterButton: boolean,
|
theaterButton: boolean,
|
||||||
|
@ -481,6 +462,63 @@ export class PeertubePlayerManager {
|
||||||
player.contextmenuUI({ content })
|
player.contextmenuUI({ content })
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static addHotkeysOptions (plugins: VideoJSPluginOptions) {
|
||||||
|
Object.assign(plugins, {
|
||||||
|
hotkeys: {
|
||||||
|
enableVolumeScroll: false,
|
||||||
|
enableModifiersForNumbers: false,
|
||||||
|
|
||||||
|
fullscreenKey: function (event: KeyboardEvent) {
|
||||||
|
// fullscreen with the f key or Ctrl+Enter
|
||||||
|
return event.key === 'f' || (event.ctrlKey && event.key === 'Enter')
|
||||||
|
},
|
||||||
|
|
||||||
|
seekStep: function (event: KeyboardEvent) {
|
||||||
|
// mimic VLC seek behavior, and default to 5 (original value is 5).
|
||||||
|
if (event.ctrlKey && event.altKey) {
|
||||||
|
return 5 * 60
|
||||||
|
} else if (event.ctrlKey) {
|
||||||
|
return 60
|
||||||
|
} else if (event.altKey) {
|
||||||
|
return 10
|
||||||
|
} else {
|
||||||
|
return 5
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
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 getLocalePath (serverUrl: string, locale: string) {
|
private static getLocalePath (serverUrl: string, locale: string) {
|
||||||
const completeLocale = getCompleteLocale(locale)
|
const completeLocale = getCompleteLocale(locale)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue