X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Flib%2Fjob-queue%2Fhandlers%2Fvideo-live-ending.ts;h=386ccdc7b6d76e702140c63d25b4992ba1a70aa5;hb=764b1a14fc494f2cfd7ea590d2f07b01df65c7ad;hp=e10e306a784e5cd38d3d052a07b31a621a6cfc4f;hpb=e772bdf14c46701552491dc337a21325c34e1ec2;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/lib/job-queue/handlers/video-live-ending.ts b/server/lib/job-queue/handlers/video-live-ending.ts index e10e306a7..386ccdc7b 100644 --- a/server/lib/job-queue/handlers/video-live-ending.ts +++ b/server/lib/job-queue/handlers/video-live-ending.ts @@ -1,13 +1,13 @@ import * as Bull from 'bull' import { pathExists, readdir, remove } from 'fs-extra' import { join } from 'path' -import { ffprobePromise, getAudioStream, getAudioStreamCodec, getDurationFromVideoFile, getVideoFileResolution } from '@server/helpers/ffprobe-utils' +import { ffprobePromise, getAudioStream, getDurationFromVideoFile, getVideoFileResolution } from '@server/helpers/ffprobe-utils' import { VIDEO_LIVE } from '@server/initializers/constants' -import { LiveManager } from '@server/lib/live-manager' +import { buildConcatenatedName, cleanupLive, LiveSegmentShaStore } from '@server/lib/live' import { generateVideoMiniature } from '@server/lib/thumbnail' +import { generateHlsPlaylistResolutionFromTS } from '@server/lib/transcoding/video-transcoding' import { publishAndFederateIfNeeded } from '@server/lib/video' -import { getHLSDirectory } from '@server/lib/video-paths' -import { generateHlsPlaylistFromTS } from '@server/lib/video-transcoding' +import { generateHLSMasterPlaylistFilename, generateHlsSha256SegmentsFilename, getHLSDirectory } from '@server/lib/video-paths' import { VideoModel } from '@server/models/video/video' import { VideoFileModel } from '@server/models/video/video-file' import { VideoLiveModel } from '@server/models/video/video-live' @@ -37,50 +37,32 @@ async function processVideoLiveEnding (job: Bull.Job) { return } - LiveManager.Instance.cleanupShaSegments(video.uuid) + LiveSegmentShaStore.Instance.cleanupShaSegments(video.uuid) if (live.saveReplay !== true) { return cleanupLive(video, streamingPlaylist) } - return saveLive(video, live) -} - -async function cleanupLive (video: MVideo, streamingPlaylist: MStreamingPlaylist) { - const hlsDirectory = getHLSDirectory(video) - - await remove(hlsDirectory) - - await streamingPlaylist.destroy() + return saveLive(video, live, streamingPlaylist) } // --------------------------------------------------------------------------- export { - processVideoLiveEnding, - cleanupLive + processVideoLiveEnding } // --------------------------------------------------------------------------- -async function saveLive (video: MVideo, live: MVideoLive) { +async function saveLive (video: MVideo, live: MVideoLive, streamingPlaylist: MStreamingPlaylist) { const hlsDirectory = getHLSDirectory(video, false) const replayDirectory = join(hlsDirectory, VIDEO_LIVE.REPLAY_DIRECTORY) const rootFiles = await readdir(hlsDirectory) - const playlistFiles: string[] = [] - - for (const file of rootFiles) { - // Move remaining files in the replay directory - if (file.endsWith('.ts')) { - await LiveManager.Instance.addSegmentToReplay(hlsDirectory, join(hlsDirectory, file)) - } - - if (file.endsWith('.m3u8') && file !== 'master.m3u8') { - playlistFiles.push(file) - } - } + const playlistFiles = rootFiles.filter(file => { + return file.endsWith('.m3u8') && file !== streamingPlaylist.playlistFilename + }) await cleanupLiveFiles(hlsDirectory) @@ -94,16 +76,21 @@ async function saveLive (video: MVideo, live: MVideoLive) { await video.save() // Remove old HLS playlist video files - const videoWithFiles = await VideoModel.loadWithFiles(video.id) + const videoWithFiles = await VideoModel.loadAndPopulateAccountAndServerAndTags(video.id) const hlsPlaylist = videoWithFiles.getHLSPlaylist() await VideoFileModel.removeHLSFilesOfVideoId(hlsPlaylist.id) + + // Reset playlist hlsPlaylist.VideoFiles = [] + hlsPlaylist.playlistFilename = generateHLSMasterPlaylistFilename() + hlsPlaylist.segmentsSha256Filename = generateHlsSha256SegmentsFilename() + await hlsPlaylist.save() - let durationDone: boolean + let durationDone = false for (const playlistFile of playlistFiles) { - const concatenatedTsFile = LiveManager.Instance.buildConcatenatedName(playlistFile) + const concatenatedTsFile = buildConcatenatedName(playlistFile) const concatenatedTsFilePath = join(replayDirectory, concatenatedTsFile) const probe = await ffprobePromise(concatenatedTsFilePath) @@ -111,7 +98,7 @@ async function saveLive (video: MVideo, live: MVideoLive) { const { videoFileResolution, isPortraitMode } = await getVideoFileResolution(concatenatedTsFilePath, probe) - const outputPath = await generateHlsPlaylistFromTS({ + const outputPath = await generateHlsPlaylistResolutionFromTS({ video: videoWithFiles, concatenatedTsFilePath, resolution: videoFileResolution, @@ -131,11 +118,19 @@ async function saveLive (video: MVideo, live: MVideoLive) { // Regenerate the thumbnail & preview? if (videoWithFiles.getMiniature().automaticallyGenerated === true) { - await generateVideoMiniature(videoWithFiles, videoWithFiles.getMaxQualityFile(), ThumbnailType.MINIATURE) + await generateVideoMiniature({ + video: videoWithFiles, + videoFile: videoWithFiles.getMaxQualityFile(), + type: ThumbnailType.MINIATURE + }) } if (videoWithFiles.getPreview().automaticallyGenerated === true) { - await generateVideoMiniature(videoWithFiles, videoWithFiles.getMaxQualityFile(), ThumbnailType.PREVIEW) + await generateVideoMiniature({ + video: videoWithFiles, + videoFile: videoWithFiles.getMaxQualityFile(), + type: ThumbnailType.PREVIEW + }) } await publishAndFederateIfNeeded(videoWithFiles, true)