movie-web/src/backend/metadata/getmeta.ts

85 lines
2 KiB
TypeScript
Raw Normal View History

2023-01-15 15:01:07 +00:00
import { FetchError } from "ofetch";
import { makeUrl, proxiedFetch } from "../helpers/fetch";
2023-01-15 15:01:07 +00:00
import {
formatJWMeta,
JWMediaResult,
JWSeasonMetaResult,
2023-01-15 15:01:07 +00:00
JW_API_BASE,
mediaTypeToJW,
} from "./justwatch";
import { MWMediaMeta, MWMediaType } from "./types";
type JWExternalIdType =
| "eidr"
| "imdb_latest"
| "imdb"
| "tmdb_latest"
| "tmdb"
| "tms";
interface JWExternalId {
provider: JWExternalIdType;
external_id: string;
}
interface JWDetailedMeta extends JWMediaResult {
external_ids: JWExternalId[];
}
export interface DetailedMeta {
meta: MWMediaMeta;
tmdbId: string;
imdbId: string;
}
export async function getMetaFromId(
type: MWMediaType,
id: string,
seasonId?: string
2023-01-15 15:01:07 +00:00
): Promise<DetailedMeta | null> {
const queryType = mediaTypeToJW(type);
let data: JWDetailedMeta;
try {
const url = makeUrl("/content/titles/{type}/{id}/locale/en_US", {
type: queryType,
id,
});
data = await proxiedFetch<JWDetailedMeta>(url, { baseURL: JW_API_BASE });
2023-01-15 15:01:07 +00:00
} catch (err) {
if (err instanceof FetchError) {
// 400 and 404 are treated as not found
if (err.statusCode === 400 || err.statusCode === 404) return null;
}
throw err;
}
const imdbId = data.external_ids.find(
(v) => v.provider === "imdb_latest"
2023-03-10 02:22:41 +00:00
)?.external_id ?? data.external_ids.find(
(v) => v.provider === "imdb"
)?.external_id;
const tmdbId = data.external_ids.find(
(v) => v.provider === "tmdb_latest"
2023-03-10 02:22:41 +00:00
)?.external_id ?? data.external_ids.find(
(v) => v.provider === "tmdb"
)?.external_id;
if (!imdbId || !tmdbId) throw new Error("not enough info");
let seasonData: JWSeasonMetaResult | undefined;
if (data.object_type === "show") {
const seasonToScrape = seasonId ?? data.seasons?.[0].id.toString() ?? "";
const url = makeUrl("/content/titles/show_season/{id}/locale/en_US", {
id: seasonToScrape,
});
seasonData = await proxiedFetch<any>(url, { baseURL: JW_API_BASE });
}
return {
meta: formatJWMeta(data, seasonData),
imdbId,
tmdbId,
};
}