fix(redis): fix logs being polluted when redis is disabled
also used streaming when redis is disabled for faster response.
This commit is contained in:
@ -1,59 +1,71 @@
|
||||
import { NextApiRequest, NextApiResponse } from 'next'
|
||||
import redis from '../../utils/redis'
|
||||
import axiosInstance from '../../utils/axiosInstance'
|
||||
import { AxiosResponse } from 'axios'
|
||||
import { NextApiRequest, NextApiResponse } from 'next';
|
||||
import redis from '../../utils/redis';
|
||||
import axiosInstance from '../../utils/axiosInstance';
|
||||
|
||||
const regex =
|
||||
/^https:\/\/((m\.)?media-amazon\.com|imdb-video\.media-imdb\.com).*\.(jpg|jpeg|png|mp4|gif|webp).*$/
|
||||
/^https:\/\/((m\.)?media-amazon\.com|imdb-video\.media-imdb\.com).*\.(jpg|jpeg|png|mp4|gif|webp).*$/;
|
||||
|
||||
export default async function handler(
|
||||
req: NextApiRequest,
|
||||
res: NextApiResponse
|
||||
) {
|
||||
const mediaUrl = req.query.url as string | undefined
|
||||
try {
|
||||
const mediaUrl = req.query.url as string | undefined;
|
||||
|
||||
if (!mediaUrl || !regex.test(mediaUrl))
|
||||
return res.status(400).json({
|
||||
success: false,
|
||||
message: 'Invalid query',
|
||||
})
|
||||
// 1. returning if query is illegal
|
||||
if (!mediaUrl || !regex.test(mediaUrl))
|
||||
return res.status(400).json({
|
||||
success: false,
|
||||
message: 'Invalid query',
|
||||
});
|
||||
|
||||
if (process.env.USE_REDIS === 'true') {
|
||||
const cachedMedia = await redis.getBuffer(mediaUrl)
|
||||
// 2. sending streamed response if redis isn't enabled
|
||||
if (redis === null) {
|
||||
const mediaRes = await axiosInstance.get(mediaUrl, {
|
||||
responseType: 'stream',
|
||||
});
|
||||
|
||||
res.setHeader('Content-Type', mediaRes.headers['content-type']);
|
||||
mediaRes.data.pipe(res);
|
||||
return;
|
||||
}
|
||||
|
||||
// 3. else if resourced is cached, sending it
|
||||
const cachedMedia = await redis!.getBuffer(mediaUrl);
|
||||
|
||||
if (cachedMedia) {
|
||||
res.setHeader('x-cached', 'true')
|
||||
res.status(302).send(cachedMedia)
|
||||
return
|
||||
res.setHeader('x-cached', 'true');
|
||||
res.status(302).send(cachedMedia);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
let mediaRes: AxiosResponse
|
||||
try {
|
||||
mediaRes = await axiosInstance(mediaUrl, { responseType: 'arraybuffer' })
|
||||
// 4. else getting, caching and sending response
|
||||
const mediaRes = await axiosInstance(mediaUrl, {
|
||||
responseType: 'arraybuffer',
|
||||
});
|
||||
|
||||
const data = mediaRes.data;
|
||||
|
||||
// saving in redis for 30 minutes
|
||||
await redis!.setex(mediaUrl, 30 * 60, Buffer.from(data));
|
||||
|
||||
// sending media
|
||||
res.setHeader('x-cached', 'false');
|
||||
res.send(data);
|
||||
|
||||
// sending token response on any error
|
||||
} catch {
|
||||
res.status(404)
|
||||
res.status(404);
|
||||
res.json({
|
||||
success: false,
|
||||
message: 'Error from IMDb',
|
||||
})
|
||||
return
|
||||
message: 'something went wrong',
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
const data = mediaRes.data
|
||||
|
||||
if (process.env.USE_REDIS === 'true') {
|
||||
// save in redis for 30 minutes
|
||||
await redis.setex(mediaUrl, 30 * 60, Buffer.from(data))
|
||||
}
|
||||
|
||||
// send media
|
||||
res.setHeader('x-cached', 'false')
|
||||
res.send(data)
|
||||
}
|
||||
|
||||
export const config = {
|
||||
api: {
|
||||
responseLimit: false,
|
||||
},
|
||||
}
|
||||
};
|
||||
|
Reference in New Issue
Block a user