+function generateOEmbed (req: express.Request, res: express.Response) {
+ if (res.locals.videoAll) return generateVideoOEmbed(req, res)
+
+ return generatePlaylistOEmbed(req, res)
+}
+
+function generatePlaylistOEmbed (req: express.Request, res: express.Response) {
+ const playlist = res.locals.videoPlaylistSummary
+
+ const json = buildOEmbed({
+ channel: playlist.VideoChannel,
+ title: playlist.name,
+ embedPath: playlist.getEmbedStaticPath() + buildPlayerURLQuery(req.query.url),
+ previewPath: playlist.getThumbnailStaticPath(),
+ previewSize: THUMBNAILS_SIZE,
+ req
+ })
+
+ return res.json(json)
+}
+
+function generateVideoOEmbed (req: express.Request, res: express.Response) {
+ const video = res.locals.videoAll
+
+ const json = buildOEmbed({
+ channel: video.VideoChannel,
+ title: video.name,
+ embedPath: video.getEmbedStaticPath() + buildPlayerURLQuery(req.query.url),
+ previewPath: video.getPreviewStaticPath(),
+ previewSize: PREVIEWS_SIZE,
+ req
+ })
+
+ return res.json(json)
+}
+
+function buildPlayerURLQuery (inputQueryUrl: string) {
+ const allowedParameters = new Set([
+ 'start',
+ 'stop',
+ 'loop',
+ 'autoplay',
+ 'muted',
+ 'controls',
+ 'controlBar',
+ 'title',
+ 'api',
+ 'warningTitle',
+ 'peertubeLink',
+ 'p2p',
+ 'subtitle',
+ 'bigPlayBackgroundColor',
+ 'mode',
+ 'foregroundColor'
+ ])
+
+ const params = new URLSearchParams()
+
+ new URL(inputQueryUrl).searchParams.forEach((v, k) => {
+ if (allowedParameters.has(k)) {
+ params.append(k, v)
+ }
+ })
+
+ const stringQuery = params.toString()
+ if (!stringQuery) return ''
+
+ return '?' + stringQuery
+}
+
+function buildOEmbed (options: {
+ req: express.Request
+ title: string
+ channel: MChannelSummary
+ previewPath: string | null
+ embedPath: string
+ previewSize: {
+ height: number
+ width: number
+ }
+}) {
+ const { req, previewSize, previewPath, title, channel, embedPath } = options
+
+ const webserverUrl = WEBSERVER.URL
+ const maxHeight = forceNumber(req.query.maxheight)
+ const maxWidth = forceNumber(req.query.maxwidth)
+
+ const embedUrl = webserverUrl + embedPath
+ const embedTitle = escapeHTML(title)
+
+ let thumbnailUrl = previewPath
+ ? webserverUrl + previewPath
+ : undefined