summaryrefslogtreecommitdiff
path: root/packages/frontend/src/scripts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/frontend/src/scripts')
-rw-r--r--packages/frontend/src/scripts/get-static-image-url.ts19
-rw-r--r--packages/frontend/src/scripts/media-proxy.ts34
-rw-r--r--packages/frontend/src/scripts/url.ts5
3 files changed, 38 insertions, 20 deletions
diff --git a/packages/frontend/src/scripts/get-static-image-url.ts b/packages/frontend/src/scripts/get-static-image-url.ts
deleted file mode 100644
index cbd1761983..0000000000
--- a/packages/frontend/src/scripts/get-static-image-url.ts
+++ /dev/null
@@ -1,19 +0,0 @@
-import { url as instanceUrl } from '@/config';
-import * as url from '@/scripts/url';
-
-export function getStaticImageUrl(baseUrl: string): string {
- const u = new URL(baseUrl);
- if (u.href.startsWith(`${instanceUrl}/proxy/`)) {
- // もう既にproxyっぽそうだったらsearchParams付けるだけ
- u.searchParams.set('static', '1');
- return u.href;
- }
-
- // 拡張子がないとキャッシュしてくれないCDNがあるのでダミーの名前を指定する
- const dummy = `${encodeURIComponent(`${u.host}${u.pathname}`)}.webp`;
-
- return `${instanceUrl}/proxy/${dummy}?${url.query({
- url: u.href,
- static: '1',
- })}`;
-}
diff --git a/packages/frontend/src/scripts/media-proxy.ts b/packages/frontend/src/scripts/media-proxy.ts
index aaf7f9e610..bea164e7c8 100644
--- a/packages/frontend/src/scripts/media-proxy.ts
+++ b/packages/frontend/src/scripts/media-proxy.ts
@@ -1,7 +1,15 @@
-import { query } from '@/scripts/url';
+import { query, appendQuery } from '@/scripts/url';
import { url } from '@/config';
export function getProxiedImageUrl(imageUrl: string, type?: 'preview'): string {
+ if (imageUrl.startsWith(`${url}/proxy/`) || imageUrl.startsWith('/proxy/')) {
+ // もう既にproxyっぽそうだったらsearchParams付けるだけ
+ return appendQuery(imageUrl, query({
+ fallback: '1',
+ ...(type ? { [type]: '1' } : {}),
+ }));
+ }
+
return `${url}/proxy/image.webp?${query({
url: imageUrl,
fallback: '1',
@@ -13,3 +21,27 @@ export function getProxiedImageUrlNullable(imageUrl: string | null | undefined,
if (imageUrl == null) return null;
return getProxiedImageUrl(imageUrl, type);
}
+
+export function getStaticImageUrl(baseUrl: string): string {
+ const u = baseUrl.startsWith('http') ? new URL(baseUrl) : new URL(baseUrl, url);
+
+ if (u.href.startsWith(`${url}/proxy/`)) {
+ // もう既にproxyっぽそうだったらsearchParams付けるだけ
+ u.searchParams.set('static', '1');
+ return u.href;
+ }
+
+ if (u.href.startsWith(`${url}/emoji/`)) {
+ // もう既にemojiっぽそうだったらsearchParams付けるだけ
+ u.searchParams.set('static', '1');
+ return u.href;
+ }
+
+ // 拡張子がないとキャッシュしてくれないCDNがあるのでダミーの名前を指定する
+ const dummy = `${encodeURIComponent(`${u.host}${u.pathname}`)}.webp`;
+
+ return `${url}/proxy/${dummy}?${query({
+ url: u.href,
+ static: '1',
+ })}`;
+}
diff --git a/packages/frontend/src/scripts/url.ts b/packages/frontend/src/scripts/url.ts
index 86735de9f0..b6a997449a 100644
--- a/packages/frontend/src/scripts/url.ts
+++ b/packages/frontend/src/scripts/url.ts
@@ -1,3 +1,8 @@
+/* objを検査して
+ * 1. 配列に何も入っていない時はクエリを付けない
+ * 2. プロパティがundefinedの時はクエリを付けない
+ * (new URLSearchParams(obj)ではそこまで丁寧なことをしてくれない)
+ */
export function query(obj: Record<string, any>): string {
const params = Object.entries(obj)
.filter(([, v]) => Array.isArray(v) ? v.length : v !== undefined)