From cc2abbc320ea66296bf45314a2efb47d16b38374 Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Fri, 21 Apr 2023 16:31:04 +0200 Subject: [PATCH] Fix next video state after optimize/audio merge --- .../handlers/transcoding-job-builder.ts | 2 +- .../job-queue/handlers/video-transcoding.ts | 27 +++++++++++-------- .../transcoding-job-queue-builder.ts | 19 ++++++++----- server/lib/transcoding/web-transcoding.ts | 16 +++++------ shared/models/server/job.model.ts | 5 ++++ 5 files changed, 43 insertions(+), 26 deletions(-) diff --git a/server/lib/job-queue/handlers/transcoding-job-builder.ts b/server/lib/job-queue/handlers/transcoding-job-builder.ts index 8b4a877d7..cb45337df 100644 --- a/server/lib/job-queue/handlers/transcoding-job-builder.ts +++ b/server/lib/job-queue/handlers/transcoding-job-builder.ts @@ -36,7 +36,7 @@ async function processTranscodingJobBuilder (job: Job) { for (const sequentialJobs of (payload.sequentialJobs || [])) { await JobQueue.Instance.createSequentialJobFlow(...sequentialJobs) - await VideoJobInfoModel.increaseOrCreate(payload.videoUUID, 'pendingTranscode', sequentialJobs.length) + await VideoJobInfoModel.increaseOrCreate(payload.videoUUID, 'pendingTranscode', sequentialJobs.filter(s => !!s).length) } } diff --git a/server/lib/job-queue/handlers/video-transcoding.ts b/server/lib/job-queue/handlers/video-transcoding.ts index 17b717275..39f078bf0 100644 --- a/server/lib/job-queue/handlers/video-transcoding.ts +++ b/server/lib/job-queue/handlers/video-transcoding.ts @@ -81,7 +81,7 @@ async function handleWebTorrentMergeAudioJob (job: Job, payload: MergeAudioTrans logger.info('Merge audio transcoding job for %s ended.', video.uuid, lTags(video.uuid)) - await onTranscodingEnded({ isNewVideo: payload.isNewVideo, moveVideoToNextState: true, video }) + await onTranscodingEnded({ isNewVideo: payload.isNewVideo, moveVideoToNextState: !payload.hasChildren, video }) } async function handleWebTorrentOptimizeJob (job: Job, payload: OptimizeTranscodingPayload, video: MVideoFullLight, user: MUserId) { @@ -91,9 +91,11 @@ async function handleWebTorrentOptimizeJob (job: Job, payload: OptimizeTranscodi logger.info('Optimize transcoding job for %s ended.', video.uuid, lTags(video.uuid)) - await onTranscodingEnded({ isNewVideo: payload.isNewVideo, moveVideoToNextState: true, video }) + await onTranscodingEnded({ isNewVideo: payload.isNewVideo, moveVideoToNextState: !payload.hasChildren, video }) } +// --------------------------------------------------------------------------- + async function handleNewWebTorrentResolutionJob (job: Job, payload: NewWebTorrentResolutionTranscodingPayload, video: MVideoFullLight) { logger.info('Handling WebTorrent transcoding job for %s.', video.uuid, lTags(video.uuid)) @@ -104,19 +106,22 @@ async function handleNewWebTorrentResolutionJob (job: Job, payload: NewWebTorren await onTranscodingEnded({ isNewVideo: payload.isNewVideo, moveVideoToNextState: true, video }) } -async function handleHLSJob (job: Job, payload: HLSTranscodingPayload, video: MVideoFullLight) { - logger.info('Handling HLS transcoding job for %s.', video.uuid, lTags(video.uuid)) +// --------------------------------------------------------------------------- - const videoFileInput = payload.copyCodecs - ? video.getWebTorrentFile(payload.resolution) - : video.getMaxQualityFile() +async function handleHLSJob (job: Job, payload: HLSTranscodingPayload, videoArg: MVideoFullLight) { + logger.info('Handling HLS transcoding job for %s.', videoArg.uuid, lTags(videoArg.uuid)) - const videoOrStreamingPlaylist = videoFileInput.getVideoOrStreamingPlaylist() - - const inputFileMutexReleaser = await VideoPathManager.Instance.lockFiles(video.uuid) + const inputFileMutexReleaser = await VideoPathManager.Instance.lockFiles(videoArg.uuid) + let video: MVideoFullLight try { - await videoFileInput.getVideo().reload() + video = await VideoModel.loadFull(videoArg.uuid) + + const videoFileInput = payload.copyCodecs + ? video.getWebTorrentFile(payload.resolution) + : video.getMaxQualityFile() + + const videoOrStreamingPlaylist = videoFileInput.getVideoOrStreamingPlaylist() await VideoPathManager.Instance.makeAvailableVideoFile(videoFileInput.withVideoOrPlaylist(videoOrStreamingPlaylist), videoInputPath => { return generateHlsPlaylistResolution({ diff --git a/server/lib/transcoding/shared/job-builders/transcoding-job-queue-builder.ts b/server/lib/transcoding/shared/job-builders/transcoding-job-queue-builder.ts index 7c892718b..c09c6b8ce 100644 --- a/server/lib/transcoding/shared/job-builders/transcoding-job-queue-builder.ts +++ b/server/lib/transcoding/shared/job-builders/transcoding-job-queue-builder.ts @@ -76,9 +76,10 @@ export class TranscodingJobQueueBuilder extends AbstractJobBuilder { nextTranscodingSequentialJobPayloads = [ ...nextTranscodingSequentialJobPayloads, ...lowerResolutionJobPayloads ] + const hasChildren = nextTranscodingSequentialJobPayloads.length !== 0 mergeOrOptimizePayload = videoFile.isAudio() - ? this.buildMergeAudioPayload({ videoUUID: video.uuid, isNewVideo }) - : this.buildOptimizePayload({ videoUUID: video.uuid, isNewVideo, quickTranscode }) + ? this.buildMergeAudioPayload({ videoUUID: video.uuid, isNewVideo, hasChildren }) + : this.buildOptimizePayload({ videoUUID: video.uuid, isNewVideo, quickTranscode, hasChildren }) }) } finally { mutexReleaser() @@ -100,7 +101,9 @@ export class TranscodingJobQueueBuilder extends AbstractJobBuilder { const mergeOrOptimizeJob = await this.buildTranscodingJob({ payload: mergeOrOptimizePayload, user }) - return JobQueue.Instance.createSequentialJobFlow(...[ mergeOrOptimizeJob, transcodingJobBuilderJob ]) + await JobQueue.Instance.createSequentialJobFlow(...[ mergeOrOptimizeJob, transcodingJobBuilderJob ]) + + await VideoJobInfoModel.increaseOrCreate(video.uuid, 'pendingTranscode') } // --------------------------------------------------------------------------- @@ -279,15 +282,17 @@ export class TranscodingJobQueueBuilder extends AbstractJobBuilder { private buildMergeAudioPayload (options: { videoUUID: string isNewVideo: boolean + hasChildren: boolean }): MergeAudioTranscodingPayload { - const { videoUUID, isNewVideo } = options + const { videoUUID, isNewVideo, hasChildren } = options return { type: 'merge-audio-to-webtorrent', resolution: DEFAULT_AUDIO_RESOLUTION, fps: VIDEO_TRANSCODING_FPS.AUDIO_MERGE, videoUUID, - isNewVideo + isNewVideo, + hasChildren } } @@ -295,13 +300,15 @@ export class TranscodingJobQueueBuilder extends AbstractJobBuilder { videoUUID: string quickTranscode: boolean isNewVideo: boolean + hasChildren: boolean }): OptimizeTranscodingPayload { - const { videoUUID, quickTranscode, isNewVideo } = options + const { videoUUID, quickTranscode, isNewVideo, hasChildren } = options return { type: 'optimize-to-webtorrent', videoUUID, isNewVideo, + hasChildren, quickTranscode } } diff --git a/server/lib/transcoding/web-transcoding.ts b/server/lib/transcoding/web-transcoding.ts index d43d03b2a..22bd238ae 100644 --- a/server/lib/transcoding/web-transcoding.ts +++ b/server/lib/transcoding/web-transcoding.ts @@ -14,6 +14,7 @@ import { buildFileMetadata } from '../video-file' import { VideoPathManager } from '../video-path-manager' import { buildFFmpegVOD } from './shared' import { computeResolutionsToTranscode } from './transcoding-resolutions' +import { VideoModel } from '@server/models/video/video' // Optimize the original video file and replace it. The resolution is not changed. export async function optimizeOriginalVideofile (options: { @@ -32,6 +33,7 @@ export async function optimizeOriginalVideofile (options: { try { await video.reload() + await inputVideoFile.reload() const fileWithVideoOrPlaylist = inputVideoFile.withVideoOrPlaylist(video) @@ -88,16 +90,15 @@ export async function transcodeNewWebTorrentResolution (options: { fps: number job: Job }) { - const { video, resolution, fps, job } = options + const { video: videoArg, resolution, fps, job } = options const transcodeDirectory = CONFIG.STORAGE.TMP_DIR const newExtname = '.mp4' - const inputFileMutexReleaser = await VideoPathManager.Instance.lockFiles(video.uuid) + const inputFileMutexReleaser = await VideoPathManager.Instance.lockFiles(videoArg.uuid) try { - await video.reload() - + const video = await VideoModel.loadFull(videoArg.uuid) const file = video.getMaxQualityFile().withVideoOrPlaylist(video) const result = await VideoPathManager.Instance.makeAvailableVideoFile(file, async videoInputPath => { @@ -141,16 +142,15 @@ export async function mergeAudioVideofile (options: { fps: number job: Job }) { - const { video, resolution, fps, job } = options + const { video: videoArg, resolution, fps, job } = options const transcodeDirectory = CONFIG.STORAGE.TMP_DIR const newExtname = '.mp4' - const inputFileMutexReleaser = await VideoPathManager.Instance.lockFiles(video.uuid) + const inputFileMutexReleaser = await VideoPathManager.Instance.lockFiles(videoArg.uuid) try { - await video.reload() - + const video = await VideoModel.loadFull(videoArg.uuid) const inputVideoFile = video.getMinQualityFile() const fileWithVideoOrPlaylist = inputVideoFile.withVideoOrPlaylist(video) diff --git a/shared/models/server/job.model.ts b/shared/models/server/job.model.ts index 16187d133..3fd5bf7f9 100644 --- a/shared/models/server/job.model.ts +++ b/shared/models/server/job.model.ts @@ -158,14 +158,19 @@ export interface NewWebTorrentResolutionTranscodingPayload extends BaseTranscodi export interface MergeAudioTranscodingPayload extends BaseTranscodingPayload { type: 'merge-audio-to-webtorrent' + resolution: VideoResolution fps: number + + hasChildren: boolean } export interface OptimizeTranscodingPayload extends BaseTranscodingPayload { type: 'optimize-to-webtorrent' quickTranscode: boolean + + hasChildren: boolean } export type VideoTranscodingPayload =