fix: resolve 4 media embed bugs from testing
1. Video aspect ratio: remove container border/overflow-hidden, use preload="metadata" so browser knows dimensions before play 2. YouTube Error 153: remove sandbox attr (too restrictive), add full allow permissions (encrypted-media, accelerometer, gyroscope, etc.) 3. Google Images not displaying: detect image Content-Type from HTTP response in metadataFetcher, override classifier to create image embed for URLs that serve image/* content 4. Audio seeking broken: add HTTP Range request support in uploads route (Accept-Ranges, Content-Range, 206 Partial Content)
This commit is contained in:
@@ -134,6 +134,28 @@ export async function uploadRoutes(app: FastifyInstance): Promise<void> {
|
||||
reply.header('Content-Disposition', `attachment; filename="${encodeURIComponent(originalName)}"`);
|
||||
}
|
||||
|
||||
// Support Range requests for audio/video seeking
|
||||
const stat = fs.statSync(filepath);
|
||||
const fileSize = stat.size;
|
||||
const rangeHeader = request.headers.range;
|
||||
|
||||
if (rangeHeader) {
|
||||
const parts = rangeHeader.replace(/bytes=/, '').split('-');
|
||||
const start = parseInt(parts[0] ?? '0', 10);
|
||||
const end = parts[1] ? parseInt(parts[1], 10) : fileSize - 1;
|
||||
const chunkSize = end - start + 1;
|
||||
|
||||
reply.header('Content-Range', `bytes ${start}-${end}/${fileSize}`);
|
||||
reply.header('Accept-Ranges', 'bytes');
|
||||
reply.header('Content-Length', chunkSize);
|
||||
reply.code(206);
|
||||
|
||||
const stream = fs.createReadStream(filepath, { start, end });
|
||||
return reply.send(stream);
|
||||
}
|
||||
|
||||
reply.header('Accept-Ranges', 'bytes');
|
||||
reply.header('Content-Length', fileSize);
|
||||
const stream = fs.createReadStream(filepath);
|
||||
return reply.send(stream);
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user