]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blobdiff - server/controllers/client.ts
Continue activitypub
[github/Chocobozzz/PeerTube.git] / server / controllers / client.ts
index 6a2ac4aabc151f779eb8882fdeaa0cbf4a5e23fb..67ebfcf1dc443ea0bd6783487ce82f2600e21c62 100644 (file)
@@ -1,16 +1,18 @@
 import * as express from 'express'
 import { join } from 'path'
 import * as validator from 'validator'
-import * as Promise from 'bluebird'
+import * as Bluebird from 'bluebird'
 
 import { database as db } from '../initializers/database'
 import {
   CONFIG,
   STATIC_PATHS,
   STATIC_MAX_AGE,
-  OPENGRAPH_AND_OEMBED_COMMENT
+  OPENGRAPH_AND_OEMBED_COMMENT,
+  EMBED_SIZE
 } from '../initializers'
 import { root, readFileBufferPromise, escapeHTML } from '../helpers'
+import { asyncMiddleware } from '../middlewares'
 import { VideoInstance } from '../models'
 
 const clientsRouter = express.Router()
@@ -21,7 +23,9 @@ const indexPath = join(distPath, 'index.html')
 
 // Special route that add OpenGraph and oEmbed tags
 // Do not use a template engine for a so little thing
-clientsRouter.use('/videos/watch/:id', generateWatchHtmlPage)
+clientsRouter.use('/videos/watch/:id',
+  asyncMiddleware(generateWatchHtmlPage)
+)
 
 clientsRouter.use('/videos/embed', (req: express.Request, res: express.Response, next: express.NextFunction) => {
   res.sendFile(embedPath)
@@ -49,6 +53,7 @@ function addOpenGraphAndOEmbedTags (htmlStringPage: string, video: VideoInstance
 
   const videoName = escapeHTML(video.name)
   const videoDescription = escapeHTML(video.description)
+  const embedUrl = CONFIG.WEBSERVER.URL + video.getEmbedPath()
 
   const openGraphMetaTags = {
     'og:type': 'video',
@@ -57,6 +62,12 @@ function addOpenGraphAndOEmbedTags (htmlStringPage: string, video: VideoInstance
     'og:url': videoUrl,
     'og:description': videoDescription,
 
+    'og:video:url': embedUrl,
+    'og:video:secure_url': embedUrl,
+    'og:video:type': 'text/html',
+    'og:video:width': EMBED_SIZE.width,
+    'og:video:height': EMBED_SIZE.height,
+
     'name': videoName,
     'description': videoDescription,
     'image': previewUrl,
@@ -65,7 +76,10 @@ function addOpenGraphAndOEmbedTags (htmlStringPage: string, video: VideoInstance
     'twitter:site': '@Chocobozzz',
     'twitter:title': videoName,
     'twitter:description': videoDescription,
-    'twitter:image': previewUrl
+    'twitter:image': previewUrl,
+    'twitter:player': embedUrl,
+    'twitter:player:width': EMBED_SIZE.width,
+    'twitter:player:height': EMBED_SIZE.height
   }
 
   const oembedLinkTags = [
@@ -90,9 +104,9 @@ function addOpenGraphAndOEmbedTags (htmlStringPage: string, video: VideoInstance
   return htmlStringPage.replace(OPENGRAPH_AND_OEMBED_COMMENT, tagsString)
 }
 
-function generateWatchHtmlPage (req: express.Request, res: express.Response, next: express.NextFunction) {
+async function generateWatchHtmlPage (req: express.Request, res: express.Response, next: express.NextFunction) {
   const videoId = '' + req.params.id
-  let videoPromise: Promise<VideoInstance>
+  let videoPromise: Bluebird<VideoInstance>
 
   // Let Angular application handle errors
   if (validator.isUUID(videoId, 4)) {
@@ -103,21 +117,16 @@ function generateWatchHtmlPage (req: express.Request, res: express.Response, nex
     return res.sendFile(indexPath)
   }
 
-  Promise.all([
+  let [ file, video ] = await Promise.all([
     readFileBufferPromise(indexPath),
     videoPromise
   ])
-  .then(([ file, video ]) => {
-    file = file as Buffer
-    video = video as VideoInstance
 
-    const html = file.toString()
+  const html = file.toString()
 
-    // Let Angular application handle errors
-    if (!video) return res.sendFile(indexPath)
+  // Let Angular application handle errors
+  if (!video) return res.sendFile(indexPath)
 
-    const htmlStringPageWithTags = addOpenGraphAndOEmbedTags(html, video)
-    res.set('Content-Type', 'text/html; charset=UTF-8').send(htmlStringPageWithTags)
-  })
-  .catch(err => next(err))
+  const htmlStringPageWithTags = addOpenGraphAndOEmbedTags(html, video)
+  res.set('Content-Type', 'text/html; charset=UTF-8').send(htmlStringPageWithTags)
 }