]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blobdiff - server/controllers/api/videos/studio.ts
Support studio transcoding in peertube runner
[github/Chocobozzz/PeerTube.git] / server / controllers / api / videos / studio.ts
index 6667532bf53cfcc61f8f970da875d4071d02b5c9..7c31dfd2be9fe77a37899be1825b15467695a542 100644 (file)
@@ -1,8 +1,10 @@
+import Bluebird from 'bluebird'
 import express from 'express'
+import { move } from 'fs-extra'
+import { basename } from 'path'
 import { createAnyReqFiles } from '@server/helpers/express-utils'
-import { MIMETYPES } from '@server/initializers/constants'
-import { JobQueue } from '@server/lib/job-queue'
-import { buildTaskFileFieldname, getTaskFile } from '@server/lib/video-studio'
+import { MIMETYPES, VIDEO_FILTERS } from '@server/initializers/constants'
+import { buildTaskFileFieldname, createVideoStudioJob, getStudioTaskFilePath, getTaskFileFromReq } from '@server/lib/video-studio'
 import {
   HttpStatusCode,
   VideoState,
@@ -68,16 +70,24 @@ async function createEditionTasks (req: express.Request, res: express.Response)
 
   const payload = {
     videoUUID: video.uuid,
-    tasks: body.tasks.map((t, i) => buildTaskPayload(t, i, files))
+    tasks: await Bluebird.mapSeries(body.tasks, (t, i) => buildTaskPayload(t, i, files))
   }
 
-  JobQueue.Instance.createJobAsync({ type: 'video-studio-edition', payload })
+  await createVideoStudioJob({
+    user: res.locals.oauth.token.User,
+    payload,
+    video
+  })
 
   return res.sendStatus(HttpStatusCode.NO_CONTENT_204)
 }
 
 const taskPayloadBuilders: {
-  [id in VideoStudioTask['name']]: (task: VideoStudioTask, indice?: number, files?: Express.Multer.File[]) => VideoStudioTaskPayload
+  [id in VideoStudioTask['name']]: (
+    task: VideoStudioTask,
+    indice?: number,
+    files?: Express.Multer.File[]
+  ) => Promise<VideoStudioTaskPayload>
 } = {
   'add-intro': buildIntroOutroTask,
   'add-outro': buildIntroOutroTask,
@@ -85,34 +95,49 @@ const taskPayloadBuilders: {
   'add-watermark': buildWatermarkTask
 }
 
-function buildTaskPayload (task: VideoStudioTask, indice: number, files: Express.Multer.File[]): VideoStudioTaskPayload {
+function buildTaskPayload (task: VideoStudioTask, indice: number, files: Express.Multer.File[]): Promise<VideoStudioTaskPayload> {
   return taskPayloadBuilders[task.name](task, indice, files)
 }
 
-function buildIntroOutroTask (task: VideoStudioTaskIntro | VideoStudioTaskOutro, indice: number, files: Express.Multer.File[]) {
+async function buildIntroOutroTask (task: VideoStudioTaskIntro | VideoStudioTaskOutro, indice: number, files: Express.Multer.File[]) {
+  const destination = await moveStudioFileToPersistentTMP(getTaskFileFromReq(files, indice).path)
+
   return {
     name: task.name,
     options: {
-      file: getTaskFile(files, indice).path
+      file: destination
     }
   }
 }
 
 function buildCutTask (task: VideoStudioTaskCut) {
-  return {
+  return Promise.resolve({
     name: task.name,
     options: {
       start: task.options.start,
       end: task.options.end
     }
-  }
+  })
 }
 
-function buildWatermarkTask (task: VideoStudioTaskWatermark, indice: number, files: Express.Multer.File[]) {
+async function buildWatermarkTask (task: VideoStudioTaskWatermark, indice: number, files: Express.Multer.File[]) {
+  const destination = await moveStudioFileToPersistentTMP(getTaskFileFromReq(files, indice).path)
+
   return {
     name: task.name,
     options: {
-      file: getTaskFile(files, indice).path
+      file: destination,
+      watermarkSizeRatio: VIDEO_FILTERS.WATERMARK.SIZE_RATIO,
+      horitonzalMarginRatio: VIDEO_FILTERS.WATERMARK.HORIZONTAL_MARGIN_RATIO,
+      verticalMarginRatio: VIDEO_FILTERS.WATERMARK.VERTICAL_MARGIN_RATIO
     }
   }
 }
+
+async function moveStudioFileToPersistentTMP (file: string) {
+  const destination = getStudioTaskFilePath(basename(file))
+
+  await move(file, destination)
+
+  return destination
+}