From 61d24ddd7f0dbfecc7b901566831e7a00786d3c8 Mon Sep 17 00:00:00 2001 From: Max Nuding Date: Wed, 10 May 2023 16:13:24 +0200 Subject: [PATCH] refactor avatar resizing --- src/lib/server/timeline.ts | 131 +++++++++++-------------------------- 1 file changed, 39 insertions(+), 92 deletions(-) diff --git a/src/lib/server/timeline.ts b/src/lib/server/timeline.ts index db8dd7c..fc41d75 100644 --- a/src/lib/server/timeline.ts +++ b/src/lib/server/timeline.ts @@ -111,6 +111,35 @@ export class TimelineReader { return fileName; } + private static resizeAvatarPromiseMaker( + avatarFilenameBase: string, + baseSize: number, + maxPixelDensity: number, + accountUrl: string, + formats: string[], + avatar: ArrayBuffer + ): Promise[] { + const sharpAvatar = sharp(avatar); + const promises: Promise[] = []; + for (let i = 1; i <= maxPixelDensity; i++) { + promises.push( + ...formats.map((f) => + TimelineReader.resizeAvatar(avatarFilenameBase, baseSize * i, `${i}x.${f}`, sharpAvatar) + .then( + (fn) => + ({ + accountUrl: accountUrl, + file: fn, + sizeDescriptor: `${i}x` + } as AccountAvatar) + ) + .then(saveAvatar) + ) + ); + } + return promises; + } + private static async saveAvatar(account: Account) { try { const existingAvatars = await getAvatars(account.url, 1); @@ -132,98 +161,16 @@ export class TimelineReader { } const avatarResponse = await fetch(account.avatar); const avatar = await avatarResponse.arrayBuffer(); - const sharpAvatar = sharp(avatar); - await Promise.all([ - TimelineReader.resizeAvatar(avatarFilenameBase, 50, '1x.webp', sharpAvatar) - .then( - (fn) => - ({ - accountUrl: account.url, - file: fn, - sizeDescriptor: '1x' - } as AccountAvatar) - ) - .then(saveAvatar), - TimelineReader.resizeAvatar(avatarFilenameBase, 100, '2x.webp', sharpAvatar) - .then( - (fn) => - ({ - accountUrl: account.url, - file: fn, - sizeDescriptor: '2x' - } as AccountAvatar) - ) - .then(saveAvatar), - TimelineReader.resizeAvatar(avatarFilenameBase, 150, '3x.webp', sharpAvatar) - .then( - (fn) => - ({ - accountUrl: account.url, - file: fn, - sizeDescriptor: '3x' - } as AccountAvatar) - ) - .then(saveAvatar), - TimelineReader.resizeAvatar(avatarFilenameBase, 50, '1x.avif', sharpAvatar) - .then( - (fn) => - ({ - accountUrl: account.url, - file: fn, - sizeDescriptor: '1x' - } as AccountAvatar) - ) - .then(saveAvatar), - TimelineReader.resizeAvatar(avatarFilenameBase, 100, '2x.avif', sharpAvatar) - .then( - (fn) => - ({ - accountUrl: account.url, - file: fn, - sizeDescriptor: '2x' - } as AccountAvatar) - ) - .then(saveAvatar), - TimelineReader.resizeAvatar(avatarFilenameBase, 150, '3x.avif', sharpAvatar) - .then( - (fn) => - ({ - accountUrl: account.url, - file: fn, - sizeDescriptor: '3x' - } as AccountAvatar) - ) - .then(saveAvatar), - TimelineReader.resizeAvatar(avatarFilenameBase, 50, '1x.jpeg', sharpAvatar) - .then((fn) => { - return { - accountUrl: account.url, - file: fn, - sizeDescriptor: '1x' - } as AccountAvatar; - }) - .then(saveAvatar), - TimelineReader.resizeAvatar(avatarFilenameBase, 100, '2x.jpeg', sharpAvatar) - .then( - (fn) => - ({ - accountUrl: account.url, - file: fn, - sizeDescriptor: '2x' - } as AccountAvatar) - ) - .then(saveAvatar), - TimelineReader.resizeAvatar(avatarFilenameBase, 150, '3x.jpeg', sharpAvatar) - .then( - (fn) => - ({ - accountUrl: account.url, - file: fn, - sizeDescriptor: '3x' - } as AccountAvatar) - ) - .then(saveAvatar) - ]); + await Promise.all( + TimelineReader.resizeAvatarPromiseMaker( + avatarFilenameBase, + 50, + 3, + account.url, + ['webp', 'avif', 'jpeg'], + avatar + ) + ); } catch (e) { console.error('Could not resize and save avatar for', account.acct, account.avatar, e); }