X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Flib%2Fvideo-path-manager.ts;h=9953cae5de2b99a772904c66770cb0a93e215b04;hb=5f3505ba78bc05fc61aeca44d95f9a954934c0fc;hp=27058005c887781f57ea39e332d4c5be776a2d9f;hpb=ad5db1044c8599eaaaa2a578b350777ae996b068;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/lib/video-path-manager.ts b/server/lib/video-path-manager.ts index 27058005c..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 { buildUUID } from '@server/helpers/uuid' +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