From 374b725df52d941af1cf37cf211593340c05206c Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Tue, 16 Feb 2021 09:42:22 +0100 Subject: [PATCH] Optimize remote thumbnail processing --- server/lib/thumbnail.ts | 17 +++++++++++++++-- server/models/video/thumbnail.ts | 12 ++++++++---- 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/server/lib/thumbnail.ts b/server/lib/thumbnail.ts index 55478299c..5d0c9f742 100644 --- a/server/lib/thumbnail.ts +++ b/server/lib/thumbnail.ts @@ -1,5 +1,6 @@ +import chaiJsonSchema = require('chai-json-schema') +import { copy, move } from 'fs-extra' import { join } from 'path' - import { ThumbnailType } from '../../shared/models/videos/thumbnail.type' import { generateImageFromVideoFile } from '../helpers/ffmpeg-utils' import { processImage } from '../helpers/image-utils' @@ -69,7 +70,19 @@ function createVideoMiniatureFromUrl (options: { ? null : downloadUrl - const thumbnailCreator = () => downloadImage(downloadUrl, basePath, filename, { width, height }) + // If the thumbnail URL did not change + const existingUrl = existingThumbnail + ? existingThumbnail.fileUrl + : null + + // If the thumbnail URL did not change and has a unique filename (introduced in 3.2), avoid thumbnail processing + const thumbnailUrlChanged = !existingUrl || existingUrl !== downloadUrl || downloadUrl.endsWith(`${video.uuid}.jpg`) + const thumbnailCreator = () => { + if (thumbnailUrlChanged) return downloadImage(downloadUrl, basePath, filename, { width, height }) + + return copy(existingThumbnail.getPath(), ThumbnailModel.buildPath(type, filename)) + } + return createThumbnailFromFunction({ thumbnailCreator, filename, height, width, type, existingThumbnail, fileUrl }) } diff --git a/server/models/video/thumbnail.ts b/server/models/video/thumbnail.ts index 3d885f654..4185ec5f2 100644 --- a/server/models/video/thumbnail.ts +++ b/server/models/video/thumbnail.ts @@ -158,6 +158,12 @@ export class ThumbnailModel extends Model { return ThumbnailModel.findOne(query) } + static buildPath (type: ThumbnailType, filename: string) { + const directory = ThumbnailModel.types[type].directory + + return join(directory, filename) + } + getFileUrl (video: MVideoAccountLight) { const staticPath = ThumbnailModel.types[this.type].staticPath + this.filename @@ -169,13 +175,11 @@ export class ThumbnailModel extends Model { } getPath () { - const directory = ThumbnailModel.types[this.type].directory - return join(directory, this.filename) + return ThumbnailModel.buildPath(this.type, this.filename) } getPreviousPath () { - const directory = ThumbnailModel.types[this.type].directory - return join(directory, this.previousThumbnailFilename) + return ThumbnailModel.buildPath(this.type, this.previousThumbnailFilename) } removeThumbnail () {