X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Ftests%2Fapi%2Fvideos%2Fvideo-transcoder.ts;h=7ed55b8e8d3d18b0fb2c3e2fe98c0169f723d9f9;hb=a37e9e74ff07b057370d1ed6c0b391a02be8a6d2;hp=2a09e95bf98e75a50600eaba042be61943f3603b;hpb=171efc48e67498406feb6d7873b3482b41505515;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/tests/api/videos/video-transcoder.ts b/server/tests/api/videos/video-transcoder.ts index 2a09e95bf..7ed55b8e8 100644 --- a/server/tests/api/videos/video-transcoder.ts +++ b/server/tests/api/videos/video-transcoder.ts @@ -3,6 +3,7 @@ import 'mocha' import * as chai from 'chai' import { omit } from 'lodash' +import { getMaxBitrate, getMinLimitBitrate } from '@shared/core-utils' import { buildAbsoluteFixturePath, cleanupTests, @@ -10,15 +11,13 @@ import { doubleFollow, generateHighBitrateVideo, generateVideoWithFramerate, - getFileSize, makeGetRequest, PeerTubeServer, setAccessTokensToServers, waitJobs, webtorrentAdd } from '@shared/extra-utils' -import { getMaxBitrate, HttpStatusCode, VideoResolution, VideoState } from '@shared/models' -import { VIDEO_TRANSCODING_FPS } from '../../../../server/initializers/constants' +import { HttpStatusCode, VideoState } from '@shared/models' import { canDoQuickTranscode, getAudioStream, @@ -41,6 +40,7 @@ function updateConfigForTranscoding (server: PeerTubeServer) { webtorrent: { enabled: true }, resolutions: { '0p': false, + '144p': true, '240p': true, '360p': true, '480p': true, @@ -120,7 +120,7 @@ describe('Test video transcoding', function () { const video = data.find(v => v.name === attributes.name) const videoDetails = await server.videos.get({ id: video.id }) - expect(videoDetails.files).to.have.lengthOf(4) + expect(videoDetails.files).to.have.lengthOf(5) const magnetUri = videoDetails.files[0].magnetUri expect(magnetUri).to.match(/\.mp4/) @@ -191,15 +191,6 @@ describe('Test video transcoding', function () { it('Should accept and transcode additional extensions', async function () { this.timeout(300_000) - let tempFixturePath: string - - { - tempFixturePath = await generateHighBitrateVideo() - - const bitrate = await getVideoFileBitrate(tempFixturePath) - expect(bitrate).to.be.above(getMaxBitrate(VideoResolution.H_1080P, 25, VIDEO_TRANSCODING_FPS)) - } - for (const fixture of [ 'video_short.mkv', 'video_short.avi' ]) { const attributes = { name: fixture, @@ -215,7 +206,7 @@ describe('Test video transcoding', function () { const video = data.find(v => v.name === attributes.name) const videoDetails = await server.videos.get({ id: video.id }) - expect(videoDetails.files).to.have.lengthOf(4) + expect(videoDetails.files).to.have.lengthOf(5) const magnetUri = videoDetails.files[0].magnetUri expect(magnetUri).to.contain('.mp4') @@ -236,7 +227,7 @@ describe('Test video transcoding', function () { await waitJobs(servers) - const resolutions = [ 240, 360, 480, 720, 1080, 1440, 2160 ] + const resolutions = [ 144, 240, 360, 480, 720, 1080, 1440, 2160 ] for (const server of servers) { const videoDetails = await server.videos.get({ id: video4k }) @@ -269,7 +260,7 @@ describe('Test video transcoding', function () { const video = data.find(v => v.name === attributes.name) const videoDetails = await server.videos.get({ id: video.id }) - expect(videoDetails.files).to.have.lengthOf(4) + expect(videoDetails.files).to.have.lengthOf(5) const file = videoDetails.files.find(f => f.resolution.id === 240) const path = servers[1].servers.buildWebTorrentFilePath(file.fileUrl) @@ -326,7 +317,7 @@ describe('Test video transcoding', function () { const video = data.find(v => v.name === attributes.name) const videoDetails = await server.videos.get({ id: video.id }) - expect(videoDetails.files).to.have.lengthOf(4) + expect(videoDetails.files).to.have.lengthOf(5) const fixturePath = buildAbsoluteFixturePath(attributes.fixture) const fixtureVideoProbe = await getAudioStream(fixturePath) @@ -358,6 +349,7 @@ describe('Test video transcoding', function () { webtorrent: { enabled: true }, resolutions: { '0p': false, + '144p': false, '240p': false, '360p': false, '480p': false, @@ -429,6 +421,7 @@ describe('Test video transcoding', function () { webtorrent: { enabled: true }, resolutions: { '0p': true, + '144p': false, '240p': false, '360p': false } @@ -483,13 +476,14 @@ describe('Test video transcoding', function () { const video = data.find(v => v.name === attributes.name) const videoDetails = await server.videos.get({ id: video.id }) - expect(videoDetails.files).to.have.lengthOf(4) + expect(videoDetails.files).to.have.lengthOf(5) expect(videoDetails.files[0].fps).to.be.above(58).and.below(62) expect(videoDetails.files[1].fps).to.be.below(31) expect(videoDetails.files[2].fps).to.be.below(31) expect(videoDetails.files[3].fps).to.be.below(31) + expect(videoDetails.files[4].fps).to.be.below(31) - for (const resolution of [ 240, 360, 480 ]) { + for (const resolution of [ 144, 240, 360, 480 ]) { const file = videoDetails.files.find(f => f.resolution.id === resolution) const path = servers[1].servers.buildWebTorrentFilePath(file.fileUrl) const fps = await getVideoFileFPS(path) @@ -555,14 +549,7 @@ describe('Test video transcoding', function () { it('Should respect maximum bitrate values', async function () { this.timeout(160_000) - let tempFixturePath: string - - { - tempFixturePath = await generateHighBitrateVideo() - - const bitrate = await getVideoFileBitrate(tempFixturePath) - expect(bitrate).to.be.above(getMaxBitrate(VideoResolution.H_1080P, 25, VIDEO_TRANSCODING_FPS)) - } + const tempFixturePath = await generateHighBitrateVideo() const attributes = { name: 'high bitrate video', @@ -586,21 +573,24 @@ describe('Test video transcoding', function () { const bitrate = await getVideoFileBitrate(path) const fps = await getVideoFileFPS(path) - const { videoFileResolution } = await getVideoFileResolution(path) + const dataResolution = await getVideoFileResolution(path) - expect(videoFileResolution).to.equal(resolution) - expect(bitrate).to.be.below(getMaxBitrate(videoFileResolution, fps, VIDEO_TRANSCODING_FPS)) + expect(resolution).to.equal(resolution) + + const maxBitrate = getMaxBitrate({ ...dataResolution, fps }) + expect(bitrate).to.be.below(maxBitrate) } } }) - it('Should not transcode to an higher bitrate than the original file', async function () { + it('Should not transcode to an higher bitrate than the original file but above our low limit', async function () { this.timeout(160_000) const newConfig = { transcoding: { enabled: true, resolutions: { + '144p': true, '240p': true, '360p': true, '480p': true, @@ -631,8 +621,14 @@ describe('Test video transcoding', function () { const file = video.files.find(f => f.resolution.id === r) const path = servers[1].servers.buildWebTorrentFilePath(file.fileUrl) - const size = await getFileSize(path) - expect(size, `${path} not below ${60_000}`).to.be.below(60_000) + const bitrate = await getVideoFileBitrate(path) + + const inputBitrate = 60_000 + const limit = getMinLimitBitrate({ fps: 10, ratio: 1, resolution: r }) + let belowValue = Math.max(inputBitrate, limit) + belowValue += belowValue * 0.20 // Apply 20% margin because bitrate control is not very precise + + expect(bitrate, `${path} not below ${limit}`).to.be.below(belowValue) } }) }) @@ -682,7 +678,7 @@ describe('Test video transcoding', function () { const videoFiles = videoDetails.files .concat(videoDetails.streamingPlaylists[0].files) - expect(videoFiles).to.have.lengthOf(8) + expect(videoFiles).to.have.lengthOf(10) for (const file of videoFiles) { expect(file.metadata).to.be.undefined @@ -707,24 +703,24 @@ describe('Test video transcoding', function () { describe('Transcoding job queue', function () { it('Should have the appropriate priorities for transcoding jobs', async function () { - const body = await servers[1].jobs.getJobsList({ + const body = await servers[1].jobs.list({ start: 0, count: 100, - sort: '-createdAt', + sort: 'createdAt', jobType: 'video-transcoding' }) const jobs = body.data const transcodingJobs = jobs.filter(j => j.data.videoUUID === video4k) - expect(transcodingJobs).to.have.lengthOf(14) + expect(transcodingJobs).to.have.lengthOf(16) 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(hlsJobs).to.have.lengthOf(8) + expect(webtorrentJobs).to.have.lengthOf(7) expect(optimizeJobs).to.have.lengthOf(1) for (const j of optimizeJobs.concat(hlsJobs.concat(webtorrentJobs))) {