X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=client%2Fsrc%2Fassets%2Fplayer%2Futils.ts;h=cc303b80bb8f9791d4aec39c2eac02194bd1dd01;hb=d0fbc9fd0a29c37f3ff9b99030351e90b276fe7d;hp=1df39d4e4a840ad4811062d8f594e917478a711d;hpb=d1bd87e066633b8a66266b280327ec828980916b;p=github%2FChocobozzz%2FPeerTube.git diff --git a/client/src/assets/player/utils.ts b/client/src/assets/player/utils.ts index 1df39d4e4..cc303b80b 100644 --- a/client/src/assets/player/utils.ts +++ b/client/src/assets/player/utils.ts @@ -1,95 +1,116 @@ +import { HTMLServerConfig, Video, VideoFile } from '@shared/models' + function toTitleCase (str: string) { return str.charAt(0).toUpperCase() + str.slice(1) } +function isWebRTCDisabled () { + return !!((window as any).RTCPeerConnection || (window as any).mozRTCPeerConnection || (window as any).webkitRTCPeerConnection) === false +} + +function isP2PEnabled (video: Video, config: HTMLServerConfig, userP2PEnabled: boolean) { + if (video.isLocal && config.tracker.enabled === false) return false + if (isWebRTCDisabled()) return false + + return userP2PEnabled +} + +function isIOS () { + if (/iPad|iPhone|iPod/.test(navigator.platform)) { + return true + } + + // Detect iPad Desktop mode + return !!(navigator.maxTouchPoints && + navigator.maxTouchPoints > 2 && + navigator.platform.includes('MacIntel')) +} + +function isSafari () { + return /^((?!chrome|android).)*safari/i.test(navigator.userAgent) +} + // https://github.com/danrevah/ngx-pipes/blob/master/src/pipes/math/bytes.ts // Don't import all Angular stuff, just copy the code with shame -const dictionaryBytes: Array<{max: number, type: string}> = [ +const dictionaryBytes: { max: number, type: string }[] = [ { max: 1024, type: 'B' }, { max: 1048576, type: 'KB' }, { max: 1073741824, type: 'MB' }, { max: 1.0995116e12, type: 'GB' } ] -function bytes (value) { +function bytes (value: number) { const format = dictionaryBytes.find(d => value < d.max) || dictionaryBytes[dictionaryBytes.length - 1] const calc = Math.floor(value / (format.max / 1024)).toString() return [ calc, format.type ] } -function getStoredVolume () { - const value = getLocalStorage('volume') - if (value !== null && value !== undefined) { - const valueNumber = parseFloat(value) - if (isNaN(valueNumber)) return undefined - - return valueNumber - } - - return undefined +function isMobile () { + return /iPhone|iPad|iPod|Android/i.test(navigator.userAgent) } -function getStoredMute () { - const value = getLocalStorage('mute') - if (value !== null && value !== undefined) return value === 'true' +function buildVideoOrPlaylistEmbed (embedUrl: string, embedTitle: string) { + const iframe = document.createElement('iframe') + + iframe.title = embedTitle + iframe.width = '560' + iframe.height = '315' + iframe.src = embedUrl + iframe.frameBorder = '0' + iframe.allowFullscreen = true + iframe.sandbox.add('allow-same-origin', 'allow-scripts', 'allow-popups') - return undefined + return iframe.outerHTML } -function getAverageBandwidth () { - const value = getLocalStorage('average-bandwidth') - if (value !== null && value !== undefined) { - const valueNumber = parseInt(value, 10) - if (isNaN(valueNumber)) return undefined +function videoFileMaxByResolution (files: VideoFile[]) { + let max = files[0] - return valueNumber + for (let i = 1; i < files.length; i++) { + const file = files[i] + if (max.resolution.id < file.resolution.id) max = file } - return undefined + return max } -function saveVolumeInStore (value: number) { - return setLocalStorage('volume', value.toString()) -} +function videoFileMinByResolution (files: VideoFile[]) { + let min = files[0] -function saveMuteInStore (value: boolean) { - return setLocalStorage('mute', value.toString()) -} + for (let i = 1; i < files.length; i++) { + const file = files[i] + if (min.resolution.id > file.resolution.id) min = file + } -function saveAverageBandwidth (value: number) { - return setLocalStorage('average-bandwidth', value.toString()) + return min } -function isMobile () { - return /iPhone|iPad|iPod|Android/i.test(navigator.userAgent) -} - -export { - toTitleCase, - getStoredVolume, - saveVolumeInStore, - saveAverageBandwidth, - getAverageBandwidth, - saveMuteInStore, - getStoredMute, - isMobile, - bytes +function getRtcConfig () { + return { + iceServers: [ + { + urls: 'stun:stun.stunprotocol.org' + }, + { + urls: 'stun:stun.framasoft.org' + } + ] + } } // --------------------------------------------------------------------------- -const KEY_PREFIX = 'peertube-videojs-' - -function getLocalStorage (key: string) { - try { - return localStorage.getItem(KEY_PREFIX + key) - } catch { - return undefined - } -} +export { + getRtcConfig, + toTitleCase, + isWebRTCDisabled, + isP2PEnabled, -function setLocalStorage (key: string, value: string) { - try { - localStorage.setItem(KEY_PREFIX + key, value) - } catch { /* empty */ } + buildVideoOrPlaylistEmbed, + videoFileMaxByResolution, + videoFileMinByResolution, + isMobile, + bytes, + isIOS, + isSafari }