]>
Commit | Line | Data |
---|---|---|
9f10b292 C |
1 | 'use strict' |
2 | ||
f0f5567b C |
3 | const config = require('config') |
4 | const crypto = require('crypto') | |
5 | const express = require('express') | |
6 | const multer = require('multer') | |
7 | ||
8 | const logger = require('../../../helpers/logger') | |
9 | const friends = require('../../../lib/friends') | |
10 | const middleware = require('../../../middlewares') | |
11 | const cacheMiddleware = middleware.cache | |
12 | const reqValidator = middleware.reqValidators.videos | |
13 | const Videos = require('../../../models/videos') // model | |
14 | const videos = require('../../../lib/videos') | |
15 | const webtorrent = require('../../../lib/webtorrent') | |
16 | ||
17 | const router = express.Router() | |
18 | const uploads = config.get('storage.uploads') | |
9f10b292 C |
19 | |
20 | // multer configuration | |
f0f5567b | 21 | const storage = multer.diskStorage({ |
9f10b292 C |
22 | destination: function (req, file, cb) { |
23 | cb(null, uploads) | |
24 | }, | |
25 | ||
26 | filename: function (req, file, cb) { | |
f0f5567b | 27 | let extension = '' |
9f10b292 C |
28 | if (file.mimetype === 'video/webm') extension = 'webm' |
29 | else if (file.mimetype === 'video/mp4') extension = 'mp4' | |
30 | else if (file.mimetype === 'video/ogg') extension = 'ogv' | |
31 | crypto.pseudoRandomBytes(16, function (err, raw) { | |
f0f5567b | 32 | const fieldname = err ? undefined : raw.toString('hex') |
9f10b292 C |
33 | cb(null, fieldname + '.' + extension) |
34 | }) | |
35 | } | |
36 | }) | |
37 | ||
f0f5567b | 38 | const reqFiles = multer({ storage: storage }).fields([{ name: 'input_video', maxCount: 1 }]) |
8c308c2b | 39 | |
9f10b292 C |
40 | router.get('/', cacheMiddleware.cache(false), listVideos) |
41 | router.post('/', reqFiles, reqValidator.videosAdd, cacheMiddleware.cache(false), addVideo) | |
42 | router.get('/:id', reqValidator.videosGet, cacheMiddleware.cache(false), getVideos) | |
43 | router.delete('/:id', reqValidator.videosRemove, cacheMiddleware.cache(false), removeVideo) | |
44 | router.get('/search/:name', reqValidator.videosSearch, cacheMiddleware.cache(false), searchVideos) | |
8c308c2b | 45 | |
9f10b292 | 46 | // --------------------------------------------------------------------------- |
c45f7f84 | 47 | |
9f10b292 | 48 | module.exports = router |
c45f7f84 | 49 | |
9f10b292 | 50 | // --------------------------------------------------------------------------- |
c45f7f84 | 51 | |
9f10b292 | 52 | function addVideo (req, res, next) { |
f0f5567b C |
53 | const video_file = req.files.input_video[0] |
54 | const video_infos = req.body | |
9f10b292 C |
55 | |
56 | videos.seed(video_file.path, function (err, torrent) { | |
57 | if (err) { | |
58 | logger.error('Cannot seed this video.') | |
59 | return next(err) | |
60 | } | |
8c308c2b | 61 | |
f0f5567b | 62 | const video_data = { |
9f10b292 C |
63 | name: video_infos.name, |
64 | namePath: video_file.filename, | |
65 | description: video_infos.description, | |
66 | magnetUri: torrent.magnetURI | |
67 | } | |
c173e565 | 68 | |
9f10b292 | 69 | Videos.add(video_data, function (err) { |
c173e565 | 70 | if (err) { |
9f10b292 C |
71 | // TODO unseed the video |
72 | logger.error('Cannot insert this video in the database.') | |
c173e565 C |
73 | return next(err) |
74 | } | |
75 | ||
9f10b292 C |
76 | // Now we'll add the video's meta data to our friends |
77 | friends.addVideoToFriends(video_data) | |
c173e565 | 78 | |
98b01bac C |
79 | // TODO : include Location of the new video -> 201 |
80 | res.type('json').status(204).end() | |
8c308c2b | 81 | }) |
9f10b292 C |
82 | }) |
83 | } | |
8c308c2b | 84 | |
9f10b292 C |
85 | function getVideos (req, res, next) { |
86 | Videos.get(req.params.id, function (err, video) { | |
87 | if (err) return next(err) | |
8c308c2b | 88 | |
9f10b292 | 89 | if (video === null) { |
dc8bc31b | 90 | res.type('json').status(204).end() |
9f10b292 | 91 | } |
8c308c2b | 92 | |
9f10b292 C |
93 | res.json(video) |
94 | }) | |
95 | } | |
8c308c2b | 96 | |
9f10b292 C |
97 | function listVideos (req, res, next) { |
98 | Videos.list(function (err, videos_list) { | |
99 | if (err) return next(err) | |
c45f7f84 | 100 | |
9f10b292 C |
101 | res.json(videos_list) |
102 | }) | |
103 | } | |
c45f7f84 | 104 | |
9f10b292 | 105 | function removeVideo (req, res, next) { |
f0f5567b | 106 | const video_id = req.params.id |
9f10b292 C |
107 | Videos.get(video_id, function (err, video) { |
108 | if (err) return next(err) | |
8c308c2b | 109 | |
9f10b292 C |
110 | removeTorrent(video.magnetUri, function () { |
111 | Videos.removeOwned(req.params.id, function (err) { | |
112 | if (err) return next(err) | |
c173e565 | 113 | |
f0f5567b | 114 | const params = { |
9f10b292 C |
115 | name: video.name, |
116 | magnetUri: video.magnetUri | |
117 | } | |
c173e565 | 118 | |
9f10b292 | 119 | friends.removeVideoToFriends(params) |
dc8bc31b | 120 | res.type('json').status(204).end() |
c173e565 | 121 | }) |
8c308c2b | 122 | }) |
9f10b292 C |
123 | }) |
124 | } | |
8c308c2b | 125 | |
9f10b292 C |
126 | function searchVideos (req, res, next) { |
127 | Videos.search(req.params.name, function (err, videos_list) { | |
128 | if (err) return next(err) | |
8c308c2b | 129 | |
9f10b292 C |
130 | res.json(videos_list) |
131 | }) | |
132 | } | |
c173e565 | 133 | |
9f10b292 | 134 | // --------------------------------------------------------------------------- |
c173e565 | 135 | |
9f10b292 C |
136 | // Maybe the torrent is not seeded, but we catch the error to don't stop the removing process |
137 | function removeTorrent (magnetUri, callback) { | |
138 | try { | |
139 | webtorrent.remove(magnetUri, callback) | |
140 | } catch (err) { | |
141 | logger.warn('Cannot remove the torrent from WebTorrent', { err: err }) | |
142 | return callback(null) | |
c173e565 | 143 | } |
9f10b292 | 144 | } |