feat: proxy videos and add more descriptive error messages
This commit is contained in:
parent
dba2ba5aa4
commit
1983f6b1fb
@ -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}
|
||||||
/>
|
/>
|
||||||
))}
|
))}
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user