X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Flib%2Factor-image.ts;h=e9bd148f6e321e4ad22a2e8d765e08f9afb0773a;hb=5e47f6ab984a7d00782e4c7030afffa1ba480add;hp=fa1a2a18a306011d00722253151928e0c6a204ae;hpb=213e30ef90806369529684ac9c247d73b8dc7928;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/lib/actor-image.ts b/server/lib/actor-image.ts index fa1a2a18a..e9bd148f6 100644 --- a/server/lib/actor-image.ts +++ b/server/lib/actor-image.ts @@ -1,95 +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 { ActorImageType } from '@shared/models' -import { retryTransactionWrapper } from '../helpers/database-utils' -import { processImage } from '../helpers/image-utils' -import { downloadImage } from '../helpers/requests' -import { CONFIG } from '../initializers/config' -import { ACTOR_IMAGES_SIZE, LRU_CACHE, QUEUE_CONCURRENCY } from '../initializers/constants' -import { sequelizeTypescript } from '../initializers/database' -import { MAccountDefault, MChannelDefault } from '../types/models' -import { deleteActorImageInstance, updateActorImageInstance } from './activitypub/actor' -import { sendUpdateActor } from './activitypub/send' +import maxBy from 'lodash/maxBy' -async function updateLocalActorImageFile ( - accountOrChannel: MAccountDefault | MChannelDefault, - imagePhysicalFile: Express.Multer.File, - type: ActorImageType -) { - const imageSize = type === ActorImageType.AVATAR - ? ACTOR_IMAGES_SIZE.AVATARS - : ACTOR_IMAGES_SIZE.BANNERS +function getBiggestActorImage (images: T[]) { + const image = maxBy(images, 'width') - const extension = extname(imagePhysicalFile.filename) + // If width is null, maxBy won't return a value + if (!image) return images[0] - const imageName = uuidv4() + extension - const destination = join(CONFIG.STORAGE.ACTOR_IMAGES, imageName) - await processImage(imagePhysicalFile.path, destination, imageSize) - - return retryTransactionWrapper(() => { - return sequelizeTypescript.transaction(async t => { - const actorImageInfo = { - name: imageName, - fileUrl: null, - onDisk: true - } - - const updatedActor = await updateActorImageInstance(accountOrChannel.Actor, type, actorImageInfo, t) - await updatedActor.save({ transaction: t }) - - await sendUpdateActor(accountOrChannel, t) - - return type === ActorImageType.AVATAR - ? updatedActor.Avatar - : updatedActor.Banner - }) - }) -} - -async function deleteLocalActorImageFile (accountOrChannel: MAccountDefault | MChannelDefault, type: ActorImageType) { - return retryTransactionWrapper(() => { - return sequelizeTypescript.transaction(async t => { - const updatedActor = await deleteActorImageInstance(accountOrChannel.Actor, type, t) - await updatedActor.save({ transaction: t }) - - await sendUpdateActor(accountOrChannel, t) - - return updatedActor.Avatar - }) - }) + return image } -type DownloadImageQueueTask = { fileUrl: string, filename: string, type: ActorImageType } - -const downloadImageQueue = queue((task, cb) => { - const size = task.type === ActorImageType.AVATAR - ? ACTOR_IMAGES_SIZE.AVATARS - : ACTOR_IMAGES_SIZE.BANNERS - - downloadImage(task.fileUrl, CONFIG.STORAGE.ACTOR_IMAGES, task.filename, 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, - updateLocalActorImageFile, - deleteLocalActorImageFile, - pushActorImageProcessInQueue + getBiggestActorImage }