feat: add initial recommendation data

This commit is contained in:
2023-09-08 13:33:29 +02:00
parent 517b1ba23d
commit cc112b7554
19 changed files with 289 additions and 170 deletions

41
routes/_layout.tsx Normal file
View File

@ -0,0 +1,41 @@
import { LayoutProps } from "$fresh/server.ts";
import { resources } from "@lib/resources.ts";
import { CSS, KATEX_CSS } from "https://deno.land/x/gfm@0.2.5/mod.ts";
import { Head } from "$fresh/runtime.ts";
import { Emoji } from "@components/Emoji.tsx";
export default function MyLayout({ Component, url }: LayoutProps) {
return (
<div
class="md:grid mx-auto"
style={{ gridTemplateColumns: "200px 1fr", maxWidth: "1024px" }}
>
<Head>
<style>{CSS}</style>
<style>{KATEX_CSS}</style>
</Head>
<aside class="p-4 hidden md:block">
<nav class="min-h-fit rounded-3xl p-3 grid gap-3 fixed t-0">
{Object.values(resources).map((m) => {
return (
<a
href={m.link}
class={`flex items-center gap-2 ${
m.link === url.pathname ? "bg-white text-black" : "text-white"
} p-3 text-xl w-full rounded-2xl`}
>
{<Emoji class="w-6 h-6" name={m.emoji} />} {m.name}
</a>
);
})}
</nav>
</aside>
<main
class="py-5"
style={{ fontFamily: "Work Sans" }}
>
<Component />
</main>
</div>
);
}

View File

@ -25,8 +25,11 @@ export const handler: Handlers = {
const releaseDate = movieDetails.release_date;
const posterPath = movieDetails.poster_path;
const director =
movieCredits?.crew?.filter?.((person) => person.job === "Director")[0];
const director = movieCredits?.crew?.filter?.((person) =>
person.job === "Director"
)[0];
movieDetails.overview;
let finalPath = "";
const name = movieDetails.title || movieDetails.original_title ||
@ -41,7 +44,9 @@ export const handler: Handlers = {
await createDocument(finalPath, poster);
}
const metadata = {} as Movie["meta"];
const metadata = {
tmdbId,
} as Movie["meta"];
if (releaseDate) {
metadata.date = new Date(releaseDate);
}

View File

@ -11,6 +11,7 @@ import {
NotFoundError,
} from "@lib/errors.ts";
import * as cache from "@lib/cache/cache.ts";
import { createRecommendationResource } from "@lib/recommendation.ts";
const POST = async (
req: Request,
@ -42,8 +43,9 @@ const POST = async (
movie.meta.date = new Date(releaseDate);
}
const director =
movieCredits?.crew?.filter?.((person) => person.job === "Director")[0];
const director = movieCredits?.crew?.filter?.((person) =>
person.job === "Director"
)[0];
if (director && !movie.meta.author) {
movie.meta.author = director.name;
}
@ -57,6 +59,10 @@ const POST = async (
];
}
if (!movie.meta.tmdbId) {
movie.meta.tmdbId = tmdbId;
}
let finalPath = "";
const posterPath = movieDetails.poster_path;
if (posterPath && !movie.meta.image) {
@ -72,6 +78,8 @@ const POST = async (
cache.del(`documents:Media:movies:${name}.md`);
createRecommendationResource(movie, movieDetails.overview);
return json(movie);
};

View File

@ -42,7 +42,7 @@ export const handler: Handlers = {
await createDocument(finalPath, poster);
}
const metadata = {} as Series["meta"];
const metadata = { tmdbId } as Series["meta"];
if (releaseDate) {
metadata.date = new Date(releaseDate);
}

View File

@ -1,4 +1,4 @@
import { Handlers, PageProps } from "$fresh/server.ts";
import { Handlers, PageProps, RouteContext } from "$fresh/server.ts";
import { MainLayout } from "@components/layouts/main.tsx";
import { getMovie, Movie } from "@lib/resource/movies.ts";
import { RecipeHero } from "@components/RecipeHero.tsx";
@ -7,17 +7,12 @@ import { renderMarkdown } from "@lib/documents.ts";
import { KMenu } from "@islands/KMenu.tsx";
import { RedirectSearchHandler } from "@islands/Search.tsx";
export const handler: Handlers<Movie | null> = {
async GET(_, ctx) {
const movie = await getMovie(ctx.params.name);
return ctx.render({ movie, session: ctx.state.session });
},
};
export default function Greet(
export default async function Greet(
props: PageProps<{ movie: Movie; session: Record<string, string> }>,
ctx: RouteContext,
) {
const { movie, session } = props.data;
const movie = await getMovie(ctx.params.name);
const session = ctx.state.session;
const { author = "", date = "" } = movie.meta;

View File

@ -1,4 +1,3 @@
import { MainLayout } from "@components/layouts/main.tsx";
import { getAllMovies, Movie } from "@lib/resource/movies.ts";
import { ResourceCard } from "@components/Card.tsx";
@ -8,26 +7,18 @@ import { KMenu } from "@islands/KMenu.tsx";
import { RedirectSearchHandler } from "@islands/Search.tsx";
import { parseResourceUrl, searchResource } from "@lib/search.ts";
import { SearchResult } from "@lib/types.ts";
import { PageProps } from "$fresh/server.ts";
export const handler: Handlers<
{ movies: Movie[] | null; searchResults?: SearchResult }
> = {
async GET(req, ctx) {
const movies = await getAllMovies();
const searchParams = parseResourceUrl(req.url);
const searchResults = searchParams &&
await searchResource({ ...searchParams, type: "movie" });
return ctx.render({
movies: movies.sort((a, b) => a?.meta?.rating > b?.meta?.rating ? -1 : 1),
searchResults,
});
},
};
export default function Greet(
export default async function Greet(
props: PageProps<{ movies: Movie[] | null; searchResults: SearchResult }>,
) {
const { movies, searchResults } = props.data;
const allMovies = await getAllMovies();
const searchParams = parseResourceUrl(props.url);
const searchResults = searchParams &&
await searchResource({ ...searchParams, type: "movie" });
const movies = allMovies.sort((a, b) =>
a?.meta?.rating > b?.meta?.rating ? -1 : 1
);
return (
<MainLayout