diff options
Diffstat (limited to 'server/tests/api/videos/video-transcoder.ts')
-rw-r--r-- | server/tests/api/videos/video-transcoder.ts | 84 |
1 files changed, 63 insertions, 21 deletions
diff --git a/server/tests/api/videos/video-transcoder.ts b/server/tests/api/videos/video-transcoder.ts index 4be74901a..3e73ccbfa 100644 --- a/server/tests/api/videos/video-transcoder.ts +++ b/server/tests/api/videos/video-transcoder.ts | |||
@@ -1,4 +1,4 @@ | |||
1 | /* tslint:disable:no-unused-expression */ | 1 | /* eslint-disable @typescript-eslint/no-unused-expressions,@typescript-eslint/require-await */ |
2 | 2 | ||
3 | import * as chai from 'chai' | 3 | import * as chai from 'chai' |
4 | import 'mocha' | 4 | import 'mocha' |
@@ -11,6 +11,7 @@ import { | |||
11 | doubleFollow, | 11 | doubleFollow, |
12 | flushAndRunMultipleServers, | 12 | flushAndRunMultipleServers, |
13 | generateHighBitrateVideo, | 13 | generateHighBitrateVideo, |
14 | generateVideoWithFramerate, | ||
14 | getMyVideos, | 15 | getMyVideos, |
15 | getVideo, | 16 | getVideo, |
16 | getVideosList, | 17 | getVideosList, |
@@ -55,19 +56,19 @@ describe('Test video transcoding', function () { | |||
55 | 56 | ||
56 | for (const server of servers) { | 57 | for (const server of servers) { |
57 | const res = await getVideosList(server.url) | 58 | const res = await getVideosList(server.url) |
58 | const video = res.body.data[ 0 ] | 59 | const video = res.body.data[0] |
59 | 60 | ||
60 | const res2 = await getVideo(server.url, video.id) | 61 | const res2 = await getVideo(server.url, video.id) |
61 | const videoDetails = res2.body | 62 | const videoDetails = res2.body |
62 | expect(videoDetails.files).to.have.lengthOf(1) | 63 | expect(videoDetails.files).to.have.lengthOf(1) |
63 | 64 | ||
64 | const magnetUri = videoDetails.files[ 0 ].magnetUri | 65 | const magnetUri = videoDetails.files[0].magnetUri |
65 | expect(magnetUri).to.match(/\.webm/) | 66 | expect(magnetUri).to.match(/\.webm/) |
66 | 67 | ||
67 | const torrent = await webtorrentAdd(magnetUri, true) | 68 | const torrent = await webtorrentAdd(magnetUri, true) |
68 | expect(torrent.files).to.be.an('array') | 69 | expect(torrent.files).to.be.an('array') |
69 | expect(torrent.files.length).to.equal(1) | 70 | expect(torrent.files.length).to.equal(1) |
70 | expect(torrent.files[ 0 ].path).match(/\.webm$/) | 71 | expect(torrent.files[0].path).match(/\.webm$/) |
71 | } | 72 | } |
72 | }) | 73 | }) |
73 | 74 | ||
@@ -92,13 +93,13 @@ describe('Test video transcoding', function () { | |||
92 | 93 | ||
93 | expect(videoDetails.files).to.have.lengthOf(4) | 94 | expect(videoDetails.files).to.have.lengthOf(4) |
94 | 95 | ||
95 | const magnetUri = videoDetails.files[ 0 ].magnetUri | 96 | const magnetUri = videoDetails.files[0].magnetUri |
96 | expect(magnetUri).to.match(/\.mp4/) | 97 | expect(magnetUri).to.match(/\.mp4/) |
97 | 98 | ||
98 | const torrent = await webtorrentAdd(magnetUri, true) | 99 | const torrent = await webtorrentAdd(magnetUri, true) |
99 | expect(torrent.files).to.be.an('array') | 100 | expect(torrent.files).to.be.an('array') |
100 | expect(torrent.files.length).to.equal(1) | 101 | expect(torrent.files.length).to.equal(1) |
101 | expect(torrent.files[ 0 ].path).match(/\.mp4$/) | 102 | expect(torrent.files[0].path).match(/\.mp4$/) |
102 | } | 103 | } |
103 | }) | 104 | }) |
104 | 105 | ||
@@ -126,8 +127,8 @@ describe('Test video transcoding', function () { | |||
126 | const probe = await audio.get(path) | 127 | const probe = await audio.get(path) |
127 | 128 | ||
128 | if (probe.audioStream) { | 129 | if (probe.audioStream) { |
129 | expect(probe.audioStream[ 'codec_name' ]).to.be.equal('aac') | 130 | expect(probe.audioStream['codec_name']).to.be.equal('aac') |
130 | expect(probe.audioStream[ 'bit_rate' ]).to.be.at.most(384 * 8000) | 131 | expect(probe.audioStream['bit_rate']).to.be.at.most(384 * 8000) |
131 | } else { | 132 | } else { |
132 | this.fail('Could not retrieve the audio stream on ' + probe.absolutePath) | 133 | this.fail('Could not retrieve the audio stream on ' + probe.absolutePath) |
133 | } | 134 | } |
@@ -211,10 +212,10 @@ describe('Test video transcoding', function () { | |||
211 | const videoDetails: VideoDetails = res2.body | 212 | const videoDetails: VideoDetails = res2.body |
212 | 213 | ||
213 | expect(videoDetails.files).to.have.lengthOf(4) | 214 | expect(videoDetails.files).to.have.lengthOf(4) |
214 | expect(videoDetails.files[ 0 ].fps).to.be.above(58).and.below(62) | 215 | expect(videoDetails.files[0].fps).to.be.above(58).and.below(62) |
215 | expect(videoDetails.files[ 1 ].fps).to.be.below(31) | 216 | expect(videoDetails.files[1].fps).to.be.below(31) |
216 | expect(videoDetails.files[ 2 ].fps).to.be.below(31) | 217 | expect(videoDetails.files[2].fps).to.be.below(31) |
217 | expect(videoDetails.files[ 3 ].fps).to.be.below(31) | 218 | expect(videoDetails.files[3].fps).to.be.below(31) |
218 | 219 | ||
219 | for (const resolution of [ '240', '360', '480' ]) { | 220 | for (const resolution of [ '240', '360', '480' ]) { |
220 | const path = join(root(), 'test' + servers[1].internalServerNumber, 'videos', video.uuid + '-' + resolution + '.mp4') | 221 | const path = join(root(), 'test' + servers[1].internalServerNumber, 'videos', video.uuid + '-' + resolution + '.mp4') |
@@ -240,11 +241,11 @@ describe('Test video transcoding', function () { | |||
240 | fixture: 'video_short1.webm', | 241 | fixture: 'video_short1.webm', |
241 | waitTranscoding: true | 242 | waitTranscoding: true |
242 | } | 243 | } |
243 | const resVideo = await uploadVideo(servers[ 1 ].url, servers[ 1 ].accessToken, videoAttributes) | 244 | const resVideo = await uploadVideo(servers[1].url, servers[1].accessToken, videoAttributes) |
244 | const videoId = resVideo.body.video.uuid | 245 | const videoId = resVideo.body.video.uuid |
245 | 246 | ||
246 | // Should be in transcode state | 247 | // Should be in transcode state |
247 | const { body } = await getVideo(servers[ 1 ].url, videoId) | 248 | const { body } = await getVideo(servers[1].url, videoId) |
248 | expect(body.name).to.equal('waiting video') | 249 | expect(body.name).to.equal('waiting video') |
249 | expect(body.state.id).to.equal(VideoState.TO_TRANSCODE) | 250 | expect(body.state.id).to.equal(VideoState.TO_TRANSCODE) |
250 | expect(body.state.label).to.equal('To transcode') | 251 | expect(body.state.label).to.equal('To transcode') |
@@ -310,7 +311,7 @@ describe('Test video transcoding', function () { | |||
310 | 311 | ||
311 | const video = res.body.data.find(v => v.name === videoAttributes.name) | 312 | const video = res.body.data.find(v => v.name === videoAttributes.name) |
312 | 313 | ||
313 | for (const resolution of ['240', '360', '480', '720', '1080']) { | 314 | for (const resolution of [ '240', '360', '480', '720', '1080' ]) { |
314 | const path = join(root(), 'test' + servers[1].internalServerNumber, 'videos', video.uuid + '-' + resolution + '.mp4') | 315 | const path = join(root(), 'test' + servers[1].internalServerNumber, 'videos', video.uuid + '-' + resolution + '.mp4') |
315 | const bitrate = await getVideoFileBitrate(path) | 316 | const bitrate = await getVideoFileBitrate(path) |
316 | const fps = await getVideoFileFPS(path) | 317 | const fps = await getVideoFileFPS(path) |
@@ -340,7 +341,7 @@ describe('Test video transcoding', function () { | |||
340 | fixture | 341 | fixture |
341 | } | 342 | } |
342 | 343 | ||
343 | await uploadVideo(servers[ 1 ].url, servers[ 1 ].accessToken, videoAttributes) | 344 | await uploadVideo(servers[1].url, servers[1].accessToken, videoAttributes) |
344 | 345 | ||
345 | await waitJobs(servers) | 346 | await waitJobs(servers) |
346 | 347 | ||
@@ -353,7 +354,7 @@ describe('Test video transcoding', function () { | |||
353 | 354 | ||
354 | expect(videoDetails.files).to.have.lengthOf(4) | 355 | expect(videoDetails.files).to.have.lengthOf(4) |
355 | 356 | ||
356 | const magnetUri = videoDetails.files[ 0 ].magnetUri | 357 | const magnetUri = videoDetails.files[0].magnetUri |
357 | expect(magnetUri).to.contain('.mp4') | 358 | expect(magnetUri).to.contain('.mp4') |
358 | } | 359 | } |
359 | } | 360 | } |
@@ -370,7 +371,7 @@ describe('Test video transcoding', function () { | |||
370 | this.timeout(60000) | 371 | this.timeout(60000) |
371 | 372 | ||
372 | const videoAttributesArg = { name: 'audio_with_preview', previewfile: 'preview.jpg', fixture: 'sample.ogg' } | 373 | const videoAttributesArg = { name: 'audio_with_preview', previewfile: 'preview.jpg', fixture: 'sample.ogg' } |
373 | await uploadVideo(servers[ 1 ].url, servers[ 1 ].accessToken, videoAttributesArg) | 374 | await uploadVideo(servers[1].url, servers[1].accessToken, videoAttributesArg) |
374 | 375 | ||
375 | await waitJobs(servers) | 376 | await waitJobs(servers) |
376 | 377 | ||
@@ -386,7 +387,7 @@ describe('Test video transcoding', function () { | |||
386 | await makeGetRequest({ url: server.url, path: videoDetails.thumbnailPath, statusCodeExpected: 200 }) | 387 | await makeGetRequest({ url: server.url, path: videoDetails.thumbnailPath, statusCodeExpected: 200 }) |
387 | await makeGetRequest({ url: server.url, path: videoDetails.previewPath, statusCodeExpected: 200 }) | 388 | await makeGetRequest({ url: server.url, path: videoDetails.previewPath, statusCodeExpected: 200 }) |
388 | 389 | ||
389 | const magnetUri = videoDetails.files[ 0 ].magnetUri | 390 | const magnetUri = videoDetails.files[0].magnetUri |
390 | expect(magnetUri).to.contain('.mp4') | 391 | expect(magnetUri).to.contain('.mp4') |
391 | } | 392 | } |
392 | }) | 393 | }) |
@@ -395,7 +396,7 @@ describe('Test video transcoding', function () { | |||
395 | this.timeout(60000) | 396 | this.timeout(60000) |
396 | 397 | ||
397 | const videoAttributesArg = { name: 'audio_without_preview', fixture: 'sample.ogg' } | 398 | const videoAttributesArg = { name: 'audio_without_preview', fixture: 'sample.ogg' } |
398 | await uploadVideo(servers[ 1 ].url, servers[ 1 ].accessToken, videoAttributesArg) | 399 | await uploadVideo(servers[1].url, servers[1].accessToken, videoAttributesArg) |
399 | 400 | ||
400 | await waitJobs(servers) | 401 | await waitJobs(servers) |
401 | 402 | ||
@@ -411,11 +412,52 @@ describe('Test video transcoding', function () { | |||
411 | await makeGetRequest({ url: server.url, path: videoDetails.thumbnailPath, statusCodeExpected: 200 }) | 412 | await makeGetRequest({ url: server.url, path: videoDetails.thumbnailPath, statusCodeExpected: 200 }) |
412 | await makeGetRequest({ url: server.url, path: videoDetails.previewPath, statusCodeExpected: 200 }) | 413 | await makeGetRequest({ url: server.url, path: videoDetails.previewPath, statusCodeExpected: 200 }) |
413 | 414 | ||
414 | const magnetUri = videoDetails.files[ 0 ].magnetUri | 415 | const magnetUri = videoDetails.files[0].magnetUri |
415 | expect(magnetUri).to.contain('.mp4') | 416 | expect(magnetUri).to.contain('.mp4') |
416 | } | 417 | } |
417 | }) | 418 | }) |
418 | 419 | ||
420 | it('Should downscale to the closest divisor standard framerate', async function () { | ||
421 | this.timeout(160000) | ||
422 | |||
423 | let tempFixturePath: string | ||
424 | |||
425 | { | ||
426 | tempFixturePath = await generateVideoWithFramerate(59) | ||
427 | |||
428 | const fps = await getVideoFileFPS(tempFixturePath) | ||
429 | expect(fps).to.be.equal(59) | ||
430 | } | ||
431 | |||
432 | const videoAttributes = { | ||
433 | name: '59fps video', | ||
434 | description: '59fps video', | ||
435 | fixture: tempFixturePath | ||
436 | } | ||
437 | |||
438 | await uploadVideo(servers[1].url, servers[1].accessToken, videoAttributes) | ||
439 | |||
440 | await waitJobs(servers) | ||
441 | |||
442 | for (const server of servers) { | ||
443 | const res = await getVideosList(server.url) | ||
444 | |||
445 | const video = res.body.data.find(v => v.name === videoAttributes.name) | ||
446 | |||
447 | { | ||
448 | const path = join(root(), 'test' + servers[1].internalServerNumber, 'videos', video.uuid + '-240.mp4') | ||
449 | const fps = await getVideoFileFPS(path) | ||
450 | expect(fps).to.be.equal(25) | ||
451 | } | ||
452 | |||
453 | { | ||
454 | const path = join(root(), 'test' + servers[1].internalServerNumber, 'videos', video.uuid + '-720.mp4') | ||
455 | const fps = await getVideoFileFPS(path) | ||
456 | expect(fps).to.be.equal(59) | ||
457 | } | ||
458 | } | ||
459 | }) | ||
460 | |||
419 | after(async function () { | 461 | after(async function () { |
420 | await cleanupTests(servers) | 462 | await cleanupTests(servers) |
421 | }) | 463 | }) |