diff options
-rw-r--r-- | server/controllers/api/v1/videos.js | 175 |
1 files changed, 115 insertions, 60 deletions
diff --git a/server/controllers/api/v1/videos.js b/server/controllers/api/v1/videos.js index 641fef6ea..231309c5e 100644 --- a/server/controllers/api/v1/videos.js +++ b/server/controllers/api/v1/videos.js | |||
@@ -1,5 +1,6 @@ | |||
1 | 'use strict' | 1 | 'use strict' |
2 | 2 | ||
3 | const async = require('async') | ||
3 | const config = require('config') | 4 | const config = require('config') |
4 | const express = require('express') | 5 | const express = require('express') |
5 | const fs = require('fs') | 6 | const fs = require('fs') |
@@ -81,63 +82,92 @@ function addVideo (req, res, next) { | |||
81 | const videoFile = req.files.videofile[0] | 82 | const videoFile = req.files.videofile[0] |
82 | const videoInfos = req.body | 83 | const videoInfos = req.body |
83 | 84 | ||
84 | videos.seed(videoFile.path, function (err, torrent) { | 85 | async.waterfall([ |
85 | if (err) { | 86 | function (callback) { |
86 | logger.error('Cannot seed this video.') | 87 | videos.seed(videoFile.path, callback) |
87 | return next(err) | 88 | }, |
88 | } | ||
89 | 89 | ||
90 | videos.getVideoDuration(videoFile.path, function (err, duration) { | 90 | function seed (torrent, callback) { |
91 | if (err) { | 91 | videos.getVideoDuration(videoFile.path, function (err, duration) { |
92 | // TODO: unseed the video | 92 | if (err) { |
93 | logger.error('Cannot retrieve metadata of the file.') | 93 | // TODO: unseed the video |
94 | return next(err) | 94 | logger.error('Cannot retrieve metadata of the file.') |
95 | } | 95 | return next(err) |
96 | } | ||
97 | |||
98 | callback(null, torrent, duration) | ||
99 | }) | ||
100 | }, | ||
96 | 101 | ||
102 | function createThumbnail (torrent, duration, callback) { | ||
97 | videos.createVideoThumbnail(videoFile.path, function (err, thumbnailName) { | 103 | videos.createVideoThumbnail(videoFile.path, function (err, thumbnailName) { |
98 | if (err) { | 104 | if (err) { |
99 | // TODO: unseed the video | 105 | // TODO: unseed the video |
100 | logger.error('Cannot make a thumbnail of the video file.') | 106 | logger.error('Cannot make a thumbnail of the video file.') |
101 | return next(err) | 107 | return callback(err) |
102 | } | 108 | } |
103 | 109 | ||
104 | const videoData = { | 110 | callback(null, torrent, duration, thumbnailName) |
105 | name: videoInfos.name, | 111 | }) |
106 | namePath: videoFile.filename, | 112 | }, |
107 | description: videoInfos.description, | 113 | |
108 | magnetUri: torrent.magnetURI, | 114 | function insertIntoDB (torrent, duration, thumbnailName, callback) { |
109 | author: res.locals.oauth.token.user.username, | 115 | const videoData = { |
110 | duration: duration, | 116 | name: videoInfos.name, |
111 | thumbnail: thumbnailName | 117 | namePath: videoFile.filename, |
118 | description: videoInfos.description, | ||
119 | magnetUri: torrent.magnetURI, | ||
120 | author: res.locals.oauth.token.user.username, | ||
121 | duration: duration, | ||
122 | thumbnail: thumbnailName | ||
123 | } | ||
124 | |||
125 | Videos.add(videoData, function (err, insertedVideo) { | ||
126 | if (err) { | ||
127 | // TODO unseed the video | ||
128 | // TODO remove thumbnail | ||
129 | logger.error('Cannot insert this video in the database.') | ||
130 | return callback(err) | ||
112 | } | 131 | } |
113 | 132 | ||
114 | Videos.add(videoData, function (err, insertedVideo) { | 133 | return callback(null, torrent, duration, thumbnailName, videoData, insertedVideo) |
115 | if (err) { | ||
116 | // TODO unseed the video | ||
117 | logger.error('Cannot insert this video in the database.') | ||
118 | return next(err) | ||
119 | } | ||
120 | |||
121 | videoData.createdDate = insertedVideo.createdDate | ||
122 | |||
123 | fs.readFile(thumbnailsDir + thumbnailName, function (err, data) { | ||
124 | if (err) { | ||
125 | // TODO: remove video? | ||
126 | logger.error('Cannot read the thumbnail of the video') | ||
127 | return next(err) | ||
128 | } | ||
129 | |||
130 | // Set the image in base64 | ||
131 | videoData.thumbnailBase64 = new Buffer(data).toString('base64') | ||
132 | // Now we'll add the video's meta data to our friends | ||
133 | friends.addVideoToFriends(videoData) | ||
134 | |||
135 | // TODO : include Location of the new video -> 201 | ||
136 | res.type('json').status(204).end() | ||
137 | }) | ||
138 | }) | ||
139 | }) | 134 | }) |
140 | }) | 135 | }, |
136 | |||
137 | function getThumbnailBase64 (torrent, duration, thumbnailName, videoData, insertedVideo, callback) { | ||
138 | videoData.createdDate = insertedVideo.createdDate | ||
139 | |||
140 | fs.readFile(thumbnailsDir + thumbnailName, function (err, thumbnailData) { | ||
141 | if (err) { | ||
142 | // TODO unseed the video | ||
143 | // TODO remove thumbnail | ||
144 | // TODO: remove video | ||
145 | logger.error('Cannot read the thumbnail of the video') | ||
146 | return callback(err) | ||
147 | } | ||
148 | |||
149 | return callback(null, videoData, thumbnailData) | ||
150 | }) | ||
151 | }, | ||
152 | |||
153 | function sendToFriends (videoData, thumbnailData, callback) { | ||
154 | // Set the image in base64 | ||
155 | videoData.thumbnailBase64 = new Buffer(thumbnailData).toString('base64') | ||
156 | |||
157 | // Now we'll add the video's meta data to our friends | ||
158 | friends.addVideoToFriends(videoData) | ||
159 | |||
160 | return callback(null) | ||
161 | } | ||
162 | |||
163 | ], function (err) { | ||
164 | if (err) { | ||
165 | logger.error('Cannot insert the video.') | ||
166 | return next(err) | ||
167 | } | ||
168 | |||
169 | // TODO : include Location of the new video -> 201 | ||
170 | return res.type('json').status(204).end() | ||
141 | }) | 171 | }) |
142 | } | 172 | } |
143 | 173 | ||
@@ -164,26 +194,51 @@ function listVideos (req, res, next) { | |||
164 | 194 | ||
165 | function removeVideo (req, res, next) { | 195 | function removeVideo (req, res, next) { |
166 | const videoId = req.params.id | 196 | const videoId = req.params.id |
167 | Videos.get(videoId, function (err, video) { | ||
168 | if (err) return next(err) | ||
169 | 197 | ||
170 | removeTorrent(video.magnetUri, function () { | 198 | async.waterfall([ |
199 | function getVideo (callback) { | ||
200 | Videos.get(videoId, callback) | ||
201 | }, | ||
202 | |||
203 | function removeVideoTorrent (video, callback) { | ||
204 | removeTorrent(video.magnetUri, function () { | ||
205 | return callback(null, video) | ||
206 | }) | ||
207 | }, | ||
208 | |||
209 | function removeFromDB (video, callback) { | ||
171 | Videos.removeOwned(req.params.id, function (err) { | 210 | Videos.removeOwned(req.params.id, function (err) { |
172 | if (err) return next(err) | 211 | if (err) return callback(err) |
173 | 212 | ||
174 | videos.removeVideosDataFromDisk([ video ], function (err) { | 213 | return callback(null, video) |
175 | if (err) logger.error('Cannot remove video data from disk.', { video: video }) | 214 | }) |
215 | }, | ||
176 | 216 | ||
177 | const params = { | 217 | function removeVideoData (video, callback) { |
178 | name: video.name, | 218 | videos.removeVideosDataFromDisk([ video ], function (err) { |
179 | magnetUri: video.magnetUri | 219 | if (err) logger.error('Cannot remove video data from disk.', { video: video }) |
180 | } | ||
181 | 220 | ||
182 | friends.removeVideoToFriends(params) | 221 | return callback(null, video) |
183 | res.type('json').status(204).end() | ||
184 | }) | ||
185 | }) | 222 | }) |
186 | }) | 223 | }, |
224 | |||
225 | function sendInformationToFriends (video, callback) { | ||
226 | const params = { | ||
227 | name: video.name, | ||
228 | magnetUri: video.magnetUri | ||
229 | } | ||
230 | |||
231 | friends.removeVideoToFriends(params) | ||
232 | |||
233 | return callback(null) | ||
234 | } | ||
235 | ], function (err) { | ||
236 | if (err) { | ||
237 | logger.error('Errors when removed the video.', { error: err }) | ||
238 | return next(err) | ||
239 | } | ||
240 | |||
241 | return res.type('json').status(204).end() | ||
187 | }) | 242 | }) |
188 | } | 243 | } |
189 | 244 | ||