diff options
Diffstat (limited to 'server/controllers')
-rw-r--r-- | server/controllers/client.js | 85 | ||||
-rw-r--r-- | server/controllers/index.js | 4 |
2 files changed, 88 insertions, 1 deletions
diff --git a/server/controllers/client.js b/server/controllers/client.js new file mode 100644 index 000000000..68ffdbcd5 --- /dev/null +++ b/server/controllers/client.js | |||
@@ -0,0 +1,85 @@ | |||
1 | 'use strict' | ||
2 | |||
3 | const parallel = require('async/parallel') | ||
4 | const express = require('express') | ||
5 | const fs = require('fs') | ||
6 | const mongoose = require('mongoose') | ||
7 | const path = require('path') | ||
8 | |||
9 | const constants = require('../initializers/constants') | ||
10 | const middlewares = require('../middlewares') | ||
11 | const validators = middlewares.validators | ||
12 | const validatorsVideos = validators.videos | ||
13 | |||
14 | const Video = mongoose.model('Video') | ||
15 | const router = express.Router() | ||
16 | |||
17 | const opengraphComment = '<!-- opengraph tags -->' | ||
18 | const embedPath = path.join(__dirname, '../../client/dist/standalone/videos/embed.html') | ||
19 | const indexPath = path.join(__dirname, '../../client/dist/index.html') | ||
20 | |||
21 | // Special route that add OpenGraph tags | ||
22 | // Do not use a template engine for a so little thing | ||
23 | router.use('/videos/watch/:id', validatorsVideos.videosGet, generateWatchHtmlPage) | ||
24 | |||
25 | router.use('/videos/embed', function (req, res, next) { | ||
26 | res.sendFile(embedPath) | ||
27 | }) | ||
28 | |||
29 | // --------------------------------------------------------------------------- | ||
30 | |||
31 | module.exports = router | ||
32 | |||
33 | // --------------------------------------------------------------------------- | ||
34 | |||
35 | function addOpenGraphTags (htmlStringPage, video) { | ||
36 | const thumbnailUrl = constants.CONFIG.WEBSERVER.URL + video.thumbnailPath | ||
37 | const videoUrl = constants.CONFIG.WEBSERVER.URL + '/videos/watch/' | ||
38 | |||
39 | const metaTags = { | ||
40 | 'og:type': 'video', | ||
41 | 'og:title': video.name, | ||
42 | 'og:image': thumbnailUrl, | ||
43 | 'og:url': videoUrl, | ||
44 | 'og:description': video.description, | ||
45 | |||
46 | 'name': video.name, | ||
47 | 'description': video.description, | ||
48 | 'image': thumbnailUrl, | ||
49 | |||
50 | 'twitter:card': 'summary_large_image', | ||
51 | 'twitter:site': '@Chocobozzz', | ||
52 | 'twitter:title': video.name, | ||
53 | 'twitter:description': video.description, | ||
54 | 'twitter:image': thumbnailUrl | ||
55 | } | ||
56 | |||
57 | let tagsString = '' | ||
58 | Object.keys(metaTags).forEach(function (tagName) { | ||
59 | const tagValue = metaTags[tagName] | ||
60 | |||
61 | tagsString += '<meta property="' + tagName + '" content="' + tagValue + '" />' | ||
62 | }) | ||
63 | |||
64 | return htmlStringPage.replace(opengraphComment, tagsString) | ||
65 | } | ||
66 | |||
67 | function generateWatchHtmlPage (req, res, next) { | ||
68 | parallel({ | ||
69 | file: function (callback) { | ||
70 | fs.readFile(indexPath, callback) | ||
71 | }, | ||
72 | |||
73 | video: function (callback) { | ||
74 | Video.load(req.params.id, callback) | ||
75 | } | ||
76 | }, function (err, results) { | ||
77 | if (err) return next(err) | ||
78 | |||
79 | const html = results.file.toString() | ||
80 | const video = results.video.toFormatedJSON() | ||
81 | |||
82 | const htmlStringPageWithTags = addOpenGraphTags(html, video) | ||
83 | res.set('Content-Type', 'text/html; charset=UTF-8').send(htmlStringPageWithTags) | ||
84 | }) | ||
85 | } | ||
diff --git a/server/controllers/index.js b/server/controllers/index.js index 6a3f3f98f..90b481e52 100644 --- a/server/controllers/index.js +++ b/server/controllers/index.js | |||
@@ -1,7 +1,9 @@ | |||
1 | 'use strict' | 1 | 'use strict' |
2 | 2 | ||
3 | const apiController = require('./api/') | 3 | const apiController = require('./api/') |
4 | const clientController = require('./client') | ||
4 | 5 | ||
5 | module.exports = { | 6 | module.exports = { |
6 | api: apiController | 7 | api: apiController, |
8 | client: clientController | ||
7 | } | 9 | } |