[object Object]

← back to AsSeenInMovies

asseeninmovies: /spotted ItemList JSON-LD — each placement emitted as schema.org/Product (name/brand/category/url anchored to #spotted-N on the parent movie page) inside an ItemList with position + numberOfItems. Eligible for Google rich-snippet 'list of products' carousels in search results.

fd7062085ca6ad9364233a456f48b3df1086a294 · 2026-05-12 19:20:14 -0700 · SteveStudio2

Files touched

Diff

commit fd7062085ca6ad9364233a456f48b3df1086a294
Author: SteveStudio2 <stevestudio2@SteveStacStudio.lan>
Date:   Tue May 12 19:20:14 2026 -0700

    asseeninmovies: /spotted ItemList JSON-LD — each placement emitted as schema.org/Product (name/brand/category/url anchored to #spotted-N on the parent movie page) inside an ItemList with position + numberOfItems. Eligible for Google rich-snippet 'list of products' carousels in search results.
---
 server.js | 22 +++++++++++++++++++++-
 1 file changed, 21 insertions(+), 1 deletion(-)

diff --git a/server.js b/server.js
index ad0c1ca..83dbb82 100644
--- a/server.js
+++ b/server.js
@@ -403,7 +403,27 @@ app.get('/spotted', async (req, res) => {
       ${filterBar}
       ${rows || '<p class="empty">No verified placements in this category yet.</p>'}
       ${pager}`;
-    res.type('html').send(htmlShell(cat ? 'Spotted · ' + cat : 'Spotted', body, '', 'https://asseeninmovies.com/spotted'));
+    // ItemList schema — rich snippet candidates for the gallery page.
+    // Each Product item links back to its parent movie page; SearchAction
+    // would be redundant since the site WebSite schema covers it.
+    const itemList = {
+      '@context': 'https://schema.org',
+      '@type': 'ItemList',
+      itemListElement: r.rows.map((s, i) => ({
+        '@type': 'ListItem',
+        position: offset + i + 1,
+        item: {
+          '@type': 'Product',
+          name: s.product_name,
+          ...(s.brand ? { brand: { '@type': 'Brand', name: s.brand } } : {}),
+          ...(s.product_category ? { category: s.product_category } : {}),
+          url: `https://asseeninmovies.com/movie/${s.movie_id}#spotted-${s.id}`,
+        },
+      })),
+      numberOfItems: total,
+    };
+    const headExtras = `<script type="application/ld+json">${JSON.stringify(itemList)}</script>`;
+    res.type('html').send(htmlShell(cat ? 'Spotted · ' + cat : 'Spotted', body, headExtras, 'https://asseeninmovies.com/spotted'));
   } catch (e) {
     res.status(500).type('html').send(htmlShell('Error', `<div class="empty">${esc(e.message)}</div>`));
   }

← 56476af asseeninmovies: branded 404 — was leaking stock Express 'Can  ·  back to AsSeenInMovies  ·  asseeninmovies: BreadcrumbList JSON-LD on /movie/:id (Home > b8d4281 →