]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blobdiff - server/controllers/client.js
Server: do not break remote videos processing on error
[github/Chocobozzz/PeerTube.git] / server / controllers / client.js
index 68ddfccf2523a0ab52934fb077c068d1d8a65904..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,19 +39,19 @@ module.exports = router
 // ---------------------------------------------------------------------------
 
 function addOpenGraphTags (htmlStringPage, video) {
-  const videoUrl = constants.CONFIG.WEBSERVER.URL + '/videos/watch/'
-  let baseUrlHttp
+  let basePreviewUrlHttp
 
   if (video.isOwned()) {
-    baseUrlHttp = constants.CONFIG.WEBSERVER.URL
+    basePreviewUrlHttp = constants.CONFIG.WEBSERVER.URL
   } else {
-    baseUrlHttp = constants.REMOTE_SCHEME.HTTP + '://' + video.podHost
+    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 = baseUrlHttp + constants.STATIC_PATHS.PREVIEWS + video.getPreviewName()
+  const previewUrl = basePreviewUrlHttp + constants.STATIC_PATHS.PREVIEWS + video.getPreviewName()
+  const videoUrl = constants.CONFIG.WEBSERVER.URL + '/videos/watch/' + video.id
 
   const metaTags = {
     'og:type': 'video',
@@ -76,13 +82,18 @@ 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)
@@ -90,6 +101,9 @@ function generateWatchHtmlPage (req, res, next) {
     const html = results.file.toString()
     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)
   })