Introduces a new `/kuenstler` page, API endpoint `/api/artists`, and enhances meta tags on `index.html` and for crawler requests on `/kuenstler`. Adds `KuenstlerPage.tsx` and updates `routes.ts` and `index.html`. Replit-Commit-Author: Agent Replit-Commit-Session-Id: 401e2ec0-e00d-4f10-9d0e-60f3d479f9a5 Replit-Commit-Checkpoint-Type: intermediate_checkpoint Replit-Commit-Event-Id: 69ee4fdb-c617-4cdd-b9f6-d3fab268d533 Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/60d372ff-2c10-46c7-b01b-10c3435136b0/401e2ec0-e00d-4f10-9d0e-60f3d479f9a5/qFrskyV
265 lines
12 KiB
HTML
265 lines
12 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="de">
|
|
<head>
|
|
<meta charset="UTF-8" />
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1, user-scalable=no, viewport-fit=cover" />
|
|
<title>Folx TV - Video</title>
|
|
|
|
<!-- Google Consent Management Platform -->
|
|
<script>
|
|
window.dataLayer = window.dataLayer || [];
|
|
function gtag(){dataLayer.push(arguments);}
|
|
gtag('consent', 'default', {
|
|
'ad_storage': 'granted',
|
|
'analytics_storage': 'granted',
|
|
'ad_user_data': 'granted',
|
|
'ad_personalization': 'granted'
|
|
});
|
|
</script>
|
|
<script async src="https://fundingchoicesmessages.google.com/i/pub-4465464714854276?ers=1" nonce="temp-nonce"></script>
|
|
<script nonce="temp-nonce">(function() {function signalGooglefcPresent() {if (!window.frames['googlefcPresent']) {if (document.body) {const iframe = document.createElement('iframe'); iframe.style = 'width: 0; height: 0; border: none; z-index: -1000; left: -1000px; top: -1000px;'; iframe.style.display = 'none'; iframe.name = 'googlefcPresent'; document.body.appendChild(iframe);} else {setTimeout(signalGooglefcPresent, 0);}}}signalGooglefcPresent();})();</script>
|
|
<meta name="description" content="Folx TV - Nummer 1 in Europa für Volksmusik und Schlager. Video Streaming Plattform mit Musik, Unterhaltung und Live-Streaming." />
|
|
<meta name="keywords" content="Volksmusik, Schlager, Folx TV, Kastelruther Spatzen, Monika Martin, Oswald Sattler, Angela Wiedl, Die Grubertaler, Michael Hirte, Sašo Avsenik, Jonny Hill, Rosanna Rocci, Linda Feller, Julia Buchner, Melanie Payer, Marlena Martinelli, Musikvideo, Streaming, Volksmusik TV" />
|
|
|
|
<!-- Google Search Console verification -->
|
|
<meta name="google-site-verification" content="YcRvFNGnAbAnlhQvhODVJOaqHLVdOKnpCqk7oH-xeKE" />
|
|
|
|
<!-- Open Graph meta podatki za družbena omrežja in mobilne aplikacije -->
|
|
<meta property="og:title" content="Folx TV - Video" />
|
|
<meta property="og:description" content="Folx TV - Nummer 1 in Europa für Volksmusik und Schlager. Musik, Unterhaltung und Live-Streaming." />
|
|
<meta property="og:type" content="website" />
|
|
<meta property="og:site_name" content="video.folx.tv" />
|
|
<meta property="og:locale" content="de_DE" />
|
|
<meta property="og:url" id="og-url" content="https://video.folx.tv/" />
|
|
<meta property="og:image" id="og-image" content="https://video.folx.tv/api/social-image" />
|
|
<meta property="og:image:width" content="1200" />
|
|
<meta property="og:image:height" content="630" />
|
|
<meta property="og:image:type" content="image/png" />
|
|
<meta property="og:image:alt" content="Folx TV - Video" />
|
|
|
|
<!-- Twitter Card meta podatki -->
|
|
<meta name="twitter:card" content="summary_large_image" />
|
|
<meta name="twitter:site" content="@folxtv" />
|
|
<meta name="twitter:title" content="Folx TV - Video" />
|
|
<meta name="twitter:description" content="Folx TV - Nummer 1 in Europa für Volksmusik und Schlager. Musik, Unterhaltung und Live-Streaming." />
|
|
<meta name="twitter:image" id="twitter-image" content="https://video.folx.tv/api/social-image" />
|
|
<meta name="twitter:image:alt" content="Folx TV - Video" />
|
|
|
|
<!-- WhatsApp/Viber specifične oznake -->
|
|
<meta property="og:image:secure_url" id="og-image-secure" content="https://video.folx.tv/api/social-image" />
|
|
<meta name="format-detection" content="telephone=no" />
|
|
<meta name="robots" content="index, follow" />
|
|
|
|
<!-- Dodatni meta podatki za mobilne naprave -->
|
|
<meta name="application-name" content="video.folx.tv" />
|
|
<meta name="apple-mobile-web-app-title" content="FOLX.TV" />
|
|
<meta name="apple-mobile-web-app-capable" content="yes" />
|
|
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
|
|
<meta name="theme-color" content="#6366f1" />
|
|
<meta name="mobile-web-app-capable" content="yes" />
|
|
|
|
<!-- iOS specifične meta oznake -->
|
|
<meta name="apple-touch-fullscreen" content="yes" />
|
|
<meta name="format-detection" content="telephone=no" />
|
|
|
|
<!-- iOS ikone za različne velikosti -->
|
|
<link rel="apple-touch-icon" sizes="57x57" href="/api/favicon?size=57&format=png" />
|
|
<link rel="apple-touch-icon" sizes="60x60" href="/api/favicon?size=60&format=png" />
|
|
<link rel="apple-touch-icon" sizes="72x72" href="/api/favicon?size=72&format=png" />
|
|
<link rel="apple-touch-icon" sizes="76x76" href="/api/favicon?size=76&format=png" />
|
|
<link rel="apple-touch-icon" sizes="114x114" href="/api/favicon?size=114&format=png" />
|
|
<link rel="apple-touch-icon" sizes="120x120" href="/api/favicon?size=120&format=png" />
|
|
<link rel="apple-touch-icon" sizes="144x144" href="/api/favicon?size=144&format=png" />
|
|
<link rel="apple-touch-icon" sizes="152x152" href="/api/favicon?size=152&format=png" />
|
|
<link rel="apple-touch-icon" sizes="180x180" href="/api/favicon?size=180&format=png" />
|
|
|
|
<!-- Favicon -->
|
|
<link rel="icon" type="image/svg+xml" href="/api/favicon" />
|
|
<link rel="apple-touch-icon" href="/api/favicon?size=180&format=png" />
|
|
<link rel="manifest" href="/manifest.json" />
|
|
|
|
<!-- Google AdSense -->
|
|
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-4465464714854276" crossorigin="anonymous"></script>
|
|
|
|
<!-- Google tag (gtag.js) - Analytics -->
|
|
<script async src="https://www.googletagmanager.com/gtag/js?id=G-6TC49YVDJ7"></script>
|
|
<script>
|
|
window.dataLayer = window.dataLayer || [];
|
|
function gtag(){dataLayer.push(arguments);}
|
|
gtag('js', new Date());
|
|
gtag('config', 'G-6TC49YVDJ7');
|
|
</script>
|
|
|
|
<!-- JSON-LD Structured Data for SEO -->
|
|
<script type="application/ld+json">
|
|
{
|
|
"@context": "https://schema.org",
|
|
"@type": "WebSite",
|
|
"name": "video.folx.tv",
|
|
"alternateName": "Folx TV - Video",
|
|
"url": "https://video.folx.tv",
|
|
"description": "Folx TV - Nummer 1 in Europa für Volksmusik und Schlager. Video Streaming Plattform mit Musik, Unterhaltung und Live-Streaming.",
|
|
"inLanguage": "de",
|
|
"potentialAction": {
|
|
"@type": "SearchAction",
|
|
"target": "https://video.folx.tv/?search={search_term_string}",
|
|
"query-input": "required name=search_term_string"
|
|
},
|
|
"publisher": {
|
|
"@type": "Organization",
|
|
"name": "FOLX.TV",
|
|
"url": "https://folx.tv",
|
|
"logo": {
|
|
"@type": "ImageObject",
|
|
"url": "https://video.folx.tv/folx-logo.png"
|
|
}
|
|
}
|
|
}
|
|
</script>
|
|
<script type="application/ld+json">
|
|
{
|
|
"@context": "https://schema.org",
|
|
"@type": "Organization",
|
|
"name": "FOLX.TV",
|
|
"url": "https://video.folx.tv",
|
|
"logo": "https://video.folx.tv/folx-logo.png",
|
|
"sameAs": [
|
|
"https://www.facebook.com/folxtv",
|
|
"https://www.instagram.com/folx.tv",
|
|
"https://www.youtube.com/@folxtv"
|
|
],
|
|
"contactPoint": {
|
|
"@type": "ContactPoint",
|
|
"contactType": "customer service",
|
|
"availableLanguage": ["German", "English"]
|
|
}
|
|
}
|
|
</script>
|
|
|
|
</head>
|
|
<body>
|
|
<div id="root">
|
|
<!-- Preloader to prevent white screen -->
|
|
<div id="app-preloader" style="
|
|
position: fixed;
|
|
top: 0;
|
|
left: 0;
|
|
width: 100%;
|
|
height: 100%;
|
|
background: linear-gradient(135deg, hsl(220, 13%, 9%) 0%, hsl(220, 13%, 12%) 100%);
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
z-index: 9999;
|
|
font-family: 'Poppins', 'Inter', Arial, sans-serif;
|
|
">
|
|
<div style="text-align: center; color: white;">
|
|
<div style="
|
|
width: 50px;
|
|
height: 50px;
|
|
background: linear-gradient(45deg, #ec4c73, #e91e63);
|
|
border-radius: 12px;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
margin: 0 auto 20px;
|
|
animation: pulse 2s infinite;
|
|
">
|
|
<div style="
|
|
width: 0;
|
|
height: 0;
|
|
border-left: 16px solid white;
|
|
border-top: 12px solid transparent;
|
|
border-bottom: 12px solid transparent;
|
|
margin-left: 4px;
|
|
"></div>
|
|
</div>
|
|
<h2 style="margin: 0; font-size: 28px; font-weight: 800; letter-spacing: 1px; text-shadow: 2px 2px 8px rgba(0,0,0,0.5);">FOLX.TV</h2>
|
|
<p style="margin: 10px 0 0; opacity: 0.9; font-size: 16px; font-weight: 500;">Amazing Content</p>
|
|
</div>
|
|
</div>
|
|
<style>
|
|
@keyframes pulse {
|
|
0%, 100% { transform: scale(1); }
|
|
50% { transform: scale(1.1); }
|
|
}
|
|
</style>
|
|
</div>
|
|
<script type="module" src="/src/main.tsx" defer></script>
|
|
<link rel="preload" href="/src/main.tsx" as="script" crossorigin>
|
|
<link rel="dns-prefetch" href="//fonts.googleapis.com">
|
|
<link rel="preconnect" href="//fonts.gstatic.com" crossorigin>
|
|
<!-- Replit script removed - caused scrolling issues -->
|
|
|
|
<!-- Dynamic social meta tags update -->
|
|
<script>
|
|
// Set dynamic URLs based on current domain
|
|
const currentOrigin = window.location.origin;
|
|
const socialImageUrl = `${currentOrigin}/api/social-image?v=${Date.now()}`;
|
|
|
|
// Update meta tags with correct URLs
|
|
document.getElementById('og-url').setAttribute('content', currentOrigin + '/');
|
|
document.getElementById('og-image').setAttribute('content', socialImageUrl);
|
|
document.getElementById('twitter-image').setAttribute('content', socialImageUrl);
|
|
document.getElementById('og-image-secure').setAttribute('content', socialImageUrl);
|
|
</script>
|
|
|
|
<!-- Debug script for deployment issues -->
|
|
<script>
|
|
console.log('🚀 video.folx.tv loading...');
|
|
|
|
// Set timeout to detect hanging in Chrome
|
|
let appLoadTimeout = setTimeout(function() {
|
|
console.warn('⚠️ App taking too long to load in Chrome, forcing refresh...');
|
|
const preloader = document.getElementById('app-preloader');
|
|
if (preloader) {
|
|
preloader.innerHTML = '<div style="text-align: center; color: white;"><h2>Loading timeout</h2><p>Refreshing automatically...</p></div>';
|
|
}
|
|
setTimeout(function() {
|
|
location.reload();
|
|
}, 2000);
|
|
}, 8000); // 8 second timeout for Chrome
|
|
|
|
// Global callback for when app loads successfully
|
|
window.appLoaded = function() {
|
|
clearTimeout(appLoadTimeout);
|
|
console.log('⏱️ App load timeout cleared');
|
|
};
|
|
|
|
// Clear any cached service workers
|
|
if ('serviceWorker' in navigator) {
|
|
navigator.serviceWorker.getRegistrations().then(function(registrations) {
|
|
for(let registration of registrations) {
|
|
registration.unregister();
|
|
console.log('🧹 Cleared service worker registration');
|
|
}
|
|
});
|
|
}
|
|
|
|
window.addEventListener('load', function() {
|
|
console.log('✅ Window loaded');
|
|
setTimeout(function() {
|
|
const root = document.getElementById('root');
|
|
const preloader = document.getElementById('app-preloader');
|
|
if (preloader && preloader.style.opacity !== '0') {
|
|
console.error('❌ React app failed to mount - preloader still visible');
|
|
preloader.innerHTML = '<div style="text-align: center; color: white;"><h2>Loading failed</h2><p>Refreshing automatically...</p></div>';
|
|
|
|
// Auto-refresh after 3 seconds
|
|
setTimeout(function() {
|
|
location.reload();
|
|
}, 3000);
|
|
}
|
|
}, 5000);
|
|
});
|
|
|
|
window.addEventListener('error', function(e) {
|
|
console.error('❌ Global error:', e.error);
|
|
});
|
|
|
|
window.addEventListener('unhandledrejection', function(e) {
|
|
console.error('❌ Unhandled promise rejection:', e.reason);
|
|
});
|
|
</script>
|
|
</body>
|
|
</html> |