3 const each = require('async/each')
4 const eachSeries = require('async/eachSeries')
5 const express = require('express')
6 const mongoose = require('mongoose')
8 const middlewares = require('../../middlewares')
9 const secureMiddleware = middlewares.secure
10 const validators = middlewares.validators.remote
11 const logger = require('../../helpers/logger')
13 const router = express.Router()
14 const Video = mongoose.model('Video')
16 router.post('/videos',
18 validators.dataToDecrypt,
19 secureMiddleware.checkSignature,
20 secureMiddleware.decryptBody,
21 validators.remoteVideos,
25 // ---------------------------------------------------------------------------
27 module.exports = router
29 // ---------------------------------------------------------------------------
31 function remoteVideos (req, res, next) {
32 const requests = req.body.data
33 const fromHost = req.body.signature.host
35 // We need to process in the same order to keep consistency
37 eachSeries(requests, function (request, callbackEach) {
38 const videoData = request.data
40 if (request.type === 'add') {
41 addRemoteVideo(videoData, fromHost, callbackEach)
42 } else if (request.type === 'remove') {
43 removeRemoteVideo(videoData, fromHost, callbackEach)
45 logger.error('Unkown remote request type %s.', request.type)
48 if (err) logger.error('Error managing remote videos.', { error: err })
51 // We don't need to keep the other pod waiting
52 return res.type('json').status(204).end()
55 function addRemoteVideo (videoToCreateData, fromHost, callback) {
56 logger.debug('Adding remote video "%s".', videoToCreateData.name)
58 const video = new Video(videoToCreateData)
59 video.podHost = fromHost
60 Video.generateThumbnailFromBase64(video, videoToCreateData.thumbnailBase64, function (err) {
62 logger.error('Cannot generate thumbnail from base 64 data.', { error: err })
70 function removeRemoteVideo (videoToRemoveData, fromHost, callback) {
71 // We need the list because we have to remove some other stuffs (thumbnail etc)
72 Video.listByHostAndRemoteId(fromHost, videoToRemoveData.remoteId, function (err, videosList) {
74 logger.error('Cannot list videos from host and magnets.', { error: err })
78 if (videosList.length === 0) {
79 logger.error('No remote video was found for this pod.', { magnetUri: videoToRemoveData.magnetUri, podHost: fromHost })
82 each(videosList, function (video, callbackEach) {
83 logger.debug('Removing remote video %s.', video.magnetUri)
85 video.remove(callbackEach)