From 6fad8e51c47b9d07bea99b777c1f55c10f6d576d Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Wed, 5 Aug 2020 15:35:58 +0200 Subject: Handle playlist oembed --- server/controllers/services.ts | 73 +++++++++++++++++++++++++++++++++++------- 1 file changed, 62 insertions(+), 11 deletions(-) (limited to 'server/controllers') diff --git a/server/controllers/services.ts b/server/controllers/services.ts index ec057235f..d0217c30a 100644 --- a/server/controllers/services.ts +++ b/server/controllers/services.ts @@ -1,7 +1,8 @@ import * as express from 'express' -import { EMBED_SIZE, PREVIEWS_SIZE, WEBSERVER } from '../initializers/constants' +import { EMBED_SIZE, PREVIEWS_SIZE, WEBSERVER, THUMBNAILS_SIZE } from '../initializers/constants' import { asyncMiddleware, oembedValidator } from '../middlewares' import { accountNameWithHostGetValidator } from '../middlewares/validators' +import { MChannelSummary } from '@server/types/models' const servicesRouter = express.Router() @@ -23,23 +24,73 @@ export { // --------------------------------------------------------------------------- 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(), + 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(), + previewPath: video.getPreviewStaticPath(), + previewSize: PREVIEWS_SIZE, + req + }) + + return res.json(json) +} + +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 = parseInt(req.query.maxheight, 10) const maxWidth = parseInt(req.query.maxwidth, 10) - const embedUrl = webserverUrl + video.getEmbedStaticPath() - let thumbnailUrl = webserverUrl + video.getPreviewStaticPath() + const embedUrl = webserverUrl + embedPath let embedWidth = EMBED_SIZE.width let embedHeight = EMBED_SIZE.height + let thumbnailUrl = previewPath + ? webserverUrl + previewPath + : undefined + if (maxHeight < embedHeight) embedHeight = maxHeight if (maxWidth < embedWidth) embedWidth = maxWidth // Our thumbnail is too big for the consumer if ( - (maxHeight !== undefined && maxHeight < PREVIEWS_SIZE.height) || - (maxWidth !== undefined && maxWidth < PREVIEWS_SIZE.width) + (maxHeight !== undefined && maxHeight < previewSize.height) || + (maxWidth !== undefined && maxWidth < previewSize.width) ) { thumbnailUrl = undefined } @@ -53,20 +104,20 @@ function generateOEmbed (req: express.Request, res: express.Response) { html, width: embedWidth, height: embedHeight, - title: video.name, - author_name: video.VideoChannel.Account.name, - author_url: video.VideoChannel.Account.Actor.url, + title: title, + author_name: channel.name, + author_url: channel.Actor.url, provider_name: 'PeerTube', provider_url: webserverUrl } if (thumbnailUrl !== undefined) { json.thumbnail_url = thumbnailUrl - json.thumbnail_width = PREVIEWS_SIZE.width - json.thumbnail_height = PREVIEWS_SIZE.height + json.thumbnail_width = previewSize.width + json.thumbnail_height = previewSize.height } - return res.json(json) + return json } function redirectToAccountUrl (req: express.Request, res: express.Response, next: express.NextFunction) { -- cgit v1.2.3