]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blobdiff - scripts/regenerate-thumbnails.ts
More specific message when signup is not allowed
[github/Chocobozzz/PeerTube.git] / scripts / regenerate-thumbnails.ts
index b0071efe000b72f02391a990de21e2b7bf433c87..061819387ac0420ba1fe6092653ec960239d1039 100644 (file)
@@ -1,14 +1,10 @@
-import { registerTSPaths } from '../server/helpers/register-ts-paths'
-registerTSPaths()
-
-import * as Bluebird from 'bluebird'
-import * as program from 'commander'
-import { pathExists } from 'fs-extra'
-import { processImage } from '@server/helpers/image-utils'
+import { map } from 'bluebird'
+import { program } from 'commander'
+import { pathExists, remove } from 'fs-extra'
+import { generateImageFilename, processImage } from '@server/helpers/image-utils'
 import { THUMBNAILS_SIZE } from '@server/initializers/constants'
-import { VideoModel } from '@server/models/video/video'
-import { MVideo } from '@server/types/models'
 import { initDatabaseModels } from '@server/initializers/database'
+import { VideoModel } from '@server/models/video/video'
 
 program
   .description('Regenerate local thumbnails using preview files')
@@ -21,27 +17,24 @@ run()
 async function run () {
   await initDatabaseModels(true)
 
-  const videos = await VideoModel.listLocal()
+  const ids = await VideoModel.listLocalIds()
 
-  await Bluebird.map(videos, v => {
-    return processVideo(v)
-      .catch(err => console.error('Cannot process video %s.', v.url, err))
+  await map(ids, id => {
+    return processVideo(id)
+      .catch(err => console.error('Cannot process video %d.', id, err))
   }, { concurrency: 20 })
 }
 
-async function processVideo (videoArg: MVideo) {
-  const video = await VideoModel.loadWithFiles(videoArg.id)
+async function processVideo (id: number) {
+  const video = await VideoModel.loadWithFiles(id)
+
+  console.log('Processing video %s.', video.name)
 
   const thumbnail = video.getMiniature()
   const preview = video.getPreview()
 
-  const thumbnailPath = thumbnail.getPath()
   const previewPath = preview.getPath()
 
-  if (!await pathExists(thumbnailPath)) {
-    throw new Error(`Thumbnail ${thumbnailPath} does not exist on disk`)
-  }
-
   if (!await pathExists(previewPath)) {
     throw new Error(`Preview ${previewPath} does not exist on disk`)
   }
@@ -50,5 +43,22 @@ async function processVideo (videoArg: MVideo) {
     width: THUMBNAILS_SIZE.width,
     height: THUMBNAILS_SIZE.height
   }
-  await processImage(previewPath, thumbnailPath, size, true)
+
+  const oldPath = thumbnail.getPath()
+
+  // Update thumbnail
+  thumbnail.filename = generateImageFilename()
+  thumbnail.width = size.width
+  thumbnail.height = size.height
+
+  const thumbnailPath = thumbnail.getPath()
+  await processImage({ path: previewPath, destination: thumbnailPath, newSize: size, keepOriginal: true })
+
+  // Save new attributes
+  await thumbnail.save()
+
+  // Remove old thumbnail
+  await remove(oldPath)
+
+  // Don't federate, remote instances will refresh the thumbnails after a while
 }