aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorreal-zephex <[email protected]>2024-03-15 21:23:45 +0530
committerreal-zephex <[email protected]>2024-03-15 21:23:45 +0530
commitaabc2fa63b70079a62cb6ffb47c1542e6c73286d (patch)
treefe17c37c518ce0e6688f6b9dae3ba1468d49bcda
parentminor fix: changed the website title (diff)
downloaddramalama-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.mjs4
-rw-r--r--package-lock.json87
-rw-r--r--package.json5
-rw-r--r--public/favicon.icobin15406 -> 0 bytes
-rw-r--r--src/app/anime/page.js13
-rw-r--r--src/app/globals.css1
-rw-r--r--src/app/header/header.js2
-rw-r--r--src/app/info/[id]/page.js45
-rw-r--r--src/app/info/buttons.js13
-rw-r--r--src/app/info/info.css67
-rw-r--r--src/app/info/page.js0
-rw-r--r--src/app/recent/page.js40
-rw-r--r--src/app/recent/recent.css67
-rw-r--r--src/app/top-airing/page.js40
-rw-r--r--src/app/top-airing/trending.css0
-rw-r--r--src/app/video/[animeId]/page.js50
-rw-r--r--src/app/video/video.css23
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
deleted file mode 100644
index 4deb565..0000000
--- a/public/favicon.ico
+++ /dev/null
Binary files differ
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