export functions directly

This commit is contained in:
adrifcastr 2023-06-21 13:07:33 +02:00
parent 89cdf74b2f
commit 1408fcde93
4 changed files with 88 additions and 98 deletions

View File

@ -3,8 +3,10 @@ import { FetchError } from "ofetch";
import { formatJWMeta, mediaTypeToJW } from "./justwatch"; import { formatJWMeta, mediaTypeToJW } from "./justwatch";
import { import {
TMDBMediaToMediaType, TMDBMediaToMediaType,
Tmdb,
formatTMDBMeta, formatTMDBMeta,
getEpisodes,
getExternalIds,
getMediaDetails,
mediaTypeToTMDB, mediaTypeToTMDB,
} from "./tmdb"; } from "./tmdb";
import { import {
@ -81,11 +83,11 @@ export async function getMetaFromId(
id: string, id: string,
seasonId?: string seasonId?: string
): Promise<DetailedMeta | null> { ): Promise<DetailedMeta | null> {
const details = await Tmdb.getMediaDetails(id, mediaTypeToTMDB(type)); const details = await getMediaDetails(id, mediaTypeToTMDB(type));
if (!details) return null; if (!details) return null;
const externalIds = await Tmdb.getExternalIds(id, mediaTypeToTMDB(type)); const externalIds = await getExternalIds(id, mediaTypeToTMDB(type));
const imdbId = externalIds.imdb_id ?? undefined; const imdbId = externalIds.imdb_id ?? undefined;
let seasonData: TMDBSeasonMetaResult | undefined; let seasonData: TMDBSeasonMetaResult | undefined;
@ -95,7 +97,7 @@ export async function getMetaFromId(
const season = const season =
seasons?.find((v) => v.id.toString() === seasonId) ?? seasons?.[0]; seasons?.find((v) => v.id.toString() === seasonId) ?? seasons?.[0];
const episodes = await Tmdb.getEpisodes( const episodes = await getEpisodes(
details.id.toString(), details.id.toString(),
season.season_number === null || season.season_number === 0 season.season_number === null || season.season_number === 0
? 1 ? 1

View File

@ -1,10 +1,10 @@
import { SimpleCache } from "@/utils/cache"; import { SimpleCache } from "@/utils/cache";
import { import {
Tmdb,
formatTMDBMeta, formatTMDBMeta,
formatTMDBSearchResult, formatTMDBSearchResult,
mediaTypeToTMDB, mediaTypeToTMDB,
searchMedia,
} from "./tmdb"; } from "./tmdb";
import { MWMediaMeta, MWQuery } from "./types"; import { MWMediaMeta, MWQuery } from "./types";
@ -18,7 +18,7 @@ export async function searchForMedia(query: MWQuery): Promise<MWMediaMeta[]> {
if (cache.has(query)) return cache.get(query) as MWMediaMeta[]; if (cache.has(query)) return cache.get(query) as MWMediaMeta[];
const { searchQuery, type } = query; const { searchQuery, type } = query;
const data = await Tmdb.searchMedia(searchQuery, mediaTypeToTMDB(type)); const data = await searchMedia(searchQuery, mediaTypeToTMDB(type));
const results = await Promise.all( const results = await Promise.all(
data.results.map(async (v) => { data.results.map(async (v) => {
const formattedResult = await formatTMDBSearchResult( const formattedResult = await formatTMDBSearchResult(

View File

@ -8,12 +8,10 @@ import {
TMDBEpisodeShort, TMDBEpisodeShort,
TMDBExternalIds, TMDBExternalIds,
TMDBMediaResult, TMDBMediaResult,
TMDBMediaStatic,
TMDBMovieData, TMDBMovieData,
TMDBMovieExternalIds, TMDBMovieExternalIds,
TMDBMovieResponse, TMDBMovieResponse,
TMDBMovieResult, TMDBMovieResult,
TMDBSearchResultStatic,
TMDBSeason, TMDBSeason,
TMDBSeasonMetaResult, TMDBSeasonMetaResult,
TMDBShowData, TMDBShowData,
@ -98,36 +96,32 @@ export function decodeTMDBId(
}; };
} }
export abstract class Tmdb { const baseURL = "https://api.themoviedb.org/3";
private static baseURL = "https://api.themoviedb.org/3";
private static headers = { const headers = {
accept: "application/json", accept: "application/json",
Authorization: `Bearer ${conf().TMDB_API_KEY}`, Authorization: `Bearer ${conf().TMDB_API_KEY}`,
}; };
private static async get<T>(url: string): Promise<T> { async function get<T>(url: string): Promise<T> {
const res = await mwFetch<any>(url, { const res = await mwFetch<any>(url, {
headers: Tmdb.headers, headers,
baseURL: Tmdb.baseURL, baseURL,
}); });
return res; return res;
} }
public static searchMedia: TMDBSearchResultStatic["searchMedia"] = async ( export async function searchMedia(query: string, type: TMDBContentTypes) {
query: string,
type: TMDBContentTypes
) => {
let data; let data;
switch (type) { switch (type) {
case "movie": case "movie":
data = await Tmdb.get<TMDBMovieResponse>( data = await get<TMDBMovieResponse>(
`search/movie?query=${query}&include_adult=false&language=en-US&page=1` `search/movie?query=${query}&include_adult=false&language=en-US&page=1`
); );
break; break;
case "show": case "show":
data = await Tmdb.get<TMDBShowResponse>( data = await get<TMDBShowResponse>(
`search/tv?query=${query}&include_adult=false&language=en-US&page=1` `search/tv?query=${query}&include_adult=false&language=en-US&page=1`
); );
break; break;
@ -136,37 +130,34 @@ export abstract class Tmdb {
} }
return data; return data;
}; }
public static getMediaDetails: TMDBMediaStatic["getMediaDetails"] = async ( export async function getMediaDetails(id: string, type: TMDBContentTypes) {
id: string,
type: TMDBContentTypes
) => {
let data; let data;
switch (type) { switch (type) {
case "movie": case "movie":
data = await Tmdb.get<TMDBMovieData>(`/movie/${id}`); data = await get<TMDBMovieData>(`/movie/${id}`);
break; break;
case "show": case "show":
data = await Tmdb.get<TMDBShowData>(`/tv/${id}`); data = await get<TMDBShowData>(`/tv/${id}`);
break; break;
default: default:
throw new Error("Invalid media type"); throw new Error("Invalid media type");
} }
return data; return data;
}; }
public static getMediaPoster(posterPath: string | null): string | undefined { export function getMediaPoster(posterPath: string | null): string | undefined {
if (posterPath) return `https://image.tmdb.org/t/p/w185/${posterPath}`; if (posterPath) return `https://image.tmdb.org/t/p/w185/${posterPath}`;
} }
public static async getEpisodes( export async function getEpisodes(
id: string, id: string,
season: number season: number
): Promise<TMDBEpisodeShort[]> { ): Promise<TMDBEpisodeShort[]> {
const data = await Tmdb.get<TMDBSeason>(`/tv/${id}/season/${season}`); const data = await get<TMDBSeason>(`/tv/${id}/season/${season}`);
return data.episodes.map((e) => ({ return data.episodes.map((e) => ({
id: e.id, id: e.id,
episode_number: e.episode_number, episode_number: e.episode_number,
@ -174,7 +165,7 @@ export abstract class Tmdb {
})); }));
} }
public static async getExternalIds( export async function getExternalIds(
id: string, id: string,
type: TMDBContentTypes type: TMDBContentTypes
): Promise<TMDBExternalIds> { ): Promise<TMDBExternalIds> {
@ -182,12 +173,10 @@ export abstract class Tmdb {
switch (type) { switch (type) {
case "movie": case "movie":
data = await Tmdb.get<TMDBMovieExternalIds>( data = await get<TMDBMovieExternalIds>(`/movie/${id}/external_ids`);
`/movie/${id}/external_ids`
);
break; break;
case "show": case "show":
data = await Tmdb.get<TMDBShowExternalIds>(`/tv/${id}/external_ids`); data = await get<TMDBShowExternalIds>(`/tv/${id}/external_ids`);
break; break;
default: default:
throw new Error("Invalid media type"); throw new Error("Invalid media type");
@ -195,7 +184,6 @@ export abstract class Tmdb {
return data; return data;
} }
}
export async function formatTMDBSearchResult( export async function formatTMDBSearchResult(
result: TMDBShowResult | TMDBMovieResult, result: TMDBShowResult | TMDBMovieResult,
@ -208,7 +196,7 @@ export async function formatTMDBSearchResult(
type === MWMediaType.SERIES type === MWMediaType.SERIES
? (result as TMDBShowResult).name ? (result as TMDBShowResult).name
: (result as TMDBMovieResult).title, : (result as TMDBMovieResult).title,
poster: Tmdb.getMediaPoster(result.poster_path), poster: getMediaPoster(result.poster_path),
id: result.id, id: result.id,
original_release_year: original_release_year:
type === MWMediaType.SERIES type === MWMediaType.SERIES

View File

@ -2,7 +2,7 @@ import { useTranslation } from "react-i18next";
import { Link } from "react-router-dom"; import { Link } from "react-router-dom";
import { TMDBMediaToId } from "@/backend/metadata/getmeta"; import { TMDBMediaToId } from "@/backend/metadata/getmeta";
import { Tmdb } from "@/backend/metadata/tmdb"; import { getMediaPoster } from "@/backend/metadata/tmdb";
import { MWMediaMeta } from "@/backend/metadata/types"; import { MWMediaMeta } from "@/backend/metadata/types";
import { DotList } from "@/components/text/DotList"; import { DotList } from "@/components/text/DotList";
@ -57,7 +57,7 @@ function MediaCardContent({
].join(" ")} ].join(" ")}
style={{ style={{
backgroundImage: media.poster backgroundImage: media.poster
? `url(${Tmdb.getMediaPoster(media.poster)})` ? `url(${getMediaPoster(media.poster)})`
: undefined, : undefined,
}} }}
> >