From 6ef5bd54d5cdea80adc6972dbcb662908b3e39dd Mon Sep 17 00:00:00 2001 From: real-zephex Date: Sun, 19 May 2024 08:00:13 +0530 Subject: added series support --- src/app/web-series/components/HomePageModules.jsx | 56 +++++++++++++++ src/app/web-series/components/cacher.js | 19 +++++ src/app/web-series/components/data-fetch.js | 87 +++++++++++++++++++++++ src/app/web-series/components/searchBar.jsx | 49 +++++++++++++ src/app/web-series/components/searchResults.jsx | 35 +++++++++ src/app/web-series/components/videoPlayer.jsx | 71 ++++++++++++++++++ 6 files changed, 317 insertions(+) create mode 100644 src/app/web-series/components/HomePageModules.jsx create mode 100644 src/app/web-series/components/cacher.js create mode 100644 src/app/web-series/components/data-fetch.js create mode 100644 src/app/web-series/components/searchBar.jsx create mode 100644 src/app/web-series/components/searchResults.jsx create mode 100644 src/app/web-series/components/videoPlayer.jsx (limited to 'src/app/web-series/components') diff --git a/src/app/web-series/components/HomePageModules.jsx b/src/app/web-series/components/HomePageModules.jsx new file mode 100644 index 0000000..90af2f8 --- /dev/null +++ b/src/app/web-series/components/HomePageModules.jsx @@ -0,0 +1,56 @@ +import { POPULAR_SHOWS, TRENDING_SHOWS, TOP_SHOWS } from "./data-fetch"; +import styles from "../styles/pages.module.css"; +import Image from "next/image"; +import Link from "next/link"; +import PreFecthSeriesInfo from "./cacher"; + +const HomepageUtils = async (type) => { + const fetchFunctions = { + popular: POPULAR_SHOWS, + trending: TRENDING_SHOWS, + top: TOP_SHOWS, + }; + + const fetchData = fetchFunctions[type]; + + if (fetchData) { + return await fetchData(); + } else { + return; + } +}; + +const Pages = async ({ type: type }) => { + const data = await HomepageUtils(type); + PreFecthSeriesInfo(data); + return ( +
+

{type} series

+
+ {data && + data.results.length > 0 && + data.results.map((item, index) => ( + +
+ Series Poster +

{item.name || "Not sure"}

+
+ + ))} +
+
+ ); +}; + +export default Pages; diff --git a/src/app/web-series/components/cacher.js b/src/app/web-series/components/cacher.js new file mode 100644 index 0000000..3e2a197 --- /dev/null +++ b/src/app/web-series/components/cacher.js @@ -0,0 +1,19 @@ +import { SERIES_INFO } from "./data-fetch"; + +const PreFecthSeriesInfo = async (data) => { + try { + const fetchPromises = data.results.map(async (element) => { + await SERIES_INFO(element.id); + }); + + await Promise.all(fetchPromises); + console.log("Series info pre-fetched successfully!"); + } catch (error) { + console.error( + "Error occurred while pre-fetching series info page:", + error + ); + } +}; + +export default PreFecthSeriesInfo; diff --git a/src/app/web-series/components/data-fetch.js b/src/app/web-series/components/data-fetch.js new file mode 100644 index 0000000..e0feca5 --- /dev/null +++ b/src/app/web-series/components/data-fetch.js @@ -0,0 +1,87 @@ +"use server"; + +import { + popular_tv_shows, + trending_tv_shows, + top_rated_shows, + recommended_shows, + crew_details, + tv_info, + search_tv, +} from "../../../../utils/series_urls"; + +export const POPULAR_SHOWS = async () => { + try { + const res = await fetch(popular_tv_shows(), { + next: { + revalidate: 21600, + }, + }); + const data = await res.json(); + return data; + } catch (error) { + throw new Error(error.message); + } +}; + +export const TRENDING_SHOWS = async () => { + try { + const res = await fetch(trending_tv_shows(), { + next: { + revalidate: 21600, + }, + }); + const data = await res.json(); + return data; + } catch (error) { + throw new Error(error.message); + } +}; + +export const TOP_SHOWS = async () => { + try { + const res = await fetch(top_rated_shows(), { + next: { + revalidate: 21600, + }, + }); + const data = await res.json(); + return data; + } catch (error) { + throw new Error(error.message); + } +}; + +export const SERIES_INFO = async (id) => { + try { + const res = await fetch(tv_info(id), { next: { revalidate: 21600 } }); + const data = await res.json(); + return data; + } catch (error) { + throw new Error(error.message); + } +}; + +export const CREW_DETAILS = async (id) => { + try { + const res = await fetch(crew_details(id), { + next: { revalidate: 21600 }, + }); + const data = await res.json(); + return data; + } catch (error) { + throw new Error(error.message); + } +}; + +export const SEARCH_TV = async (title) => { + try { + const res = await fetch(search_tv(title), { + next: { revalidate: 21600 }, + }); + const data = await res.json(); + return data; + } catch (error) { + throw new Error(error.message); + } +}; diff --git a/src/app/web-series/components/searchBar.jsx b/src/app/web-series/components/searchBar.jsx new file mode 100644 index 0000000..81dd25f --- /dev/null +++ b/src/app/web-series/components/searchBar.jsx @@ -0,0 +1,49 @@ +"use client"; +import styles from "../styles/search.module.css"; +import { FaSearch } from "react-icons/fa"; +import { useState } from "react"; + +import { SEARCH_TV } from "./data-fetch"; +import SearchResults from "./searchResults"; + +const SearchBar = () => { + const [title, setTitle] = useState(""); + const [result, setResults] = useState(null); + const [loading, setloading] = useState(false); + + const fetch_results = async (title) => { + setloading(true); + setResults(await SearchResults(await SEARCH_TV(title))); + setloading(false); + }; + + return ( +
+
+ + setTitle(event.target.value)} + onKeyDown={async (e) => { + if ((e.key === "Enter" || e.code === 13) && title) { + await fetch_results(e.target.value); + } + }} + > +
+ + {loading && ( +

+ Please wait while we crunch up all the data +

+ )} +
{result}
+
+ ); +}; + +export default SearchBar; diff --git a/src/app/web-series/components/searchResults.jsx b/src/app/web-series/components/searchResults.jsx new file mode 100644 index 0000000..d1564e0 --- /dev/null +++ b/src/app/web-series/components/searchResults.jsx @@ -0,0 +1,35 @@ +"use server"; + +import Link from "next/link"; +import Image from "next/image"; +import styles from "../styles/search.module.css"; +import PreFecthSeriesInfo from "./cacher"; + +const SearchResults = async (data) => { + PreFecthSeriesInfo(data); + return ( +
+ {data && + data.results.map((item, index) => ( + +
+ Searched Series Poster +

{item.name}

+
+ + ))} +
+ ); +}; + +export default SearchResults; diff --git a/src/app/web-series/components/videoPlayer.jsx b/src/app/web-series/components/videoPlayer.jsx new file mode 100644 index 0000000..0e6b603 --- /dev/null +++ b/src/app/web-series/components/videoPlayer.jsx @@ -0,0 +1,71 @@ +"use client"; + +import { useState } from "react"; +import styles from "../styles/videoPlayer.module.css"; + +const SeriesPlayer = ({ id: id }) => { + const [iframe, iframeContent] = useState(null); + const [episode, setEpisode] = useState(""); + const [season, setSeason] = useState(""); + + async function VideoPlayerInitialize() { + if (!episode || !season) { + alert("Please provide the required episode and season number."); + return; + } + iframeContent(await iframeGenerator(id, season, episode)); + document.getElementById("video-player").style.display = "none"; + } + + return ( +
+
+ { + if (Number(e.target.value) > 0) { + setSeason(e.target.value); + } + }} + > + { + if (Number(e.target.value) > 0) { + setEpisode(e.target.value); + } + }} + > + + +
+ +
+ {iframe} +

+ Please use adblockers to prevent ads and redirects. We have + no control over the amount of ads or the type of ads which + you might encounter. +

+
+
+ ); +}; + +const iframeGenerator = async (id, seasonNumber, episodeNumber) => { + return ( + + ); +}; + +export default SeriesPlayer; -- cgit v1.2.3 From 6e83d0f37cb00785d142f9ddefddeff17535e77b Mon Sep 17 00:00:00 2001 From: real-zephex Date: Sun, 19 May 2024 08:05:01 +0530 Subject: added series support --- src/app/web-series/components/videoPlayer.jsx | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) (limited to 'src/app/web-series/components') diff --git a/src/app/web-series/components/videoPlayer.jsx b/src/app/web-series/components/videoPlayer.jsx index 0e6b603..cc8feb3 100644 --- a/src/app/web-series/components/videoPlayer.jsx +++ b/src/app/web-series/components/videoPlayer.jsx @@ -59,13 +59,8 @@ const SeriesPlayer = ({ id: id }) => { }; const iframeGenerator = async (id, seasonNumber, episodeNumber) => { - return ( - - ); + const url = `https://vidsrc.pro/embed/tv/${id}/${seasonNumber}/${episodeNumber}`; + return ; }; export default SeriesPlayer; -- cgit v1.2.3