X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Ftests%2Fapi%2Fvideos%2Fvideo-transcoder.ts;h=5ad02df2fc786c95c6d9eca312313eedf8402ebe;hb=1896bca09e088b0da9d5e845407ecebae330618c;hp=f88c59f0d6edf38cdb25bdf737b71ec108ae2999;hpb=2d53be0267acc49cda46707b885096193a1f4e9c;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/tests/api/videos/video-transcoder.ts b/server/tests/api/videos/video-transcoder.ts index f88c59f0d..5ad02df2f 100644 --- a/server/tests/api/videos/video-transcoder.ts +++ b/server/tests/api/videos/video-transcoder.ts @@ -5,7 +5,9 @@ import * as chai from 'chai' import { FfprobeData } from 'fluent-ffmpeg' import { omit } from 'lodash' import { join } from 'path' +import { Job } from '@shared/models' import { VIDEO_TRANSCODING_FPS } from '../../../../server/initializers/constants' +import { HttpStatusCode } from '../../../../shared/core-utils/miscs/http-error-codes' import { buildAbsoluteFixturePath, buildServerDirectory, @@ -14,6 +16,7 @@ import { flushAndRunMultipleServers, generateHighBitrateVideo, generateVideoWithFramerate, + getJobsListPaginationAndSort, getMyVideos, getServerFileSize, getVideo, @@ -37,15 +40,15 @@ import { getVideoFileFPS, getVideoFileResolution } from '../../../helpers/ffprobe-utils' -import { HttpStatusCode } from '../../../../shared/core-utils/miscs/http-error-codes' const expect = chai.expect describe('Test video transcoding', function () { let servers: ServerInfo[] = [] + let video4k: string before(async function () { - this.timeout(30000) + this.timeout(30_000) // Run servers servers = await flushAndRunMultipleServers(2) @@ -56,7 +59,7 @@ describe('Test video transcoding', function () { }) it('Should not transcode video on server 1', async function () { - this.timeout(60000) + this.timeout(60_000) const videoAttributes = { name: 'my super name for server 1', @@ -86,7 +89,7 @@ describe('Test video transcoding', function () { }) it('Should transcode video on server 2', async function () { - this.timeout(120000) + this.timeout(120_000) const videoAttributes = { name: 'my super name for server 2', @@ -117,7 +120,7 @@ describe('Test video transcoding', function () { }) it('Should transcode high bit rate mp3 to proper bit rate', async function () { - this.timeout(60000) + this.timeout(60_000) const videoAttributes = { name: 'mp3_256k', @@ -149,7 +152,7 @@ describe('Test video transcoding', function () { }) it('Should transcode video with no audio and have no audio itself', async function () { - this.timeout(60000) + this.timeout(60_000) const videoAttributes = { name: 'no_audio', @@ -174,7 +177,7 @@ describe('Test video transcoding', function () { }) it('Should leave the audio untouched, but properly transcode the video', async function () { - this.timeout(60000) + this.timeout(60_000) const videoAttributes = { name: 'untouched_audio', @@ -209,7 +212,7 @@ describe('Test video transcoding', function () { }) it('Should transcode a 60 FPS video', async function () { - this.timeout(60000) + this.timeout(60_000) const videoAttributes = { name: 'my super 30fps name for server 2', @@ -248,7 +251,7 @@ describe('Test video transcoding', function () { }) it('Should wait for transcoding before publishing the video', async function () { - this.timeout(160000) + this.timeout(160_000) { // Upload the video, but wait transcoding @@ -301,7 +304,7 @@ describe('Test video transcoding', function () { }) it('Should respect maximum bitrate values', async function () { - this.timeout(160000) + this.timeout(160_000) let tempFixturePath: string @@ -341,7 +344,7 @@ describe('Test video transcoding', function () { }) it('Should accept and transcode additional extensions', async function () { - this.timeout(300000) + this.timeout(300_000) let tempFixturePath: string @@ -378,14 +381,14 @@ describe('Test video transcoding', function () { }) it('Should correctly detect if quick transcode is possible', async function () { - this.timeout(10000) + this.timeout(10_000) expect(await canDoQuickTranscode(buildAbsoluteFixturePath('video_short.mp4'))).to.be.true expect(await canDoQuickTranscode(buildAbsoluteFixturePath('video_short.webm'))).to.be.false }) it('Should merge an audio file with the preview file', async function () { - this.timeout(60000) + this.timeout(60_000) const videoAttributesArg = { name: 'audio_with_preview', previewfile: 'preview.jpg', fixture: 'sample.ogg' } await uploadVideo(servers[1].url, servers[1].accessToken, videoAttributesArg) @@ -410,7 +413,7 @@ describe('Test video transcoding', function () { }) it('Should upload an audio file and choose a default background image', async function () { - this.timeout(60000) + this.timeout(60_000) const videoAttributesArg = { name: 'audio_without_preview', fixture: 'sample.ogg' } await uploadVideo(servers[1].url, servers[1].accessToken, videoAttributesArg) @@ -435,7 +438,7 @@ describe('Test video transcoding', function () { }) it('Should downscale to the closest divisor standard framerate', async function () { - this.timeout(200000) + this.timeout(200_000) let tempFixturePath: string @@ -476,7 +479,7 @@ describe('Test video transcoding', function () { }) it('Should not transcode to an higher bitrate than the original file', async function () { - this.timeout(160000) + this.timeout(160_000) const config = { transcoding: { @@ -486,7 +489,9 @@ describe('Test video transcoding', function () { '360p': true, '480p': true, '720p': true, - '1080p': true + '1080p': true, + '1440p': true, + '2160p': true }, webtorrent: { enabled: true }, hls: { enabled: true } @@ -506,12 +511,14 @@ describe('Test video transcoding', function () { const resolutions = [ 240, 360, 480, 720, 1080 ] for (const r of resolutions) { - expect(await getServerFileSize(servers[1], `videos/${videoUUID}-${r}.mp4`)).to.be.below(60000) + const path = `videos/${videoUUID}-${r}.mp4` + const size = await getServerFileSize(servers[1], path) + expect(size, `${path} not below ${60_000}`).to.be.below(60_000) } }) it('Should provide valid ffprobe data', async function () { - this.timeout(160000) + this.timeout(160_000) const videoUUID = (await uploadVideoAndGetId({ server: servers[1], videoName: 'ffprobe data' })).uuid await waitJobs(servers) @@ -567,6 +574,69 @@ describe('Test video transcoding', function () { } }) + it('Should transcode a 4k video', async function () { + this.timeout(200_000) + + const videoAttributes = { + name: '4k video', + fixture: 'video_short_4k.mp4' + } + + const resUpload = await uploadVideo(servers[1].url, servers[1].accessToken, videoAttributes) + video4k = resUpload.body.video.uuid + + await waitJobs(servers) + + const resolutions = [ 240, 360, 480, 720, 1080, 1440, 2160 ] + + for (const server of servers) { + const res = await getVideo(server.url, video4k) + const videoDetails: VideoDetails = res.body + + expect(videoDetails.files).to.have.lengthOf(resolutions.length) + + for (const r of resolutions) { + expect(videoDetails.files.find(f => f.resolution.id === r)).to.not.be.undefined + expect(videoDetails.streamingPlaylists[0].files.find(f => f.resolution.id === r)).to.not.be.undefined + } + } + }) + + it('Should have the appropriate priorities for transcoding jobs', async function () { + const res = await getJobsListPaginationAndSort({ + url: servers[1].url, + accessToken: servers[1].accessToken, + start: 0, + count: 100, + sort: '-createdAt', + jobType: 'video-transcoding' + }) + + const jobs = res.body.data as Job[] + + const transcodingJobs = jobs.filter(j => j.data.videoUUID === video4k) + + expect(transcodingJobs).to.have.lengthOf(14) + + const hlsJobs = transcodingJobs.filter(j => j.data.type === 'new-resolution-to-hls') + const webtorrentJobs = transcodingJobs.filter(j => j.data.type === 'new-resolution-to-webtorrent') + const optimizeJobs = transcodingJobs.filter(j => j.data.type === 'optimize-to-webtorrent') + + expect(hlsJobs).to.have.lengthOf(7) + expect(webtorrentJobs).to.have.lengthOf(6) + expect(optimizeJobs).to.have.lengthOf(1) + + for (const j of optimizeJobs) { + expect(j.priority).to.be.greaterThan(11) + expect(j.priority).to.be.lessThan(50) + } + + for (const j of hlsJobs.concat(webtorrentJobs)) { + expect(j.priority).to.be.greaterThan(100) + expect(j.priority).to.be.lessThan(150) + } + }) + after(async function () { await cleanupTests(servers) })