"dev:client": "scripty",
"start": "node dist/server",
"update-host": "node ./dist/scripts/update-host.js",
+ "create-transcoding-job": "node ./dist/scripts/create-transcoding-job.js",
"test": "scripty",
"help": "scripty",
"generate-api-doc": "scripty",
--- /dev/null
+import * as program from 'commander'
+import { createReadStream } from 'fs'
+import { join } from 'path'
+import { createInterface } from 'readline'
+import { VideoModel } from '../server/models/video/video'
+import { initDatabaseModels } from '../server/initializers'
+import { JobQueue } from '../server/lib/job-queue'
+
+program
+ .option('-v, --video [videoUUID]', 'Video UUID')
+ .parse(process.argv)
+
+if (program['video'] === undefined) {
+ console.error('All parameters are mandatory.')
+ process.exit(-1)
+}
+
+run()
+ .then(() => process.exit(0))
+ .catch(err => {
+ console.error(err)
+ process.exit(-1)
+ })
+
+async function run () {
+ await initDatabaseModels(true)
+
+ const video = await VideoModel.loadByUUID(program['video'])
+ if (!video) throw new Error('Video not found.')
+
+ const dataInput = {
+ videoUUID: video.uuid,
+ isNewVideo: false
+ }
+
+ await JobQueue.Instance.init()
+ await JobQueue.Instance.createJob({ type: 'video-file', payload: dataInput })
+ console.log('Transcoding job for video %s created.', video.uuid)
+}
if (CONFIG.TRANSCODING.ENABLED === true) {
// Put uuid because we don't have id auto incremented for now
const dataInput = {
- videoUUID: videoCreated.uuid
+ videoUUID: videoCreated.uuid,
+ isNewVideo: true
}
await JobQueue.Instance.createJob({ type: 'video-file', payload: dataInput })
export type VideoFilePayload = {
videoUUID: string
- resolution?: VideoResolution,
+ isNewVideo: boolean
+ resolution?: VideoResolution
isPortraitMode?: boolean
}
await onVideoFileTranscoderSuccess(video)
} else {
await video.optimizeOriginalVideofile()
- await onVideoFileOptimizerSuccess(video)
+ await onVideoFileOptimizerSuccess(video, payload.isNewVideo)
}
return video
return undefined
}
-async function onVideoFileOptimizerSuccess (video: VideoModel) {
+async function onVideoFileOptimizerSuccess (video: VideoModel, isNewVideo: boolean) {
if (video === undefined) return undefined
// Maybe the video changed in database, refresh it
if (!videoDatabase) return undefined
if (video.privacy !== VideoPrivacy.PRIVATE) {
- // Now we'll add the video's meta data to our followers
- await sequelizeTypescript.transaction(async t => {
- await sendCreateVideo(video, t)
- await shareVideoByServerAndChannel(video, t)
- })
+ if (isNewVideo === true) {
+ // Now we'll add the video's meta data to our followers
+ await sequelizeTypescript.transaction(async t => {
+ await sendCreateVideo(video, t)
+ await shareVideoByServerAndChannel(video, t)
+ })
+ } else {
+ await sendUpdateVideo(video, undefined)
+ }
}
const { videoFileResolution } = await videoDatabase.getOriginalFileResolution()
for (const resolution of resolutionsEnabled) {
const dataInput = {
videoUUID: videoDatabase.uuid,
- resolution
+ resolution,
+ isNewVideo
}
const p = JobQueue.Instance.createJob({ type: 'video-file', payload: dataInput })
--- /dev/null
+/* tslint:disable:no-unused-expression */
+
+import 'mocha'
+import * as chai from 'chai'
+import { VideoDetails } from '../../../shared/models/videos'
+const expect = chai.expect
+
+import {
+ execCLI,
+ flushTests,
+ getEnvCli,
+ getVideosList,
+ killallServers,
+ parseTorrentVideo,
+ runServer,
+ ServerInfo,
+ setAccessTokensToServers,
+ uploadVideo,
+ wait,
+ getVideo, flushAndRunMultipleServers, doubleFollow
+} from '../utils'
+
+describe('Test create transcoding jobs', function () {
+ let servers: ServerInfo[] = []
+ let video2UUID: string
+
+ before(async function () {
+ this.timeout(60000)
+
+ await flushTests()
+
+ // Run server 2 to have transcoding enabled
+ servers = await flushAndRunMultipleServers(2)
+ await setAccessTokensToServers(servers)
+
+ await doubleFollow(servers[0], servers[1])
+
+ // Upload two videos for our needs
+ await uploadVideo(servers[0].url, servers[0].accessToken, { name: 'video1' })
+ const res = await uploadVideo(servers[0].url, servers[0].accessToken, { name: 'video2' })
+ video2UUID = res.body.video.uuid
+
+ await wait(3000)
+ })
+
+ it('Should have two video files on each server', async function () {
+ this.timeout(30000)
+
+ for (const server of servers) {
+ const res = await getVideosList(server.url)
+ const videos = res.body.data
+ expect(videos).to.have.lengthOf(2)
+
+ for (const video of videos) {
+ const res2 = await getVideo(server.url, video.uuid)
+ const videoDetail: VideoDetails = res2.body
+ expect(videoDetail.files).to.have.lengthOf(1)
+ }
+ }
+ })
+
+ it('Should run a transcoding job on video 2', async function () {
+ this.timeout(60000)
+
+ const env = getEnvCli(servers[0])
+ await execCLI(`${env} npm run create-transcoding-job -- -v ${video2UUID}`)
+
+ await wait(30000)
+
+ for (const server of servers) {
+ const res = await getVideosList(server.url)
+ const videos = res.body.data
+ expect(videos).to.have.lengthOf(2)
+
+ for (const video of videos) {
+ const res2 = await getVideo(server.url, video.uuid)
+ const videoDetail: VideoDetails = res2.body
+
+ if (video.uuid === video2UUID) {
+ expect(videoDetail.files).to.have.lengthOf(4)
+ } else {
+ expect(videoDetail.files).to.have.lengthOf(1)
+ }
+ }
+ }
+ })
+
+ after(async function () {
+ killallServers(servers)
+
+ // Keep the logs if the test failed
+ if (this['ok']) {
+ await flushTests()
+ }
+ })
+})
// Order of the tests we want to execute
+import './create-transcoding-job'
import './reset-password'
import './update-host'