]>
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 oAuth2
= require('../../../middlewares/oauth2')
12 const cacheMiddleware
= middleware
.cache
13 const reqValidator
= middleware
.reqValidators
.videos
14 const Videos
= require('../../../models/videos') // model
15 const videos
= require('../../../lib/videos')
16 const webtorrent
= require('../../../lib/webtorrent')
18 const router
= express
.Router()
19 const uploads
= config
.get('storage.uploads')
21 // multer configuration
22 const storage
= multer
.diskStorage({
23 destination: function (req
, file
, cb
) {
27 filename: function (req
, file
, cb
) {
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 const fieldname
= err
? undefined : raw
.toString('hex')
34 cb(null, fieldname
+ '.' + extension
)
39 const reqFiles
= multer({ storage: storage
}).fields([{ name: 'videofile', maxCount: 1 }])
41 router
.get('/', cacheMiddleware
.cache(false), listVideos
)
42 router
.post('/', oAuth2
.authenticate
, reqFiles
, reqValidator
.videosAdd
, cacheMiddleware
.cache(false), addVideo
)
43 router
.get('/:id', reqValidator
.videosGet
, cacheMiddleware
.cache(false), getVideos
)
44 router
.delete('/:id', oAuth2
.authenticate
, reqValidator
.videosRemove
, cacheMiddleware
.cache(false), removeVideo
)
45 router
.get('/search/:name', reqValidator
.videosSearch
, cacheMiddleware
.cache(false), searchVideos
)
47 // ---------------------------------------------------------------------------
49 module
.exports
= router
51 // ---------------------------------------------------------------------------
53 function addVideo (req
, res
, next
) {
54 const video_file
= req
.files
.videofile
[0]
55 const video_infos
= req
.body
57 videos
.seed(video_file
.path
, function (err
, torrent
) {
59 logger
.error('Cannot seed this video.')
64 name: video_infos
.name
,
65 namePath: video_file
.filename
,
66 description: video_infos
.description
,
67 magnetUri: torrent
.magnetURI
,
68 author: res
.locals
.oauth
.token
.user
.username
71 Videos
.add(video_data
, function (err
) {
73 // TODO unseed the video
74 logger
.error('Cannot insert this video in the database.')
78 // Now we'll add the video's meta data to our friends
79 friends
.addVideoToFriends(video_data
)
81 // TODO : include Location of the new video -> 201
82 res
.type('json').status(204).end()
87 function getVideos (req
, res
, next
) {
88 Videos
.get(req
.params
.id
, function (err
, video_obj
) {
89 if (err
) return next(err
)
91 const state
= videos
.getVideoState(video_obj
)
92 if (state
.exist
=== false) {
93 return res
.type('json').status(204).end()
96 res
.json(getFormatedVideo(video_obj
))
100 function listVideos (req
, res
, next
) {
101 Videos
.list(function (err
, videos_list
) {
102 if (err
) return next(err
)
104 res
.json(getFormatedVideos(videos_list
))
108 function removeVideo (req
, res
, next
) {
109 const video_id
= req
.params
.id
110 Videos
.get(video_id
, function (err
, video
) {
111 if (err
) return next(err
)
113 removeTorrent(video
.magnetUri
, function () {
114 Videos
.removeOwned(req
.params
.id
, function (err
) {
115 if (err
) return next(err
)
119 magnetUri: video
.magnetUri
122 friends
.removeVideoToFriends(params
)
123 res
.type('json').status(204).end()
129 function searchVideos (req
, res
, next
) {
130 Videos
.search(req
.params
.name
, function (err
, videos_list
) {
131 if (err
) return next(err
)
133 res
.json(getFormatedVideos(videos_list
))
137 // ---------------------------------------------------------------------------
139 function getFormatedVideo (video_obj
) {
140 const formated_video
= {
142 name: video_obj
.name
,
143 description: video_obj
.description
,
144 podUrl: video_obj
.podUrl
,
145 isLocal: videos
.getVideoState(video_obj
).owned
,
146 magnetUri: video_obj
.magnetUri
,
147 author: video_obj
.author
150 return formated_video
153 function getFormatedVideos (videos_obj
) {
154 const formated_videos
= []
156 videos_obj
.forEach(function (video_obj
) {
157 formated_videos
.push(getFormatedVideo(video_obj
))
160 return formated_videos
163 // Maybe the torrent is not seeded, but we catch the error to don't stop the removing process
164 function removeTorrent (magnetUri
, callback
) {
166 webtorrent
.remove(magnetUri
, callback
)
168 logger
.warn('Cannot remove the torrent from WebTorrent', { err: err
})
169 return callback(null)