mirror of https://github.com/Chocobozzz/PeerTube
				
				
				
			
		
			
				
	
	
		
			65 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			TypeScript
		
	
	
			
		
		
	
	
			65 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			TypeScript
		
	
	
import Bluebird from 'bluebird'
 | 
						|
import { program } from 'commander'
 | 
						|
import { pathExists, remove } from 'fs-extra/esm'
 | 
						|
import { generateImageFilename, processImage } from '@server/helpers/image-utils.js'
 | 
						|
import { THUMBNAILS_SIZE } from '@server/initializers/constants.js'
 | 
						|
import { initDatabaseModels } from '@server/initializers/database.js'
 | 
						|
import { VideoModel } from '@server/models/video/video.js'
 | 
						|
 | 
						|
program
 | 
						|
  .description('Regenerate local thumbnails using preview files')
 | 
						|
  .parse(process.argv)
 | 
						|
 | 
						|
run()
 | 
						|
  .then(() => process.exit(0))
 | 
						|
  .catch(err => console.error(err))
 | 
						|
 | 
						|
async function run () {
 | 
						|
  await initDatabaseModels(true)
 | 
						|
 | 
						|
  const ids = await VideoModel.listLocalIds()
 | 
						|
 | 
						|
  await Bluebird.map(ids, id => {
 | 
						|
    return processVideo(id)
 | 
						|
      .catch(err => console.error('Cannot process video %d.', id, err))
 | 
						|
  }, { concurrency: 20 })
 | 
						|
}
 | 
						|
 | 
						|
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 previewPath = preview.getPath()
 | 
						|
 | 
						|
  if (!await pathExists(previewPath)) {
 | 
						|
    throw new Error(`Preview ${previewPath} does not exist on disk`)
 | 
						|
  }
 | 
						|
 | 
						|
  const size = {
 | 
						|
    width: THUMBNAILS_SIZE.width,
 | 
						|
    height: THUMBNAILS_SIZE.height
 | 
						|
  }
 | 
						|
 | 
						|
  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
 | 
						|
}
 |