diff options
| author | real-zephex <[email protected]> | 2024-03-15 21:23:45 +0530 |
|---|---|---|
| committer | real-zephex <[email protected]> | 2024-03-15 21:23:45 +0530 |
| commit | aabc2fa63b70079a62cb6ffb47c1542e6c73286d (patch) | |
| tree | fe17c37c518ce0e6688f6b9dae3ba1468d49bcda | |
| parent | minor fix: changed the website title (diff) | |
| download | dramalama-aabc2fa63b70079a62cb6ffb47c1542e6c73286d.tar.xz dramalama-aabc2fa63b70079a62cb6ffb47c1542e6c73286d.zip | |
features: added anime and pretty much completed it. only search functionality is left to add
| -rw-r--r-- | next.config.mjs | 4 | ||||
| -rw-r--r-- | package-lock.json | 87 | ||||
| -rw-r--r-- | package.json | 5 | ||||
| -rw-r--r-- | public/favicon.ico | bin | 15406 -> 0 bytes | |||
| -rw-r--r-- | src/app/anime/page.js | 13 | ||||
| -rw-r--r-- | src/app/globals.css | 1 | ||||
| -rw-r--r-- | src/app/header/header.js | 2 | ||||
| -rw-r--r-- | src/app/info/[id]/page.js | 45 | ||||
| -rw-r--r-- | src/app/info/buttons.js | 13 | ||||
| -rw-r--r-- | src/app/info/info.css | 67 | ||||
| -rw-r--r-- | src/app/info/page.js | 0 | ||||
| -rw-r--r-- | src/app/recent/page.js | 40 | ||||
| -rw-r--r-- | src/app/recent/recent.css | 67 | ||||
| -rw-r--r-- | src/app/top-airing/page.js | 40 | ||||
| -rw-r--r-- | src/app/top-airing/trending.css | 0 | ||||
| -rw-r--r-- | src/app/video/[animeId]/page.js | 50 | ||||
| -rw-r--r-- | src/app/video/video.css | 23 |
17 files changed, 445 insertions, 12 deletions
diff --git a/next.config.mjs b/next.config.mjs index 165b481..06d109f 100644 --- a/next.config.mjs +++ b/next.config.mjs @@ -10,6 +10,10 @@ const nextConfig = { { protocol: "https", hostname: "www.pngall.com" + }, + { + protocol: "https", + hostname: "gogocdn.net" } ], }, diff --git a/package-lock.json b/package-lock.json index 80d7099..c048d03 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,9 +11,12 @@ "next": "14.1.3", "react": "^18", "react-dom": "^18", - "react-player": "^2.15.1" + "react-player": "^2.15.1", + "react-router-dom": "^6.22.3" }, "devDependencies": { + "@types/node": "20.11.28", + "@types/react": "18.2.66", "eslint": "^8", "eslint-config-next": "14.1.3" } @@ -366,6 +369,14 @@ "node": ">=14" } }, + "node_modules/@remix-run/router": { + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.15.3.tgz", + "integrity": "sha512-Oy8rmScVrVxWZVOpEF57ovlnhpZ8CCPlnIIumVcV9nFdiSIrus99+Lw78ekXyGvVDlIsFJbSfmSovJUhCWYV3w==", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/@rushstack/eslint-patch": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.7.2.tgz", @@ -386,6 +397,38 @@ "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true }, + "node_modules/@types/node": { + "version": "20.11.28", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.28.tgz", + "integrity": "sha512-M/GPWVS2wLkSkNHVeLkrF2fD5Lx5UC4PxA0uZcKc6QqbIQUJyW1jVjueJYi1z8n0I5PxYrtpnPnWglE+y9A0KA==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/prop-types": { + "version": "15.7.11", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz", + "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==", + "dev": true + }, + "node_modules/@types/react": { + "version": "18.2.66", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.66.tgz", + "integrity": "sha512-OYTmMI4UigXeFMF/j4uv0lBBEbongSgptPrHBxqME44h9+yNov+oL6Z3ocJKo0WyXR84sQUNeyIp9MRfckvZpg==", + "dev": true, + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/scheduler": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz", + "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==", + "dev": true + }, "node_modules/@typescript-eslint/parser": { "version": "6.21.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", @@ -972,6 +1015,12 @@ "node": ">= 8" } }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "dev": true + }, "node_modules/damerau-levenshtein": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", @@ -3234,6 +3283,36 @@ "react": ">=16.6.0" } }, + "node_modules/react-router": { + "version": "6.22.3", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.22.3.tgz", + "integrity": "sha512-dr2eb3Mj5zK2YISHK++foM9w4eBnO23eKnZEDs7c880P6oKbrjz/Svg9+nxqtHQK+oMW4OtjZca0RqPglXxguQ==", + "dependencies": { + "@remix-run/router": "1.15.3" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-router-dom": { + "version": "6.22.3", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.22.3.tgz", + "integrity": "sha512-7ZILI7HjcE+p31oQvwbokjk6OA/bnFxrhJ19n82Ex9Ph8fNAq+Hm/7KchpMGlTgWhUxRHMMCut+vEtNpWpowKw==", + "dependencies": { + "@remix-run/router": "1.15.3", + "react-router": "6.22.3" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, "node_modules/reflect.getprototypeof": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.5.tgz", @@ -3964,6 +4043,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", diff --git a/package.json b/package.json index bdbe4e2..ad82686 100644 --- a/package.json +++ b/package.json @@ -12,9 +12,12 @@ "next": "14.1.3", "react": "^18", "react-dom": "^18", - "react-player": "^2.15.1" + "react-player": "^2.15.1", + "react-router-dom": "^6.22.3" }, "devDependencies": { + "@types/node": "20.11.28", + "@types/react": "18.2.66", "eslint": "^8", "eslint-config-next": "14.1.3" } diff --git a/public/favicon.ico b/public/favicon.ico Binary files differdeleted file mode 100644 index 4deb565..0000000 --- a/public/favicon.ico +++ /dev/null diff --git a/src/app/anime/page.js b/src/app/anime/page.js index df6b647..964bba5 100644 --- a/src/app/anime/page.js +++ b/src/app/anime/page.js @@ -1,17 +1,12 @@ import './anime.css' -import Image from 'next/image' +import Trending from '../top-airing/page' +import Releases from '../recent/page' export default async function Anime() { return ( <div> - <div className='underDev'> - <Image - src="/WIP.png" - width={"250"} - height={"250"} - > - </Image> - </div> + <Trending /> + <Releases /> </div> ) }
\ No newline at end of file diff --git a/src/app/globals.css b/src/app/globals.css index e327d9a..42eb9ad 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -1,4 +1,5 @@ @import url('https://fonts.googleapis.com/css2?family=Atkinson+Hyperlegible:wght@400;700&family=Kanit:wght@400;700&family=Quicksand:wght@400;500;600;700&display=swap'); +@import url('https://fonts.googleapis.com/css2?family=Lato:ital,wght@0,100;0,300;0,400;0,700;0,900;1,100;1,300;1,400;1,700;1,900&family=Open+Sans&display=swap'); :root { diff --git a/src/app/header/header.js b/src/app/header/header.js index b1ae7bd..03d1328 100644 --- a/src/app/header/header.js +++ b/src/app/header/header.js @@ -5,7 +5,7 @@ export default function Header() { <div className="headMain"> <div className="headNav"> <Link href="/" style={{color: "black", textDecoration: "none"}}> - <p style={{fontSize: "32px", color: "var(--pastel-red)"}}>Dramalama</p> + <p style={{fontSize: "30px", color: "var(--pastel-red)"}}>Dramalama</p> </Link> <div className="rightNav"> <Link href="/kdrama"> diff --git a/src/app/info/[id]/page.js b/src/app/info/[id]/page.js new file mode 100644 index 0000000..43b11ac --- /dev/null +++ b/src/app/info/[id]/page.js @@ -0,0 +1,45 @@ +import "../info.css" +import Image from "next/image"; +import CreateButton from "../buttons"; + +export default async function AnimeInfo({params}) { + let animeID = params.id; + + const info = await getAnimeInfo(animeID); + + return ( + <div className="dramaInfoContainer"> + <div className="dramaInfo"> + {info && ( + <div> + <div className="titleContainer"> + <p>{info.title}</p> + <Image + src={info.image} + width={140} + height={190} + alt="Drama" + /> + </div> + <p className="dramaDescription"> + {info.description} + </p> + </div> + )} + + <div className="buttonContainer"> + {info && info.episodes.map((item, index) => ( + <CreateButton key={index} a={item} /> + ))} + </div> + + </div> + </div> + ) +} + +async function getAnimeInfo(anime_id) { + const res = await fetch("https://anime-sensei-api.vercel.app/anime/gogoanime/info/" + anime_id); + const data = res.json(); + return data; +}
\ No newline at end of file diff --git a/src/app/info/buttons.js b/src/app/info/buttons.js new file mode 100644 index 0000000..8f041a8 --- /dev/null +++ b/src/app/info/buttons.js @@ -0,0 +1,13 @@ +"use client" + +import Link from "next/link"; +export default function CreateButton({ a }) { + + return ( + <Link href={`/video/${a.id}`}> + <button className="dramaButton"> + {a.number} + </button> + </Link> + ); +}
\ No newline at end of file diff --git a/src/app/info/info.css b/src/app/info/info.css new file mode 100644 index 0000000..6d6b9b2 --- /dev/null +++ b/src/app/info/info.css @@ -0,0 +1,67 @@ +.dramaInfoContainer { + display: flex; + flex-direction: column; +} + +.dramaInfo { + display: flex; + flex-direction: column; + width: 95%; + margin: 0px auto; +} + +.titleContainer { + display: flex; + justify-content: space-between; + align-items: center; +} + +.titleContainer p { + color: var(--neon-green ); + width: 60%; + font-family: "Kanit"; + font-size: 24px; +} + +.titleContainer img { + border-radius: 10px; +} + +.dramaDescription { + color: #ffffff81; + font-family: "Lato"; + font-size: 16px; + max-height: 120px; + margin: 20px auto; + text-align: center; + overflow-y: auto; +} + +.buttonContainer { + margin: 5px auto; + text-align: center; + max-height: 200px; + overflow-y: auto; +} + +.dramaButton { + padding: 8px; + font-family: "Atkinson Hyperlegible"; + font-size: 18px; + margin: 5px; + width: 50px; + border-radius: 5px; + border: none; + background-color: var(--light-green); + cursor: pointer; +} + +.dramaButton:hover { + background-color: var(--soft-purple); +} + +@media (prefers-color-scheme: light) { + .dramaDescription { + color: black; + } +}
\ No newline at end of file diff --git a/src/app/info/page.js b/src/app/info/page.js new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/src/app/info/page.js diff --git a/src/app/recent/page.js b/src/app/recent/page.js new file mode 100644 index 0000000..f879e58 --- /dev/null +++ b/src/app/recent/page.js @@ -0,0 +1,40 @@ +import "./recent.css"; +import Image from "next/image"; +import Link from "next/link"; + +export default async function Releases() { + + const data = await test(); + + return ( + <div className="trendingContainer"> + <p className="trendingText"> + Recent Releases + </p> + + <div className="trending"> + {data && data.results.map((item, index) => ( + <Link href={`/info/${item.id}`} style={{textDecoration: "none"}}> + <div key={index} className="trendingEntries"> + <Image + src={item.image} + className="{trendingImage}" + width={160} + height={220} + alt="Drama" + /> + <p> + {item.title} + </p> + </div> + </Link> + ))} + </div> + </div> + )} + +async function test() { + const res = await fetch("https://dramalama-api.vercel.app/anime/gogoanime/recent-episodes"); + const data = res.json(); + return data; +}
\ No newline at end of file diff --git a/src/app/recent/recent.css b/src/app/recent/recent.css new file mode 100644 index 0000000..3fc5e26 --- /dev/null +++ b/src/app/recent/recent.css @@ -0,0 +1,67 @@ + +.trendingContainer { + display: flex; + flex-direction: column; +} + +.trendingText { + color: white; + font-family: "Open Sans"; + font-size: 30px; + margin: 10px; + /* margin-bottom: 10px; */ +} + +.trending { + width: 98%; + display: flex; + flex-direction: row; + overflow-x: auto; + margin: 0px auto; +} + +/* Customize scrollbar here */ +.trending::-webkit-scrollbar { + height: 5px; +} + +.trendingEntries { + margin: 10px 10px 5px 5px; + text-align: center; + cursor: pointer; + transition: transform 0.2s ease; + +} +.trendingEntries:hover { + transform: scale(1.03); +} + +.trendingEntries img { + border-radius: 10px; + width: 160px; + height: 220px; +} + +.trendingEntries p { + color: white; + max-height: 60px; + max-width: 150px; + overflow-y: auto; + font-family: "Lato"; + margin: 10px auto; + font-size: 18px; +} + +.trendingEntries p::-webkit-scrollbar{ + width: 5px; +} + +@media (prefers-color-scheme: light) { + .trendingText { + color: black; + } + + .trendingEntries p { + color: black; + } +}
\ No newline at end of file diff --git a/src/app/top-airing/page.js b/src/app/top-airing/page.js new file mode 100644 index 0000000..4b660fc --- /dev/null +++ b/src/app/top-airing/page.js @@ -0,0 +1,40 @@ +import "./trending.css"; +import Image from "next/image"; +import Link from "next/link"; + +export default async function Trending() { + + const data = await test(); + + return ( + <div className="trendingContainer"> + <p className="trendingText"> + Trending + </p> + + <div className="trending"> + {data && data.results.map((item, index) => ( + <Link href={`/info/${item.id}`} style={{textDecoration: "none"}}> + <div key={index} className="trendingEntries"> + <Image + src={item.image} + className="{trendingImage}" + width={160} + height={220} + alt="Drama" + /> + <p> + {item.title} + </p> + </div> + </Link> + ))} + </div> + </div> + )} + +async function test() { + const res = await fetch("https://dramalama-api.vercel.app/anime/gogoanime/top-airing"); + const data = res.json(); + return data; +}
\ No newline at end of file diff --git a/src/app/top-airing/trending.css b/src/app/top-airing/trending.css new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/src/app/top-airing/trending.css diff --git a/src/app/video/[animeId]/page.js b/src/app/video/[animeId]/page.js new file mode 100644 index 0000000..b013269 --- /dev/null +++ b/src/app/video/[animeId]/page.js @@ -0,0 +1,50 @@ +"use client" + +import '../video.css' +import React, { useState, useEffect } from 'react'; +import ReactPlayer from 'react-player'; + +export default function Video({ params }) { + const id = params.animeId; + const [videoLink, setVideoLink] = useState(null); + const [loading, setLoading] = useState(true); + const [epi, setEpi] = useState(""); + + + useEffect(() => { + fetch("https://anime-sensei-api.vercel.app/anime/gogoanime/watch/" + id) + .then(res => res.json()) + .then(data => { + const words = id.split("-") + const last_two = words.slice(-2).join(" "); + const remainingWords = words.slice(0, -2).join(" "); + setEpi([last_two, remainingWords]) + setVideoLink(data.sources[3].url); + setLoading(false); + }) + .catch(error => { + console.log("Some error occured", error); + setLoading(false); + }); + }, [id]); + + return ( + <div> + {loading && ( + <p style={{color: "white", fontFamily: "Lato", fontSize: "20px", textAlign: "center"}}>Loading...</p> + )} + {videoLink && ( + <div className='video2'> + <p>{epi[0]} - {epi[1]}</p> + <ReactPlayer + url={videoLink} + controls + autoplay + width={400} + height={"auto"} + /> + </div> + )} + </div> + ); +} diff --git a/src/app/video/video.css b/src/app/video/video.css new file mode 100644 index 0000000..7cd537d --- /dev/null +++ b/src/app/video/video.css @@ -0,0 +1,23 @@ +.video2 { + display: flex; + flex-direction: column; + align-items: center; + margin: 0px auto; +} + +.video2 video { + border-radius: 10px; +} + +.video2 p { + color: white; + font-family: "Lato"; + font-size: 20px; + text-align: center; +} + +@media (prefers-color-scheme: light) { + .video2 p { + color: black; + } +}
\ No newline at end of file |