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
This commit is contained in:
parent
edb868655e
commit
8319d6ae72
23 changed files with 553 additions and 52 deletions
|
@ -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)
|
||||
})
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue