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/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..ecc73a2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "coryd.dev", - "version": "6.2.0", + "version": "7.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "coryd.dev", - "version": "6.2.0", + "version": "7.0.0", "license": "MIT", "dependencies": { "minisearch": "^7.1.2", diff --git a/package.json b/package.json index 078cf60..924c835 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "coryd.dev", - "version": "6.2.0", + "version": "7.0.0", "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..01f97f0 100644 --- a/queries/views/content/posts.sql +++ b/queries/views/content/posts.sql @@ -7,123 +7,149 @@ 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', 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.name_string ASC) + 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 + ) 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 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 + ) 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', m.title, + 'image', CONCAT(globals.cdn_url, '/', df_movie.filename_disk), + 'alt', CONCAT('Poster for ', m.title), + 'subtext', m.year, + 'url', m.slug + ), + 'type', 'movies' + ) ORDER BY m.year DESC) + 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 + ) 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', s.title, + 'image', CONCAT(globals.cdn_url, '/', df_show.filename_disk), + 'alt', CONCAT('Artwork for ', s.title), + 'subtext', s.year, + 'url', s.slug + ), + 'type', 'tv' + ) ORDER BY s.year DESC) + 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 + ) 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/globals/index.sql b/queries/views/globals/index.sql index bc7cef8..5ba8633 100644 --- a/queries/views/globals/index.sql +++ b/queries/views/globals/index.sql @@ -1,25 +1,35 @@ 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 + ) 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..1130d1c 100644 --- a/queries/views/media/books.sql +++ b/queries/views/media/books.sql @@ -10,98 +10,161 @@ 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', CONCAT(to_char(a.total_plays, 'FM999,999,999,999'), ' plays of ', a.name_string), + '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.name_string ASC ) - 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', m.title, + 'image', CONCAT(globals.cdn_url, '/', df_movie.filename_disk), + 'alt', CONCAT('Poster for ', m.title), + 'subtext', m.year, + 'url', m.slug + ), + 'type', 'movies' + ) + ORDER BY m.year DESC + ) + 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 + ) 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', s.title, + 'image', CONCAT(globals.cdn_url, '/', df_show.filename_disk), + 'alt', CONCAT('Artwork for ', s.title), + 'subtext', s.year, + 'url', s.slug + ), + 'type', 'tv' + ) + ORDER BY s.year DESC + ) + 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 + ) 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', rb.title, + 'image', CONCAT(globals.cdn_url, '/', df_rb.filename_disk), + 'alt', CONCAT('Cover for ', rb.title, ' by ', rb.author), + 'subtext', rb.author, + '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 + ) AS related_books, + json_build_object( + 'title', b.title, + '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..744a459 100644 --- a/queries/views/media/movies.sql +++ b/queries/views/media/movies.sql @@ -12,108 +12,157 @@ 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', CONCAT(to_char(a.total_plays, 'FM999,999,999,999'), ' plays of ', a.name_string), + '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.name_string ) - 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 + ) 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', s.title, + 'image', CONCAT(globals.cdn_url, '/', df_show.filename_disk), + 'alt', CONCAT('Artwork for ', s.title), + 'subtext', s.year, + 'url', s.slug + ), + 'type', 'tv' + ) + ORDER BY s.year DESC + ) + 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 + ) 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', rm.year, + 'url', rm.slug + ), + 'type', 'movies' + ) + ORDER BY rm.year DESC + ) + 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 + ) 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; 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..ddea6a4 100644 --- a/queries/views/media/music/artists.sql +++ b/queries/views/media/music/artists.sql @@ -14,10 +14,10 @@ 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') @@ -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,15 @@ SELECT 'art', df_album.filename_disk, 'grid', json_build_object( 'title', a.name, - 'image', CONCAT('/', df_album.filename_disk), + 'image', CONCAT(globals.cdn_url, '/', 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 - ) + '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 + ), + 'type', 'albums' ) ORDER BY a.release_year ) @@ -76,60 +76,116 @@ 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', 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 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 ) AS books, ( SELECT json_agg( - json_build_object('title', m.title, 'year', m.year, 'url', m.slug) + 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', m.title, + 'image', CONCAT(globals.cdn_url, '/', df_movie.filename_disk), + 'alt', CONCAT('Poster for ', m.title), + 'subtext', m.year, + 'url', m.slug + ), + 'type', 'movies' + ) ORDER BY m.year DESC ) 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 ) AS movies, ( SELECT json_agg( - json_build_object('title', s.title, 'year', s.year, 'url', s.slug) + 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', s.title, + 'image', CONCAT(globals.cdn_url, '/', df_show.filename_disk), + 'alt', CONCAT('Artwork for ', s.title), + 'subtext', s.year, + 'url', s.slug + ), + 'type', 'tv' + ) ORDER BY s.year DESC ) 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 ) 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', CONCAT(to_char(related_ar.total_plays, 'FM999,999,999,999'), ' plays of ', related_ar.name_string), + '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 ) 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 +CROSS JOIN optimized_globals globals GROUP BY ar.id, df.filename_disk, g.name, g.slug, - g.emoji; + g.emoji, + globals.cdn_url; 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/shows/shows.sql b/queries/views/media/shows/shows.sql index 7b665b9..1fe8e31 100644 --- a/queries/views/media/shows/shows.sql +++ b/queries/views/media/shows/shows.sql @@ -10,35 +10,36 @@ 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', s.title, + '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', 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 +54,126 @@ 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', m.title, + 'image', CONCAT(globals.cdn_url, '/', df_movie.filename_disk), + 'alt', CONCAT('Poster for ', m.title), + 'subtext', m.year, + 'url', m.slug + ), + 'type', 'movies' + ) + ORDER BY m.year DESC + ) + 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 ) 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', 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 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 ) 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', rs.title, + 'image', CONCAT(globals.cdn_url, '/', df_related.filename_disk), + 'alt', CONCAT('Artwork for ', rs.title), + 'subtext', rs.year, + 'url', rs.slug + ), + 'type', 'tv' + ) + ORDER BY rs.year DESC + ) + 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 ) 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', CONCAT(to_char(a.total_plays, 'FM999,999,999,999'), ' plays of ', a.name_string), + '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.name_string + ) + 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..d276881 100644 --- a/server/utils/media.php +++ b/server/utils/media.php @@ -1,19 +1,9 @@ 0 ? $count : count($items); - echo '
'; - echo '' . getTablerIcon($section['icon']) . ' '; - echo htmlspecialchars($section['label']); - echo '
'; + if (empty($items)) continue; + + echo '+