]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blame - shared/extra-utils/videos/videos.ts
Fix avatar url validation
[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
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'
2a8c5d0a 468 const torrentPath = join(root(), 'test' + server.serverNumber, '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
7519127b 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
ac81d1a0
C
512 }[],
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
C
578 const magnetUri = file.magnetUri
579 expect(file.magnetUri).to.have.lengthOf.above(2)
5d00a3d7
C
580 expect(file.torrentUrl).to.equal(`http://${attributes.account.host}/static/torrents/${videoDetails.uuid}-${file.resolution.id}.torrent`)
581 expect(file.fileUrl).to.equal(`http://${attributes.account.host}/static/webseed/${videoDetails.uuid}-${file.resolution.id}${extension}`)
09700934
C
582 expect(file.resolution.id).to.equal(attributeFile.resolution)
583 expect(file.resolution.label).to.equal(attributeFile.resolution + 'p')
b1f5b93e
C
584
585 const minSize = attributeFile.size - ((10 * attributeFile.size) / 100)
586 const maxSize = attributeFile.size + ((10 * attributeFile.size) / 100)
4176e227 587 expect(file.size,
7160878c 588 'File size for resolution ' + file.resolution.label + ' outside confidence interval (' + minSize + '> size <' + maxSize + ')')
4176e227 589 .to.be.above(minSize).and.below(maxSize)
a20399c9 590
ac81d1a0 591 {
7b0956ec 592 await testImage(url, attributes.thumbnailfile || attributes.fixture, videoDetails.thumbnailPath)
ac81d1a0
C
593 }
594
595 if (attributes.previewfile) {
7b0956ec 596 await testImage(url, attributes.previewfile, videoDetails.previewPath)
ac81d1a0 597 }
a20399c9
C
598
599 const torrent = await webtorrentAdd(magnetUri, true)
600 expect(torrent.files).to.be.an('array')
601 expect(torrent.files.length).to.equal(1)
602 expect(torrent.files[0].path).to.exist.and.to.not.equal('')
603 }
604}
605
df0b219d
C
606async function videoUUIDToId (url: string, id: number | string) {
607 if (validator.isUUID('' + id) === false) return id
608
609 const res = await getVideo(url, id)
610 return res.body.id
611}
612
613async function uploadVideoAndGetId (options: { server: ServerInfo, videoName: string, nsfw?: boolean, token?: string }) {
614 const videoAttrs: any = { name: options.videoName }
615 if (options.nsfw) videoAttrs.nsfw = options.nsfw
616
df0b219d
C
617 const res = await uploadVideo(options.server.url, options.token || options.server.accessToken, videoAttrs)
618
619 return { id: res.body.video.id, uuid: res.body.video.uuid }
620}
621
0e1dc3e7
C
622// ---------------------------------------------------------------------------
623
624export {
9567011b 625 getVideoDescription,
0e1dc3e7
C
626 getVideoCategories,
627 getVideoLicences,
df0b219d 628 videoUUIDToId,
11474c3c 629 getVideoPrivacies,
0e1dc3e7 630 getVideoLanguages,
11474c3c 631 getMyVideos,
6b738c7a
C
632 getAccountVideos,
633 getVideoChannelVideos,
0e1dc3e7 634 getVideo,
11474c3c 635 getVideoWithToken,
0e1dc3e7
C
636 getVideosList,
637 getVideosListPagination,
638 getVideosListSort,
639 removeVideo,
0883b324 640 getVideosListWithToken,
0e1dc3e7 641 uploadVideo,
d525fc39 642 getVideosWithFilters,
0e1dc3e7 643 updateVideo,
fdbda9e3 644 rateVideo,
1f3e9fec 645 viewVideo,
a20399c9 646 parseTorrentVideo,
066e94c5 647 getLocalVideos,
f05a1c30 648 completeVideoCheck,
418d092a 649 checkVideoFilesWereRemoved,
df0b219d
C
650 getPlaylistVideos,
651 uploadVideoAndGetId
0e1dc3e7 652}