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