]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/commitdiff
Fill width of local avatars
authorChocobozzz <me@florianbigard.com>
Tue, 1 Mar 2022 07:50:28 +0000 (08:50 +0100)
committerChocobozzz <me@florianbigard.com>
Tue, 1 Mar 2022 12:37:40 +0000 (13:37 +0100)
scripts/migrations/peertube-4.2.ts
server/helpers/image-utils.ts

index 045c3e511fee0066c9dc4f178bf8a95df22b74e1..22f9ff9f00ee37bf9b2e8dedb0f877743c74b8ac 100644 (file)
@@ -1,6 +1,6 @@
 import { minBy } from 'lodash'
 import { join } from 'path'
-import { processImage } from '@server/helpers/image-utils'
+import { getImageSize, processImage } from '@server/helpers/image-utils'
 import { CONFIG } from '@server/initializers/config'
 import { ACTOR_IMAGES_SIZE } from '@server/initializers/constants'
 import { updateActorImages } from '@server/lib/activitypub/actors'
@@ -51,6 +51,7 @@ async function run () {
 
   for (const account of accounts) {
     try {
+      await fillAvatarSizeIfNeeded(account)
       await generateSmallerAvatarIfNeeded(account)
     } catch (err) {
       console.error(`Cannot process account avatar ${account.name}`, err)
@@ -68,6 +69,22 @@ async function run () {
   console.log('Generation finished!')
 }
 
+async function fillAvatarSizeIfNeeded (accountOrChannel: MAccountDefault | MChannelDefault) {
+  const avatars = accountOrChannel.Actor.Avatars
+
+  for (const avatar of avatars) {
+    if (avatar.width && avatar.height) continue
+
+    console.log('Filling size of avatars of %s.', accountOrChannel.name)
+
+    const { width, height } = await getImageSize(join(CONFIG.STORAGE.ACTOR_IMAGES, avatar.filename))
+    avatar.width = width
+    avatar.height = height
+
+    await avatar.save()
+  }
+}
+
 async function generateSmallerAvatarIfNeeded (accountOrChannel: MAccountDefault | MChannelDefault) {
   const avatars = accountOrChannel.Actor.Avatars
   if (avatars.length !== 1) {
index 6e4a2b0003c0dc85e06e335f58ab6f29c09856af..9d0c09051788ef51bbb9e947a396cb3da98b4802 100644 (file)
@@ -1,5 +1,5 @@
 import { copy, readFile, remove, rename } from 'fs-extra'
-import Jimp, { read } from 'jimp'
+import Jimp, { read as jimpRead } from 'jimp'
 import { join } from 'path'
 import { getLowercaseExtension } from '@shared/core-utils'
 import { buildUUID } from '@shared/extra-utils'
@@ -56,12 +56,26 @@ async function generateImageFromVideoFile (fromPath: string, folder: string, ima
   }
 }
 
+async function getImageSize (path: string) {
+  const inputBuffer = await readFile(path)
+
+  const image = await jimpRead(inputBuffer)
+
+  return {
+    width: image.getWidth(),
+    height: image.getHeight()
+  }
+}
+
 // ---------------------------------------------------------------------------
 
 export {
   generateImageFilename,
   generateImageFromVideoFile,
-  processImage
+
+  processImage,
+
+  getImageSize
 }
 
 // ---------------------------------------------------------------------------
@@ -71,7 +85,7 @@ async function jimpProcessor (path: string, destination: string, newSize: { widt
   const inputBuffer = await readFile(path)
 
   try {
-    sourceImage = await read(inputBuffer)
+    sourceImage = await jimpRead(inputBuffer)
   } catch (err) {
     logger.debug('Cannot read %s with jimp. Try to convert the image using ffmpeg first.', path, { err })
 
@@ -79,7 +93,7 @@ async function jimpProcessor (path: string, destination: string, newSize: { widt
     await convertWebPToJPG(path, newName)
     await rename(newName, path)
 
-    sourceImage = await read(path)
+    sourceImage = await jimpRead(path)
   }
 
   await remove(destination)