From 2d44ab8f73d68323e06f62ed4d03d05d426e2c89 Mon Sep 17 00:00:00 2001 From: root Date: Sun, 9 Mar 2025 23:23:21 -0500 Subject: [PATCH] Created a /discover endpoint, should decrease latency for sites that need to discover as caching is used --- .env.example | 3 ++- nitro.config.ts | 3 ++- package-lock.json | 23 +++++++++++++++++++---- package.json | 1 + server/routes/discover.ts | 29 +++++++++++++++++++++++++++++ 5 files changed, 53 insertions(+), 6 deletions(-) create mode 100644 server/routes/discover.ts diff --git a/.env.example b/.env.example index 821a2f2..1d5c7e1 100644 --- a/.env.example +++ b/.env.example @@ -4,4 +4,5 @@ META_DESCRIPTION='' CAPTCHA=false CAPTCHA_CLIENT_KEY='' # USE A RANDOM PASSWORD GENERATOR LIKE THIS: https://bitwarden.com/password-generator/ NEVER SHARE -CRYPTO_SECRET='' \ No newline at end of file +CRYPTO_SECRET='' +TMDB_API_KEY='' \ No newline at end of file diff --git a/nitro.config.ts b/nitro.config.ts index 95f8a60..834943f 100644 --- a/nitro.config.ts +++ b/nitro.config.ts @@ -13,6 +13,7 @@ export default defineNitroConfig({ captchaClientKey: process.env.CAPTCHA_CLIENT_KEY || '' } }, - cyrptoSecret: process.env.CRYPTO_SECRET + cyrptoSecret: process.env.CRYPTO_SECRET, + tmdbApiKey: process.env.TMDB_API_KEY, } }); \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 495006e..6ca1d91 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,6 +8,7 @@ "@prisma/client": "^6.4.1", "bs58": "^6.0.0", "jsonwebtoken": "^9.0.2", + "tmdb-ts": "^2.0.1", "tweetnacl": "^1.0.3", "zod": "^3.24.2" }, @@ -2474,6 +2475,15 @@ "node": ">=18.0" } }, + "node_modules/cross-fetch": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.1.0.tgz", + "integrity": "sha512-uKm5PU+MHTootlWEY+mZ4vvXoCn4fLQxT9dSc1sXVMSFkINTJVN8cAQROpwcKm8bJ/c7rgZVIBWzH5T78sNZZw==", + "license": "MIT", + "dependencies": { + "node-fetch": "^2.7.0" + } + }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -4123,7 +4133,6 @@ "version": "2.7.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "dev": true, "license": "MIT", "dependencies": { "whatwg-url": "^5.0.0" @@ -5441,6 +5450,15 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, + "node_modules/tmdb-ts": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/tmdb-ts/-/tmdb-ts-2.0.1.tgz", + "integrity": "sha512-T3OnICnxOARYPrRoTuuPpmaoQ1mUL5AgWz3N5RT1WjLmlNA4h0H+j2yho3KTp4tm8V6sfwJRbzQaSCwGIzxuRQ==", + "license": "MIT", + "dependencies": { + "cross-fetch": "^4.0.0" + } + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -5468,7 +5486,6 @@ "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true, "license": "MIT" }, "node_modules/tweetnacl": { @@ -5905,7 +5922,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true, "license": "BSD-2-Clause" }, "node_modules/webpack-virtual-modules": { @@ -5919,7 +5935,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, "license": "MIT", "dependencies": { "tr46": "~0.0.3", diff --git a/package.json b/package.json index 28c4d3a..7bafea4 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,7 @@ "@prisma/client": "^6.4.1", "bs58": "^6.0.0", "jsonwebtoken": "^9.0.2", + "tmdb-ts": "^2.0.1", "tweetnacl": "^1.0.3", "zod": "^3.24.2" } diff --git a/server/routes/discover.ts b/server/routes/discover.ts new file mode 100644 index 0000000..ca1804c --- /dev/null +++ b/server/routes/discover.ts @@ -0,0 +1,29 @@ +import { TMDB } from "tmdb-ts"; +const tmdb = new TMDB(useRuntimeConfig().tmdbApiKey) +export default defineCachedEventHandler(async (event) => { + const popular = { movies: [], shows: [] } + popular.movies.push(...((data) => (data.results.sort((a, b) => b.vote_average - a.vote_average), data.results))(await tmdb.movies.popular())); // Sorts by vote average + popular.shows.push(...((data) => (data.results.sort((a, b) => b.vote_average - a.vote_average), data.results))(await tmdb.tvShows.popular())); // Sorts by vote average + + const genres = { + movies: await tmdb.genres.movies(), + shows: await tmdb.genres.tvShows() + } + const topRated = { + movies: await tmdb.movies.topRated(), + shows: await tmdb.tvShows.topRated() + } + const nowPlaying = { + movies: (await tmdb.movies.nowPlaying()).results.sort((a, b) => b.vote_average - a.vote_average), + shows: (await tmdb.tvShows.onTheAir()).results.sort((a, b) => b.vote_average - a.vote_average) + } + + return { + popular, + topRated, + nowPlaying, + genres + }; +}, { + maxAge: process.env.NODE_ENV === 'production' ? 20 * 60 : 0 // 20 Minutes for prod, no cache for dev. Customize to your liking +});