Use real article authors (remove Staff Reporter): removed mock staticArticles + changed fallback to Broadcast Beat

This commit is contained in:
migration-tooling
2026-05-16 00:54:53 +00:00
parent 3722a34fab
commit 4c0ba55743
8 changed files with 12 additions and 194 deletions

View File

@@ -38,7 +38,7 @@ interface AuthorArticle {
const authors: Record<string, AuthorProfile> = { const authors: Record<string, AuthorProfile> = {
"staff-reporter": { "staff-reporter": {
slug: "staff-reporter", slug: "staff-reporter",
name: "Staff Reporter", name: "Broadcast Beat",
title: "Broadcast Beat Editorial Team", title: "Broadcast Beat Editorial Team",
avatar: "https://img.rocket.new/generatedImages/rocket_gen_img_1aa16f5c7-1766559876206.png", avatar: "https://img.rocket.new/generatedImages/rocket_gen_img_1aa16f5c7-1766559876206.png",
coverImage: "https://img.rocket.new/generatedImages/rocket_gen_img_1aa16f5c7-1766559876206.png", coverImage: "https://img.rocket.new/generatedImages/rocket_gen_img_1aa16f5c7-1766559876206.png",

View File

@@ -20,188 +20,6 @@ interface ArticleItem {
externalUrl?: string; externalUrl?: string;
} }
const staticArticles: ArticleItem[] = [
{
title: "Telestream Expands Its Cloud Services with the Introduction of UP",
excerpt: "New cloud-native platform extends Telestream Cloud Services to support Global Ingest, automation, review, and real-time monitoring across hybrid and distributed production environments.",
category: "BROADCAST",
date: "March 11, 2026",
author: "Staff Reporter",
authorSlug: "staff-reporter",
slug: "telestream-expands-cloud-services-up",
image: "https://img.rocket.new/generatedImages/rocket_gen_img_11ff3d2ff-1773287949660.png",
alt: "Cloud services infrastructure for broadcast production environments",
source: "live"
},
{
title: "Operative Launches AOS Configuration for Digital-First Monetization",
excerpt: "Enterprise-grade intelligent ad management built to scale digital-first revenue across every channel — from linear to streaming and everything in between.",
category: "BROADCAST",
date: "March 11, 2026",
author: "James Whitfield",
authorSlug: "james-whitfield",
slug: "operative-launches-aos-configuration",
image: "https://img.rocket.new/generatedImages/rocket_gen_img_1805d1575-1773287951103.png",
alt: "Digital monetization analytics dashboard for broadcast advertising",
source: "live"
},
{
title: "Calrec Redefines Broadcast Workflows at NAB 2026 with its Most Powerful Audio Lineup Yet",
excerpt: "The broadcast industry is going through a rapid evolution that's signalling a more collaborative and location-independent future for live production.",
category: "BROADCAST",
date: "March 10, 2026",
author: "Sarah Chen",
authorSlug: "sarah-chen",
slug: "calrec-redefines-broadcast-workflows-nab-2026",
image: "https://img.rocket.new/generatedImages/rocket_gen_img_10468e182-1773287953747.png",
alt: "Calrec audio mixing console for broadcast production at NAB 2026",
source: "live"
},
{
title: "Ease Live Powers Interactive Premier Padel Experiences on Red Bull TV as Viewership Surges 30%",
excerpt: "Real-time fan engagement enhances viewing and accelerates growth of the world's fastest-growing racket sport across digital broadcast platforms.",
category: "BROADCAST",
date: "March 10, 2026",
author: "Marcus Rivera",
authorSlug: "marcus-rivera",
slug: "ease-live-premier-padel-red-bull-tv",
image: "https://img.rocket.new/generatedImages/rocket_gen_img_1747232a3-1773287951222.png",
alt: "Interactive sports broadcast experience on streaming platform",
source: "live"
},
{
title: "From Metadata to Meaning: Why Semantic Intelligence Is Media's Next Competitive Advantage",
excerpt: "Strategic conversations about content performance and audience intelligence are shifting the way media organizations approach their metadata strategies.",
category: "FEATURED",
date: "March 9, 2026",
author: "Elena Vasquez",
authorSlug: "elena-vasquez",
slug: "from-metadata-to-meaning-semantic-intelligence",
image: "https://img.rocket.new/generatedImages/rocket_gen_img_1c523ae5f-1773287954372.png",
alt: "Media metadata intelligence and content analytics visualization",
source: "live"
},
{
title: "Mediagenix Title Management Accelerates Content Monetization Through Advanced Semantic Intelligence",
excerpt: "Advancing Semantic Intelligence capabilities to help studios and networks unlock greater value from their content libraries and distribution pipelines.",
category: "POST PRODUCTION",
date: "March 9, 2026",
author: "David Park",
authorSlug: "staff-reporter",
slug: "mediagenix-title-management",
image: "https://img.rocket.new/generatedImages/rocket_gen_img_19f6e3fe6-1769744394519.png",
alt: "Content management system for media title management and monetization",
source: "live"
},
{
title: "Emergent Launches Fusion: The 'Interactive Anything' Platform Transforming Data-Driven Storytelling",
excerpt: "No-code application builder designed to transform complex live data into immersive interactive storytelling experiences for broadcasters and enterprises.",
category: "BROADCAST",
date: "March 8, 2026",
author: "Staff Reporter",
authorSlug: "staff-reporter",
slug: "emergent-launches-fusion-platform",
image: "https://img.rocket.new/generatedImages/rocket_gen_img_188669b2b-1773287951738.png",
alt: "Interactive data storytelling platform for broadcast and enterprise use",
source: "live"
},
{
title: "KOKUSAI DENKI Electric America Welcomes Mondae Hott as Regional Sales Manager, Northeast",
excerpt: "Industry veteran joins the team to drive growth across the northeastern United States broadcast market.",
category: "BROADCAST",
date: "March 8, 2026",
author: "Lisa Thompson",
authorSlug: "staff-reporter",
slug: "kokusai-denki-mondae-hott",
image: "https://img.rocket.new/generatedImages/rocket_gen_img_1b072efa4-1772991129883.png",
alt: "Professional broadcast industry executive portrait in office setting",
source: "live"
},
{
title: "Matrox Video Enables the Next Era of Software-Defined Media Production at NAB 2026",
excerpt: "New solutions demonstrated at NAB 2026 showcase how software-defined workflows are reshaping the economics and flexibility of professional media production.",
category: "BROADCAST",
date: "March 7, 2026",
author: "Carlos Mendez",
authorSlug: "staff-reporter",
slug: "matrox-video-software-defined-nab-2026",
image: "https://img.rocket.new/generatedImages/rocket_gen_img_17266f6cf-1773287953058.png",
alt: "Matrox video production hardware and software at NAB 2026 exhibition",
source: "live"
},
{
title: "GlobalM Introduces Distributed Video Gateway Architecture, Advancing Scalable Live IP Transport",
excerpt: "New distributed architecture addresses the growing demand for scalable, resilient live IP transport solutions in modern broadcast infrastructure.",
category: "BROADCAST",
date: "March 7, 2026",
author: "Staff Reporter",
authorSlug: "staff-reporter",
slug: "globalm-distributed-video-gateway",
image: "https://img.rocket.new/generatedImages/rocket_gen_img_1876db6da-1773287949606.png",
alt: "Network infrastructure for distributed video gateway IP transport system",
source: "live"
},
{
title: "Video is King: 2026 Iconik Media Stats Report Finds Video Consumes 64% of Storage Needs",
excerpt: "Annual media statistics report reveals video's growing dominance in enterprise storage requirements, with implications for media asset management strategies.",
category: "FEATURED",
date: "March 6, 2026",
author: "Rachel Kim",
authorSlug: "rachel-kim",
slug: "video-is-king-2026-iconik-media-stats",
image: "https://img.rocket.new/generatedImages/rocket_gen_img_140568f68-1773287953452.png",
alt: "Video storage statistics and media asset management data visualization",
source: "live"
},
{
title: "QuickLink's Latest StudioEdge Models to Make North American Debut at NAB 2026",
excerpt: "New StudioEdge models bring enhanced remote production capabilities and simplified IP workflows to North American broadcast professionals.",
category: "BROADCAST",
date: "March 6, 2026",
author: "Tom Bradley",
authorSlug: "staff-reporter",
slug: "quicklink-studioedge-nab-2026",
image: "https://img.rocket.new/generatedImages/rocket_gen_img_19c4ba922-1773287953682.png",
alt: "QuickLink StudioEdge broadcast production equipment at NAB exhibition",
source: "live"
},
{
title: "Cost Savings, Scalability, and Smarter Monetization: Viaccess-Orca Brings Efficiency to NAB 2026",
excerpt: "Purpose-driven solutions designed to help broadcasters reduce operational costs while improving content monetization across all distribution channels.",
category: "BROADCAST",
date: "March 5, 2026",
author: "Staff Reporter",
authorSlug: "staff-reporter",
slug: "viaccess-orca-nab-2026",
image: "https://img.rocket.new/generatedImages/rocket_gen_img_12c71bf4d-1768883320639.png",
alt: "Broadcast technology monetization solutions at NAB Show 2026",
source: "live"
},
{
title: "Digital Alert Systems Unveils Version 6 Software for DASDEC-III Platforms",
excerpt: "Major software update brings enhanced EAS capabilities, improved user interface, and expanded integration options for emergency alerting systems.",
category: "BROADCAST",
date: "March 5, 2026",
author: "Nina Okafor",
authorSlug: "staff-reporter",
slug: "digital-alert-systems-dasdec-iii-v6",
image: "https://img.rocket.new/generatedImages/rocket_gen_img_116c1855d-1773287954967.png",
alt: "Emergency alert system DASDEC-III platform software interface",
source: "live"
},
{
title: "Utah Scientific Expands Technology Partner Program With Integrations From Audinate, Bitfocus, and Skaarhoj",
excerpt: "New partnerships extend the ecosystem of compatible solutions for Utah Scientific routing and control systems in professional broadcast facilities.",
category: "BROADCAST",
date: "March 4, 2026",
author: "Staff Reporter",
authorSlug: "staff-reporter",
slug: "utah-scientific-partner-program",
image: "https://img.rocket.new/generatedImages/rocket_gen_img_1ea12f02f-1768375990494.png",
alt: "Broadcast routing and control system technology partner integration",
source: "live"
}
];
const ALL_CATEGORIES = ["All", "BROADCAST", "FEATURED", "POST PRODUCTION", "ANIMATION"]; const ALL_CATEGORIES = ["All", "BROADCAST", "FEATURED", "POST PRODUCTION", "ANIMATION"];
@@ -292,7 +110,7 @@ export default function ArticleFeed() {
}; };
// Merge: interleave imported posts with static (imported first by recency, then static) // Merge: interleave imported posts with static (imported first by recency, then static)
const allArticles: ArticleItem[] = [...wpPosts, ...staticArticles]; const allArticles: ArticleItem[] = [...wpPosts];
const uniqueAuthors = getUniqueAuthors(allArticles); const uniqueAuthors = getUniqueAuthors(allArticles);

View File

@@ -275,7 +275,7 @@ export default function NewsPage({ articles }: { articles: Article[] }) {
</h2> </h2>
<p className="text-[#777] font-body text-sm leading-relaxed line-clamp-2">{article.excerpt || ""}</p> <p className="text-[#777] font-body text-sm leading-relaxed line-clamp-2">{article.excerpt || ""}</p>
<div className="flex items-center gap-2 mt-2"> <div className="flex items-center gap-2 mt-2">
<span className="text-[#555] font-body text-xs">By {article.author || "Staff Reporter"}</span> <span className="text-[#555] font-body text-xs">By {article.author || "Broadcast Beat"}</span>
<span className="text-[#444] text-[10px]">·</span> <span className="text-[#444] text-[10px]">·</span>
<span className="text-[#555] font-body text-xs">{article.readTime || ""}</span> <span className="text-[#555] font-body text-xs">{article.readTime || ""}</span>
</div> </div>

View File

@@ -84,7 +84,7 @@ export default async function SearchPage({ searchParams }: SearchPageProps) {
{article.excerpt || ""} {article.excerpt || ""}
</p> </p>
<div className="flex items-center gap-2 mt-2"> <div className="flex items-center gap-2 mt-2">
<span className="text-[#555] font-body text-xs">By {article.author || "Staff Reporter"}</span> <span className="text-[#555] font-body text-xs">By {article.author || "Broadcast Beat"}</span>
<span className="text-[#444] text-[10px]">·</span> <span className="text-[#444] text-[10px]">·</span>
<span className="text-[#555] font-body text-xs">{article.readTime || ""}</span> <span className="text-[#555] font-body text-xs">{article.readTime || ""}</span>
</div> </div>

View File

@@ -78,7 +78,7 @@ async function fetchArticles(refs: ArticleRef[]): Promise<UnifiedArticle[]> {
excerpt: r.excerpt || "", excerpt: r.excerpt || "",
image: null, image: null,
date: r.published_at || r.created_at, date: r.published_at || r.created_at,
author: Array.isArray(r.persona) ? r.persona[0]?.name || "Staff Reporter" : r.persona?.name || "Staff Reporter", author: Array.isArray(r.persona) ? r.persona[0]?.name || "Broadcast Beat" : r.persona?.name || "Broadcast Beat",
source_table: "ai_rewritten", source_table: "ai_rewritten",
}); });
} }
@@ -96,7 +96,7 @@ async function fetchArticles(refs: ArticleRef[]): Promise<UnifiedArticle[]> {
excerpt: r.excerpt || "", excerpt: r.excerpt || "",
image: r.featured_image, image: r.featured_image,
date: r.wp_published_at, date: r.wp_published_at,
author: r.author_name || "Staff Reporter", author: r.author_name || "Broadcast Beat",
source_table: "wp_imported", source_table: "wp_imported",
}); });
} }

View File

@@ -104,7 +104,7 @@ export default async function FeaturedBento() {
</p> </p>
)} )}
<div className="mt-4 flex flex-wrap items-center gap-3 text-[11px] font-mono text-[#9ca3af]"> <div className="mt-4 flex flex-wrap items-center gap-3 text-[11px] font-mono text-[#9ca3af]">
<span>{hero.author_name || "Staff Reporter"}</span> <span>{hero.author_name || "Broadcast Beat"}</span>
<span>·</span> <span>·</span>
<span>{ago(hero.wp_published_at)}</span> <span>{ago(hero.wp_published_at)}</span>
<span aria-hidden="true" className="text-[var(--color-text-info,#60a5fa)] ml-2"> Read full story</span> <span aria-hidden="true" className="text-[var(--color-text-info,#60a5fa)] ml-2"> Read full story</span>

View File

@@ -54,7 +54,7 @@ export default async function FeaturedCarouselServer() {
for (const r of (ai.data || []) as any[]) { for (const r of (ai.data || []) as any[]) {
const persona = Array.isArray(r.persona) ? r.persona[0] : r.persona; const persona = Array.isArray(r.persona) ? r.persona[0] : r.persona;
const author = persona?.name || "Staff Reporter"; const author = persona?.name || "Broadcast Beat";
slides.push({ slides.push({
id: r.id, id: r.id,
slug: r.slug, slug: r.slug,
@@ -74,7 +74,7 @@ export default async function FeaturedCarouselServer() {
for (const r of (wp.data || []) as any[]) { for (const r of (wp.data || []) as any[]) {
const image = r.featured_image ? rewriteLegacyImageUrl(r.featured_image) : null; const image = r.featured_image ? rewriteLegacyImageUrl(r.featured_image) : null;
const author = r.author_name || "Staff Reporter"; const author = r.author_name || "Broadcast Beat";
slides.push({ slides.push({
id: String(r.wp_id), id: String(r.wp_id),
slug: r.wp_slug, slug: r.wp_slug,

View File

@@ -112,7 +112,7 @@ function rowToArticle(row: ImportedPostRow, section: Section = "news"): Article
? rewriteLegacyImageUrl(row.featured_image) ? rewriteLegacyImageUrl(row.featured_image)
: FALLBACK_IMAGE; : FALLBACK_IMAGE;
const content = rewriteLegacyImageUrlsInHtml(row.content || ""); const content = rewriteLegacyImageUrlsInHtml(row.content || "");
const author = row.author_name || "Staff Reporter"; const author = row.author_name || "Broadcast Beat";
return { return {
slug: row.wp_slug, slug: row.wp_slug,
section, section,
@@ -145,7 +145,7 @@ function inferSectionFromCategory(cat: string | null): Section {
function rewriteRowToArticle(row: RewriteRow, sectionOverride?: Section): Article { function rewriteRowToArticle(row: RewriteRow, sectionOverride?: Section): Article {
const sortedPublishedAt = row.published_at || row.created_at; const sortedPublishedAt = row.published_at || row.created_at;
const persona = Array.isArray(row.persona) ? row.persona[0] || null : row.persona || null; const persona = Array.isArray(row.persona) ? row.persona[0] || null : row.persona || null;
const author = persona?.name || "Staff Reporter"; const author = persona?.name || "Broadcast Beat";
const personaSlug = persona?.slug || "staff-reporter"; const personaSlug = persona?.slug || "staff-reporter";
const avatar = persona?.avatar_url || FALLBACK_IMAGE; const avatar = persona?.avatar_url || FALLBACK_IMAGE;
return { return {
@@ -157,7 +157,7 @@ function rewriteRowToArticle(row: RewriteRow, sectionOverride?: Section): Articl
date: formatDate(sortedPublishedAt), date: formatDate(sortedPublishedAt),
author, author,
authorSlug: personaSlug, authorSlug: personaSlug,
authorTitle: persona?.beat ? humanBeat(persona.beat) : "Staff Reporter", authorTitle: persona?.beat ? humanBeat(persona.beat) : "Broadcast Beat",
authorAvatar: avatar, authorAvatar: avatar,
image: REWRITE_FALLBACK_IMAGE, image: REWRITE_FALLBACK_IMAGE,
alt: row.title, alt: row.title,