Created a /discover endpoint, should decrease latency for sites that need to discover as caching is used

This commit is contained in:
root 2025-03-09 23:23:21 -05:00
parent 96c12982e2
commit 2d44ab8f73
5 changed files with 53 additions and 6 deletions

View file

@ -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=''
CRYPTO_SECRET=''
TMDB_API_KEY=''

View file

@ -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,
}
});

23
package-lock.json generated
View file

@ -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",

View file

@ -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"
}

29
server/routes/discover.ts Normal file
View file

@ -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
});