Added Trakt Lists

This commit is contained in:
FifthWit 2025-03-28 14:42:15 -05:00
parent b2a651c022
commit fda99a46ac
7 changed files with 801 additions and 676 deletions

View file

@ -20,5 +20,9 @@ export default defineNitroConfig({
},
cryptoSecret: process.env.CRYPTO_SECRET,
tmdbApiKey: process.env.TMDB_API_KEY,
trakt: {
clientId: process.env.TRAKT_CLIENT_ID,
clinetSecret: process.env.TRAKT_CLIENT_SECRET,
},
}
});

1327
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -16,7 +16,9 @@
"jsonwebtoken": "^9.0.2",
"prom-client": "^15.1.3",
"tmdb-ts": "^2.0.1",
"trakt.tv": "^8.2.0",
"tweetnacl": "^1.0.3",
"whatwg-url": "^14.2.0",
"zod": "^3.24.2"
}
}

View file

@ -1,29 +0,0 @@
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
});

View file

@ -0,0 +1,100 @@
import { TMDB } from "tmdb-ts";
const tmdb = new TMDB(useRuntimeConfig().tmdbApiKey)
import { trakt } from "#imports";
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)
}
let lists = [
]
const internalLists = {
trending: await trakt.lists.trending(),
popular: await trakt.lists.popular(),
}
for (let list = 0; list < internalLists.trending.length; list++) {
const items = await trakt.lists.items({ id: internalLists.trending[list].list.ids.trakt, type: "all" });
lists.push({
name: internalLists.trending[list].list.name,
likes: internalLists.trending[list].like_count,
items: []
});
for (let item = 0; item < items.length; item++) {
switch (true) {
case !!items[item].movie?.ids?.tmdb:
lists[list].items.push({
type: "movie",
name: items[item].movie.title,
id: items[item].movie.ids.tmdb,
year: items[item].movie.year,
});
break;
case !!items[item].show?.ids?.tmdb:
lists[list].items.push({
type: "show",
name: items[item].show.title,
id: items[item].show.ids.tmdb,
year: items[item].show.year
});
break;
}
}
}
for (let list = 0; list < internalLists.popular.length; list++) {
const items = await trakt.lists.items({ id: internalLists.popular[list].list.ids.trakt, type: "all" });
lists.push({
name: internalLists.popular[list].list.name,
likes: internalLists.popular[list].like_count,
items: []
});
for (let item = 0; item < items.length; item++) {
switch (true) {
case !!items[item].movie?.ids?.tmdb:
lists[lists.length - 1].items.push({
type: "movie",
name: items[item].movie.title,
id: items[item].movie.ids.tmdb,
year: items[item].movie.year,
});
break;
case !!items[item].show?.ids?.tmdb:
lists[lists.length - 1].items.push({
type: "show",
name: items[item].show.title,
id: items[item].show.ids.tmdb,
year: items[item].show.year
});
break;
}
}
}
const test = await trakt.lists.items({id: internalLists.trending[1].list.ids.trakt, type: "all"})
console.log(internalLists.trending[1].list.ids.trakt)
return {
popular,
topRated,
nowPlaying,
genres,
traktLists: lists
};
}, {
maxAge: process.env.NODE_ENV === 'production' ? 60 * 60 : 0 // 20 Minutes for prod, no cache for dev. Customize to your liking
});

View file

@ -22,7 +22,10 @@ function createLogger(scope: string): Logger {
message,
...context,
};
console.log(JSON.stringify(logData));
if (process.env.NODE_ENV === 'production') {
console.log(JSON.stringify(logData));
}
};
return {

10
server/utils/trakt.ts Normal file
View file

@ -0,0 +1,10 @@
import Trakt from 'trakt.tv';
const traktKeys = useRuntimeConfig().trakt
const options = {
client_id: traktKeys.clientId,
client_secret: traktKeys.clinetSecret
}
const trakt = new Trakt(options);
export default trakt;