From 7ea764b1a7cb95e14d8d607154b6066699641c38 Mon Sep 17 00:00:00 2001 From: Raymond Jacobson Date: Tue, 23 Dec 2025 16:52:35 -0800 Subject: [PATCH] Implement general admission tags/routes in web SSR --- .../web/src/components/meta-tags/MetaTags.tsx | 85 ++++++- packages/web/src/ssr/audio/+Page.tsx | 5 + packages/web/src/ssr/audio/+onRenderHtml.tsx | 41 ++++ packages/web/src/ssr/audio/+route.ts | 4 + .../web/src/ssr/collection/+onRenderHtml.tsx | 19 +- packages/web/src/ssr/download/+Page.tsx | 5 + .../web/src/ssr/download/+onRenderHtml.tsx | 41 ++++ packages/web/src/ssr/download/+route.ts | 4 + packages/web/src/ssr/explore/+Page.tsx | 5 + .../web/src/ssr/explore/+onRenderHtml.tsx | 56 +++++ packages/web/src/ssr/explore/+route.ts | 7 + packages/web/src/ssr/metaTags.ts | 231 ++++++++++++++++++ .../web/src/ssr/profile/+onRenderHtml.tsx | 7 +- packages/web/src/ssr/remixes/+Page.tsx | 5 + .../web/src/ssr/remixes/+onBeforeRender.tsx | 59 +++++ .../web/src/ssr/remixes/+onRenderHtml.tsx | 63 +++++ packages/web/src/ssr/remixes/+route.ts | 4 + packages/web/src/ssr/signup/+Page.tsx | 5 + packages/web/src/ssr/signup/+onRenderHtml.tsx | 56 +++++ packages/web/src/ssr/signup/+route.ts | 4 + .../web/src/ssr/track/+onBeforeRender.tsx | 48 +++- packages/web/src/ssr/track/+onRenderHtml.tsx | 66 ++++- packages/web/src/ssr/upload/+Page.tsx | 5 + packages/web/src/ssr/upload/+onRenderHtml.tsx | 41 ++++ packages/web/src/ssr/upload/+route.ts | 4 + 25 files changed, 853 insertions(+), 17 deletions(-) create mode 100644 packages/web/src/ssr/audio/+Page.tsx create mode 100644 packages/web/src/ssr/audio/+onRenderHtml.tsx create mode 100644 packages/web/src/ssr/audio/+route.ts create mode 100644 packages/web/src/ssr/download/+Page.tsx create mode 100644 packages/web/src/ssr/download/+onRenderHtml.tsx create mode 100644 packages/web/src/ssr/download/+route.ts create mode 100644 packages/web/src/ssr/explore/+Page.tsx create mode 100644 packages/web/src/ssr/explore/+onRenderHtml.tsx create mode 100644 packages/web/src/ssr/explore/+route.ts create mode 100644 packages/web/src/ssr/metaTags.ts create mode 100644 packages/web/src/ssr/remixes/+Page.tsx create mode 100644 packages/web/src/ssr/remixes/+onBeforeRender.tsx create mode 100644 packages/web/src/ssr/remixes/+onRenderHtml.tsx create mode 100644 packages/web/src/ssr/remixes/+route.ts create mode 100644 packages/web/src/ssr/signup/+Page.tsx create mode 100644 packages/web/src/ssr/signup/+onRenderHtml.tsx create mode 100644 packages/web/src/ssr/signup/+route.ts create mode 100644 packages/web/src/ssr/upload/+Page.tsx create mode 100644 packages/web/src/ssr/upload/+onRenderHtml.tsx create mode 100644 packages/web/src/ssr/upload/+route.ts diff --git a/packages/web/src/components/meta-tags/MetaTags.tsx b/packages/web/src/components/meta-tags/MetaTags.tsx index f9404845451..90a3341c67a 100644 --- a/packages/web/src/components/meta-tags/MetaTags.tsx +++ b/packages/web/src/components/meta-tags/MetaTags.tsx @@ -30,6 +30,27 @@ export type MetaTagsProps = { * Hash ID for OG URL generation (id field from entities) */ hashId?: string + /** + * Whether to show embed player (for Twitter/Discord) + */ + embed?: boolean + /** + * URL to the embed player (e.g. /embed/track/xyz?flavor=card&twitter=true) + */ + embedUrl?: string + /** + * Deep link URL for mobile apps (e.g. audius://track/xyz) + */ + appUrl?: string + /** + * Web URL for the current page (e.g. https://audius.co/track/xyz) + */ + webUrl?: string + /** + * Whether the image shows as a small thumbnail version. + * Controls twitter:card type (summary vs summary_large_image) + */ + thumbnail?: boolean } /** @@ -70,7 +91,12 @@ export const MetaTags = (props: MetaTagsProps) => { structuredData, noIndex = false, entityType, - hashId + hashId, + embed = false, + embedUrl, + appUrl, + webUrl, + thumbnail = true } = props const formattedTitle = title @@ -80,6 +106,13 @@ export const MetaTags = (props: MetaTagsProps) => { // Generate OG URL if entity type and hash ID are provided const ogUrl = generateOgUrl(entityType, hashId) + // Determine twitter card type based on thumbnail and embed settings + const getTwitterCardType = () => { + if (thumbnail) return 'summary' + if (embed && embedUrl) return 'player' + return 'summary_large_image' + } + return ( <> {/* noIndex */} @@ -124,6 +157,12 @@ export const MetaTags = (props: MetaTagsProps) => { + {thumbnail ? null : ( + <> + + + + )} ) : null} @@ -134,11 +173,53 @@ export const MetaTags = (props: MetaTagsProps) => { ) : null} + {/* OG Type and Twitter Card */} - + + {/* Twitter Player (for embeds) */} + {embed && embedUrl ? ( + + + + + + ) : null} + + {/* Twitter App Links */} + {appUrl ? ( + + + + + + + + + + + + ) : null} + + {/* Farcaster Frame */} + {webUrl ? ( + + + + + + + + ) : null} + + {webUrl && image ? ( + + + + ) : null} + {structuredData ? (