feat: proxy videos and add more descriptive error messages

This commit is contained in:
httpjamesm 2022-10-31 17:45:14 -04:00
parent dba2ba5aa4
commit 1983f6b1fb
2 changed files with 32 additions and 10 deletions

View File

@ -37,7 +37,7 @@ const Media = ({ className, media, router }: Props) => {
<source <source
key={source.url} key={source.url}
type={source.mimeType} type={source.mimeType}
src={source.url} src={getProxiedIMDbImgUrl(source.url)}
data-res={source.resolution} data-res={source.resolution}
/> />
))} ))}

View File

@ -3,7 +3,7 @@ import fetch from 'node-fetch'
import redis from '../../utils/redis' import redis from '../../utils/redis'
import crypto from 'crypto' import crypto from 'crypto'
const acceptableExtensions = ['.jpg', '.png', '.gif', '.webp'] const acceptableExtensions = ['.jpg', '.png', '.gif', '.webp', '.mp4']
export default async function handler( export default async function handler(
req: NextApiRequest, req: NextApiRequest,
@ -14,7 +14,10 @@ export default async function handler(
if (!mediaUrl) { if (!mediaUrl) {
res.status(400) res.status(400)
res.end() res.json({
success: false,
message: 'Missing query',
})
return return
} }
@ -24,22 +27,34 @@ export default async function handler(
mediaUrlParsed = new URL(mediaUrl) mediaUrlParsed = new URL(mediaUrl)
} catch { } catch {
res.status(400) res.status(400)
res.end() res.json({
success: false,
message: 'Invalid URL',
})
return return
} }
// get media domain // get media domain
const mediaDomain = mediaUrlParsed.hostname const mediaDomain = mediaUrlParsed.hostname
if (!mediaDomain.endsWith('media-amazon.com')) { if (
!mediaDomain.endsWith('media-amazon.com') &&
mediaDomain !== 'imdb-video.media-imdb.com'
) {
res.status(400) res.status(400)
res.end() res.json({
success: false,
message: 'Unauthorized domain',
})
return return
} }
if (mediaUrlParsed.protocol !== 'https:') { if (mediaUrlParsed.protocol !== 'https:') {
res.status(400) res.status(400)
res.end() res.json({
success: false,
message: 'Unauthorized protocol',
})
return return
} }
@ -54,12 +69,15 @@ export default async function handler(
if (!validExtension) { if (!validExtension) {
res.status(400) res.status(400)
res.end() res.json({
success: false,
message: 'Unauthorized extension',
})
return return
} }
// hash mediaUrl with blake3 // hash mediaUrl with blake3
const mediaUrlHash = await crypto const mediaUrlHash = crypto
.createHash('sha256') .createHash('sha256')
.update(mediaUrl) .update(mediaUrl)
.digest('base64') .digest('base64')
@ -70,6 +88,7 @@ export default async function handler(
const cachedMedia = await redis.get(cacheKey) const cachedMedia = await redis.get(cacheKey)
if (cachedMedia) { if (cachedMedia) {
res.status(302)
res.send(cachedMedia) res.send(cachedMedia)
return return
} }
@ -79,7 +98,10 @@ export default async function handler(
if (!mediaRes.ok) { if (!mediaRes.ok) {
res.status(mediaRes.status) res.status(mediaRes.status)
res.end() res.json({
success: false,
message: 'Error from Amazon',
})
return return
} }