]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blob - client/src/assets/player/utils.ts
(embed) sandbox the iframe
[github/Chocobozzz/PeerTube.git] / client / src / assets / player / utils.ts
1 import { is18nLocale, isDefaultLocale } from '../../../../shared/models/i18n/i18n'
2 import { VideoFile } from '../../../../shared/models/videos'
3
4 function toTitleCase (str: string) {
5 return str.charAt(0).toUpperCase() + str.slice(1)
6 }
7
8 // https://github.com/danrevah/ngx-pipes/blob/master/src/pipes/math/bytes.ts
9 // Don't import all Angular stuff, just copy the code with shame
10 const dictionaryBytes: Array<{max: number, type: string}> = [
11 { max: 1024, type: 'B' },
12 { max: 1048576, type: 'KB' },
13 { max: 1073741824, type: 'MB' },
14 { max: 1.0995116e12, type: 'GB' }
15 ]
16 function bytes (value) {
17 const format = dictionaryBytes.find(d => value < d.max) || dictionaryBytes[dictionaryBytes.length - 1]
18 const calc = Math.floor(value / (format.max / 1024)).toString()
19
20 return [ calc, format.type ]
21 }
22
23 function getStoredVolume () {
24 const value = getLocalStorage('volume')
25 if (value !== null && value !== undefined) {
26 const valueNumber = parseFloat(value)
27 if (isNaN(valueNumber)) return undefined
28
29 return valueNumber
30 }
31
32 return undefined
33 }
34
35 function getStoredMute () {
36 const value = getLocalStorage('mute')
37 if (value !== null && value !== undefined) return value === 'true'
38
39 return undefined
40 }
41
42 function getAverageBandwidth () {
43 const value = getLocalStorage('average-bandwidth')
44 if (value !== null && value !== undefined) {
45 const valueNumber = parseInt(value, 10)
46 if (isNaN(valueNumber)) return undefined
47
48 return valueNumber
49 }
50
51 return undefined
52 }
53
54 function getStoredTheater () {
55 const value = getLocalStorage('theater-enabled')
56 if (value !== null && value !== undefined) return value === 'true'
57
58 return undefined
59 }
60
61 function saveVolumeInStore (value: number) {
62 return setLocalStorage('volume', value.toString())
63 }
64
65 function saveMuteInStore (value: boolean) {
66 return setLocalStorage('mute', value.toString())
67 }
68
69 function saveTheaterInStore (enabled: boolean) {
70 return setLocalStorage('theater-enabled', enabled.toString())
71 }
72
73 function saveAverageBandwidth (value: number) {
74 return setLocalStorage('average-bandwidth', value.toString())
75 }
76
77 function isMobile () {
78 return /iPhone|iPad|iPod|Android/i.test(navigator.userAgent)
79 }
80
81 function buildVideoLink (time?: number) {
82 let href = window.location.href.replace('/embed/', '/watch/')
83 if (time) {
84 const timeInt = Math.floor(time)
85
86 if (window.location.search) href += '&start=' + timeInt
87 else href += '?start=' + timeInt
88 }
89
90 return href
91 }
92
93 function buildVideoEmbed (embedUrl: string) {
94 return '<iframe width="560" height="315" ' +
95 'sandbox="allow-same-origin allow-scripts" ' +
96 'src="' + embedUrl + '" ' +
97 'frameborder="0" allowfullscreen>' +
98 '</iframe>'
99 }
100
101 function copyToClipboard (text: string) {
102 const el = document.createElement('textarea')
103 el.value = text
104 el.setAttribute('readonly', '')
105 el.style.position = 'absolute'
106 el.style.left = '-9999px'
107 document.body.appendChild(el)
108 el.select()
109 document.execCommand('copy')
110 document.body.removeChild(el)
111 }
112
113 function videoFileMaxByResolution (files: VideoFile[]) {
114 let max = files[0]
115
116 for (let i = 1; i < files.length; i++) {
117 const file = files[i]
118 if (max.resolution.id < file.resolution.id) max = file
119 }
120
121 return max
122 }
123
124 function videoFileMinByResolution (files: VideoFile[]) {
125 let min = files[0]
126
127 for (let i = 1; i < files.length; i++) {
128 const file = files[i]
129 if (min.resolution.id > file.resolution.id) min = file
130 }
131
132 return min
133 }
134
135 export {
136 toTitleCase,
137 buildVideoLink,
138 getStoredVolume,
139 saveVolumeInStore,
140 saveAverageBandwidth,
141 getAverageBandwidth,
142 saveMuteInStore,
143 buildVideoEmbed,
144 getStoredMute,
145 videoFileMaxByResolution,
146 videoFileMinByResolution,
147 copyToClipboard,
148 getStoredTheater,
149 saveTheaterInStore,
150 isMobile,
151 bytes
152 }
153
154 // ---------------------------------------------------------------------------
155
156 const KEY_PREFIX = 'peertube-videojs-'
157
158 function getLocalStorage (key: string) {
159 try {
160 return localStorage.getItem(KEY_PREFIX + key)
161 } catch {
162 return undefined
163 }
164 }
165
166 function setLocalStorage (key: string, value: string) {
167 try {
168 localStorage.setItem(KEY_PREFIX + key, value)
169 } catch { /* empty */ }
170 }