pstream-backend/server/routes/discover/index.ts
2025-05-05 09:53:17 -06:00

126 lines
3.8 KiB
TypeScript

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 trending = await trakt.movies.popular();
// most watched films
const mostWatched = await trakt.movies.watched();
// takes the highest grossing box office film in the last weekend
const lastWeekend = await trakt.movies.boxoffice();
return {
mostWatched,
lastWeekend,
trending,
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
}
);