]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blame - shared/extra-utils/videos/videos.ts
Merge branch 'release/v1.3.0' into develop
[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)
7d14d4d2 358 .field('support', attributes.support)
0e1dc3e7 359 .field('nsfw', JSON.stringify(attributes.nsfw))
47564bbe 360 .field('commentsEnabled', JSON.stringify(attributes.commentsEnabled))
7f2cfe3a 361 .field('downloadEnabled', JSON.stringify(attributes.downloadEnabled))
2186386c 362 .field('waitTranscoding', JSON.stringify(attributes.waitTranscoding))
11474c3c 363 .field('privacy', attributes.privacy.toString())
5f04dd2f 364 .field('channelId', attributes.channelId)
0e1dc3e7 365
a87d467a
C
366 if (attributes.description !== undefined) {
367 req.field('description', attributes.description)
368 }
8df87ce7
C
369 if (attributes.language !== undefined) {
370 req.field('language', attributes.language.toString())
371 }
a7fea183
C
372 if (attributes.category !== undefined) {
373 req.field('category', attributes.category.toString())
374 }
375 if (attributes.licence !== undefined) {
376 req.field('licence', attributes.licence.toString())
377 }
8df87ce7 378
2422c46b
C
379 for (let i = 0; i < attributes.tags.length; i++) {
380 req.field('tags[' + i + ']', attributes.tags[i])
381 }
382
ac81d1a0
C
383 if (attributes.thumbnailfile !== undefined) {
384 req.attach('thumbnailfile', buildAbsoluteFixturePath(attributes.thumbnailfile))
385 }
386 if (attributes.previewfile !== undefined) {
387 req.attach('previewfile', buildAbsoluteFixturePath(attributes.previewfile))
0e1dc3e7
C
388 }
389
2baea0c7
C
390 if (attributes.scheduleUpdate) {
391 req.field('scheduleUpdate[updateAt]', attributes.scheduleUpdate.updateAt)
392
393 if (attributes.scheduleUpdate.privacy) {
394 req.field('scheduleUpdate[privacy]', attributes.scheduleUpdate.privacy)
395 }
396 }
397
84929846
AM
398 if (attributes.originallyPublishedAt !== undefined) {
399 req.field('originallyPublishedAt', attributes.originallyPublishedAt)
400 }
401
ac81d1a0 402 return req.attach('videofile', buildAbsoluteFixturePath(attributes.fixture))
0e1dc3e7
C
403 .expect(specialStatus)
404}
405
ac81d1a0 406function updateVideo (url: string, accessToken: string, id: number | string, attributes: VideoAttributes, statusCodeExpected = 204) {
0e1dc3e7
C
407 const path = '/api/v1/videos/' + id
408 const body = {}
409
410 if (attributes.name) body['name'] = attributes.name
411 if (attributes.category) body['category'] = attributes.category
412 if (attributes.licence) body['licence'] = attributes.licence
413 if (attributes.language) body['language'] = attributes.language
47564bbe
C
414 if (attributes.nsfw !== undefined) body['nsfw'] = JSON.stringify(attributes.nsfw)
415 if (attributes.commentsEnabled !== undefined) body['commentsEnabled'] = JSON.stringify(attributes.commentsEnabled)
7f2cfe3a 416 if (attributes.downloadEnabled !== undefined) body['downloadEnabled'] = JSON.stringify(attributes.downloadEnabled)
7519127b 417 if (attributes.originallyPublishedAt !== undefined) body['originallyPublishedAt'] = attributes.originallyPublishedAt
0e1dc3e7
C
418 if (attributes.description) body['description'] = attributes.description
419 if (attributes.tags) body['tags'] = attributes.tags
11474c3c 420 if (attributes.privacy) body['privacy'] = attributes.privacy
0f320037 421 if (attributes.channelId) body['channelId'] = attributes.channelId
2baea0c7 422 if (attributes.scheduleUpdate) body['scheduleUpdate'] = attributes.scheduleUpdate
0e1dc3e7 423
ac81d1a0
C
424 // Upload request
425 if (attributes.thumbnailfile || attributes.previewfile) {
426 const attaches: any = {}
427 if (attributes.thumbnailfile) attaches.thumbnailfile = attributes.thumbnailfile
428 if (attributes.previewfile) attaches.previewfile = attributes.previewfile
429
430 return makeUploadRequest({
431 url,
432 method: 'PUT',
433 path,
434 token: accessToken,
435 fields: body,
436 attaches,
437 statusCodeExpected
438 })
439 }
440
441 return makePutBodyRequest({
442 url,
443 path,
444 fields: body,
445 token: accessToken,
446 statusCodeExpected
447 })
0e1dc3e7
C
448}
449
450function rateVideo (url: string, accessToken: string, id: number, rating: string, specialStatus = 204) {
451 const path = '/api/v1/videos/' + id + '/rate'
452
453 return request(url)
454 .put(path)
455 .set('Accept', 'application/json')
456 .set('Authorization', 'Bearer ' + accessToken)
457 .send({ rating })
458 .expect(specialStatus)
459}
460
14d3270f 461function parseTorrentVideo (server: ServerInfo, videoUUID: string, resolution: number) {
fdbda9e3 462 return new Promise<any>((res, rej) => {
14d3270f 463 const torrentName = videoUUID + '-' + resolution + '.torrent'
2a8c5d0a 464 const torrentPath = join(root(), 'test' + server.serverNumber, 'torrents', torrentName)
fdbda9e3
C
465 readFile(torrentPath, (err, data) => {
466 if (err) return rej(err)
467
468 return res(parseTorrent(data))
469 })
470 })
471}
472
a20399c9
C
473async function completeVideoCheck (
474 url: string,
475 video: any,
476 attributes: {
477 name: string
478 category: number
479 licence: number
9d3ef9fe 480 language: string
a20399c9 481 nsfw: boolean
47564bbe 482 commentsEnabled: boolean
7f2cfe3a 483 downloadEnabled: boolean
a20399c9 484 description: string
53a61317 485 publishedAt?: string
2422c46b 486 support: string
7519127b 487 originallyPublishedAt?: string,
b64c950a
C
488 account: {
489 name: string
490 host: string
491 }
f6eebcb3
C
492 isLocal: boolean
493 tags: string[]
494 privacy: number
495 likes?: number
496 dislikes?: number
497 duration: number
a20399c9 498 channel: {
f6eebcb3
C
499 displayName: string
500 name: string
b1f5b93e 501 description
a20399c9
C
502 isLocal: boolean
503 }
f6eebcb3 504 fixture: string
a20399c9
C
505 files: {
506 resolution: number
507 size: number
ac81d1a0
C
508 }[],
509 thumbnailfile?: string
510 previewfile?: string
a20399c9
C
511 }
512) {
b1f5b93e
C
513 if (!attributes.likes) attributes.likes = 0
514 if (!attributes.dislikes) attributes.dislikes = 0
515
a20399c9 516 expect(video.name).to.equal(attributes.name)
09700934 517 expect(video.category.id).to.equal(attributes.category)
9d3ef9fe 518 expect(video.category.label).to.equal(attributes.category !== null ? VIDEO_CATEGORIES[attributes.category] : 'Misc')
09700934 519 expect(video.licence.id).to.equal(attributes.licence)
9d3ef9fe 520 expect(video.licence.label).to.equal(attributes.licence !== null ? VIDEO_LICENCES[attributes.licence] : 'Unknown')
09700934 521 expect(video.language.id).to.equal(attributes.language)
9d3ef9fe 522 expect(video.language.label).to.equal(attributes.language !== null ? VIDEO_LANGUAGES[attributes.language] : 'Unknown')
2243730c
C
523 expect(video.privacy.id).to.deep.equal(attributes.privacy)
524 expect(video.privacy.label).to.deep.equal(VIDEO_PRIVACIES[attributes.privacy])
a20399c9
C
525 expect(video.nsfw).to.equal(attributes.nsfw)
526 expect(video.description).to.equal(attributes.description)
03e12d7c 527 expect(video.account.id).to.be.a('number')
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 570 let extension = extname(attributes.fixture)
48f07b4a
C
571 // Transcoding enabled: extension will always be .mp4
572 if (attributes.files.length > 1) 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}