From 8319d6ae72d4da6de51bd3d4b5c68040fc8dc3b4 Mon Sep 17 00:00:00 2001 From: Rigel Kent Date: Tue, 10 Mar 2020 14:39:40 +0100 Subject: Add video file metadata to download modal, via ffprobe (#2411) * Add video file metadata via ffprobe * Federate video file metadata * Add tests for file metadata generation * Complete tests for videoFile metadata federation * Lint migration and video-file for metadata * Objectify metadata from getter in ffmpeg-utils * Add metadataUrl to all videoFiles * Simplify metadata API middleware * Load playlist in videoFile when requesting metadata --- server/tests/api/videos/video-transcoder.ts | 73 ++++++++++++++++++++++++++++- 1 file changed, 72 insertions(+), 1 deletion(-) (limited to 'server/tests/api') diff --git a/server/tests/api/videos/video-transcoder.ts b/server/tests/api/videos/video-transcoder.ts index 3e73ccbfa..ce0dd14d5 100644 --- a/server/tests/api/videos/video-transcoder.ts +++ b/server/tests/api/videos/video-transcoder.ts @@ -4,7 +4,14 @@ import * as chai from 'chai' import 'mocha' import { omit } from 'lodash' import { getMaxBitrate, VideoDetails, VideoResolution, VideoState } from '../../../../shared/models/videos' -import { audio, canDoQuickTranscode, getVideoFileBitrate, getVideoFileFPS, getVideoFileResolution } from '../../../helpers/ffmpeg-utils' +import { + audio, + canDoQuickTranscode, + getVideoFileBitrate, + getVideoFileFPS, + getVideoFileResolution, + getMetadataFromFile +} from '../../../helpers/ffmpeg-utils' import { buildAbsoluteFixturePath, cleanupTests, @@ -14,6 +21,7 @@ import { generateVideoWithFramerate, getMyVideos, getVideo, + getVideoFileMetadataUrl, getVideosList, makeGetRequest, root, @@ -25,6 +33,7 @@ import { } from '../../../../shared/extra-utils' import { join } from 'path' import { VIDEO_TRANSCODING_FPS } from '../../../../server/initializers/constants' +import { FfprobeData } from 'fluent-ffmpeg' const expect = chai.expect @@ -458,6 +467,68 @@ describe('Test video transcoding', function () { } }) + it('Should provide valid ffprobe data', async function () { + this.timeout(160000) + + const videoAttributes = { + name: 'my super name for server 1', + description: 'my super description for server 1', + fixture: 'video_short.webm' + } + await uploadVideo(servers[1].url, servers[1].accessToken, videoAttributes) + + await waitJobs(servers) + + const res = await getVideosList(servers[1].url) + + const videoOnOrigin = res.body.data.find(v => v.name === videoAttributes.name) + const res2 = await getVideo(servers[1].url, videoOnOrigin.id) + const videoOnOriginDetails: VideoDetails = res2.body + + { + const path = join(root(), 'test' + servers[1].internalServerNumber, 'videos', videoOnOrigin.uuid + '-240.mp4') + const metadata = await getMetadataFromFile(path) + for (const p of [ + // expected format properties + 'format.encoder', + 'format.format_long_name', + 'format.size', + 'format.bit_rate', + // expected stream properties + 'stream[0].codec_long_name', + 'stream[0].profile', + 'stream[0].width', + 'stream[0].height', + 'stream[0].display_aspect_ratio', + 'stream[0].avg_frame_rate', + 'stream[0].pix_fmt' + ]) { + expect(metadata).to.have.nested.property(p) + } + expect(metadata).to.not.have.nested.property('format.filename') + } + + for (const server of servers) { + const res = await getVideosList(server.url) + + const video = res.body.data.find(v => v.name === videoAttributes.name) + const res2 = await getVideo(server.url, video.id) + const videoDetails = res2.body + + const videoFiles = videoDetails.files + for (const [ index, file ] of videoFiles.entries()) { + expect(file.metadata).to.be.undefined + expect(file.metadataUrl).to.contain(servers[1].url) + expect(file.metadataUrl).to.contain(videoOnOrigin.uuid) + + const res3 = await getVideoFileMetadataUrl(file.metadataUrl) + const metadata: FfprobeData = res3.body + expect(metadata).to.have.nested.property('format.size') + expect(metadata.format.size).to.equal(videoOnOriginDetails.files[index].metadata.format.size) + } + } + }) + after(async function () { await cleanupTests(servers) }) -- cgit v1.2.3