Compare commits

...

10 Commits

Author SHA1 Message Date
sebastjanartic
83815503e1 Published your App
Replit-Commit-Author: Deployment
Replit-Commit-Session-Id: 23852c00-4779-460a-9e0c-d09fee4b6c92
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: 172c7eca-ac09-4ef6-a53c-53534998a249
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/f209e72a-0939-48fa-84fc-57854de71967/23852c00-4779-460a-9e0c-d09fee4b6c92/rgXHSxm
Replit-Commit-Deployment-Build-Id: 52c02c2a-5350-4e4d-bf83-174890404b08
Replit-Helium-Checkpoint-Created: true
2026-04-02 20:27:33 +00:00
sebastjanartic
47d9e25f1c Published your App
Replit-Commit-Author: Deployment
Replit-Commit-Session-Id: 23852c00-4779-460a-9e0c-d09fee4b6c92
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: a24aedc4-9237-444b-aefb-f5411efd4326
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/f209e72a-0939-48fa-84fc-57854de71967/23852c00-4779-460a-9e0c-d09fee4b6c92/rgXHSxm
Replit-Commit-Deployment-Build-Id: 52c02c2a-5350-4e4d-bf83-174890404b08
Replit-Helium-Checkpoint-Created: true
2026-04-02 20:11:59 +00:00
sebastjanartic
27f0b92deb Published your App
Replit-Commit-Author: Deployment
Replit-Commit-Session-Id: 23852c00-4779-460a-9e0c-d09fee4b6c92
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: 953a6ea1-583b-466e-b6e6-1437ecedeba1
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/f209e72a-0939-48fa-84fc-57854de71967/23852c00-4779-460a-9e0c-d09fee4b6c92/rgXHSxm
Replit-Commit-Deployment-Build-Id: 52c02c2a-5350-4e4d-bf83-174890404b08
Replit-Helium-Checkpoint-Created: true
2026-04-02 19:59:59 +00:00
sebastjanartic
3bb6cf8f15 Published your App
Replit-Commit-Author: Deployment
Replit-Commit-Session-Id: 23852c00-4779-460a-9e0c-d09fee4b6c92
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: a24641d9-5f07-492b-a28e-6bffd21320c9
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/f209e72a-0939-48fa-84fc-57854de71967/23852c00-4779-460a-9e0c-d09fee4b6c92/rgXHSxm
Replit-Commit-Deployment-Build-Id: d59cc4d3-d5c3-4f47-8314-a6cbbc3ba80b
Replit-Helium-Checkpoint-Created: true
2026-04-02 19:48:23 +00:00
sebastjanartic
88fd916f8e Published your App
Replit-Commit-Author: Deployment
Replit-Commit-Session-Id: 23852c00-4779-460a-9e0c-d09fee4b6c92
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: 5ffb063e-b32c-4f99-bc48-9c3f0bb6c4c3
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/f209e72a-0939-48fa-84fc-57854de71967/23852c00-4779-460a-9e0c-d09fee4b6c92/rgXHSxm
Replit-Commit-Deployment-Build-Id: 2bbcf99b-c3d6-4f6a-9ad0-d1d5f8b81daf
Replit-Helium-Checkpoint-Created: true
2026-03-08 07:50:38 +00:00
sebastjanartic
dd13cc667a Add a new article to celebrate International Women's Day
Add a new article titled "Internationaler Frauentag: Danke an alle Frauen der FOLX Familie" with associated images and metadata to the seed data in `server/seed.ts`.

Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 23852c00-4779-460a-9e0c-d09fee4b6c92
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: ef00bbbf-e196-43a2-9cb3-5dbd2df2d5f4
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/f209e72a-0939-48fa-84fc-57854de71967/23852c00-4779-460a-9e0c-d09fee4b6c92/rgXHSxm
Replit-Helium-Checkpoint-Created: true
2026-03-08 07:48:49 +00:00
sebastjanartic
beeb87f036 Published your App
Replit-Commit-Author: Deployment
Replit-Commit-Session-Id: 23852c00-4779-460a-9e0c-d09fee4b6c92
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: d7e712be-60ac-44c0-b354-afcf3a2784c0
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/f209e72a-0939-48fa-84fc-57854de71967/23852c00-4779-460a-9e0c-d09fee4b6c92/OPD8Ro3
Replit-Commit-Deployment-Build-Id: bb31bf24-0b42-4ed7-82ee-f5e4eee99f64
Replit-Helium-Checkpoint-Created: true
2026-03-08 07:36:19 +00:00
sebastjanartic
e5fcb182e7 Update gallery page metadata to reflect spontaneous moments from recordings
Update meta tags, title, and description for the gallery page to accurately describe it as featuring unique moments from recordings and backstage snapshots, rather than solely concert photos. This includes changes in client/src/pages/gallery.tsx, server/static.ts, and server/vite.ts.

Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 23852c00-4779-460a-9e0c-d09fee4b6c92
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: 67a932ea-d8a9-4376-a0ba-5b355f4f70b7
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/f209e72a-0939-48fa-84fc-57854de71967/23852c00-4779-460a-9e0c-d09fee4b6c92/OPD8Ro3
Replit-Helium-Checkpoint-Created: true
2026-03-08 07:34:21 +00:00
sebastjanartic
4ece9e4ccd Add exclusive photos from recordings to the gallery and improve site metadata
Integrate AdSense ads into the photo gallery, introduce SSR meta tags for the gallery page, and improve layout stability by reserving space for ads and dynamic content.

Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 23852c00-4779-460a-9e0c-d09fee4b6c92
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: 81f3d8bc-2328-4374-a06e-57257dbb713b
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/f209e72a-0939-48fa-84fc-57854de71967/23852c00-4779-460a-9e0c-d09fee4b6c92/OPD8Ro3
Replit-Helium-Checkpoint-Created: true
2026-03-08 07:33:00 +00:00
sebastjanartic
8a263dee0f Add personalized meta tags and optimize horoscope images for sharing
Implement dynamic meta tag generation for horoscope pages, including daily, weekly, and monthly predictions, and optimize the OG image for improved social sharing previews.

Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 23852c00-4779-460a-9e0c-d09fee4b6c92
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: dea1fe98-0dfb-4e47-9b94-3c50decbba8a
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/f209e72a-0939-48fa-84fc-57854de71967/23852c00-4779-460a-9e0c-d09fee4b6c92/OPD8Ro3
Replit-Helium-Checkpoint-Created: true
2026-03-08 07:25:10 +00:00
15 changed files with 273 additions and 40 deletions

View File

@ -0,0 +1,24 @@
Danke.
Danke an alle unsere treuen Zuschauerinnen, die mit uns singen, tanzen und träumen jeden Tag, Jahr für Jahr.
Danke an alle Künstlerinnen auf der Bühne, Moderatorinnen vor der Kamera und alle Frauen hinter den Kulissen, ohne die FOLX TV nicht das Zuhause der Volksmusik und des Schlagers wäre, das Sie kennen und lieben.
Der 8. März, der Internationale Frauentag, ist unser Anlass, laut „Danke“ zu sagen und die Bühne ganz den Frauen zu überlassen.
Frauen schreiben seit jeher die schönsten Geschichten der Musik:
Sie stehen auf der Bühne, wenn im „Folx Stadl“ die Stimmung kocht, sie moderieren mit Herz und Humor unsere Sendungen und sie sitzen zu Hause vor dem Fernseher, singen mit, wählen ihre Lieblingsvideos und halten FOLX TV mit ihrer Treue am Laufen.
Ob junge Fans oder Best Ager Sie alle machen unsere Volksmusik- und Schlagerwelt bunt, lebendig und voller Gefühl.
Der Internationale Frauentag erinnert daran, wie viel Frauen bereits erreicht haben und dass ihr Einsatz noch lange nicht zu Ende ist.
Es geht um Respekt, faire Chancen, Gleichberechtigung und darum, gesehen und gehört zu werden.
Mit jeder starken Stimme, jeder mutigen Entscheidung und jedem Lächeln verändern Frauen Tag für Tag die Welt auch in unserer FOLX Community.
Und was passt besser zu einem Feiertag für starke Frauen als Musik?
Wenn die ersten Akkorde einer Oberkrainer-Polka erklingen, wenn ein moderner Schlager-Hit Gänsehaut macht oder wenn im „Folx Stadl“ gemeinsam geklatscht, gelacht und getanzt wird, dann spürt man: Musik verbindet Generationen.
Sie weckt Erinnerungen, schenkt Kraft und begleitet durch gute wie durch schwierige Zeiten.
Heute sagen wir: Dieser Tag gehört Ihnen.
Drehen Sie den Fernseher ruhig ein wenig lauter, tanzen Sie durchs Wohnzimmer, stoßen Sie mit Freundinnen an oder gönnen Sie sich einfach einen ruhigen Moment nur für sich und Ihre Lieblingsmusik.
Feiern Sie sich selbst mit all dem, was Sie leisten, was Sie lieben und wovon Sie träumen.
FOLX TV bedankt sich von Herzen bei allen Frauen heute, am 8. März, und an jedem anderen Tag des Jahres.
Schön, dass Sie Teil der FOLX Familie sind.

Binary file not shown.

After

Width:  |  Height:  |  Size: 207 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 166 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

View File

@ -96,7 +96,7 @@ export function ArticleCardAd() {
export function InArticleAd() {
return (
<div className="my-6 rounded-md overflow-hidden bg-card border border-card-border">
<div className="my-6 rounded-md overflow-hidden bg-card border border-card-border" style={{ minHeight: "106px" }}>
<div className="text-[9px] text-muted-foreground/40 text-center pt-1 uppercase tracking-widest">Anzeige</div>
<AdSense
slot="4154017639"

View File

@ -1,6 +1,7 @@
import { useQuery } from "@tanstack/react-query";
import { useState, useEffect, useCallback, useRef } from "react";
import { ChevronLeft, ChevronRight, X, Images, Maximize2 } from "lucide-react";
import { InArticleAd } from "./adsense";
export interface GalleryImage {
folder: string;
@ -340,13 +341,24 @@ export default function GalleryPage() {
<p className="text-muted-foreground text-sm mb-4" data-testid="text-gallery-count">
{Math.min(visibleCount, totalCount)} von {totalCount} Fotos
</p>
{(() => {
const AD_EVERY = 12;
const chunks: GalleryImage[][] = [];
for (let i = 0; i < visibleImages.length; i += AD_EVERY) {
chunks.push(visibleImages.slice(i, i + AD_EVERY));
}
return chunks.map((chunk, ci) => (
<div key={ci}>
{ci > 0 && <InArticleAd />}
<div className="grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-4 gap-3">
{visibleImages.map((img, i) => (
{chunk.map((img, j) => {
const globalIdx = ci * AD_EVERY + j;
return (
<button
key={`${img.folder}-${img.fileName}`}
onClick={() => setLightboxIndex(i)}
onClick={() => setLightboxIndex(globalIdx)}
className="group relative rounded-lg overflow-hidden bg-card border border-card-border cursor-pointer flex flex-col"
data-testid={`button-gallery-image-${i}`}
data-testid={`button-gallery-image-${globalIdx}`}
>
<div className="relative w-full aspect-[16/9]">
<LazyImage
@ -358,7 +370,7 @@ export default function GalleryPage() {
<div className="absolute inset-0 bg-black/0 group-hover:bg-black/20 transition-colors" />
{img.artist && (
<div className="absolute bottom-0 left-0 right-0 bg-gradient-to-t from-black/70 to-transparent p-2 hidden md:block opacity-0 group-hover:opacity-100 transition-opacity">
<span className="text-white text-xs font-medium drop-shadow-lg" data-testid={`text-artist-desktop-${i}`}>
<span className="text-white text-xs font-medium drop-shadow-lg" data-testid={`text-artist-desktop-${globalIdx}`}>
{img.artist}
</span>
</div>
@ -369,14 +381,18 @@ export default function GalleryPage() {
</div>
{img.artist && (
<div className="md:hidden px-2 py-1.5 bg-card border-t border-card-border">
<span className="text-[11px] text-card-foreground font-medium line-clamp-1" data-testid={`text-artist-mobile-${i}`}>
<span className="text-[11px] text-card-foreground font-medium line-clamp-1" data-testid={`text-artist-mobile-${globalIdx}`}>
{img.artist}
</span>
</div>
)}
</button>
))}
);
})}
</div>
</div>
));
})()}
{hasMore && (
<div ref={sentinelRef} className="flex justify-center py-8" data-testid="gallery-load-more">

View File

@ -303,3 +303,12 @@ div[class^="fc-"] {
inset: -1px;
}
}
.ad-container {
contain: layout style;
overflow: hidden;
}
.adsbygoogle {
contain: layout style;
}

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", "Exklusive Fotos und Bilder von Volksmusik- und Schlager-Stars, Konzerten und Events. Die Volksmusik-Fotogalerie von FOLX TV.");
usePageMeta("Fotogalerie Einzigartige Momente von unseren Aufzeichnungen | FOLX TV", "Spannende Schnappschüsse und besondere Augenblicke, eingefangen bei unseren Aufzeichnungen. Authentische Bilder der Volksmusik- und Schlager-Stars in einzigartigen Momenten bei FOLX TV.");
return (
<div className="min-h-screen bg-background">
<Header />

View File

@ -276,6 +276,7 @@ function SignDetail({ signIndex, onNavigate, aiHoroscopes }: { signIndex: number
))}
</div>
<div style={{ minHeight: "180px" }}>
{tab === "daily" && (
<div className="space-y-5" data-testid="section-horoscope-daily">
<div>
@ -311,6 +312,7 @@ function SignDetail({ signIndex, onNavigate, aiHoroscopes }: { signIndex: number
</div>
)}
</div>
</div>
<InArticleAd />
@ -370,7 +372,6 @@ function SignDetail({ signIndex, onNavigate, aiHoroscopes }: { signIndex: number
}
export default function HoroscopePage() {
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);
@ -386,6 +387,27 @@ export default function HoroscopePage() {
}
}, [params.sign]);
const selectedSign = selected !== null ? SIGNS[selected] : null;
const selectedAi = selected !== null ? aiHoroscopes.find(h => h.signIndex === selected) : null;
const today = new Date().toLocaleDateString("de-AT", { day: "numeric", month: "long", year: "numeric" });
const metaTitle = selectedSign
? `${selectedSign.symbol} ${selectedSign.name} Horoskop Tages-, Wochen- & Monatshoroskop`
: "Horoskop Tages-, Wochen- & Monatshoroskop für alle Sternzeichen";
const metaDesc = selectedSign
? `${selectedSign.name} Horoskop für heute, ${today}. Tägliches, wöchentliches und monatliches Horoskop für ${selectedSign.name} (${selectedSign.date}). Liebe, Beruf & Gesundheit bei FOLX TV.`
: `Kostenloses Tageshoroskop, Wochenhoroskop & Monatshoroskop für alle 12 Sternzeichen. Liebe, Beruf, Gesundheit Ihr persönliches Horoskop bei FOLX TV, ${today}.`;
const ogImage = "https://folx.tv/images/horoskop-og.jpg";
usePageMeta(metaTitle, metaDesc, {
ogTitle: metaTitle,
ogDescription: metaDesc,
ogImage,
ogType: "website",
});
const handleSelect = (i: number) => {
setSelected(i);
setTimeout(() => {

View File

@ -7,6 +7,7 @@ The official website for Folx Music Television (folx.tv). Dark-themed bento grid
- 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)
- SSR gallery page (`/gallery`): OG meta, Twitter card, description, canonical — emphasizes exclusive backstage/concert photos from recordings
- `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

View File

@ -223,6 +223,17 @@ const seedArticles = [
"featured": true,
"publishedAt": "2026-03-07T12:00:00.000Z",
"content": "<p>Es gibt Künstlerinnen, die man einfach kennt und dann gibt es <strong>Anita Hofmann</strong>. Aufgewachsen im schwäbischen Jungnau bei Sigmaringen, hat sie die Bühne von Kindesbeinen an als ihr zweites Zuhause betrachtet. Gemeinsam mit ihrer älteren Schwester Alexandra spielte sie schon als Teenagerin auf Dorffesten und Vereinsfeiern in der Region mit Trompete, Alphorn und dem unerschütterlichen Glauben daran, dass Musik verbindet. Heute, über drei Jahrzehnte später, steht Anita Hofmann als Solistin auf der Bühne und begeistert mit Schlagermusik, die mitten ins Herz trifft.</p>\n <h3>Vom Schwesternpaar zur Solostimme</h3>\n <p>Was als Kindheitstraum begann, wuchs schnell zu einer ernsthaften Karriere heran. Unter dem Namen <strong>Geschwister Hofmann</strong> feierten Anita und Alexandra ihren ersten großen TV-Auftritt 1990 in der ARD-Sendung <em>Musikanten sind da</em> und wurden kurz darauf von <strong>Marianne und Michael</strong> für das Fernsehen entdeckt. In den folgenden Jahrzehnten tourten die beiden Schwestern als <strong>Anita &amp; Alexandra Hofmann</strong> durch den deutschsprachigen Raum, gewannen mehrfach die <em>Krone der Volksmusik</em> und die <em>Goldene Stimmgabel</em>, und veröffentlichten über 20 Alben einige davon mit Gold und Platin ausgezeichnet.</p>\n <div style=\"display:flex;justify-content:center;margin:2rem 0;\"><iframe src=\"https://player.mediadelivery.net/embed/476412/9f9b0e1b-1434-4269-b762-8b1bcfaaf2c3\" loading=\"lazy\" style=\"border:none;width:100%;aspect-ratio:16/9;\" allow=\"accelerometer;gyroscope;encrypted-media;picture-in-picture;\" allowfullscreen=\"true\"></iframe></div>\n <h3>Ein neues Kapitel mit vollem Herz</h3>\n <p>Ende 2022 trennten sich die Karrierewege der Schwestern und Anita Hofmann nutzte diese Zäsur für einen mutigen Neuanfang. Statt innezuhalten, startete sie mit frischer Energie durch: Die Solodebütsingle „Halb so schlimm“ wurde zum Auftakt einer neuen Ära, gefolgt von der Sommerhymne „Leben XXL“, die sich zu einem echten Airplay-Dauerbrenner entwickelte. Im Mai 2024 erschien ihr erstes Soloalbum <strong>„Voll auf Schlager“</strong> bei TELAMO / Warner Music ein klares Bekenntnis zur guten Laune und zum authentischen deutschen Schlager.</p>\n <h3>Mehr als Musik eine Frau, die Klartext redet</h3>\n <p>Was Anita Hofmann von vielen ihrer Kolleginnen unterscheidet, ist ihre Bereitschaft zur Offenheit. In ihrer Autobiografie <strong>„Sei einfach nur schön“</strong> (erschienen 2024) lässt sie die Leserinnen und Leser tief in ihr Leben blicken: Sie spricht über toxische Beziehungen, den Kampf gegen Magersucht, den Druck der Öffentlichkeit und den langen Weg zu sich selbst. „Mein Lebensfehler war, immer den Erwartungen anderer zu entsprechen“, sagt sie. „Jetzt habe ich die Kraft und den Mut, ich selbst zu sein.“</p>\n <h3>Moderatorin, Multiinstrumentalistin, Energie-Bündel</h3>\n <p>Seit 2021 ist Anita Hofmann auch als Radiomoderatorin tätig und beweist, dass ihr Talent weit über den Gesang hinausgeht. Trompete, Alphorn, Xylophon sie spielte sie alle, lange bevor der erste Plattenvertrag unterschrieben wurde. Auf der Bühne ist sie ein Energiebündel, das das Publikum von der ersten Sekunde in seinen Bann zieht: mit mitreißenden Melodien, echten Emotionen und der spürbaren Freude an jedem einzelnen Moment.</p>\n <p><strong>Folge Anita Hofmann auch online:</strong></p>\n <p><a href=\"https://www.facebook.com/anitahofmannofficial\" target=\"_blank\" rel=\"noopener noreferrer\">Facebook</a> | <a href=\"https://www.instagram.com/anitahofmannofficial\" target=\"_blank\" rel=\"noopener noreferrer\">Instagram</a> | <a href=\"https://www.youtube.com/@AnitaHofmann\" target=\"_blank\" rel=\"noopener noreferrer\">YouTube</a></p>"
},
{
"title": "Internationaler Frauentag: Danke an alle Frauen der FOLX Familie",
"slug": "internationaler-frauentag-danke-an-alle-frauen-der-folx-familie",
"excerpt": "Der 8. M\u00e4rz ist unser Anlass, laut Danke zu sagen: an alle treuen Zuschauerinnen, K\u00fcnstlerinnen auf der B\u00fchne, Moderatorinnen vor der Kamera und alle Frauen hinter den Kulissen von FOLX TV.",
"category": "News",
"author": "Folx Music Television",
"coverImage": "/uploads/frauentag-2026.jpg",
"featured": true,
"publishedAt": "2026-03-08T08:00:00.000Z",
"content": "<p><strong>Danke.</strong></p>\n<p>Danke an alle unsere treuen Zuschauerinnen, die mit uns singen, tanzen und tr\u00e4umen \u2013 jeden Tag, Jahr f\u00fcr Jahr.</p>\n<p>Danke an alle K\u00fcnstlerinnen auf der B\u00fchne, Moderatorinnen vor der Kamera und alle Frauen hinter den Kulissen, ohne die FOLX TV nicht das Zuhause der Volksmusik und des Schlagers w\u00e4re, das Sie kennen und lieben.</p>\n<p>Der <strong>8. M\u00e4rz</strong>, der <strong>Internationale Frauentag</strong>, ist unser Anlass, laut &bdquo;Danke&ldquo; zu sagen und die B\u00fchne ganz den Frauen zu \u00fcberlassen.</p>\n<h3>Frauen schreiben die sch\u00f6nsten Geschichten der Musik</h3>\n<p>Sie stehen auf der B\u00fchne, wenn im &bdquo;Folx Stadl&ldquo; die Stimmung kocht, sie moderieren mit Herz und Humor unsere Sendungen und sie sitzen zu Hause vor dem Fernseher, singen mit, w\u00e4hlen ihre Lieblingsvideos und halten FOLX TV mit ihrer Treue am Laufen.</p>\n<p>Ob junge Fans oder Best Ager \u2013 Sie alle machen unsere Volksmusik- und Schlagerwelt bunt, lebendig und voller Gef\u00fchl.</p>\n<h3>Respekt, Chancen und Gleichberechtigung</h3>\n<p>Der Internationale Frauentag erinnert daran, wie viel Frauen bereits erreicht haben \u2013 und dass ihr Einsatz noch lange nicht zu Ende ist. Es geht um Respekt, faire Chancen, Gleichberechtigung und darum, gesehen und geh\u00f6rt zu werden.</p>\n<p>Mit jeder starken Stimme, jeder mutigen Entscheidung und jedem L\u00e4cheln ver\u00e4ndern Frauen Tag f\u00fcr Tag die Welt \u2013 auch in unserer FOLX Community.</p>\n<h3>Musik verbindet Generationen</h3>\n<p>Und was passt besser zu einem Feiertag f\u00fcr starke Frauen als Musik? Wenn die ersten Akkorde einer Oberkrainer-Polka erklingen, wenn ein moderner Schlager-Hit G\u00e4nsehaut macht oder wenn im &bdquo;Folx Stadl&ldquo; gemeinsam geklatscht, gelacht und getanzt wird, dann sp\u00fcrt man: Musik verbindet Generationen.</p>\n<p>Sie weckt Erinnerungen, schenkt Kraft und begleitet durch gute wie durch schwierige Zeiten.</p>\n<h3>Dieser Tag geh\u00f6rt Ihnen</h3>\n<p>Heute sagen wir: <strong>Dieser Tag geh\u00f6rt Ihnen.</strong></p>\n<p>Drehen Sie den Fernseher ruhig ein wenig lauter, tanzen Sie durchs Wohnzimmer, sto\u00dfen Sie mit Freundinnen an oder g\u00f6nnen Sie sich einfach einen ruhigen Moment nur f\u00fcr sich und Ihre Lieblingsmusik.</p>\n<p>Feiern Sie sich selbst \u2013 mit all dem, was Sie leisten, was Sie lieben und wovon Sie tr\u00e4umen.</p>\n<p><strong>FOLX TV bedankt sich von Herzen bei allen Frauen \u2013 heute, am 8. M\u00e4rz, und an jedem anderen Tag des Jahres.</strong></p>\n<p>Sch\u00f6n, dass Sie Teil der FOLX Familie sind.</p>"
}
];

View File

@ -95,6 +95,84 @@ export function serveStatic(app: Express) {
}
}
if (url.match(/^\/gallery(\/|$|\?)/)) {
let template = await fs.promises.readFile(indexPath, "utf-8");
template = stripExistingMeta(template);
const galTitle = "Fotogalerie \u2013 Einzigartige Momente von unseren Aufzeichnungen | FOLX TV";
const galDesc = "Spannende Schnappsch\u00fcsse und besondere Augenblicke, eingefangen bei unseren Aufzeichnungen. Authentische Bilder der Volksmusik- und Schlager-Stars in einzigartigen Momenten bei FOLX TV.";
const galUrl = `${canonicalBase}/gallery`;
const galImage = `${canonicalBase}/images/og-image.jpg`;
const galTags = [
`<meta property="og:title" content="${escapeHtml(galTitle)}" />`,
`<meta property="og:description" content="${escapeHtml(galDesc)}" />`,
`<meta property="og:type" content="website" />`,
`<meta property="og:url" content="${escapeHtml(galUrl)}" />`,
`<meta property="og:image" content="${escapeHtml(galImage)}" />`,
`<meta property="og:image:secure_url" content="${escapeHtml(galImage)}" />`,
`<meta property="og:image:width" content="1200" />`,
`<meta property="og:image:height" content="630" />`,
`<meta property="og:image:type" content="image/jpeg" />`,
`<meta property="og:site_name" content="Folx Music Television" />`,
`<meta property="og:locale" content="de_DE" />`,
`<meta name="twitter:card" content="summary_large_image" />`,
`<meta name="twitter:title" content="${escapeHtml(galTitle)}" />`,
`<meta name="twitter:description" content="${escapeHtml(galDesc)}" />`,
`<meta name="twitter:image" content="${escapeHtml(galImage)}" />`,
`<meta name="description" content="${escapeHtml(galDesc)}" />`,
`<meta name="keywords" content="Fotogalerie, Volksmusik Fotos, Schlager Bilder, Aufzeichnungen, Schnappschüsse, FOLX TV, Volksmusik Stars" />`,
`<link rel="canonical" href="${escapeHtml(galUrl)}" />`,
`<title>${escapeHtml(galTitle)}</title>`,
].join("\n ");
template = template.replace(/<title>[^<]*<\/title>/, galTags);
res.status(200).set({ "Content-Type": "text/html" }).end(template);
return;
}
if (url.match(/^\/horoskop(\/|$|\?)/)) {
let template = await fs.promises.readFile(indexPath, "utf-8");
template = stripExistingMeta(template);
const signMatch = url.match(/^\/horoskop\/([^?#]+)/);
const signName = signMatch ? decodeURIComponent(signMatch[1]) : null;
const capitalSign = signName ? signName.charAt(0).toUpperCase() + signName.slice(1) : null;
const title = capitalSign
? `${capitalSign} Horoskop Tages-, Wochen- & Monatshoroskop | Folx Music Television`
: "Horoskop Tages-, Wochen- & Monatshoroskop für alle Sternzeichen | Folx Music Television";
const desc = capitalSign
? `${capitalSign} Horoskop: Tägliches, wöchentliches und monatliches Horoskop. Liebe, Beruf & Gesundheit bei FOLX TV.`
: "Kostenloses Tageshoroskop, Wochenhoroskop & Monatshoroskop für alle 12 Sternzeichen. Liebe, Beruf, Gesundheit bei FOLX TV.";
const horoUrl = `${canonicalBase}${signName ? `/horoskop/${signName}` : "/horoskop"}`;
const horoImage = `${canonicalBase}/images/horoskop-og.jpg`;
const horoTags = [
`<meta property="og:title" content="${escapeHtml(title)}" />`,
`<meta property="og:description" content="${escapeHtml(desc)}" />`,
`<meta property="og:type" content="website" />`,
`<meta property="og:url" content="${escapeHtml(horoUrl)}" />`,
`<meta property="og:image" content="${escapeHtml(horoImage)}" />`,
`<meta property="og:image:secure_url" content="${escapeHtml(horoImage)}" />`,
`<meta property="og:image:width" content="1200" />`,
`<meta property="og:image:height" content="675" />`,
`<meta property="og:image:type" content="image/jpeg" />`,
`<meta property="og:site_name" content="Folx Music Television" />`,
`<meta property="og:locale" content="de_DE" />`,
`<meta name="twitter:card" content="summary_large_image" />`,
`<meta name="twitter:title" content="${escapeHtml(title)}" />`,
`<meta name="twitter:description" content="${escapeHtml(desc)}" />`,
`<meta name="twitter:image" content="${escapeHtml(horoImage)}" />`,
`<meta name="description" content="${escapeHtml(desc)}" />`,
`<meta name="keywords" content="Horoskop, Tageshoroskop, Wochenhoroskop, Monatshoroskop, Sternzeichen, Volksmusik, FOLX TV${capitalSign ? `, ${capitalSign}` : ""}" />`,
`<link rel="canonical" href="${escapeHtml(horoUrl)}" />`,
`<title>${escapeHtml(title)}</title>`,
].join("\n ");
template = template.replace(/<title>[^<]*<\/title>/, horoTags);
res.status(200).set({ "Content-Type": "text/html" }).end(template);
return;
}
let template = await fs.promises.readFile(indexPath, "utf-8");
res.status(200).set({ "Content-Type": "text/html" }).end(template);
});

View File

@ -113,6 +113,78 @@ export async function setupVite(server: Server, app: Express) {
}
}
if (url.match(/^\/gallery(\/|$|\?)/)) {
template = stripExistingMeta(template);
const galTitle = "Fotogalerie \u2013 Einzigartige Momente von unseren Aufzeichnungen | FOLX TV";
const galDesc = "Spannende Schnappsch\u00fcsse und besondere Augenblicke, eingefangen bei unseren Aufzeichnungen. Authentische Bilder der Volksmusik- und Schlager-Stars in einzigartigen Momenten bei FOLX TV.";
const galUrl = `${canonicalBase}/gallery`;
const galImage = `${canonicalBase}/images/og-image.jpg`;
const galTags = [
`<meta property="og:title" content="${escapeHtml(galTitle)}" />`,
`<meta property="og:description" content="${escapeHtml(galDesc)}" />`,
`<meta property="og:type" content="website" />`,
`<meta property="og:url" content="${escapeHtml(galUrl)}" />`,
`<meta property="og:image" content="${escapeHtml(galImage)}" />`,
`<meta property="og:image:secure_url" content="${escapeHtml(galImage)}" />`,
`<meta property="og:image:width" content="1200" />`,
`<meta property="og:image:height" content="630" />`,
`<meta property="og:image:type" content="image/jpeg" />`,
`<meta property="og:site_name" content="Folx Music Television" />`,
`<meta property="og:locale" content="de_DE" />`,
`<meta name="twitter:card" content="summary_large_image" />`,
`<meta name="twitter:title" content="${escapeHtml(galTitle)}" />`,
`<meta name="twitter:description" content="${escapeHtml(galDesc)}" />`,
`<meta name="twitter:image" content="${escapeHtml(galImage)}" />`,
`<meta name="description" content="${escapeHtml(galDesc)}" />`,
`<meta name="keywords" content="Fotogalerie, Volksmusik Fotos, Schlager Bilder, Aufzeichnungen, Schnappschüsse, FOLX TV, Volksmusik Stars" />`,
`<link rel="canonical" href="${escapeHtml(galUrl)}" />`,
`<title>${escapeHtml(galTitle)}</title>`,
].join("\n ");
template = template.replace(/<title>[^<]*<\/title>/, galTags);
}
if (url.match(/^\/horoskop(\/|$|\?)/)) {
template = stripExistingMeta(template);
const signMatch = url.match(/^\/horoskop\/([^?#]+)/);
const signName = signMatch ? decodeURIComponent(signMatch[1]) : null;
const capitalSign = signName ? signName.charAt(0).toUpperCase() + signName.slice(1) : null;
const title = capitalSign
? `${capitalSign} Horoskop Tages-, Wochen- & Monatshoroskop | Folx Music Television`
: "Horoskop Tages-, Wochen- & Monatshoroskop für alle Sternzeichen | Folx Music Television";
const desc = capitalSign
? `${capitalSign} Horoskop: Tägliches, wöchentliches und monatliches Horoskop. Liebe, Beruf & Gesundheit bei FOLX TV.`
: "Kostenloses Tageshoroskop, Wochenhoroskop & Monatshoroskop für alle 12 Sternzeichen. Liebe, Beruf, Gesundheit bei FOLX TV.";
const horoUrl = `${canonicalBase}${signName ? `/horoskop/${signName}` : "/horoskop"}`;
const horoImage = `${canonicalBase}/images/horoskop-og.jpg`;
const horoTags = [
`<meta property="og:title" content="${escapeHtml(title)}" />`,
`<meta property="og:description" content="${escapeHtml(desc)}" />`,
`<meta property="og:type" content="website" />`,
`<meta property="og:url" content="${escapeHtml(horoUrl)}" />`,
`<meta property="og:image" content="${escapeHtml(horoImage)}" />`,
`<meta property="og:image:secure_url" content="${escapeHtml(horoImage)}" />`,
`<meta property="og:image:width" content="1200" />`,
`<meta property="og:image:height" content="675" />`,
`<meta property="og:image:type" content="image/jpeg" />`,
`<meta property="og:site_name" content="Folx Music Television" />`,
`<meta property="og:locale" content="de_DE" />`,
`<meta name="twitter:card" content="summary_large_image" />`,
`<meta name="twitter:title" content="${escapeHtml(title)}" />`,
`<meta name="twitter:description" content="${escapeHtml(desc)}" />`,
`<meta name="twitter:image" content="${escapeHtml(horoImage)}" />`,
`<meta name="description" content="${escapeHtml(desc)}" />`,
`<meta name="keywords" content="Horoskop, Tageshoroskop, Wochenhoroskop, Monatshoroskop, Sternzeichen, Volksmusik, FOLX TV${capitalSign ? `, ${capitalSign}` : ""}" />`,
`<link rel="canonical" href="${escapeHtml(horoUrl)}" />`,
`<title>${escapeHtml(title)}</title>`,
].join("\n ");
template = template.replace(/<title>[^<]*<\/title>/, horoTags);
}
const page = await vite.transformIndexHtml(url, template);
res.status(200).set({ "Content-Type": "text/html" }).end(page);
} catch (e) {