]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blame - shared/extra-utils/videos/videos.ts
Redundancy and search tests in parallel too
[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'
d175a6f7 22import { dateIsValid, webtorrentAdd } 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) {
f05a1c30
C
311 const testDirectory = 'test' + serverNumber
312
25378bc8 313 for (const directory of directories) {
f05a1c30
C
314 const directoryPath = join(root(), testDirectory, directory)
315
df0b219d
C
316 const directoryExists = await pathExists(directoryPath)
317 if (directoryExists === false) continue
f05a1c30 318
62689b94 319 const files = await readdir(directoryPath)
f05a1c30
C
320 for (const file of files) {
321 expect(file).to.not.contain(videoUUID)
322 }
323 }
324}
325
e11f68a3 326async function uploadVideo (url: string, accessToken: string, videoAttributesArg: VideoAttributes, specialStatus = 200) {
e95561cd 327 const path = '/api/v1/videos/upload'
5f04dd2f
C
328 let defaultChannelId = '1'
329
330 try {
331 const res = await getMyUserInformation(url, accessToken)
332 defaultChannelId = res.body.videoChannels[0].id
333 } catch (e) { /* empty */ }
0e1dc3e7 334
ac81d1a0
C
335 // Override default attributes
336 const attributes = Object.assign({
0e1dc3e7
C
337 name: 'my super video',
338 category: 5,
339 licence: 4,
9d3ef9fe 340 language: 'zh',
5f04dd2f 341 channelId: defaultChannelId,
0e1dc3e7 342 nsfw: true,
2186386c 343 waitTranscoding: false,
0e1dc3e7 344 description: 'my super description',
2422c46b 345 support: 'my super support text',
0e1dc3e7 346 tags: [ 'tag' ],
11474c3c 347 privacy: VideoPrivacy.PUBLIC,
47564bbe 348 commentsEnabled: true,
7f2cfe3a 349 downloadEnabled: true,
0e1dc3e7 350 fixture: 'video_short.webm'
ac81d1a0 351 }, videoAttributesArg)
0e1dc3e7
C
352
353 const req = request(url)
354 .post(path)
355 .set('Accept', 'application/json')
356 .set('Authorization', 'Bearer ' + accessToken)
357 .field('name', attributes.name)
0e1dc3e7 358 .field('nsfw', JSON.stringify(attributes.nsfw))
47564bbe 359 .field('commentsEnabled', JSON.stringify(attributes.commentsEnabled))
7f2cfe3a 360 .field('downloadEnabled', JSON.stringify(attributes.downloadEnabled))
2186386c 361 .field('waitTranscoding', JSON.stringify(attributes.waitTranscoding))
11474c3c 362 .field('privacy', attributes.privacy.toString())
5f04dd2f 363 .field('channelId', attributes.channelId)
0e1dc3e7 364
a87d467a
C
365 if (attributes.description !== undefined) {
366 req.field('description', attributes.description)
367 }
8df87ce7
C
368 if (attributes.language !== undefined) {
369 req.field('language', attributes.language.toString())
370 }
a7fea183
C
371 if (attributes.category !== undefined) {
372 req.field('category', attributes.category.toString())
373 }
374 if (attributes.licence !== undefined) {
375 req.field('licence', attributes.licence.toString())
376 }
8df87ce7 377
2422c46b
C
378 for (let i = 0; i < attributes.tags.length; i++) {
379 req.field('tags[' + i + ']', attributes.tags[i])
380 }
381
ac81d1a0
C
382 if (attributes.thumbnailfile !== undefined) {
383 req.attach('thumbnailfile', buildAbsoluteFixturePath(attributes.thumbnailfile))
384 }
385 if (attributes.previewfile !== undefined) {
386 req.attach('previewfile', buildAbsoluteFixturePath(attributes.previewfile))
0e1dc3e7
C
387 }
388
2baea0c7
C
389 if (attributes.scheduleUpdate) {
390 req.field('scheduleUpdate[updateAt]', attributes.scheduleUpdate.updateAt)
391
392 if (attributes.scheduleUpdate.privacy) {
393 req.field('scheduleUpdate[privacy]', attributes.scheduleUpdate.privacy)
394 }
395 }
396
84929846
AM
397 if (attributes.originallyPublishedAt !== undefined) {
398 req.field('originallyPublishedAt', attributes.originallyPublishedAt)
399 }
400
ac81d1a0 401 return req.attach('videofile', buildAbsoluteFixturePath(attributes.fixture))
0e1dc3e7
C
402 .expect(specialStatus)
403}
404
ac81d1a0 405function updateVideo (url: string, accessToken: string, id: number | string, attributes: VideoAttributes, statusCodeExpected = 204) {
0e1dc3e7
C
406 const path = '/api/v1/videos/' + id
407 const body = {}
408
409 if (attributes.name) body['name'] = attributes.name
410 if (attributes.category) body['category'] = attributes.category
411 if (attributes.licence) body['licence'] = attributes.licence
412 if (attributes.language) body['language'] = attributes.language
47564bbe
C
413 if (attributes.nsfw !== undefined) body['nsfw'] = JSON.stringify(attributes.nsfw)
414 if (attributes.commentsEnabled !== undefined) body['commentsEnabled'] = JSON.stringify(attributes.commentsEnabled)
7f2cfe3a 415 if (attributes.downloadEnabled !== undefined) body['downloadEnabled'] = JSON.stringify(attributes.downloadEnabled)
7519127b 416 if (attributes.originallyPublishedAt !== undefined) body['originallyPublishedAt'] = attributes.originallyPublishedAt
0e1dc3e7
C
417 if (attributes.description) body['description'] = attributes.description
418 if (attributes.tags) body['tags'] = attributes.tags
11474c3c 419 if (attributes.privacy) body['privacy'] = attributes.privacy
0f320037 420 if (attributes.channelId) body['channelId'] = attributes.channelId
2baea0c7 421 if (attributes.scheduleUpdate) body['scheduleUpdate'] = attributes.scheduleUpdate
0e1dc3e7 422
ac81d1a0
C
423 // Upload request
424 if (attributes.thumbnailfile || attributes.previewfile) {
425 const attaches: any = {}
426 if (attributes.thumbnailfile) attaches.thumbnailfile = attributes.thumbnailfile
427 if (attributes.previewfile) attaches.previewfile = attributes.previewfile
428
429 return makeUploadRequest({
430 url,
431 method: 'PUT',
432 path,
433 token: accessToken,
434 fields: body,
435 attaches,
436 statusCodeExpected
437 })
438 }
439
440 return makePutBodyRequest({
441 url,
442 path,
443 fields: body,
444 token: accessToken,
445 statusCodeExpected
446 })
0e1dc3e7
C
447}
448
449function rateVideo (url: string, accessToken: string, id: number, rating: string, specialStatus = 204) {
450 const path = '/api/v1/videos/' + id + '/rate'
451
452 return request(url)
453 .put(path)
454 .set('Accept', 'application/json')
455 .set('Authorization', 'Bearer ' + accessToken)
456 .send({ rating })
457 .expect(specialStatus)
458}
459
14d3270f 460function parseTorrentVideo (server: ServerInfo, videoUUID: string, resolution: number) {
fdbda9e3 461 return new Promise<any>((res, rej) => {
14d3270f 462 const torrentName = videoUUID + '-' + resolution + '.torrent'
2a8c5d0a 463 const torrentPath = join(root(), 'test' + server.serverNumber, 'torrents', torrentName)
fdbda9e3
C
464 readFile(torrentPath, (err, data) => {
465 if (err) return rej(err)
466
467 return res(parseTorrent(data))
468 })
469 })
470}
471
a20399c9
C
472async function completeVideoCheck (
473 url: string,
474 video: any,
475 attributes: {
476 name: string
477 category: number
478 licence: number
9d3ef9fe 479 language: string
a20399c9 480 nsfw: boolean
47564bbe 481 commentsEnabled: boolean
7f2cfe3a 482 downloadEnabled: boolean
a20399c9 483 description: string
53a61317 484 publishedAt?: string
2422c46b 485 support: string
7519127b 486 originallyPublishedAt?: string,
b64c950a
C
487 account: {
488 name: string
489 host: string
490 }
f6eebcb3
C
491 isLocal: boolean
492 tags: string[]
493 privacy: number
494 likes?: number
495 dislikes?: number
496 duration: number
a20399c9 497 channel: {
f6eebcb3
C
498 displayName: string
499 name: string
b1f5b93e 500 description
a20399c9
C
501 isLocal: boolean
502 }
f6eebcb3 503 fixture: string
a20399c9
C
504 files: {
505 resolution: number
506 size: number
ac81d1a0
C
507 }[],
508 thumbnailfile?: string
509 previewfile?: string
a20399c9
C
510 }
511) {
b1f5b93e
C
512 if (!attributes.likes) attributes.likes = 0
513 if (!attributes.dislikes) attributes.dislikes = 0
514
a20399c9 515 expect(video.name).to.equal(attributes.name)
09700934 516 expect(video.category.id).to.equal(attributes.category)
9d3ef9fe 517 expect(video.category.label).to.equal(attributes.category !== null ? VIDEO_CATEGORIES[attributes.category] : 'Misc')
09700934 518 expect(video.licence.id).to.equal(attributes.licence)
9d3ef9fe 519 expect(video.licence.label).to.equal(attributes.licence !== null ? VIDEO_LICENCES[attributes.licence] : 'Unknown')
09700934 520 expect(video.language.id).to.equal(attributes.language)
9d3ef9fe 521 expect(video.language.label).to.equal(attributes.language !== null ? VIDEO_LANGUAGES[attributes.language] : 'Unknown')
2243730c
C
522 expect(video.privacy.id).to.deep.equal(attributes.privacy)
523 expect(video.privacy.label).to.deep.equal(VIDEO_PRIVACIES[attributes.privacy])
a20399c9
C
524 expect(video.nsfw).to.equal(attributes.nsfw)
525 expect(video.description).to.equal(attributes.description)
03e12d7c
C
526 expect(video.account.id).to.be.a('number')
527 expect(video.account.uuid).to.be.a('string')
b64c950a
C
528 expect(video.account.host).to.equal(attributes.account.host)
529 expect(video.account.name).to.equal(attributes.account.name)
f6eebcb3
C
530 expect(video.channel.displayName).to.equal(attributes.channel.displayName)
531 expect(video.channel.name).to.equal(attributes.channel.name)
b1f5b93e
C
532 expect(video.likes).to.equal(attributes.likes)
533 expect(video.dislikes).to.equal(attributes.dislikes)
a20399c9 534 expect(video.isLocal).to.equal(attributes.isLocal)
b1f5b93e 535 expect(video.duration).to.equal(attributes.duration)
a20399c9 536 expect(dateIsValid(video.createdAt)).to.be.true
c49db162 537 expect(dateIsValid(video.publishedAt)).to.be.true
a20399c9
C
538 expect(dateIsValid(video.updatedAt)).to.be.true
539
53a61317 540 if (attributes.publishedAt) {
53a61317
C
541 expect(video.publishedAt).to.equal(attributes.publishedAt)
542 }
543
7519127b
C
544 if (attributes.originallyPublishedAt) {
545 expect(video.originallyPublishedAt).to.equal(attributes.originallyPublishedAt)
546 } else {
547 expect(video.originallyPublishedAt).to.be.null
548 }
549
66b16caf 550 const res = await getVideo(url, video.uuid)
0f320037 551 const videoDetails: VideoDetails = res.body
a20399c9
C
552
553 expect(videoDetails.files).to.have.lengthOf(attributes.files.length)
554 expect(videoDetails.tags).to.deep.equal(attributes.tags)
19a3b914
C
555 expect(videoDetails.account.name).to.equal(attributes.account.name)
556 expect(videoDetails.account.host).to.equal(attributes.account.host)
f6eebcb3
C
557 expect(video.channel.displayName).to.equal(attributes.channel.displayName)
558 expect(video.channel.name).to.equal(attributes.channel.name)
0f320037 559 expect(videoDetails.channel.host).to.equal(attributes.account.host)
a20399c9 560 expect(videoDetails.channel.isLocal).to.equal(attributes.channel.isLocal)
0f320037
C
561 expect(dateIsValid(videoDetails.channel.createdAt.toString())).to.be.true
562 expect(dateIsValid(videoDetails.channel.updatedAt.toString())).to.be.true
563 expect(videoDetails.commentsEnabled).to.equal(attributes.commentsEnabled)
7f2cfe3a 564 expect(videoDetails.downloadEnabled).to.equal(attributes.downloadEnabled)
a20399c9
C
565
566 for (const attributeFile of attributes.files) {
5d00a3d7 567 const file = videoDetails.files.find(f => f.resolution.id === attributeFile.resolution)
a20399c9
C
568 expect(file).not.to.be.undefined
569
b1f5b93e
C
570 let extension = extname(attributes.fixture)
571 // Transcoding enabled on server 2, extension will always be .mp4
b64c950a 572 if (attributes.account.host === 'localhost:9002') extension = '.mp4'
b1f5b93e 573
a20399c9
C
574 const magnetUri = file.magnetUri
575 expect(file.magnetUri).to.have.lengthOf.above(2)
5d00a3d7
C
576 expect(file.torrentUrl).to.equal(`http://${attributes.account.host}/static/torrents/${videoDetails.uuid}-${file.resolution.id}.torrent`)
577 expect(file.fileUrl).to.equal(`http://${attributes.account.host}/static/webseed/${videoDetails.uuid}-${file.resolution.id}${extension}`)
09700934
C
578 expect(file.resolution.id).to.equal(attributeFile.resolution)
579 expect(file.resolution.label).to.equal(attributeFile.resolution + 'p')
b1f5b93e
C
580
581 const minSize = attributeFile.size - ((10 * attributeFile.size) / 100)
582 const maxSize = attributeFile.size + ((10 * attributeFile.size) / 100)
4176e227 583 expect(file.size,
7160878c 584 'File size for resolution ' + file.resolution.label + ' outside confidence interval (' + minSize + '> size <' + maxSize + ')')
4176e227 585 .to.be.above(minSize).and.below(maxSize)
a20399c9 586
ac81d1a0 587 {
7b0956ec 588 await testImage(url, attributes.thumbnailfile || attributes.fixture, videoDetails.thumbnailPath)
ac81d1a0
C
589 }
590
591 if (attributes.previewfile) {
7b0956ec 592 await testImage(url, attributes.previewfile, videoDetails.previewPath)
ac81d1a0 593 }
a20399c9
C
594
595 const torrent = await webtorrentAdd(magnetUri, true)
596 expect(torrent.files).to.be.an('array')
597 expect(torrent.files.length).to.equal(1)
598 expect(torrent.files[0].path).to.exist.and.to.not.equal('')
599 }
600}
601
df0b219d
C
602async function videoUUIDToId (url: string, id: number | string) {
603 if (validator.isUUID('' + id) === false) return id
604
605 const res = await getVideo(url, id)
606 return res.body.id
607}
608
609async function uploadVideoAndGetId (options: { server: ServerInfo, videoName: string, nsfw?: boolean, token?: string }) {
610 const videoAttrs: any = { name: options.videoName }
611 if (options.nsfw) videoAttrs.nsfw = options.nsfw
612
df0b219d
C
613 const res = await uploadVideo(options.server.url, options.token || options.server.accessToken, videoAttrs)
614
615 return { id: res.body.video.id, uuid: res.body.video.uuid }
616}
617
0e1dc3e7
C
618// ---------------------------------------------------------------------------
619
620export {
9567011b 621 getVideoDescription,
0e1dc3e7
C
622 getVideoCategories,
623 getVideoLicences,
df0b219d 624 videoUUIDToId,
11474c3c 625 getVideoPrivacies,
0e1dc3e7 626 getVideoLanguages,
11474c3c 627 getMyVideos,
6b738c7a
C
628 getAccountVideos,
629 getVideoChannelVideos,
0e1dc3e7 630 getVideo,
11474c3c 631 getVideoWithToken,
0e1dc3e7
C
632 getVideosList,
633 getVideosListPagination,
634 getVideosListSort,
635 removeVideo,
0883b324 636 getVideosListWithToken,
0e1dc3e7 637 uploadVideo,
d525fc39 638 getVideosWithFilters,
0e1dc3e7 639 updateVideo,
fdbda9e3 640 rateVideo,
1f3e9fec 641 viewVideo,
a20399c9 642 parseTorrentVideo,
066e94c5 643 getLocalVideos,
f05a1c30 644 completeVideoCheck,
418d092a 645 checkVideoFilesWereRemoved,
df0b219d
C
646 getPlaylistVideos,
647 uploadVideoAndGetId
0e1dc3e7 648}