121 lines
3.1 KiB
TypeScript
121 lines
3.1 KiB
TypeScript
import { Video, VideoPlaylist } from '../../models'
|
|
import { secondsToTime } from './date'
|
|
|
|
function buildPlaylistLink (playlist: Pick<VideoPlaylist, 'shortUUID'>, base?: string) {
|
|
return (base ?? window.location.origin) + buildPlaylistWatchPath(playlist)
|
|
}
|
|
|
|
function buildPlaylistWatchPath (playlist: Pick<VideoPlaylist, 'shortUUID'>) {
|
|
return '/w/p/' + playlist.shortUUID
|
|
}
|
|
|
|
function buildVideoWatchPath (video: Pick<Video, 'shortUUID'>) {
|
|
return '/w/' + video.shortUUID
|
|
}
|
|
|
|
function buildVideoLink (video: Pick<Video, 'shortUUID'>, base?: string) {
|
|
return (base ?? window.location.origin) + buildVideoWatchPath(video)
|
|
}
|
|
|
|
function buildPlaylistEmbedPath (playlist: Pick<VideoPlaylist, 'uuid'>) {
|
|
return '/video-playlists/embed/' + playlist.uuid
|
|
}
|
|
|
|
function buildPlaylistEmbedLink (playlist: Pick<VideoPlaylist, 'uuid'>, base?: string) {
|
|
return (base ?? window.location.origin) + buildPlaylistEmbedPath(playlist)
|
|
}
|
|
|
|
function buildVideoEmbedPath (video: Pick<Video, 'uuid'>) {
|
|
return '/videos/embed/' + video.uuid
|
|
}
|
|
|
|
function buildVideoEmbedLink (video: Pick<Video, 'uuid'>, base?: string) {
|
|
return (base ?? window.location.origin) + buildVideoEmbedPath(video)
|
|
}
|
|
|
|
function decorateVideoLink (options: {
|
|
url: string
|
|
|
|
startTime?: number
|
|
stopTime?: number
|
|
|
|
subtitle?: string
|
|
|
|
loop?: boolean
|
|
autoplay?: boolean
|
|
muted?: boolean
|
|
|
|
// Embed options
|
|
title?: boolean
|
|
warningTitle?: boolean
|
|
controls?: boolean
|
|
peertubeLink?: boolean
|
|
}) {
|
|
const { url } = options
|
|
|
|
const params = new URLSearchParams()
|
|
|
|
if (options.startTime !== undefined && options.startTime !== null) {
|
|
const startTimeInt = Math.floor(options.startTime)
|
|
params.set('start', secondsToTime(startTimeInt))
|
|
}
|
|
|
|
if (options.stopTime) {
|
|
const stopTimeInt = Math.floor(options.stopTime)
|
|
params.set('stop', secondsToTime(stopTimeInt))
|
|
}
|
|
|
|
if (options.subtitle) params.set('subtitle', options.subtitle)
|
|
|
|
if (options.loop === true) params.set('loop', '1')
|
|
if (options.autoplay === true) params.set('autoplay', '1')
|
|
if (options.muted === true) params.set('muted', '1')
|
|
if (options.title === false) params.set('title', '0')
|
|
if (options.warningTitle === false) params.set('warningTitle', '0')
|
|
if (options.controls === false) params.set('controls', '0')
|
|
if (options.peertubeLink === false) params.set('peertubeLink', '0')
|
|
|
|
return buildUrl(url, params)
|
|
}
|
|
|
|
function decoratePlaylistLink (options: {
|
|
url: string
|
|
|
|
playlistPosition?: number
|
|
}) {
|
|
const { url } = options
|
|
|
|
const params = new URLSearchParams()
|
|
|
|
if (options.playlistPosition) params.set('playlistPosition', '' + options.playlistPosition)
|
|
|
|
return buildUrl(url, params)
|
|
}
|
|
|
|
// ---------------------------------------------------------------------------
|
|
|
|
export {
|
|
buildPlaylistLink,
|
|
buildVideoLink,
|
|
|
|
buildVideoWatchPath,
|
|
buildPlaylistWatchPath,
|
|
|
|
buildPlaylistEmbedPath,
|
|
buildVideoEmbedPath,
|
|
|
|
buildPlaylistEmbedLink,
|
|
buildVideoEmbedLink,
|
|
|
|
decorateVideoLink,
|
|
decoratePlaylistLink
|
|
}
|
|
|
|
function buildUrl (url: string, params: URLSearchParams) {
|
|
let hasParams = false
|
|
params.forEach(() => { hasParams = true })
|
|
|
|
if (hasParams) return url + '?' + params.toString()
|
|
|
|
return url
|
|
}
|