diff --git a/CHANGELOG.md b/CHANGELOG.md index 1b0577fe32b..778e00f42a5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,9 @@ ### General - Feat: ジョブキュー管理画面からキューの一時停止/再開ができるように - Feat: アンテナのタイムラインから個別のノートを削除できるように +- Enhance: リンクプレビューで大きいカード表示に対応 + - `twitter:card = summary_large_image` が設定されているサイトの場合、リンクカードを拡大して表示します(メディアの添付もあるなどの条件によっては拡大表示をしない場合があります) + - ユーザー側で無効化することも可能です - Fix: コンパネからrootユーザーのパスワードをリセットしようとした際にエラーが通知されない問題を修正 - Feat: ノート検索で投稿日時の期間を条件に加えられるように(#16035) diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index aa2ac97d8af..2f8f3d566cf 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -900,6 +900,7 @@ customCss: "カスタムCSS" customCssWarn: "この設定は必ず知識のある方が行ってください。不適切な設定を行うとクライアントが正常に使用できなくなる恐れがあります。" global: "グローバル" squareAvatars: "アイコンを四角形で表示" +forceCompactUrlPreview: "URLプレビューを常にコンパクト表示にする" sent: "送信" received: "受信" searchResult: "検索結果" diff --git a/packages/backend/package.json b/packages/backend/package.json index 0ce253a9406..30f2adff53b 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -64,7 +64,7 @@ "@misskey-dev/emoji-assets": "17.0.3", "@misskey-dev/emoji-data": "17.0.3", "@misskey-dev/sharp-read-bmp": "1.2.0", - "@misskey-dev/summaly": "5.3.0", + "@misskey-dev/summaly": "5.4.0", "@napi-rs/canvas": "1.0.0", "@nestjs/common": "11.1.24", "@nestjs/core": "11.1.24", diff --git a/packages/backend/src/server/file/FileServerProxyHandler.ts b/packages/backend/src/server/file/FileServerProxyHandler.ts index 41e8e47ba52..64ac0dc7a5c 100644 --- a/packages/backend/src/server/file/FileServerProxyHandler.ts +++ b/packages/backend/src/server/file/FileServerProxyHandler.ts @@ -26,6 +26,7 @@ type ProxyQuery = { static?: string; preview?: string; badge?: string; + thumbnail?: string; origin?: string; url?: string; }; @@ -131,7 +132,7 @@ export class FileServerProxyHandler { ): Promise { const query = request.query; - const requiresImageConversion = 'emoji' in query || 'avatar' in query || 'static' in query || 'preview' in query || 'badge' in query; + const requiresImageConversion = 'emoji' in query || 'avatar' in query || 'static' in query || 'preview' in query || 'badge' in query || 'thumbnail' in query; const isConvertibleImage = isMimeImage(file.mime, 'sharp-convertible-image-with-bmp'); if (requiresImageConversion && !isConvertibleImage) { throw new StatusError('Unexpected mime', 404); @@ -141,6 +142,10 @@ export class FileServerProxyHandler { return this.processEmojiOrAvatar(file, query); } + if ('thumbnail' in query) { + return this.imageProcessingService.convertSharpToWebpStream(await sharpBmp(file.path, file.mime), 1280, 720); + } + if ('static' in query) { return this.imageProcessingService.convertSharpToWebpStream(await sharpBmp(file.path, file.mime), 498, 422); } diff --git a/packages/frontend-embed/package.json b/packages/frontend-embed/package.json index 2e55461c16b..f6bdf50dfe7 100644 --- a/packages/frontend-embed/package.json +++ b/packages/frontend-embed/package.json @@ -29,7 +29,7 @@ }, "devDependencies": { "@misskey-dev/emoji-assets": "17.0.3", - "@misskey-dev/summaly": "5.3.0", + "@misskey-dev/summaly": "5.4.0", "@tabler/icons-webfont": "3.35.0", "@testing-library/vue": "8.1.0", "@types/estree": "1.0.9", diff --git a/packages/frontend-shared/js/media-proxy.ts b/packages/frontend-shared/js/media-proxy.ts index 2837870c9a6..060d96132d6 100644 --- a/packages/frontend-shared/js/media-proxy.ts +++ b/packages/frontend-shared/js/media-proxy.ts @@ -15,7 +15,7 @@ export class MediaProxy { this.url = url; } - public getProxiedImageUrl(imageUrl: string, type?: 'preview' | 'emoji' | 'avatar', mustOrigin = false, noFallback = false): string { + public getProxiedImageUrl(imageUrl: string, type?: 'preview' | 'emoji' | 'avatar' | 'thumbnail', mustOrigin = false, noFallback = false): string { const localProxy = `${this.url}/proxy`; let _imageUrl = imageUrl; @@ -26,11 +26,15 @@ export class MediaProxy { return `${mustOrigin ? localProxy : this.serverMetadata.mediaProxy}/${ type === 'preview' ? 'preview.webp' + : type === 'thumbnail' ? 'thumbnail.webp' : 'image.webp' }?${query({ url: _imageUrl, ...(!noFallback ? { 'fallback': '1' } : {}), - ...(type ? { [type]: '1' } : {}), + // thumbnail を理解しない外部プロキシでも GIF アニメ解除と縮小がかかるよう static=1 をフォールバックとして併用 + ...(type === 'thumbnail' + ? { thumbnail: '1', static: '1' } + : type ? { [type]: '1' } : {}), ...(mustOrigin ? { origin: '1' } : {}), })}`; } diff --git a/packages/frontend/package.json b/packages/frontend/package.json index a300c8d271f..1fc9cba0fb0 100644 --- a/packages/frontend/package.json +++ b/packages/frontend/package.json @@ -72,7 +72,7 @@ }, "devDependencies": { "@misskey-dev/emoji-assets": "17.0.3", - "@misskey-dev/summaly": "5.3.0", + "@misskey-dev/summaly": "5.4.0", "@rollup/plugin-json": "6.1.0", "@rollup/pluginutils": "5.4.0", "@storybook/addon-essentials": "8.6.18", diff --git a/packages/frontend/src/components/MkLink.vue b/packages/frontend/src/components/MkLink.vue index 163f172f575..5e8ca1be32e 100644 --- a/packages/frontend/src/components/MkLink.vue +++ b/packages/frontend/src/components/MkLink.vue @@ -23,12 +23,11 @@ import { useTooltip } from '@/composables/use-tooltip.js'; import * as os from '@/os.js'; import { isEnabledUrlPreview } from '@/utility/url-preview.js'; -const props = withDefaults(defineProps<{ +const props = defineProps<{ url: string; rel?: null | string; navigationBehavior?: MkABehavior; -}>(), { -}); +}>(); const maybeRelativeUrl = maybeMakeRelative(props.url, local); const self = maybeRelativeUrl !== props.url; diff --git a/packages/frontend/src/components/MkNote.vue b/packages/frontend/src/components/MkNote.vue index 1cb562fb622..35a5d09521f 100644 --- a/packages/frontend/src/components/MkNote.vue +++ b/packages/frontend/src/components/MkNote.vue @@ -100,7 +100,7 @@ SPDX-License-Identifier: AGPL-3.0-only :class="$style.poll" />
- +