diff --git a/api/Classes/GlobalsFetcher.php b/api/Classes/GlobalsFetcher.php deleted file mode 100644 index 666a338..0000000 --- a/api/Classes/GlobalsFetcher.php +++ /dev/null @@ -1,22 +0,0 @@ -cacheGet($cacheKey); - - if ($cached) return $cached; - - $globals = $this->fetchFromApi("optimized_globals"); - - if (empty($globals)) return null; - - $this->cacheSet($cacheKey, $globals[0]); - - return $globals[0]; - } -} diff --git a/api/oembed.php b/api/oembed.php index 29a533b..df0f4b8 100644 --- a/api/oembed.php +++ b/api/oembed.php @@ -18,7 +18,7 @@ class OembedHandler extends BaseHandler if (!$requestUrl || $relativePath === '/') $this->sendResponse($this->buildResponse( $globals['site_name'], $globals['url'], - $globals['avatar'], + $globals['metadata']['open_graph_image'], $globals )); @@ -66,7 +66,7 @@ class OembedHandler extends BaseHandler $this->sendResponse($this->buildResponse( $title, $relativePath, - $globals['avatar'], + $globals['metadata']['open_graph_image'], $globals )); } diff --git a/config/filters/general.js b/config/filters/general.js index cf8aae4..9793ecc 100644 --- a/config/filters/general.js +++ b/config/filters/general.js @@ -9,7 +9,10 @@ export default { return string.replace(pattern, replacement); }, - replaceQuotes: (string) => string.replace(/"/g, """), + replaceQuotes: (string) => { + if (!string) return ''; + return string.replace(/"/g, """); + }, htmlTruncate: (content, limit = 50) => truncateHtml(content, limit, { byWords: true, ellipsis: "...", diff --git a/package-lock.json b/package-lock.json index ba2db43..a439485 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "coryd.dev", - "version": "6.2.0", + "version": "7.0.6", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "coryd.dev", - "version": "6.2.0", + "version": "7.0.6", "license": "MIT", "dependencies": { "minisearch": "^7.1.2", diff --git a/package.json b/package.json index 078cf60..64dd044 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "coryd.dev", - "version": "6.2.0", + "version": "7.0.6", "description": "The source for my personal site. Built using 11ty (and other tools).", "type": "module", "engines": { diff --git a/queries/views/content/posts.sql b/queries/views/content/posts.sql index 09b167c..24d01e2 100644 --- a/queries/views/content/posts.sql +++ b/queries/views/content/posts.sql @@ -7,123 +7,170 @@ SELECT p.content, p.featured, p.slug AS url, - CASE WHEN df.filename_disk IS NOT NULL - AND df.filename_disk != '' - AND df.filename_disk != '/' THEN - CONCAT('/', df.filename_disk) - ELSE - NULL + CASE + WHEN df.filename_disk IS NOT NULL AND df.filename_disk != '' AND df.filename_disk != '/' THEN + CONCAT(globals.cdn_url, '/', df.filename_disk) + ELSE NULL END AS image, p.image_alt, - CASE WHEN EXTRACT(YEAR FROM AGE(CURRENT_DATE, p.date)) > 3 THEN - TRUE - ELSE - FALSE - END AS old_post, -( - SELECT - json_agg( - CASE WHEN pb.collection = 'youtube_player' THEN - json_build_object('type', pb.collection, 'url', yp.url) - WHEN pb.collection = 'forgejo_banner' THEN - json_build_object('type', pb.collection, 'url', fb.url) - WHEN pb.collection = 'github_banner' THEN - json_build_object('type', pb.collection, 'url', gb.url) - WHEN pb.collection = 'npm_banner' THEN - json_build_object('type', pb.collection, 'url', nb.url, 'command', nb.command) - WHEN pb.collection = 'rss_banner' THEN - json_build_object('type', pb.collection, 'url', rb.url, 'text', rb.text) - WHEN pb.collection = 'calendar_banner' THEN - json_build_object('type', pb.collection, 'url', cb.url, 'text', cb.text) - WHEN pb.collection = 'hero' THEN - json_build_object('type', pb.collection, 'image', CONCAT('/', df_hero.filename_disk), 'alt_text', h.alt_text) - WHEN pb.collection = 'markdown' THEN - json_build_object('type', pb.collection, 'text', md.text) - ELSE - json_build_object('type', pb.collection) - END) - FROM - posts_blocks pb - LEFT JOIN youtube_player yp ON pb.collection = 'youtube_player' - AND yp.id = pb.item::integer - LEFT JOIN forgejo_banner fb ON pb.collection = 'forgejo_banner' - AND fb.id = pb.item::integer - LEFT JOIN github_banner gb ON pb.collection = 'github_banner' - AND gb.id = pb.item::integer - LEFT JOIN npm_banner nb ON pb.collection = 'npm_banner' - AND nb.id = pb.item::integer - LEFT JOIN rss_banner rb ON pb.collection = 'rss_banner' - AND rb.id = pb.item::integer - LEFT JOIN calendar_banner cb ON pb.collection = 'calendar_banner' - AND cb.id = pb.item::integer - LEFT JOIN hero h ON pb.collection = 'hero' - AND h.id = pb.item::integer - LEFT JOIN directus_files df_hero ON h.image = df_hero.id - LEFT JOIN markdown md ON pb.collection = 'markdown' - AND md.id = pb.item::integer -WHERE - pb.posts_id = p.id) AS blocks, -( - SELECT - array_agg(t.name) - FROM - posts_tags pt - LEFT JOIN tags t ON pt.tags_id = t.id -WHERE - pt.posts_id = p.id) AS tags, -( - SELECT - json_agg(json_build_object('name', g.name, 'url', g.slug) ORDER BY g.name ASC) - FROM - posts_genres gp - LEFT JOIN genres g ON gp.genres_id = g.id -WHERE - gp.posts_id = p.id) AS genres, -( - SELECT - json_agg(json_build_object('name', a.name_string, 'url', a.slug, 'country', a.country, 'total_plays', a.total_plays) ORDER BY a.name_string ASC) - FROM - posts_artists pa - LEFT JOIN artists a ON pa.artists_id = a.id -WHERE - pa.posts_id = p.id) AS artists, -( - SELECT - json_agg(json_build_object('title', b.title, 'author', b.author, 'url', b.slug) - ORDER BY b.title ASC) - FROM - posts_books pbk - LEFT JOIN books b ON pbk.books_id = b.id -WHERE - pbk.posts_id = p.id) AS books, -( - SELECT - json_agg(json_build_object('title', m.title, 'year', m.year, 'url', m.slug) - ORDER BY m.year DESC) - FROM - posts_movies pm - LEFT JOIN movies m ON pm.movies_id = m.id -WHERE - pm.posts_id = p.id) AS movies, -( - SELECT - json_agg(json_build_object('title', s.title, 'year', s.year, 'url', s.slug) ORDER BY s.year DESC) - FROM - posts_shows ps - LEFT JOIN shows s ON ps.shows_id = s.id -WHERE - ps.posts_id = p.id) AS shows, -json_build_object('title', p.title, 'url', p.slug, 'description', p.description, 'content', p.content, 'date', p.date, 'image', CASE WHEN df.filename_disk IS NOT NULL - AND df.filename_disk != '' - AND df.filename_disk != '/' THEN - CONCAT('/', df.filename_disk) - ELSE - NULL - END) AS feed -FROM - posts p - LEFT JOIN directus_files df ON p.image = df.id -GROUP BY - p.id, - df.filename_disk; - + CASE WHEN EXTRACT(YEAR FROM AGE(CURRENT_DATE, p.date)) > 3 THEN TRUE ELSE FALSE END AS old_post, + ( + SELECT json_agg(CASE + WHEN pb.collection = 'youtube_player' THEN json_build_object('type', pb.collection, 'url', yp.url) + WHEN pb.collection = 'forgejo_banner' THEN json_build_object('type', pb.collection, 'url', fb.url) + WHEN pb.collection = 'github_banner' THEN json_build_object('type', pb.collection, 'url', gb.url) + WHEN pb.collection = 'npm_banner' THEN json_build_object('type', pb.collection, 'url', nb.url, 'command', nb.command) + WHEN pb.collection = 'rss_banner' THEN json_build_object('type', pb.collection, 'url', rb.url, 'text', rb.text) + WHEN pb.collection = 'calendar_banner' THEN json_build_object('type', pb.collection, 'url', cb.url, 'text', cb.text) + WHEN pb.collection = 'hero' THEN json_build_object('type', pb.collection, 'image', CONCAT('/', df_hero.filename_disk), 'alt_text', h.alt_text) + WHEN pb.collection = 'markdown' THEN json_build_object('type', pb.collection, 'text', md.text) + ELSE json_build_object('type', pb.collection) + END) + FROM posts_blocks pb + LEFT JOIN youtube_player yp ON pb.collection = 'youtube_player' AND yp.id = pb.item::integer + LEFT JOIN forgejo_banner fb ON pb.collection = 'forgejo_banner' AND fb.id = pb.item::integer + LEFT JOIN github_banner gb ON pb.collection = 'github_banner' AND gb.id = pb.item::integer + LEFT JOIN npm_banner nb ON pb.collection = 'npm_banner' AND nb.id = pb.item::integer + LEFT JOIN rss_banner rb ON pb.collection = 'rss_banner' AND rb.id = pb.item::integer + LEFT JOIN calendar_banner cb ON pb.collection = 'calendar_banner' AND cb.id = pb.item::integer + LEFT JOIN hero h ON pb.collection = 'hero' AND h.id = pb.item::integer + LEFT JOIN directus_files df_hero ON h.image = df_hero.id + LEFT JOIN markdown md ON pb.collection = 'markdown' AND md.id = pb.item::integer + WHERE pb.posts_id = p.id + ) AS blocks, + ( + SELECT array_agg(t.name) + FROM posts_tags pt + LEFT JOIN tags t ON pt.tags_id = t.id + WHERE pt.posts_id = p.id + ) AS tags, + ( + SELECT json_agg(json_build_object('name', g.name, 'url', g.slug) ORDER BY g.name ASC) + FROM posts_genres gp + LEFT JOIN genres g ON gp.genres_id = g.id + WHERE gp.posts_id = p.id + ) AS genres, + ( + SELECT json_agg(json_build_object( + 'name', a.name_string, + 'url', a.slug, + 'country', a.country, + 'total_plays', a.total_plays, + 'image', CONCAT(globals.cdn_url, '/', df_artist.filename_disk), + 'grid', json_build_object( + 'title', a.name_string, + 'image', CONCAT(globals.cdn_url, '/', df_artist.filename_disk), + 'alt', CONCAT(to_char(a.total_plays, 'FM999,999,999,999'), ' plays of ', a.name_string), + 'subtext', CONCAT(to_char(a.total_plays, 'FM999,999,999,999'), ' plays'), + 'url', a.slug + ), + 'type', 'music' + ) ORDER BY a.total_plays DESC) + FROM posts_artists pa + LEFT JOIN artists a ON pa.artists_id = a.id + LEFT JOIN directus_files df_artist ON a.art = df_artist.id + WHERE pa.posts_id = p.id + AND a.total_plays IS NOT NULL AND a.total_plays > 0 + ) AS artists, + ( + SELECT json_agg(json_build_object( + 'title', b.title, + 'author', b.author, + 'url', b.slug, + 'image', CONCAT(globals.cdn_url, '/', df_book.filename_disk), + 'grid', json_build_object( + 'title', NULL, + 'image', CONCAT(globals.cdn_url, '/', df_book.filename_disk), + 'alt', CONCAT('Cover for ', b.title, ' by ', b.author), + 'subtext', CASE WHEN b.star_rating IS NOT NULL THEN b.star_rating ELSE NULL END, + 'url', b.slug + ), + 'type', 'books' + ) ORDER BY b.title ASC) + FROM posts_books pbk + LEFT JOIN books b ON pbk.books_id = b.id + LEFT JOIN directus_files df_book ON b.art = df_book.id + WHERE pbk.posts_id = p.id + AND LOWER(b.read_status) = 'finished' + ) AS books, + ( + SELECT json_agg(json_build_object( + 'title', m.title, + 'year', m.year, + 'url', m.slug, + 'image', CONCAT(globals.cdn_url, '/', df_movie.filename_disk), + 'grid', json_build_object( + 'title', NULL, + 'image', CONCAT(globals.cdn_url, '/', df_movie.filename_disk), + 'alt', CONCAT('Poster for ', m.title, ' (', m.year, ')'), + 'subtext', CASE WHEN m.star_rating IS NOT NULL THEN m.star_rating::text ELSE m.year::text END, + 'url', m.slug + ), + 'type', 'movies' + ) ORDER BY m.year ASC) + FROM posts_movies pm + LEFT JOIN movies m ON pm.movies_id = m.id + LEFT JOIN directus_files df_movie ON m.art = df_movie.id + WHERE pm.posts_id = p.id AND m.last_watched IS NOT NULL + ) AS movies, + ( + SELECT json_agg(json_build_object( + 'title', s.title, + 'year', s.year, + 'url', s.slug, + 'image', CONCAT(globals.cdn_url, '/', df_show.filename_disk), + 'grid', json_build_object( + 'title', NULL, + 'image', CONCAT(globals.cdn_url, '/', df_show.filename_disk), + 'alt', CONCAT('Artwork for ', s.title), + 'subtext', CASE + WHEN ( + SELECT MAX(e1.last_watched_at) + FROM episodes e1 + WHERE e1.show = s.id + ) >= NOW() - INTERVAL '90 days' THEN + ( + SELECT CONCAT('S', e2.season_number, 'E', e2.episode_number) + FROM episodes e2 + WHERE e2.show = s.id + ORDER BY e2.last_watched_at DESC, e2.season_number DESC, e2.episode_number DESC + LIMIT 1 + ) + ELSE s.year::text + END, + 'url', s.slug + ), + 'type', 'tv' + ) ORDER BY s.year ASC) + FROM posts_shows ps + LEFT JOIN shows s ON ps.shows_id = s.id + LEFT JOIN directus_files df_show ON s.art = df_show.id + WHERE ps.posts_id = p.id + AND EXISTS ( + SELECT 1 + FROM episodes e + WHERE e.show = s.id + AND e.last_watched_at IS NOT NULL + ) + ) AS shows, + json_build_object( + 'title', p.title, + 'url', p.slug, + 'description', p.description, + 'content', p.content, + 'date', p.date, + 'image', CASE + WHEN df.filename_disk IS NOT NULL AND df.filename_disk != '' AND df.filename_disk != '/' THEN CONCAT(globals.cdn_url, '/', df.filename_disk) + ELSE NULL + END + ) AS feed, + json_build_object( + 'open_graph_image', CASE + WHEN df.filename_disk IS NOT NULL AND df.filename_disk != '' AND df.filename_disk != '/' THEN CONCAT('/', df.filename_disk) + ELSE NULL + END + ) AS metadata +FROM posts p +LEFT JOIN directus_files df ON p.image = df.id +CROSS JOIN optimized_globals globals +GROUP BY p.id, df.filename_disk, globals.cdn_url; diff --git a/queries/views/feeds/all_activity.sql b/queries/views/feeds/all_activity.sql index 9493392..a37ac8c 100644 --- a/queries/views/feeds/all_activity.sql +++ b/queries/views/feeds/all_activity.sql @@ -10,9 +10,7 @@ WITH feed_data AS ( 'content', p.content ) AS feed FROM optimized_posts p - UNION ALL - SELECT json_build_object( 'title', CONCAT(l.title, ' via ', l.author->>'name'), 'url', l.link, @@ -23,9 +21,7 @@ WITH feed_data AS ( 'author', l.author ) AS feed FROM optimized_links l - UNION ALL - SELECT CASE WHEN LOWER(b.status) = 'finished' THEN json_build_object( @@ -43,9 +39,7 @@ WITH feed_data AS ( ELSE NULL END AS feed FROM optimized_books b - UNION ALL - SELECT CASE WHEN m.last_watched IS NOT NULL THEN json_build_object( diff --git a/queries/views/feeds/oembed.sql b/queries/views/feeds/oembed.sql index 35acc32..fe2da3e 100644 --- a/queries/views/feeds/oembed.sql +++ b/queries/views/feeds/oembed.sql @@ -5,23 +5,16 @@ WITH oembed_data AS ( p.url::TEXT AS url, p.title AS title, p.description AS description, - CASE - WHEN df.filename_disk IS NOT NULL AND df.filename_disk != '' AND df.filename_disk != '/' THEN df.filename_disk - ELSE (SELECT g.avatar FROM optimized_globals g LIMIT 1) - END AS image_url, + COALESCE(NULLIF(p.metadata->>'open_graph_image', ''), (SELECT metadata->>'open_graph_image' FROM optimized_globals LIMIT 1)) AS image_url, p.date AS content_date FROM optimized_posts p - LEFT JOIN directus_files df ON p.image = df.filename_disk UNION ALL SELECT 'book' AS type, b.url::TEXT AS url, b.title AS title, b.description AS description, - CASE - WHEN b.image IS NOT NULL AND b.image != '' THEN b.image - ELSE (SELECT g.avatar FROM optimized_globals g LIMIT 1) - END AS image_url, + COALESCE(NULLIF(b.metadata->>'open_graph_image', ''), (SELECT metadata->>'open_graph_image' FROM optimized_globals LIMIT 1)) AS image_url, b.date_finished AS content_date FROM optimized_books b UNION ALL @@ -30,10 +23,7 @@ WITH oembed_data AS ( ar.url::TEXT AS url, ar.name AS title, ar.description AS description, - CASE - WHEN ar.image IS NOT NULL AND ar.image != '' THEN ar.image - ELSE (SELECT g.avatar FROM optimized_globals g LIMIT 1) - END AS image_url, + COALESCE(NULLIF(ar.metadata->>'open_graph_image', ''), (SELECT metadata->>'open_graph_image' FROM optimized_globals LIMIT 1)) AS image_url, CURRENT_TIMESTAMP AS content_date FROM optimized_artists ar UNION ALL @@ -42,34 +32,16 @@ WITH oembed_data AS ( g.url::TEXT AS url, g.name AS title, g.description AS description, - CASE - WHEN top_artist.image IS NOT NULL AND top_artist.image != '' THEN top_artist.image - ELSE (SELECT g.avatar FROM optimized_globals g LIMIT 1) - END AS image_url, + COALESCE(NULLIF(g.metadata->>'open_graph_image', ''), (SELECT metadata->>'open_graph_image' FROM optimized_globals LIMIT 1)) AS image_url, CURRENT_TIMESTAMP AS content_date FROM optimized_genres g - LEFT JOIN LATERAL ( - SELECT - CASE - WHEN df.filename_disk IS NOT NULL AND df.filename_disk != '' THEN CONCAT('/', df.filename_disk) - ELSE (SELECT avatar FROM optimized_globals LIMIT 1) - END AS image - FROM artists a - LEFT JOIN directus_files df ON a.art = df.id - WHERE a.genres = g.id - ORDER BY a.total_plays DESC - LIMIT 1 - ) top_artist ON true UNION ALL SELECT 'show' AS type, s.url::TEXT AS url, s.title AS title, s.description AS description, - CASE - WHEN s.image IS NOT NULL AND s.image != '' THEN s.image - ELSE (SELECT g.avatar FROM optimized_globals g LIMIT 1) - END AS image_url, + COALESCE(NULLIF(s.metadata->>'open_graph_image', ''), (SELECT metadata->>'open_graph_image' FROM optimized_globals LIMIT 1)) AS image_url, s.last_watched_at AS content_date FROM optimized_shows s UNION ALL @@ -78,10 +50,7 @@ WITH oembed_data AS ( m.url::TEXT AS url, m.title AS title, m.description AS description, - CASE - WHEN m.image IS NOT NULL AND m.image != '' THEN m.image - ELSE (SELECT g.avatar FROM optimized_globals g LIMIT 1) - END AS image_url, + COALESCE(NULLIF(m.metadata->>'open_graph_image', ''), (SELECT metadata->>'open_graph_image' FROM optimized_globals LIMIT 1)) AS image_url, m.last_watched AS content_date FROM optimized_movies m ) diff --git a/queries/views/globals/index.sql b/queries/views/globals/index.sql index bc7cef8..23a96df 100644 --- a/queries/views/globals/index.sql +++ b/queries/views/globals/index.sql @@ -1,25 +1,40 @@ CREATE OR REPLACE VIEW optimized_globals AS -SELECT - g.site_name, - g.site_description, - g.intro, - g.author, - g.email, - g.mastodon, - g.url, - g.cdn_url, - g.sitemap_uri, - g.theme_color, - g.site_type, - g.locale, - g.lang, - g.webfinger_username, - g.webfinger_hostname, - CONCAT('/', df.filename_disk) AS avatar, - CONCAT('/', df2.filename_disk) AS avatar_transparent, - CONCAT('/', df3.filename_disk) AS avatar_header -FROM - globals g +SELECT * +FROM ( + SELECT + g.site_name, + g.site_description, + g.intro, + g.author, + g.email, + g.mastodon, + g.url, + g.cdn_url, + g.sitemap_uri, + g.theme_color, + g.site_type, + g.locale, + g.lang, + g.webfinger_username, + g.webfinger_hostname, + CONCAT(g.cdn_url, '/', df.filename_disk) AS avatar, + CONCAT(g.cdn_url, '/', df2.filename_disk) AS avatar_transparent, + CONCAT(g.cdn_url, '/', df3.filename_disk) AS avatar_header, + json_build_object( + 'open_graph_image', CASE + WHEN df.filename_disk IS NOT NULL AND df.filename_disk != '' AND df.filename_disk != '/' THEN + CONCAT('/', df.filename_disk) + ELSE NULL + END, + 'open_graph_image_transparent', CASE + WHEN df2.filename_disk IS NOT NULL AND df2.filename_disk != '' AND df2.filename_disk != '/' THEN + CONCAT('/', df2.filename_disk) + ELSE NULL + END + ) AS metadata + FROM globals g LEFT JOIN directus_files df ON g.avatar = df.id LEFT JOIN directus_files df2 ON g.avatar_transparent = df2.id LEFT JOIN directus_files df3 ON g.avatar_header = df3.id + LIMIT 1 +) sub; diff --git a/queries/views/globals/pages.sql b/queries/views/globals/pages.sql index 0fb2543..a36c41e 100644 --- a/queries/views/globals/pages.sql +++ b/queries/views/globals/pages.sql @@ -4,7 +4,13 @@ SELECT p.title, p.permalink, p.description, - CONCAT('/', df.filename_disk) AS open_graph_image, + json_build_object( + 'open_graph_image', CASE + WHEN df.filename_disk IS NOT NULL AND df.filename_disk != '' AND df.filename_disk != '/' THEN + CONCAT('/', df.filename_disk) + ELSE NULL + END + ) AS metadata, p.updated, ( SELECT @@ -52,7 +58,8 @@ WHERE FROM pages p LEFT JOIN directus_files df ON p.open_graph_image = df.id + CROSS JOIN optimized_globals globals GROUP BY p.id, - df.filename_disk; - + df.filename_disk, + globals.cdn_url; diff --git a/queries/views/media/books.sql b/queries/views/media/books.sql index b13ced2..bd05c93 100644 --- a/queries/views/media/books.sql +++ b/queries/views/media/books.sql @@ -10,98 +10,175 @@ SELECT b.star_rating AS rating, b.review, b.slug AS url, - CONCAT('/', df.filename_disk) AS image, + CONCAT(globals.cdn_url, '/', df.filename_disk) AS image, b.favorite, b.tattoo, -( - SELECT - array_agg(t.name) - FROM - books_tags bt + ( + SELECT array_agg(t.name) + FROM books_tags bt LEFT JOIN tags t ON bt.tags_id = t.id - WHERE - bt.books_id = b.id) AS tags, -( - SELECT - json_agg(json_build_object('name', a.name_string, 'url', a.slug, 'country', a.country, 'total_plays', a.total_plays) - ORDER BY a.name_string ASC) - FROM - books_artists ba - LEFT JOIN artists a ON ba.artists_id = a.id - WHERE - ba.books_id = b.id) AS artists, -( - SELECT - json_agg(json_build_object('title', m.title, 'year', m.year, 'url', m.slug) - ORDER BY m.year DESC) - FROM - movies_books mb - LEFT JOIN movies m ON mb.movies_id = m.id - WHERE - mb.books_id = b.id) AS movies, -( - SELECT - json_agg(json_build_object('name', g.name, 'url', g.slug) - ORDER BY g.name ASC) - FROM - genres_books gb - LEFT JOIN genres g ON gb.genres_id = g.id - WHERE - gb.books_id = b.id) AS genres, -( - SELECT - json_agg(json_build_object('title', s.title, 'year', s.year, 'url', s.slug) - ORDER BY s.year DESC) - FROM - shows_books sb - LEFT JOIN shows s ON sb.shows_id = s.id - WHERE - sb.books_id = b.id) AS shows, -( - SELECT - json_agg(json_build_object('title', p.title, 'date', p.date, 'url', p.slug) - ORDER BY p.date DESC) - FROM - posts_books pb - LEFT JOIN posts p ON pb.posts_id = p.id - WHERE - pb.books_id = b.id) AS posts, -( - SELECT - json_agg(json_build_object('title', rb.title, 'author', rb.author, 'url', rb.slug) - ORDER BY rb.title ASC) - FROM - related_books rbk - LEFT JOIN books rb ON rbk.related_books_id = rb.id - WHERE - rbk.books_id = b.id) AS related_books, - json_build_object( - 'title', NULL, - 'image', CONCAT('/', df.filename_disk), - 'url', b.slug, - 'alt', CONCAT('Book cover from ', b.title, ' by ', b.author), - 'subtext', CASE - WHEN b.star_rating IS NOT NULL THEN b.star_rating::text - ELSE NULL - END - ) AS grid, -CASE - WHEN LOWER(b.read_status) = 'finished' AND b.star_rating IS NOT NULL THEN - json_build_object( - 'title', CONCAT(b.title, ' by ', b.author, ' (', b.star_rating, ')'), - 'url', b.slug, - 'date', b.date_finished, - 'description', COALESCE(b.review, b.description), - 'image', CONCAT('/', df.filename_disk), - 'rating', b.star_rating + WHERE bt.books_id = b.id + ) AS tags, + ( + SELECT json_agg( + json_build_object( + 'name', a.name_string, + 'url', a.slug, + 'country', a.country, + 'total_plays', a.total_plays, + 'image', CONCAT(globals.cdn_url, '/', df_artist.filename_disk), + 'grid', json_build_object( + 'title', a.name_string, + 'image', CONCAT(globals.cdn_url, '/', df_artist.filename_disk), + 'alt', CASE WHEN a.total_plays > 0 THEN CONCAT(to_char(a.total_plays, 'FM999,999,999,999'), ' plays of ', a.name_string) ELSE CONCAT('Artwork of ', a.name_string) END, + 'subtext', CASE WHEN a.total_plays > 0 THEN CONCAT(to_char(a.total_plays, 'FM999,999,999,999'), ' plays') ELSE NULL END, + 'url', a.slug + ), + 'type', 'music' + ) + ORDER BY a.total_plays DESC ) - ELSE - NULL -END AS feed, -(SELECT TO_CHAR(days_read, 'FM999G999G999') FROM reading_streak LIMIT 1) AS days_read -FROM - books b - LEFT JOIN directus_files df ON b.art = df.id -GROUP BY - b.id, - df.filename_disk; + FROM books_artists ba + LEFT JOIN artists a ON ba.artists_id = a.id + LEFT JOIN directus_files df_artist ON a.art = df_artist.id + WHERE ba.books_id = b.id + ) AS artists, + ( + SELECT json_agg( + json_build_object( + 'title', m.title, + 'year', m.year, + 'url', m.slug, + 'image', CONCAT(globals.cdn_url, '/', df_movie.filename_disk), + 'grid', json_build_object( + 'title', NULL, + 'image', CONCAT(globals.cdn_url, '/', df_movie.filename_disk), + 'alt', CONCAT('Poster for ', m.title, ' (', m.year, ')'), + 'subtext', CASE WHEN m.star_rating IS NOT NULL THEN m.star_rating::text ELSE m.year::text END, + 'url', m.slug + ), + 'type', 'movies' + ) + ORDER BY m.year ASC + ) + FROM movies_books mb + LEFT JOIN movies m ON mb.movies_id = m.id + LEFT JOIN directus_files df_movie ON m.art = df_movie.id + WHERE mb.books_id = b.id + AND m.last_watched IS NOT NULL + ) AS movies, + ( + SELECT json_agg( + json_build_object('name', g.name, 'url', g.slug) + ORDER BY g.name ASC + ) + FROM genres_books gb + LEFT JOIN genres g ON gb.genres_id = g.id + WHERE gb.books_id = b.id + ) AS genres, + ( + SELECT json_agg( + json_build_object( + 'title', s.title, + 'year', s.year, + 'url', s.slug, + 'image', CONCAT(globals.cdn_url, '/', df_show.filename_disk), + 'grid', json_build_object( + 'title', NULL, + 'image', CONCAT(globals.cdn_url, '/', df_show.filename_disk), + 'alt', CONCAT('Artwork for ', s.title), + 'subtext', CASE + WHEN ( + SELECT MAX(e1.last_watched_at) + FROM episodes e1 + WHERE e1.show = s.id + ) >= NOW() - INTERVAL '90 days' THEN ( + SELECT CONCAT('S', e2.season_number, 'E', e2.episode_number) + FROM episodes e2 + WHERE e2.show = s.id + ORDER BY e2.last_watched_at DESC, e2.season_number DESC, e2.episode_number DESC + LIMIT 1 + ) + ELSE s.year::text + END, + 'url', s.slug + ), + 'type', 'tv' + ) + ORDER BY s.year ASC + ) + FROM shows_books sb + LEFT JOIN shows s ON sb.shows_id = s.id + LEFT JOIN directus_files df_show ON s.art = df_show.id + WHERE sb.books_id = b.id + AND EXISTS ( + SELECT 1 + FROM episodes e + WHERE e.show = s.id + AND e.last_watched_at IS NOT NULL + ) + ) AS shows, + ( + SELECT json_agg( + json_build_object('title', p.title, 'date', p.date, 'url', p.slug) + ORDER BY p.date DESC + ) + FROM posts_books pb + LEFT JOIN posts p ON pb.posts_id = p.id + WHERE pb.books_id = b.id + ) AS posts, + ( + SELECT json_agg( + json_build_object( + 'title', rb.title, + 'author', rb.author, + 'url', rb.slug, + 'image', CONCAT(globals.cdn_url, '/', df_rb.filename_disk), + 'grid', json_build_object( + 'title', NULL, + 'image', CONCAT(globals.cdn_url, '/', df_rb.filename_disk), + 'alt', CONCAT('Cover for ', rb.title, ' by ', rb.author), + 'subtext', CASE WHEN rb.star_rating IS NOT NULL THEN rb.star_rating ELSE NULL END, + 'url', rb.slug + ), + 'type', 'books' + ) + ORDER BY rb.title ASC + ) + FROM related_books rbk + LEFT JOIN books rb ON rbk.related_books_id = rb.id + LEFT JOIN directus_files df_rb ON rb.art = df_rb.id + WHERE rbk.books_id = b.id + AND LOWER(b.read_status) = 'finished' + ) AS related_books, + json_build_object( + 'title', NULL, + 'image', CONCAT(globals.cdn_url, '/', df.filename_disk), + 'url', b.slug, + 'alt', CONCAT('Book cover from ', b.title, ' by ', b.author), + 'subtext', CASE WHEN b.star_rating IS NOT NULL THEN b.star_rating::text ELSE NULL END, + 'type', 'books' + ) AS grid, + CASE + WHEN LOWER(b.read_status) = 'finished' AND b.star_rating IS NOT NULL THEN + json_build_object( + 'title', CONCAT(b.title, ' by ', b.author, ' (', b.star_rating, ')'), + 'url', b.slug, + 'date', b.date_finished, + 'description', COALESCE(b.review, b.description), + 'image', CONCAT(globals.cdn_url, '/', df.filename_disk), + 'rating', b.star_rating + ) + ELSE NULL + END AS feed, + (SELECT TO_CHAR(days_read, 'FM999G999G999') FROM reading_streak LIMIT 1) AS days_read, + json_build_object( + 'open_graph_image', CASE + WHEN df.filename_disk IS NOT NULL AND df.filename_disk != '' AND df.filename_disk != '/' THEN CONCAT('/', df.filename_disk) + ELSE NULL + END + ) AS metadata +FROM books b +LEFT JOIN directus_files df ON b.art = df.id +CROSS JOIN optimized_globals globals +GROUP BY b.id, df.filename_disk, globals.cdn_url; diff --git a/queries/views/media/movies.sql b/queries/views/media/movies.sql index 3d78b31..b47c794 100644 --- a/queries/views/media/movies.sql +++ b/queries/views/media/movies.sql @@ -12,108 +12,182 @@ SELECT m.description, m.review, m.slug AS url, - CONCAT('/', df.filename_disk) AS image, - CONCAT('/', df2.filename_disk) AS backdrop, + CONCAT(globals.cdn_url, '/', df.filename_disk) AS image, + CONCAT(globals.cdn_url, '/', df2.filename_disk) AS backdrop, json_build_object( - 'title', NULL, + 'title', m.title, 'url', m.slug, - 'image', CONCAT('/', df.filename_disk), - 'backdrop', CONCAT('/', df2.filename_disk), + 'image', CONCAT(globals.cdn_url, '/', df.filename_disk), + 'backdrop', CONCAT(globals.cdn_url, '/', df2.filename_disk), 'alt', CONCAT('Poster from ', m.title), 'subtext', CASE - WHEN m.last_watched >= NOW() - INTERVAL '90 days' THEN - m.star_rating::text - ELSE - m.year::text - END + WHEN m.last_watched >= NOW() - INTERVAL '90 days' THEN m.star_rating::text + ELSE m.year::text + END, + 'type', 'movies' ) AS grid, ( - SELECT - array_agg(t.name) - FROM - movies_tags mt + SELECT array_agg(t.name) + FROM movies_tags mt LEFT JOIN tags t ON mt.tags_id = t.id - WHERE - mt.movies_id = m.id) AS tags, -( - SELECT - json_agg(json_build_object('name', g.name, 'url', g.slug) + WHERE mt.movies_id = m.id + ) AS tags, + ( + SELECT json_agg(json_build_object('name', g.name, 'url', g.slug) ORDER BY g.name ASC) - FROM - genres_movies gm - LEFT JOIN genres g ON gm.genres_id = g.id -WHERE - gm.movies_id = m.id) AS genres, -( - SELECT - json_agg(json_build_object('name', a.name_string, 'url', a.slug, 'country', a.country, 'total_plays', a.total_plays) - ORDER BY a.name_string ASC) - FROM - movies_artists ma - LEFT JOIN artists a ON ma.artists_id = a.id -WHERE - ma.movies_id = m.id) AS artists, -( - SELECT - json_agg(json_build_object('title', b.title, 'author', b.author, 'url', b.slug) - ORDER BY b.title ASC) - FROM - movies_books mb - LEFT JOIN books b ON mb.books_id = b.id -WHERE - mb.movies_id = m.id) AS books, -( - SELECT - json_agg(json_build_object('title', s.title, 'year', s.year, 'url', s.slug) - ORDER BY s.year DESC) - FROM - shows_movies sm - LEFT JOIN shows s ON sm.shows_id = s.id -WHERE - sm.movies_id = m.id) AS shows, -( - SELECT - json_agg(json_build_object('title', p.title, 'date', p.date, 'url', p.slug) - ORDER BY p.date DESC) - FROM - posts_movies pm - LEFT JOIN posts p ON pm.posts_id = p.id -WHERE - pm.movies_id = m.id) AS posts, -( - SELECT - json_agg(json_build_object('title', rm.title, 'year', rm.year, 'url', rm.slug) - ORDER BY rm.year DESC) - FROM - related_movies r - LEFT JOIN movies rm ON r.related_movies_id = rm.id -WHERE - r.movies_id = m.id) AS related_movies, -CASE - WHEN m.star_rating IS NOT NULL AND m.last_watched IS NOT NULL THEN - json_build_object( - 'title', CONCAT(m.title, CASE - WHEN m.star_rating IS NOT NULL THEN CONCAT(' (', m.star_rating, ')') - ELSE '' - END), - 'url', m.slug, - 'date', m.last_watched, - 'description', COALESCE(m.review, m.description), - 'image', CONCAT('/', df.filename_disk), - 'rating', m.star_rating + FROM genres_movies gm + LEFT JOIN genres g ON gm.genres_id = g.id + WHERE gm.movies_id = m.id + ) AS genres, + ( + SELECT json_agg( + json_build_object( + 'name', a.name_string, + 'url', a.slug, + 'country', a.country, + 'total_plays', a.total_plays, + 'image', CONCAT(globals.cdn_url, '/', df_artist.filename_disk), + 'grid', json_build_object( + 'title', a.name_string, + 'image', CONCAT(globals.cdn_url, '/', df_artist.filename_disk), + 'alt', CASE + WHEN a.total_plays > 0 THEN CONCAT(to_char(a.total_plays, 'FM999,999,999,999'), ' plays of ', a.name_string) + ELSE CONCAT('Artwork of ', a.name_string) + END, + 'subtext', CASE + WHEN a.total_plays > 0 THEN CONCAT(to_char(a.total_plays, 'FM999,999,999,999'), ' plays') + ELSE NULL + END, + 'url', a.slug + ), + 'type', 'music' + ) + ORDER BY a.total_plays DESC ) - ELSE - NULL -END AS feed -FROM - movies m - LEFT JOIN directus_files df ON m.art = df.id - LEFT JOIN directus_files df2 ON m.backdrop = df2.id -GROUP BY - m.id, - df.filename_disk, - df2.filename_disk -ORDER BY - m.last_watched DESC, - m.favorite DESC, - m.title ASC; + FROM movies_artists ma + LEFT JOIN artists a ON ma.artists_id = a.id + LEFT JOIN directus_files df_artist ON a.art = df_artist.id + WHERE ma.movies_id = m.id + ) AS artists, + ( + SELECT json_agg( + json_build_object( + 'title', b.title, + 'author', b.author, + 'url', b.slug, + 'image', CONCAT(globals.cdn_url, '/', df_book.filename_disk), + 'grid', json_build_object( + 'title', b.title, + 'image', CONCAT(globals.cdn_url, '/', df_book.filename_disk), + 'alt', CONCAT('Cover for ', b.title, ' by ', b.author), + 'subtext', b.author, + 'url', b.slug + ), + 'type', 'books' + ) + ORDER BY b.title + ) + FROM movies_books mb + LEFT JOIN books b ON mb.books_id = b.id + LEFT JOIN directus_files df_book ON b.art = df_book.id + WHERE mb.movies_id = m.id + AND LOWER(b.read_status) = 'finished' + ) AS books, + ( + SELECT json_agg( + json_build_object( + 'title', s.title, + 'year', s.year, + 'url', s.slug, + 'image', CONCAT(globals.cdn_url, '/', df_show.filename_disk), + 'grid', json_build_object( + 'title', NULL, + 'image', CONCAT(globals.cdn_url, '/', df_show.filename_disk), + 'alt', CONCAT('Artwork for ', s.title), + 'subtext', CASE + WHEN ( + SELECT MAX(e1.last_watched_at) + FROM episodes e1 + WHERE e1.show = s.id + ) >= NOW() - INTERVAL '90 days' THEN ( + SELECT CONCAT('S', e2.season_number, 'E', e2.episode_number) + FROM episodes e2 + WHERE e2.show = s.id + ORDER BY e2.last_watched_at DESC, e2.season_number DESC, e2.episode_number DESC + LIMIT 1 + ) + ELSE s.year::text + END, + 'url', s.slug + ), + 'type', 'tv' + ) + ORDER BY s.year ASC + ) + FROM shows_movies sm + LEFT JOIN shows s ON sm.shows_id = s.id + LEFT JOIN directus_files df_show ON s.art = df_show.id + WHERE sm.movies_id = m.id + AND EXISTS ( + SELECT 1 + FROM episodes e + WHERE e.show = s.id + AND e.last_watched_at IS NOT NULL + ) + ) AS shows, + ( + SELECT json_agg(json_build_object('title', p.title, 'date', p.date, 'url', p.slug) + ORDER BY p.date DESC) + FROM posts_movies pm + LEFT JOIN posts p ON pm.posts_id = p.id + WHERE pm.movies_id = m.id + ) AS posts, + ( + SELECT json_agg( + json_build_object( + 'title', rm.title, + 'year', rm.year, + 'url', rm.slug, + 'image', CONCAT(globals.cdn_url, '/', df_related.filename_disk), + 'grid', json_build_object( + 'title', rm.title, + 'image', CONCAT(globals.cdn_url, '/', df_related.filename_disk), + 'alt', CONCAT('Poster for ', rm.title), + 'subtext', CASE WHEN rm.last_watched IS NOT NULL THEN rm.star_rating::text ELSE rm.year::text END, + 'url', rm.slug + ), + 'type', 'movies' + ) + ORDER BY rm.year ASC + ) + FROM related_movies r + LEFT JOIN movies rm ON r.related_movies_id = rm.id + LEFT JOIN directus_files df_related ON rm.art = df_related.id + WHERE r.movies_id = m.id + AND rm.last_watched IS NOT NULL + ) AS related_movies, + CASE + WHEN m.star_rating IS NOT NULL AND m.last_watched IS NOT NULL THEN + json_build_object( + 'title', CONCAT(m.title, ' (', m.star_rating, ')'), + 'url', m.slug, + 'date', m.last_watched, + 'description', COALESCE(m.review, m.description), + 'image', CONCAT(globals.cdn_url, '/', df.filename_disk), + 'rating', m.star_rating + ) + ELSE NULL + END AS feed, + json_build_object( + 'open_graph_image', CASE + WHEN df2.filename_disk IS NOT NULL AND df2.filename_disk != '' AND df2.filename_disk != '/' THEN + CONCAT('/', df2.filename_disk) + ELSE NULL + END + ) AS metadata +FROM movies m +LEFT JOIN directus_files df ON m.art = df.id +LEFT JOIN directus_files df2 ON m.backdrop = df2.id +CROSS JOIN optimized_globals globals +GROUP BY m.id, df.filename_disk, df2.filename_disk, globals.cdn_url +ORDER BY m.last_watched DESC; diff --git a/queries/views/media/music/album_releases.sql b/queries/views/media/music/album_releases.sql index 0babbf4..d57b5c9 100644 --- a/queries/views/media/music/album_releases.sql +++ b/queries/views/media/music/album_releases.sql @@ -9,7 +9,7 @@ SELECT EXTRACT(EPOCH FROM a.release_date) AS release_timestamp, json_build_object( 'title', a.name, - 'image', CONCAT('/', df.filename_disk), + 'image', CONCAT(globals.cdn_url, '/', df.filename_disk), 'url', COALESCE(a.release_link, ar.slug), 'alt', CONCAT(a.name, ' by ', ar.name_string), 'subtext', CONCAT(ar.name_string, ' • ', TO_CHAR(a.release_date, 'Mon FMDD, YYYY')) @@ -18,5 +18,6 @@ FROM albums a LEFT JOIN directus_files df ON a.art = df.id LEFT JOIN artists ar ON a.artist = ar.id + CROSS JOIN optimized_globals globals WHERE a.release_date IS NOT NULL; diff --git a/queries/views/media/music/albums.sql b/queries/views/media/music/albums.sql index d427923..5458f68 100644 --- a/queries/views/media/music/albums.sql +++ b/queries/views/media/music/albums.sql @@ -6,10 +6,10 @@ SELECT al.total_plays AS total_plays_raw, ar.name_string AS artist_name, ar.slug AS artist_url, - CONCAT('/', df_album.filename_disk) AS image, + CONCAT(globals.cdn_url, '/', df_album.filename_disk) AS image, json_build_object( 'title', al.name, - 'image', CONCAT('/', df_album.filename_disk), + 'image', CONCAT(globals.cdn_url, '/', df_album.filename_disk), 'url', ar.slug, 'alt', CONCAT('Cover for ', al.name, ' by ', ar.name_string), 'subtext', CONCAT(to_char(al.total_plays, 'FM999,999,999,999'), ' plays') @@ -18,7 +18,7 @@ SELECT 'title', al.name, 'artist', ar.name_string, 'plays', to_char(al.total_plays, 'FM999,999,999,999'), - 'image', CONCAT('/', df_album.filename_disk), + 'image', CONCAT(globals.cdn_url, '/', df_album.filename_disk), 'url', ar.slug, 'year', al.release_year, 'alt', CONCAT('Cover for ', al.name, ' by ', ar.name_string) @@ -26,4 +26,5 @@ SELECT FROM albums al LEFT JOIN artists ar ON al.artist = ar.id LEFT JOIN directus_files df_album ON al.art = df_album.id -GROUP BY al.id, ar.name_string, ar.slug, df_album.filename_disk; +CROSS JOIN optimized_globals globals +GROUP BY al.id, ar.name_string, ar.slug, df_album.filename_disk, globals.cdn_url; diff --git a/queries/views/media/music/artists.sql b/queries/views/media/music/artists.sql index af8bc15..1d7ee60 100644 --- a/queries/views/media/music/artists.sql +++ b/queries/views/media/music/artists.sql @@ -14,13 +14,13 @@ SELECT json_build_object('name', g.name, 'url', g.slug, 'emoji', g.emoji) AS genre, ar.emoji, ar.tattoo, - CONCAT('/', df.filename_disk) AS image, + CONCAT(globals.cdn_url, '/', df.filename_disk) AS image, json_build_object( 'title', ar.name_string, - 'image', CONCAT('/', df.filename_disk), + 'image', CONCAT(globals.cdn_url, '/', df.filename_disk), 'url', ar.slug, - 'alt', CONCAT(to_char(ar.total_plays, 'FM999,999,999,999'), ' plays of ', ar.name_string), - 'subtext', CONCAT(to_char(ar.total_plays, 'FM999,999,999,999'), ' plays') + 'alt', CASE WHEN ar.total_plays > 0 THEN CONCAT(to_char(ar.total_plays, 'FM999,999,999,999'), ' plays of ', ar.name_string) ELSE CONCAT('Artwork of ', ar.name_string) END, + 'subtext', CASE WHEN ar.total_plays > 0 THEN CONCAT(to_char(ar.total_plays, 'FM999,999,999,999'), ' plays') ELSE NULL END ) AS grid, json_build_object( 'title', ar.name_string, @@ -28,7 +28,7 @@ SELECT 'genre_url', g.slug, 'emoji', COALESCE(ar.emoji, g.emoji), 'plays', to_char(ar.total_plays, 'FM999,999,999,999'), - 'image', CONCAT('/', df.filename_disk), + 'image', CONCAT(globals.cdn_url, '/', df.filename_disk), 'url', ar.slug, 'alt', CONCAT(to_char(ar.total_plays, 'FM999,999,999,999'), ' plays of ', ar.name_string) ) AS table, @@ -41,15 +41,11 @@ SELECT 'art', df_album.filename_disk, 'grid', json_build_object( 'title', a.name, - 'image', CONCAT('/', df_album.filename_disk), - 'alt', CONCAT(to_char(a.total_plays, 'FM999,999,999,999'), ' plays of ', a.name), - 'subtext', - CASE - WHEN a.total_plays > 0 - THEN CONCAT(a.release_year, ' • ', to_char(a.total_plays, 'FM999,999,999,999'), ' plays') - ELSE CONCAT(a.release_year, '') - END - ) + 'image', CONCAT(globals.cdn_url, '/', df_album.filename_disk), + 'alt', CASE WHEN a.total_plays > 0 THEN CONCAT(to_char(a.total_plays, 'FM999,999,999,999'), ' plays of ', a.name) ELSE CONCAT('Artwork for ', a.name) END, + 'subtext', CASE WHEN a.total_plays > 0 THEN CONCAT(a.release_year, ' • ', to_char(a.total_plays, 'FM999,999,999,999'), ' plays') ELSE a.release_year::text END + ), + 'type', 'albums' ) ORDER BY a.release_year ) @@ -76,60 +72,127 @@ SELECT ) AS concerts, ( SELECT json_agg( - json_build_object('title', b.title, 'author', b.author, 'url', b.slug) + json_build_object( + 'title', b.title, + 'author', b.author, + 'url', b.slug, + 'image', CONCAT(globals.cdn_url, '/', df_book.filename_disk), + 'grid', json_build_object( + 'title', NULL, + 'image', CONCAT(globals.cdn_url, '/', df_book.filename_disk), + 'alt', CONCAT('Cover for ', b.title, ' by ', b.author), + 'subtext', CASE WHEN b.star_rating IS NOT NULL THEN b.star_rating ELSE NULL END, + 'url', b.slug + ), + 'type', 'books' + ) ORDER BY b.title ASC ) FROM books_artists ba LEFT JOIN books b ON ba.books_id = b.id + LEFT JOIN directus_files df_book ON b.art = df_book.id WHERE ba.artists_id = ar.id + AND LOWER(b.read_status) = 'finished' ) AS books, ( SELECT json_agg( - json_build_object('title', m.title, 'year', m.year, 'url', m.slug) - ORDER BY m.year DESC + json_build_object( + 'title', m.title, + 'year', m.year, + 'url', m.slug, + 'image', CONCAT(globals.cdn_url, '/', df_movie.filename_disk), + 'grid', json_build_object( + 'title', NULL, + 'image', CONCAT(globals.cdn_url, '/', df_movie.filename_disk), + 'alt', CONCAT('Poster for ', m.title, ' (', m.year, ')'), + 'subtext', CASE WHEN m.star_rating IS NOT NULL THEN m.star_rating::text ELSE m.year::text END, + 'url', m.slug + ), + 'type', 'movies' + ) + ORDER BY m.year ASC ) FROM movies_artists ma LEFT JOIN movies m ON ma.movies_id = m.id + LEFT JOIN directus_files df_movie ON m.art = df_movie.id WHERE ma.artists_id = ar.id + AND m.last_watched IS NOT NULL ) AS movies, ( SELECT json_agg( - json_build_object('title', s.title, 'year', s.year, 'url', s.slug) - ORDER BY s.year DESC + json_build_object( + 'title', s.title, + 'year', s.year, + 'url', s.slug, + 'image', CONCAT(globals.cdn_url, '/', df_show.filename_disk), + 'grid', json_build_object( + 'title', NULL, + 'image', CONCAT(globals.cdn_url, '/', df_show.filename_disk), + 'alt', CONCAT('Artwork for ', s.title), + 'subtext', CASE + WHEN ( + SELECT MAX(e1.last_watched_at) + FROM episodes e1 + WHERE e1.show = s.id + ) >= NOW() - INTERVAL '90 days' THEN + ( + SELECT CONCAT('S', e2.season_number, 'E', e2.episode_number) + FROM episodes e2 + WHERE e2.show = s.id + ORDER BY e2.last_watched_at DESC, e2.season_number DESC, e2.episode_number DESC + LIMIT 1 + ) + ELSE s.year::text + END, + 'url', s.slug + ), + 'type', 'tv' + ) + ORDER BY s.year ASC ) FROM shows_artists sa LEFT JOIN shows s ON sa.shows_id = s.id + LEFT JOIN directus_files df_show ON s.art = df_show.id WHERE sa.artists_id = ar.id + AND EXISTS ( + SELECT 1 + FROM episodes e + WHERE e.show = s.id + AND e.last_watched_at IS NOT NULL + ) ) AS shows, - ( - SELECT json_agg( - json_build_object('title', p.title, 'date', p.date, 'url', p.slug) - ORDER BY p.date DESC - ) - FROM posts_artists pa - LEFT JOIN posts p ON pa.posts_id = p.id - WHERE pa.artists_id = ar.id - ) AS posts, ( SELECT json_agg( json_build_object( 'name', related_ar.name_string, 'url', related_ar.slug, 'country', related_ar.country, - 'total_plays', to_char(related_ar.total_plays, 'FM999,999,999,999') + 'total_plays', to_char(related_ar.total_plays, 'FM999,999,999,999'), + 'image', CONCAT(globals.cdn_url, '/', df_related.filename_disk), + 'grid', json_build_object( + 'title', related_ar.name_string, + 'image', CONCAT(globals.cdn_url, '/', df_related.filename_disk), + 'alt', CASE WHEN related_ar.total_plays > 0 THEN CONCAT(to_char(related_ar.total_plays, 'FM999,999,999,999'), ' plays of ', related_ar.name_string) ELSE CONCAT('Artwork of ', related_ar.name_string) END, + 'subtext', CASE WHEN related_ar.total_plays > 0 THEN CONCAT(to_char(related_ar.total_plays, 'FM999,999,999,999'), ' plays') ELSE NULL END, + 'url', related_ar.slug + ), + 'type', 'music' ) - ORDER BY related_ar.name_string + ORDER BY related_ar.total_plays DESC ) FROM related_artists ra LEFT JOIN artists related_ar ON ra.related_artists_id = related_ar.id + LEFT JOIN directus_files df_related ON related_ar.art = df_related.id WHERE ra.artists_id = ar.id - ) AS related_artists + ) AS related_artists, + json_build_object( + 'open_graph_image', CASE + WHEN df.filename_disk IS NOT NULL AND df.filename_disk != '' AND df.filename_disk != '/' THEN CONCAT('/', df.filename_disk) + ELSE NULL + END + ) AS metadata FROM artists ar LEFT JOIN directus_files df ON ar.art = df.id LEFT JOIN genres g ON ar.genres = g.id -GROUP BY - ar.id, - df.filename_disk, - g.name, - g.slug, - g.emoji; +CROSS JOIN optimized_globals globals +GROUP BY ar.id, df.filename_disk, g.name, g.slug, g.emoji, globals.cdn_url; diff --git a/queries/views/media/music/genres.sql b/queries/views/media/music/genres.sql index 7709a84..1ee9f90 100644 --- a/queries/views/media/music/genres.sql +++ b/queries/views/media/music/genres.sql @@ -7,44 +7,116 @@ SELECT to_char(g.total_plays, 'FM999,999,999,999') AS total_plays, g.wiki_link, g.slug AS url, -( - SELECT - json_agg(json_build_object('name', a.name_string, 'url', a.slug, 'image', CONCAT('/', df_artist.filename_disk), 'total_plays', to_char(a.total_plays, 'FM999,999,999,999')) - ORDER BY a.total_plays DESC) - FROM - artists a + ( + SELECT json_agg( + json_build_object( + 'name', a.name_string, + 'url', a.slug, + 'image', CONCAT(globals.cdn_url, '/', df_artist.filename_disk), + 'total_plays', to_char(a.total_plays, 'FM999,999,999,999'), + 'grid', json_build_object( + 'title', a.name_string, + 'image', CONCAT(globals.cdn_url, '/', df_artist.filename_disk), + 'alt', CASE + WHEN a.total_plays > 0 THEN CONCAT(to_char(a.total_plays, 'FM999,999,999,999'), ' plays of ', a.name_string) + ELSE CONCAT('Artwork of ', a.name_string) + END, + 'subtext', CASE + WHEN a.total_plays > 0 THEN CONCAT(to_char(a.total_plays, 'FM999,999,999,999'), ' plays') + ELSE NULL + END, + 'url', a.slug + ), + 'type', 'music' + ) + ORDER BY a.total_plays DESC + ) + FROM artists a LEFT JOIN directus_files df_artist ON a.art = df_artist.id - WHERE - a.genres = g.id) AS artists, -( - SELECT - json_agg(json_build_object('title', b.title, 'author', b.author, 'url', b.slug) - ORDER BY b.title ASC) - FROM - books b - JOIN genres_books gb ON gb.books_id = b.id - WHERE - gb.genres_id = g.id) AS books, -( - SELECT - json_agg(json_build_object('title', m.title, 'year', m.year, 'url', m.slug) - ORDER BY m.year DESC) - FROM - movies m - JOIN genres_movies gm ON gm.movies_id = m.id - WHERE - gm.genres_id = g.id) AS movies, -( - SELECT - json_agg(json_build_object('title', p.title, 'date', p.date, 'url', p.slug) - ORDER BY p.date DESC) - FROM - posts_genres pg - LEFT JOIN posts p ON pg.posts_id = p.id - WHERE - pg.genres_id = g.id) AS posts - FROM - genres g - ORDER BY - g.id ASC; - + WHERE a.genres = g.id + ) AS artists, + ( + SELECT json_agg( + json_build_object( + 'title', b.title, + 'author', b.author, + 'url', b.slug, + 'image', CONCAT(globals.cdn_url, '/', df_book.filename_disk), + 'grid', json_build_object( + 'title', NULL, + 'image', CONCAT(globals.cdn_url, '/', df_book.filename_disk), + 'alt', CONCAT('Cover for ', b.title, ' by ', b.author), + 'subtext', CASE WHEN b.star_rating IS NOT NULL THEN b.star_rating ELSE NULL END, + 'url', b.slug + ), + 'type', 'books' + ) + ORDER BY b.title ASC + ) + FROM books b + JOIN genres_books gb ON gb.books_id = b.id + LEFT JOIN directus_files df_book ON b.art = df_book.id + WHERE gb.genres_id = g.id + AND LOWER(b.read_status) = 'finished' + ) AS books, + ( + SELECT json_agg( + json_build_object( + 'title', m.title, + 'year', m.year, + 'url', m.slug, + 'image', CONCAT(globals.cdn_url, '/', df_movie.filename_disk), + 'grid', json_build_object( + 'title', NULL, + 'image', CONCAT(globals.cdn_url, '/', df_movie.filename_disk), + 'alt', CONCAT('Poster for ', m.title, ' (', m.year, ')'), + 'subtext', CASE WHEN m.star_rating IS NOT NULL THEN m.star_rating::text ELSE m.year::text END, + 'url', m.slug + ), + 'type', 'movies' + ) + ORDER BY m.year ASC + ) + FROM movies m + JOIN genres_movies gm ON gm.movies_id = m.id + LEFT JOIN directus_files df_movie ON m.art = df_movie.id + WHERE gm.genres_id = g.id + AND m.last_watched IS NOT NULL + ) AS movies, + ( + SELECT json_agg( + json_build_object( + 'title', p.title, + 'date', p.date, + 'url', p.slug, + 'grid', json_build_object( + 'title', p.title, + 'image', CONCAT(globals.cdn_url, '/', df_post.filename_disk), + 'alt', p.title, + 'subtext', TO_CHAR(p.date, 'FMMonth DD, YYYY'), + 'url', p.slug + ), + 'type', 'posts' + ) + ORDER BY p.date DESC + ) + FROM posts_genres pg + LEFT JOIN posts p ON pg.posts_id = p.id + LEFT JOIN directus_files df_post ON p.image = df_post.id + WHERE pg.genres_id = g.id + ) AS posts, + json_build_object( + 'open_graph_image', ( + SELECT CONCAT('/', df_artist.filename_disk) + FROM artists a + LEFT JOIN directus_files df_artist ON a.art = df_artist.id + WHERE a.genres = g.id + AND df_artist.filename_disk IS NOT NULL + AND df_artist.filename_disk != '' + ORDER BY a.total_plays DESC + LIMIT 1 + ) + ) AS metadata +FROM genres g +CROSS JOIN optimized_globals globals +ORDER BY g.id ASC; diff --git a/queries/views/media/music/listens.sql b/queries/views/media/music/listens.sql index acc0336..3f81835 100644 --- a/queries/views/media/music/listens.sql +++ b/queries/views/media/music/listens.sql @@ -1,17 +1,20 @@ -CREATE OR REPLACE VIEW optimized_listens AS SELECT DISTINCT ON (l.id, l.listened_at, l.track_name, l.artist_name, l.album_name) +CREATE OR REPLACE VIEW optimized_listens AS +SELECT DISTINCT ON (l.id, l.listened_at, l.track_name, l.artist_name, l.album_name) l.id, l.listened_at, l.track_name, l.artist_name, l.album_name, l.album_key, - CONCAT('/', df_art.filename_disk) AS artist_art, + CONCAT(globals.cdn_url, '/', df_art.filename_disk) AS artist_art, + CONCAT('/', df_art.filename_disk) AS opengraph_image_artist, a.genres AS artist_genres, g.name AS genre_name, g.slug AS genre_url, a.country AS artist_country, a.slug AS artist_url, - CONCAT('/', df_album.filename_disk) AS album_art + CONCAT(globals.cdn_url, '/', df_album.filename_disk) AS album_art, + CONCAT('/', df_album.filename_disk) AS opengraph_image_album FROM listens l LEFT JOIN artists a ON (l.artist_name = a.name_string) @@ -19,10 +22,11 @@ FROM LEFT JOIN directus_files df_art ON (a.art = df_art.id) LEFT JOIN directus_files df_album ON (al.art = df_album.id) LEFT JOIN genres g ON (a.genres = g.id) + CROSS JOIN optimized_globals globals ORDER BY l.id, l.listened_at, l.track_name, l.artist_name, - l.album_name; - + l.album_name, + globals.cdn_url; diff --git a/queries/views/media/music/month/albums.sql b/queries/views/media/music/month/albums.sql index b2b68a9..39a453e 100644 --- a/queries/views/media/music/month/albums.sql +++ b/queries/views/media/music/month/albums.sql @@ -5,7 +5,20 @@ SELECT COUNT(*) AS plays, ol.album_art, ol.artist_url, - json_build_object('title', ol.album_name, 'image', ol.album_art, 'url', ol.artist_url, 'alt', CONCAT(ol.album_name, ' by ', ol.artist_name), 'subtext', ol.artist_name) AS grid + json_build_object( + 'title', ol.album_name, + 'image', ol.album_art, + 'url', ol.artist_url, + 'alt', CONCAT(ol.album_name, ' by ', ol.artist_name), + 'subtext', ol.artist_name + ) AS grid, + json_build_object( + 'open_graph_image', + CASE + WHEN ol.opengraph_image_album IS NOT NULL AND ol.opengraph_image_album != '' AND ol.opengraph_image_album != '/' THEN ol.opengraph_image_album + ELSE NULL + END + ) AS metadata FROM optimized_listens ol WHERE @@ -14,7 +27,7 @@ GROUP BY ol.album_name, ol.artist_name, ol.album_art, - ol.artist_url + ol.artist_url, + ol.opengraph_image_album ORDER BY plays DESC; - diff --git a/queries/views/media/music/month/artists.sql b/queries/views/media/music/month/artists.sql index f469201..77bfb7c 100644 --- a/queries/views/media/music/month/artists.sql +++ b/queries/views/media/music/month/artists.sql @@ -5,7 +5,20 @@ SELECT ol.artist_art, ol.artist_url, ARRAY_AGG(DISTINCT ol.genre_name) AS genres, - json_build_object('title', ol.artist_name, 'image', ol.artist_art, 'url', ol.artist_url, 'alt', CONCAT(COUNT(*), ' plays of ', ol.artist_name), 'subtext', CONCAT(COUNT(*), ' plays')) AS grid + json_build_object( + 'title', ol.artist_name, + 'image', ol.artist_art, + 'url', ol.artist_url, + 'alt', CONCAT(COUNT(*), ' plays of ', ol.artist_name), + 'subtext', CONCAT(COUNT(*), ' plays') + ) AS grid, + json_build_object( + 'open_graph_image', + CASE + WHEN ol.opengraph_image_artist IS NOT NULL AND ol.opengraph_image_artist != '' AND ol.opengraph_image_artist != '/' THEN ol.opengraph_image_artist + ELSE NULL + END + ) AS metadata FROM optimized_listens ol WHERE @@ -13,7 +26,7 @@ WHERE GROUP BY ol.artist_name, ol.artist_art, - ol.artist_url + ol.artist_url, + ol.opengraph_image_artist ORDER BY plays DESC; - diff --git a/queries/views/media/music/week/albums.sql b/queries/views/media/music/week/albums.sql index 34a09b3..07914b0 100644 --- a/queries/views/media/music/week/albums.sql +++ b/queries/views/media/music/week/albums.sql @@ -5,7 +5,20 @@ SELECT COUNT(*) AS plays, ol.album_art, ol.artist_url, - json_build_object('title', ol.album_name, 'image', ol.album_art, 'url', ol.artist_url, 'alt', CONCAT(ol.album_name, ' by ', ol.artist_name), 'subtext', ol.artist_name) AS grid + json_build_object( + 'title', ol.album_name, + 'image', ol.album_art, + 'url', ol.artist_url, + 'alt', CONCAT(ol.album_name, ' by ', ol.artist_name), + 'subtext', ol.artist_name + ) AS grid, + json_build_object( + 'open_graph_image', + CASE + WHEN ol.opengraph_image_album IS NOT NULL AND ol.opengraph_image_album != '' AND ol.opengraph_image_album != '/' THEN ol.opengraph_image_album + ELSE NULL + END + ) AS metadata FROM optimized_listens ol WHERE @@ -14,7 +27,7 @@ GROUP BY ol.album_name, ol.artist_name, ol.album_art, - ol.artist_url + ol.artist_url, + ol.opengraph_image_album ORDER BY plays DESC; - diff --git a/queries/views/media/music/week/artists.sql b/queries/views/media/music/week/artists.sql index 0e5cdb7..9169f27 100644 --- a/queries/views/media/music/week/artists.sql +++ b/queries/views/media/music/week/artists.sql @@ -5,7 +5,20 @@ SELECT ol.artist_art, ol.artist_url, ARRAY_AGG(DISTINCT ol.genre_name) AS genres, - json_build_object('title', ol.artist_name, 'image', ol.artist_art, 'url', ol.artist_url, 'alt', CONCAT(COUNT(*), ' plays of ', ol.artist_name), 'subtext', CONCAT(COUNT(*), ' plays')) AS grid + json_build_object( + 'title', ol.artist_name, + 'image', ol.artist_art, + 'url', ol.artist_url, + 'alt', CONCAT(COUNT(*), ' plays of ', ol.artist_name), + 'subtext', CONCAT(COUNT(*), ' plays') + ) AS grid, + json_build_object( + 'open_graph_image', + CASE + WHEN ol.opengraph_image_artist IS NOT NULL AND ol.opengraph_image_artist != '' AND ol.opengraph_image_artist != '/' THEN ol.opengraph_image_artist + ELSE NULL + END + ) AS metadata FROM optimized_listens ol WHERE @@ -13,6 +26,7 @@ WHERE GROUP BY ol.artist_name, ol.artist_art, - ol.artist_url + ol.artist_url, + ol.opengraph_image_artist ORDER BY plays DESC; diff --git a/queries/views/media/recent_media.sql b/queries/views/media/recent_media.sql index f0d3ad4..2aea76e 100644 --- a/queries/views/media/recent_media.sql +++ b/queries/views/media/recent_media.sql @@ -93,7 +93,7 @@ recent_watched_read AS ( 'tv' AS type, 1 AS rank, json_build_object( - 'title', null, + 'title', NULL, 'url', om.url, 'image', om.image, 'backdrop', om.backdrop, @@ -118,7 +118,7 @@ recent_watched_read AS ( 'tv' AS type, 2 AS rank, json_build_object( - 'title', null, + 'title', NULL, 'image', os.image, 'url', os.url, 'alt', CONCAT('Poster from ', os.title), @@ -144,7 +144,7 @@ recent_watched_read AS ( 'books' AS type, 3 AS rank, json_build_object( - 'title', null, + 'title', NULL, 'image', ob.image, 'url', ob.url, 'alt', CONCAT('Book cover from ', ob.title, ' by ', ob.author), @@ -168,7 +168,7 @@ recent_watched_read AS ( 'tv' AS type, 4 AS rank, json_build_object( - 'title', null, + 'title', NULL, 'url', om.url, 'image', om.image, 'backdrop', om.backdrop, @@ -193,7 +193,7 @@ recent_watched_read AS ( 'tv' AS type, 5 AS rank, json_build_object( - 'title', null, + 'title', NULL, 'image', os.image, 'url', os.url, 'alt', CONCAT('Poster from ', os.title), @@ -219,7 +219,7 @@ recent_watched_read AS ( 'books' AS type, 6 AS rank, json_build_object( - 'title', null, + 'title', NULL, 'image', ob.image, 'url', ob.url, 'alt', CONCAT('Book cover from ', ob.title, ' by ', ob.author), diff --git a/queries/views/media/shows/scheduled_shows.sql b/queries/views/media/shows/scheduled_shows.sql index f921241..2c05910 100644 --- a/queries/views/media/shows/scheduled_shows.sql +++ b/queries/views/media/shows/scheduled_shows.sql @@ -9,12 +9,12 @@ SELECT json_build_object( s.year, s.ongoing, s.slug AS url, - CONCAT('/', df_art.filename_disk) AS image, - CONCAT('/', df_backdrop.filename_disk) AS backdrop, + CONCAT(globals.cdn_url, '/', df_art.filename_disk) AS image, + CONCAT(globals.cdn_url, '/', df_backdrop.filename_disk) AS backdrop, json_build_object( 'title', s.title, - 'image', CONCAT('/', df_art.filename_disk), - 'backdrop', CONCAT('/', df_backdrop.filename_disk), + 'image', CONCAT(globals.cdn_url, '/', df_art.filename_disk), + 'backdrop', CONCAT(globals.cdn_url, '/', df_backdrop.filename_disk), 'url', s.slug, 'alt', CONCAT('Poster from ', s.title), 'subtext', COALESCE( @@ -90,6 +90,7 @@ SELECT json_build_object( FROM shows s LEFT JOIN directus_files df_art ON s.art = df_art.id LEFT JOIN directus_files df_backdrop ON s.backdrop = df_backdrop.id + CROSS JOIN optimized_globals globals WHERE s.ongoing = true AND EXISTS ( SELECT 1 @@ -114,12 +115,12 @@ SELECT json_build_object( s.year, s.ongoing, s.slug AS url, - CONCAT('/', df_art.filename_disk) AS image, - CONCAT('/', df_backdrop.filename_disk) AS backdrop, + CONCAT(globals.cdn_url, '/', df_art.filename_disk) AS image, + CONCAT(globals.cdn_url, '/', df_backdrop.filename_disk) AS backdrop, json_build_object( 'title', s.title, - 'image', CONCAT('/', df_art.filename_disk), - 'backdrop', CONCAT('/', df_backdrop.filename_disk), + 'image', CONCAT(globals.cdn_url, '/', df_art.filename_disk), + 'backdrop', CONCAT(globals.cdn_url, '/', df_backdrop.filename_disk), 'url', s.slug, 'alt', CONCAT('Poster from ', s.title), 'subtext', COALESCE( @@ -144,6 +145,7 @@ SELECT json_build_object( FROM shows s LEFT JOIN directus_files df_art ON s.art = df_art.id LEFT JOIN directus_files df_backdrop ON s.backdrop = df_backdrop.id + CROSS JOIN optimized_globals globals WHERE s.ongoing = true AND EXISTS ( SELECT 1 diff --git a/queries/views/media/shows/shows.sql b/queries/views/media/shows/shows.sql index 7b665b9..e950410 100644 --- a/queries/views/media/shows/shows.sql +++ b/queries/views/media/shows/shows.sql @@ -10,35 +10,35 @@ SELECT s.review, s.ongoing, s.slug AS url, - CONCAT('/', df_art.filename_disk) AS image, - CONCAT('/', df_backdrop.filename_disk) AS backdrop, + CONCAT(globals.cdn_url, '/', df_art.filename_disk) AS image, + CONCAT(globals.cdn_url, '/', df_backdrop.filename_disk) AS backdrop, json_build_object( - 'title', NULL, - 'image', CONCAT('/', df_art.filename_disk), - 'backdrop', CONCAT('/', df_backdrop.filename_disk), - 'url', s.slug, - 'alt', CONCAT('Poster from ', s.title), - 'subtext', CASE - WHEN ( - SELECT MAX(e1.last_watched_at) - FROM episodes e1 - WHERE e1.show = s.id - ) >= NOW() - INTERVAL '90 days' THEN - (SELECT CONCAT('S', e2.season_number, 'E', e2.episode_number) - FROM episodes e2 - WHERE e2.show = s.id - ORDER BY e2.last_watched_at DESC, e2.season_number DESC, e2.episode_number DESC - LIMIT 1) - ELSE - s.year::text - END + 'title', NULL, + 'image', CONCAT(globals.cdn_url, '/', df_art.filename_disk), + 'backdrop', CONCAT(globals.cdn_url, '/', df_backdrop.filename_disk), + 'url', s.slug, + 'alt', CONCAT('Artwork for ', s.title), + 'subtext', CASE + WHEN ( + SELECT MAX(e1.last_watched_at) + FROM episodes e1 + WHERE e1.show = s.id + ) >= NOW() - INTERVAL '90 days' THEN + (SELECT CONCAT('S', e2.season_number, 'E', e2.episode_number) + FROM episodes e2 + WHERE e2.show = s.id + ORDER BY e2.last_watched_at DESC, e2.season_number DESC, e2.episode_number DESC + LIMIT 1) + ELSE s.year::text + END, + 'type', 'tv' ) AS grid, json_build_object( 'title', s.title, 'year', s.year, 'url', s.slug, - 'image', CONCAT('/', df_art.filename_disk), - 'backdrop', CONCAT('/', df_backdrop.filename_disk), + 'image', CONCAT(globals.cdn_url, '/', df_art.filename_disk), + 'backdrop', CONCAT(globals.cdn_url, '/', df_backdrop.filename_disk), 'formatted_episode', COALESCE(( SELECT CONCAT('S', e2.season_number, 'E', e2.episode_number) FROM episodes e2 @@ -53,73 +53,141 @@ SELECT ) ) AS episode, ( - SELECT - json_agg(json_build_object('title', m.title, 'year', m.year, 'url', m.slug) - ORDER BY m.year DESC) - FROM - shows_movies sm + SELECT json_agg( + json_build_object( + 'title', m.title, + 'year', m.year, + 'url', m.slug, + 'image', CONCAT(globals.cdn_url, '/', df_movie.filename_disk), + 'grid', json_build_object( + 'title', NULL, + 'image', CONCAT(globals.cdn_url, '/', df_movie.filename_disk), + 'alt', CONCAT('Poster for ', m.title, ' (', m.year, ')'), + 'subtext', CASE WHEN m.star_rating IS NOT NULL THEN m.star_rating::text ELSE m.year::text END, + 'url', m.slug + ), + 'type', 'movies' + ) + ORDER BY m.year ASC + ) + FROM shows_movies sm LEFT JOIN movies m ON sm.movies_id = m.id - WHERE - sm.shows_id = s.id + LEFT JOIN directus_files df_movie ON m.art = df_movie.id + WHERE sm.shows_id = s.id AND m.last_watched IS NOT NULL ) AS movies, ( - SELECT - json_agg(json_build_object('title', b.title, 'author', b.author, 'url', b.slug) - ORDER BY b.title ASC) - FROM - shows_books sb + SELECT json_agg( + json_build_object( + 'title', b.title, + 'author', b.author, + 'url', b.slug, + 'image', CONCAT(globals.cdn_url, '/', df_book.filename_disk), + 'grid', json_build_object( + 'title', NULL, + 'image', CONCAT(globals.cdn_url, '/', df_book.filename_disk), + 'alt', CONCAT('Cover for ', b.title, ' by ', b.author), + 'subtext', CASE WHEN b.star_rating IS NOT NULL THEN b.star_rating ELSE NULL END, + 'url', b.slug + ), + 'type', 'books' + ) + ORDER BY b.title + ) + FROM shows_books sb LEFT JOIN books b ON sb.books_id = b.id - WHERE - sb.shows_id = s.id + LEFT JOIN directus_files df_book ON b.art = df_book.id + WHERE sb.shows_id = s.id AND LOWER(b.read_status) = 'finished' ) AS books, ( - SELECT - json_agg(json_build_object('title', p.title, 'date', p.date, 'url', p.slug) - ORDER BY p.date DESC) - FROM - posts_shows ps + SELECT json_agg(json_build_object('title', p.title, 'date', p.date, 'url', p.slug) ORDER BY p.date DESC) + FROM posts_shows ps LEFT JOIN posts p ON ps.posts_id = p.id - WHERE - ps.shows_id = s.id + WHERE ps.shows_id = s.id ) AS posts, ( - SELECT - array_agg(t.name) - FROM - shows_tags st + SELECT array_agg(t.name) + FROM shows_tags st LEFT JOIN tags t ON st.tags_id = t.id - WHERE - st.shows_id = s.id + WHERE st.shows_id = s.id ) AS tags, ( - SELECT - json_agg(json_build_object('title', rs.title, 'year', rs.year, 'url', rs.slug) - ORDER BY rs.year DESC) - FROM - related_shows sr + SELECT json_agg( + json_build_object( + 'title', rs.title, + 'year', rs.year, + 'url', rs.slug, + 'image', CONCAT(globals.cdn_url, '/', df_related.filename_disk), + 'grid', json_build_object( + 'title', NULL, + 'image', CONCAT(globals.cdn_url, '/', df_related.filename_disk), + 'alt', CONCAT('Artwork for ', rs.title), + 'subtext', CASE + WHEN ( + SELECT MAX(e1.last_watched_at) + FROM episodes e1 + WHERE e1.show = rs.id + ) >= NOW() - INTERVAL '90 days' THEN + ( + SELECT CONCAT('S', e2.season_number, 'E', e2.episode_number) + FROM episodes e2 + WHERE e2.show = rs.id + ORDER BY e2.last_watched_at DESC, e2.season_number DESC, e2.episode_number DESC + LIMIT 1 + ) + ELSE rs.year::text + END, + 'url', rs.slug + ), + 'type', 'tv' + ) + ORDER BY rs.year ASC + ) + FROM related_shows sr LEFT JOIN shows rs ON sr.related_shows_id = rs.id - WHERE - sr.shows_id = s.id + LEFT JOIN directus_files df_related ON rs.art = df_related.id + WHERE sr.shows_id = s.id + AND EXISTS ( + SELECT 1 + FROM episodes e + WHERE e.show = rs.id + AND e.last_watched_at IS NOT NULL + ) ) AS related_shows, ( - SELECT - json_agg(json_build_object('name', a.name_string, 'url', a.slug, 'country', a.country, 'total_plays', a.total_plays) - ORDER BY a.name_string ASC) - FROM - shows_artists sa + SELECT json_agg( + json_build_object( + 'name', a.name_string, + 'url', a.slug, + 'country', a.country, + 'total_plays', a.total_plays, + 'image', CONCAT(globals.cdn_url, '/', df_artist.filename_disk), + 'grid', json_build_object( + 'title', a.name_string, + 'image', CONCAT(globals.cdn_url, '/', df_artist.filename_disk), + 'alt', CASE WHEN a.total_plays > 0 THEN CONCAT(to_char(a.total_plays, 'FM999,999,999,999'), ' plays of ', a.name_string) ELSE CONCAT('Artwork of ', a.name_string) END, + 'subtext', CASE WHEN a.total_plays > 0 THEN CONCAT(to_char(a.total_plays, 'FM999,999,999,999'), ' plays') ELSE NULL END, + 'url', a.slug + ), + 'type', 'music' + ) + ORDER BY a.total_plays DESC + ) + FROM shows_artists sa LEFT JOIN artists a ON sa.artists_id = a.id - WHERE - sa.shows_id = s.id + LEFT JOIN directus_files df_artist ON a.art = df_artist.id + WHERE sa.shows_id = s.id ) AS artists, - MAX(e.last_watched_at) AS last_watched_at -FROM - shows s - LEFT JOIN episodes e ON s.id = e.show - LEFT JOIN directus_files df_art ON s.art = df_art.id - LEFT JOIN directus_files df_backdrop ON s.backdrop = df_backdrop.id -GROUP BY - s.id, - df_art.filename_disk, - df_backdrop.filename_disk -ORDER BY - MAX(e.last_watched_at) DESC; + MAX(e.last_watched_at) AS last_watched_at, + json_build_object( + 'open_graph_image', CASE + WHEN df_backdrop.filename_disk IS NOT NULL AND df_backdrop.filename_disk != '' AND df_backdrop.filename_disk != '/' THEN CONCAT('/', df_backdrop.filename_disk) + ELSE NULL + END + ) AS metadata +FROM shows s +LEFT JOIN episodes e ON s.id = e.show +LEFT JOIN directus_files df_art ON s.art = df_art.id +LEFT JOIN directus_files df_backdrop ON s.backdrop = df_backdrop.id +CROSS JOIN optimized_globals globals +GROUP BY s.id, df_art.filename_disk, df_backdrop.filename_disk, globals.cdn_url +ORDER BY MAX(e.last_watched_at) DESC; diff --git a/server/utils/media.php b/server/utils/media.php index 5439811..dd6b6b6 100644 --- a/server/utils/media.php +++ b/server/utils/media.php @@ -1,19 +1,12 @@ 0 ? $count : count($items); + $firstType = $items[0]['type'] ?? ($items[0]['grid']['type'] ?? ''); + $shapeClass = in_array($firstType, ['books', 'movies', 'tv']) ? 'vertical' : 'square'; + + echo '
'; - echo '
'; foreach (array_slice($items, 0, $limit) as $item) { $grid = $item['grid'] ?? $item; $alt = htmlspecialchars($grid['alt'] ?? ''); @@ -21,8 +14,13 @@ $title = htmlspecialchars($grid['title'] ?? ''); $subtext = htmlspecialchars($grid['subtext'] ?? ''); $url = $grid['url'] ?? null; + $type = $item['type'] ?? ''; + $isVertical = in_array($type, ['books', 'movies', 'tv']); + $imageClass = $isVertical ? 'vertical' : 'square'; + $width = $isVertical ? 120 : 150; + $height = $isVertical ? 184 : 150; - $openLink = $url ? '' : ''; + $openLink = $url ? '' : ''; $closeLink = $url ? '' : ''; echo $openLink; @@ -36,10 +34,10 @@ } echo '' . $alt . ''; echo $closeLink; } + echo '
'; } - function renderAssociatedMedia($artists = [], $books = [], $genres = [], $movies = [], $posts = [], $shows = []) - { - $media = array_merge($artists, $books, $genres, $movies, $posts, $shows); - - if (empty($media)) return; - + function renderAssociatedMedia( + array $artists = [], + array $books = [], + array $genres = [], + array $movies = [], + array $posts = [], + array $shows = [], + ) { $sections = [ - "artists" => ["icon" => "headphones", "css_class" => "music", "label" => "Related artist(s)"], - "books" => ["icon" => "books", "css_class" => "books", "label" => "Related book(s)"], - "genres" => ["icon" => "headphones", "css_class" => "music", "label" => "Related genre(s)"], - "movies" => ["icon" => "movie", "css_class" => "movies", "label" => "Related movie(s)"], - "posts" => ["icon" => "article", "css_class" => "article", "label" => "Related post(s)"], - "shows" => ["icon" => "device-tv-old", "css_class" => "tv", "label" => "Related show(s)"] + "artists" => ["icon" => "headphones", "css_class" => "music", "label" => "Related artist(s)", "hasGrid" => true], + "books" => ["icon" => "books", "css_class" => "books", "label" => "Related book(s)", "hasGrid" => true], + "genres" => ["icon" => "headphones", "css_class" => "music", "label" => "Related genre(s)", "hasGrid" => false], + "movies" => ["icon" => "movie", "css_class" => "movies", "label" => "Related movie(s)", "hasGrid" => true], + "posts" => ["icon" => "article", "css_class" => "article", "label" => "Related post(s)", "hasGrid" => false], + "shows" => ["icon" => "device-tv-old", "css_class" => "tv", "label" => "Related show(s)", "hasGrid" => true] ]; + $allMedia = compact('artists', 'books', 'genres', 'movies', 'posts', 'shows'); + echo '
'; foreach ($sections as $key => $section) { - switch ($key) { - case "artists": - $items = $artists; - break; - case "books": - $items = $books; - break; - case "genres": - $items = $genres; - break; - case "movies": - $items = $movies; - break; - case "posts": - $items = $posts; - break; - case "shows": - $items = $shows; - break; - default: - $items = []; - } + $items = $allMedia[$key]; - if (!empty($items)) { - echo '

'; - echo '' . getTablerIcon($section['icon']) . ' '; - echo htmlspecialchars($section['label']); - echo '

'; + if (empty($items)) continue; + + echo '

'; + echo getTablerIcon($section['icon']); + echo htmlspecialchars($section['label']); + echo '

'; + + if ($section['hasGrid']) { + renderMediaGrid($items); + } else { echo ''; } } diff --git a/src/assets/styles/components/media-grid.css b/src/assets/styles/components/media-grid.css index 5f52ca3..3d8f740 100644 --- a/src/assets/styles/components/media-grid.css +++ b/src/assets/styles/components/media-grid.css @@ -5,6 +5,14 @@ a { aspect-ratio: var(--aspect-ratio); + + img { + border-color: var(--section-color); + } + } + + &:not(:has(a)) img { + border: var(--border-gray); } & + .media-grid { diff --git a/src/assets/styles/pages/reading.css b/src/assets/styles/pages/reading.css index f303726..fb53aee 100644 --- a/src/assets/styles/pages/reading.css +++ b/src/assets/styles/pages/reading.css @@ -1,9 +1,3 @@ -:is(.book-entry, .book-focus) img { - height: auto; - aspect-ratio: var(--aspect-ratio-vertical); - border: var(--border-gray); -} - .book-years a:first-of-type { font-weight: var(--font-weight-bold); } @@ -25,10 +19,6 @@ align-items: start; } - img { - max-width: calc(var(--sizing-3xl) * 4); - } - .media-meta { margin-top: var(--sizing-base); align-items: center; diff --git a/src/feeds/manifest.json.liquid b/src/feeds/manifest.json.liquid index b6623d7..734251d 100644 --- a/src/feeds/manifest.json.liquid +++ b/src/feeds/manifest.json.liquid @@ -13,9 +13,9 @@ excludeFromSitemap: true "display": "minimal-ui", "dir": "ltr", "icons": [ - { "src": "{{ globals.url }}/og/w200/{% appVersion %}{{ globals.avatar }}", "type": "image/png", "sizes": "192x192" }, - { "src": "{{ globals.url }}/og/w800/{% appVersion %}{{ globals.avatar }}", "type": "image/png", "sizes": "512x512" }, - { "src": "{{ globals.url }}/og/w800/{% appVersion %}{{ globals.avatar }}", "type": "image/png", "sizes": "512x512", "purpose": "maskable" } + { "src": "{{ globals.url }}/og/w200/{% appVersion %}{{ globals.metadata.open_graph_image }}", "type": "image/png", "sizes": "192x192" }, + { "src": "{{ globals.url }}/og/w800/{% appVersion %}{{ globals.metadata.open_graph_image }}", "type": "image/png", "sizes": "512x512" }, + { "src": "{{ globals.url }}/og/w800/{% appVersion %}{{ globals.metadata.open_graph_image }}", "type": "image/png", "sizes": "512x512", "purpose": "maskable" } ], "start_url": "/", } diff --git a/src/feeds/rss.liquid b/src/feeds/rss.liquid index d4d0cba..1fcf592 100644 --- a/src/feeds/rss.liquid +++ b/src/feeds/rss.liquid @@ -17,7 +17,7 @@ permalink: "{{ feed.permalink }}.xml" {{ "now" | date:"%a, %d %b %Y %H:%M:%S %z" }} - {{ globals.url }}/og/w200/{% appVersion %}{{ globals.avatar }} + {{ globals.url }}/og/w200/{% appVersion %}{{ globals.metadata.open_graph_image }} <![CDATA[{{ feed.title | append: " • " | append: globals.site_name }}]]> {{ globals.url }}{{ feed.permalink }}.xml 144 @@ -31,12 +31,12 @@ permalink: "{{ feed.permalink }}.xml" {{ feedItem.url | generatePermalink: globals.url | encodeAmp }} {{ feedItem.date | date: "%a, %d %b %Y %H:%M:%S %z" }} {%- if feedItem.image -%} - {%- assign enclosureUrl = globals.cdn_url | append: feedItem.image | append: "?class=w800" -%} - + {%- assign enclosureUrl = feedItem.image | append: "?class=w800" -%} + {%- endif -%} + Image from {{ feedItem.title }} {%- endif -%} {%- if feedItem.content -%} {{ feedItem.content | markdown | convertRelativeLinks: globals.url }} diff --git a/src/includes/blocks/associated-media.liquid b/src/includes/blocks/associated-media.liquid index 4d0e288..679a913 100644 --- a/src/includes/blocks/associated-media.liquid +++ b/src/includes/blocks/associated-media.liquid @@ -2,12 +2,12 @@ {% if media.size > 0 %}
{% assign sections = - "artists:headphones:music:Related artist(s)," | append: - "books:books:books:Related book(s)," | append: - "genres:headphones:music:Related genre(s)," | append: - "movies:movie:movies:Related movie(s)," | append: - "posts:article:article:Related post(s)," | append: - "shows:device-tv-old:tv:Related show(s)" + "artists:headphones:music:Related artist(s):true," | append: + "books:books:books:Related book(s):true," | append: + "genres:headphones:music:Related genre(s):false," | append: + "movies:movie:movies:Related movie(s):true," | append: + "posts:article:article:Related post(s):false," | append: + "shows:device-tv-old:tv:Related show(s):true" | split:"," %} {% for section in sections %} {% assign parts = section | split:":" %} @@ -15,6 +15,8 @@ {% assign icon = parts[1] %} {% assign css_class = parts[2] %} {% assign label = parts[3] %} + {% assign hasGrid = parts[4] == "true" %} + {% assign items = nil %} {% case key %} {% when "artists" %} {% assign items = artists %} {% when "books" %} {% assign items = books %} @@ -24,26 +26,37 @@ {% when "shows" %} {% assign items = shows %} {% endcase %} {% if items and items.size > 0 %} -

+

{% tablericon icon %} {{ label }} -

-
    - {% for item in items %} -
  • - {{ item.title | default:item.name }} - {% if key == "artists" and item.total_plays > 0 %} - ({{ item.total_plays }} {{ item.total_plays | pluralize:"play" }}) - {% elsif key == "books" %} - by {{ item.author }} - {% elsif key == "movies" or key == "shows" %} - ({{ item.year }}) - {% elsif key == "posts" %} - ({{ item.date | date:"%B %e, %Y" }}) - {% endif %} -
  • - {% endfor %} -
+

+ {% if hasGrid %} + {% assign shape = "square" %} + {% if key == "books" or key == "movies" or key == "shows" %} + {% assign shape = "vertical" %} + {% endif %} + {% render "media/grid.liquid", + data:items, + shape:shape + %} + {% else %} +
    + {% for item in items %} +
  • + {{ item.title | default:item.name }} + {% if key == "artists" and item.total_plays > 0 %} + ({{ item.total_plays }} {{ item.total_plays | pluralize:"play" }}) + {% elsif key == "books" %} + by {{ item.author }} + {% elsif key == "movies" or key == "shows" %} + ({{ item.year }}) + {% elsif key == "posts" %} + ({{ item.date | date:"%B %e, %Y" }}) + {% endif %} +
  • + {% endfor %} +
+ {% endif %} {% endif %} {% endfor %}
diff --git a/src/includes/blocks/hero.liquid b/src/includes/blocks/hero.liquid index 7518632..b5d3cd5 100644 --- a/src/includes/blocks/hero.liquid +++ b/src/includes/blocks/hero.liquid @@ -1,17 +1,17 @@ {{ alt | replaceQuotes }} \ No newline at end of file +/> diff --git a/src/includes/fetchers/artist.php.liquid b/src/includes/fetchers/artist.php.liquid index 0cff39f..9152f50 100644 --- a/src/includes/fetchers/artist.php.liquid +++ b/src/includes/fetchers/artist.php.liquid @@ -3,7 +3,6 @@ require __DIR__ . "/../../vendor/autoload.php"; require __DIR__ . "/../../server/utils/init.php"; - use App\Classes\GlobalsFetcher; use App\Classes\ArtistFetcher; use voku\helper\HtmlMin; @@ -12,7 +11,6 @@ if (strpos($url, "music/artists/") !== 0) redirectTo404(); - $globals = (new GlobalsFetcher())->fetch(); $artist = (new ArtistFetcher())->fetch($url); if (!$artist) redirectTo404(); @@ -20,7 +18,7 @@ $artist["description"] = parseMarkdown($artist["description"]); $pageTitle = htmlspecialchars("Artists • " . $artist["name"], ENT_QUOTES, "UTF-8"); $pageDescription = truncateText(htmlspecialchars(strip_tags($artist["description"]), ENT_QUOTES, "UTF-8"), 250); - $ogImage = htmlspecialchars($artist["image"], ENT_QUOTES, "UTF-8"); + $ogImage = htmlspecialchars($artist["metadata"]["open_graph_image"], ENT_QUOTES, "UTF-8"); $fullUrl = "https://www.coryd.dev" . $requestUri; $oembedUrl = "https://www.coryd.dev/oembed" . $requestUri; diff --git a/src/includes/fetchers/book.php.liquid b/src/includes/fetchers/book.php.liquid index 4212623..bec9af7 100644 --- a/src/includes/fetchers/book.php.liquid +++ b/src/includes/fetchers/book.php.liquid @@ -18,7 +18,7 @@ $book["description"] = parseMarkdown($book["description"]); $pageTitle = htmlspecialchars("Books • {$book["title"]} by {$book["author"]}", ENT_QUOTES, "UTF-8"); $pageDescription = truncateText(htmlspecialchars(strip_tags($book["description"]), ENT_QUOTES, "UTF-8"), 250); - $ogImage = htmlspecialchars($book["image"], ENT_QUOTES, "UTF-8"); + $ogImage = htmlspecialchars($book["metadata"]["open_graph_image"], ENT_QUOTES, "UTF-8"); $fullUrl = "https://www.coryd.dev" . $requestUri; $oembedUrl = "https://www.coryd.dev/oembed" . $requestUri; diff --git a/src/includes/fetchers/genre.php.liquid b/src/includes/fetchers/genre.php.liquid index 9c07fe8..239e33c 100644 --- a/src/includes/fetchers/genre.php.liquid +++ b/src/includes/fetchers/genre.php.liquid @@ -20,7 +20,7 @@ htmlspecialchars(strip_tags($genre["description"]), ENT_QUOTES, "UTF-8"), 250 ); - $ogImage = htmlspecialchars($genre["artists"][0]["image"] ?? "", ENT_QUOTES, "UTF-8"); + $ogImage = htmlspecialchars($genre["metadata"]["open_graph_image"] ?? "", ENT_QUOTES, "UTF-8"); $fullUrl = "https://www.coryd.dev" . $requestUri; $oembedUrl = "https://www.coryd.dev/oembed" . $requestUri; diff --git a/src/includes/fetchers/movie.php.liquid b/src/includes/fetchers/movie.php.liquid index a414a9b..a633377 100644 --- a/src/includes/fetchers/movie.php.liquid +++ b/src/includes/fetchers/movie.php.liquid @@ -18,7 +18,7 @@ $movie["description"] = parseMarkdown($movie["description"]); $pageTitle = htmlspecialchars("Movies • " . $movie["title"], ENT_QUOTES, "UTF-8"); $pageDescription = truncateText(htmlspecialchars(strip_tags($movie["description"]), ENT_QUOTES, "UTF-8"), 250); - $ogImage = htmlspecialchars($movie["backdrop"], ENT_QUOTES, "UTF-8"); + $ogImage = htmlspecialchars($movie["metadata"]["open_graph_image"], ENT_QUOTES, "UTF-8"); $fullUrl = "https://www.coryd.dev" . $requestUri; $oembedUrl = "https://www.coryd.dev/oembed" . $requestUri; diff --git a/src/includes/fetchers/show.php.liquid b/src/includes/fetchers/show.php.liquid index 45b2441..558ac3a 100644 --- a/src/includes/fetchers/show.php.liquid +++ b/src/includes/fetchers/show.php.liquid @@ -20,7 +20,7 @@ htmlspecialchars(strip_tags($show["description"]), ENT_QUOTES, "UTF-8"), 250 ); - $ogImage = htmlspecialchars($show["image"], ENT_QUOTES, "UTF-8"); + $ogImage = htmlspecialchars($show["metadata"]["open_graph_image"], ENT_QUOTES, "UTF-8"); $fullUrl = "https://www.coryd.dev" . $requestUri; $oembedUrl = "https://www.coryd.dev/oembed" . $requestUri; diff --git a/src/includes/layout/header.liquid b/src/includes/layout/header.liquid index a7955a3..17e8e4b 100644 --- a/src/includes/layout/header.liquid +++ b/src/includes/layout/header.liquid @@ -1,11 +1,11 @@ {%- capture headerContent -%} {{ globals.site_name }} +
{%- if item.grid.title or item.grid.subtext -%}
@@ -27,11 +27,11 @@ {%- endcase -%} {{ alt }} {{ item.chart.alt | replaceQuotes }}
- {{ album.table.alt }} + {{ album.table.alt }} {{ album.table.title }}
diff --git a/src/includes/media/music/tables/all-time/artists.liquid b/src/includes/media/music/tables/all-time/artists.liquid index 1ead164..89da8fa 100644 --- a/src/includes/media/music/tables/all-time/artists.liquid +++ b/src/includes/media/music/tables/all-time/artists.liquid @@ -8,7 +8,7 @@
diff --git a/src/includes/metadata/base.liquid b/src/includes/metadata/base.liquid index f34969c..993b1cb 100644 --- a/src/includes/metadata/base.liquid +++ b/src/includes/metadata/base.liquid @@ -6,8 +6,8 @@ - - + + diff --git a/src/includes/metadata/index.liquid b/src/includes/metadata/index.liquid index 9596bd5..f04ce58 100644 --- a/src/includes/metadata/index.liquid +++ b/src/includes/metadata/index.liquid @@ -20,7 +20,7 @@ {{ globals.site_description }} {%- endif -%} {%- endcapture -%} -{%- assign ogImage = ogImageBaseUrl | append: globals.avatar -%} +{%- assign ogImage = ogImageBaseUrl | append: globals.metadata.open_graph_image -%} {%- case schema -%} {%- when 'artist' -%} {% render "fetchers/artist.php.liquid" %} @@ -37,20 +37,20 @@ {%- when 'blog' -%} {%- assign pageTitle = post.title -%} {%- assign pageDescription = post.description -%} - {%- assign ogImage = ogImageBaseUrl | append: post.image -%} + {%- assign ogImage = ogImageBaseUrl | append: post.metadata.open_graph_image -%} {%- when 'music-index', 'music-week-artists' -%} - {%- assign ogImage = ogImageBaseUrl | append: music.week.artists[0].grid.image -%} + {%- assign ogImage = ogImageBaseUrl | append: music.week.artists[0].metadata.open_graph_image -%} {%- when 'music-week-albums', 'music-week-tracks' -%} - {%- assign ogImage = ogImageBaseUrl | append: music.week.albums[0].grid.image -%} + {%- assign ogImage = ogImageBaseUrl | append: music.week.albums[0].metadata.open_graph_image -%} {%- when 'music-month-artists' -%} - {%- assign ogImage = ogImageBaseUrl | append: music.month.artists[0].grid.image -%} + {%- assign ogImage = ogImageBaseUrl | append: music.month.artists[0].metadata.open_graph_image -%} {%- when 'music-month-albums' -%} - {%- assign ogImage = ogImageBaseUrl | append: music.month.albums[0].grid.image -%} + {%- assign ogImage = ogImageBaseUrl | append: music.month.albums[0].metadata.open_graph_image -%} {%- when 'music-releases' -%} - {%- assign ogImage = ogImageBaseUrl | append: albumReleases.upcoming[0].grid.image -%} + {%- assign ogImage = ogImageBaseUrl | append: albumReleases.upcoming[0].metadata.open_graph_image -%} {%- when 'books' -%} {%- assign overviewBook = books.all | filterBooksByStatus: 'started' | reverse | first %} - {%- assign ogImage = ogImageBaseUrl | append: overviewBook.image -%} + {%- assign ogImage = ogImageBaseUrl | append: overviewBook.metadata.open_graph_image -%} {%- when 'reading-year' -%} {%- assign pageTitle = 'Books' | append: ' • ' | append: year.value | append: ' • ' | append: globals.site_name -%} {%- capture pageDescription -%} @@ -58,21 +58,21 @@ {%- endcapture -%} {%- assign bookData = year.data | filterBooksByStatus: 'finished' -%} {%- assign bookYear = bookData | shuffleArray | first -%} - {%- assign ogImage = ogImageBaseUrl | append: bookYear.image -%} + {%- assign ogImage = ogImageBaseUrl | append: bookYear.metadata.open_graph_image -%} {%- when 'favorite-movies' -%} {%- assign favoriteMovie = movies.favorites | shuffleArray | first %} - {%- assign ogImage = ogImageBaseUrl | append: favoriteMovie.backdrop -%} + {%- assign ogImage = ogImageBaseUrl | append: favoriteMovie.metadata.open_graph_image -%} {%- when 'favorite-shows' -%} {%- assign favoriteShow = tv.favorites | shuffleArray | first %} - {%- assign ogImage = ogImageBaseUrl | append: favoriteShow.backdrop -%} + {%- assign ogImage = ogImageBaseUrl | append: favoriteShow.metadata.open_graph_image -%} {%- when 'watching' -%} {%- assign mergedMovies = movies.recentlyWatched | mergeArray: movies.favorites %} {%- assign mergedShows = tv.recentlyWatched | mergeArray: tv.favorites %} {%- assign overviewWatched = mergedMovies | mergeArray: mergedShows | shuffleArray | first -%} - {%- assign ogImage = ogImageBaseUrl | append: overviewWatched.backdrop -%} + {%- assign ogImage = ogImageBaseUrl | append: overviewWatched.metadata.open_graph_image -%} {%- when 'upcoming-shows' -%} {%- assign upcomingShow = upcomingShows.watching | shuffleArray | first %} - {%- assign ogImage = ogImageBaseUrl | append: upcomingShow.backdrop -%} + {%- assign ogImage = ogImageBaseUrl | append: upcomingShow.metadata.open_graph_image -%} {%- when 'page' -%} {%- assign pageDescription = page.description -%} {% endcase %} @@ -82,7 +82,7 @@ oembedUrl:oembedUrl, pageTitle:pageTitle, pageDescription:pageDescription, - ogImage:globals.avatar, + ogImage:globals.metadata.open_graph_image, globals:globals, %} {%- else -%} diff --git a/src/meta/webfinger.json.liquid b/src/meta/webfinger.json.liquid index 5ff1fb6..a86cdfd 100644 --- a/src/meta/webfinger.json.liquid +++ b/src/meta/webfinger.json.liquid @@ -28,7 +28,7 @@ excludeFromSitemap: true { "rel":"http://webfinger.net/rel/avatar", "type":"image/png", - "href":"{{ globals.cdn_url }}{{ globals.avatar }}?class=squarebase" + "href":"{{ globals.url }}/og/w800/{% appVersion %}{{ globals.metadata.open_graph_image }}" } ] } diff --git a/src/pages/dynamic/artist.php.liquid b/src/pages/dynamic/artist.php.liquid index ad41ff6..80abf7b 100644 --- a/src/pages/dynamic/artist.php.liquid +++ b/src/pages/dynamic/artist.php.liquid @@ -9,14 +9,14 @@ schema: artist ?class=w200&type=webp 200w, - {{ globals.cdn_url }}?class=w600&type=webp 400w, - {{ globals.cdn_url }}?class=w800&type=webp 800w + ?class=w200&type=webp 200w, + ?class=w600&type=webp 400w, + ?class=w800&type=webp 800w " sizes="(max-width: 450px) 200px, (max-width: 850px) 400px, 800px" - src="{{ globals.cdn_url }}?class=w200&type=webp" + src="?class=w200&type=webp" alt="" decoding="async" width="200" @@ -108,7 +108,7 @@ schema: artist Albums - + ?class=verticalsm&type=webp 200w, - {{ globals.cdn_url }}?class=verticalmd&type=webp 400w, - {{ globals.cdn_url }}?class=verticalbase&type=webp 800w + ?class=verticalsm&type=webp 200w, + ?class=verticalmd&type=webp 400w, + ?class=verticalbase&type=webp 800w " sizes="(max-width: 450px) 203px, (max-width: 850px) 406px, (max-width: 1000px) 812px, 812px" - src="{{ globals.cdn_url }}?class=verticalsm&type=webp" + src="?class=verticalsm&type=webp" alt=" by " decoding="async" width="200" diff --git a/src/pages/dynamic/movie.php.liquid b/src/pages/dynamic/movie.php.liquid index a326f7c..fb4df84 100644 --- a/src/pages/dynamic/movie.php.liquid +++ b/src/pages/dynamic/movie.php.liquid @@ -7,14 +7,14 @@ schema: movie
?class=bannersm&type=webp 256w, - {{ globals.cdn_url }}?class=bannermd&type=webp 512w, - {{ globals.cdn_url }}?class=bannerbase&type=webp 1024w + ?class=bannersm&type=webp 256w, + ?class=bannermd&type=webp 512w, + ?class=bannerbase&type=webp 1024w " sizes="(max-width: 450px) 256px, (max-width: 850px) 512px, 1024px" - src="{{ globals.cdn_url }}?class=bannersm&type=webp" + src="?class=bannersm&type=webp" alt=" ()" class="image-banner" decoding="async" diff --git a/src/pages/dynamic/show.php.liquid b/src/pages/dynamic/show.php.liquid index 9f92195..dc527c8 100644 --- a/src/pages/dynamic/show.php.liquid +++ b/src/pages/dynamic/show.php.liquid @@ -7,14 +7,14 @@ schema: show
?class=bannersm&type=webp 256w, - {{ globals.cdn_url }}?class=bannermd&type=webp 512w, - {{ globals.cdn_url }}?class=bannerbase&type=webp 1024w + ?class=bannersm&type=webp 256w, + ?class=bannermd&type=webp 512w, + ?class=bannerbase&type=webp 1024w " sizes="(max-width: 450px) 256px, (max-width: 850px) 512px, 1024px" - src="{{ globals.cdn_url }}?class=bannersm&type=webp" + src="?class=bannersm&type=webp" alt=" ()" class="image-banner" decoding="async" diff --git a/src/pages/media/reading/index.html b/src/pages/media/reading/index.html index 51e71d7..60a9a33 100644 --- a/src/pages/media/reading/index.html +++ b/src/pages/media/reading/index.html @@ -26,12 +26,12 @@ updated: "now"