X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Flib%2Factor-image.ts;h=e9bd148f6e321e4ad22a2e8d765e08f9afb0773a;hb=e722fb5923ddf11d72e48cec9788abc64327c22f;hp=ca7f9658d6b3305b9b833c9e50049bb2075caf6f;hpb=f479685678406a5df864d89615b33d29085ebfc6;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/lib/actor-image.ts b/server/lib/actor-image.ts index ca7f9658d..e9bd148f6 100644 --- a/server/lib/actor-image.ts +++ b/server/lib/actor-image.ts @@ -1,85 +1,14 @@ -import 'multer' -import { queue } from 'async' -import * as LRUCache from 'lru-cache' -import { extname, join } from 'path' -import { v4 as uuidv4 } from 'uuid' -import { retryTransactionWrapper } from '../helpers/database-utils' -import { processImage } from '../helpers/image-utils' -import { downloadImage } from '../helpers/requests' -import { CONFIG } from '../initializers/config' -import { AVATARS_SIZE, LRU_CACHE, QUEUE_CONCURRENCY } from '../initializers/constants' -import { sequelizeTypescript } from '../initializers/database' -import { MAccountDefault, MChannelDefault } from '../types/models' -import { deleteActorAvatarInstance, updateActorAvatarInstance } from './activitypub/actor' -import { sendUpdateActor } from './activitypub/send' +import maxBy from 'lodash/maxBy' -async function updateLocalActorAvatarFile ( - accountOrChannel: MAccountDefault | MChannelDefault, - avatarPhysicalFile: Express.Multer.File -) { - const extension = extname(avatarPhysicalFile.filename) +function getBiggestActorImage (images: T[]) { + const image = maxBy(images, 'width') - const avatarName = uuidv4() + extension - const destination = join(CONFIG.STORAGE.ACTOR_IMAGES, avatarName) - await processImage(avatarPhysicalFile.path, destination, AVATARS_SIZE) + // If width is null, maxBy won't return a value + if (!image) return images[0] - return retryTransactionWrapper(() => { - return sequelizeTypescript.transaction(async t => { - const avatarInfo = { - name: avatarName, - fileUrl: null, - onDisk: true - } - - const updatedActor = await updateActorAvatarInstance(accountOrChannel.Actor, avatarInfo, t) - await updatedActor.save({ transaction: t }) - - await sendUpdateActor(accountOrChannel, t) - - return updatedActor.Avatar - }) - }) -} - -async function deleteLocalActorAvatarFile ( - accountOrChannel: MAccountDefault | MChannelDefault -) { - return retryTransactionWrapper(() => { - return sequelizeTypescript.transaction(async t => { - const updatedActor = await deleteActorAvatarInstance(accountOrChannel.Actor, t) - await updatedActor.save({ transaction: t }) - - await sendUpdateActor(accountOrChannel, t) - - return updatedActor.Avatar - }) - }) + return image } -type DownloadImageQueueTask = { fileUrl: string, filename: string } - -const downloadImageQueue = queue((task, cb) => { - downloadImage(task.fileUrl, CONFIG.STORAGE.ACTOR_IMAGES, task.filename, AVATARS_SIZE) - .then(() => cb()) - .catch(err => cb(err)) -}, QUEUE_CONCURRENCY.ACTOR_PROCESS_IMAGE) - -function pushActorImageProcessInQueue (task: DownloadImageQueueTask) { - return new Promise((res, rej) => { - downloadImageQueue.push(task, err => { - if (err) return rej(err) - - return res() - }) - }) -} - -// Unsafe so could returns paths that does not exist anymore -const actorImagePathUnsafeCache = new LRUCache({ max: LRU_CACHE.ACTOR_IMAGE_STATIC.MAX_SIZE }) - export { - actorImagePathUnsafeCache, - updateLocalActorAvatarFile, - deleteLocalActorAvatarFile, - pushActorImageProcessInQueue + getBiggestActorImage }