diff --git a/server/server.js b/server/server.js index f28b21b..50e6d3a 100644 --- a/server/server.js +++ b/server/server.js @@ -1576,7 +1576,13 @@ app.get('/api/download/:videoId/prepare', async (c) => { if (ready) { if (!servableTo(ready, hevcOk)) return c.json({ ok: true, state: 'legacy', reason: 'hevc' }, 200, nocache); media.touch(videoId); - return c.json({ ok: true, state: 'ready', gen: ready.gen, size: ready.size, sha256: ready.sha256 || null, + // The row's size can differ from the mp4 on disk (it is not the file the + // device fetches byte-for-byte), so report the file's real length. + const path = await media.filePath(videoId, ready.gen); + let size = 0; + try { size = path ? Bun.file(path).size : 0; } catch { /* vanished */ } + if (!size) return c.json({ ok: true, state: 'legacy', reason: 'cached file unavailable' }, 200, nocache); + return c.json({ ok: true, state: 'ready', gen: ready.gen, size, sha256: ready.sha256 || null, etag: `"${videoId}.${ready.gen}"`, ext: 'mp4' }, 200, nocache); } // A job refused moments ago (too long for the cache, cache offline…) would