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