summaryrefslogtreecommitdiff
path: root/packages/backend/src/core
diff options
context:
space:
mode:
authortamaina <tamaina@hotmail.co.jp>2023-02-04 13:38:51 +0900
committerGitHub <noreply@github.com>2023-02-04 13:38:51 +0900
commit2dfed75402969893ba10f500de254b12434c8f3f (patch)
treeb5abaf058fdf8b04ea37714ec1dc5c4dc12783bc /packages/backend/src/core
parentperf(server): cache blocking (diff)
downloadmisskey-2dfed75402969893ba10f500de254b12434c8f3f.tar.gz
misskey-2dfed75402969893ba10f500de254b12434c8f3f.tar.bz2
misskey-2dfed75402969893ba10f500de254b12434c8f3f.zip
perf(server): improvement of external mediaProxy (#9787)
* perf(server): improvement of external mediaProxy * add a comment * :v: * /filesでsharpの処理を行わずリダイレクトする * fix * thumbnail => static * Fix #9788 * add avatar mode * add url * fix * static.webp * remove encodeURIComponent from media proxy path * remove existance check
Diffstat (limited to 'packages/backend/src/core')
-rw-r--r--packages/backend/src/core/CustomEmojiService.ts2
-rw-r--r--packages/backend/src/core/entities/ChannelEntityService.ts2
-rw-r--r--packages/backend/src/core/entities/DriveFileEntityService.ts40
-rw-r--r--packages/backend/src/core/entities/UserEntityService.ts8
4 files changed, 33 insertions, 19 deletions
diff --git a/packages/backend/src/core/CustomEmojiService.ts b/packages/backend/src/core/CustomEmojiService.ts
index 39814e1be6..63f0319442 100644
--- a/packages/backend/src/core/CustomEmojiService.ts
+++ b/packages/backend/src/core/CustomEmojiService.ts
@@ -120,7 +120,7 @@ export class CustomEmojiService {
const url = isLocal
? emojiUrl
: this.config.proxyRemoteFiles
- ? `${this.config.url}/proxy/${encodeURIComponent((new URL(emojiUrl)).pathname)}?${query({ url: emojiUrl })}`
+ ? `${this.config.mediaProxy}/emoji.webp?${query({ url: emojiUrl })}`
: emojiUrl;
return url;
diff --git a/packages/backend/src/core/entities/ChannelEntityService.ts b/packages/backend/src/core/entities/ChannelEntityService.ts
index 5e2f019a12..6ce590aa96 100644
--- a/packages/backend/src/core/entities/ChannelEntityService.ts
+++ b/packages/backend/src/core/entities/ChannelEntityService.ts
@@ -54,7 +54,7 @@ export class ChannelEntityService {
name: channel.name,
description: channel.description,
userId: channel.userId,
- bannerUrl: banner ? this.driveFileEntityService.getPublicUrl(banner, false) : null,
+ bannerUrl: banner ? this.driveFileEntityService.getPublicUrl(banner) : null,
usersCount: channel.usersCount,
notesCount: channel.notesCount,
diff --git a/packages/backend/src/core/entities/DriveFileEntityService.ts b/packages/backend/src/core/entities/DriveFileEntityService.ts
index 7f54cfdeac..efc196f74a 100644
--- a/packages/backend/src/core/entities/DriveFileEntityService.ts
+++ b/packages/backend/src/core/entities/DriveFileEntityService.ts
@@ -71,27 +71,41 @@ export class DriveFileEntityService {
}
@bindThis
- public getPublicUrl(file: DriveFile, thumbnail = false): string | null {
+ public getPublicUrl(file: DriveFile, mode? : 'static' | 'avatar'): string | null { // static = thumbnail
+ const proxiedUrl = (url: string) => appendQuery(
+ `${this.config.mediaProxy}/${mode ?? 'image'}.webp`,
+ query({
+ url,
+ ...(mode ? { [mode]: '1' } : {}),
+ })
+ );
+
// リモートかつメディアプロキシ
- if (file.uri != null && file.userHost != null && this.config.mediaProxy != null) {
- return appendQuery(this.config.mediaProxy, query({
- url: file.uri,
- thumbnail: thumbnail ? '1' : undefined,
- }));
+ if (file.uri != null && file.userHost != null && this.config.externalMediaProxyEnabled) {
+ return proxiedUrl(file.uri);
}
// リモートかつ期限切れはローカルプロキシを試みる
if (file.uri != null && file.isLink && this.config.proxyRemoteFiles) {
- const key = thumbnail ? file.thumbnailAccessKey : file.webpublicAccessKey;
+ const key = mode === 'static' ? file.thumbnailAccessKey : file.webpublicAccessKey;
if (key && !key.match('/')) { // 古いものはここにオブジェクトストレージキーが入ってるので除外
- return `${this.config.url}/files/${key}`;
+ const url = `${this.config.url}/files/${key}`;
+ if (mode === 'avatar') return proxiedUrl(url);
+ return url;
}
}
const isImage = file.type && ['image/png', 'image/apng', 'image/gif', 'image/jpeg', 'image/webp', 'image/avif', 'image/svg+xml'].includes(file.type);
- return thumbnail ? (file.thumbnailUrl ?? (isImage ? (file.webpublicUrl ?? file.url) : null)) : (file.webpublicUrl ?? file.url);
+ if (mode === 'static') {
+ return file.thumbnailUrl ?? (isImage ? (file.webpublicUrl ?? file.url) : null);
+ }
+
+ const url = file.webpublicUrl ?? file.url;
+
+ if (mode === 'avatar') return proxiedUrl(url);
+ return url;
}
@bindThis
@@ -166,8 +180,8 @@ export class DriveFileEntityService {
isSensitive: file.isSensitive,
blurhash: file.blurhash,
properties: opts.self ? file.properties : this.getPublicProperties(file),
- url: opts.self ? file.url : this.getPublicUrl(file, false),
- thumbnailUrl: this.getPublicUrl(file, true),
+ url: opts.self ? file.url : this.getPublicUrl(file),
+ thumbnailUrl: this.getPublicUrl(file, 'static'),
comment: file.comment,
folderId: file.folderId,
folder: opts.detail && file.folderId ? this.driveFolderEntityService.pack(file.folderId, {
@@ -201,8 +215,8 @@ export class DriveFileEntityService {
isSensitive: file.isSensitive,
blurhash: file.blurhash,
properties: opts.self ? file.properties : this.getPublicProperties(file),
- url: opts.self ? file.url : this.getPublicUrl(file, false),
- thumbnailUrl: this.getPublicUrl(file, true),
+ url: opts.self ? file.url : this.getPublicUrl(file),
+ thumbnailUrl: this.getPublicUrl(file, 'static'),
comment: file.comment,
folderId: file.folderId,
folder: opts.detail && file.folderId ? this.driveFolderEntityService.pack(file.folderId, {
diff --git a/packages/backend/src/core/entities/UserEntityService.ts b/packages/backend/src/core/entities/UserEntityService.ts
index aaa80033b3..ff42c07359 100644
--- a/packages/backend/src/core/entities/UserEntityService.ts
+++ b/packages/backend/src/core/entities/UserEntityService.ts
@@ -314,10 +314,10 @@ export class UserEntityService implements OnModuleInit {
@bindThis
public async getAvatarUrl(user: User): Promise<string> {
if (user.avatar) {
- return this.driveFileEntityService.getPublicUrl(user.avatar, true) ?? this.getIdenticonUrl(user.id);
+ return this.driveFileEntityService.getPublicUrl(user.avatar, 'avatar') ?? this.getIdenticonUrl(user.id);
} else if (user.avatarId) {
const avatar = await this.driveFilesRepository.findOneByOrFail({ id: user.avatarId });
- return this.driveFileEntityService.getPublicUrl(avatar, true) ?? this.getIdenticonUrl(user.id);
+ return this.driveFileEntityService.getPublicUrl(avatar, 'avatar') ?? this.getIdenticonUrl(user.id);
} else {
return this.getIdenticonUrl(user.id);
}
@@ -326,7 +326,7 @@ export class UserEntityService implements OnModuleInit {
@bindThis
public getAvatarUrlSync(user: User): string {
if (user.avatar) {
- return this.driveFileEntityService.getPublicUrl(user.avatar, true) ?? this.getIdenticonUrl(user.id);
+ return this.driveFileEntityService.getPublicUrl(user.avatar, 'avatar') ?? this.getIdenticonUrl(user.id);
} else {
return this.getIdenticonUrl(user.id);
}
@@ -422,7 +422,7 @@ export class UserEntityService implements OnModuleInit {
createdAt: user.createdAt.toISOString(),
updatedAt: user.updatedAt ? user.updatedAt.toISOString() : null,
lastFetchedAt: user.lastFetchedAt ? user.lastFetchedAt.toISOString() : null,
- bannerUrl: user.banner ? this.driveFileEntityService.getPublicUrl(user.banner, false) : null,
+ bannerUrl: user.banner ? this.driveFileEntityService.getPublicUrl(user.banner) : null,
bannerBlurhash: user.banner?.blurhash ?? null,
isLocked: user.isLocked,
isSilenced: this.roleService.getUserPolicies(user.id).then(r => !r.canPublicNote),