]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/commitdiff
Transcode HLS playlists in a tmp directory
authorChocobozzz <me@florianbigard.com>
Tue, 2 Feb 2021 10:50:29 +0000 (11:50 +0100)
committerChocobozzz <me@florianbigard.com>
Tue, 2 Feb 2021 10:50:29 +0000 (11:50 +0100)
server/lib/video-transcoding.ts

index 37a4f3019b0ab6499bee27ba4d29c6ffeb5395ad..d32372fe5487c768aae30554dbe825ba09092d47 100644 (file)
@@ -270,18 +270,20 @@ async function generateHlsPlaylistCommon (options: {
   job?: Job
 }) {
   const { type, video, inputPath, resolution, copyCodecs, isPortraitMode, isAAC, job } = options
+  const transcodeDirectory = CONFIG.STORAGE.TMP_DIR
 
-  const baseHlsDirectory = join(HLS_STREAMING_PLAYLIST_DIRECTORY, video.uuid)
-  await ensureDir(join(HLS_STREAMING_PLAYLIST_DIRECTORY, video.uuid))
+  const videoTranscodedBasePath = join(transcodeDirectory, type, video.uuid)
+  await ensureDir(videoTranscodedBasePath)
 
-  const outputPath = join(baseHlsDirectory, VideoStreamingPlaylistModel.getHlsPlaylistFilename(resolution))
   const videoFilename = generateVideoStreamingPlaylistName(video.uuid, resolution)
+  const playlistFilename = VideoStreamingPlaylistModel.getHlsPlaylistFilename(resolution)
+  const playlistFileTranscodePath = join(videoTranscodedBasePath, playlistFilename)
 
   const transcodeOptions = {
     type,
 
     inputPath,
-    outputPath,
+    outputPath: playlistFileTranscodePath,
 
     availableEncoders: VideoTranscodingProfilesManager.Instance.getAvailableEncoders(),
     profile: CONFIG.TRANSCODING.PROFILE,
@@ -303,6 +305,7 @@ async function generateHlsPlaylistCommon (options: {
 
   const playlistUrl = WEBSERVER.URL + VideoStreamingPlaylistModel.getHlsMasterPlaylistStaticPath(video.uuid)
 
+  // Create or update the playlist
   const [ videoStreamingPlaylist ] = await VideoStreamingPlaylistModel.upsert({
     videoId: video.id,
     playlistUrl,
@@ -314,6 +317,7 @@ async function generateHlsPlaylistCommon (options: {
   }, { returning: true }) as [ MStreamingPlaylistFilesVideo, boolean ]
   videoStreamingPlaylist.Video = video
 
+  // Build the new playlist file
   const newVideoFile = new VideoFileModel({
     resolution,
     extname: extnameUtil(videoFilename),
@@ -323,6 +327,19 @@ async function generateHlsPlaylistCommon (options: {
   })
 
   const videoFilePath = getVideoFilePath(videoStreamingPlaylist, newVideoFile)
+
+  // Move files from tmp transcoded directory to the appropriate place
+  const baseHlsDirectory = join(HLS_STREAMING_PLAYLIST_DIRECTORY, video.uuid)
+  await ensureDir(baseHlsDirectory)
+
+  // Move playlist file
+  const playlistPath = join(baseHlsDirectory, playlistFilename)
+  await move(playlistFileTranscodePath, playlistPath)
+  // Move video file
+  await move(join(videoTranscodedBasePath, videoFilename), videoFilePath)
+  // Cleanup directory
+  await remove(videoTranscodedBasePath)
+
   const stats = await stat(videoFilePath)
 
   newVideoFile.size = stats.size
@@ -344,5 +361,5 @@ async function generateHlsPlaylistCommon (options: {
   await updateMasterHLSPlaylist(video)
   await updateSha256VODSegments(video)
 
-  return outputPath
+  return playlistPath
 }