Improve website content and fix navigation issues

Update website meta tags, SEO information, and fix a banner overlay bug to ensure all interactive elements are clickable.

Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 23852c00-4779-460a-9e0c-d09fee4b6c92
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: 60ed045f-57e0-4c65-bc71-4205e0064bbb
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/f209e72a-0939-48fa-84fc-57854de71967/23852c00-4779-460a-9e0c-d09fee4b6c92/aNXfGlM
Replit-Helium-Checkpoint-Created: true
This commit is contained in:
sebastjanartic 2026-03-07 15:46:13 +00:00
parent 6c99a3fd4b
commit b320d8b601
23 changed files with 96 additions and 38 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

View File

@ -3,11 +3,11 @@
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1" />
<title>Volksmusik & Schlager | Folx Music Television</title>
<meta name="description" content="FOLX TV Ihr Fernsehsender für Volksmusik und Schlager. Musikvideos, Live-Shows, Interviews und aktuelle Nachrichten aus der Welt der volkstümlichen Musik. Jetzt einschalten!" />
<meta name="keywords" content="Volksmusik, Schlager, Volksmusik TV, Schlager TV, Folx TV, volkstümliche Musik, Musiksender, Alpenmusik, Volksmusik Nachrichten, Schlager News, Musikvideos, Live Shows" />
<meta property="og:title" content="Volksmusik & Schlager | Folx Music Television" />
<meta property="og:description" content="FOLX TV Ihr Fernsehsender für Volksmusik und Schlager. Musikvideos, Live-Shows und aktuelle Nachrichten aus der volkstümlichen Musikszene." />
<title>Volksmusik & Schlager TV | FOLX Music Television Nachrichten, Videos & mehr</title>
<meta name="description" content="FOLX TV Ihr Fernsehsender Nr. 1 für Volksmusik und Schlager. Aktuelle Nachrichten, Musikvideos, Künstlerporträts, Live-Shows und Interviews aus der Welt der volkstümlichen Musik. Jetzt einschalten!" />
<meta name="keywords" content="Volksmusik, Schlager, Volksmusik TV, Schlager TV, Folx TV, FOLX Music Television, volkstümliche Musik, Musiksender, Alpenmusik, Volksmusik Nachrichten, Schlager News, Musikvideos, Live Shows, Volksmusik Künstler, Schlager Stars, Oberkrainer, Volksmusik Sender, Schlager Hits, volkstümliche Schlager" />
<meta property="og:title" content="Volksmusik & Schlager TV | FOLX Music Television" />
<meta property="og:description" content="FOLX TV Ihr Fernsehsender Nr. 1 für Volksmusik und Schlager. Aktuelle Nachrichten, Musikvideos, Künstlerporträts und Live-Shows." />
<meta property="og:type" content="website" />
<meta property="og:site_name" content="Folx Music Television" />
<meta property="og:url" content="https://folx.tv/" />
@ -19,8 +19,8 @@
<meta property="og:image:alt" content="FOLX Network - Volksmusik & Schlager TV" />
<meta property="og:locale" content="de_DE" />
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:title" content="Volksmusik & Schlager | Folx Music Television" />
<meta name="twitter:description" content="FOLX TV Ihr Fernsehsender für Volksmusik und Schlager. Musikvideos, Live-Shows und aktuelle Nachrichten." />
<meta name="twitter:title" content="Volksmusik & Schlager TV | FOLX Music Television" />
<meta name="twitter:description" content="FOLX TV Ihr Fernsehsender Nr. 1 für Volksmusik und Schlager. Aktuelle Nachrichten, Musikvideos und Live-Shows." />
<meta name="twitter:image" content="https://folx.tv/og-image.jpg" />
<meta property="fb:pages" content="1428520781492675" />
<meta name="facebook-domain-verification" content="b4y482htm54uybm563tfr1ucb1n46w" />

View File

@ -16,8 +16,8 @@ export default function Footer() {
<div>
<h3 className="font-bold text-card-foreground text-lg mb-3">Folx Music Television</h3>
<p className="text-muted-foreground text-sm leading-relaxed mb-4">
Folx Music Television. Aktuelle Nachrichten, Interviews und
Hintergrundberichte aus der Welt der Volksmusik und des Schlagers.
FOLX TV Ihr Fernsehsender Nr. 1 für Volksmusik und Schlager. Aktuelle Nachrichten,
Musikvideos, Künstlerporträts, Live-Shows und Interviews aus der Welt der volkstümlichen Musik.
</p>
<div className="flex gap-3">
{SOCIAL_LINKS.map((s) => (

View File

@ -45,7 +45,7 @@ export default function Header() {
<div className="flex items-center justify-between gap-4 h-16">
<Link href="/">
<div className="flex items-center gap-2 cursor-pointer" data-testid="link-logo">
<img src={folxLogo} alt="Folx TV" className="h-32 w-auto object-contain py-1" />
<img src={folxLogo} alt="FOLX TV Volksmusik & Schlager Fernsehsender" className="h-32 w-auto object-contain py-1" />
</div>
</Link>

View File

@ -49,8 +49,8 @@ export default function PushPromptBanner() {
if (!visible) return null;
return (
<div className="fixed bottom-4 left-4 right-4 md:left-auto md:right-6 md:max-w-sm z-50 animate-in slide-in-from-bottom-4 fade-in duration-500" data-testid="push-prompt-banner">
<div className="bg-card border border-card-border rounded-xl shadow-2xl p-4">
<div className="fixed bottom-4 right-4 md:right-6 max-w-sm z-50 animate-in slide-in-from-bottom-4 fade-in duration-500 pointer-events-none" data-testid="push-prompt-banner">
<div className="bg-card border border-card-border rounded-xl shadow-2xl p-4 pointer-events-auto">
<div className="flex items-start gap-3">
<div className="flex-shrink-0 w-10 h-10 rounded-full bg-primary/10 flex items-center justify-center">
<Bell className="w-5 h-5 text-primary" />

View File

@ -31,11 +31,24 @@ function removeMetaTag(selector: string) {
if (el) el.remove();
}
const DEFAULT_TITLE = "Volksmusik & Schlager | Folx Music Television";
const DEFAULT_DESC = "FOLX TV Ihr Fernsehsender für Volksmusik und Schlager. Musikvideos, Live-Shows, Interviews und aktuelle Nachrichten aus der Welt der volkstümlichen Musik. Jetzt einschalten!";
const DEFAULT_OG_TITLE = "Volksmusik & Schlager | Folx Music Television";
const DEFAULT_OG_DESC = "FOLX TV Ihr Fernsehsender für Volksmusik und Schlager. Musikvideos, Live-Shows und aktuelle Nachrichten aus der volkstümlichen Musikszene.";
const DEFAULT_TITLE = "Volksmusik & Schlager TV | FOLX Music Television Nachrichten, Videos & mehr";
const DEFAULT_DESC = "FOLX TV Ihr Fernsehsender Nr. 1 für Volksmusik und Schlager. Aktuelle Nachrichten, Musikvideos, Künstlerporträts, Live-Shows und Interviews aus der Welt der volkstümlichen Musik. Jetzt einschalten!";
const DEFAULT_OG_TITLE = "Volksmusik & Schlager TV | FOLX Music Television";
const DEFAULT_OG_DESC = "FOLX TV Ihr Fernsehsender Nr. 1 für Volksmusik und Schlager. Aktuelle Nachrichten, Musikvideos, Künstlerporträts und Live-Shows.";
const DEFAULT_OG_IMAGE = "https://folx.tv/og-image.jpg";
const CANONICAL_BASE = "https://folx.tv";
function setCanonical(href: string) {
let link = document.querySelector('link[rel="canonical"]') as HTMLLinkElement;
if (link) {
link.href = href;
} else {
link = document.createElement("link");
link.rel = "canonical";
link.href = href;
document.head.appendChild(link);
}
}
export function usePageMeta(title: string, description?: string, og?: OgMeta) {
useEffect(() => {
@ -44,6 +57,12 @@ export function usePageMeta(title: string, description?: string, og?: OgMeta) {
if (description) {
setMetaTag('meta[name="description"]', description);
}
const canonicalPath = og?.ogUrl || `${CANONICAL_BASE}${window.location.pathname}`;
const canonicalUrl = canonicalPath.startsWith("http") ? canonicalPath : `${CANONICAL_BASE}${canonicalPath}`;
setCanonical(canonicalUrl);
setMetaTag('meta[property="og:url"]', canonicalUrl);
if (og) {
if (og.ogTitle) setMetaTag('meta[property="og:title"]', og.ogTitle);
if (og.ogDescription) setMetaTag('meta[property="og:description"]', og.ogDescription);
@ -53,9 +72,6 @@ export function usePageMeta(title: string, description?: string, og?: OgMeta) {
setMetaTag('meta[name="twitter:image"]', og.ogImage);
}
if (og.ogType) setMetaTag('meta[property="og:type"]', og.ogType);
if (og.ogUrl) {
setMetaTag('meta[property="og:url"]', og.ogUrl);
}
setMetaTag('meta[name="twitter:title"]', og.ogTitle || title + suffix);
setMetaTag('meta[name="twitter:description"]', og.ogDescription || description || DEFAULT_OG_DESC);
@ -82,6 +98,7 @@ export function usePageMeta(title: string, description?: string, og?: OgMeta) {
setMetaTag('meta[name="twitter:image"]', DEFAULT_OG_IMAGE);
setMetaTag('meta[property="og:type"]', "website");
setMetaTag('meta[property="og:url"]', "https://folx.tv/");
setCanonical("https://folx.tv/");
removeMetaTag('meta[property="article:published_time"]');
removeMetaTag('meta[property="article:modified_time"]');
removeMetaTag('meta[property="article:author"]');

View File

@ -5,7 +5,7 @@ import { usePageMeta } from "@/hooks/use-page-meta";
import { PageSideAds } from "@/components/adsense";
export default function AboutPage() {
usePageMeta("Über FOLX TV - Volksmusik & Schlager Fernsehsender", "Alles über FOLX TV Ihren Fernsehsender für Volksmusik und Schlager seit 2013.");
usePageMeta("Über FOLX TV - Volksmusik & Schlager Fernsehsender", "Alles über FOLX TV Ihren Volksmusik & Schlager Fernsehsender seit 2013. Programm, Geschichte und das Team hinter dem Volksmusik-Sender.");
return (
<div className="min-h-screen bg-background">
<Header />

View File

@ -150,12 +150,22 @@ export default function ArticlePage() {
"@id": articleUrl
},
"articleSection": article.category || "News",
"inLanguage": "de"
"inLanguage": "de",
"keywords": `Volksmusik, Schlager, ${article.category || "News"}, ${article.title}`
};
const breadcrumbLd = {
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{ "@type": "ListItem", "position": 1, "name": "FOLX TV", "item": "https://folx.tv" },
{ "@type": "ListItem", "position": 2, "name": article.category || "News", "item": `https://folx.tv/category/${encodeURIComponent(article.category || "News")}` },
{ "@type": "ListItem", "position": 3, "name": article.title, "item": articleUrl }
]
};
const script = document.createElement("script");
script.type = "application/ld+json";
script.id = "article-jsonld";
script.textContent = JSON.stringify(jsonLd);
script.textContent = JSON.stringify([jsonLd, breadcrumbLd]);
const existing = document.getElementById("article-jsonld");
if (existing) existing.remove();
document.head.appendChild(script);

View File

@ -30,7 +30,7 @@ export default function CategoryPage() {
usePageMeta(
`${category}${currentPage > 1 ? ` Seite ${currentPage}` : ""} - Volksmusik & Schlager`,
`Aktuelle ${category}-Beiträge aus der Volksmusik- und Schlagerszene bei FOLX TV.`
`Aktuelle ${category}-Beiträge und Nachrichten aus der Volksmusik- und Schlagerszene. Neueste Volksmusik-Meldungen bei FOLX TV.`
);
const { data, isLoading } = useQuery<PaginatedResponse>({

View File

@ -5,7 +5,7 @@ import { usePageMeta } from "@/hooks/use-page-meta";
import { PageSideAds } from "@/components/adsense";
export default function DatenschutzPage() {
usePageMeta("Datenschutz - FOLX TV", "Datenschutzerklärung von FOLX TV Ihr Volksmusik & Schlager Fernsehsender.");
usePageMeta("Datenschutz - FOLX TV Volksmusik Sender", "Datenschutzerklärung von FOLX TV Ihrem Volksmusik & Schlager Fernsehsender.");
return (
<div className="min-h-screen bg-background">
<Header />

View File

@ -34,7 +34,7 @@ const COUNTRIES = [
];
export default function EmpfangPage() {
usePageMeta("Empfang FOLX TV - Volksmusik & Schlager Sender empfangen", "So empfangen Sie FOLX TV Ihren Volksmusik & Schlager Sender in Deutschland, Österreich und der Schweiz.");
usePageMeta("Empfang FOLX TV - Volksmusik & Schlager Sender empfangen", "So empfangen Sie FOLX TV den Volksmusik & Schlager Sender in Deutschland, Österreich und der Schweiz. Kabel, Satellit und Streaming-Optionen.");
return (
<div className="min-h-screen bg-background">
<Header />

View File

@ -7,7 +7,7 @@ import { usePageMeta } from "@/hooks/use-page-meta";
import { InArticleAd, PageSideAds } from "@/components/adsense";
export default function GalleryPageWrapper() {
usePageMeta("Fotogalerie - Volksmusik & Schlager Bilder", "Fotos und Bilder von Volksmusik- und Schlager-Stars bei FOLX TV.");
usePageMeta("Fotogalerie - Volksmusik & Schlager Bilder", "Exklusive Fotos und Bilder von Volksmusik- und Schlager-Stars, Konzerten und Events. Die Volksmusik-Fotogalerie von FOLX TV.");
return (
<div className="min-h-screen bg-background">
<Header />

View File

@ -511,16 +511,16 @@ function BentoSkeleton() {
}
export default function Home() {
usePageMeta("Volksmusik & Schlager", "FOLX TV Aktuelle Nachrichten, Musikvideos und Interviews aus der Welt der Volksmusik und des Schlagers.");
usePageMeta("Volksmusik & Schlager TV", "FOLX TV Ihr Fernsehsender Nr. 1 für Volksmusik und Schlager. Aktuelle Nachrichten, Musikvideos, Künstlerporträts, Live-Shows und Interviews aus der Welt der volkstümlichen Musik.");
useEffect(() => {
const jsonLd = {
"@context": "https://schema.org",
"@type": "WebSite",
"name": "Folx Music Television",
"alternateName": "FOLX TV",
"alternateName": ["FOLX TV", "Volksmusik TV"],
"url": "https://folx.tv",
"description": "FOLX TV Aktuelle Nachrichten, Musikvideos und Interviews aus der Welt der Volksmusik und des Schlagers.",
"description": "FOLX TV Ihr Fernsehsender Nr. 1 für Volksmusik und Schlager. Aktuelle Nachrichten, Musikvideos, Künstlerporträts, Live-Shows und Interviews aus der Welt der volkstümlichen Musik.",
"publisher": {
"@type": "Organization",
"name": "Folx Music Television",
@ -528,7 +528,18 @@ export default function Home() {
"logo": {
"@type": "ImageObject",
"url": `${window.location.origin}/favicon.png`
}
},
"sameAs": [
"https://www.facebook.com/folxtvmusic",
"https://www.instagram.com/folxtv",
"https://www.youtube.com/@FolxTV",
"https://www.tiktok.com/@folx.tv"
]
},
"potentialAction": {
"@type": "SearchAction",
"target": "https://folx.tv/search?q={search_term_string}",
"query-input": "required name=search_term_string"
},
"inLanguage": "de"
};
@ -692,6 +703,7 @@ export default function Home() {
<Header />
<PageSideAds />
<main className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-4 space-y-4">
<h1 className="sr-only">FOLX TV Volksmusik & Schlager Fernsehsender: Nachrichten, Videos und Live-Shows</h1>
<div className="grid grid-cols-1 lg:grid-cols-4 gap-4">
<div className="lg:col-span-3 space-y-4">

View File

@ -369,7 +369,7 @@ function SignDetail({ signIndex, onNavigate, aiHoroscopes }: { signIndex: number
}
export default function HoroscopePage() {
usePageMeta("Horoskop - Volksmusik & Schlager", "Tägliches Horoskop für Volksmusik- und Schlager-Fans bei FOLX TV.");
usePageMeta("Horoskop - Volksmusik & Schlager", "Tägliches Horoskop für alle Sternzeichen. Ihr persönliches Tageshoroskop bei FOLX TV dem Volksmusik & Schlager Sender.");
const params = useParams<{ sign?: string }>();
const [selected, setSelected] = useState<number | null>(null);
const detailRef = useRef<HTMLDivElement>(null);

View File

@ -5,7 +5,7 @@ import { usePageMeta } from "@/hooks/use-page-meta";
import { PageSideAds } from "@/components/adsense";
export default function ImpressumPage() {
usePageMeta("Impressum - FOLX TV", "Impressum und rechtliche Informationen zu FOLX TV Volksmusik & Schlager Fernsehsender.");
usePageMeta("Impressum - FOLX TV Volksmusik Sender", "Impressum und rechtliche Informationen zu FOLX TV Ihrem Volksmusik & Schlager Fernsehsender.");
return (
<div className="min-h-screen bg-background">
<Header />

View File

@ -8,7 +8,7 @@ import { PageSideAds } from "@/components/adsense";
import { apiRequest } from "@/lib/queryClient";
export default function KontaktPage() {
usePageMeta("Kontakt - FOLX TV", "Kontaktieren Sie FOLX TV Ihr Fernsehsender für Volksmusik und Schlager.");
usePageMeta("Kontakt - FOLX TV Volksmusik Sender", "Kontaktieren Sie FOLX TV Ihren Fernsehsender Nr. 1 für Volksmusik und Schlager. Wir freuen uns auf Ihre Nachricht.");
const [formData, setFormData] = useState({ name: "", email: "", subject: "", message: "" });
const [status, setStatus] = useState<"idle" | "sending" | "success" | "error">("idle");

View File

@ -296,7 +296,7 @@ function RecipeModal({ recipe, onClose }: { recipe: Recipe; onClose: () => void
}
export default function RecipesPage() {
usePageMeta("Rezepte - Alpenküche & Schlager", "Traditionelle Rezepte aus der Alpenküche bei FOLX TV kochen wie die Volksmusik-Stars.");
usePageMeta("Rezepte - Alpenküche & Volksmusik", "Traditionelle Rezepte aus der Alpenküche und österreichische Hausmannskost. Kochen wie die Volksmusik-Stars bei FOLX TV.");
const [selectedRecipe, setSelectedRecipe] = useState<Recipe | null>(null);
return (

View File

@ -27,7 +27,7 @@ interface SearchResult {
}
export default function SearchPage() {
usePageMeta("Suche - Volksmusik & Schlager", "Durchsuchen Sie FOLX TV nach Volksmusik- und Schlager-Inhalten.");
usePageMeta("Suche - Volksmusik & Schlager", "Durchsuchen Sie FOLX TV nach Volksmusik- und Schlager-Nachrichten, Künstlern, Videos und mehr.");
const searchString = useSearch();
const initialQuery = new URLSearchParams(searchString).get("q") || "";
const [query, setQuery] = useState(initialQuery);

View File

@ -72,7 +72,7 @@ function VideoCardSkeleton() {
}
export default function VideosPage() {
usePageMeta("Volksmusik & Schlager Videos", "Musikvideos und Live-Auftritte aus der Volksmusik- und Schlagerszene bei FOLX TV.");
usePageMeta("Volksmusik & Schlager Videos", "Volksmusik und Schlager Musikvideos, Live-Auftritte und Konzertmitschnitte bei FOLX TV. Die besten volkstümlichen Hits und Schlager-Stars im Video.");
const searchString = useSearch();
const [, setLocation] = useLocation();

View File

@ -3,6 +3,17 @@
## Overview
The official website for Folx Music Television (folx.tv). Dark-themed bento grid layout with content for folk music (Volksmusik/Schlager) fans. Features articles, videos, photo gallery, horoscope widget + subpage, recipe widget + subpage, Google News feed, and integrated AdSense ads. All content is hardcoded in seed for production deployments.
## SEO
- Primary keyword: "Volksmusik" — used across all page titles, meta descriptions, OG tags, and structured data
- Dynamic canonical URLs via `usePageMeta` hook (updates `<link rel="canonical">` per page)
- SSR article pages: server-side meta tags (OG, Twitter, description, keywords, canonical) in both `server/vite.ts` (dev) and `server/static.ts` (prod)
- `stripExistingMeta()` removes duplicate meta/canonical from base HTML before injecting article-specific ones
- JSON-LD structured data: WebSite (home) with SearchAction, NewsArticle + BreadcrumbList (articles)
- Sitemap at `/sitemap.xml` — includes all static pages, categories, horoscope signs, and articles
- robots.txt disallows `/api/`, `/search`, `/admin/`
- H1 tag on home page (sr-only): "FOLX TV Volksmusik & Schlager Fernsehsender"
- Logo alt text includes "Volksmusik & Schlager Fernsehsender"
## Architecture
- **Frontend**: React + Vite + TailwindCSS + shadcn/ui (dark mode)
- **Backend**: Express.js + Node.js

View File

@ -821,6 +821,7 @@ export async function registerRoutes(
{ loc: "/gallery", priority: "0.7", changefreq: "weekly" },
{ loc: "/horoskop", priority: "0.7", changefreq: "daily" },
{ loc: "/rezepte", priority: "0.6", changefreq: "monthly" },
{ loc: "/kontakt", priority: "0.5", changefreq: "yearly" },
{ loc: "/empfang-folx-tv", priority: "0.5", changefreq: "monthly" },
{ loc: "/ueber-uns", priority: "0.4", changefreq: "yearly" },
{ loc: "/impressum", priority: "0.3", changefreq: "yearly" },
@ -888,6 +889,7 @@ export async function registerRoutes(
Allow: /
Disallow: /api/
Disallow: /search
Disallow: /admin/
Sitemap: https://folx.tv/sitemap.xml
`;

View File

@ -21,6 +21,7 @@ function stripExistingMeta(html: string): string {
html = html.replace(/<meta\s+name="twitter:[^"]*"[^>]*>\s*/gi, "");
html = html.replace(/<meta\s+name="description"[^>]*>\s*/gi, "");
html = html.replace(/<meta\s+name="keywords"[^>]*>\s*/gi, "");
html = html.replace(/<link\s+rel="canonical"[^>]*>\s*/gi, "");
return html;
}
@ -80,7 +81,9 @@ export function serveStatic(app: Express) {
`<meta name="twitter:description" content="${escapeHtml(article.excerpt)}" />`,
`<meta name="twitter:image" content="${escapeHtml(finalImage)}" />`,
`<meta name="description" content="${escapeHtml(article.excerpt)}" />`,
`<title>${escapeHtml(article.title)} - Folx Music Television</title>`,
`<meta name="keywords" content="Volksmusik, Schlager, ${escapeHtml(article.title)}, ${escapeHtml(article.category || 'News')}, FOLX TV" />`,
`<link rel="canonical" href="${escapeHtml(articleUrl)}" />`,
`<title>${escapeHtml(article.title)} - Volksmusik & Schlager | Folx Music Television</title>`,
].join("\n ");
template = template.replace(/<title>[^<]*<\/title>/, ogTags);

View File

@ -27,6 +27,7 @@ function stripExistingMeta(html: string): string {
html = html.replace(/<meta\s+name="twitter:[^"]*"[^>]*>\s*/gi, "");
html = html.replace(/<meta\s+name="description"[^>]*>\s*/gi, "");
html = html.replace(/<meta\s+name="keywords"[^>]*>\s*/gi, "");
html = html.replace(/<link\s+rel="canonical"[^>]*>\s*/gi, "");
return html;
}
@ -101,7 +102,9 @@ export async function setupVite(server: Server, app: Express) {
`<meta name="twitter:description" content="${escapeHtml(article.excerpt)}" />`,
`<meta name="twitter:image" content="${escapeHtml(finalImage)}" />`,
`<meta name="description" content="${escapeHtml(article.excerpt)}" />`,
`<title>${escapeHtml(article.title)} - Folx Music Television</title>`,
`<meta name="keywords" content="Volksmusik, Schlager, ${escapeHtml(article.title)}, ${escapeHtml(article.category || 'News')}, FOLX TV" />`,
`<link rel="canonical" href="${escapeHtml(articleUrl)}" />`,
`<title>${escapeHtml(article.title)} - Volksmusik & Schlager | Folx Music Television</title>`,
].join("\n ");
template = template.replace(/<title>[^<]*<\/title>/, ogTags);