import { Handlers } from "$fresh/server.ts"; import { json } from "@lib/helpers.ts"; import * as tmdb from "@lib/tmdb.ts"; import { fileExtension } from "https://deno.land/x/file_extension@v2.1.0/mod.ts"; import { isString, safeFileName } from "@lib/string.ts"; import { AccessDeniedError } from "@lib/errors.ts"; import { Series } from "@lib/resource/series.ts"; import { createResource, fetchResource } from "@lib/marka.ts"; export const handler: Handlers = { async GET(_, ctx) { const series = await fetchResource(`series/${ctx.params.name}`); return json(series); }, async POST(_, ctx) { const session = ctx.state.session; if (!session) { throw new AccessDeniedError(); } const tmdbId = parseInt(ctx.params.name); const seriesDetails = await tmdb.getSeries(tmdbId); const seriesCredits = await tmdb.getSeriesCredits(tmdbId); const releaseDate = seriesDetails.first_air_date; const posterPath = seriesDetails.poster_path; const director = seriesCredits?.crew?.filter?.((person) => person.job === "Director")[0] || seriesDetails.created_by?.[0]; let finalPath = ""; const name = seriesDetails.name || seriesDetails.original_name || ctx.params.name; if (posterPath) { const poster = await tmdb.getMoviePoster(posterPath); const extension = fileExtension(posterPath); finalPath = `series/images/${safeFileName(name)}_cover.${extension}`; await createResource(finalPath, poster); } const tags: string[] = []; if (seriesDetails.genres) { tags.push( ...seriesDetails.genres.map((g) => g.name?.toLowerCase()).filter( isString, ), ); } const series: Series = { _type: "Review", image: finalPath, datePublished: releaseDate, tmdbId, author: { _type: "Person", name: director?.name, }, itemReviewed: { name: name, }, reviewBody: "", keywords: tags, }; await createResource(`series/${safeFileName(name)}.md`, series); return json(series); }, };