mirror of
https://github.com/Chocobozzz/PeerTube.git
synced 2024-05-16 20:02:40 +00:00
5cb3e6a0b8
Breaking: YAML config `ip_view_expiration` is renamed `view_expiration` Breaking: Views are taken into account after 10 seconds instead of 30 seconds (can be changed in YAML config) Purpose of this commit is to get closer to other video platforms where some platforms count views on play (mux, vimeo) or others use a very low delay (instagram, tiktok) We also want to improve the viewer identification, where we no longer use the IP but the `sessionId` generated by the web browser. Multiple viewers behind a NAT can now be able to be identified as independent viewers (this method is also used by vimeo or mux)
165 lines
4.2 KiB
TypeScript
165 lines
4.2 KiB
TypeScript
import { logger } from '@root-helpers/logger'
|
|
import { peertubeLocalStorage, peertubeSessionStorage } from '@root-helpers/peertube-web-storage'
|
|
import { randomString } from '@root-helpers/string'
|
|
|
|
export function getStoredVolume () {
|
|
const value = getLocalStorage('volume')
|
|
if (value !== null && value !== undefined) {
|
|
const valueNumber = parseFloat(value)
|
|
if (isNaN(valueNumber)) return undefined
|
|
|
|
return valueNumber
|
|
}
|
|
|
|
return undefined
|
|
}
|
|
|
|
export function getStoredMute () {
|
|
const value = getLocalStorage('mute')
|
|
if (value !== null && value !== undefined) return value === 'true'
|
|
|
|
return undefined
|
|
}
|
|
|
|
export function getStoredTheater () {
|
|
const value = getLocalStorage('theater-enabled')
|
|
if (value !== null && value !== undefined) return value === 'true'
|
|
|
|
return false
|
|
}
|
|
|
|
export function saveVolumeInStore (value: number) {
|
|
return setLocalStorage('volume', value.toString())
|
|
}
|
|
|
|
export function saveMuteInStore (value: boolean) {
|
|
return setLocalStorage('mute', value.toString())
|
|
}
|
|
|
|
export function saveTheaterInStore (enabled: boolean) {
|
|
return setLocalStorage('theater-enabled', enabled.toString())
|
|
}
|
|
|
|
export function saveAverageBandwidth (value: number) {
|
|
/** used to choose the most fitting resolution */
|
|
return setLocalStorage('average-bandwidth', value.toString())
|
|
}
|
|
|
|
export function getAverageBandwidthInStore () {
|
|
const value = getLocalStorage('average-bandwidth')
|
|
if (value !== null && value !== undefined) {
|
|
const valueNumber = parseInt(value, 10)
|
|
if (isNaN(valueNumber)) return undefined
|
|
|
|
return valueNumber
|
|
}
|
|
|
|
return undefined
|
|
}
|
|
|
|
// ---------------------------------------------------------------------------
|
|
|
|
export function saveLastSubtitle (language: string) {
|
|
return setLocalStorage('last-subtitle', language)
|
|
}
|
|
|
|
export function getStoredLastSubtitle () {
|
|
return getLocalStorage('last-subtitle')
|
|
}
|
|
|
|
export function savePreferredSubtitle (language: string) {
|
|
return setLocalStorage('preferred-subtitle', language)
|
|
}
|
|
|
|
export function getStoredPreferredSubtitle () {
|
|
return getLocalStorage('preferred-subtitle')
|
|
}
|
|
|
|
// ---------------------------------------------------------------------------
|
|
|
|
export function saveVideoWatchHistory (videoUUID: string, duration: number) {
|
|
return setLocalStorage(`video-watch-history`, JSON.stringify({
|
|
...getStoredVideoWatchHistory(),
|
|
|
|
[videoUUID]: {
|
|
duration,
|
|
date: `${(new Date()).toISOString()}`
|
|
}
|
|
}))
|
|
}
|
|
|
|
export function getStoredVideoWatchHistory (videoUUID?: string) {
|
|
let data
|
|
|
|
try {
|
|
const value = getLocalStorage('video-watch-history')
|
|
if (!value) return {}
|
|
|
|
data = JSON.parse(value)
|
|
} catch (error) {
|
|
logger.error('Cannot parse video watch history from local storage/', error)
|
|
}
|
|
|
|
data = data || {}
|
|
|
|
if (videoUUID) return data[videoUUID]
|
|
|
|
return data
|
|
}
|
|
|
|
export function cleanupVideoWatch () {
|
|
const data = getStoredVideoWatchHistory()
|
|
if (!data) return
|
|
|
|
const newData = Object.keys(data).reduce((acc, videoUUID) => {
|
|
const date = Date.parse(data[videoUUID].date)
|
|
|
|
const diff = Math.ceil(((new Date()).getTime() - date) / (1000 * 3600 * 24))
|
|
|
|
if (diff > 30) return acc
|
|
|
|
return {
|
|
...acc,
|
|
[videoUUID]: data[videoUUID]
|
|
}
|
|
}, {})
|
|
|
|
setLocalStorage('video-watch-history', JSON.stringify(newData))
|
|
}
|
|
|
|
// ---------------------------------------------------------------------------
|
|
|
|
export function getPlayerSessionId () {
|
|
const key = 'session-id'
|
|
|
|
let sessionId = getSessionStorage(key)
|
|
if (sessionId) return sessionId
|
|
|
|
sessionId = randomString(32)
|
|
setSessionStorage(key, sessionId)
|
|
|
|
return sessionId
|
|
}
|
|
|
|
// ---------------------------------------------------------------------------
|
|
// Private
|
|
// ---------------------------------------------------------------------------
|
|
|
|
const KEY_PREFIX = 'peertube-videojs-'
|
|
|
|
function getLocalStorage (key: string) {
|
|
return peertubeLocalStorage.getItem(KEY_PREFIX + key)
|
|
}
|
|
|
|
function setLocalStorage (key: string, value: string) {
|
|
peertubeLocalStorage.setItem(KEY_PREFIX + key, value)
|
|
}
|
|
|
|
function getSessionStorage (key: string) {
|
|
return peertubeSessionStorage.getItem(KEY_PREFIX + key)
|
|
}
|
|
|
|
function setSessionStorage (key: string, value: string) {
|
|
peertubeSessionStorage.setItem(KEY_PREFIX + key, value)
|
|
}
|