import { HandlerContext, Handlers } from "$fresh/server.ts"; import { createDocument, getDocument, transformDocument, } from "@lib/documents.ts"; import { fileExtension } from "https://deno.land/x/file_extension@v2.1.0/mod.ts"; import { getMovie, type Movie } from "@lib/resource/movies.ts"; import * as tmdb from "@lib/tmdb.ts"; import { parse, stringify } from "https://deno.land/std@0.194.0/yaml/mod.ts"; import { formatDate, safeFileName } from "@lib/string.ts"; import { json } from "@lib/helpers.ts"; import { BadRequestError } from "@lib/errors.ts"; async function updateMovieMetadata( name: string, metadata: Partial, ) { const docId = `Media/movies/${name}.md`; let currentDoc = await getDocument(docId); if (!currentDoc) return; if (!currentDoc.startsWith("---\n---\n")) { currentDoc = `---\n---\n\n${currentDoc}`; } const newDoc = transformDocument(currentDoc, (root) => { const frontmatterNode = root.children.find((c) => c.type === "yaml"); const frontmatter = frontmatterNode?.value as string; const value = parse(frontmatter) as Movie["meta"]; const newValue = { ...metadata, date: formatDate(metadata.date), ...value, }; frontmatterNode.value = stringify(newValue); return root; }); console.log({ newDoc }); return createDocument(docId, newDoc); } const POST = async ( _req: Request, _ctx: HandlerContext, ): Promise => { const movie = await getMovie(_ctx.params.name); const body = await _req.json(); const name = _ctx.params.name; const { tmdbId } = body; if (!name || !tmdbId) { throw new BadRequestError(); } const movieDetails = await tmdb.getMovie(tmdbId); const movieCredits = !movie.meta.author && await tmdb.getMovieCredits(tmdbId); const releaseDate = movieDetails.release_date; const posterPath = movieDetails.poster_path; const director = movieCredits?.crew?.filter?.((person) => person.job === "Director")[0]; let finalPath = ""; if (posterPath && !movie.meta.image) { const poster = await tmdb.getMoviePoster(posterPath); const extension = fileExtension(posterPath); finalPath = `Media/movies/images/${safeFileName(name)}_cover.${extension}`; await createDocument(finalPath, poster); } const metadata = {} as Movie["meta"]; if (releaseDate) { metadata.date = new Date(releaseDate); } if (finalPath) { metadata.image = finalPath; } if (director) { metadata.author = director.name; } await updateMovieMetadata(name, metadata); return json(movieCredits); }; export const handler: Handlers = { POST, };