diff --git a/scripts/optimize-old-videos.ts b/scripts/optimize-old-videos.ts index ab44acfbe..02026b3da 100644 --- a/scripts/optimize-old-videos.ts +++ b/scripts/optimize-old-videos.ts @@ -1,11 +1,7 @@ -import { join } from 'path' -import { readdir } from 'fs-extra' -import { CONFIG, VIDEO_TRANSCODING_FPS } from '../server/initializers/constants' -import { getVideoFileResolution, getVideoFileBitrate, getVideoFileFPS } from '../server/helpers/ffmpeg-utils' +import { VIDEO_TRANSCODING_FPS } from '../server/initializers/constants' +import { getVideoFileBitrate, getVideoFileFPS, getVideoFileResolution } from '../server/helpers/ffmpeg-utils' import { getMaxBitrate } from '../shared/models/videos' -import { VideoRedundancyModel } from '../server/models/redundancy/video-redundancy' import { VideoModel } from '../server/models/video/video' -import { getUUIDFromFilename } from '../server/helpers/utils' import { optimizeVideofile } from '../server/lib/video-transcoding' run() @@ -16,21 +12,24 @@ run() }) async function run () { - const files = await readdir(CONFIG.STORAGE.VIDEOS_DIR) - for (const file of files) { - const inputPath = join(CONFIG.STORAGE.VIDEOS_DIR, file) - const videoBitrate = await getVideoFileBitrate(inputPath) - const fps = await getVideoFileFPS(inputPath) - const resolution = await getVideoFileResolution(inputPath) - const uuid = getUUIDFromFilename(file) + const localVideos = await VideoModel.listLocal() - const isLocalVideo = await VideoRedundancyModel.isLocalByVideoUUIDExists(uuid) - const isMaxBitrateExceeded = - videoBitrate > getMaxBitrate(resolution.videoFileResolution, fps, VIDEO_TRANSCODING_FPS) - if (uuid && isLocalVideo && isMaxBitrateExceeded) { - const videoModel = await VideoModel.loadByUUIDWithFile(uuid) - await optimizeVideofile(videoModel, inputPath) + for (const video of localVideos) { + for (const file of video.VideoFiles) { + const inputPath = video.getVideoFilename(file) + + const [ videoBitrate, fps, resolution ] = await Promise.all([ + getVideoFileBitrate(inputPath), + getVideoFileFPS(inputPath), + getVideoFileResolution(inputPath) + ]) + + const isMaxBitrateExceeded = videoBitrate > getMaxBitrate(resolution.videoFileResolution, fps, VIDEO_TRANSCODING_FPS) + if (isMaxBitrateExceeded) { + await optimizeVideofile(video, file) + } } } + console.log('Finished optimizing videos') } diff --git a/server/lib/video-transcoding.ts b/server/lib/video-transcoding.ts index 04cadf74b..a78de61e5 100644 --- a/server/lib/video-transcoding.ts +++ b/server/lib/video-transcoding.ts @@ -1,5 +1,5 @@ import { CONFIG } from '../initializers' -import { join, extname, basename } from 'path' +import { extname, join } from 'path' import { getVideoFileFPS, getVideoFileResolution, transcode } from '../helpers/ffmpeg-utils' import { copy, remove, rename, stat } from 'fs-extra' import { logger } from '../helpers/logger' @@ -7,16 +7,12 @@ import { VideoResolution } from '../../shared/models/videos' import { VideoFileModel } from '../models/video/video-file' import { VideoModel } from '../models/video/video' -async function optimizeVideofile (video: VideoModel, videoInputPath?: string) { +async function optimizeVideofile (video: VideoModel, inputVideoFileArg?: VideoFileModel) { const videosDirectory = CONFIG.STORAGE.VIDEOS_DIR const newExtname = '.mp4' - let inputVideoFile = null - if (videoInputPath == null) { - inputVideoFile = video.getOriginalFile() - videoInputPath = join(videosDirectory, video.getVideoFilename(inputVideoFile)) - } else { - inputVideoFile = basename(videoInputPath) - } + + const inputVideoFile = inputVideoFileArg ? inputVideoFileArg : video.getOriginalFile() + const videoInputPath = join(videosDirectory, video.getVideoFilename(inputVideoFile)) const videoTranscodedPath = join(videosDirectory, video.id + '-transcoded' + newExtname) const transcodeOptions = { diff --git a/server/models/video/video.ts b/server/models/video/video.ts index 46d823240..070ac7623 100644 --- a/server/models/video/video.ts +++ b/server/models/video/video.ts @@ -788,6 +788,16 @@ export class VideoModel extends Model { return VideoModel.scope(ScopeNames.WITH_FILES).findAll() } + static listLocal () { + const query = { + where: { + remote: false + } + } + + return VideoModel.scope(ScopeNames.WITH_FILES).findAll(query) + } + static listAllAndSharedByActorForOutbox (actorId: number, start: number, count: number) { function getRawQuery (select: string) { const queryVideo = 'SELECT ' + select + ' FROM "video" AS "Video" ' +