Present FOLX as a music news publisher and unify site SEO

This commit is contained in:
Codex
2026-10-07 13:42:48 +02:00
parent c5c3fe290e
commit cc306921d7
14 changed files with 173 additions and 115 deletions
+6 -6
View File
@@ -7,11 +7,11 @@
<meta charset="UTF-8" />
<meta name="google-site-verification" content="_rO4EdfjGp2lPdm3fpxkWv8k1id0wkthn9GxwsXLpeo" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1" />
<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!" />
<title>Schlager &amp; Volksmusik News | FOLX TV</title>
<meta name="description" content="Aktuelle Schlager- und Volksmusik-News, Künstler-Interviews und Nachrichten aus der Musikszene. Jetzt Artikel und Videos auf FOLX TV entdecken." />
<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:title" content="Schlager &amp; Volksmusik News | FOLX TV" />
<meta property="og:description" content="Aktuelle Schlager- und Volksmusik-News, Künstler-Interviews und Nachrichten aus der Musikszene. Jetzt Artikel und Videos auf FOLX TV entdecken." />
<meta property="og:type" content="website" />
<meta property="og:site_name" content="Folx Music Television" />
<meta property="og:url" content="https://folx.tv/" />
@@ -23,8 +23,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 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:title" content="Schlager &amp; Volksmusik News | FOLX TV" />
<meta name="twitter:description" content="Aktuelle Schlager- und Volksmusik-News, Künstler-Interviews und Nachrichten aus der Musikszene. Jetzt Artikel und Videos auf FOLX TV entdecken." />
<meta name="twitter:image" content="https://folx.tv/og-image.jpg" />
<meta property="fb:pages" content="281200958640258" />
<meta name="facebook-domain-verification" content="b4y482htm54uybm563tfr1ucb1n46w" />
+2 -2
View File
@@ -23,8 +23,8 @@ export default function Footer({ narrow }: { narrow?: boolean }) {
<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 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.
FOLX TV – Aktuelle Schlager- und Volksmusik-News, Künstlerporträts und Interviews.
Entdecken Sie Nachrichten, Artikel und Videos aus der Musikszene sowie Informationen zu unserem TV-Angebot.
</p>
<div className="flex gap-3">
{SOCIAL_LINKS.map((s) => (
+1 -1
View File
@@ -43,7 +43,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 – Volksmusik & Schlager Fernsehsender" className="h-32 w-auto object-contain py-1" />
<img src={folxLogo} alt="FOLX TV – Schlager & Volksmusik News" className="h-32 w-auto object-contain py-1" />
</div>
</Link>
+25 -6
View File
@@ -1,3 +1,4 @@
import { HOME_TITLE, HOME_DESCRIPTION, INFO_SEO, publisherSchema } from "@shared/seo";
import { useEffect } from "react";
interface OgMeta {
@@ -8,6 +9,7 @@ interface OgMeta {
ogType?: string;
ogUrl?: string;
articlePublishedTime?: string;
articleModifiedTime?: string;
articleAuthor?: string;
articleSection?: string;
}
@@ -32,10 +34,10 @@ function removeMetaTag(selector: string) {
if (el) el.remove();
}
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_TITLE = `${HOME_TITLE} | FOLX TV`;
const DEFAULT_DESC = HOME_DESCRIPTION;
const DEFAULT_OG_TITLE = `${HOME_TITLE} | FOLX TV`;
const DEFAULT_OG_DESC = HOME_DESCRIPTION;
const DEFAULT_OG_IMAGE = "https://folx.tv/og-image.jpg";
const CANONICAL_BASE = "https://folx.tv";
@@ -62,8 +64,24 @@ export function usePageMeta(title: string, description?: string, og?: OgMeta) {
const canonicalPath = og?.ogUrl || `${CANONICAL_BASE}${window.location.pathname}`;
const canonicalUrl = canonicalPath.startsWith("http") ? canonicalPath : `${CANONICAL_BASE}${canonicalPath}`;
setCanonical(canonicalUrl);
const info = INFO_SEO[window.location.pathname.replace(/\/+$/, "")];
document.getElementById("info-jsonld")?.remove();
if (info) {
const script = document.createElement("script");
script.id = "info-jsonld";
script.type = "application/ld+json";
script.textContent = JSON.stringify({ "@context": "https://schema.org", "@type": info.type,
"@id": `${canonicalUrl}#webpage`, url: canonicalUrl, name: title + suffix,
description: info.description, inLanguage: "de-DE", publisher: publisherSchema() });
document.head.appendChild(script);
}
setMetaTag('meta[property="og:url"]', canonicalUrl);
setMetaTag('meta[property="og:title"]', og?.ogTitle || title + suffix);
setMetaTag('meta[property="og:description"]', og?.ogDescription || description || DEFAULT_DESC);
setMetaTag('meta[property="og:type"]', og?.ogType || "website");
setMetaTag('meta[name="twitter:title"]', og?.ogTitle || title + suffix);
setMetaTag('meta[name="twitter:description"]', og?.ogDescription || description || DEFAULT_DESC);
if (og) {
if (og.ogTitle) setMetaTag('meta[property="og:title"]', og.ogTitle);
if (og.ogDescription) setMetaTag('meta[property="og:description"]', og.ogDescription);
@@ -78,7 +96,7 @@ export function usePageMeta(title: string, description?: string, og?: OgMeta) {
if (og.articlePublishedTime) {
setMetaTag('meta[property="article:published_time"]', og.articlePublishedTime);
setMetaTag('meta[property="article:modified_time"]', og.articlePublishedTime);
setMetaTag('meta[property="article:modified_time"]', og.articleModifiedTime || og.articlePublishedTime);
}
if (og.articleAuthor) {
setMetaTag('meta[property="article:author"]', og.articleAuthor);
@@ -88,6 +106,7 @@ export function usePageMeta(title: string, description?: string, og?: OgMeta) {
}
}
return () => {
document.getElementById("info-jsonld")?.remove();
document.title = DEFAULT_TITLE;
setMetaTag('meta[name="description"]', DEFAULT_DESC);
setMetaTag('meta[property="og:title"]', DEFAULT_OG_TITLE);
@@ -105,5 +124,5 @@ export function usePageMeta(title: string, description?: string, og?: OgMeta) {
removeMetaTag('meta[property="article:author"]');
removeMetaTag('meta[property="article:section"]');
};
}, [title, description, og?.siteName, og?.ogTitle, og?.ogDescription, og?.ogImage, og?.ogType, og?.ogUrl, og?.articlePublishedTime, og?.articleAuthor, og?.articleSection]);
}, [title, description, og?.siteName, og?.ogTitle, og?.ogDescription, og?.ogImage, og?.ogType, og?.ogUrl, og?.articlePublishedTime, og?.articleModifiedTime, og?.articleAuthor, og?.articleSection]);
}
+2 -4
View File
@@ -1,3 +1,4 @@
import { INFO_SEO } from "@shared/seo";
import { Tv, Youtube, Facebook, Instagram, PlayCircle, Radio } from "lucide-react";
import Header from "@/components/header";
import Footer from "@/components/footer";
@@ -43,10 +44,7 @@ const KANAELE = [
];
export default function AboutPage() {
usePageMeta(
"Über FOLX TV - Volksmusik & Schlager Fernsehsender",
"Alles über FOLX TV – Ihren Volksmusik & Schlager Fernsehsender seit 2013. Die Künstler, der FOLX Stadl und alle Kanäle: Livestream, FOLX Plus, YouTube, Facebook und Instagram.",
);
usePageMeta(INFO_SEO["/ueber-uns"].title, INFO_SEO["/ueber-uns"].description, { siteName: "FOLX TV" });
return (
<div className="min-h-screen bg-background">
<Header />
+10 -14
View File
@@ -1,3 +1,4 @@
import { publisherSchema, articleModifiedTime, articleGenre } from "@shared/seo";
import { useQuery } from "@tanstack/react-query";
import { useParams, Link, useLocation } from "wouter";
import { type Article } from "@shared/schema";
@@ -160,17 +161,19 @@ export default function ArticlePage() {
: "";
usePageMeta(
article ? `${article.title} - Volksmusik & Schlager` : "Volksmusik & Schlager Artikel",
article ? article.title : "Nachrichten",
article?.excerpt || "Aktuelle Nachrichten aus der Volksmusik- und Schlagerszene bei FOLX TV.",
article ? {
siteName: "FOLX TV",
ogTitle: article.title,
ogDescription: article.excerpt,
ogImage: articleImage || undefined,
ogType: "article",
ogUrl: articleUrl,
articlePublishedTime: new Date(article.publishedAt).toISOString(),
articleModifiedTime: articleModifiedTime(article.content || "", new Date(article.publishedAt).toISOString()),
articleAuthor: article.author || "Folx Music Television",
articleSection: article.category || "News",
articleSection: articleGenre(article.content || "").section,
} : undefined
);
@@ -179,32 +182,25 @@ export default function ArticlePage() {
const jsonLd = {
"@context": "https://schema.org",
"@type": "NewsArticle",
"@id": `${articleUrl}#article`,
"headline": article.title,
"description": article.excerpt,
"image": articleImage ? [articleImage] : [],
"datePublished": new Date(article.publishedAt).toISOString(),
"dateModified": new Date(article.publishedAt).toISOString(),
"dateModified": articleModifiedTime(article.content || "", new Date(article.publishedAt).toISOString()),
"author": {
"@type": "Organization",
"name": article.author || "Folx Music Television",
"url": "https://folx.tv"
},
"publisher": {
"@type": "Organization",
"name": "Folx Music Television",
"url": "https://folx.tv",
"logo": {
"@type": "ImageObject",
"url": `${window.location.origin}/favicon.png`
}
},
"publisher": publisherSchema(),
"mainEntityOfPage": {
"@type": "WebPage",
"@id": articleUrl
},
"articleSection": article.category || "News",
"articleSection": articleGenre(article.content || "").section,
"inLanguage": "de",
"keywords": `Volksmusik, Schlager, ${article.category || "News"}, ${article.title}`
"keywords": articleGenre(article.content || "").words.join(", ")
};
const breadcrumbLd = {
"@context": "https://schema.org",
+2 -1
View File
@@ -1,3 +1,4 @@
import { INFO_SEO } from "@shared/seo";
import { Shield } from "lucide-react";
import Header from "@/components/header";
import Footer from "@/components/footer";
@@ -5,7 +6,7 @@ import { usePageMeta } from "@/hooks/use-page-meta";
import { PageSideAds } from "@/components/adsense";
export default function DatenschutzPage() {
usePageMeta("Datenschutz - FOLX TV Volksmusik Sender", "Datenschutzerklärung von FOLX TV – Ihrem Volksmusik & Schlager Fernsehsender.");
usePageMeta(INFO_SEO["/datenschutz"].title, INFO_SEO["/datenschutz"].description, { siteName: "FOLX TV" });
return (
<div className="min-h-screen bg-background">
<Header />
+2 -4
View File
@@ -1,3 +1,4 @@
import { INFO_SEO } from "@shared/seo";
import { Tv, MapPin, PlayCircle, Youtube, Smartphone, Radio, ExternalLink } from "lucide-react";
import Header from "@/components/header";
import Footer from "@/components/footer";
@@ -107,10 +108,7 @@ const APPS = [
];
export default function EmpfangPage() {
usePageMeta(
"Empfang FOLX TV - Volksmusik & Schlager Sender empfangen",
"So empfangen Sie FOLX TV – den Volksmusik & Schlager Sender: kostenloser Livestream auf folx.live, die FOLX TV App für Apple, Android, Samsung und Fire TV sowie Kabel und IPTV in Deutschland, Österreich und der Schweiz.",
);
usePageMeta(INFO_SEO["/empfang-folx-tv"].title, INFO_SEO["/empfang-folx-tv"].description, { siteName: "FOLX TV" });
return (
<div className="min-h-screen bg-background">
<Header />
+4 -31
View File
@@ -1,3 +1,4 @@
import { HOME_TITLE, HOME_DESCRIPTION, homeSchema } from "@shared/seo";
import { useQuery } from "@tanstack/react-query";
import { artistGroup } from "@/lib/artists";
import { objectPositionFor } from "@/lib/focal";
@@ -756,38 +757,10 @@ function BentoSkeleton() {
}
export default function Home() {
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.");
usePageMeta(HOME_TITLE, HOME_DESCRIPTION, { siteName: "FOLX TV" });
useEffect(() => {
const jsonLd = {
"@context": "https://schema.org",
"@type": "WebSite",
"name": "Folx Music Television",
"alternateName": ["FOLX TV", "Volksmusik TV"],
"url": "https://folx.tv",
"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",
"url": "https://folx.tv",
"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"
};
const jsonLd = homeSchema();
const script = document.createElement("script");
script.type = "application/ld+json";
script.id = "home-jsonld";
@@ -1033,7 +1006,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>
<h1 className="sr-only">FOLX TV – Schlager & Volksmusik News</h1>
{/* Prej lastna kopija pasu s trdo visino 90 px in responsive=false:
Google je vanjo postavil 320x50 in okrog je ostal siv rob.
+2 -1
View File
@@ -1,3 +1,4 @@
import { INFO_SEO } from "@shared/seo";
import { Scale } from "lucide-react";
import Header from "@/components/header";
import Footer from "@/components/footer";
@@ -5,7 +6,7 @@ import { usePageMeta } from "@/hooks/use-page-meta";
import { PageSideAds } from "@/components/adsense";
export default function ImpressumPage() {
usePageMeta("Impressum - FOLX TV Volksmusik Sender", "Impressum und rechtliche Informationen zu FOLX TV – Ihrem Volksmusik & Schlager Fernsehsender.");
usePageMeta(INFO_SEO["/impressum"].title, INFO_SEO["/impressum"].description, { siteName: "FOLX TV" });
return (
<div className="min-h-screen bg-background">
<Header />
+2 -1
View File
@@ -1,3 +1,4 @@
import { INFO_SEO } from "@shared/seo";
import { useState } from "react";
import { Mail, Phone, Send, CheckCircle, AlertCircle, Smartphone, Printer } from "lucide-react";
import { SiFacebook, SiInstagram, SiYoutube, SiTiktok } from "react-icons/si";
@@ -8,7 +9,7 @@ import { PageSideAds, TopBannerAd } from "@/components/adsense";
import { apiRequest } from "@/lib/queryClient";
export default function KontaktPage() {
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.");
usePageMeta(INFO_SEO["/kontakt"].title, INFO_SEO["/kontakt"].description, { siteName: "FOLX TV" });
const [formData, setFormData] = useState({ name: "", email: "", subject: "", message: "" });
const [status, setStatus] = useState<"idle" | "sending" | "success" | "error">("idle");