[object Object]

← back to AsSeenInMovies

asseeninmovies: BreadcrumbList JSON-LD on /movie/:id (Home > Movies > Title) and /person/:id (Home > People > Name) — packaged with Movie/Person schema in a schema.org @graph so it's one script tag. Enables Google breadcrumb-trail rich snippets.

b8d4281bcfe148d1f4f1326517e74b4f7c819203 · 2026-05-12 19:24:52 -0700 · SteveStudio2

Files touched

Diff

commit b8d4281bcfe148d1f4f1326517e74b4f7c819203
Author: SteveStudio2 <stevestudio2@SteveStacStudio.lan>
Date:   Tue May 12 19:24:52 2026 -0700

    asseeninmovies: BreadcrumbList JSON-LD on /movie/:id (Home > Movies > Title) and /person/:id (Home > People > Name) — packaged with Movie/Person schema in a schema.org @graph so it's one script tag. Enables Google breadcrumb-trail rich snippets.
---
 server.js | 60 ++++++++++++++++++++++++++++++++++++++++++------------------
 1 file changed, 42 insertions(+), 18 deletions(-)

diff --git a/server.js b/server.js
index 83dbb82..795ac18 100644
--- a/server.js
+++ b/server.js
@@ -1061,15 +1061,27 @@ app.get('/movie/:id', async (req, res) => {
     const ogDesc = mv.overview ? mv.overview.slice(0, 280) : `${mv.title}${mv.release_year ? ' (' + mv.release_year + ')' : ''} — credits, scene details, and SPOTTED placements on AsSeenInMovies.`;
     const jsonLd = JSON.stringify({
       '@context': 'https://schema.org',
-      '@type': 'Movie',
-      name: mv.title,
-      ...(mv.release_year ? { datePublished: String(mv.release_year) } : {}),
-      ...(mv.overview ? { description: mv.overview } : {}),
-      ...(mv.poster_url ? { image: ogImage } : {}),
-      ...(mv.imdb_id ? { sameAs: `https://www.imdb.com/title/${mv.imdb_id}/` } : {}),
-      ...(mv.genres && mv.genres.length ? { genre: mv.genres } : {}),
-      ...(mv.runtime_min ? { duration: `PT${mv.runtime_min}M` } : {}),
-      url: `https://asseeninmovies.com/movie/${id}`,
+      '@graph': [
+        {
+          '@type': 'Movie',
+          name: mv.title,
+          ...(mv.release_year ? { datePublished: String(mv.release_year) } : {}),
+          ...(mv.overview ? { description: mv.overview } : {}),
+          ...(mv.poster_url ? { image: ogImage } : {}),
+          ...(mv.imdb_id ? { sameAs: `https://www.imdb.com/title/${mv.imdb_id}/` } : {}),
+          ...(mv.genres && mv.genres.length ? { genre: mv.genres } : {}),
+          ...(mv.runtime_min ? { duration: `PT${mv.runtime_min}M` } : {}),
+          url: `https://asseeninmovies.com/movie/${id}`,
+        },
+        {
+          '@type': 'BreadcrumbList',
+          itemListElement: [
+            { '@type': 'ListItem', position: 1, name: 'Home',   item: 'https://asseeninmovies.com/' },
+            { '@type': 'ListItem', position: 2, name: 'Movies', item: 'https://asseeninmovies.com/movies' },
+            { '@type': 'ListItem', position: 3, name: mv.title, item: `https://asseeninmovies.com/movie/${id}` },
+          ],
+        },
+      ],
     });
     const headExtras = `
 <meta name="description" content="${esc(ogDesc)}">
@@ -1170,15 +1182,27 @@ app.get('/person/:id', async (req, res) => {
     const ogDesc = `${person.full_name} — ${profProf}${person.birth_year ? ', born ' + person.birth_year : ''}. Filmography and verified SPOTTED placements on AsSeenInMovies.`;
     const jsonLd = JSON.stringify({
       '@context': 'https://schema.org',
-      '@type': 'Person',
-      name: person.full_name,
-      ...(person.bio ? { description: person.bio.slice(0, 800) } : {}),
-      ...(person.headshot_url ? { image: ogImage } : {}),
-      ...(person.imdb_id ? { sameAs: `https://www.imdb.com/name/${person.imdb_id}/` } : {}),
-      ...(person.birth_year ? { birthDate: String(person.birth_year) } : {}),
-      ...(person.death_year ? { deathDate: String(person.death_year) } : {}),
-      ...(person.primary_profession && person.primary_profession.length ? { jobTitle: person.primary_profession[0] } : {}),
-      url: `https://asseeninmovies.com/person/${id}`,
+      '@graph': [
+        {
+          '@type': 'Person',
+          name: person.full_name,
+          ...(person.bio ? { description: person.bio.slice(0, 800) } : {}),
+          ...(person.headshot_url ? { image: ogImage } : {}),
+          ...(person.imdb_id ? { sameAs: `https://www.imdb.com/name/${person.imdb_id}/` } : {}),
+          ...(person.birth_year ? { birthDate: String(person.birth_year) } : {}),
+          ...(person.death_year ? { deathDate: String(person.death_year) } : {}),
+          ...(person.primary_profession && person.primary_profession.length ? { jobTitle: person.primary_profession[0] } : {}),
+          url: `https://asseeninmovies.com/person/${id}`,
+        },
+        {
+          '@type': 'BreadcrumbList',
+          itemListElement: [
+            { '@type': 'ListItem', position: 1, name: 'Home',   item: 'https://asseeninmovies.com/' },
+            { '@type': 'ListItem', position: 2, name: 'People', item: 'https://asseeninmovies.com/people' },
+            { '@type': 'ListItem', position: 3, name: person.full_name, item: `https://asseeninmovies.com/person/${id}` },
+          ],
+        },
+      ],
     });
     const headExtras = `
 <meta name="description" content="${esc(ogDesc)}">

← fd70620 asseeninmovies: /spotted ItemList JSON-LD — each placement e  ·  back to AsSeenInMovies  ·  asseeninmovies: GET /about — editorial explainer page (what b7aaa6e →