summaryrefslogtreecommitdiff
path: root/packages/backend/src/core
diff options
context:
space:
mode:
authortamaina <tamaina@hotmail.co.jp>2022-12-30 12:00:50 +0900
committerGitHub <noreply@github.com>2022-12-30 12:00:50 +0900
commit8b46edeccf5a8907afbb871e3eb5b3b8eef967a8 (patch)
tree1411e540282c4b0d2365d3a2c7e01902a3403a3a /packages/backend/src/core
parentfix(client): fix position calculation of nested context menu (diff)
downloadsharkey-8b46edeccf5a8907afbb871e3eb5b3b8eef967a8.tar.gz
sharkey-8b46edeccf5a8907afbb871e3eb5b3b8eef967a8.tar.bz2
sharkey-8b46edeccf5a8907afbb871e3eb5b3b8eef967a8.zip
enhance: Proxy custom emojis to reduce image size and accelerate the frontend (#9431)
* fix(server): /emoji to accept `@.` host expression * fix(client): use MkEmoji for custom emoji in MkEmojiPicker * change convertToWebp * nanka iroiro * remove * fix * nearLosslessは労多くして益少なしなのでやめる * do not cleanup tmp for development * update sharp.js to 0.31.3 * mixed: true * fix MkAutocomplete of 912791b3ab * clean up * https://github.com/misskey-dev/misskey/pull/9431#discussion_r1059215943
Diffstat (limited to 'packages/backend/src/core')
-rw-r--r--packages/backend/src/core/CustomEmojiService.ts7
-rw-r--r--packages/backend/src/core/DownloadService.ts2
-rw-r--r--packages/backend/src/core/ImageProcessingService.ts20
3 files changed, 16 insertions, 13 deletions
diff --git a/packages/backend/src/core/CustomEmojiService.ts b/packages/backend/src/core/CustomEmojiService.ts
index ff52ad27d6..61cf811192 100644
--- a/packages/backend/src/core/CustomEmojiService.ts
+++ b/packages/backend/src/core/CustomEmojiService.ts
@@ -2,12 +2,10 @@ import { Inject, Injectable } from '@nestjs/common';
import { DataSource, In, IsNull } from 'typeorm';
import { GlobalEventService } from '@/core/GlobalEventService.js';
import { DI } from '@/di-symbols.js';
-import type { Config } from '@/config.js';
import { IdService } from '@/core/IdService.js';
import type { DriveFile } from '@/models/entities/DriveFile.js';
import type { Emoji } from '@/models/entities/Emoji.js';
import { Cache } from '@/misc/cache.js';
-import { query } from '@/misc/prelude/url.js';
import type { Note } from '@/models/entities/Note.js';
import type { EmojisRepository } from '@/models/index.js';
import { UtilityService } from '@/core/UtilityService.js';
@@ -27,9 +25,6 @@ export class CustomEmojiService {
private cache: Cache<Emoji | null>;
constructor(
- @Inject(DI.config)
- private config: Config,
-
@Inject(DI.db)
private db: DataSource,
@@ -117,7 +112,7 @@ export class CustomEmojiService {
const isLocal = emoji.host == null;
const emojiUrl = emoji.publicUrl || emoji.originalUrl; // || emoji.originalUrl してるのは後方互換性のため
- const url = isLocal ? emojiUrl : `${this.config.url}/proxy/${encodeURIComponent((new URL(emojiUrl)).pathname)}?${query({ url: emojiUrl })}`;
+ const url = emojiUrl;
return {
name: emojiName,
diff --git a/packages/backend/src/core/DownloadService.ts b/packages/backend/src/core/DownloadService.ts
index 9097bb08e0..62123246a7 100644
--- a/packages/backend/src/core/DownloadService.ts
+++ b/packages/backend/src/core/DownloadService.ts
@@ -33,7 +33,7 @@ export class DownloadService {
@bindThis
public async downloadUrl(url: string, path: string): Promise<void> {
- this.logger.info(`Downloading ${chalk.cyan(url)} ...`);
+ this.logger.info(`Downloading ${chalk.cyan(url)} to ${chalk.cyanBright(path)} ...`);
const timeout = 30 * 1000;
const operationTimeout = 60 * 1000;
diff --git a/packages/backend/src/core/ImageProcessingService.ts b/packages/backend/src/core/ImageProcessingService.ts
index 3a61873044..312189eea4 100644
--- a/packages/backend/src/core/ImageProcessingService.ts
+++ b/packages/backend/src/core/ImageProcessingService.ts
@@ -8,6 +8,16 @@ export type IImage = {
ext: string | null;
type: string;
};
+
+export const webpDefault: sharp.WebpOptions = {
+ quality: 85,
+ alphaQuality: 95,
+ lossless: false,
+ nearLossless: false,
+ smartSubsample: true,
+ mixed: true,
+};
+
import { bindThis } from '@/decorators.js';
@Injectable()
@@ -53,21 +63,19 @@ export class ImageProcessingService {
* with resize, remove metadata, resolve orientation, stop animation
*/
@bindThis
- public async convertToWebp(path: string, width: number, height: number, quality = 85): Promise<IImage> {
- return this.convertSharpToWebp(await sharp(path), width, height, quality);
+ public async convertToWebp(path: string, width: number, height: number, options: sharp.WebpOptions = webpDefault): Promise<IImage> {
+ return this.convertSharpToWebp(await sharp(path), width, height, options);
}
@bindThis
- public async convertSharpToWebp(sharp: sharp.Sharp, width: number, height: number, quality = 85): Promise<IImage> {
+ public async convertSharpToWebp(sharp: sharp.Sharp, width: number, height: number, options: sharp.WebpOptions = webpDefault): Promise<IImage> {
const data = await sharp
.resize(width, height, {
fit: 'inside',
withoutEnlargement: true,
})
.rotate()
- .webp({
- quality,
- })
+ .webp(options)
.toBuffer();
return {