From dba2ba5aa4c04b0cb177ce058257a3a5338e7a21 Mon Sep 17 00:00:00 2001 From: httpjamesm Date: Mon, 31 Oct 2022 17:37:36 -0400 Subject: [PATCH] feat: fetch images from media proxy on frontend --- src/components/title/Basic.tsx | 50 ++++++++++++++++------------- src/components/title/Media.tsx | 50 +++++++++++++++-------------- src/pages/api/media_proxy.ts | 11 ++++--- src/pages/title/[titleId]/index.tsx | 7 +++- src/utils/helpers.ts | 4 +++ 5 files changed, 70 insertions(+), 52 deletions(-) diff --git a/src/components/title/Basic.tsx b/src/components/title/Basic.tsx index acc990e..9627e6d 100644 --- a/src/components/title/Basic.tsx +++ b/src/components/title/Basic.tsx @@ -1,22 +1,27 @@ -import { Fragment } from 'react'; -import Image from 'next/future/image'; -import Link from 'next/link'; +import { Fragment } from 'react' +import Image from 'next/future/image' +import Link from 'next/link' -import { formatNumber, formatTime, modifyIMDbImg } from '../../utils/helpers'; -import { Basic } from '../../interfaces/shared/title'; -import styles from '../../styles/modules/components/title/basic.module.scss'; +import { + formatNumber, + formatTime, + getProxiedIMDbImgUrl, + modifyIMDbImg, +} from '../../utils/helpers' +import { Basic } from '../../interfaces/shared/title' +import styles from '../../styles/modules/components/title/basic.module.scss' type Props = { - className: string; - data: Basic; -}; + className: string + data: Basic +} const Basic = ({ data, className }: Props) => { - const titleType = data.type.id; + const titleType = data.type.id const releaseTime = titleType === 'tvSeries' ? `${data.releaseYear?.start}-${data.releaseYear?.end || 'present'}` - : data.releaseYear?.start; + : data.releaseYear?.start return (
{ className={styles.imageContainer} style={{ backgroundImage: - data.poster && `url(${modifyIMDbImg(data.poster.url, 300)})`, + data.poster && + `url(${getProxiedIMDbImgUrl(modifyIMDbImg(data.poster.url, 300))})`, }} > {data.poster ? ( @@ -39,11 +45,11 @@ const Basic = ({ data, className }: Props) => { alt={data.poster.caption} priority fill - sizes='300px' + sizes="300px" /> ) : ( - + )} @@ -51,7 +57,7 @@ const Basic = ({ data, className }: Props) => {

{data.title}

-
- ); -}; + ) +} -export default Basic; +export default Basic diff --git a/src/components/title/Media.tsx b/src/components/title/Media.tsx index 583aa17..5ef8ade 100644 --- a/src/components/title/Media.tsx +++ b/src/components/title/Media.tsx @@ -1,37 +1,39 @@ -import Image from 'next/future/image'; -import Link from 'next/link'; -import { NextRouter } from 'next/router'; -import { Media } from '../../interfaces/shared/title'; -import { modifyIMDbImg } from '../../utils/helpers'; +import Image from 'next/future/image' +import Link from 'next/link' +import { NextRouter } from 'next/router' +import { Media } from '../../interfaces/shared/title' +import { getProxiedIMDbImgUrl, modifyIMDbImg } from '../../utils/helpers' -import styles from '../../styles/modules/components/title/media.module.scss'; +import styles from '../../styles/modules/components/title/media.module.scss' type Props = { - className: string; - media: Media; - router: NextRouter; -}; + className: string + media: Media + router: NextRouter +} const Media = ({ className, media, router }: Props) => { return (
{(media.trailer || !!media.videos.total) && (
-

Videos

+

Videos

{media.trailer && (
- ); -}; -export default Media; + ) +} +export default Media diff --git a/src/pages/api/media_proxy.ts b/src/pages/api/media_proxy.ts index 78a75c1..1ec226f 100644 --- a/src/pages/api/media_proxy.ts +++ b/src/pages/api/media_proxy.ts @@ -14,7 +14,7 @@ export default async function handler( if (!mediaUrl) { res.status(400) - res.send(null) + res.end() return } @@ -24,7 +24,7 @@ export default async function handler( mediaUrlParsed = new URL(mediaUrl) } catch { res.status(400) - res.send(null) + res.end() return } @@ -33,13 +33,13 @@ export default async function handler( if (!mediaDomain.endsWith('media-amazon.com')) { res.status(400) - res.send(null) + res.end() return } if (mediaUrlParsed.protocol !== 'https:') { res.status(400) - res.send(null) + res.end() return } @@ -54,7 +54,7 @@ export default async function handler( if (!validExtension) { res.status(400) - res.send(null) + res.end() return } @@ -79,6 +79,7 @@ export default async function handler( if (!mediaRes.ok) { res.status(mediaRes.status) + res.end() return } diff --git a/src/pages/title/[titleId]/index.tsx b/src/pages/title/[titleId]/index.tsx index 1cfef82..efef1f9 100644 --- a/src/pages/title/[titleId]/index.tsx +++ b/src/pages/title/[titleId]/index.tsx @@ -20,6 +20,7 @@ import { AppError } from '../../../interfaces/shared/error' // styles import styles from '../../../styles/modules/pages/title/title.module.scss' import Head from 'next/head' +import { getProxiedIMDbImgUrl } from '../../../utils/helpers' type Props = { data: Title; error: null } | { error: AppError; data: null } @@ -50,7 +51,11 @@ const TitleInfo = ({ data, error }: Props) => { diff --git a/src/utils/helpers.ts b/src/utils/helpers.ts index 5bcea0f..a4c1acd 100644 --- a/src/utils/helpers.ts +++ b/src/utils/helpers.ts @@ -53,6 +53,10 @@ export const modifyIMDbImg = (url: string, widthInPx = 600) => { return url.replaceAll('.jpg', `UX${widthInPx}.jpg`); }; +export const getProxiedIMDbImgUrl = (url: string) => { + return `/api/media_proxy?url=${encodeURIComponent(url)}`; +} + export const AppError = class extends Error { constructor(message: string, public statusCode: number, cause?: any) { super(message, cause);