This repository has been archived on 2025-03-28. You can view files and clone it, but cannot push or open issues or pull requests.
coryd.dev-astro/src/components/Metadata.astro

155 lines
4.6 KiB
Text

---
const {
schema,
page,
globals,
post,
title,
description,
artist,
movie,
movies,
show,
tv,
book,
books,
genre,
year,
} = Astro.props;
const fullUrl = `${globals.url}${page.url}`;
let pageTitle = globals.site_name;
let pageDescription = globals.site_description;
let ogImage = `${globals.cdn_url}${globals.avatar}`;
switch (schema) {
case "blog":
pageTitle = post?.title || pageTitle;
pageDescription = post?.description || pageDescription;
ogImage = `${globals.cdn_url}${post?.image}`;
break;
case "music":
case "music-index":
case "music-period":
pageTitle = schema === "music" ? `Music / ${page.title}` : "Music";
if (schema === "music") {
ogImage = `${globals.cdn_url}${page?.image}`;
} else if (schema === "music-index") {
ogImage = `${globals.cdn_url}${movies?.week?.artists[0]?.grid?.image}`;
} else if (schema === "music-period") {
ogImage = `${globals.cdn_url}${page?.image}`;
}
break;
case "artist":
pageTitle = `Artists / ${artist?.name}`;
pageDescription = artist?.description || pageDescription;
ogImage = `${globals.cdn_url}${artist?.image}`;
break;
case "genre":
pageTitle = `Music / ${genre?.name}`;
pageDescription = genre?.description || pageDescription;
ogImage = `${globals.cdn_url}${genre?.artists[0]?.image}`;
break;
case "book":
pageTitle = `Books / ${book?.title} by ${book?.author}`;
pageDescription = book?.review || book?.description || pageDescription;
ogImage = `${globals.cdn_url}${book?.image}`;
break;
case "books":
pageTitle = "Books";
const overviewBook = books?.all?.find((b) => b.status === "started");
ogImage = `${globals.cdn_url}${overviewBook?.image}`;
break;
case "books-year":
const bookYear = year?.data?.find((b) => b.status === "finished");
ogImage = `${globals.cdn_url}${bookYear?.image}`;
break;
case "movie":
pageTitle = `Movies / ${movie?.title}`;
if (movie?.rating) {
pageTitle += ` (${movie.rating})`;
}
pageDescription = movie?.review || movie?.description || pageDescription;
ogImage = `${globals.cdn_url}${movie?.backdrop}`;
break;
case "favorite-movies":
pageTitle = "Favorite movies";
const favoriteMovie = movies?.favorites?.[0];
ogImage = `${globals.cdn_url}${favoriteMovie?.backdrop}`;
break;
case "show":
pageTitle = `Show / ${show?.title}`;
pageDescription = show?.review || show?.description || pageDescription;
ogImage = `${globals.cdn_url}${show?.backdrop}`;
break;
case "favorite-shows":
pageTitle = "Favorite shows";
const favoriteShow = tv?.favorites?.[0];
ogImage = `${globals.cdn_url}${favoriteShow?.backdrop}`;
break;
case "watching":
pageTitle = "Watching";
const overviewMovie = movies?.recentlyWatched?.[0];
ogImage = `${globals.cdn_url}${overviewMovie?.backdrop}`;
break;
case "page":
pageTitle = page?.title || pageTitle;
pageDescription = page?.description || pageDescription;
break;
default:
break;
}
if (title) pageTitle = title;
if (description) pageDescription = description;
if (pageTitle !== globals.site_name && schema !== "blog") pageTitle = `${pageTitle} / ${globals.site_name}`;
const escapedPageDescription =
pageDescription?.replace(
/["'<>&]/g,
(c) =>
({
'"': "&quot;",
"'": "&#39;",
"<": "&lt;",
">": "&gt;",
"&": "&amp;",
})[c]
) || "";
---
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="color-scheme" content="light dark" />
<title>{pageTitle}</title>
<link rel="canonical" href={fullUrl} />
<meta property="og:title" content={pageTitle} />
<meta name="description" content={escapedPageDescription} />
<meta property="og:description" content={escapedPageDescription} />
<meta property="og:type" content="article" />
<meta property="og:url" content={fullUrl} />
<meta property="og:image" content={`${ogImage}?class=w800`} />
<meta name="theme-color" content={globals.theme_color} />
<meta name="fediverse:creator" content={globals.mastodon} />
<meta name="generator" content="Astro" />
<meta name="robots" content="noai, noimageai" />
<link
href={`${globals.cdn_url}${globals.avatar_transparent}?class=w50`}
rel="icon"
sizes="any"
/>
<link
href={`${globals.cdn_url}${globals.avatar_transparent}?class=w50&type=svg`}
rel="icon"
type="image/svg+xml"
/>
<link
href={`${globals.cdn_url}${globals.avatar}?class=w800`}
rel="apple-touch-icon"
/>
<link
type="application/atom+xml"
rel="alternate"
title={`Posts / ${globals.site_name}`}
href="https://coryd.dev/feeds/posts"
/>