X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Flib%2Flive%2Flive-utils.ts;h=3fb3ce1cee998886f96f8f3dce6d0888b678f0dc;hb=57c318653e6a8ae9d0c2541a62853fb8dd582d5d;hp=6365e23db371892b4b14601606587bdefe534eb6;hpb=ab623c0e0b4815bd69a94887241a69aaa857ed26;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/lib/live/live-utils.ts b/server/lib/live/live-utils.ts index 6365e23db..3fb3ce1ce 100644 --- a/server/lib/live/live-utils.ts +++ b/server/lib/live/live-utils.ts @@ -1,7 +1,10 @@ import { pathExists, readdir, remove } from 'fs-extra' import { basename, join } from 'path' import { logger } from '@server/helpers/logger' -import { MStreamingPlaylist, MVideo } from '@server/types/models' +import { VIDEO_LIVE } from '@server/initializers/constants' +import { MStreamingPlaylist, MStreamingPlaylistVideo, MVideo } from '@server/types/models' +import { LiveVideoLatencyMode, VideoStorage } from '@shared/models' +import { listHLSFileKeysOf, removeHLSFileObjectStorageByFullKey, removeHLSObjectStorage } from '../object-storage' import { getLiveDirectory } from '../paths' function buildConcatenatedName (segmentOrPlaylistPath: string) { @@ -10,35 +13,69 @@ function buildConcatenatedName (segmentOrPlaylistPath: string) { return 'concat-' + num[1] + '.ts' } -async function cleanupPermanentLive (video: MVideo, streamingPlaylist?: MStreamingPlaylist) { - const hlsDirectory = getLiveDirectory(video) - - await cleanupTMPLiveFiles(hlsDirectory) +async function cleanupAndDestroyPermanentLive (video: MVideo, streamingPlaylist: MStreamingPlaylist) { + await cleanupTMPLiveFiles(video, streamingPlaylist) - if (streamingPlaylist) await streamingPlaylist.destroy() + await streamingPlaylist.destroy() } -async function cleanupNormalLive (video: MVideo, streamingPlaylist?: MStreamingPlaylist) { +async function cleanupUnsavedNormalLive (video: MVideo, streamingPlaylist: MStreamingPlaylist) { const hlsDirectory = getLiveDirectory(video) + // We uploaded files to object storage too, remove them + if (streamingPlaylist.storage === VideoStorage.OBJECT_STORAGE) { + await removeHLSObjectStorage(streamingPlaylist.withVideo(video)) + } + await remove(hlsDirectory) - if (streamingPlaylist) await streamingPlaylist.destroy() + await streamingPlaylist.destroy() +} + +async function cleanupTMPLiveFiles (video: MVideo, streamingPlaylist: MStreamingPlaylist) { + await cleanupTMPLiveFilesFromObjectStorage(streamingPlaylist.withVideo(video)) + + await cleanupTMPLiveFilesFromFilesystem(video) +} + +function getLiveSegmentTime (latencyMode: LiveVideoLatencyMode) { + if (latencyMode === LiveVideoLatencyMode.SMALL_LATENCY) { + return VIDEO_LIVE.SEGMENT_TIME_SECONDS.SMALL_LATENCY + } + + return VIDEO_LIVE.SEGMENT_TIME_SECONDS.DEFAULT_LATENCY +} + +export { + cleanupAndDestroyPermanentLive, + cleanupUnsavedNormalLive, + cleanupTMPLiveFiles, + getLiveSegmentTime, + buildConcatenatedName +} + +// --------------------------------------------------------------------------- + +function isTMPLiveFile (name: string) { + return name.endsWith('.ts') || + name.endsWith('.m3u8') || + name.endsWith('.json') || + name.endsWith('.mpd') || + name.endsWith('.m4s') || + name.endsWith('.tmp') } -async function cleanupTMPLiveFiles (hlsDirectory: string) { +async function cleanupTMPLiveFilesFromFilesystem (video: MVideo) { + const hlsDirectory = getLiveDirectory(video) + if (!await pathExists(hlsDirectory)) return + logger.info('Cleanup TMP live files from filesystem of %s.', hlsDirectory) + const files = await readdir(hlsDirectory) for (const filename of files) { - if ( - filename.endsWith('.ts') || - filename.endsWith('.m3u8') || - filename.endsWith('.mpd') || - filename.endsWith('.m4s') || - filename.endsWith('.tmp') - ) { + if (isTMPLiveFile(filename)) { const p = join(hlsDirectory, filename) remove(p) @@ -47,9 +84,16 @@ async function cleanupTMPLiveFiles (hlsDirectory: string) { } } -export { - cleanupPermanentLive, - cleanupNormalLive, - cleanupTMPLiveFiles, - buildConcatenatedName +async function cleanupTMPLiveFilesFromObjectStorage (streamingPlaylist: MStreamingPlaylistVideo) { + if (streamingPlaylist.storage !== VideoStorage.OBJECT_STORAGE) return + + logger.info('Cleanup TMP live files from object storage for %s.', streamingPlaylist.Video.uuid) + + const keys = await listHLSFileKeysOf(streamingPlaylist) + + for (const key of keys) { + if (isTMPLiveFile(key)) { + await removeHLSFileObjectStorageByFullKey(key) + } + } }