mirror of
https://github.com/seerr-team/seerr.git
synced 2026-06-02 13:20:22 -04:00
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: gauthier-th <mail@gauthierth.fr>
78 lines
2.1 KiB
TypeScript
78 lines
2.1 KiB
TypeScript
import ImageProxy from '@server/lib/imageproxy';
|
|
import logger from '@server/logger';
|
|
import { Router } from 'express';
|
|
|
|
const router = Router();
|
|
|
|
// Delay the initialization of ImageProxy instances until the proxy (if any) is properly configured
|
|
let _tmdbImageProxy: ImageProxy;
|
|
function initTmdbImageProxy() {
|
|
if (!_tmdbImageProxy) {
|
|
_tmdbImageProxy = new ImageProxy('tmdb', 'https://image.tmdb.org', {
|
|
rateLimitOptions: {
|
|
maxRequests: 20,
|
|
maxRPS: 50,
|
|
},
|
|
});
|
|
}
|
|
return _tmdbImageProxy;
|
|
}
|
|
let _tvdbImageProxy: ImageProxy;
|
|
function initTvdbImageProxy() {
|
|
if (!_tvdbImageProxy) {
|
|
_tvdbImageProxy = new ImageProxy('tvdb', 'https://artworks.thetvdb.com', {
|
|
rateLimitOptions: {
|
|
maxRequests: 20,
|
|
maxRPS: 50,
|
|
},
|
|
});
|
|
}
|
|
return _tvdbImageProxy;
|
|
}
|
|
|
|
router.get<{
|
|
type: string;
|
|
path: string[];
|
|
}>('/:type/*path', async (req, res) => {
|
|
const imagePath = '/' + req.params.path.join('/');
|
|
|
|
if (imagePath.startsWith('//') || imagePath.includes('://')) {
|
|
logger.error('Invalid URL for image proxy', { imagePath });
|
|
return res.status(403).send('Invalid URL for image proxy');
|
|
}
|
|
|
|
try {
|
|
let imageData;
|
|
if (req.params.type === 'tmdb') {
|
|
imageData = await initTmdbImageProxy().getImage(imagePath);
|
|
} else if (req.params.type === 'tvdb') {
|
|
imageData = await initTvdbImageProxy().getImage(imagePath);
|
|
} else {
|
|
logger.error('Unsupported image type', {
|
|
imagePath,
|
|
type: req.params.type,
|
|
});
|
|
res.status(400).send('Unsupported image type');
|
|
return;
|
|
}
|
|
|
|
res.writeHead(200, {
|
|
'Content-Type': `image/${imageData.meta.extension}`,
|
|
'Content-Length': imageData.imageBuffer.length,
|
|
'Cache-Control': `public, max-age=${imageData.meta.curRevalidate}`,
|
|
'OS-Cache-Key': imageData.meta.cacheKey,
|
|
'OS-Cache-Status': imageData.meta.cacheMiss ? 'MISS' : 'HIT',
|
|
});
|
|
|
|
res.end(imageData.imageBuffer);
|
|
} catch (e) {
|
|
logger.error('Failed to proxy image', {
|
|
imagePath,
|
|
errorMessage: e.message,
|
|
});
|
|
res.status(500).send();
|
|
}
|
|
});
|
|
|
|
export default router;
|