X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Flib%2Fvideo-path-manager.ts;h=9953cae5de2b99a772904c66770cb0a93e215b04;hb=f50bff17f5b69c576960360857e25224cea13c0a;hp=c3f55fd954bb77a4ecaf7b9833b717601d63e023;hpb=3318147300b4f998adf728eb0a5a14a4c1829c51;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/lib/video-path-manager.ts b/server/lib/video-path-manager.ts index c3f55fd95..9953cae5d 100644 --- a/server/lib/video-path-manager.ts +++ b/server/lib/video-path-manager.ts @@ -1,29 +1,31 @@ +import { Mutex } from 'async-mutex' import { remove } from 'fs-extra' import { extname, join } from 'path' +import { logger, loggerTagsFactory } from '@server/helpers/logger' import { extractVideo } from '@server/helpers/video' import { CONFIG } from '@server/initializers/config' -import { - MStreamingPlaylistVideo, - MVideo, - MVideoFile, - MVideoFileStreamingPlaylistVideo, - MVideoFileVideo, - MVideoUUID -} from '@server/types/models' +import { DIRECTORIES } from '@server/initializers/constants' +import { MStreamingPlaylistVideo, MVideo, MVideoFile, MVideoFileStreamingPlaylistVideo, MVideoFileVideo } from '@server/types/models' import { buildUUID } from '@shared/extra-utils' import { VideoStorage } from '@shared/models' import { makeHLSFileAvailable, makeWebTorrentFileAvailable } from './object-storage' import { getHLSDirectory, getHLSRedundancyDirectory, getHlsResolutionPlaylistFilename } from './paths' +import { isVideoInPrivateDirectory } from './video-privacy' type MakeAvailableCB = (path: string) => Promise | T +const lTags = loggerTagsFactory('video-path-manager') + class VideoPathManager { private static instance: VideoPathManager + // Key is a video UUID + private readonly videoFileMutexStore = new Map() + private constructor () {} - getFSHLSOutputPath (video: MVideoUUID, filename?: string) { + getFSHLSOutputPath (video: MVideo, filename?: string) { const base = getHLSDirectory(video) if (!filename) return base @@ -41,13 +43,17 @@ class VideoPathManager { } getFSVideoFileOutputPath (videoOrPlaylist: MVideo | MStreamingPlaylistVideo, videoFile: MVideoFile) { - if (videoFile.isHLS()) { - const video = extractVideo(videoOrPlaylist) + const video = extractVideo(videoOrPlaylist) + if (videoFile.isHLS()) { return join(getHLSDirectory(video), videoFile.filename) } - return join(CONFIG.STORAGE.VIDEOS_DIR, videoFile.filename) + if (isVideoInPrivateDirectory(video.privacy)) { + return join(DIRECTORIES.VIDEOS.PRIVATE, videoFile.filename) + } + + return join(DIRECTORIES.VIDEOS.PUBLIC, videoFile.filename) } async makeAvailableVideoFile (videoFile: MVideoFileVideo | MVideoFileStreamingPlaylistVideo, cb: MakeAvailableCB) { @@ -113,6 +119,27 @@ class VideoPathManager { ) } + async lockFiles (videoUUID: string) { + if (!this.videoFileMutexStore.has(videoUUID)) { + this.videoFileMutexStore.set(videoUUID, new Mutex()) + } + + const mutex = this.videoFileMutexStore.get(videoUUID) + const releaser = await mutex.acquire() + + logger.debug('Locked files of %s.', videoUUID, lTags(videoUUID)) + + return releaser + } + + unlockFiles (videoUUID: string) { + const mutex = this.videoFileMutexStore.get(videoUUID) + + mutex.release() + + logger.debug('Released lockfiles of %s.', videoUUID, lTags(videoUUID)) + } + private async makeAvailableFactory (method: () => Promise | string, clean: boolean, cb: MakeAvailableCB) { let result: T