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 {
TMDBMediaToMediaType,
Tmdb,
formatTMDBMeta,
getEpisodes,
getExternalIds,
getMediaDetails,
mediaTypeToTMDB,
} from "./tmdb";
import {
@ -81,11 +83,11 @@ export async function getMetaFromId(
id: string,
seasonId?: string
): Promise<DetailedMeta | null> {
const details = await Tmdb.getMediaDetails(id, mediaTypeToTMDB(type));
const details = await getMediaDetails(id, mediaTypeToTMDB(type));
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;
let seasonData: TMDBSeasonMetaResult | undefined;
@ -95,7 +97,7 @@ export async function getMetaFromId(
const season =
seasons?.find((v) => v.id.toString() === seasonId) ?? seasons?.[0];
const episodes = await Tmdb.getEpisodes(
const episodes = await getEpisodes(
details.id.toString(),
season.season_number === null || season.season_number === 0
? 1

View File

@ -1,10 +1,10 @@
import { SimpleCache } from "@/utils/cache";
import {
Tmdb,
formatTMDBMeta,
formatTMDBSearchResult,
mediaTypeToTMDB,
searchMedia,
} from "./tmdb";
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[];
const { searchQuery, type } = query;
const data = await Tmdb.searchMedia(searchQuery, mediaTypeToTMDB(type));
const data = await searchMedia(searchQuery, mediaTypeToTMDB(type));
const results = await Promise.all(
data.results.map(async (v) => {
const formattedResult = await formatTMDBSearchResult(

View File

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

View File

@ -2,7 +2,7 @@ import { useTranslation } from "react-i18next";
import { Link } from "react-router-dom";
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 { DotList } from "@/components/text/DotList";
@ -57,7 +57,7 @@ function MediaCardContent({
].join(" ")}
style={{
backgroundImage: media.poster
? `url(${Tmdb.getMediaPoster(media.poster)})`
? `url(${getMediaPoster(media.poster)})`
: undefined,
}}
>