X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Flib%2Fvideo-transcoding.ts;h=612d388ee7ba01acc5c5c978b937b80a15c8ff5e;hb=a0e6d267598839c8a5508a65876ce0e07d1b3d74;hp=8d786e0ef5ea5ba16e7f79e96557072dbc4af98b;hpb=53da06304957c7980c759c0db3e93010f4de7db3;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/lib/video-transcoding.ts b/server/lib/video-transcoding.ts index 8d786e0ef..612d388ee 100644 --- a/server/lib/video-transcoding.ts +++ b/server/lib/video-transcoding.ts @@ -1,20 +1,27 @@ import { HLS_STREAMING_PLAYLIST_DIRECTORY, P2P_MEDIA_LOADER_PEER_VERSION, WEBSERVER } from '../initializers/constants' -import { join } from 'path' -import { canDoQuickTranscode, getVideoFileFPS, transcode, TranscodeOptions, TranscodeOptionsType } from '../helpers/ffmpeg-utils' -import { ensureDir, move, remove, stat } from 'fs-extra' +import { basename, join } from 'path' +import { + canDoQuickTranscode, + getDurationFromVideoFile, + getVideoFileFPS, + transcode, + TranscodeOptions, + TranscodeOptionsType +} from '../helpers/ffmpeg-utils' +import { copyFile, ensureDir, move, remove, stat } from 'fs-extra' import { logger } from '../helpers/logger' import { VideoResolution } from '../../shared/models/videos' import { VideoFileModel } from '../models/video/video-file' -import { VideoModel } from '../models/video/video' import { updateMasterHLSPlaylist, updateSha256Segments } from './hls' import { VideoStreamingPlaylistModel } from '../models/video/video-streaming-playlist' import { VideoStreamingPlaylistType } from '../../shared/models/videos/video-streaming-playlist.type' import { CONFIG } from '../initializers/config' +import { MVideoFile, MVideoWithFile, MVideoWithFileThumbnail } from '@server/typings/models' /** * Optimize the original video file and replace it. The resolution is not changed. */ -async function optimizeVideofile (video: VideoModel, inputVideoFileArg?: VideoFileModel) { +async function optimizeVideofile (video: MVideoWithFile, inputVideoFileArg?: MVideoFile) { const videosDirectory = CONFIG.STORAGE.VIDEOS_DIR const transcodeDirectory = CONFIG.STORAGE.TMP_DIR const newExtname = '.mp4' @@ -57,7 +64,7 @@ async function optimizeVideofile (video: VideoModel, inputVideoFileArg?: VideoFi /** * Transcode the original video file to a lower resolution. */ -async function transcodeOriginalVideofile (video: VideoModel, resolution: VideoResolution, isPortrait: boolean) { +async function transcodeOriginalVideofile (video: MVideoWithFile, resolution: VideoResolution, isPortrait: boolean) { const videosDirectory = CONFIG.STORAGE.VIDEOS_DIR const transcodeDirectory = CONFIG.STORAGE.TMP_DIR const extname = '.mp4' @@ -87,7 +94,7 @@ async function transcodeOriginalVideofile (video: VideoModel, resolution: VideoR return onVideoFileTranscoding(video, newVideoFile, videoTranscodedPath, videoOutputPath) } -async function mergeAudioVideofile (video: VideoModel, resolution: VideoResolution) { +async function mergeAudioVideofile (video: MVideoWithFileThumbnail, resolution: VideoResolution) { const videosDirectory = CONFIG.STORAGE.VIDEOS_DIR const transcodeDirectory = CONFIG.STORAGE.TMP_DIR const newExtname = '.mp4' @@ -97,31 +104,46 @@ async function mergeAudioVideofile (video: VideoModel, resolution: VideoResoluti const audioInputPath = join(videosDirectory, video.getVideoFilename(video.getOriginalFile())) const videoTranscodedPath = join(transcodeDirectory, video.id + '-transcoded' + newExtname) + // If the user updates the video preview during transcoding + const previewPath = video.getPreview().getPath() + const tmpPreviewPath = join(CONFIG.STORAGE.TMP_DIR, basename(previewPath)) + await copyFile(previewPath, tmpPreviewPath) + const transcodeOptions = { type: 'merge-audio' as 'merge-audio', - inputPath: video.getPreview().getPath(), + inputPath: tmpPreviewPath, outputPath: videoTranscodedPath, audioPath: audioInputPath, resolution } - await transcode(transcodeOptions) + try { + await transcode(transcodeOptions) - await remove(audioInputPath) + await remove(audioInputPath) + await remove(tmpPreviewPath) + } catch (err) { + await remove(tmpPreviewPath) + throw err + } // Important to do this before getVideoFilename() to take in account the new file extension inputVideoFile.extname = newExtname const videoOutputPath = video.getVideoFilePath(inputVideoFile) + // ffmpeg generated a new video file, so update the video duration + // See https://trac.ffmpeg.org/ticket/5456 + video.duration = await getDurationFromVideoFile(videoTranscodedPath) + await video.save() return onVideoFileTranscoding(video, inputVideoFile, videoTranscodedPath, videoOutputPath) } -async function generateHlsPlaylist (video: VideoModel, resolution: VideoResolution, isPortraitMode: boolean) { +async function generateHlsPlaylist (video: MVideoWithFile, resolution: VideoResolution, isPortraitMode: boolean) { const baseHlsDirectory = join(HLS_STREAMING_PLAYLIST_DIRECTORY, video.uuid) await ensureDir(join(HLS_STREAMING_PLAYLIST_DIRECTORY, video.uuid)) - const videoInputPath = join(CONFIG.STORAGE.VIDEOS_DIR, video.getVideoFilename(video.getOriginalFile())) + const videoInputPath = join(CONFIG.STORAGE.VIDEOS_DIR, video.getVideoFilename(video.getFile(resolution))) const outputPath = join(baseHlsDirectory, VideoStreamingPlaylistModel.getHlsPlaylistFilename(resolution)) const transcodeOptions = { @@ -165,14 +187,14 @@ export { // --------------------------------------------------------------------------- -async function onVideoFileTranscoding (video: VideoModel, videoFile: VideoFileModel, transcodingPath: string, outputPath: string) { +async function onVideoFileTranscoding (video: MVideoWithFile, videoFile: MVideoFile, transcodingPath: string, outputPath: string) { const stats = await stat(transcodingPath) const fps = await getVideoFileFPS(transcodingPath) await move(transcodingPath, outputPath) - videoFile.set('size', stats.size) - videoFile.set('fps', fps) + videoFile.size = stats.size + videoFile.fps = fps await video.createTorrentAndSetInfoHash(videoFile)