fix: serve real thumbnails for local photos instead of full-resolution originals (#822)

Add thumbnailService that lazy-generates a WebP thumbnail (800px max, q80) on
first GET /api/photos/:id/thumbnail request using sharp. The generated file is
stored at uploads/journey/thumbs/<sha1>.webp and the path is persisted to
trek_photos.thumbnail_path so subsequent requests are served directly from disk.
Also populates width/height as a side-effect.

streamPhoto now branches on kind for local file_path rows — thumbnail requests
use the stored/generated thumb path; original requests (and fallback when thumb
generation fails) continue to serve the full file. Remote providers (Immich,
Synology) are unaffected.
This commit is contained in:
jubnl
2026-04-22 15:56:34 +02:00
parent f6b3931bc4
commit 7c9e945b8c
4 changed files with 642 additions and 1 deletions
+1
View File
@@ -30,6 +30,7 @@
"otplib": "^12.0.1",
"qrcode": "^1.5.4",
"semver": "^7.7.4",
"sharp": "^0.34.5",
"tsx": "^4.21.0",
"typescript": "^6.0.2",
"undici": "^7.0.0",