]>
git.immae.eu Git - github/Chocobozzz/PeerTube.git/blob - server/controllers/api/v1/videos.js
3 const config
= require('config')
4 const crypto
= require('crypto')
5 const express
= require('express')
6 const multer
= require('multer')
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')
17 const router
= express
.Router()
18 const uploads
= config
.get('storage.uploads')
20 // multer configuration
21 const storage
= multer
.diskStorage({
22 destination: function (req
, file
, cb
) {
26 filename: function (req
, file
, cb
) {
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
) {
32 const fieldname
= err
? undefined : raw
.toString('hex')
33 cb(null, fieldname
+ '.' + extension
)
38 const reqFiles
= multer({ storage: storage
}).fields([{ name: 'videofile', 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
)
46 // ---------------------------------------------------------------------------
48 module
.exports
= router
50 // ---------------------------------------------------------------------------
52 function addVideo (req
, res
, next
) {
53 const video_file
= req
.files
.videofile
[0]
54 const video_infos
= req
.body
56 videos
.seed(video_file
.path
, function (err
, torrent
) {
58 logger
.error('Cannot seed this video.')
63 name: video_infos
.name
,
64 namePath: video_file
.filename
,
65 description: video_infos
.description
,
66 magnetUri: torrent
.magnetURI
69 Videos
.add(video_data
, function (err
) {
71 // TODO unseed the video
72 logger
.error('Cannot insert this video in the database.')
76 // Now we'll add the video's meta data to our friends
77 friends
.addVideoToFriends(video_data
)
79 // TODO : include Location of the new video -> 201
80 res
.type('json').status(204).end()
85 function getVideos (req
, res
, next
) {
86 Videos
.get(req
.params
.id
, function (err
, video_obj
) {
87 if (err
) return next(err
)
89 const state
= videos
.getVideoState(video_obj
)
90 if (state
.exist
=== false) {
91 return res
.type('json').status(204).end()
94 res
.json(getFormatedVideo(video_obj
))
98 function listVideos (req
, res
, next
) {
99 Videos
.list(function (err
, videos_list
) {
100 if (err
) return next(err
)
102 res
.json(getFormatedVideos(videos_list
))
106 function removeVideo (req
, res
, next
) {
107 const video_id
= req
.params
.id
108 Videos
.get(video_id
, function (err
, video
) {
109 if (err
) return next(err
)
111 removeTorrent(video
.magnetUri
, function () {
112 Videos
.removeOwned(req
.params
.id
, function (err
) {
113 if (err
) return next(err
)
117 magnetUri: video
.magnetUri
120 friends
.removeVideoToFriends(params
)
121 res
.type('json').status(204).end()
127 function searchVideos (req
, res
, next
) {
128 Videos
.search(req
.params
.name
, function (err
, videos_list
) {
129 if (err
) return next(err
)
131 res
.json(getFormatedVideos(videos_list
))
135 // ---------------------------------------------------------------------------
137 function getFormatedVideo (video_obj
) {
138 const formated_video
= {
140 name: video_obj
.name
,
141 description: video_obj
.description
,
142 podUrl: video_obj
.podUrl
,
143 isLocal: videos
.getVideoState(video_obj
).owned
,
144 magnetUri: video_obj
.magnetUri
147 return formated_video
150 function getFormatedVideos (videos_obj
) {
151 const formated_videos
= []
153 videos_obj
.forEach(function (video_obj
) {
154 formated_videos
.push(getFormatedVideo(video_obj
))
157 return formated_videos
160 // Maybe the torrent is not seeded, but we catch the error to don't stop the removing process
161 function removeTorrent (magnetUri
, callback
) {
163 webtorrent
.remove(magnetUri
, callback
)
165 logger
.warn('Cannot remove the torrent from WebTorrent', { err: err
})
166 return callback(null)