]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blame - shared/extra-utils/videos/videos.ts
Add ability to disable webtorrent
[github/Chocobozzz/PeerTube.git] / shared / extra-utils / videos / videos.ts
CommitLineData
a20399c9
C
1/* tslint:disable:no-unused-expression */
2
3import { expect } from 'chai'
df0b219d 4import { pathExists, readdir, readFile } from 'fs-extra'
fdbda9e3 5import * as parseTorrent from 'parse-torrent'
1d791a26 6import { extname, join } from 'path'
c5d31dba 7import * as request from 'supertest'
ac81d1a0
C
8import {
9 buildAbsoluteFixturePath,
62689b94
C
10 getMyUserInformation,
11 immutableAssign,
ac81d1a0
C
12 makeGetRequest,
13 makePutBodyRequest,
14 makeUploadRequest,
15 root,
16 ServerInfo,
17 testImage
18} from '../'
df0b219d 19import * as validator from 'validator'
d4681c00 20import { VideoDetails, VideoPrivacy } from '../../models/videos'
8f0bc73d 21import { VIDEO_CATEGORIES, VIDEO_LANGUAGES, loadLanguages, VIDEO_LICENCES, VIDEO_PRIVACIES } from '../../../server/initializers/constants'
e2600d8b 22import { dateIsValid, webtorrentAdd, buildServerDirectory } from '../miscs/miscs'
0e1dc3e7 23
8f0bc73d
C
24loadLanguages()
25
0e1dc3e7
C
26type VideoAttributes = {
27 name?: string
28 category?: number
29 licence?: number
9d3ef9fe 30 language?: string
0e1dc3e7 31 nsfw?: boolean
47564bbe 32 commentsEnabled?: boolean
7f2cfe3a 33 downloadEnabled?: boolean
2186386c 34 waitTranscoding?: boolean
0e1dc3e7 35 description?: string
7519127b 36 originallyPublishedAt?: string
0e1dc3e7 37 tags?: string[]
5f04dd2f 38 channelId?: number
11474c3c 39 privacy?: VideoPrivacy
0e1dc3e7 40 fixture?: string
ac81d1a0
C
41 thumbnailfile?: string
42 previewfile?: string
2baea0c7
C
43 scheduleUpdate?: {
44 updateAt: string
45 privacy?: VideoPrivacy
46 }
0e1dc3e7
C
47}
48
49function getVideoCategories (url: string) {
50 const path = '/api/v1/videos/categories'
51
eec63bbc
C
52 return makeGetRequest({
53 url,
59651eee
C
54 path,
55 statusCodeExpected: 200
eec63bbc 56 })
0e1dc3e7
C
57}
58
59function getVideoLicences (url: string) {
60 const path = '/api/v1/videos/licences'
61
eec63bbc
C
62 return makeGetRequest({
63 url,
59651eee
C
64 path,
65 statusCodeExpected: 200
eec63bbc 66 })
0e1dc3e7
C
67}
68
69function getVideoLanguages (url: string) {
70 const path = '/api/v1/videos/languages'
71
eec63bbc
C
72 return makeGetRequest({
73 url,
59651eee
C
74 path,
75 statusCodeExpected: 200
eec63bbc 76 })
0e1dc3e7
C
77}
78
11474c3c
C
79function getVideoPrivacies (url: string) {
80 const path = '/api/v1/videos/privacies'
81
eec63bbc
C
82 return makeGetRequest({
83 url,
59651eee
C
84 path,
85 statusCodeExpected: 200
eec63bbc 86 })
11474c3c
C
87}
88
11474c3c 89function getVideo (url: string, id: number | string, expectedStatus = 200) {
0e1dc3e7
C
90 const path = '/api/v1/videos/' + id
91
92 return request(url)
93 .get(path)
94 .set('Accept', 'application/json')
11474c3c
C
95 .expect(expectedStatus)
96}
97
490b595a 98function viewVideo (url: string, id: number | string, expectedStatus = 204, xForwardedFor?: string) {
1f3e9fec
C
99 const path = '/api/v1/videos/' + id + '/views'
100
490b595a 101 const req = request(url)
1f3e9fec
C
102 .post(path)
103 .set('Accept', 'application/json')
490b595a
C
104
105 if (xForwardedFor) {
106 req.set('X-Forwarded-For', xForwardedFor)
107 }
108
109 return req.expect(expectedStatus)
1f3e9fec
C
110}
111
11474c3c
C
112function getVideoWithToken (url: string, token: string, id: number | string, expectedStatus = 200) {
113 const path = '/api/v1/videos/' + id
114
115 return request(url)
116 .get(path)
117 .set('Authorization', 'Bearer ' + token)
118 .set('Accept', 'application/json')
119 .expect(expectedStatus)
0e1dc3e7
C
120}
121
9567011b
C
122function getVideoDescription (url: string, descriptionPath: string) {
123 return request(url)
124 .get(descriptionPath)
125 .set('Accept', 'application/json')
126 .expect(200)
127 .expect('Content-Type', /json/)
128}
129
0e1dc3e7
C
130function getVideosList (url: string) {
131 const path = '/api/v1/videos'
132
133 return request(url)
134 .get(path)
135 .query({ sort: 'name' })
136 .set('Accept', 'application/json')
137 .expect(200)
138 .expect('Content-Type', /json/)
139}
140
d525fc39 141function getVideosListWithToken (url: string, token: string, query: { nsfw?: boolean } = {}) {
0883b324
C
142 const path = '/api/v1/videos'
143
144 return request(url)
145 .get(path)
146 .set('Authorization', 'Bearer ' + token)
d525fc39 147 .query(immutableAssign(query, { sort: 'name' }))
0883b324
C
148 .set('Accept', 'application/json')
149 .expect(200)
150 .expect('Content-Type', /json/)
151}
152
066e94c5
C
153function getLocalVideos (url: string) {
154 const path = '/api/v1/videos'
155
156 return request(url)
157 .get(path)
158 .query({ sort: 'name', filter: 'local' })
159 .set('Accept', 'application/json')
160 .expect(200)
161 .expect('Content-Type', /json/)
162}
163
11474c3c
C
164function getMyVideos (url: string, accessToken: string, start: number, count: number, sort?: string) {
165 const path = '/api/v1/users/me/videos'
166
167 const req = request(url)
168 .get(path)
169 .query({ start: start })
170 .query({ count: count })
171
172 if (sort) req.query({ sort })
173
174 return req.set('Accept', 'application/json')
175 .set('Authorization', 'Bearer ' + accessToken)
176 .expect(200)
177 .expect('Content-Type', /json/)
178}
179
d525fc39
C
180function getAccountVideos (
181 url: string,
182 accessToken: string,
183 accountName: string,
184 start: number,
185 count: number,
186 sort?: string,
187 query: { nsfw?: boolean } = {}
188) {
ad9e39fb 189 const path = '/api/v1/accounts/' + accountName + '/videos'
6b738c7a
C
190
191 return makeGetRequest({
192 url,
193 path,
d525fc39 194 query: immutableAssign(query, {
6b738c7a
C
195 start,
196 count,
197 sort
d525fc39 198 }),
6b738c7a
C
199 token: accessToken,
200 statusCodeExpected: 200
201 })
202}
203
204function getVideoChannelVideos (
205 url: string,
206 accessToken: string,
8a19bee1 207 videoChannelName: string,
6b738c7a
C
208 start: number,
209 count: number,
d525fc39
C
210 sort?: string,
211 query: { nsfw?: boolean } = {}
6b738c7a 212) {
8a19bee1 213 const path = '/api/v1/video-channels/' + videoChannelName + '/videos'
6b738c7a
C
214
215 return makeGetRequest({
216 url,
217 path,
d525fc39 218 query: immutableAssign(query, {
6b738c7a
C
219 start,
220 count,
221 sort
d525fc39 222 }),
6b738c7a
C
223 token: accessToken,
224 statusCodeExpected: 200
225 })
226}
227
418d092a
C
228function getPlaylistVideos (
229 url: string,
230 accessToken: string,
231 playlistId: number | string,
232 start: number,
233 count: number,
234 query: { nsfw?: boolean } = {}
235) {
236 const path = '/api/v1/video-playlists/' + playlistId + '/videos'
237
238 return makeGetRequest({
239 url,
240 path,
241 query: immutableAssign(query, {
242 start,
243 count
244 }),
245 token: accessToken,
246 statusCodeExpected: 200
247 })
248}
249
0e1dc3e7
C
250function getVideosListPagination (url: string, start: number, count: number, sort?: string) {
251 const path = '/api/v1/videos'
252
253 const req = request(url)
254 .get(path)
255 .query({ start: start })
256 .query({ count: count })
257
258 if (sort) req.query({ sort })
259
260 return req.set('Accept', 'application/json')
261 .expect(200)
262 .expect('Content-Type', /json/)
263}
264
265function getVideosListSort (url: string, sort: string) {
266 const path = '/api/v1/videos'
267
268 return request(url)
269 .get(path)
270 .query({ sort: sort })
271 .set('Accept', 'application/json')
272 .expect(200)
273 .expect('Content-Type', /json/)
274}
275
d525fc39 276function getVideosWithFilters (url: string, query: { tagsAllOf: string[], categoryOneOf: number[] | number }) {
0e1dc3e7
C
277 const path = '/api/v1/videos'
278
279 return request(url)
57c36b27 280 .get(path)
d525fc39 281 .query(query)
f3aaa9a9 282 .set('Accept', 'application/json')
d525fc39 283 .expect(200)
f3aaa9a9 284 .expect('Content-Type', /json/)
0e1dc3e7
C
285}
286
d525fc39 287function removeVideo (url: string, token: string, id: number | string, expectedStatus = 204) {
0883b324 288 const path = '/api/v1/videos'
0e1dc3e7
C
289
290 return request(url)
d525fc39 291 .delete(path + '/' + id)
0e1dc3e7 292 .set('Accept', 'application/json')
d525fc39
C
293 .set('Authorization', 'Bearer ' + token)
294 .expect(expectedStatus)
0e1dc3e7
C
295}
296
25378bc8
C
297async function checkVideoFilesWereRemoved (
298 videoUUID: string,
299 serverNumber: number,
09209296
C
300 directories = [
301 'redundancy',
302 'videos',
303 'thumbnails',
304 'torrents',
305 'previews',
306 'captions',
307 join('playlists', 'hls'),
308 join('redundancy', 'hls')
309 ]
25378bc8 310) {
25378bc8 311 for (const directory of directories) {
e2600d8b 312 const directoryPath = buildServerDirectory(serverNumber, directory)
f05a1c30 313
df0b219d
C
314 const directoryExists = await pathExists(directoryPath)
315 if (directoryExists === false) continue
f05a1c30 316
62689b94 317 const files = await readdir(directoryPath)
f05a1c30
C
318 for (const file of files) {
319 expect(file).to.not.contain(videoUUID)
320 }
321 }
322}
323
e11f68a3 324async function uploadVideo (url: string, accessToken: string, videoAttributesArg: VideoAttributes, specialStatus = 200) {
e95561cd 325 const path = '/api/v1/videos/upload'
5f04dd2f
C
326 let defaultChannelId = '1'
327
328 try {
329 const res = await getMyUserInformation(url, accessToken)
330 defaultChannelId = res.body.videoChannels[0].id
331 } catch (e) { /* empty */ }
0e1dc3e7 332
ac81d1a0
C
333 // Override default attributes
334 const attributes = Object.assign({
0e1dc3e7
C
335 name: 'my super video',
336 category: 5,
337 licence: 4,
9d3ef9fe 338 language: 'zh',
5f04dd2f 339 channelId: defaultChannelId,
0e1dc3e7 340 nsfw: true,
2186386c 341 waitTranscoding: false,
0e1dc3e7 342 description: 'my super description',
2422c46b 343 support: 'my super support text',
0e1dc3e7 344 tags: [ 'tag' ],
11474c3c 345 privacy: VideoPrivacy.PUBLIC,
47564bbe 346 commentsEnabled: true,
7f2cfe3a 347 downloadEnabled: true,
0e1dc3e7 348 fixture: 'video_short.webm'
ac81d1a0 349 }, videoAttributesArg)
0e1dc3e7
C
350
351 const req = request(url)
352 .post(path)
353 .set('Accept', 'application/json')
354 .set('Authorization', 'Bearer ' + accessToken)
355 .field('name', attributes.name)
0e1dc3e7 356 .field('nsfw', JSON.stringify(attributes.nsfw))
47564bbe 357 .field('commentsEnabled', JSON.stringify(attributes.commentsEnabled))
7f2cfe3a 358 .field('downloadEnabled', JSON.stringify(attributes.downloadEnabled))
2186386c 359 .field('waitTranscoding', JSON.stringify(attributes.waitTranscoding))
11474c3c 360 .field('privacy', attributes.privacy.toString())
5f04dd2f 361 .field('channelId', attributes.channelId)
0e1dc3e7 362
fc8c024a
C
363 if (attributes.support !== undefined) {
364 req.field('support', attributes.support)
365 }
366
a87d467a
C
367 if (attributes.description !== undefined) {
368 req.field('description', attributes.description)
369 }
8df87ce7
C
370 if (attributes.language !== undefined) {
371 req.field('language', attributes.language.toString())
372 }
a7fea183
C
373 if (attributes.category !== undefined) {
374 req.field('category', attributes.category.toString())
375 }
376 if (attributes.licence !== undefined) {
377 req.field('licence', attributes.licence.toString())
378 }
8df87ce7 379
970ceac0
C
380 const tags = attributes.tags || []
381 for (let i = 0; i < tags.length; i++) {
2422c46b
C
382 req.field('tags[' + i + ']', attributes.tags[i])
383 }
384
ac81d1a0
C
385 if (attributes.thumbnailfile !== undefined) {
386 req.attach('thumbnailfile', buildAbsoluteFixturePath(attributes.thumbnailfile))
387 }
388 if (attributes.previewfile !== undefined) {
389 req.attach('previewfile', buildAbsoluteFixturePath(attributes.previewfile))
0e1dc3e7
C
390 }
391
2baea0c7
C
392 if (attributes.scheduleUpdate) {
393 req.field('scheduleUpdate[updateAt]', attributes.scheduleUpdate.updateAt)
394
395 if (attributes.scheduleUpdate.privacy) {
396 req.field('scheduleUpdate[privacy]', attributes.scheduleUpdate.privacy)
397 }
398 }
399
84929846
AM
400 if (attributes.originallyPublishedAt !== undefined) {
401 req.field('originallyPublishedAt', attributes.originallyPublishedAt)
402 }
403
ac81d1a0 404 return req.attach('videofile', buildAbsoluteFixturePath(attributes.fixture))
0e1dc3e7
C
405 .expect(specialStatus)
406}
407
ac81d1a0 408function updateVideo (url: string, accessToken: string, id: number | string, attributes: VideoAttributes, statusCodeExpected = 204) {
0e1dc3e7
C
409 const path = '/api/v1/videos/' + id
410 const body = {}
411
412 if (attributes.name) body['name'] = attributes.name
413 if (attributes.category) body['category'] = attributes.category
414 if (attributes.licence) body['licence'] = attributes.licence
415 if (attributes.language) body['language'] = attributes.language
47564bbe
C
416 if (attributes.nsfw !== undefined) body['nsfw'] = JSON.stringify(attributes.nsfw)
417 if (attributes.commentsEnabled !== undefined) body['commentsEnabled'] = JSON.stringify(attributes.commentsEnabled)
7f2cfe3a 418 if (attributes.downloadEnabled !== undefined) body['downloadEnabled'] = JSON.stringify(attributes.downloadEnabled)
7519127b 419 if (attributes.originallyPublishedAt !== undefined) body['originallyPublishedAt'] = attributes.originallyPublishedAt
0e1dc3e7
C
420 if (attributes.description) body['description'] = attributes.description
421 if (attributes.tags) body['tags'] = attributes.tags
11474c3c 422 if (attributes.privacy) body['privacy'] = attributes.privacy
0f320037 423 if (attributes.channelId) body['channelId'] = attributes.channelId
2baea0c7 424 if (attributes.scheduleUpdate) body['scheduleUpdate'] = attributes.scheduleUpdate
0e1dc3e7 425
ac81d1a0
C
426 // Upload request
427 if (attributes.thumbnailfile || attributes.previewfile) {
428 const attaches: any = {}
429 if (attributes.thumbnailfile) attaches.thumbnailfile = attributes.thumbnailfile
430 if (attributes.previewfile) attaches.previewfile = attributes.previewfile
431
432 return makeUploadRequest({
433 url,
434 method: 'PUT',
435 path,
436 token: accessToken,
437 fields: body,
438 attaches,
439 statusCodeExpected
440 })
441 }
442
443 return makePutBodyRequest({
444 url,
445 path,
446 fields: body,
447 token: accessToken,
448 statusCodeExpected
449 })
0e1dc3e7
C
450}
451
452function rateVideo (url: string, accessToken: string, id: number, rating: string, specialStatus = 204) {
453 const path = '/api/v1/videos/' + id + '/rate'
454
455 return request(url)
456 .put(path)
457 .set('Accept', 'application/json')
458 .set('Authorization', 'Bearer ' + accessToken)
459 .send({ rating })
460 .expect(specialStatus)
461}
462
14d3270f 463function parseTorrentVideo (server: ServerInfo, videoUUID: string, resolution: number) {
fdbda9e3 464 return new Promise<any>((res, rej) => {
14d3270f 465 const torrentName = videoUUID + '-' + resolution + '.torrent'
2a8c5d0a 466 const torrentPath = join(root(), 'test' + server.serverNumber, 'torrents', torrentName)
fdbda9e3
C
467 readFile(torrentPath, (err, data) => {
468 if (err) return rej(err)
469
470 return res(parseTorrent(data))
471 })
472 })
473}
474
a20399c9
C
475async function completeVideoCheck (
476 url: string,
477 video: any,
478 attributes: {
479 name: string
480 category: number
481 licence: number
9d3ef9fe 482 language: string
a20399c9 483 nsfw: boolean
47564bbe 484 commentsEnabled: boolean
7f2cfe3a 485 downloadEnabled: boolean
a20399c9 486 description: string
53a61317 487 publishedAt?: string
2422c46b 488 support: string
7519127b 489 originallyPublishedAt?: string,
b64c950a
C
490 account: {
491 name: string
492 host: string
493 }
f6eebcb3
C
494 isLocal: boolean
495 tags: string[]
496 privacy: number
497 likes?: number
498 dislikes?: number
499 duration: number
a20399c9 500 channel: {
f6eebcb3
C
501 displayName: string
502 name: string
b1f5b93e 503 description
a20399c9
C
504 isLocal: boolean
505 }
f6eebcb3 506 fixture: string
a20399c9
C
507 files: {
508 resolution: number
509 size: number
ac81d1a0
C
510 }[],
511 thumbnailfile?: string
512 previewfile?: string
a20399c9
C
513 }
514) {
b1f5b93e
C
515 if (!attributes.likes) attributes.likes = 0
516 if (!attributes.dislikes) attributes.dislikes = 0
517
a20399c9 518 expect(video.name).to.equal(attributes.name)
09700934 519 expect(video.category.id).to.equal(attributes.category)
9d3ef9fe 520 expect(video.category.label).to.equal(attributes.category !== null ? VIDEO_CATEGORIES[attributes.category] : 'Misc')
09700934 521 expect(video.licence.id).to.equal(attributes.licence)
9d3ef9fe 522 expect(video.licence.label).to.equal(attributes.licence !== null ? VIDEO_LICENCES[attributes.licence] : 'Unknown')
09700934 523 expect(video.language.id).to.equal(attributes.language)
9d3ef9fe 524 expect(video.language.label).to.equal(attributes.language !== null ? VIDEO_LANGUAGES[attributes.language] : 'Unknown')
2243730c
C
525 expect(video.privacy.id).to.deep.equal(attributes.privacy)
526 expect(video.privacy.label).to.deep.equal(VIDEO_PRIVACIES[attributes.privacy])
a20399c9
C
527 expect(video.nsfw).to.equal(attributes.nsfw)
528 expect(video.description).to.equal(attributes.description)
03e12d7c 529 expect(video.account.id).to.be.a('number')
b64c950a
C
530 expect(video.account.host).to.equal(attributes.account.host)
531 expect(video.account.name).to.equal(attributes.account.name)
f6eebcb3
C
532 expect(video.channel.displayName).to.equal(attributes.channel.displayName)
533 expect(video.channel.name).to.equal(attributes.channel.name)
b1f5b93e
C
534 expect(video.likes).to.equal(attributes.likes)
535 expect(video.dislikes).to.equal(attributes.dislikes)
a20399c9 536 expect(video.isLocal).to.equal(attributes.isLocal)
b1f5b93e 537 expect(video.duration).to.equal(attributes.duration)
a20399c9 538 expect(dateIsValid(video.createdAt)).to.be.true
c49db162 539 expect(dateIsValid(video.publishedAt)).to.be.true
a20399c9
C
540 expect(dateIsValid(video.updatedAt)).to.be.true
541
53a61317 542 if (attributes.publishedAt) {
53a61317
C
543 expect(video.publishedAt).to.equal(attributes.publishedAt)
544 }
545
7519127b
C
546 if (attributes.originallyPublishedAt) {
547 expect(video.originallyPublishedAt).to.equal(attributes.originallyPublishedAt)
548 } else {
549 expect(video.originallyPublishedAt).to.be.null
550 }
551
66b16caf 552 const res = await getVideo(url, video.uuid)
0f320037 553 const videoDetails: VideoDetails = res.body
a20399c9
C
554
555 expect(videoDetails.files).to.have.lengthOf(attributes.files.length)
556 expect(videoDetails.tags).to.deep.equal(attributes.tags)
19a3b914
C
557 expect(videoDetails.account.name).to.equal(attributes.account.name)
558 expect(videoDetails.account.host).to.equal(attributes.account.host)
f6eebcb3
C
559 expect(video.channel.displayName).to.equal(attributes.channel.displayName)
560 expect(video.channel.name).to.equal(attributes.channel.name)
0f320037 561 expect(videoDetails.channel.host).to.equal(attributes.account.host)
a20399c9 562 expect(videoDetails.channel.isLocal).to.equal(attributes.channel.isLocal)
0f320037
C
563 expect(dateIsValid(videoDetails.channel.createdAt.toString())).to.be.true
564 expect(dateIsValid(videoDetails.channel.updatedAt.toString())).to.be.true
565 expect(videoDetails.commentsEnabled).to.equal(attributes.commentsEnabled)
7f2cfe3a 566 expect(videoDetails.downloadEnabled).to.equal(attributes.downloadEnabled)
a20399c9
C
567
568 for (const attributeFile of attributes.files) {
5d00a3d7 569 const file = videoDetails.files.find(f => f.resolution.id === attributeFile.resolution)
a20399c9
C
570 expect(file).not.to.be.undefined
571
b1f5b93e 572 let extension = extname(attributes.fixture)
48f07b4a
C
573 // Transcoding enabled: extension will always be .mp4
574 if (attributes.files.length > 1) extension = '.mp4'
b1f5b93e 575
a20399c9 576 expect(file.magnetUri).to.have.lengthOf.above(2)
5d00a3d7
C
577 expect(file.torrentUrl).to.equal(`http://${attributes.account.host}/static/torrents/${videoDetails.uuid}-${file.resolution.id}.torrent`)
578 expect(file.fileUrl).to.equal(`http://${attributes.account.host}/static/webseed/${videoDetails.uuid}-${file.resolution.id}${extension}`)
09700934
C
579 expect(file.resolution.id).to.equal(attributeFile.resolution)
580 expect(file.resolution.label).to.equal(attributeFile.resolution + 'p')
b1f5b93e
C
581
582 const minSize = attributeFile.size - ((10 * attributeFile.size) / 100)
583 const maxSize = attributeFile.size + ((10 * attributeFile.size) / 100)
4176e227 584 expect(file.size,
7160878c 585 'File size for resolution ' + file.resolution.label + ' outside confidence interval (' + minSize + '> size <' + maxSize + ')')
4176e227 586 .to.be.above(minSize).and.below(maxSize)
a20399c9 587
ac81d1a0 588 {
7b0956ec 589 await testImage(url, attributes.thumbnailfile || attributes.fixture, videoDetails.thumbnailPath)
ac81d1a0
C
590 }
591
592 if (attributes.previewfile) {
7b0956ec 593 await testImage(url, attributes.previewfile, videoDetails.previewPath)
ac81d1a0 594 }
a20399c9 595
d7a25329 596 const torrent = await webtorrentAdd(file.magnetUri, true)
a20399c9
C
597 expect(torrent.files).to.be.an('array')
598 expect(torrent.files.length).to.equal(1)
599 expect(torrent.files[0].path).to.exist.and.to.not.equal('')
600 }
601}
602
df0b219d
C
603async function videoUUIDToId (url: string, id: number | string) {
604 if (validator.isUUID('' + id) === false) return id
605
606 const res = await getVideo(url, id)
607 return res.body.id
608}
609
610async function uploadVideoAndGetId (options: { server: ServerInfo, videoName: string, nsfw?: boolean, token?: string }) {
611 const videoAttrs: any = { name: options.videoName }
612 if (options.nsfw) videoAttrs.nsfw = options.nsfw
613
df0b219d
C
614 const res = await uploadVideo(options.server.url, options.token || options.server.accessToken, videoAttrs)
615
616 return { id: res.body.video.id, uuid: res.body.video.uuid }
617}
618
0e1dc3e7
C
619// ---------------------------------------------------------------------------
620
621export {
9567011b 622 getVideoDescription,
0e1dc3e7
C
623 getVideoCategories,
624 getVideoLicences,
df0b219d 625 videoUUIDToId,
11474c3c 626 getVideoPrivacies,
0e1dc3e7 627 getVideoLanguages,
11474c3c 628 getMyVideos,
6b738c7a
C
629 getAccountVideos,
630 getVideoChannelVideos,
0e1dc3e7 631 getVideo,
11474c3c 632 getVideoWithToken,
0e1dc3e7
C
633 getVideosList,
634 getVideosListPagination,
635 getVideosListSort,
636 removeVideo,
0883b324 637 getVideosListWithToken,
0e1dc3e7 638 uploadVideo,
d525fc39 639 getVideosWithFilters,
0e1dc3e7 640 updateVideo,
fdbda9e3 641 rateVideo,
1f3e9fec 642 viewVideo,
a20399c9 643 parseTorrentVideo,
066e94c5 644 getLocalVideos,
f05a1c30 645 completeVideoCheck,
418d092a 646 checkVideoFilesWereRemoved,
df0b219d
C
647 getPlaylistVideos,
648 uploadVideoAndGetId
0e1dc3e7 649}