]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blobdiff - server/controllers/client.js
Server: add association between author and user
[github/Chocobozzz/PeerTube.git] / server / controllers / client.js
index 68ffdbcd57ec7b00154a1766df7ae56402706c4e..8c242af07890d0b80188b2d5065d3429219cd018 100644 (file)
@@ -3,29 +3,35 @@
 const parallel = require('async/parallel')
 const express = require('express')
 const fs = require('fs')
-const mongoose = require('mongoose')
 const path = require('path')
+const validator = require('express-validator').validator
 
 const constants = require('../initializers/constants')
-const middlewares = require('../middlewares')
-const validators = middlewares.validators
-const validatorsVideos = validators.videos
+const db = require('../initializers/database')
 
-const Video = mongoose.model('Video')
 const router = express.Router()
 
 const opengraphComment = '<!-- opengraph tags -->'
-const embedPath = path.join(__dirname, '../../client/dist/standalone/videos/embed.html')
-const indexPath = path.join(__dirname, '../../client/dist/index.html')
+const distPath = path.join(__dirname, '../../client/dist')
+const embedPath = path.join(distPath, 'standalone/videos/embed.html')
+const indexPath = path.join(distPath, 'index.html')
 
 // Special route that add OpenGraph tags
 // Do not use a template engine for a so little thing
-router.use('/videos/watch/:id', validatorsVideos.videosGet, generateWatchHtmlPage)
+router.use('/videos/watch/:id', generateWatchHtmlPage)
 
 router.use('/videos/embed', function (req, res, next) {
   res.sendFile(embedPath)
 })
 
+// Static HTML/CSS/JS client files
+router.use('/client', express.static(distPath, { maxAge: constants.STATIC_MAX_AGE }))
+
+// 404 for static files not found
+router.use('/client/*', function (req, res, next) {
+  res.sendStatus(404)
+})
+
 // ---------------------------------------------------------------------------
 
 module.exports = router
@@ -33,25 +39,36 @@ module.exports = router
 // ---------------------------------------------------------------------------
 
 function addOpenGraphTags (htmlStringPage, video) {
-  const thumbnailUrl = constants.CONFIG.WEBSERVER.URL + video.thumbnailPath
-  const videoUrl = constants.CONFIG.WEBSERVER.URL + '/videos/watch/'
+  let basePreviewUrlHttp
+
+  if (video.isOwned()) {
+    basePreviewUrlHttp = constants.CONFIG.WEBSERVER.URL
+  } else {
+    basePreviewUrlHttp = constants.REMOTE_SCHEME.HTTP + '://' + video.Author.Pod.host
+  }
+
+  // We fetch the remote preview (bigger than the thumbnail)
+  // This should not overhead the remote server since social websites put in a cache the OpenGraph tags
+  // We can't use the thumbnail because these social websites want bigger images (> 200x200 for Facebook for example)
+  const previewUrl = basePreviewUrlHttp + constants.STATIC_PATHS.PREVIEWS + video.getPreviewName()
+  const videoUrl = constants.CONFIG.WEBSERVER.URL + '/videos/watch/' + video.id
 
   const metaTags = {
     'og:type': 'video',
     'og:title': video.name,
-    'og:image': thumbnailUrl,
+    'og:image': previewUrl,
     'og:url': videoUrl,
     'og:description': video.description,
 
     'name': video.name,
     'description': video.description,
-    'image': thumbnailUrl,
+    'image': previewUrl,
 
     'twitter:card': 'summary_large_image',
     'twitter:site': '@Chocobozzz',
     'twitter:title': video.name,
     'twitter:description': video.description,
-    'twitter:image': thumbnailUrl
+    'twitter:image': previewUrl
   }
 
   let tagsString = ''
@@ -65,19 +82,27 @@ function addOpenGraphTags (htmlStringPage, video) {
 }
 
 function generateWatchHtmlPage (req, res, next) {
+  const videoId = req.params.id
+
+  // Let Angular application handle errors
+  if (!validator.isUUID(videoId, 4)) return res.sendFile(indexPath)
+
   parallel({
     file: function (callback) {
       fs.readFile(indexPath, callback)
     },
 
     video: function (callback) {
-      Video.load(req.params.id, callback)
+      db.Video.loadAndPopulateAuthorAndPodAndTags(videoId, callback)
     }
   }, function (err, results) {
     if (err) return next(err)
 
     const html = results.file.toString()
-    const video = results.video.toFormatedJSON()
+    const video = results.video
+
+    // Let Angular application handle errors
+    if (!video) return res.sendFile(indexPath)
 
     const htmlStringPageWithTags = addOpenGraphTags(html, video)
     res.set('Content-Type', 'text/html; charset=UTF-8').send(htmlStringPageWithTags)