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