1 import express from 'express'
2 import { logger, loggerTagsFactory } from '@server/helpers/logger'
3 import { proxifyHLS, proxifyWebTorrentFile } from '@server/lib/object-storage'
4 import { VideoPathManager } from '@server/lib/video-path-manager'
5 import { getStudioTaskFilePath } from '@server/lib/video-studio'
6 import { asyncMiddleware } from '@server/middlewares'
7 import { jobOfRunnerGetValidator } from '@server/middlewares/validators/runners'
9 runnerJobGetVideoStudioTaskFileValidator,
10 runnerJobGetVideoTranscodingFileValidator
11 } from '@server/middlewares/validators/runners/job-files'
12 import { VideoStorage } from '@shared/models'
14 const lTags = loggerTagsFactory('api', 'runner')
16 const runnerJobFilesRouter = express.Router()
18 runnerJobFilesRouter.post('/jobs/:jobUUID/files/videos/:videoId/max-quality',
19 asyncMiddleware(jobOfRunnerGetValidator),
20 asyncMiddleware(runnerJobGetVideoTranscodingFileValidator),
21 asyncMiddleware(getMaxQualityVideoFile)
24 runnerJobFilesRouter.post('/jobs/:jobUUID/files/videos/:videoId/previews/max-quality',
25 asyncMiddleware(jobOfRunnerGetValidator),
26 asyncMiddleware(runnerJobGetVideoTranscodingFileValidator),
27 getMaxQualityVideoPreview
30 runnerJobFilesRouter.post('/jobs/:jobUUID/files/videos/:videoId/studio/task-files/:filename',
31 asyncMiddleware(jobOfRunnerGetValidator),
32 asyncMiddleware(runnerJobGetVideoTranscodingFileValidator),
33 runnerJobGetVideoStudioTaskFileValidator,
34 getVideoStudioTaskFile
37 // ---------------------------------------------------------------------------
43 // ---------------------------------------------------------------------------
45 async function getMaxQualityVideoFile (req: express.Request, res: express.Response) {
46 const runnerJob = res.locals.runnerJob
47 const runner = runnerJob.Runner
48 const video = res.locals.videoAll
51 'Get max quality file of video %s of job %s for runner %s', video.uuid, runnerJob.uuid, runner.name,
52 lTags(runner.name, runnerJob.id, runnerJob.type)
55 const file = video.getMaxQualityFile()
57 if (file.storage === VideoStorage.OBJECT_STORAGE) {
62 filename: file.filename,
63 playlist: video.getHLSPlaylist(),
64 reinjectVideoFileToken: false,
70 return proxifyWebTorrentFile({
73 filename: file.filename
77 return VideoPathManager.Instance.makeAvailableVideoFile(file, videoPath => {
78 return res.sendFile(videoPath)
82 function getMaxQualityVideoPreview (req: express.Request, res: express.Response) {
83 const runnerJob = res.locals.runnerJob
84 const runner = runnerJob.Runner
85 const video = res.locals.videoAll
88 'Get max quality preview file of video %s of job %s for runner %s', video.uuid, runnerJob.uuid, runner.name,
89 lTags(runner.name, runnerJob.id, runnerJob.type)
92 const file = video.getPreview()
94 return res.sendFile(file.getPath())
97 function getVideoStudioTaskFile (req: express.Request, res: express.Response) {
98 const runnerJob = res.locals.runnerJob
99 const runner = runnerJob.Runner
100 const video = res.locals.videoAll
101 const filename = req.params.filename
104 'Get video studio task file %s of video %s of job %s for runner %s', filename, video.uuid, runnerJob.uuid, runner.name,
105 lTags(runner.name, runnerJob.id, runnerJob.type)
108 return res.sendFile(getStudioTaskFilePath(filename))