]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blame - shared/extra-utils/videos/videos.ts
Merge branch 'release/2.1.0' into develop
[github/Chocobozzz/PeerTube.git] / shared / extra-utils / videos / videos.ts
CommitLineData
a1587156 1/* eslint-disable @typescript-eslint/no-unused-expressions,@typescript-eslint/no-floating-promises */
a20399c9
C
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 '../'
7cde3b9c 19import 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
cca1e13b 164function getMyVideos (url: string, accessToken: string, start: number, count: number, sort?: string, search?: string) {
11474c3c
C
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 })
cca1e13b 171 .query({ search: search })
11474c3c
C
172
173 if (sort) req.query({ sort })
174
175 return req.set('Accept', 'application/json')
176 .set('Authorization', 'Bearer ' + accessToken)
177 .expect(200)
178 .expect('Content-Type', /json/)
179}
180
d525fc39
C
181function getAccountVideos (
182 url: string,
183 accessToken: string,
184 accountName: string,
185 start: number,
186 count: number,
187 sort?: string,
188 query: { nsfw?: boolean } = {}
189) {
ad9e39fb 190 const path = '/api/v1/accounts/' + accountName + '/videos'
6b738c7a
C
191
192 return makeGetRequest({
193 url,
194 path,
d525fc39 195 query: immutableAssign(query, {
6b738c7a
C
196 start,
197 count,
198 sort
d525fc39 199 }),
6b738c7a
C
200 token: accessToken,
201 statusCodeExpected: 200
202 })
203}
204
205function getVideoChannelVideos (
206 url: string,
207 accessToken: string,
8a19bee1 208 videoChannelName: string,
6b738c7a
C
209 start: number,
210 count: number,
d525fc39
C
211 sort?: string,
212 query: { nsfw?: boolean } = {}
6b738c7a 213) {
8a19bee1 214 const path = '/api/v1/video-channels/' + videoChannelName + '/videos'
6b738c7a
C
215
216 return makeGetRequest({
217 url,
218 path,
d525fc39 219 query: immutableAssign(query, {
6b738c7a
C
220 start,
221 count,
222 sort
d525fc39 223 }),
6b738c7a
C
224 token: accessToken,
225 statusCodeExpected: 200
226 })
227}
228
418d092a
C
229function getPlaylistVideos (
230 url: string,
231 accessToken: string,
232 playlistId: number | string,
233 start: number,
234 count: number,
235 query: { nsfw?: boolean } = {}
236) {
237 const path = '/api/v1/video-playlists/' + playlistId + '/videos'
238
239 return makeGetRequest({
240 url,
241 path,
242 query: immutableAssign(query, {
243 start,
244 count
245 }),
246 token: accessToken,
247 statusCodeExpected: 200
248 })
249}
250
fe987656 251function getVideosListPagination (url: string, start: number, count: number, sort?: string, skipCount?: boolean) {
0e1dc3e7
C
252 const path = '/api/v1/videos'
253
254 const req = request(url)
255 .get(path)
256 .query({ start: start })
257 .query({ count: count })
258
259 if (sort) req.query({ sort })
fe987656 260 if (skipCount) req.query({ skipCount })
0e1dc3e7
C
261
262 return req.set('Accept', 'application/json')
263 .expect(200)
264 .expect('Content-Type', /json/)
265}
266
267function getVideosListSort (url: string, sort: string) {
268 const path = '/api/v1/videos'
269
270 return request(url)
271 .get(path)
272 .query({ sort: sort })
273 .set('Accept', 'application/json')
274 .expect(200)
275 .expect('Content-Type', /json/)
276}
277
d525fc39 278function getVideosWithFilters (url: string, query: { tagsAllOf: string[], categoryOneOf: number[] | number }) {
0e1dc3e7
C
279 const path = '/api/v1/videos'
280
281 return request(url)
57c36b27 282 .get(path)
d525fc39 283 .query(query)
f3aaa9a9 284 .set('Accept', 'application/json')
d525fc39 285 .expect(200)
f3aaa9a9 286 .expect('Content-Type', /json/)
0e1dc3e7
C
287}
288
d525fc39 289function removeVideo (url: string, token: string, id: number | string, expectedStatus = 204) {
0883b324 290 const path = '/api/v1/videos'
0e1dc3e7
C
291
292 return request(url)
d525fc39 293 .delete(path + '/' + id)
0e1dc3e7 294 .set('Accept', 'application/json')
d525fc39
C
295 .set('Authorization', 'Bearer ' + token)
296 .expect(expectedStatus)
0e1dc3e7
C
297}
298
25378bc8
C
299async function checkVideoFilesWereRemoved (
300 videoUUID: string,
301 serverNumber: number,
09209296
C
302 directories = [
303 'redundancy',
304 'videos',
305 'thumbnails',
306 'torrents',
307 'previews',
308 'captions',
309 join('playlists', 'hls'),
310 join('redundancy', 'hls')
311 ]
25378bc8 312) {
25378bc8 313 for (const directory of directories) {
e2600d8b 314 const directoryPath = buildServerDirectory(serverNumber, directory)
f05a1c30 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
970ceac0
C
382 const tags = attributes.tags || []
383 for (let i = 0; i < tags.length; i++) {
2422c46b
C
384 req.field('tags[' + i + ']', attributes.tags[i])
385 }
386
ac81d1a0
C
387 if (attributes.thumbnailfile !== undefined) {
388 req.attach('thumbnailfile', buildAbsoluteFixturePath(attributes.thumbnailfile))
389 }
390 if (attributes.previewfile !== undefined) {
391 req.attach('previewfile', buildAbsoluteFixturePath(attributes.previewfile))
0e1dc3e7
C
392 }
393
2baea0c7
C
394 if (attributes.scheduleUpdate) {
395 req.field('scheduleUpdate[updateAt]', attributes.scheduleUpdate.updateAt)
396
397 if (attributes.scheduleUpdate.privacy) {
398 req.field('scheduleUpdate[privacy]', attributes.scheduleUpdate.privacy)
399 }
400 }
401
84929846
AM
402 if (attributes.originallyPublishedAt !== undefined) {
403 req.field('originallyPublishedAt', attributes.originallyPublishedAt)
404 }
405
ac81d1a0 406 return req.attach('videofile', buildAbsoluteFixturePath(attributes.fixture))
0e1dc3e7
C
407 .expect(specialStatus)
408}
409
ac81d1a0 410function updateVideo (url: string, accessToken: string, id: number | string, attributes: VideoAttributes, statusCodeExpected = 204) {
0e1dc3e7
C
411 const path = '/api/v1/videos/' + id
412 const body = {}
413
414 if (attributes.name) body['name'] = attributes.name
415 if (attributes.category) body['category'] = attributes.category
416 if (attributes.licence) body['licence'] = attributes.licence
417 if (attributes.language) body['language'] = attributes.language
47564bbe
C
418 if (attributes.nsfw !== undefined) body['nsfw'] = JSON.stringify(attributes.nsfw)
419 if (attributes.commentsEnabled !== undefined) body['commentsEnabled'] = JSON.stringify(attributes.commentsEnabled)
7f2cfe3a 420 if (attributes.downloadEnabled !== undefined) body['downloadEnabled'] = JSON.stringify(attributes.downloadEnabled)
7519127b 421 if (attributes.originallyPublishedAt !== undefined) body['originallyPublishedAt'] = attributes.originallyPublishedAt
0e1dc3e7
C
422 if (attributes.description) body['description'] = attributes.description
423 if (attributes.tags) body['tags'] = attributes.tags
11474c3c 424 if (attributes.privacy) body['privacy'] = attributes.privacy
0f320037 425 if (attributes.channelId) body['channelId'] = attributes.channelId
2baea0c7 426 if (attributes.scheduleUpdate) body['scheduleUpdate'] = attributes.scheduleUpdate
0e1dc3e7 427
ac81d1a0
C
428 // Upload request
429 if (attributes.thumbnailfile || attributes.previewfile) {
430 const attaches: any = {}
431 if (attributes.thumbnailfile) attaches.thumbnailfile = attributes.thumbnailfile
432 if (attributes.previewfile) attaches.previewfile = attributes.previewfile
433
434 return makeUploadRequest({
435 url,
436 method: 'PUT',
437 path,
438 token: accessToken,
439 fields: body,
440 attaches,
441 statusCodeExpected
442 })
443 }
444
445 return makePutBodyRequest({
446 url,
447 path,
448 fields: body,
449 token: accessToken,
450 statusCodeExpected
451 })
0e1dc3e7
C
452}
453
454function rateVideo (url: string, accessToken: string, id: number, rating: string, specialStatus = 204) {
455 const path = '/api/v1/videos/' + id + '/rate'
456
457 return request(url)
458 .put(path)
459 .set('Accept', 'application/json')
460 .set('Authorization', 'Bearer ' + accessToken)
461 .send({ rating })
462 .expect(specialStatus)
463}
464
14d3270f 465function parseTorrentVideo (server: ServerInfo, videoUUID: string, resolution: number) {
fdbda9e3 466 return new Promise<any>((res, rej) => {
14d3270f 467 const torrentName = videoUUID + '-' + resolution + '.torrent'
ffc65cbd 468 const torrentPath = join(root(), 'test' + server.internalServerNumber, 'torrents', torrentName)
fdbda9e3
C
469 readFile(torrentPath, (err, data) => {
470 if (err) return rej(err)
471
472 return res(parseTorrent(data))
473 })
474 })
475}
476
a20399c9
C
477async function completeVideoCheck (
478 url: string,
479 video: any,
480 attributes: {
481 name: string
482 category: number
483 licence: number
9d3ef9fe 484 language: string
a20399c9 485 nsfw: boolean
47564bbe 486 commentsEnabled: boolean
7f2cfe3a 487 downloadEnabled: boolean
a20399c9 488 description: string
53a61317 489 publishedAt?: string
2422c46b 490 support: string
a1587156 491 originallyPublishedAt?: string
b64c950a
C
492 account: {
493 name: string
494 host: string
495 }
f6eebcb3
C
496 isLocal: boolean
497 tags: string[]
498 privacy: number
499 likes?: number
500 dislikes?: number
501 duration: number
a20399c9 502 channel: {
f6eebcb3
C
503 displayName: string
504 name: string
b1f5b93e 505 description
a20399c9
C
506 isLocal: boolean
507 }
f6eebcb3 508 fixture: string
a20399c9
C
509 files: {
510 resolution: number
511 size: number
a1587156 512 }[]
ac81d1a0
C
513 thumbnailfile?: string
514 previewfile?: string
a20399c9
C
515 }
516) {
b1f5b93e
C
517 if (!attributes.likes) attributes.likes = 0
518 if (!attributes.dislikes) attributes.dislikes = 0
519
a20399c9 520 expect(video.name).to.equal(attributes.name)
09700934 521 expect(video.category.id).to.equal(attributes.category)
9d3ef9fe 522 expect(video.category.label).to.equal(attributes.category !== null ? VIDEO_CATEGORIES[attributes.category] : 'Misc')
09700934 523 expect(video.licence.id).to.equal(attributes.licence)
9d3ef9fe 524 expect(video.licence.label).to.equal(attributes.licence !== null ? VIDEO_LICENCES[attributes.licence] : 'Unknown')
09700934 525 expect(video.language.id).to.equal(attributes.language)
9d3ef9fe 526 expect(video.language.label).to.equal(attributes.language !== null ? VIDEO_LANGUAGES[attributes.language] : 'Unknown')
2243730c
C
527 expect(video.privacy.id).to.deep.equal(attributes.privacy)
528 expect(video.privacy.label).to.deep.equal(VIDEO_PRIVACIES[attributes.privacy])
a20399c9
C
529 expect(video.nsfw).to.equal(attributes.nsfw)
530 expect(video.description).to.equal(attributes.description)
03e12d7c 531 expect(video.account.id).to.be.a('number')
b64c950a
C
532 expect(video.account.host).to.equal(attributes.account.host)
533 expect(video.account.name).to.equal(attributes.account.name)
f6eebcb3
C
534 expect(video.channel.displayName).to.equal(attributes.channel.displayName)
535 expect(video.channel.name).to.equal(attributes.channel.name)
b1f5b93e
C
536 expect(video.likes).to.equal(attributes.likes)
537 expect(video.dislikes).to.equal(attributes.dislikes)
a20399c9 538 expect(video.isLocal).to.equal(attributes.isLocal)
b1f5b93e 539 expect(video.duration).to.equal(attributes.duration)
a20399c9 540 expect(dateIsValid(video.createdAt)).to.be.true
c49db162 541 expect(dateIsValid(video.publishedAt)).to.be.true
a20399c9
C
542 expect(dateIsValid(video.updatedAt)).to.be.true
543
53a61317 544 if (attributes.publishedAt) {
53a61317
C
545 expect(video.publishedAt).to.equal(attributes.publishedAt)
546 }
547
7519127b
C
548 if (attributes.originallyPublishedAt) {
549 expect(video.originallyPublishedAt).to.equal(attributes.originallyPublishedAt)
550 } else {
551 expect(video.originallyPublishedAt).to.be.null
552 }
553
66b16caf 554 const res = await getVideo(url, video.uuid)
0f320037 555 const videoDetails: VideoDetails = res.body
a20399c9
C
556
557 expect(videoDetails.files).to.have.lengthOf(attributes.files.length)
558 expect(videoDetails.tags).to.deep.equal(attributes.tags)
19a3b914
C
559 expect(videoDetails.account.name).to.equal(attributes.account.name)
560 expect(videoDetails.account.host).to.equal(attributes.account.host)
f6eebcb3
C
561 expect(video.channel.displayName).to.equal(attributes.channel.displayName)
562 expect(video.channel.name).to.equal(attributes.channel.name)
0f320037 563 expect(videoDetails.channel.host).to.equal(attributes.account.host)
a20399c9 564 expect(videoDetails.channel.isLocal).to.equal(attributes.channel.isLocal)
0f320037
C
565 expect(dateIsValid(videoDetails.channel.createdAt.toString())).to.be.true
566 expect(dateIsValid(videoDetails.channel.updatedAt.toString())).to.be.true
567 expect(videoDetails.commentsEnabled).to.equal(attributes.commentsEnabled)
7f2cfe3a 568 expect(videoDetails.downloadEnabled).to.equal(attributes.downloadEnabled)
a20399c9
C
569
570 for (const attributeFile of attributes.files) {
5d00a3d7 571 const file = videoDetails.files.find(f => f.resolution.id === attributeFile.resolution)
a20399c9
C
572 expect(file).not.to.be.undefined
573
b1f5b93e 574 let extension = extname(attributes.fixture)
48f07b4a
C
575 // Transcoding enabled: extension will always be .mp4
576 if (attributes.files.length > 1) extension = '.mp4'
b1f5b93e 577
a20399c9 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)
a1587156
C
586 expect(
587 file.size,
588 'File size for resolution ' + file.resolution.label + ' outside confidence interval (' + minSize + '> size <' + maxSize + ')'
589 ).to.be.above(minSize).and.below(maxSize)
a20399c9 590
d7a25329 591 const torrent = await webtorrentAdd(file.magnetUri, true)
a20399c9
C
592 expect(torrent.files).to.be.an('array')
593 expect(torrent.files.length).to.equal(1)
594 expect(torrent.files[0].path).to.exist.and.to.not.equal('')
595 }
44d4ee4f
C
596
597 await testImage(url, attributes.thumbnailfile || attributes.fixture, videoDetails.thumbnailPath)
598
599 if (attributes.previewfile) {
600 await testImage(url, attributes.previewfile, videoDetails.previewPath)
601 }
a20399c9
C
602}
603
df0b219d
C
604async function videoUUIDToId (url: string, id: number | string) {
605 if (validator.isUUID('' + id) === false) return id
606
607 const res = await getVideo(url, id)
608 return res.body.id
609}
610
b764380a 611async function uploadVideoAndGetId (options: {
a1587156
C
612 server: ServerInfo
613 videoName: string
614 nsfw?: boolean
615 privacy?: VideoPrivacy
b764380a
C
616 token?: string
617}) {
df0b219d
C
618 const videoAttrs: any = { name: options.videoName }
619 if (options.nsfw) videoAttrs.nsfw = options.nsfw
b764380a 620 if (options.privacy) videoAttrs.privacy = options.privacy
df0b219d 621
df0b219d
C
622 const res = await uploadVideo(options.server.url, options.token || options.server.accessToken, videoAttrs)
623
624 return { id: res.body.video.id, uuid: res.body.video.uuid }
625}
626
b764380a
C
627async function getLocalIdByUUID (url: string, uuid: string) {
628 const res = await getVideo(url, uuid)
629
630 return res.body.id
631}
632
0e1dc3e7
C
633// ---------------------------------------------------------------------------
634
635export {
9567011b 636 getVideoDescription,
0e1dc3e7
C
637 getVideoCategories,
638 getVideoLicences,
df0b219d 639 videoUUIDToId,
11474c3c 640 getVideoPrivacies,
0e1dc3e7 641 getVideoLanguages,
11474c3c 642 getMyVideos,
6b738c7a
C
643 getAccountVideos,
644 getVideoChannelVideos,
0e1dc3e7 645 getVideo,
11474c3c 646 getVideoWithToken,
0e1dc3e7
C
647 getVideosList,
648 getVideosListPagination,
649 getVideosListSort,
650 removeVideo,
0883b324 651 getVideosListWithToken,
0e1dc3e7 652 uploadVideo,
d525fc39 653 getVideosWithFilters,
0e1dc3e7 654 updateVideo,
fdbda9e3 655 rateVideo,
1f3e9fec 656 viewVideo,
a20399c9 657 parseTorrentVideo,
066e94c5 658 getLocalVideos,
f05a1c30 659 completeVideoCheck,
418d092a 660 checkVideoFilesWereRemoved,
df0b219d 661 getPlaylistVideos,
b764380a
C
662 uploadVideoAndGetId,
663 getLocalIdByUUID
0e1dc3e7 664}