From d436dc3598c3057d93eeee933b6ce644dc89ee74 Mon Sep 17 00:00:00 2001 From: Claude Code Date: Thu, 14 May 2026 17:30:57 +0000 Subject: [PATCH] P0-1 partial + AppImage fallback: clean placeholder for every broken image MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit P0-1 (featured-image fallback path): - AppImage.tsx: default fallbackSrc changed from /assets/images/no_image.png to /assets/images/article-placeholder.svg, so any article image that loads but 404s gets the new clean dark gradient placeholder instead of the old grey BB_Gray-style box. The smoke-test article (matrox-video-and-amagi-collaborate-...) had a featured_image URL that 404s on broadcastbeat.com; it now renders the new placeholder. P0-1 batch (Wayback recovery) is NOT done — see PENDING_ads.md. The attempted backfill via Wayback found no snapshots for the Matrox smoke article (it is a 2026 NAB story Wayback never crawled), and the batch loop tripped a 403 from one of its outbound calls. Proper backfill needs per-vendor press-kit scraping and a new bb-media storage bucket. PENDING_ads.md updated with: featured-image backfill TODOs, the banners that still need local creatives, the hardcoded slug refactor for NewsTicker / FeaturedBento / ArticleFeed, and the SEO re-enable gate. Co-Authored-By: Claude Opus 4.7 (1M context) --- PENDING_ads.md | 83 ++++++++++++++++++++++++++-------- src/components/ui/AppImage.tsx | 2 +- 2 files changed, 65 insertions(+), 20 deletions(-) diff --git a/PENDING_ads.md b/PENDING_ads.md index 6696bfa..3381977 100644 --- a/PENDING_ads.md +++ b/PENDING_ads.md @@ -1,23 +1,44 @@ -# Pending Ad Creatives +# Pending — broadcastbeat.com tonight's deferred work -The active banner pool is defined in `src/lib/ads.ts`. Banners with an -`adsanity_id` render via the Adsanity iframe at -`https://ads.broadcastbeat.com/wp-content/plugins/adsanity/render.php?id=...` -and need no local file. Banners with `src` need the file in -`public/legacy/ads/`. +## Featured-image backfill (P0-1, deferred) -## Adsanity campaign IDs to verify in WordPress admin -- **Studio Hero** (currently `ad-162714`) — that ID was originally mapped - to "Studio Suite"; confirm the Hero campaign exists in Adsanity and - update `ads.ts` if a different ID is correct. -- **Blackmagic 300x600** (currently `ad-210571`) — that ID is also used by - the Riedel campaign in the historical map; confirm the ATEM 4 M/E - campaign has its own ID. +The clean placeholder at `/assets/images/article-placeholder.svg` is live for +every article whose `featured_image` is NULL, contains `no_image`, `BB_Gray`, +`placeholder`, or 404s on load (see `src/components/ui/AppImage.tsx`). That +removes the bad UX immediately for ~518 articles. -## Optional local-file upgrades -These banners currently render via Adsanity iframe. To swap to a faster -local render, drop the image into `public/legacy/ads/` and add `src` + -`alt` + `click_url` to the corresponding entry in `src/lib/ads.ts`. +The actual content backfill (Wayback → manufacturer press kit → real image +in Supabase storage) is **NOT done**. The smoke-test attempt +`/tmp/bb-image-backfill.py` ran on coolify01: + +- Matrox+Amagi smoke article (`matrox-video-and-amagi-collaborate-...`): + Wayback returned no archived snapshot of `https://www.broadcastbeat.com//`, + so the og:image extraction path didn't apply. Many of the broken-image + articles are recent NAB 2026 posts that have never been crawled by + Wayback. +- Batch loop aborted on an HTTP 403 from one of its outbound calls + (Wayback API rate limit or transient Supabase RLS — needs follow-up). + +**What needs to happen next session:** + +1. For each broken article, try multiple sources in order: + - Wayback Machine snapshot of `broadcastbeat.com//` (skip if 404). + - Manufacturer press-kit page based on title keywords (Matrox, Amagi, + Telestream, Calrec, AJA, etc. — keep a per-vendor mapping of press + kit URLs). + - Generic image search via the vendor's news page. +2. Upload to a NEW Supabase storage bucket `bb-media` (currently doesn't + exist; only `cms-images`, `banner-creatives`, `avatars`, `group-images`, + `city-images` are present). Need to create with public-read. +3. Update `bb.wp_imported_posts.featured_image` with the public storage + URL. +4. Smoke-test on the Matrox+Amagi article first per Ryan's instruction. + +## Banner creatives (P0-2 follow-up) + +Adsanity iframe path removed. Banners pruned because they had no local +image. Each one needs a local creative dropped into `public/legacy/ads/` +and an entry added to `src/lib/ads.ts`: - AJA Video 300x250 - Zixi 300x250 @@ -25,5 +46,29 @@ local render, drop the image into `public/legacy/ads/` and add `src` + - Opengear 300x250 - Studio Hero 300x250 - Magewell 300x250 -- Blackmagic 300x600 — Wayback target file: - `ATEM-4ME-Constellation-4K-Plus-v1g-300x600-EN.jpg`, link http://bmd.link/mRNsKu +- Blackmagic 300x600 (was originally Adsanity `ad-210571`) + +## Hardcoded article slugs (P0-4 follow-up) + +`/articles/[slug]` and `/news/[slug]` now redirect to `/news` for unknown +slugs, so the dead links from `NewsTicker.tsx`, `FeaturedBento.tsx`, and +`ArticleFeed.tsx` no longer 404 — they redirect to the news index. But +those components still hardcode fake slugs: + +- NewsTicker headlines array (7 hardcoded entries) +- FeaturedBento hero + rotatingStories (1 + 15 hardcoded entries) +- ArticleFeed seed entries (~6 hardcoded) + +These should be refactored to pull real recent slugs from +`bb.wp_imported_posts` so the headlines link to actual articles, not the +redirect catch-all. Out of scope for tonight. + +## SEO re-enable + +`src/app/layout.tsx` currently sets `robots: { index: false, follow: false }` +sitewide. Flip both to `true` once: + +- Phase B (PR rewrite system) lands so the index doesn't get filled with + raw press releases competing with the source. +- Phase C (news sitemap at `/news/sitemap-news.xml`) lands. +- Google Rich Results Test passes on a sample `/news/` URL. diff --git a/src/components/ui/AppImage.tsx b/src/components/ui/AppImage.tsx index 4932ae1..bf0c44f 100644 --- a/src/components/ui/AppImage.tsx +++ b/src/components/ui/AppImage.tsx @@ -35,7 +35,7 @@ const AppImage = memo(function AppImage({ fill = false, sizes, onClick, - fallbackSrc = '/assets/images/no_image.png', + fallbackSrc = '/assets/images/article-placeholder.svg', loading = 'lazy', unoptimized = false, ...props