diff --git a/backend/src/user/user.entity.ts b/backend/src/user/user.entity.ts index 3197892..2d89ef5 100644 --- a/backend/src/user/user.entity.ts +++ b/backend/src/user/user.entity.ts @@ -34,6 +34,14 @@ export class JellyfinSettings { userId: string; } +export class TmdbSettings { + @ApiProperty({ required: true }) + sessionId: string; + + @ApiProperty({ required: true }) + userId: string; +} + export class Settings { @ApiProperty({ required: true }) autoplayTrailers: boolean; @@ -52,6 +60,8 @@ export class Settings { radarr: RadarrSettings; @ApiProperty({ required: true, type: JellyfinSettings }) jellyfin: JellyfinSettings; + @ApiProperty({ required: true, type: TmdbSettings }) + tmdb: TmdbSettings; } const DEFAULT_SETTINGS: Settings = { @@ -81,6 +91,10 @@ const DEFAULT_SETTINGS: Settings = { baseUrl: '', userId: '', }, + tmdb: { + sessionId: '', + userId: '', + }, }; @Entity() diff --git a/src/lib/apis/reiverr/reiverr.generated.d.ts b/src/lib/apis/reiverr/reiverr.generated.d.ts index 704545d..bee4ad4 100644 --- a/src/lib/apis/reiverr/reiverr.generated.d.ts +++ b/src/lib/apis/reiverr/reiverr.generated.d.ts @@ -42,6 +42,10 @@ export interface components { baseUrl: string; userId: string; }; + TmdbSettings: { + sessionId: string; + userId: string; + }; Settings: { autoplayTrailers: boolean; language: string; @@ -49,6 +53,7 @@ export interface components { sonarr: components["schemas"]["SonarrSettings"]; radarr: components["schemas"]["RadarrSettings"]; jellyfin: components["schemas"]["JellyfinSettings"]; + tmdb: components["schemas"]["TmdbSettings"]; }; UserDto: { id: string; diff --git a/src/lib/apis/tmdb/tmdb-api.ts b/src/lib/apis/tmdb/tmdb-api.ts index 7c7323d..346396f 100644 --- a/src/lib/apis/tmdb/tmdb-api.ts +++ b/src/lib/apis/tmdb/tmdb-api.ts @@ -5,6 +5,7 @@ import { TMDB_API_KEY, TMDB_BACKDROP_SMALL } from '../../constants'; import { settings } from '../../stores/settings.store'; import type { TitleType } from '../../types'; import type { Api } from '../api.interface'; +import { appState } from '../../stores/app-state.store'; const CACHE_ONE_DAY = 'max-age=86400'; const CACHE_FOUR_DAYS = 'max-age=345600'; @@ -59,6 +60,14 @@ export class TmdbApi implements Api { return TmdbApi.getClient(); } + getSessionId() { + return get(appState)?.user?.settings.tmdb.sessionId; + } + + getUserId() { + return get(appState)?.user?.settings.tmdb.userId; + } + // MOVIES getTmdbMovie = async (tmdbId: number) => { @@ -203,6 +212,46 @@ export class TmdbApi implements Api { .then((res) => res.data); // OTHER + + // USER + + getRecommendedMovies = async (): Promise => { + const userId = this.getUserId(); + if (!userId) return []; + + return ( + this.getClient() + // @ts-ignore + ?.GET('/4/account/{account_object_id}/movie/recommendations', { + params: { + path: { + account_object_id: userId + } + } + }) + .then((res: any) => res.data?.results || []) + ); + }; + + getRecommendedSeries = async (): Promise => { + const userId = this.getUserId(); + console.log('userId recommended series', userId); + + if (!userId) return []; + + return ( + this.getClient() + // @ts-ignore + ?.GET('/4/account/{account_object_id}/tv/recommendations', { + params: { + path: { + account_object_id: userId + } + } + }) + .then((res: any) => res.data?.results || []) + ); + }; } export const tmdbApi = new TmdbApi(); diff --git a/src/lib/pages/MoviesHomePage.svelte b/src/lib/pages/MoviesHomePage.svelte index e7bc2d7..01e9f4e 100644 --- a/src/lib/pages/MoviesHomePage.svelte +++ b/src/lib/pages/MoviesHomePage.svelte @@ -21,6 +21,8 @@ const newDigitalReleases = getDigitalReleases(); const upcomingMovies = getUpcomingMovies(); + const recommendedMovies = tmdbApi.getRecommendedMovies(); + recommendedMovies.then((res) => console.log('Recommended Movies', res)); function getUpcomingMovies() { return TmdbApi.getClient() @@ -89,6 +91,17 @@ {/if} {/await} + {#await recommendedMovies then recommendedMovies} + {#if recommendedMovies?.length} + + Recommended Movies + {#each recommendedMovies as item} + + {/each} + + {/if} + {/await} + {#await newDigitalReleases then nowStreaming} New Digital Releases diff --git a/src/lib/pages/SeriesHomePage.svelte b/src/lib/pages/SeriesHomePage.svelte index d706336..d26fb3e 100644 --- a/src/lib/pages/SeriesHomePage.svelte +++ b/src/lib/pages/SeriesHomePage.svelte @@ -17,6 +17,7 @@ const nowStreaming = getNowStreaming(); const upcomingSeries = fetchUpcomingSeries(); + const recommendedSeries = tmdbApi.getRecommendedSeries(); function getNowStreaming() { return TmdbApi.getClient() @@ -83,6 +84,17 @@ {/if} {/await} + {#await recommendedSeries then recommendedSeries} + {#if recommendedSeries?.length} + + Recommended + {#each recommendedSeries as item} + + {/each} + + {/if} + {/await} + {#await nowStreaming then nowStreaming} Now Streaming