aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorFactiven <[email protected]>2023-09-25 00:44:40 +0700
committerGitHub <[email protected]>2023-09-25 00:44:40 +0700
commit1a85c2571690ba592ac5183d5eadaf9846fe532b (patch)
tree3f3552c00cd49c0eeab5275275cf5cf5666e5027 /lib
parentDelete .github/workflows/deploy.yml (diff)
downloadmoopa-1a85c2571690ba592ac5183d5eadaf9846fe532b.tar.xz
moopa-1a85c2571690ba592ac5183d5eadaf9846fe532b.zip
Update v4.1.0 (#79)v4.1.0
* Update v4.1.0 * Update pages/_app.js
Diffstat (limited to 'lib')
-rw-r--r--lib/anify/info.js2
-rw-r--r--lib/anify/page.js2
-rw-r--r--lib/anilist/getMedia.js43
-rw-r--r--lib/hooks/watchPageProvider.js41
-rw-r--r--lib/redis.js25
5 files changed, 104 insertions, 9 deletions
diff --git a/lib/anify/info.js b/lib/anify/info.js
index e7d4025..08d64aa 100644
--- a/lib/anify/info.js
+++ b/lib/anify/info.js
@@ -1,5 +1,5 @@
import axios from "axios";
-import redis from "../redis";
+import { redis } from "../redis";
export async function fetchInfo(id, key) {
try {
diff --git a/lib/anify/page.js b/lib/anify/page.js
index b2b1207..65ed309 100644
--- a/lib/anify/page.js
+++ b/lib/anify/page.js
@@ -1,4 +1,4 @@
-import redis from "../redis";
+import { redis } from "../redis";
// Function to fetch new data
async function fetchData(id, providerId, chapterId, key) {
diff --git a/lib/anilist/getMedia.js b/lib/anilist/getMedia.js
index c4628ab..66bb1b0 100644
--- a/lib/anilist/getMedia.js
+++ b/lib/anilist/getMedia.js
@@ -1,9 +1,10 @@
import { useEffect, useState } from "react";
export default function GetMedia(session, stats) {
- const [media, setMedia] = useState([]);
+ const [anime, setAnime] = useState([]);
+ const [manga, setManga] = useState([]);
const [recommendations, setRecommendations] = useState([]);
- const accessToken = session?.user?.token;
+ const accessToken = session?.user?.token || null;
const username = session?.user?.name;
const status = stats || null;
@@ -12,7 +13,7 @@ export default function GetMedia(session, stats) {
method: "POST",
headers: {
"Content-Type": "application/json",
- Authorization: accessToken ? `Bearer ${accessToken}` : undefined,
+ ...(accessToken && { Authorization: `Bearer ${accessToken}` }),
},
body: JSON.stringify({ query, variables }),
});
@@ -42,7 +43,36 @@ export default function GetMedia(session, stats) {
}
}
}
- MediaListCollection(userName: $username, type: ANIME, status: $status, sort: UPDATED_TIME_DESC) {
+ anime: MediaListCollection(userName: $username, type: ANIME, status: $status, sort: UPDATED_TIME_DESC) {
+ lists {
+ status
+ name
+ entries {
+ id
+ mediaId
+ status
+ progress
+ score
+ media {
+ id
+ status
+ nextAiringEpisode {
+ timeUntilAiring
+ episode
+ }
+ title {
+ english
+ romaji
+ }
+ episodes
+ coverImage {
+ large
+ }
+ }
+ }
+ }
+ }
+ manga: MediaListCollection(userName: $username, type: MANGA, status: $status, sort: UPDATED_TIME_DESC) {
lists {
status
name
@@ -79,12 +109,13 @@ export default function GetMedia(session, stats) {
status: status?.stats,
sort: "ID_DESC",
}).then((data) => {
- setMedia(data.data.MediaListCollection.lists);
+ setAnime(data.data.anime?.lists);
+ setManga(data.data.manga?.lists);
setRecommendations(
data.data.Page.recommendations.map((i) => i.mediaRecommendation)
);
});
}, [username, accessToken, status?.stats]);
- return { media, recommendations };
+ return { anime, manga, recommendations };
}
diff --git a/lib/hooks/watchPageProvider.js b/lib/hooks/watchPageProvider.js
new file mode 100644
index 0000000..a9d707b
--- /dev/null
+++ b/lib/hooks/watchPageProvider.js
@@ -0,0 +1,41 @@
+import React, { createContext, useContext, useState } from "react";
+
+export const WatchPageContext = createContext();
+
+export const WatchPageProvider = ({ children }) => {
+ const [theaterMode, setTheaterMode] = useState(false);
+ const [aspectRatio, setAspectRatio] = useState("16/9");
+ const [playerState, setPlayerState] = useState({
+ currentTime: 0,
+ isPlaying: false,
+ });
+ const [autoplay, setAutoPlay] = useState(false);
+ const [marked, setMarked] = useState(0);
+
+ const [userData, setUserData] = useState(null);
+
+ return (
+ <WatchPageContext.Provider
+ value={{
+ theaterMode,
+ setTheaterMode,
+ aspectRatio,
+ setAspectRatio,
+ playerState,
+ setPlayerState,
+ userData,
+ setUserData,
+ autoplay,
+ setAutoPlay,
+ marked,
+ setMarked,
+ }}
+ >
+ {children}
+ </WatchPageContext.Provider>
+ );
+};
+
+export function useWatchProvider() {
+ return useContext(WatchPageContext);
+}
diff --git a/lib/redis.js b/lib/redis.js
index ed8b8c5..713b5d9 100644
--- a/lib/redis.js
+++ b/lib/redis.js
@@ -1,13 +1,36 @@
import { Redis } from "ioredis";
+import { RateLimiterRedis } from "rate-limiter-flexible";
const REDIS_URL = process.env.REDIS_URL;
let redis;
+let rateLimiterRedis;
+let rateLimitStrict;
if (REDIS_URL) {
redis = new Redis(REDIS_URL);
+ redis.on("error", (err) => {
+ console.error("Redis error: ", err);
+ });
+
+ const opt = {
+ storeClient: redis,
+ keyPrefix: "rateLimit",
+ points: 50,
+ duration: 1,
+ };
+
+ const optStrict = {
+ storeClient: redis,
+ keyPrefix: "rateLimitStrict",
+ points: 20,
+ duration: 1,
+ };
+
+ rateLimiterRedis = new RateLimiterRedis(opt);
+ rateLimitStrict = new RateLimiterRedis(optStrict);
} else {
console.warn("REDIS_URL is not defined. Redis caching will be disabled.");
}
-export default redis;
+export { redis, rateLimiterRedis, rateLimitStrict };