X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Flib%2Fobject-storage%2Fvideos.ts;h=9152c535295eb3108bb3a95d4e3eb65c81272d05;hb=d4fff51d96925b5704c97dd673dd779030b1aced;hp=66e738200ed329e2c7918b656c9b99bf78922374;hpb=7b6b445d91d3f0bcbb526cb1e8c1f26b96f0a971;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/lib/object-storage/videos.ts b/server/lib/object-storage/videos.ts index 66e738200..9152c5352 100644 --- a/server/lib/object-storage/videos.ts +++ b/server/lib/object-storage/videos.ts @@ -1,39 +1,113 @@ -import { join } from 'path' +import { basename, join } from 'path' import { logger } from '@server/helpers/logger' import { CONFIG } from '@server/initializers/config' -import { MStreamingPlaylistVideo, MVideoFile } from '@server/types/models' +import { MStreamingPlaylistVideo, MVideo, MVideoFile } from '@server/types/models' import { getHLSDirectory } from '../paths' +import { VideoPathManager } from '../video-path-manager' import { generateHLSObjectBaseStorageKey, generateHLSObjectStorageKey, generateWebTorrentObjectStorageKey } from './keys' -import { lTags, makeAvailable, removeObject, removePrefix, storeObject } from './shared' +import { + createObjectReadStream, + listKeysOfPrefix, + lTags, + makeAvailable, + removeObject, + removeObjectByFullKey, + removePrefix, + storeContent, + storeObject, + updateObjectACL, + updatePrefixACL +} from './shared' + +function listHLSFileKeysOf (playlist: MStreamingPlaylistVideo) { + return listKeysOfPrefix(generateHLSObjectBaseStorageKey(playlist), CONFIG.OBJECT_STORAGE.STREAMING_PLAYLISTS) +} + +// --------------------------------------------------------------------------- -function storeHLSFile (playlist: MStreamingPlaylistVideo, filename: string, path?: string) { +function storeHLSFileFromFilename (playlist: MStreamingPlaylistVideo, filename: string) { return storeObject({ - inputPath: path ?? join(getHLSDirectory(playlist.Video), filename), + inputPath: join(getHLSDirectory(playlist.Video), filename), objectStorageKey: generateHLSObjectStorageKey(playlist, filename), - bucketInfo: CONFIG.OBJECT_STORAGE.STREAMING_PLAYLISTS + bucketInfo: CONFIG.OBJECT_STORAGE.STREAMING_PLAYLISTS, + isPrivate: playlist.Video.hasPrivateStaticPath() }) } -function storeWebTorrentFile (filename: string) { +function storeHLSFileFromPath (playlist: MStreamingPlaylistVideo, path: string) { return storeObject({ - inputPath: join(CONFIG.STORAGE.VIDEOS_DIR, filename), - objectStorageKey: generateWebTorrentObjectStorageKey(filename), - bucketInfo: CONFIG.OBJECT_STORAGE.VIDEOS + inputPath: path, + objectStorageKey: generateHLSObjectStorageKey(playlist, basename(path)), + bucketInfo: CONFIG.OBJECT_STORAGE.STREAMING_PLAYLISTS, + isPrivate: playlist.Video.hasPrivateStaticPath() + }) +} + +function storeHLSFileFromContent (playlist: MStreamingPlaylistVideo, path: string, content: string) { + return storeContent({ + content, + inputPath: path, + objectStorageKey: generateHLSObjectStorageKey(playlist, basename(path)), + bucketInfo: CONFIG.OBJECT_STORAGE.STREAMING_PLAYLISTS, + isPrivate: playlist.Video.hasPrivateStaticPath() + }) +} + +// --------------------------------------------------------------------------- + +function storeWebTorrentFile (video: MVideo, file: MVideoFile) { + return storeObject({ + inputPath: VideoPathManager.Instance.getFSVideoFileOutputPath(video, file), + objectStorageKey: generateWebTorrentObjectStorageKey(file.filename), + bucketInfo: CONFIG.OBJECT_STORAGE.VIDEOS, + isPrivate: video.hasPrivateStaticPath() }) } +// --------------------------------------------------------------------------- + +async function updateWebTorrentFileACL (video: MVideo, file: MVideoFile) { + await updateObjectACL({ + objectStorageKey: generateWebTorrentObjectStorageKey(file.filename), + bucketInfo: CONFIG.OBJECT_STORAGE.VIDEOS, + isPrivate: video.hasPrivateStaticPath() + }) +} + +async function updateHLSFilesACL (playlist: MStreamingPlaylistVideo) { + await updatePrefixACL({ + prefix: generateHLSObjectBaseStorageKey(playlist), + bucketInfo: CONFIG.OBJECT_STORAGE.STREAMING_PLAYLISTS, + isPrivate: playlist.Video.hasPrivateStaticPath() + }) +} + +// --------------------------------------------------------------------------- + function removeHLSObjectStorage (playlist: MStreamingPlaylistVideo) { return removePrefix(generateHLSObjectBaseStorageKey(playlist), CONFIG.OBJECT_STORAGE.STREAMING_PLAYLISTS) } -function removeHLSFileObjectStorage (playlist: MStreamingPlaylistVideo, filename: string) { +function removeHLSFileObjectStorageByFilename (playlist: MStreamingPlaylistVideo, filename: string) { return removeObject(generateHLSObjectStorageKey(playlist, filename), CONFIG.OBJECT_STORAGE.STREAMING_PLAYLISTS) } +function removeHLSFileObjectStorageByPath (playlist: MStreamingPlaylistVideo, path: string) { + return removeObject(generateHLSObjectStorageKey(playlist, basename(path)), CONFIG.OBJECT_STORAGE.STREAMING_PLAYLISTS) +} + +function removeHLSFileObjectStorageByFullKey (key: string) { + return removeObjectByFullKey(key, CONFIG.OBJECT_STORAGE.STREAMING_PLAYLISTS) +} + +// --------------------------------------------------------------------------- + function removeWebTorrentObjectStorage (videoFile: MVideoFile) { return removeObject(generateWebTorrentObjectStorageKey(videoFile.filename), CONFIG.OBJECT_STORAGE.VIDEOS) } +// --------------------------------------------------------------------------- + async function makeHLSFileAvailable (playlist: MStreamingPlaylistVideo, filename: string, destination: string) { const key = generateHLSObjectStorageKey(playlist, filename) @@ -62,14 +136,62 @@ async function makeWebTorrentFileAvailable (filename: string, destination: strin return destination } +// --------------------------------------------------------------------------- + +function getWebTorrentFileReadStream (options: { + filename: string + rangeHeader: string +}) { + const { filename, rangeHeader } = options + + const key = generateWebTorrentObjectStorageKey(filename) + + return createObjectReadStream({ + key, + bucketInfo: CONFIG.OBJECT_STORAGE.VIDEOS, + rangeHeader + }) +} + +function getHLSFileReadStream (options: { + playlist: MStreamingPlaylistVideo + filename: string + rangeHeader: string +}) { + const { playlist, filename, rangeHeader } = options + + const key = generateHLSObjectStorageKey(playlist, filename) + + return createObjectReadStream({ + key, + bucketInfo: CONFIG.OBJECT_STORAGE.STREAMING_PLAYLISTS, + rangeHeader + }) +} + +// --------------------------------------------------------------------------- + export { + listHLSFileKeysOf, + storeWebTorrentFile, - storeHLSFile, + storeHLSFileFromFilename, + storeHLSFileFromPath, + storeHLSFileFromContent, + + updateWebTorrentFileACL, + updateHLSFilesACL, removeHLSObjectStorage, - removeHLSFileObjectStorage, + removeHLSFileObjectStorageByFilename, + removeHLSFileObjectStorageByPath, + removeHLSFileObjectStorageByFullKey, + removeWebTorrentObjectStorage, makeWebTorrentFileAvailable, - makeHLSFileAvailable + makeHLSFileAvailable, + + getWebTorrentFileReadStream, + getHLSFileReadStream }