-import { parallel } from 'async'
-import express = require('express')
-import fs = require('fs')
+import * as express from 'express'
import { join } from 'path'
-import expressValidator = require('express-validator')
-// TODO: use .validator when express-validator typing will have validator field
-const validator = expressValidator['validator']
+import * as validator from 'validator'
+import * as Promise from 'bluebird'
import { database as db } from '../initializers/database'
import {
CONFIG,
REMOTE_SCHEME,
STATIC_PATHS,
- STATIC_MAX_AGE
+ STATIC_MAX_AGE,
+ OPENGRAPH_COMMENT
} from '../initializers'
-import { root } from '../helpers'
+import { root, readFileBufferPromise } from '../helpers'
+import { VideoInstance } from '../models'
const clientsRouter = express.Router()
-// TODO: move to constants
-const opengraphComment = '<!-- opengraph tags -->'
const distPath = join(root(), 'client', 'dist')
const embedPath = join(distPath, 'standalone', 'videos', 'embed.html')
const indexPath = join(distPath, 'index.html')
// Do not use a template engine for a so little thing
clientsRouter.use('/videos/watch/:id', generateWatchHtmlPage)
-clientsRouter.use('/videos/embed', function (req, res, next) {
+clientsRouter.use('/videos/embed', function (req: express.Request, res: express.Response, next: express.NextFunction) {
res.sendFile(embedPath)
})
clientsRouter.use('/client', express.static(distPath, { maxAge: STATIC_MAX_AGE }))
// 404 for static files not found
-clientsRouter.use('/client/*', function (req, res, next) {
+clientsRouter.use('/client/*', function (req: express.Request, res: express.Response, next: express.NextFunction) {
res.sendStatus(404)
})
// ---------------------------------------------------------------------------
-function addOpenGraphTags (htmlStringPage, video) {
+function addOpenGraphTags (htmlStringPage: string, video: VideoInstance) {
let basePreviewUrlHttp
if (video.isOwned()) {
tagsString += '<meta property="' + tagName + '" content="' + tagValue + '" />'
})
- return htmlStringPage.replace(opengraphComment, tagsString)
+ return htmlStringPage.replace(OPENGRAPH_COMMENT, tagsString)
}
-function generateWatchHtmlPage (req, res, next) {
- const videoId = req.params.id
+function generateWatchHtmlPage (req: express.Request, res: express.Response, next: express.NextFunction) {
+ 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)
- },
+ Promise.all([
+ readFileBufferPromise(indexPath),
+ db.Video.loadAndPopulateAuthorAndPodAndTags(videoId)
+ ])
+ .then(([ file, video ]) => {
+ file = file as Buffer
+ video = video as VideoInstance
- video: function (callback) {
- db.Video.loadAndPopulateAuthorAndPodAndTags(videoId, callback)
- }
- }, function (err, result: any) {
- if (err) return next(err)
-
- const html = result.file.toString()
- const video = result.video
+ const html = file.toString()
// 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)
})
+ .catch(err => next(err))
}