diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/anify/info.js | 2 | ||||
| -rw-r--r-- | lib/anify/page.js | 2 | ||||
| -rw-r--r-- | lib/anilist/getMedia.js | 43 | ||||
| -rw-r--r-- | lib/hooks/watchPageProvider.js | 41 | ||||
| -rw-r--r-- | lib/redis.js | 25 |
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 }; |