From dfe67157d42308c5ce421ebb3a852a306d6a9716 Mon Sep 17 00:00:00 2001 From: castdrian Date: Mon, 12 Jun 2023 20:17:42 +0200 Subject: [PATCH] preliminary refactor --- src/backend/metadata/search.ts | 48 +----- src/backend/metadata/search_new.ts | 21 --- src/backend/metadata/search_old.ts | 59 +++++++ src/backend/metadata/tmdb.ts | 1 - src/backend/metadata/types.ts | 217 ++++++++++++++++++++++++ src/backend/metadata/types_new.ts | 264 ----------------------------- src/backend/metadata/types_old.ts | 47 +++++ src/setup/config.ts | 4 + 8 files changed, 332 insertions(+), 329 deletions(-) delete mode 100644 src/backend/metadata/search_new.ts create mode 100644 src/backend/metadata/search_old.ts delete mode 100644 src/backend/metadata/types_new.ts create mode 100644 src/backend/metadata/types_old.ts diff --git a/src/backend/metadata/search.ts b/src/backend/metadata/search.ts index 10cbb285..4506514a 100644 --- a/src/backend/metadata/search.ts +++ b/src/backend/metadata/search.ts @@ -1,14 +1,7 @@ import { SimpleCache } from "@/utils/cache"; -import { - JWContentTypes, - JWMediaResult, - JW_API_BASE, - formatJWMeta, - mediaTypeToJW, -} from "./justwatch"; +import { Trakt, mediaTypeToTTV } from "./trakttv"; import { MWMediaMeta, MWQuery } from "./types"; -import { proxiedFetch } from "../helpers/fetch"; const cache = new SimpleCache(); cache.setCompare((a, b) => { @@ -16,44 +9,13 @@ cache.setCompare((a, b) => { }); cache.initialize(); -type JWSearchQuery = { - content_types: JWContentTypes[]; - page: number; - page_size: number; - query: string; -}; - -type JWPage = { - items: T[]; - page: number; - page_size: number; - total_pages: number; - total_results: number; -}; - export async function searchForMedia(query: MWQuery): Promise { if (cache.has(query)) return cache.get(query) as MWMediaMeta[]; const { searchQuery, type } = query; - const contentType = mediaTypeToJW(type); - const body: JWSearchQuery = { - content_types: [contentType], - page: 1, - query: searchQuery, - page_size: 40, - }; + const contentType = mediaTypeToTTV(type); - const data = await proxiedFetch>( - "/content/titles/en_US/popular", - { - baseURL: JW_API_BASE, - params: { - body: JSON.stringify(body), - }, - } - ); - - const returnData = data.items.map((v) => formatJWMeta(v)); - cache.set(query, returnData, 3600); // cache for an hour - return returnData; + const results = await Trakt.search(searchQuery, contentType); + cache.set(query, results, 3600); + return results; } diff --git a/src/backend/metadata/search_new.ts b/src/backend/metadata/search_new.ts deleted file mode 100644 index 4506514a..00000000 --- a/src/backend/metadata/search_new.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { SimpleCache } from "@/utils/cache"; - -import { Trakt, mediaTypeToTTV } from "./trakttv"; -import { MWMediaMeta, MWQuery } from "./types"; - -const cache = new SimpleCache(); -cache.setCompare((a, b) => { - return a.type === b.type && a.searchQuery.trim() === b.searchQuery.trim(); -}); -cache.initialize(); - -export async function searchForMedia(query: MWQuery): Promise { - if (cache.has(query)) return cache.get(query) as MWMediaMeta[]; - const { searchQuery, type } = query; - - const contentType = mediaTypeToTTV(type); - - const results = await Trakt.search(searchQuery, contentType); - cache.set(query, results, 3600); - return results; -} diff --git a/src/backend/metadata/search_old.ts b/src/backend/metadata/search_old.ts new file mode 100644 index 00000000..05be994d --- /dev/null +++ b/src/backend/metadata/search_old.ts @@ -0,0 +1,59 @@ +import { SimpleCache } from "@/utils/cache"; + +import { + JWContentTypes, + JWMediaResult, + JW_API_BASE, + formatJWMeta, + mediaTypeToJW, +} from "./justwatch"; +import { MWMediaMeta, MWQuery } from "./types_old"; +import { proxiedFetch } from "../helpers/fetch"; + +const cache = new SimpleCache(); +cache.setCompare((a, b) => { + return a.type === b.type && a.searchQuery.trim() === b.searchQuery.trim(); +}); +cache.initialize(); + +type JWSearchQuery = { + content_types: JWContentTypes[]; + page: number; + page_size: number; + query: string; +}; + +type JWPage = { + items: T[]; + page: number; + page_size: number; + total_pages: number; + total_results: number; +}; + +export async function searchForMedia(query: MWQuery): Promise { + if (cache.has(query)) return cache.get(query) as MWMediaMeta[]; + const { searchQuery, type } = query; + + const contentType = mediaTypeToJW(type); + const body: JWSearchQuery = { + content_types: [contentType], + page: 1, + query: searchQuery, + page_size: 40, + }; + + const data = await proxiedFetch>( + "/content/titles/en_US/popular", + { + baseURL: JW_API_BASE, + params: { + body: JSON.stringify(body), + }, + } + ); + + const returnData = data.items.map((v) => formatJWMeta(v)); + cache.set(query, returnData, 3600); // cache for an hour + return returnData; +} diff --git a/src/backend/metadata/tmdb.ts b/src/backend/metadata/tmdb.ts index 0700945b..460e13b4 100644 --- a/src/backend/metadata/tmdb.ts +++ b/src/backend/metadata/tmdb.ts @@ -1,7 +1,6 @@ import { conf } from "@/setup/config"; import { - DetailedMeta, MWMediaType, TMDBMediaStatic, TMDBMovieData, diff --git a/src/backend/metadata/types.ts b/src/backend/metadata/types.ts index 2723fbe7..f954ff6a 100644 --- a/src/backend/metadata/types.ts +++ b/src/backend/metadata/types.ts @@ -45,3 +45,220 @@ export interface MWQuery { searchQuery: string; type: MWMediaType; } + +export type TTVContentTypes = "movie" | "show"; + +export type TTVSeasonShort = { + title: string; + id: number; + season_number: number; +}; + +export type TTVEpisodeShort = { + title: string; + id: number; + episode_number: number; +}; + +export type TTVMediaResult = { + title: string; + poster?: string; + id: number; + original_release_year?: number; + ttv_entity_id: string; + object_type: TTVContentTypes; + seasons?: TTVSeasonShort[]; +}; + +export type TTVSeasonMetaResult = { + title: string; + id: string; + season_number: number; + episodes: TTVEpisodeShort[]; +}; + +export interface TTVSearchResult { + type: "movie" | "show"; + score: number; + movie?: { + title: string; + year: number; + ids: { + trakt: number; + slug: string; + imdb: string; + tmdb: number; + }; + }; + show?: { + title: string; + year: number; + ids: { + trakt: number; + slug: string; + tvdb: number; + imdb: string; + tmdb: number; + }; + }; +} + +export interface DetailedMeta { + meta: MWMediaMeta; + imdbId?: string; + tmdbId?: string; +} + +export interface TMDBShowData { + adult: boolean; + backdrop_path: string | null; + created_by: { + id: number; + credit_id: string; + name: string; + gender: number; + profile_path: string | null; + }[]; + episode_run_time: number[]; + first_air_date: string; + genres: { + id: number; + name: string; + }[]; + homepage: string; + id: number; + in_production: boolean; + languages: string[]; + last_air_date: string; + last_episode_to_air: { + id: number; + name: string; + overview: string; + vote_average: number; + vote_count: number; + air_date: string; + episode_number: number; + production_code: string; + runtime: number | null; + season_number: number; + show_id: number; + still_path: string | null; + } | null; + name: string; + next_episode_to_air: { + id: number; + name: string; + overview: string; + vote_average: number; + vote_count: number; + air_date: string; + episode_number: number; + production_code: string; + runtime: number | null; + season_number: number; + show_id: number; + still_path: string | null; + } | null; + networks: { + id: number; + logo_path: string; + name: string; + origin_country: string; + }[]; + number_of_episodes: number; + number_of_seasons: number; + origin_country: string[]; + original_language: string; + original_name: string; + overview: string; + popularity: number; + poster_path: string | null; + production_companies: { + id: number; + logo_path: string | null; + name: string; + origin_country: string; + }[]; + production_countries: { + iso_3166_1: string; + name: string; + }[]; + seasons: { + air_date: string; + episode_count: number; + id: number; + name: string; + overview: string; + poster_path: string | null; + season_number: number; + }[]; + spoken_languages: { + english_name: string; + iso_639_1: string; + name: string; + }[]; + status: string; + tagline: string; + type: string; + vote_average: number; + vote_count: number; +} + +export interface TMDBMovieData { + adult: boolean; + backdrop_path: string | null; + belongs_to_collection: { + id: number; + name: string; + poster_path: string | null; + backdrop_path: string | null; + } | null; + budget: number; + genres: { + id: number; + name: string; + }[]; + homepage: string | null; + id: number; + imdb_id: string | null; + original_language: string; + original_title: string; + overview: string | null; + popularity: number; + poster_path: string | null; + production_companies: { + id: number; + logo_path: string | null; + name: string; + origin_country: string; + }[]; + production_countries: { + iso_3166_1: string; + name: string; + }[]; + release_date: string; + revenue: number; + runtime: number | null; + spoken_languages: { + english_name: string; + iso_639_1: string; + name: string; + }[]; + status: string; + tagline: string | null; + title: string; + video: boolean; + vote_average: number; + vote_count: number; +} + +export type TMDBMediaDetailsPromise = Promise; + +export interface TMDBMediaStatic { + getMediaDetails( + id: string, + type: MWMediaType.SERIES + ): TMDBMediaDetailsPromise; + getMediaDetails(id: string, type: MWMediaType.MOVIE): TMDBMediaDetailsPromise; + getMediaDetails(id: string, type: MWMediaType): TMDBMediaDetailsPromise; +} diff --git a/src/backend/metadata/types_new.ts b/src/backend/metadata/types_new.ts deleted file mode 100644 index f954ff6a..00000000 --- a/src/backend/metadata/types_new.ts +++ /dev/null @@ -1,264 +0,0 @@ -export enum MWMediaType { - MOVIE = "movie", - SERIES = "series", - ANIME = "anime", -} - -export type MWSeasonMeta = { - id: string; - number: number; - title: string; -}; - -export type MWSeasonWithEpisodeMeta = { - id: string; - number: number; - title: string; - episodes: { - id: string; - number: number; - title: string; - }[]; -}; - -type MWMediaMetaBase = { - title: string; - id: string; - year?: string; - poster?: string; -}; - -type MWMediaMetaSpecific = - | { - type: MWMediaType.MOVIE | MWMediaType.ANIME; - seasons: undefined; - } - | { - type: MWMediaType.SERIES; - seasons: MWSeasonMeta[]; - seasonData: MWSeasonWithEpisodeMeta; - }; - -export type MWMediaMeta = MWMediaMetaBase & MWMediaMetaSpecific; - -export interface MWQuery { - searchQuery: string; - type: MWMediaType; -} - -export type TTVContentTypes = "movie" | "show"; - -export type TTVSeasonShort = { - title: string; - id: number; - season_number: number; -}; - -export type TTVEpisodeShort = { - title: string; - id: number; - episode_number: number; -}; - -export type TTVMediaResult = { - title: string; - poster?: string; - id: number; - original_release_year?: number; - ttv_entity_id: string; - object_type: TTVContentTypes; - seasons?: TTVSeasonShort[]; -}; - -export type TTVSeasonMetaResult = { - title: string; - id: string; - season_number: number; - episodes: TTVEpisodeShort[]; -}; - -export interface TTVSearchResult { - type: "movie" | "show"; - score: number; - movie?: { - title: string; - year: number; - ids: { - trakt: number; - slug: string; - imdb: string; - tmdb: number; - }; - }; - show?: { - title: string; - year: number; - ids: { - trakt: number; - slug: string; - tvdb: number; - imdb: string; - tmdb: number; - }; - }; -} - -export interface DetailedMeta { - meta: MWMediaMeta; - imdbId?: string; - tmdbId?: string; -} - -export interface TMDBShowData { - adult: boolean; - backdrop_path: string | null; - created_by: { - id: number; - credit_id: string; - name: string; - gender: number; - profile_path: string | null; - }[]; - episode_run_time: number[]; - first_air_date: string; - genres: { - id: number; - name: string; - }[]; - homepage: string; - id: number; - in_production: boolean; - languages: string[]; - last_air_date: string; - last_episode_to_air: { - id: number; - name: string; - overview: string; - vote_average: number; - vote_count: number; - air_date: string; - episode_number: number; - production_code: string; - runtime: number | null; - season_number: number; - show_id: number; - still_path: string | null; - } | null; - name: string; - next_episode_to_air: { - id: number; - name: string; - overview: string; - vote_average: number; - vote_count: number; - air_date: string; - episode_number: number; - production_code: string; - runtime: number | null; - season_number: number; - show_id: number; - still_path: string | null; - } | null; - networks: { - id: number; - logo_path: string; - name: string; - origin_country: string; - }[]; - number_of_episodes: number; - number_of_seasons: number; - origin_country: string[]; - original_language: string; - original_name: string; - overview: string; - popularity: number; - poster_path: string | null; - production_companies: { - id: number; - logo_path: string | null; - name: string; - origin_country: string; - }[]; - production_countries: { - iso_3166_1: string; - name: string; - }[]; - seasons: { - air_date: string; - episode_count: number; - id: number; - name: string; - overview: string; - poster_path: string | null; - season_number: number; - }[]; - spoken_languages: { - english_name: string; - iso_639_1: string; - name: string; - }[]; - status: string; - tagline: string; - type: string; - vote_average: number; - vote_count: number; -} - -export interface TMDBMovieData { - adult: boolean; - backdrop_path: string | null; - belongs_to_collection: { - id: number; - name: string; - poster_path: string | null; - backdrop_path: string | null; - } | null; - budget: number; - genres: { - id: number; - name: string; - }[]; - homepage: string | null; - id: number; - imdb_id: string | null; - original_language: string; - original_title: string; - overview: string | null; - popularity: number; - poster_path: string | null; - production_companies: { - id: number; - logo_path: string | null; - name: string; - origin_country: string; - }[]; - production_countries: { - iso_3166_1: string; - name: string; - }[]; - release_date: string; - revenue: number; - runtime: number | null; - spoken_languages: { - english_name: string; - iso_639_1: string; - name: string; - }[]; - status: string; - tagline: string | null; - title: string; - video: boolean; - vote_average: number; - vote_count: number; -} - -export type TMDBMediaDetailsPromise = Promise; - -export interface TMDBMediaStatic { - getMediaDetails( - id: string, - type: MWMediaType.SERIES - ): TMDBMediaDetailsPromise; - getMediaDetails(id: string, type: MWMediaType.MOVIE): TMDBMediaDetailsPromise; - getMediaDetails(id: string, type: MWMediaType): TMDBMediaDetailsPromise; -} diff --git a/src/backend/metadata/types_old.ts b/src/backend/metadata/types_old.ts new file mode 100644 index 00000000..2723fbe7 --- /dev/null +++ b/src/backend/metadata/types_old.ts @@ -0,0 +1,47 @@ +export enum MWMediaType { + MOVIE = "movie", + SERIES = "series", + ANIME = "anime", +} + +export type MWSeasonMeta = { + id: string; + number: number; + title: string; +}; + +export type MWSeasonWithEpisodeMeta = { + id: string; + number: number; + title: string; + episodes: { + id: string; + number: number; + title: string; + }[]; +}; + +type MWMediaMetaBase = { + title: string; + id: string; + year?: string; + poster?: string; +}; + +type MWMediaMetaSpecific = + | { + type: MWMediaType.MOVIE | MWMediaType.ANIME; + seasons: undefined; + } + | { + type: MWMediaType.SERIES; + seasons: MWSeasonMeta[]; + seasonData: MWSeasonWithEpisodeMeta; + }; + +export type MWMediaMeta = MWMediaMetaBase & MWMediaMetaSpecific; + +export interface MWQuery { + searchQuery: string; + type: MWMediaType; +} diff --git a/src/setup/config.ts b/src/setup/config.ts index f1db01da..c24117bb 100644 --- a/src/setup/config.ts +++ b/src/setup/config.ts @@ -8,6 +8,7 @@ interface Config { TMDB_API_KEY: string; CORS_PROXY_URL: string; NORMAL_ROUTER: boolean; + TRAKT_CLIENT_ID: string; } export interface RuntimeConfig { @@ -18,6 +19,7 @@ export interface RuntimeConfig { TMDB_API_KEY: string; NORMAL_ROUTER: boolean; PROXY_URLS: string[]; + TRAKT_CLIENT_ID: string; } const env: Record = { @@ -28,6 +30,7 @@ const env: Record = { DISCORD_LINK: undefined, CORS_PROXY_URL: import.meta.env.VITE_CORS_PROXY_URL, NORMAL_ROUTER: import.meta.env.VITE_NORMAL_ROUTER, + TRAKT_CLIENT_ID: import.meta.env.VITE_TRAKT_CLIENT_ID, }; const alerts = [] as string[]; @@ -62,5 +65,6 @@ export function conf(): RuntimeConfig { .split(",") .map((v) => v.trim()), NORMAL_ROUTER: getKey("NORMAL_ROUTER", "false") === "true", + TRAKT_CLIENT_ID: getKey("TRAKT_CLIENT_ID"), }; }