diff --git a/CHANGELOG.md b/CHANGELOG.md index 3aaa4524da21c59703d8f641606cd8934d497ed1..13102ef7dd1b8dad05757066af8e418d43a3ccf7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,7 +20,8 @@ You should also include the user name that made the change. - enhance(client): DM作æˆæ™‚ã«ãƒ¡ãƒ³ã‚·ãƒ§ãƒ³ã‚‚å«ã‚€ã‚ˆã†ã« - enhance(client): フォãƒãƒ¼ç”³è«‹ã®ãƒœã‚¿ãƒ³ã®ãƒ‡ã‚¶ã‚¤ãƒ³ã‚’改善 - enhance(backend): OpenAPIエンドãƒã‚¤ãƒ³ãƒˆã‚’復旧 -- é€æ˜ŽãªWebP/AVIFæ˜ åƒã¯JPEGã§ã¯ãªãWebPã«å¤‰æ›ã™ã‚‹ã‚ˆã†ã« +- WebP/AVIF/JPEGã®web公開用画åƒã¯ã€ã‚µãƒ¼ãƒãƒ¼ã‚µã‚¤ãƒ‰ã§ã¯JPEGã§ã¯ãªãWebPã«å¤‰æ›ã™ã‚‹ã‚ˆã†ã« +- アニメーション画åƒã®ã‚µãƒ ãƒã‚¤ãƒ«ã‚’生æˆã™ã‚‹ã‚ˆã†ã« - アクティブユーザー数ãƒãƒ£ãƒ¼ãƒˆã®è¨˜éŒ²ä¸Šé™å€¤ã‚’æ‹¡å¼µ - Playã®ã‚½ãƒ¼ã‚¹ã‚³ãƒ¼ãƒ‰ä¸Šé™æ–‡å—æ•°ã‚’2å€ã«æ‹¡å¼µ - 付箋ウィジェットã®é«˜ã•ã‚’è¨å®šå¯èƒ½ã« diff --git a/packages/backend/src/core/DriveService.ts b/packages/backend/src/core/DriveService.ts index 7eccf4b3b1fc36fda0ed3982b7ddf2673db1e434..f1e93d6dd9d5019b341c373dedf2a98ac68c6551 100644 --- a/packages/backend/src/core/DriveService.ts +++ b/packages/backend/src/core/DriveService.ts @@ -295,7 +295,7 @@ export class DriveService { satisfyWebpublic = !!( type !== 'image/svg+xml' && // security reason - type !== 'image/avif' && // not supported by Mastodon + type !== 'image/avif' && // not supported by Mastodon and MS Edge !(metadata.exif ?? metadata.iptc ?? metadata.xmp ?? metadata.tifftagPhotoshop) && metadata.width && metadata.width <= 2048 && metadata.height && metadata.height <= 2048 @@ -339,7 +339,7 @@ export class DriveService { if (isAnimated) { thumbnail = await this.imageProcessingService.convertSharpToWebp(sharp(path, { animated: true }), 374, 317, { alphaQuality: 70 }); } else { - thumbnail = await this.imageProcessingService.convertSharpToAvif(img, 498, 422); + thumbnail = await this.imageProcessingService.convertSharpToWebp(img, 498, 422); } } catch (err) { this.registerLogger.warn('thumbnail not created (an error occured)', err as Error); diff --git a/packages/backend/src/core/entities/DriveFileEntityService.ts b/packages/backend/src/core/entities/DriveFileEntityService.ts index 1a6913b800cd26aeae1c73fbe5437ddd9cd6ed06..2d40f444cb4ee5cbcbd09eb59f4467c7560674dc 100644 --- a/packages/backend/src/core/entities/DriveFileEntityService.ts +++ b/packages/backend/src/core/entities/DriveFileEntityService.ts @@ -76,7 +76,7 @@ export class DriveFileEntityService { @bindThis private getProxiedUrl(url: string, mode?: 'static' | 'avatar'): string { return appendQuery( - `${this.config.mediaProxy}/${mode ?? 'image'}.${mode === 'avatar' ? 'webp' : 'avif'}`, + `${this.config.mediaProxy}/${mode ?? 'image'}.webp`, query({ url, ...(mode ? { [mode]: '1' } : {}), diff --git a/packages/backend/src/server/FileServerService.ts b/packages/backend/src/server/FileServerService.ts index fb1c67f20d43514017d514ad58dc2b0b2bf0f595..794fa76d9e5cb92ed8fb4dabda4c80e49ec7e484 100644 --- a/packages/backend/src/server/FileServerService.ts +++ b/packages/backend/src/server/FileServerService.ts @@ -130,7 +130,7 @@ export class FileServerService { if (isMimeImage(file.mime, 'sharp-convertible-image-with-bmp')) { reply.header('Cache-Control', 'max-age=31536000, immutable'); - const url = new URL(`${this.config.mediaProxy}/static.avif`); + const url = new URL(`${this.config.mediaProxy}/static.webp`); url.searchParams.set('url', file.url); url.searchParams.set('static', '1'); @@ -151,7 +151,7 @@ export class FileServerService { if (['image/svg+xml'].includes(file.mime)) { reply.header('Cache-Control', 'max-age=31536000, immutable'); - const url = new URL(`${this.config.mediaProxy}/svg.avif`); + const url = new URL(`${this.config.mediaProxy}/svg.webp`); url.searchParams.set('url', file.url); file.cleanup(); @@ -291,9 +291,9 @@ export class FileServerService { }; } } else if ('static' in request.query) { - image = this.imageProcessingService.convertSharpToAvifStream(await sharpBmp(file.path, file.mime), 498, 422); + image = this.imageProcessingService.convertSharpToWebpStream(await sharpBmp(file.path, file.mime), 498, 422); } else if ('preview' in request.query) { - image = this.imageProcessingService.convertSharpToAvifStream(await sharpBmp(file.path, file.mime), 200, 200); + image = this.imageProcessingService.convertSharpToWebpStream(await sharpBmp(file.path, file.mime), 200, 200); } else if ('badge' in request.query) { const mask = (await sharpBmp(file.path, file.mime)) .resize(96, 96, { @@ -325,7 +325,7 @@ export class FileServerService { type: 'image/png', }; } else if (file.mime === 'image/svg+xml') { - image = this.imageProcessingService.convertToAvifStream(file.path, 2048, 2048); + image = this.imageProcessingService.convertToWebpStream(file.path, 2048, 2048); } else if (!file.mime.startsWith('image/') || !FILE_TYPE_BROWSERSAFE.includes(file.mime)) { throw new StatusError('Rejected type', 403, 'Rejected type'); } diff --git a/packages/backend/src/server/web/UrlPreviewService.ts b/packages/backend/src/server/web/UrlPreviewService.ts index 5f4d53d0ec55aa7c0e110b51657269baf00c9c97..2ce7293a529a2883decdbddcf09631d838d17b37 100644 --- a/packages/backend/src/server/web/UrlPreviewService.ts +++ b/packages/backend/src/server/web/UrlPreviewService.ts @@ -33,7 +33,7 @@ export class UrlPreviewService { private wrap(url?: string | null): string | null { return url != null ? url.match(/^https?:\/\//) - ? `${this.config.mediaProxy}/preview.avif?${query({ + ? `${this.config.mediaProxy}/preview.webp?${query({ url, preview: '1', })}` diff --git a/packages/frontend/src/scripts/media-proxy.ts b/packages/frontend/src/scripts/media-proxy.ts index d0c95e0b75cec8ae4e25857c0ee0f8431410af1d..91ac14c06d3a4c0508678b472f03093bde3a4f03 100644 --- a/packages/frontend/src/scripts/media-proxy.ts +++ b/packages/frontend/src/scripts/media-proxy.ts @@ -11,7 +11,7 @@ export function getProxiedImageUrl(imageUrl: string, type?: 'preview', mustOrigi } return `${mustOrigin ? localProxy : instance.mediaProxy}/${ - type === 'preview' ? 'preview.avif' + type === 'preview' ? 'preview.webp' : 'image.webp' }?${query({ url: imageUrl, @@ -41,7 +41,7 @@ export function getStaticImageUrl(baseUrl: string): string { return u.href; } - return `${instance.mediaProxy}/static.avif?${query({ + return `${instance.mediaProxy}/static.webp?${query({ url: u.href, static: '1', })}`;