* fix: rewrite avatarproxy and CachedImage Avatar proxy was allowing every request to be proxied, no matter the original ressource's origin or filetype. This PR fixes it be allowing only relevant resources to be cached, i.e. Jellyfin/Emby images and TMDB images. fix #1012, #1013 * fix: resolve CodeQL error * fix: resolve CodeQL error * fix: resolve review comments * fix: resolve review comment * fix: resolve CodeQL error * fix: update imageproxy path
52 lines
1.5 KiB
TypeScript
52 lines
1.5 KiB
TypeScript
import { MediaServerType } from '@server/constants/server';
|
|
import ImageProxy from '@server/lib/imageproxy';
|
|
import { getSettings } from '@server/lib/settings';
|
|
import logger from '@server/logger';
|
|
import { getHostname } from '@server/utils/getHostname';
|
|
import { Router } from 'express';
|
|
|
|
const router = Router();
|
|
|
|
const avatarImageProxy = new ImageProxy('avatar', '');
|
|
// Proxy avatar images
|
|
router.get('/*', async (req, res) => {
|
|
let imagePath = '';
|
|
try {
|
|
const jellyfinAvatar = req.url.match(
|
|
/(\/Users\/\w+\/Images\/Primary\/?\?tag=\w+&quality=90)$/
|
|
)?.[1];
|
|
if (!jellyfinAvatar) {
|
|
const mediaServerType = getSettings().main.mediaServerType;
|
|
throw new Error(
|
|
`Provided URL is not ${
|
|
mediaServerType === MediaServerType.JELLYFIN
|
|
? 'a Jellyfin'
|
|
: 'an Emby'
|
|
} avatar.`
|
|
);
|
|
}
|
|
|
|
const imageUrl = new URL(jellyfinAvatar, getHostname());
|
|
imagePath = imageUrl.toString();
|
|
|
|
const imageData = await avatarImageProxy.getImage(imagePath);
|
|
|
|
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 avatar image', {
|
|
imagePath,
|
|
errorMessage: e.message,
|
|
});
|
|
}
|
|
});
|
|
|
|
export default router;
|