mirror of
https://github.com/p-stream/backend.git
synced 2026-05-13 19:10:37 +00:00
Added Trakt Lists
This commit is contained in:
parent
b2a651c022
commit
fda99a46ac
7 changed files with 801 additions and 676 deletions
|
|
@ -20,5 +20,9 @@ export default defineNitroConfig({
|
||||||
},
|
},
|
||||||
cryptoSecret: process.env.CRYPTO_SECRET,
|
cryptoSecret: process.env.CRYPTO_SECRET,
|
||||||
tmdbApiKey: process.env.TMDB_API_KEY,
|
tmdbApiKey: process.env.TMDB_API_KEY,
|
||||||
|
trakt: {
|
||||||
|
clientId: process.env.TRAKT_CLIENT_ID,
|
||||||
|
clinetSecret: process.env.TRAKT_CLIENT_SECRET,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
1327
package-lock.json
generated
1327
package-lock.json
generated
File diff suppressed because it is too large
Load diff
|
|
@ -16,7 +16,9 @@
|
||||||
"jsonwebtoken": "^9.0.2",
|
"jsonwebtoken": "^9.0.2",
|
||||||
"prom-client": "^15.1.3",
|
"prom-client": "^15.1.3",
|
||||||
"tmdb-ts": "^2.0.1",
|
"tmdb-ts": "^2.0.1",
|
||||||
|
"trakt.tv": "^8.2.0",
|
||||||
"tweetnacl": "^1.0.3",
|
"tweetnacl": "^1.0.3",
|
||||||
|
"whatwg-url": "^14.2.0",
|
||||||
"zod": "^3.24.2"
|
"zod": "^3.24.2"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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
|
|
||||||
});
|
|
||||||
100
server/routes/discover/index.ts
Normal file
100
server/routes/discover/index.ts
Normal 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
|
||||||
|
});
|
||||||
|
|
@ -22,7 +22,10 @@ function createLogger(scope: string): Logger {
|
||||||
message,
|
message,
|
||||||
...context,
|
...context,
|
||||||
};
|
};
|
||||||
console.log(JSON.stringify(logData));
|
|
||||||
|
if (process.env.NODE_ENV === 'production') {
|
||||||
|
console.log(JSON.stringify(logData));
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
|
|
||||||
10
server/utils/trakt.ts
Normal file
10
server/utils/trakt.ts
Normal 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;
|
||||||
Loading…
Reference in a new issue