diff --git a/server/core/helpers/fs.ts b/server/core/helpers/fs.ts new file mode 100644 index 000000000..60d3ec630 --- /dev/null +++ b/server/core/helpers/fs.ts @@ -0,0 +1,12 @@ +import { move } from 'fs-extra/esm' +import { rename } from 'fs/promises' + +export async function tryAtomicMove (src: string, destination: string) { + try { + await rename(src, destination) + } catch (err) { + if (err?.code !== 'EXDEV') throw err + + return move(src, destination, { overwrite: true }) + } +} diff --git a/server/core/lib/runners/job-handlers/live-rtmp-hls-transcoding-job-handler.ts b/server/core/lib/runners/job-handlers/live-rtmp-hls-transcoding-job-handler.ts index 695c64c8e..1cbd6d302 100644 --- a/server/core/lib/runners/job-handlers/live-rtmp-hls-transcoding-job-handler.ts +++ b/server/core/lib/runners/job-handlers/live-rtmp-hls-transcoding-job-handler.ts @@ -12,9 +12,10 @@ import { JOB_PRIORITY } from '@server/initializers/constants.js' import { LiveManager } from '@server/lib/live/index.js' import { MStreamingPlaylist, MVideo } from '@server/types/models/index.js' import { MRunnerJob } from '@server/types/models/runners/index.js' -import { move, remove } from 'fs-extra/esm' +import { remove } from 'fs-extra/esm' import { join } from 'path' import { AbstractJobHandler } from './abstract-job-handler.js' +import { tryAtomicMove } from '@server/helpers/fs.js' type CreateOptions = { video: MVideo @@ -84,25 +85,23 @@ export class LiveRTMPHLSTranscodingJobHandler extends AbstractJobHandler