]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blobdiff - server/lib/thumbnail.ts
Remove previous thumbnail if needed
[github/Chocobozzz/PeerTube.git] / server / lib / thumbnail.ts
index 33aa7159c0db619812f02aa5c338f4a855f7873d..55478299c86c942e2e5562145b38328e1505b3ac 100644 (file)
@@ -1,33 +1,48 @@
+import { join } from 'path'
+
+import { ThumbnailType } from '../../shared/models/videos/thumbnail.type'
 import { generateImageFromVideoFile } from '../helpers/ffmpeg-utils'
+import { processImage } from '../helpers/image-utils'
+import { downloadImage } from '../helpers/requests'
 import { CONFIG } from '../initializers/config'
 import { ASSETS_PATH, PREVIEWS_SIZE, THUMBNAILS_SIZE } from '../initializers/constants'
 import { ThumbnailModel } from '../models/video/thumbnail'
-import { ThumbnailType } from '../../shared/models/videos/thumbnail.type'
-import { processImage } from '../helpers/image-utils'
-import { join } from 'path'
-import { downloadImage } from '../helpers/requests'
-import { MVideoPlaylistThumbnail } from '../types/models/video/video-playlist'
 import { MVideoFile, MVideoThumbnail } from '../types/models'
 import { MThumbnail } from '../types/models/video/thumbnail'
+import { MVideoPlaylistThumbnail } from '../types/models/video/video-playlist'
 import { getVideoFilePath } from './video-paths'
 
 type ImageSize = { height: number, width: number }
 
-function createPlaylistMiniatureFromExisting (
-  inputPath: string,
-  playlist: MVideoPlaylistThumbnail,
-  automaticallyGenerated: boolean,
-  keepOriginal = false,
+function createPlaylistMiniatureFromExisting (options: {
+  inputPath: string
+  playlist: MVideoPlaylistThumbnail
+  automaticallyGenerated: boolean
+  keepOriginal?: boolean // default to false
   size?: ImageSize
-) {
+}) {
+  const { inputPath, playlist, automaticallyGenerated, keepOriginal = false, size } = options
   const { filename, outputPath, height, width, existingThumbnail } = buildMetadataFromPlaylist(playlist, size)
   const type = ThumbnailType.MINIATURE
 
   const thumbnailCreator = () => processImage(inputPath, outputPath, { width, height }, keepOriginal)
-  return createThumbnailFromFunction({ thumbnailCreator, filename, height, width, type, automaticallyGenerated, existingThumbnail })
+  return createThumbnailFromFunction({
+    thumbnailCreator,
+    filename,
+    height,
+    width,
+    type,
+    automaticallyGenerated,
+    existingThumbnail
+  })
 }
 
-function createPlaylistMiniatureFromUrl (downloadUrl: string, playlist: MVideoPlaylistThumbnail, size?: ImageSize) {
+function createPlaylistMiniatureFromUrl (options: {
+  downloadUrl: string
+  playlist: MVideoPlaylistThumbnail
+  size?: ImageSize
+}) {
+  const { downloadUrl, playlist, size } = options
   const { filename, basePath, height, width, existingThumbnail } = buildMetadataFromPlaylist(playlist, size)
   const type = ThumbnailType.MINIATURE
 
@@ -40,7 +55,13 @@ function createPlaylistMiniatureFromUrl (downloadUrl: string, playlist: MVideoPl
   return createThumbnailFromFunction({ thumbnailCreator, filename, height, width, type, existingThumbnail, fileUrl })
 }
 
-function createVideoMiniatureFromUrl (downloadUrl: string, video: MVideoThumbnail, type: ThumbnailType, size?: ImageSize) {
+function createVideoMiniatureFromUrl (options: {
+  downloadUrl: string
+  video: MVideoThumbnail
+  type: ThumbnailType
+  size?: ImageSize
+}) {
+  const { downloadUrl, video, type, size } = options
   const { filename, basePath, height, width, existingThumbnail } = buildMetadataFromVideo(video, type, size)
 
   // Only save the file URL if it is a remote video
@@ -58,17 +79,31 @@ function createVideoMiniatureFromExisting (options: {
   type: ThumbnailType
   automaticallyGenerated: boolean
   size?: ImageSize
-  keepOriginal?: boolean
+  keepOriginal?: boolean // default to false
 }) {
-  const { inputPath, video, type, automaticallyGenerated, size, keepOriginal } = options
+  const { inputPath, video, type, automaticallyGenerated, size, keepOriginal = false } = options
 
   const { filename, outputPath, height, width, existingThumbnail } = buildMetadataFromVideo(video, type, size)
   const thumbnailCreator = () => processImage(inputPath, outputPath, { width, height }, keepOriginal)
 
-  return createThumbnailFromFunction({ thumbnailCreator, filename, height, width, type, automaticallyGenerated, existingThumbnail })
+  return createThumbnailFromFunction({
+    thumbnailCreator,
+    filename,
+    height,
+    width,
+    type,
+    automaticallyGenerated,
+    existingThumbnail
+  })
 }
 
-function generateVideoMiniature (video: MVideoThumbnail, videoFile: MVideoFile, type: ThumbnailType) {
+function generateVideoMiniature (options: {
+  video: MVideoThumbnail
+  videoFile: MVideoFile
+  type: ThumbnailType
+}) {
+  const { video, videoFile, type } = options
+
   const input = getVideoFilePath(video, videoFile)
 
   const { filename, basePath, height, width, existingThumbnail, outputPath } = buildMetadataFromVideo(video, type)
@@ -76,10 +111,24 @@ function generateVideoMiniature (video: MVideoThumbnail, videoFile: MVideoFile,
     ? () => processImage(ASSETS_PATH.DEFAULT_AUDIO_BACKGROUND, outputPath, { width, height }, true)
     : () => generateImageFromVideoFile(input, basePath, filename, { height, width })
 
-  return createThumbnailFromFunction({ thumbnailCreator, filename, height, width, type, automaticallyGenerated: true, existingThumbnail })
+  return createThumbnailFromFunction({
+    thumbnailCreator,
+    filename,
+    height,
+    width,
+    type,
+    automaticallyGenerated: true,
+    existingThumbnail
+  })
 }
 
-function createPlaceholderThumbnail (fileUrl: string, video: MVideoThumbnail, type: ThumbnailType, size: ImageSize) {
+function createPlaceholderThumbnail (options: {
+  fileUrl: string
+  video: MVideoThumbnail
+  type: ThumbnailType
+  size: ImageSize
+}) {
+  const { fileUrl, video, type, size } = options
   const { filename, height, width, existingThumbnail } = buildMetadataFromVideo(video, type, size)
 
   const thumbnail = existingThumbnail || new ThumbnailModel()
@@ -164,12 +213,22 @@ async function createThumbnailFromFunction (parameters: {
   fileUrl?: string
   existingThumbnail?: MThumbnail
 }) {
-  const { thumbnailCreator, filename, width, height, type, existingThumbnail, automaticallyGenerated = null, fileUrl = null } = parameters
-
-  // Remove old file
-  if (existingThumbnail) await existingThumbnail.removeThumbnail()
+  const {
+    thumbnailCreator,
+    filename,
+    width,
+    height,
+    type,
+    existingThumbnail,
+    automaticallyGenerated = null,
+    fileUrl = null
+  } = parameters
+
+  const oldFilename = existingThumbnail
+    ? existingThumbnail.filename
+    : undefined
 
-  const thumbnail = existingThumbnail || new ThumbnailModel()
+  const thumbnail: MThumbnail = existingThumbnail || new ThumbnailModel()
 
   thumbnail.filename = filename
   thumbnail.height = height
@@ -177,6 +236,7 @@ async function createThumbnailFromFunction (parameters: {
   thumbnail.type = type
   thumbnail.fileUrl = fileUrl
   thumbnail.automaticallyGenerated = automaticallyGenerated
+  thumbnail.previousThumbnailFilename = oldFilename
 
   await thumbnailCreator()