diff --git a/server/src/services/memories/helpersService.ts b/server/src/services/memories/helpersService.ts index 84a3fd31..96fb42cd 100644 --- a/server/src/services/memories/helpersService.ts +++ b/server/src/services/memories/helpersService.ts @@ -253,13 +253,19 @@ export function updateSyncTimeForAlbumLink(linkId: string): void { db.prepare('UPDATE trip_album_links SET last_synced_at = CURRENT_TIMESTAMP WHERE id = ?').run(linkId); } -export async function pipeAsset(url: string, response: Response, headers?: Record, signal?: AbortSignal): Promise { +export async function pipeAsset(url: string, response: Response, headers?: Record, signal?: AbortSignal, defaultCacheControl?: string): Promise { try { const resp = await safeFetch(url, { headers, signal: signal as any }); response.status(resp.status); if (resp.headers.get('content-type')) response.set('Content-Type', resp.headers.get('content-type') as string); - if (resp.headers.get('cache-control')) response.set('Cache-Control', resp.headers.get('cache-control') as string); + if (!resp.ok) { + response.set('Cache-Control', 'no-store, max-age=0'); + } else if (resp.headers.get('cache-control')) { + response.set('Cache-Control', resp.headers.get('cache-control') as string); + } else if (defaultCacheControl) { + response.set('Cache-Control', defaultCacheControl); + } if (resp.headers.get('content-length')) response.set('Content-Length', resp.headers.get('content-length') as string); if (resp.headers.get('content-disposition')) response.set('Content-Disposition', resp.headers.get('content-disposition') as string); diff --git a/server/src/services/memories/immichService.ts b/server/src/services/memories/immichService.ts index 41c078fe..dd212d34 100644 --- a/server/src/services/memories/immichService.ts +++ b/server/src/services/memories/immichService.ts @@ -246,8 +246,7 @@ export async function streamImmichAsset( ? `${creds.immich_url}/api/assets/${assetId}/thumbnail?size=thumbnail` : `${creds.immich_url}/api/assets/${assetId}/thumbnail?size=fullsize`; - response.set('Cache-Control', 'public, max-age=86400'); - await pipeAsset(url, response, { 'x-api-key': creds.immich_api_key }, AbortSignal.timeout(timeout)); + await pipeAsset(url, response, { 'x-api-key': creds.immich_api_key }, AbortSignal.timeout(timeout), 'public, max-age=86400'); } // ── Albums ────────────────────────────────────────────────────────────────── diff --git a/server/src/services/memories/photoResolverService.ts b/server/src/services/memories/photoResolverService.ts index 942e8334..f0e7c816 100644 --- a/server/src/services/memories/photoResolverService.ts +++ b/server/src/services/memories/photoResolverService.ts @@ -69,15 +69,18 @@ export async function streamPhoto( return; } + if (photo.file_path) { + const localPath = path.join(__dirname, '../../../uploads', photo.file_path); + if (fs.existsSync(localPath)) { + res.set('Cache-Control', 'public, max-age=86400'); + res.sendFile(localPath); + return; + } + } + switch (photo.provider) { case 'local': { - const filePath = path.join(__dirname, '../../../uploads', photo.file_path!); - if (!fs.existsSync(filePath)) { - res.status(404).json({ error: 'File not found' }); - return; - } - res.set('Cache-Control', 'public, max-age=86400'); - res.sendFile(filePath); + res.status(404).json({ error: 'File not found' }); return; } case 'immich': { diff --git a/server/src/services/memories/synologyService.ts b/server/src/services/memories/synologyService.ts index 46a82972..c63e7d2f 100644 --- a/server/src/services/memories/synologyService.ts +++ b/server/src/services/memories/synologyService.ts @@ -661,6 +661,6 @@ export async function streamSynologyAsset( if (passphrase) params.append('passphrase', passphrase); const url = _buildSynologyEndpoint(synology_credentials.data.synology_url, params.toString()); - await pipeAsset(url, response) + await pipeAsset(url, response, undefined, undefined, 'public, max-age=86400') }