fansshare.com Ads.txt file
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="Live TV Streaming">
<title>Live TV Streaming</title>
<meta property="og:title" content="Live TV Streaming">
<meta property="og:description" content="Live TV Streaming">
<meta name="twitter:title" content="Live TV Streaming">
<meta name="twitter:description" content="Live TV Streaming">
<meta property="og:image" content="https://fansshare.com/images/fansshare-logo-larger.png">
<meta name="twitter:image" content="https://fansshare.com/images/fansshare-logo-larger.png">
<meta name="keywords" content="live tv, streaming, free tv, international channels, , online tv, watch tv online">
<meta property="og:type" content="website">
<meta property="og:url" content="https://fansshare.com/">
<meta name="twitter:card" content="summary_large_image">
<link rel="canonical" href="https://fansshare.com/">
<link rel="icon" type="image/png" href="/images/favicon.png?v=3">
<!-- Resource Preloading for Performance -->
<link rel="preload" href="/dist/css/tailwind.css" as="style">
<link rel="preload" href="/dist/css/fonts.css" as="style">
<link rel="preload" href="/dist/css/video-js.css?v8.23.3" as="style">
<!-- Preload critical JavaScript -->
<link rel="preload" href="/dist/js/video.min.js?v8.23.3" as="script">
<!-- Preload LCP image for fastest loading -->
<link rel="preload" href="/images/fansshare-logo-small.png?v=3" as="image">
<!-- DNS prefetch for external resources -->
<link rel="dns-prefetch" href="//i.imgur.com">
<link rel="dns-prefetch" href="//upload.wikimedia.org">
<link rel="dns-prefetch" href="//cdn.jsdelivr.net">
<!-- Prefetch common image formats -->
<link rel="preconnect" href="https://i.imgur.com" crossorigin>
<link rel="preconnect" href="https://upload.wikimedia.org" crossorigin>
<link rel="stylesheet" href="/dist/css/tailwind.css">
<link rel="stylesheet" href="/dist/css/fonts.css">
<link rel="stylesheet" href="/dist/css/video-js.css?v8.23.3">
<style>
body {
margin: 0;
overflow: hidden;
background-color: #000;
font-family: "Titillium Web", sans-serif;
height: 100dvh;
max-height: 100dvh;
width: 100dvw;
max-width: 100dvw;
overflow: hidden;
}
canvas {
display: block;
}
*::-webkit-scrollbar {
height: .5rem;
width: .5rem
}
*::-webkit-scrollbar-thumb {
background-color: rgba(255, 255, 255, 0.6);
border-radius: 9999px
}
*::-webkit-scrollbar-track {
background: transparent
}
.country-flag {
font-family: "Apple Color Emoji", "Noto Color Emoji", Twemoji Country Flags, "Noto Color Emoji Fallback", sans-serif;
color: #000;
width: 1rem;
}
.sidebar {
transform: translateX(-100%);
transition: transform 0.3s ease-in-out;
position: fixed;
top: 4rem;
/* To position below the nav bar */
left: 0;
z-index: 30;
height: calc(100dvh - 4rem);
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
}
.globe-grid {
display: grid;
grid-template-columns: 1fr 340px;
grid-template-rows: 1fr;
gap: 0px 0px;
grid-template-areas:
". .";
}
.sidebar.show {
transform: translateX(0);
}
.main-content {
transition: all 0.3s ease-in-out;
}
#videoContainer {
grid-area: video-container;
}
#ggb-details {
grid-area: ggb-details;
}
.country-item {
padding: 0.5rem 0.75rem;
border-radius: 0.25rem;
display: flex;
align-items: center;
cursor: pointer;
transition: background-color 0.2s;
margin-bottom: 0.25rem;
}
.country-item:hover {
background-color: rgba(55, 65, 81, 0.7);
}
.country-item.selected {
background-color: rgba(255, 255, 255, 0.9);
color: #000;
}
.country-item.hidden {
display: none !important;
}
.country-flag {
margin-right: 0.75rem;
font-size: 1.25rem;
display: inline-block;
min-width: 1.5rem;
}
.country-menu.active {
transform: translateX(-100%);
}
/* SEO Overlay Styles */
.seo-overlay {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: rgba(0, 0, 0, 0.95);
backdrop-filter: blur(10px);
z-index: 1000;
overflow-y: auto;
transition: all 0.3s ease-in-out;
}
.seo-overlay.hidden {
opacity: 0;
visibility: hidden;
transform: translateY(-20px);
}
.seo-content {
max-width: 800px;
margin: 2rem auto;
padding: 2rem;
background: white;
border-radius: 12px;
box-shadow: 0 20px 40px rgba(0, 0, 0, 0.3);
position: relative;
}
.seo-content h1 {
color: #1f2937;
font-size: 2.5rem;
font-weight: bold;
margin-bottom: 1rem;
line-height: 1.2;
}
.seo-content .intro {
color: #4b5563;
font-size: 1.125rem;
line-height: 1.7;
margin-bottom: 2rem;
}
.seo-content .section {
margin-bottom: 2rem;
}
.seo-content .section h2 {
color: #1f2937;
font-size: 1.5rem;
font-weight: 600;
margin-bottom: 0.75rem;
}
.seo-content .section p {
color: #6b7280;
line-height: 1.6;
margin-bottom: 1rem;
}
.seo-toggle-btn {
/* position: fixed; */
/* bottom: 2rem; */
/* right: 2rem; */
background: #3b82f6;
color: white;
border: none;
border-radius: 50%;
width: 60px;
height: 60px;
font-size: 1.5rem;
cursor: pointer;
box-shadow: 0 4px 12px rgba(59, 130, 246, 0.4);
transition: all 0.3s ease;
z-index: 1001;
}
.seo-toggle-btn:hover {
background: #2563eb;
transform: scale(1.1);
}
.seo-close-btn {
position: absolute;
top: 1rem;
right: 1rem;
background: #ef4444;
color: white;
border: none;
border-radius: 50%;
width: 40px;
height: 40px;
font-size: 1.25rem;
cursor: pointer;
transition: all 0.3s ease;
}
.seo-close-btn:hover {
background: #dc2626;
transform: scale(1.1);
}
.seo-close-btn-alt {
position: absolute;
bottom: 1rem;
right: 1rem;
background: #6b7280;
color: white;
border: none;
border-radius: 8px;
padding: 0.75rem 1rem;
font-size: 0.875rem;
cursor: pointer;
transition: all 0.3s ease;
display: flex;
align-items: center;
gap: 0.5rem;
font-weight: 500;
}
.seo-close-btn-alt:hover {
background: #4b5563;
transform: translateY(-2px);
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
}
/* Static SEO content for bots */
.seo-static {
display: none;
max-width: 800px;
margin: 2rem auto;
padding: 2rem;
background: white;
color: #1f2937;
}
.seo-static h1 {
font-size: 2.5rem;
font-weight: bold;
margin-bottom: 1rem;
color: #1f2937;
}
.seo-static .intro {
font-size: 1.125rem;
line-height: 1.7;
margin-bottom: 2rem;
color: #4b5563;
}
.seo-static .section {
margin-bottom: 2rem;
}
.seo-static .section h2 {
font-size: 1.5rem;
font-weight: 600;
margin-bottom: 0.75rem;
color: #1f2937;
}
.seo-static .section p {
line-height: 1.6;
margin-bottom: 1rem;
color: #6b7280;
}
/* Show static content for bots */
body.bot-detected .seo-static {
display: block;
}
body.bot-detected .seo-toggle-btn {
display: none;
}
@media (max-width: 768px) {
.seo-content {
margin: 1rem;
padding: 1.5rem;
}
.seo-content h1 {
font-size: 2rem;
}
.seo-toggle-btn {
bottom: 1rem;
right: 1rem;
width: 50px;
height: 50px;
font-size: 1.25rem;
}
}
.schedule {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: 9999;
}
.schedule-grid {
display: flex;
flex-direction: column;
flex-wrap: nowrap;
flex: 1;
width: 100%;
}
.schedule-list {
display: flex;
flex-wrap: nowrap;
overflow-x: auto;
}
.schedule-list>div {
flex-shrink: 0;
}
.schedule-list>div:first-child {
width: 150px;
/* Channel logo column */
}
.schedule-time-header {
grid-column: 2 / span 48;
width: 100%;
}
.actions-group>button {
transition: transform linear 0.3s;
transform: translateX(100%);
}
.actions-group.show>button,
.actions-group:hover>button {
transform: translateX(0);
}
#right-sidebar-toggle {
display: none;
}
@media screen and (max-width: 1024px) {
.main-content {
background-color: #000;
}
.globe-grid {
grid-template-columns: 1fr;
grid-template-areas: ".";
}
.right-sidebar {
position: absolute;
top: 0;
right: 0;
bottom: 0;
max-width: 320px;
width: 100%;
z-index: -1 !important;
transition: transform 0.3s ease-in-out;
}
.right-sidebar.show {
z-index: 9999 !important;
}
.right-sidebar.inactive {
transform: translateX(calc(100% + 1px));
}
#right-sidebar-toggle {
display: block;
}
}
#search-form-left {
display: none;
}
@media screen and (max-width: 640px) {
#search-form {
display: none;
}
#search-form-left {
display: flex;
}
#left-sidebar {
width: 100%;
}
.right-sidebar {
width: 100%;
max-width: 100%;
}
}
.loading {
backdrop-filter: blur(10px);
background-color: rgba(0, 0, 0, 0.5);
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
z-index: 9999;
align-items: center;
justify-content: center;
color: #fff;
}
</style>
<!-- Google tag (gtag.js) -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-TGZPJHPWL2"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag() { dataLayer.push(arguments); }
gtag('js', new Date());
gtag('config', 'G-TGZPJHPWL2');
</script>
</head><body class="h-screen grid grid-cols-1 grid-rows-[auto_1fr] overflow-hidden">
<!-- Navigation Header -->
<nav class="bg-gray-800 text-white p-4 flex justify-between items-center border-gray-700 border-b-2">
<div class="flex items-center">
<button id="menu-toggle"
class="mr-4 hover:bg-gray-700 p-1 rounded transition-colors">
<svg class="w-6 h-6"
fill="none"
stroke="currentColor"
viewBox="0 0 24 24">
<path strokeLinecap="round"
strokeLinejoin="round"
strokeWidth="2"
d="M4 6h16M4 12h16M4 18h16" />
</svg>
</button>
<a href="/">
<img src="/images/fansshare-logo-small.png?v=3"
alt="FansShare"
class="h-9"
width="120"
height="36"
fetchpriority="high">
</a>
</div>
<div class="flex items-center">
<form id="search-form" action="" method="GET" class="relative flex items-center bg-gray-700 rounded-lg px-3 py-2 mb-0">
<input type="text"
name="search"
placeholder="Search Everything"
class="bg-transparent text-white placeholder-gray-400 focus:outline-none w-64">
<button type="submit" class="ml-2 transition-transform duration-200 hover:scale-110 active:scale-95">
<svg class="w-5 h-5 text-gray-400 transition-colors duration-200 hover:text-white"
fill="none"
stroke="currentColor"
viewBox="0 0 24 24">
<path strokeLinecap="round"
strokeLinejoin="round"
strokeWidth="2"
d="M13 10V3L4 14h7v7l9-11h-7z" />
</svg>
</button>
</form>
<button type="button" onclick="toggleRightSidebar()" id="right-sidebar-toggle" class="ml-2 p-2 bg-gray-700 rounded-lg transition-transform duration-200 hover:scale-110 active:scale-95" style="height: 40px">
<svg class="w-5 h-5 text-gray-400 transition-colors duration-200 hover:text-white"
fill="none"
stroke="currentColor"
viewBox="0 0 24 24">
<path strokeLinecap="round"
strokeLinejoin="round"
strokeWidth="2"
d="M4 6h16M4 12h16m-7 6h7" />
</svg>
</button>
</div>
</nav>
<div id="content-wrapper" class="flex flex-1 overflow-hidden relative">
<!-- Left Floating Sidebar -->
<div id="left-sidebar" class="absolute top-0 bottom-0 left-0 w-64 bg-gray-900 text-white transform transition-transform duration-300 ease-in-out z-50 shadow-lg overflow-y-auto -translate-x-full">
<div class="p-4 pb-0" style="padding-bottom: 0px !important;">
<form id="search-form-left" action="" method="GET" class="relative flex items-center bg-gray-700 rounded-lg px-3 py-2">
<input type="text"
name="search"
placeholder="Search Everything"
class="bg-transparent text-white placeholder-gray-400 focus:outline-none w-full">
<button type="submit" class="ml-2 transition-transform duration-200 hover:scale-110 active:scale-95">
<svg class="w-5 h-5 text-gray-400 transition-colors duration-200 hover:text-white"
fill="none"
stroke="currentColor"
viewBox="0 0 24 24">
<path strokeLinecap="round"
strokeLinejoin="round"
strokeWidth="2"
d="M13 10V3L4 14h7v7l9-11h-7z" />
</svg>
</button>
</form>
</div>
<div class="p-4">
<!-- Navigation Items -->
<nav class="space-y-1">
<a href="/about" class="flex items-center px-3 py-2 rounded-md hover:bg-gray-800 transition-colors">
<svg class="w-5 h-5 mr-3" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"></path>
</svg>
About
</a>
<a href="/random" class="flex items-center px-3 py-2 rounded-md hover:bg-gray-800 transition-colors">
<svg class="w-5 h-5 mr-3" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M7 4V2a1 1 0 011-1h8a1 1 0 011 1v2m-9 3v10a2 2 0 002 2h6a2 2 0 002-2V7H7z"></path>
</svg>
Random Channel
</a>
<div class="pt-4">
<h3 class="px-3 text-xs font-semibold text-gray-400 uppercase tracking-wider mb-2">Explore</h3>
<a href="/category/animation" class="flex items-center px-3 py-2 rounded-md hover:bg-gray-800 transition-colors"><div class="w-5 h-5 mr-3 flex items-center justify-center"><svg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><polygon points='5,3 19,12 5,21'></polygon><path d='M12 2l3 7h7l-5.5 4 2 7L12 16l-6.5 4 2-7L2 9h7z'></path></svg></div><span class="text-sm">Animation</span></a><a href="/category/auto" class="flex items-center px-3 py-2 rounded-md hover:bg-gray-800 transition-colors"><div class="w-5 h-5 mr-3 flex items-center justify-center"><svg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='M14 16H9m10 0h3v-3.15a1 1 0 0 0-.84-.99L16 11l-2.7-3.6a1 1 0 0 0-.8-.4H8.5a1 1 0 0 0-.8.4L5 11l-5.16 1.86A1 1 0 0 0 2 14.15V17h3m2 0a2 2 0 1 0 4 0m8 0a2 2 0 1 0 4 0'></path><circle cx='7' cy='17' r='2'></circle><circle cx='17' cy='17' r='2'></circle></svg></div><span class="text-sm">Auto</span></a><a href="/category/business" class="flex items-center px-3 py-2 rounded-md hover:bg-gray-800 transition-colors"><div class="w-5 h-5 mr-3 flex items-center justify-center"><svg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><rect x='2' y='3' width='20' height='14' rx='2' ry='2'></rect><line x1='8' y1='21' x2='16' y2='21'></line><line x1='12' y1='17' x2='12' y2='21'></line></svg></div><span class="text-sm">Business</span></a><a href="/category/classic" class="flex items-center px-3 py-2 rounded-md hover:bg-gray-800 transition-colors"><div class="w-5 h-5 mr-3 flex items-center justify-center"><svg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='M3 21h18'></path><path d='M5 21V7l8-4v18'></path><path d='M19 21V11l-6-4'></path></svg></div><span class="text-sm">Classic</span></a><a href="/category/comedy" class="flex items-center px-3 py-2 rounded-md hover:bg-gray-800 transition-colors"><div class="w-5 h-5 mr-3 flex items-center justify-center"><svg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><circle cx='12' cy='12' r='10'></circle><path d='M8 14s1.5 2 4 2 4-2 4-2'></path><line x1='9' y1='9' x2='9.01' y2='9'></line><line x1='15' y1='9' x2='15.01' y2='9'></line></svg></div><span class="text-sm">Comedy</span></a><a href="/category/cooking" class="flex items-center px-3 py-2 rounded-md hover:bg-gray-800 transition-colors"><div class="w-5 h-5 mr-3 flex items-center justify-center"><svg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='M6 13.87A4 4 0 0 1 7.41 6a5.11 5.11 0 0 1 1.05-1.54 5 5 0 0 1 7.08 0A5.11 5.11 0 0 1 16.59 6 4 4 0 0 1 18 13.87V21a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2Z'></path><line x1='6' y1='9' x2='18' y2='9'></line></svg></div><span class="text-sm">Cooking</span></a><a href="/category/culture" class="flex items-center px-3 py-2 rounded-md hover:bg-gray-800 transition-colors"><div class="w-5 h-5 mr-3 flex items-center justify-center"><svg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='M2 3h20v18H2z'></path><path d='M8 21v-5a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v5'></path><path d='M2 11h20'></path><path d='M7 7h.01'></path><path d='M17 7h.01'></path></svg></div><span class="text-sm">Culture</span></a><a href="/category/documentary" class="flex items-center px-3 py-2 rounded-md hover:bg-gray-800 transition-colors"><div class="w-5 h-5 mr-3 flex items-center justify-center"><svg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><rect x='2' y='2' width='20' height='20' rx='2.18' ry='2.18'></rect><line x1='7' y1='2' x2='7' y2='22'></line><line x1='17' y1='2' x2='17' y2='22'></line><line x1='2' y1='12' x2='22' y2='12'></line><line x1='2' y1='7' x2='7' y2='7'></line><line x1='2' y1='17' x2='7' y2='17'></line><line x1='17' y1='17' x2='22' y2='17'></line><line x1='17' y1='7' x2='22' y2='7'></line></svg></div><span class="text-sm">Documentary</span></a><a href="/category/education" class="flex items-center px-3 py-2 rounded-md hover:bg-gray-800 transition-colors"><div class="w-5 h-5 mr-3 flex items-center justify-center"><svg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='M22 10v6M2 10l10-5 10 5-10 5z'></path><path d='M6 12v5c3 3 9 3 12 0v-5'></path></svg></div><span class="text-sm">Education</span></a><a href="/category/entertainment" class="flex items-center px-3 py-2 rounded-md hover:bg-gray-800 transition-colors"><div class="w-5 h-5 mr-3 flex items-center justify-center"><svg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><polygon points='12,2 15.09,8.26 22,9.27 17,14.14 18.18,21.02 12,17.77 5.82,21.02 7,14.14 2,9.27 8.91,8.26'></polygon></svg></div><span class="text-sm">Entertainment</span></a><a href="/category/family" class="flex items-center px-3 py-2 rounded-md hover:bg-gray-800 transition-colors"><div class="w-5 h-5 mr-3 flex items-center justify-center"><svg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='M3 21h18'></path><path d='M5 21V7l8-4v18'></path><path d='M19 21V11l-6-4'></path></svg></div><span class="text-sm">Family</span></a><a href="/category/general" class="flex items-center px-3 py-2 rounded-md hover:bg-gray-800 transition-colors"><div class="w-5 h-5 mr-3 flex items-center justify-center"><svg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><rect x='3' y='3' width='7' height='7'></rect><rect x='14' y='3' width='7' height='7'></rect><rect x='14' y='14' width='7' height='7'></rect><rect x='3' y='14' width='7' height='7'></rect></svg></div><span class="text-sm">General</span></a><a href="/category/kids" class="flex items-center px-3 py-2 rounded-md hover:bg-gray-800 transition-colors"><div class="w-5 h-5 mr-3 flex items-center justify-center"><svg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='M12 7.5a4.5 4.5 0 1 1 0 9 4.5 4.5 0 0 1 0-9Z'></path><path d='M12 1v4'></path><path d='M12 19v4'></path><path d='M3 12h4'></path><path d='M17 12h4'></path><path d='M5.5 5.5l2.83 2.83'></path><path d='M15.66 15.66l2.83 2.83'></path><path d='M5.5 18.5l2.83-2.83'></path><path d='M15.66 8.34l2.83-2.83'></path></svg></div><span class="text-sm">Kids</span></a><a href="/category/legislative" class="flex items-center px-3 py-2 rounded-md hover:bg-gray-800 transition-colors"><div class="w-5 h-5 mr-3 flex items-center justify-center"><svg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='M3 3v18h18'></path><path d='M18.7 8a1 1 0 0 0-1.4 0l-6.3 6.3-2.3-2.3a1 1 0 0 0-1.4 0l-2.3 2.3 1.4 1.4L8.3 14l6.3-6.3a1 1 0 0 0 0-1.4Z'></path></svg></div><span class="text-sm">Legislative</span></a><a href="/category/lifestyle" class="flex items-center px-3 py-2 rounded-md hover:bg-gray-800 transition-colors"><div class="w-5 h-5 mr-3 flex items-center justify-center"><svg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='M20.84 4.61a5.5 5.5 0 0 0-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 0 0-7.78 7.78l1.06 1.06L12 21.23l7.78-7.78 1.06-1.06a5.5 5.5 0 0 0 0-7.78z'></path></svg></div><span class="text-sm">Lifestyle</span></a><a href="/category/movies" class="flex items-center px-3 py-2 rounded-md hover:bg-gray-800 transition-colors"><div class="w-5 h-5 mr-3 flex items-center justify-center"><svg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><rect x='2' y='3' width='20' height='14' rx='2' ry='2'></rect><line x1='8' y1='21' x2='16' y2='21'></line><line x1='12' y1='17' x2='12' y2='21'></line></svg></div><span class="text-sm">Movies</span></a><a href="/category/music" class="flex items-center px-3 py-2 rounded-md hover:bg-gray-800 transition-colors"><div class="w-5 h-5 mr-3 flex items-center justify-center"><svg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='M9 18V5l12-2v13'></path><circle cx='6' cy='18' r='3'></circle><circle cx='18' cy='16' r='3'></circle></svg></div><span class="text-sm">Music</span></a><a href="/category/news" class="flex items-center px-3 py-2 rounded-md hover:bg-gray-800 transition-colors"><div class="w-5 h-5 mr-3 flex items-center justify-center"><svg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='M4 22h16a2 2 0 0 0 2-2V4a2 2 0 0 0-2-2H8a2 2 0 0 0-2 2v16a2 2 0 0 1-2 2Zm0 0a2 2 0 0 1-2-2v-9c0-1.1.9-2 2-2h2'></path><path d='M18 14h-8'></path><path d='M15 18h-5'></path><path d='M10 6h8v4h-8V6Z'></path></svg></div><span class="text-sm">News</span></a><a href="/category/outdoor" class="flex items-center px-3 py-2 rounded-md hover:bg-gray-800 transition-colors"><div class="w-5 h-5 mr-3 flex items-center justify-center"><svg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='m4 14 4-4 4 4'></path><path d='m16 10 4-4 4 4'></path><path d='m14 20-4-4 6-6 4 4Z'></path><path d='M20 14v7H3v-7'></path></svg></div><span class="text-sm">Outdoor</span></a><a href="/category/relax" class="flex items-center px-3 py-2 rounded-md hover:bg-gray-800 transition-colors"><div class="w-5 h-5 mr-3 flex items-center justify-center"><svg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='M11 20A7 7 0 0 1 9.8 6.1C15.5 5 17 4.48 19 2c1 2 2 4.18 2 8 0 5.5-4.78 10-10 10Z'></path><path d='M2 21c0-3 1.85-5.36 5.08-6C9.5 14.52 12 13 13 12'></path></svg></div><span class="text-sm">Relax</span></a><a href="/category/religious" class="flex items-center px-3 py-2 rounded-md hover:bg-gray-800 transition-colors"><div class="w-5 h-5 mr-3 flex items-center justify-center"><svg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='M12 2v20'></path><path d='M2 12h20'></path></svg></div><span class="text-sm">Religious</span></a><a href="/category/science" class="flex items-center px-3 py-2 rounded-md hover:bg-gray-800 transition-colors"><div class="w-5 h-5 mr-3 flex items-center justify-center"><svg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><circle cx='12' cy='12' r='2'></circle><path d='M12 1v6m6 6h6m-6 6v6m-6-6H1'></path><path d='M5.64 7.64 9.5 11.5m5 1 3.86 3.86m0-10.72L14.5 9.5m-5-1L5.64 16.36'></path></svg></div><span class="text-sm">Science</span></a><a href="/category/series" class="flex items-center px-3 py-2 rounded-md hover:bg-gray-800 transition-colors"><div class="w-5 h-5 mr-3 flex items-center justify-center"><svg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><rect x='3' y='4' width='18' height='12' rx='1'></rect><rect x='7' y='20' width='10' height='1'></rect></svg></div><span class="text-sm">Series</span></a><a href="/category/shop" class="flex items-center px-3 py-2 rounded-md hover:bg-gray-800 transition-colors"><div class="w-5 h-5 mr-3 flex items-center justify-center"><svg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='M6 2L3 6v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V6l-3-4z'></path><line x1='3' y1='6' x2='21' y2='6'></line><path d='M16 10a4 4 0 0 1-8 0'></path></svg></div><span class="text-sm">Shop</span></a><a href="/category/sports" class="flex items-center px-3 py-2 rounded-md hover:bg-gray-800 transition-colors"><div class="w-5 h-5 mr-3 flex items-center justify-center"><svg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><circle cx='12' cy='12' r='10'></circle><path d='M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20'></path><path d='M2 12h20'></path></svg></div><span class="text-sm">Sports</span></a><a href="/category/travel" class="flex items-center px-3 py-2 rounded-md hover:bg-gray-800 transition-colors"><div class="w-5 h-5 mr-3 flex items-center justify-center"><svg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='M17.8 19.2 16 11l3.5-3.5C21 6 21.5 4 21 3c-1-.5-3 0-4.5 1.5L13 8 4.8 6.2c-.5-.1-.9.1-1.1.5l-.3.5c-.2.5-.1 1 .3 1.3L9 12l-2 3H4l-1 1 3 2 2 3 1-1v-3l3-2 3.5 5.3c.3.4.8.5 1.3.3l.5-.2c.4-.3.6-.7.5-1.2z'></path></svg></div><span class="text-sm">Travel</span></a><a href="/category/weather" class="flex items-center px-3 py-2 rounded-md hover:bg-gray-800 transition-colors"><div class="w-5 h-5 mr-3 flex items-center justify-center"><svg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='M17.5 19H9a7 7 0 1 1 6.71-9h1.79a4.5 4.5 0 1 1 0 9Z'></path></svg></div><span class="text-sm">Weather</span></a> </div>
<div class="pt-4">
<h3 class="px-3 text-xs font-semibold text-gray-400 uppercase tracking-wider mb-2">Help & Support</h3>
<a href="/faq" class="flex items-center px-3 py-2 rounded-md hover:bg-gray-800 transition-colors">
<svg class="w-5 h-5 mr-3" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8.228 9c.549-1.165 2.03-2 3.772-2 2.21 0 4 1.343 4 3 0 1.4-1.278 2.575-3.006 2.907-.542.104-.994.54-.994 1.093m0 3h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"></path>
</svg>
<span class="text-sm">FAQs</span>
</a>
<a href="/privacy-policy" class="flex items-center px-3 py-2 rounded-md hover:bg-gray-800 transition-colors">
<svg class="w-5 h-5 mr-3" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z"></path>
</svg>
<span class="text-sm">Privacy Policy</span>
</a>
<a href="/feedback" class="flex items-center px-3 py-2 rounded-md hover:bg-gray-800 transition-colors">
<svg class="w-5 h-5 mr-3" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M7 8h10M7 12h4m1 8l-4-4H5a2 2 0 01-2-2V6a2 2 0 012-2h14a2 2 0 012 2v8a2 2 0 01-2 2h-3l-4 4z"></path>
</svg>
<span class="text-sm">Feedback</span>
</a>
</div>
</nav>
</div>
</div>
<!-- Main Content -->
<div class="globe-grid w-full tv-screen">
<div class="main-content relative overflow-hidden z-10 ggb">
<div id="globeViz" style="max-height: 100%; max-width: 100%;"></div>
<div id="loading"
class="loading flex text-white">
Loading world map...
</div>
<div id="videoContainer"
class="bg-black absolute inset-0 z-10 hidden top-0 left-0 right-0 bottom-0">
<video id="videoPlayer"
class="video-js vjs-default-skin vjs-big-play-centered"
controls
preload="auto"
width="100%"
height="100%">
<p class="vjs-no-js">
To view this video please enable JavaScript, and consider upgrading to a web browser that
<a href="https://videojs.com/html5-video-support/"
target="_blank">supports HTML5 video</a>
</p>
</video>
<div id="stream-loading"
class="absolute inset-0 bg-black bg-opacity-75 flex items-center justify-center text-white z-40 hidden">
<div class="text-center">
<div class="animate-spin rounded-full h-12 w-12 border-b-2 border-white mx-auto mb-4"></div>
<p class="text-lg">Loading stream...</p>
<p class="text-sm text-gray-300 mt-2">Please wait while we connect to the channel</p>
</div>
</div>
</div>
<div id="ggb-details" class="bg-gray-800 flex-1 relative z-20 overflow-hidden">
<div class="p-4 overflow-y-auto absolute top-0 left-0 w-full h-full">
<div id="ggb-details-content">
<h1 class="text-white text-2xl font-bold">Live TV Streaming</h1>
<div class="intro text-gray-300 text-sm">Live TV Streaming</div>
</div>
</div>
</div>
</div>
<!-- Right Sidebar -->
<div class="right-sidebar text-white h-full flex flex-col relative shadow-[-10px_0_10px_-5px_rgba(0,0,0,0.3)]">
<div class="bg-gray-800 p-4 border-gray-700 border-b-2 relative z-20">
<div id="country-selector"
class="flex justify-between items-center">
<h2 class="text-xl font-bold">Select a Channel</h2>
<div id="current-time" class="text-sm text-gray-300"></div>
</div>
<div class="mt-2">
<input type="text" id="search-input" placeholder="Search countries channels..." class="w-full px-3 py-2 bg-gray-700 text-white border border-gray-600 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent">
</div>
<div id="country-header" class="flex justify-between items-center hidden">
<h2 class="text-xl font-bold"></h2>
<div class="text-sm text-gray-300"></div>
</div>
</div>
<div class="bg-gray-800 flex-1 relative z-20">
<div class="p-2 overflow-y-auto absolute top-0 left-0 w-full h-full">
<div id="countries-list" class="space-y-1"><a class="country-item" href="/afghanistan" onclick="trackCountrySelection('AF', 'Afghanistan')"><img src="/dist/flags/4x3/af.svg?v2" alt="Afghanistan" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Afghanistan</span></a><a class="country-item" href="/albania" onclick="trackCountrySelection('AL', 'Albania')"><img src="/dist/flags/4x3/al.svg?v2" alt="Albania" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Albania</span></a><a class="country-item" href="/algeria" onclick="trackCountrySelection('DZ', 'Algeria')"><img src="/dist/flags/4x3/dz.svg?v2" alt="Algeria" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Algeria</span></a><a class="country-item" href="/andorra" onclick="trackCountrySelection('AD', 'Andorra')"><img src="/dist/flags/4x3/ad.svg?v2" alt="Andorra" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Andorra</span></a><a class="country-item" href="/angola" onclick="trackCountrySelection('AO', 'Angola')"><img src="/dist/flags/4x3/ao.svg?v2" alt="Angola" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Angola</span></a><a class="country-item" href="/argentina" onclick="trackCountrySelection('AR', 'Argentina')"><img src="/dist/flags/4x3/ar.svg?v2" alt="Argentina" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Argentina</span></a><a class="country-item" href="/armenia" onclick="trackCountrySelection('AM', 'Armenia')"><img src="/dist/flags/4x3/am.svg?v2" alt="Armenia" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Armenia</span></a><a class="country-item" href="/aruba" onclick="trackCountrySelection('AW', 'Aruba')"><img src="/dist/flags/4x3/aw.svg?v2" alt="Aruba" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Aruba</span></a><a class="country-item" href="/australia" onclick="trackCountrySelection('AU', 'Australia')"><img src="/dist/flags/4x3/au.svg?v2" alt="Australia" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Australia</span></a><a class="country-item" href="/austria" onclick="trackCountrySelection('AT', 'Austria')"><img src="/dist/flags/4x3/at.svg?v2" alt="Austria" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Austria</span></a><a class="country-item" href="/azerbaijan" onclick="trackCountrySelection('AZ', 'Azerbaijan')"><img src="/dist/flags/4x3/az.svg?v2" alt="Azerbaijan" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Azerbaijan</span></a><a class="country-item" href="/bahamas" onclick="trackCountrySelection('BS', 'Bahamas')"><img src="/dist/flags/4x3/bs.svg?v2" alt="Bahamas" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Bahamas</span></a><a class="country-item" href="/bahrain" onclick="trackCountrySelection('BH', 'Bahrain')"><img src="/dist/flags/4x3/bh.svg?v2" alt="Bahrain" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Bahrain</span></a><a class="country-item" href="/bangladesh" onclick="trackCountrySelection('BD', 'Bangladesh')"><img src="/dist/flags/4x3/bd.svg?v2" alt="Bangladesh" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Bangladesh</span></a><a class="country-item" href="/barbados" onclick="trackCountrySelection('BB', 'Barbados')"><img src="/dist/flags/4x3/bb.svg?v2" alt="Barbados" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Barbados</span></a><a class="country-item" href="/belarus" onclick="trackCountrySelection('BY', 'Belarus')"><img src="/dist/flags/4x3/by.svg?v2" alt="Belarus" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Belarus</span></a><a class="country-item" href="/belgium" onclick="trackCountrySelection('BE', 'Belgium')"><img src="/dist/flags/4x3/be.svg?v2" alt="Belgium" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Belgium</span></a><a class="country-item" href="/benin" onclick="trackCountrySelection('BJ', 'Benin')"><img src="/dist/flags/4x3/bj.svg?v2" alt="Benin" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Benin</span></a><a class="country-item" href="/bermuda" onclick="trackCountrySelection('BM', 'Bermuda')"><img src="/dist/flags/4x3/bm.svg?v2" alt="Bermuda" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Bermuda</span></a><a class="country-item" href="/bolivia" onclick="trackCountrySelection('BO', 'Bolivia')"><img src="/dist/flags/4x3/bo.svg?v2" alt="Bolivia" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Bolivia</span></a><a class="country-item" href="/bonaire" onclick="trackCountrySelection('BQ', 'Bonaire')"><img src="/dist/flags/4x3/bq.svg?v2" alt="Bonaire" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Bonaire</span></a><a class="country-item" href="/bosnia-and-herzegovina" onclick="trackCountrySelection('BA', 'Bosnia and Herzegovina')"><img src="/dist/flags/4x3/ba.svg?v2" alt="Bosnia and Herzegovina" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Bosnia and Herzegovina</span></a><a class="country-item" href="/brazil" onclick="trackCountrySelection('BR', 'Brazil')"><img src="/dist/flags/4x3/br.svg?v2" alt="Brazil" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Brazil</span></a><a class="country-item" href="/british-virgin-islands" onclick="trackCountrySelection('VG', 'British Virgin Islands')"><img src="/dist/flags/4x3/vg.svg?v2" alt="British Virgin Islands" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>British Virgin Islands</span></a><a class="country-item" href="/bulgaria" onclick="trackCountrySelection('BG', 'Bulgaria')"><img src="/dist/flags/4x3/bg.svg?v2" alt="Bulgaria" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Bulgaria</span></a><a class="country-item" href="/cambodia" onclick="trackCountrySelection('KH', 'Cambodia')"><img src="/dist/flags/4x3/kh.svg?v2" alt="Cambodia" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Cambodia</span></a><a class="country-item" href="/cameroon" onclick="trackCountrySelection('CM', 'Cameroon')"><img src="/dist/flags/4x3/cm.svg?v2" alt="Cameroon" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Cameroon</span></a><a class="country-item" href="/canada" onclick="trackCountrySelection('CA', 'Canada')"><img src="/dist/flags/4x3/ca.svg?v2" alt="Canada" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Canada</span></a><a class="country-item" href="/cape-verde" onclick="trackCountrySelection('CV', 'Cape Verde')"><img src="/dist/flags/4x3/cv.svg?v2" alt="Cape Verde" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Cape Verde</span></a><a class="country-item" href="/chad" onclick="trackCountrySelection('TD', 'Chad')"><img src="/dist/flags/4x3/td.svg?v2" alt="Chad" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Chad</span></a><a class="country-item" href="/chile" onclick="trackCountrySelection('CL', 'Chile')"><img src="/dist/flags/4x3/cl.svg?v2" alt="Chile" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Chile</span></a><a class="country-item" href="/china" onclick="trackCountrySelection('CN', 'China')"><img src="/dist/flags/4x3/cn.svg?v2" alt="China" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>China</span></a><a class="country-item" href="/colombia" onclick="trackCountrySelection('CO', 'Colombia')"><img src="/dist/flags/4x3/co.svg?v2" alt="Colombia" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Colombia</span></a><a class="country-item" href="/costa-rica" onclick="trackCountrySelection('CR', 'Costa Rica')"><img src="/dist/flags/4x3/cr.svg?v2" alt="Costa Rica" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Costa Rica</span></a><a class="country-item" href="/croatia" onclick="trackCountrySelection('HR', 'Croatia')"><img src="/dist/flags/4x3/hr.svg?v2" alt="Croatia" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Croatia</span></a><a class="country-item" href="/cuba" onclick="trackCountrySelection('CU', 'Cuba')"><img src="/dist/flags/4x3/cu.svg?v2" alt="Cuba" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Cuba</span></a><a class="country-item" href="/curacao" onclick="trackCountrySelection('CW', 'Curacao')"><img src="/dist/flags/4x3/cw.svg?v2" alt="Curacao" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Curacao</span></a><a class="country-item" href="/cyprus" onclick="trackCountrySelection('CY', 'Cyprus')"><img src="/dist/flags/4x3/cy.svg?v2" alt="Cyprus" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Cyprus</span></a><a class="country-item" href="/czech-republic" onclick="trackCountrySelection('CZ', 'Czech Republic')"><img src="/dist/flags/4x3/cz.svg?v2" alt="Czech Republic" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Czech Republic</span></a><a class="country-item" href="/democratic-republic-of-the-congo" onclick="trackCountrySelection('CD', 'Democratic Republic of the Congo')"><img src="/dist/flags/4x3/cd.svg?v2" alt="Democratic Republic of the Congo" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Democratic Republic of the Congo</span></a><a class="country-item" href="/denmark" onclick="trackCountrySelection('DK', 'Denmark')"><img src="/dist/flags/4x3/dk.svg?v2" alt="Denmark" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Denmark</span></a><a class="country-item" href="/dominican-republic" onclick="trackCountrySelection('DO', 'Dominican Republic')"><img src="/dist/flags/4x3/do.svg?v2" alt="Dominican Republic" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Dominican Republic</span></a><a class="country-item" href="/ecuador" onclick="trackCountrySelection('EC', 'Ecuador')"><img src="/dist/flags/4x3/ec.svg?v2" alt="Ecuador" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Ecuador</span></a><a class="country-item" href="/egypt" onclick="trackCountrySelection('EG', 'Egypt')"><img src="/dist/flags/4x3/eg.svg?v2" alt="Egypt" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Egypt</span></a><a class="country-item" href="/el-salvador" onclick="trackCountrySelection('SV', 'El Salvador')"><img src="/dist/flags/4x3/sv.svg?v2" alt="El Salvador" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>El Salvador</span></a><a class="country-item" href="/equatorial-guinea" onclick="trackCountrySelection('GQ', 'Equatorial Guinea')"><img src="/dist/flags/4x3/gq.svg?v2" alt="Equatorial Guinea" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Equatorial Guinea</span></a><a class="country-item" href="/estonia" onclick="trackCountrySelection('EE', 'Estonia')"><img src="/dist/flags/4x3/ee.svg?v2" alt="Estonia" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Estonia</span></a><a class="country-item" href="/ethiopia" onclick="trackCountrySelection('ET', 'Ethiopia')"><img src="/dist/flags/4x3/et.svg?v2" alt="Ethiopia" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Ethiopia</span></a><a class="country-item" href="/faroe-islands" onclick="trackCountrySelection('FO', 'Faroe Islands')"><img src="/dist/flags/4x3/fo.svg?v2" alt="Faroe Islands" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Faroe Islands</span></a><a class="country-item" href="/finland" onclick="trackCountrySelection('FI', 'Finland')"><img src="/dist/flags/4x3/fi.svg?v2" alt="Finland" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Finland</span></a><a class="country-item" href="/france" onclick="trackCountrySelection('FR', 'France')"><img src="/dist/flags/4x3/fr.svg?v2" alt="France" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>France</span></a><a class="country-item" href="/french-polynesia" onclick="trackCountrySelection('PF', 'French Polynesia')"><img src="/dist/flags/4x3/pf.svg?v2" alt="French Polynesia" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>French Polynesia</span></a><a class="country-item" href="/gambia" onclick="trackCountrySelection('GM', 'Gambia')"><img src="/dist/flags/4x3/gm.svg?v2" alt="Gambia" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Gambia</span></a><a class="country-item" href="/georgia" onclick="trackCountrySelection('GE', 'Georgia')"><img src="/dist/flags/4x3/ge.svg?v2" alt="Georgia" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Georgia</span></a><a class="country-item" href="/germany" onclick="trackCountrySelection('DE', 'Germany')"><img src="/dist/flags/4x3/de.svg?v2" alt="Germany" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Germany</span></a><a class="country-item" href="/ghana" onclick="trackCountrySelection('GH', 'Ghana')"><img src="/dist/flags/4x3/gh.svg?v2" alt="Ghana" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Ghana</span></a><a class="country-item" href="/greece" onclick="trackCountrySelection('GR', 'Greece')"><img src="/dist/flags/4x3/gr.svg?v2" alt="Greece" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Greece</span></a><a class="country-item" href="/guadeloupe" onclick="trackCountrySelection('GP', 'Guadeloupe')"><img src="/dist/flags/4x3/gp.svg?v2" alt="Guadeloupe" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Guadeloupe</span></a><a class="country-item" href="/guam" onclick="trackCountrySelection('GU', 'Guam')"><img src="/dist/flags/4x3/gu.svg?v2" alt="Guam" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Guam</span></a><a class="country-item" href="/guatemala" onclick="trackCountrySelection('GT', 'Guatemala')"><img src="/dist/flags/4x3/gt.svg?v2" alt="Guatemala" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Guatemala</span></a><a class="country-item" href="/guinea" onclick="trackCountrySelection('GN', 'Guinea')"><img src="/dist/flags/4x3/gn.svg?v2" alt="Guinea" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Guinea</span></a><a class="country-item" href="/guyana" onclick="trackCountrySelection('GY', 'Guyana')"><img src="/dist/flags/4x3/gy.svg?v2" alt="Guyana" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Guyana</span></a><a class="country-item" href="/haiti" onclick="trackCountrySelection('HT', 'Haiti')"><img src="/dist/flags/4x3/ht.svg?v2" alt="Haiti" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Haiti</span></a><a class="country-item" href="/honduras" onclick="trackCountrySelection('HN', 'Honduras')"><img src="/dist/flags/4x3/hn.svg?v2" alt="Honduras" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Honduras</span></a><a class="country-item" href="/hong-kong" onclick="trackCountrySelection('HK', 'Hong Kong')"><img src="/dist/flags/4x3/hk.svg?v2" alt="Hong Kong" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Hong Kong</span></a><a class="country-item" href="/hungary" onclick="trackCountrySelection('HU', 'Hungary')"><img src="/dist/flags/4x3/hu.svg?v2" alt="Hungary" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Hungary</span></a><a class="country-item" href="/iceland" onclick="trackCountrySelection('IS', 'Iceland')"><img src="/dist/flags/4x3/is.svg?v2" alt="Iceland" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Iceland</span></a><a class="country-item" href="/india" onclick="trackCountrySelection('IN', 'India')"><img src="/dist/flags/4x3/in.svg?v2" alt="India" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>India</span></a><a class="country-item" href="/indonesia" onclick="trackCountrySelection('ID', 'Indonesia')"><img src="/dist/flags/4x3/id.svg?v2" alt="Indonesia" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Indonesia</span></a><a class="country-item" href="/iran" onclick="trackCountrySelection('IR', 'Iran')"><img src="/dist/flags/4x3/ir.svg?v2" alt="Iran" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Iran</span></a><a class="country-item" href="/iraq" onclick="trackCountrySelection('IQ', 'Iraq')"><img src="/dist/flags/4x3/iq.svg?v2" alt="Iraq" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Iraq</span></a><a class="country-item" href="/ireland" onclick="trackCountrySelection('IE', 'Ireland')"><img src="/dist/flags/4x3/ie.svg?v2" alt="Ireland" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Ireland</span></a><a class="country-item" href="/israel" onclick="trackCountrySelection('IL', 'Israel')"><img src="/dist/flags/4x3/il.svg?v2" alt="Israel" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Israel</span></a><a class="country-item" href="/italy" onclick="trackCountrySelection('IT', 'Italy')"><img src="/dist/flags/4x3/it.svg?v2" alt="Italy" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Italy</span></a><a class="country-item" href="/ivory-coast" onclick="trackCountrySelection('CI', 'Ivory Coast')"><img src="/dist/flags/4x3/ci.svg?v2" alt="Ivory Coast" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Ivory Coast</span></a><a class="country-item" href="/jamaica" onclick="trackCountrySelection('JM', 'Jamaica')"><img src="/dist/flags/4x3/jm.svg?v2" alt="Jamaica" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Jamaica</span></a><a class="country-item" href="/japan" onclick="trackCountrySelection('JP', 'Japan')"><img src="/dist/flags/4x3/jp.svg?v2" alt="Japan" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Japan</span></a><a class="country-item" href="/jordan" onclick="trackCountrySelection('JO', 'Jordan')"><img src="/dist/flags/4x3/jo.svg?v2" alt="Jordan" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Jordan</span></a><a class="country-item" href="/kazakhstan" onclick="trackCountrySelection('KZ', 'Kazakhstan')"><img src="/dist/flags/4x3/kz.svg?v2" alt="Kazakhstan" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Kazakhstan</span></a><a class="country-item" href="/kenya" onclick="trackCountrySelection('KE', 'Kenya')"><img src="/dist/flags/4x3/ke.svg?v2" alt="Kenya" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Kenya</span></a><a class="country-item" href="/kuwait" onclick="trackCountrySelection('KW', 'Kuwait')"><img src="/dist/flags/4x3/kw.svg?v2" alt="Kuwait" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Kuwait</span></a><a class="country-item" href="/kyrgyzstan" onclick="trackCountrySelection('KG', 'Kyrgyzstan')"><img src="/dist/flags/4x3/kg.svg?v2" alt="Kyrgyzstan" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Kyrgyzstan</span></a><a class="country-item" href="/laos" onclick="trackCountrySelection('LA', 'Laos')"><img src="/dist/flags/4x3/la.svg?v2" alt="Laos" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Laos</span></a><a class="country-item" href="/latvia" onclick="trackCountrySelection('LV', 'Latvia')"><img src="/dist/flags/4x3/lv.svg?v2" alt="Latvia" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Latvia</span></a><a class="country-item" href="/lebanon" onclick="trackCountrySelection('LB', 'Lebanon')"><img src="/dist/flags/4x3/lb.svg?v2" alt="Lebanon" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Lebanon</span></a><a class="country-item" href="/liberia" onclick="trackCountrySelection('LR', 'Liberia')"><img src="/dist/flags/4x3/lr.svg?v2" alt="Liberia" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Liberia</span></a><a class="country-item" href="/libya" onclick="trackCountrySelection('LY', 'Libya')"><img src="/dist/flags/4x3/ly.svg?v2" alt="Libya" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Libya</span></a><a class="country-item" href="/lithuania" onclick="trackCountrySelection('LT', 'Lithuania')"><img src="/dist/flags/4x3/lt.svg?v2" alt="Lithuania" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Lithuania</span></a><a class="country-item" href="/luxembourg" onclick="trackCountrySelection('LU', 'Luxembourg')"><img src="/dist/flags/4x3/lu.svg?v2" alt="Luxembourg" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Luxembourg</span></a><a class="country-item" href="/macao" onclick="trackCountrySelection('MO', 'Macao')"><img src="/dist/flags/4x3/mo.svg?v2" alt="Macao" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Macao</span></a><a class="country-item" href="/malaysia" onclick="trackCountrySelection('MY', 'Malaysia')"><img src="/dist/flags/4x3/my.svg?v2" alt="Malaysia" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Malaysia</span></a><a class="country-item" href="/maldives" onclick="trackCountrySelection('MV', 'Maldives')"><img src="/dist/flags/4x3/mv.svg?v2" alt="Maldives" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Maldives</span></a><a class="country-item" href="/malta" onclick="trackCountrySelection('MT', 'Malta')"><img src="/dist/flags/4x3/mt.svg?v2" alt="Malta" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Malta</span></a><a class="country-item" href="/martinique" onclick="trackCountrySelection('MQ', 'Martinique')"><img src="/dist/flags/4x3/mq.svg?v2" alt="Martinique" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Martinique</span></a><a class="country-item" href="/mauritius" onclick="trackCountrySelection('MU', 'Mauritius')"><img src="/dist/flags/4x3/mu.svg?v2" alt="Mauritius" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Mauritius</span></a><a class="country-item" href="/mexico" onclick="trackCountrySelection('MX', 'Mexico')"><img src="/dist/flags/4x3/mx.svg?v2" alt="Mexico" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Mexico</span></a><a class="country-item" href="/moldova" onclick="trackCountrySelection('MD', 'Moldova')"><img src="/dist/flags/4x3/md.svg?v2" alt="Moldova" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Moldova</span></a><a class="country-item" href="/monaco" onclick="trackCountrySelection('MC', 'Monaco')"><img src="/dist/flags/4x3/mc.svg?v2" alt="Monaco" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Monaco</span></a><a class="country-item" href="/mongolia" onclick="trackCountrySelection('MN', 'Mongolia')"><img src="/dist/flags/4x3/mn.svg?v2" alt="Mongolia" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Mongolia</span></a><a class="country-item" href="/montenegro" onclick="trackCountrySelection('ME', 'Montenegro')"><img src="/dist/flags/4x3/me.svg?v2" alt="Montenegro" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Montenegro</span></a><a class="country-item" href="/morocco" onclick="trackCountrySelection('MA', 'Morocco')"><img src="/dist/flags/4x3/ma.svg?v2" alt="Morocco" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Morocco</span></a><a class="country-item" href="/mozambique" onclick="trackCountrySelection('MZ', 'Mozambique')"><img src="/dist/flags/4x3/mz.svg?v2" alt="Mozambique" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Mozambique</span></a><a class="country-item" href="/myanmar" onclick="trackCountrySelection('MM', 'Myanmar')"><img src="/dist/flags/4x3/mm.svg?v2" alt="Myanmar" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Myanmar</span></a><a class="country-item" href="/namibia" onclick="trackCountrySelection('NA', 'Namibia')"><img src="/dist/flags/4x3/na.svg?v2" alt="Namibia" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Namibia</span></a><a class="country-item" href="/nepal" onclick="trackCountrySelection('NP', 'Nepal')"><img src="/dist/flags/4x3/np.svg?v2" alt="Nepal" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Nepal</span></a><a class="country-item" href="/netherlands" onclick="trackCountrySelection('NL', 'Netherlands')"><img src="/dist/flags/4x3/nl.svg?v2" alt="Netherlands" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Netherlands</span></a><a class="country-item" href="/new-zealand" onclick="trackCountrySelection('NZ', 'New Zealand')"><img src="/dist/flags/4x3/nz.svg?v2" alt="New Zealand" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>New Zealand</span></a><a class="country-item" href="/nicaragua" onclick="trackCountrySelection('NI', 'Nicaragua')"><img src="/dist/flags/4x3/ni.svg?v2" alt="Nicaragua" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Nicaragua</span></a><a class="country-item" href="/niger" onclick="trackCountrySelection('NE', 'Niger')"><img src="/dist/flags/4x3/ne.svg?v2" alt="Niger" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Niger</span></a><a class="country-item" href="/nigeria" onclick="trackCountrySelection('NG', 'Nigeria')"><img src="/dist/flags/4x3/ng.svg?v2" alt="Nigeria" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Nigeria</span></a><a class="country-item" href="/north-macedonia" onclick="trackCountrySelection('MK', 'North Macedonia')"><img src="/dist/flags/4x3/mk.svg?v2" alt="North Macedonia" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>North Macedonia</span></a><a class="country-item" href="/norway" onclick="trackCountrySelection('NO', 'Norway')"><img src="/dist/flags/4x3/no.svg?v2" alt="Norway" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Norway</span></a><a class="country-item" href="/oman" onclick="trackCountrySelection('OM', 'Oman')"><img src="/dist/flags/4x3/om.svg?v2" alt="Oman" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Oman</span></a><a class="country-item" href="/pakistan" onclick="trackCountrySelection('PK', 'Pakistan')"><img src="/dist/flags/4x3/pk.svg?v2" alt="Pakistan" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Pakistan</span></a><a class="country-item" href="/palestine" onclick="trackCountrySelection('PS', 'Palestine')"><img src="/dist/flags/4x3/ps.svg?v2" alt="Palestine" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Palestine</span></a><a class="country-item" href="/panama" onclick="trackCountrySelection('PA', 'Panama')"><img src="/dist/flags/4x3/pa.svg?v2" alt="Panama" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Panama</span></a><a class="country-item" href="/papua-new-guinea" onclick="trackCountrySelection('PG', 'Papua New Guinea')"><img src="/dist/flags/4x3/pg.svg?v2" alt="Papua New Guinea" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Papua New Guinea</span></a><a class="country-item" href="/paraguay" onclick="trackCountrySelection('PY', 'Paraguay')"><img src="/dist/flags/4x3/py.svg?v2" alt="Paraguay" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Paraguay</span></a><a class="country-item" href="/peru" onclick="trackCountrySelection('PE', 'Peru')"><img src="/dist/flags/4x3/pe.svg?v2" alt="Peru" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Peru</span></a><a class="country-item" href="/philippines" onclick="trackCountrySelection('PH', 'Philippines')"><img src="/dist/flags/4x3/ph.svg?v2" alt="Philippines" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Philippines</span></a><a class="country-item" href="/poland" onclick="trackCountrySelection('PL', 'Poland')"><img src="/dist/flags/4x3/pl.svg?v2" alt="Poland" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Poland</span></a><a class="country-item" href="/portugal" onclick="trackCountrySelection('PT', 'Portugal')"><img src="/dist/flags/4x3/pt.svg?v2" alt="Portugal" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Portugal</span></a><a class="country-item" href="/puerto-rico" onclick="trackCountrySelection('PR', 'Puerto Rico')"><img src="/dist/flags/4x3/pr.svg?v2" alt="Puerto Rico" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Puerto Rico</span></a><a class="country-item" href="/qatar" onclick="trackCountrySelection('QA', 'Qatar')"><img src="/dist/flags/4x3/qa.svg?v2" alt="Qatar" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Qatar</span></a><a class="country-item" href="/republic-of-the-congo" onclick="trackCountrySelection('CG', 'Republic of the Congo')"><img src="/dist/flags/4x3/cg.svg?v2" alt="Republic of the Congo" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Republic of the Congo</span></a><a class="country-item" href="/romania" onclick="trackCountrySelection('RO', 'Romania')"><img src="/dist/flags/4x3/ro.svg?v2" alt="Romania" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Romania</span></a><a class="country-item" href="/russia" onclick="trackCountrySelection('RU', 'Russia')"><img src="/dist/flags/4x3/ru.svg?v2" alt="Russia" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Russia</span></a><a class="country-item" href="/rwanda" onclick="trackCountrySelection('RW', 'Rwanda')"><img src="/dist/flags/4x3/rw.svg?v2" alt="Rwanda" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Rwanda</span></a><a class="country-item" href="/saint-lucia" onclick="trackCountrySelection('LC', 'Saint Lucia')"><img src="/dist/flags/4x3/lc.svg?v2" alt="Saint Lucia" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Saint Lucia</span></a><a class="country-item" href="/san-marino" onclick="trackCountrySelection('SM', 'San Marino')"><img src="/dist/flags/4x3/sm.svg?v2" alt="San Marino" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>San Marino</span></a><a class="country-item" href="/saudi-arabia" onclick="trackCountrySelection('SA', 'Saudi Arabia')"><img src="/dist/flags/4x3/sa.svg?v2" alt="Saudi Arabia" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Saudi Arabia</span></a><a class="country-item" href="/senegal" onclick="trackCountrySelection('SN', 'Senegal')"><img src="/dist/flags/4x3/sn.svg?v2" alt="Senegal" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Senegal</span></a><a class="country-item" href="/serbia" onclick="trackCountrySelection('RS', 'Serbia')"><img src="/dist/flags/4x3/rs.svg?v2" alt="Serbia" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Serbia</span></a><a class="country-item" href="/singapore" onclick="trackCountrySelection('SG', 'Singapore')"><img src="/dist/flags/4x3/sg.svg?v2" alt="Singapore" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Singapore</span></a><a class="country-item" href="/sint-maarten" onclick="trackCountrySelection('SX', 'Sint Maarten')"><img src="/dist/flags/4x3/sx.svg?v2" alt="Sint Maarten" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Sint Maarten</span></a><a class="country-item" href="/slovakia" onclick="trackCountrySelection('SK', 'Slovakia')"><img src="/dist/flags/4x3/sk.svg?v2" alt="Slovakia" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Slovakia</span></a><a class="country-item" href="/slovenia" onclick="trackCountrySelection('SI', 'Slovenia')"><img src="/dist/flags/4x3/si.svg?v2" alt="Slovenia" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Slovenia</span></a><a class="country-item" href="/somalia" onclick="trackCountrySelection('SO', 'Somalia')"><img src="/dist/flags/4x3/so.svg?v2" alt="Somalia" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Somalia</span></a><a class="country-item" href="/south-africa" onclick="trackCountrySelection('ZA', 'South Africa')"><img src="/dist/flags/4x3/za.svg?v2" alt="South Africa" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>South Africa</span></a><a class="country-item" href="/south-korea" onclick="trackCountrySelection('KR', 'South Korea')"><img src="/dist/flags/4x3/kr.svg?v2" alt="South Korea" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>South Korea</span></a><a class="country-item" href="/spain" onclick="trackCountrySelection('ES', 'Spain')"><img src="/dist/flags/4x3/es.svg?v2" alt="Spain" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Spain</span></a><a class="country-item" href="/sri-lanka" onclick="trackCountrySelection('LK', 'Sri Lanka')"><img src="/dist/flags/4x3/lk.svg?v2" alt="Sri Lanka" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Sri Lanka</span></a><a class="country-item" href="/sudan" onclick="trackCountrySelection('SD', 'Sudan')"><img src="/dist/flags/4x3/sd.svg?v2" alt="Sudan" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Sudan</span></a><a class="country-item" href="/suriname" onclick="trackCountrySelection('SR', 'Suriname')"><img src="/dist/flags/4x3/sr.svg?v2" alt="Suriname" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Suriname</span></a><a class="country-item" href="/sweden" onclick="trackCountrySelection('SE', 'Sweden')"><img src="/dist/flags/4x3/se.svg?v2" alt="Sweden" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Sweden</span></a><a class="country-item" href="/switzerland" onclick="trackCountrySelection('CH', 'Switzerland')"><img src="/dist/flags/4x3/ch.svg?v2" alt="Switzerland" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Switzerland</span></a><a class="country-item" href="/syria" onclick="trackCountrySelection('SY', 'Syria')"><img src="/dist/flags/4x3/sy.svg?v2" alt="Syria" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Syria</span></a><a class="country-item" href="/taiwan" onclick="trackCountrySelection('TW', 'Taiwan')"><img src="/dist/flags/4x3/tw.svg?v2" alt="Taiwan" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Taiwan</span></a><a class="country-item" href="/tajikistan" onclick="trackCountrySelection('TJ', 'Tajikistan')"><img src="/dist/flags/4x3/tj.svg?v2" alt="Tajikistan" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Tajikistan</span></a><a class="country-item" href="/tanzania" onclick="trackCountrySelection('TZ', 'Tanzania')"><img src="/dist/flags/4x3/tz.svg?v2" alt="Tanzania" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Tanzania</span></a><a class="country-item" href="/thailand" onclick="trackCountrySelection('TH', 'Thailand')"><img src="/dist/flags/4x3/th.svg?v2" alt="Thailand" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Thailand</span></a><a class="country-item" href="/togo" onclick="trackCountrySelection('TG', 'Togo')"><img src="/dist/flags/4x3/tg.svg?v2" alt="Togo" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Togo</span></a><a class="country-item" href="/trinidad-and-tobago" onclick="trackCountrySelection('TT', 'Trinidad and Tobago')"><img src="/dist/flags/4x3/tt.svg?v2" alt="Trinidad and Tobago" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Trinidad and Tobago</span></a><a class="country-item" href="/tunisia" onclick="trackCountrySelection('TN', 'Tunisia')"><img src="/dist/flags/4x3/tn.svg?v2" alt="Tunisia" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Tunisia</span></a><a class="country-item" href="/turkey" onclick="trackCountrySelection('TR', 'Turkey')"><img src="/dist/flags/4x3/tr.svg?v2" alt="Turkey" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Turkey</span></a><a class="country-item" href="/turkmenistan" onclick="trackCountrySelection('TM', 'Turkmenistan')"><img src="/dist/flags/4x3/tm.svg?v2" alt="Turkmenistan" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Turkmenistan</span></a><a class="country-item" href="/uganda" onclick="trackCountrySelection('UG', 'Uganda')"><img src="/dist/flags/4x3/ug.svg?v2" alt="Uganda" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Uganda</span></a><a class="country-item" href="/ukraine" onclick="trackCountrySelection('UA', 'Ukraine')"><img src="/dist/flags/4x3/ua.svg?v2" alt="Ukraine" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Ukraine</span></a><a class="country-item" href="/united-arab-emirates" onclick="trackCountrySelection('AE', 'United Arab Emirates')"><img src="/dist/flags/4x3/ae.svg?v2" alt="United Arab Emirates" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>United Arab Emirates</span></a><a class="country-item" href="/united-kingdom" onclick="trackCountrySelection('UK', 'United Kingdom')"><img src="/dist/flags/4x3/uk.svg?v2" alt="United Kingdom" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>United Kingdom</span></a><a class="country-item" href="/united-states" onclick="trackCountrySelection('US', 'United States')"><img src="/dist/flags/4x3/us.svg?v2" alt="United States" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>United States</span></a><a class="country-item" href="/uruguay" onclick="trackCountrySelection('UY', 'Uruguay')"><img src="/dist/flags/4x3/uy.svg?v2" alt="Uruguay" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Uruguay</span></a><a class="country-item" href="/uzbekistan" onclick="trackCountrySelection('UZ', 'Uzbekistan')"><img src="/dist/flags/4x3/uz.svg?v2" alt="Uzbekistan" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Uzbekistan</span></a><a class="country-item" href="/venezuela" onclick="trackCountrySelection('VE', 'Venezuela')"><img src="/dist/flags/4x3/ve.svg?v2" alt="Venezuela" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Venezuela</span></a><a class="country-item" href="/vietnam" onclick="trackCountrySelection('VN', 'Vietnam')"><img src="/dist/flags/4x3/vn.svg?v2" alt="Vietnam" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Vietnam</span></a><a class="country-item" href="/western-sahara" onclick="trackCountrySelection('EH', 'Western Sahara')"><img src="/dist/flags/4x3/eh.svg?v2" alt="Western Sahara" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Western Sahara</span></a><a class="country-item" href="/yemen" onclick="trackCountrySelection('YE', 'Yemen')"><img src="/dist/flags/4x3/ye.svg?v2" alt="Yemen" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Yemen</span></a><a class="country-item" href="/zimbabwe" onclick="trackCountrySelection('ZW', 'Zimbabwe')"><img src="/dist/flags/4x3/zw.svg?v2" alt="Zimbabwe" class="country-flag w-4 h-3 object-contain" onerror="this.style.display='none'" loading="lazy"><span>Zimbabwe</span></a></div><div id="channels-list" class="hidden space-y-1"></div> </div>
</div>
<div class="actions-group absolute top-0 left-0 mt-2 transform transition-transform duration-300 ease-in-out z-10 country-menu flex flex-col">
<button id="back-button"
class="bg-white text-gray-800 p-2 rounded-s-md block">
<svg xmlns="http://www.w3.org/2000/svg"
height="24"
viewBox="0 0 24 24"
width="24">
<path d="M0 0h24v24H0V0z"
fill="none"></path>
<path d="M19 11H7.83l4.88-4.88c.39-.39.39-1.03 0-1.42-.39-.39-1.02-.39-1.41 0l-6.59 6.59c-.39.39-.39 1.02 0 1.41l6.59 6.59c.39.39 1.02.39 1.41 0 .39-.39.39-1.02 0-1.41L7.83 13H19c.55 0 1-.45 1-1s-.45-1-1-1z"></path>
</svg>
</button>
<button id="schedule-button"
class="bg-blue-500 text-white p-2 rounded-s-md mt-2 block">
<svg xmlns="http://www.w3.org/2000/svg"
height="24"
viewBox="0 0 24 24"
width="24">
<path d="M0 0h24v24H0V0z"
fill="none" />
<path d="M19 4h-1V2h-2v2H8V2H6v2H5c-1.11 0-1.99.9-1.99 2L3 20c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm0 16H5V10h14v10zm0-12H5V6h14v2zm-7 5h5v5h-5z"
fill="white" />
</svg>
</button>
<button id="seo-toggle-btn"
class="bg-green-500 text-white p-2 rounded-s-md mt-2 block">
<svg xmlns="http://www.w3.org/2000/svg"
height="24"
viewBox="0 0 24 24"
width="24">
<path d="M0 0h24v24H0V0z"
fill="none" />
<path d="M21 3H3c-1.11 0-2 .89-2 2v12c0 1.1.89 2 2 2h5v2h8v-2h5c1.1 0 1.99-.9 1.99-2L23 5c0-1.11-.9-2-2-2zm0 14H3V5h18v12zm-5-6l-7 4V7l7 4z"
fill="white" />
</svg>
</button>
<button id="gallery-toggle-btn-new"
class="bg-slate-800 text-white p-2 rounded-s-md mt-2 block hidden">
<svg xmlns="http://www.w3.org/2000/svg"
height="24"
viewBox="0 0 24 24"
width="24">
<path d="M0 0h24v24H0V0z"
fill="none" />
<path d="M22 16V4c0-1.1-.9-2-2-2H8c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2zM11.5 12.5l2.5 3.01L16.5 11l3.5 4.5H8l3.5-4.5zM2 6v14c0 1.1.9 2 2 2h14v-2H4V6H2z"
fill="white" />
</svg>
</button>
</div>
</div>
</div>
</div>
<!-- SEO Overlay for Users -->
<div id="seo-overlay"
class="seo-overlay hidden">
<div class="seo-content">
<button id="seo-close-btn"
class="seo-close-btn"
title="Close">×</button>
<button id="seo-close-btn-alt"
class="seo-close-btn-alt"
title="Close">
<svg xmlns="http://www.w3.org/2000/svg"
class="h-5 w-5"
fill="none"
viewBox="0 0 24 24"
stroke="currentColor">
<path stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M6 18L18 6M6 6l12 12" />
</svg>
Close
</button>
<h1>Live TV Streaming</h1>
<div class="intro">Live TV Streaming</div>
</div>
</div>
</body><!-- Critical video player script loaded synchronously -->
<script src="/dist/js/video.min.js?v8.23.3"></script>
<!-- Non-critical globe visualization scripts loaded asynchronously -->
<script src="/dist/js/three.min.js?r128"></script>
<script src="/dist/js/OrbitControls.min.js?0.128.0"></script>
<script src="/dist/js/globe.gl.js?2.41.6" async></script>
<script>
// Globe loading check - wait for all globe dependencies
function waitForGlobeDependencies(callback) {
const checkDependencies = () => {
if (typeof THREE !== 'undefined' &&
typeof Globe !== 'undefined' &&
window.THREE && window.THREE.OrbitControls) {
callback();
} else {
setTimeout(checkDependencies, 100);
}
};
checkDependencies();
}
const STREAM = '';
const COUNTRY_NAME = '';
const COUNTRY = 'all';
const CHANNEL = '';
const ISO_A2 = '';
const CHANNEL_COUNTS = {"US":1206,"ES":252,"IT":229,"IN":216,"TR":204,"MX":175,"DO":173,"DE":162,"UK":137,"RU":125,"CA":123,"NL":122,"FR":115,"BR":94,"IR":88,"GR":77,"GT":77,"PE":74,"AR":73,"CL":71,"ID":71,"HN":70,"CO":68,"EC":66,"RO":65,"AE":65,"CR":60,"NG":58,"TH":56,"IQ":54,"SA":54,"PY":54,"HU":54,"VE":50,"KR":48,"PL":44,"ZA":42,"KE":38,"VN":36,"PT":35,"EG":34,"PR":33,"UA":32,"GH":31,"CH":31,"AU":30,"RS":27,"LB":27,"PK":26,"UG":26,"SV":26,"BE":25,"SN":25,"AT":24,"BO":24,"CN":24,"PA":24,"FI":23,"AF":22,"UZ":22,"MK":20,"JO":20,"KZ":20,"QA":19,"SK":19,"CZ":18,"CY":18,"MN":17,"BG":17,"EE":17,"CI":16,"IL":16,"GE":15,"HR":15,"PS":15,"KH":14,"CD":13,"MA":13,"AZ":13,"HT":12,"NI":12,"MY":12,"MD":12,"JP":11,"PH":11,"AL":11,"LA":11,"TW":11,"MV":11,"NZ":10,"SE":10,"TG":10,"BD":10,"MM":10,"BA":10,"LU":10,"BY":9,"TJ":9,"AW":9,"TN":9,"SG":9,"CM":9,"IE":9,"LT":8,"AM":8,"SI":8,"LV":7,"JM":7,"BJ":7,"LK":7,"MO":7,"SO":6,"NO":6,"KW":6,"DZ":6,"RW":6,"YE":5,"KG":5,"TM":5,"GP":5,"IS":5,"DK":5,"BH":5,"OM":5,"LY":5,"BQ":4,"ET":4,"GN":4,"HK":4,"CG":4,"CW":4,"CV":3,"SY":3,"NE":3,"MQ":3,"GY":3,"MU":3,"NP":3,"BS":3,"AO":3,"UY":2,"TT":2,"VG":2,"SM":2,"MC":2,"ME":2,"FO":2,"SR":2,"GM":1,"SD":1,"GQ":1,"BM":1,"TD":1,"GU":1,"NA":1,"LR":1,"MZ":1,"PG":1,"CU":1,"TZ":1,"ZW":1,"LC":1,"MT":1,"EH":1,"SX":1,"AD":1,"BB":1,"PF":1,"ad":1,"GB":137};
const COUNTRY_MAP = {
"AF": "Afghanistan",
"AL": "Albania",
"DZ": "Algeria",
"AD": "Andorra",
"AO": "Angola",
"AR": "Argentina",
"AM": "Armenia",
"AW": "Aruba",
"AU": "Australia",
"AT": "Austria",
"AZ": "Azerbaijan",
"BS": "Bahamas",
"BH": "Bahrain",
"BD": "Bangladesh",
"BB": "Barbados",
"BY": "Belarus",
"BE": "Belgium",
"BJ": "Benin",
"BM": "Bermuda",
"BO": "Bolivia",
"BQ": "Bonaire",
"BA": "Bosnia and Herzegovina",
"BR": "Brazil",
"VG": "British Virgin Islands",
"BG": "Bulgaria",
"KH": "Cambodia",
"CM": "Cameroon",
"CA": "Canada",
"CV": "Cape Verde",
"TD": "Chad",
"CL": "Chile",
"CN": "China",
"CO": "Colombia",
"CR": "Costa Rica",
"HR": "Croatia",
"CU": "Cuba",
"CW": "Curacao",
"CY": "Cyprus",
"CZ": "Czech Republic",
"CD": "Democratic Republic of the Congo",
"DK": "Denmark",
"DO": "Dominican Republic",
"EC": "Ecuador",
"EG": "Egypt",
"SV": "El Salvador",
"GQ": "Equatorial Guinea",
"EE": "Estonia",
"ET": "Ethiopia",
"FO": "Faroe Islands",
"FI": "Finland",
"FR": "France",
"PF": "French Polynesia",
"GM": "Gambia",
"GE": "Georgia",
"DE": "Germany",
"GH": "Ghana",
"GR": "Greece",
"GP": "Guadeloupe",
"GU": "Guam",
"GT": "Guatemala",
"GN": "Guinea",
"GY": "Guyana",
"HT": "Haiti",
"HN": "Honduras",
"HK": "Hong Kong",
"HU": "Hungary",
"IS": "Iceland",
"IN": "India",
"ID": "Indonesia",
"IR": "Iran",
"IQ": "Iraq",
"IE": "Ireland",
"IL": "Israel",
"IT": "Italy",
"CI": "Ivory Coast",
"JM": "Jamaica",
"JP": "Japan",
"JO": "Jordan",
"KZ": "Kazakhstan",
"KE": "Kenya",
"KW": "Kuwait",
"KG": "Kyrgyzstan",
"LA": "Laos",
"LV": "Latvia",
"LB": "Lebanon",
"LR": "Liberia",
"LY": "Libya",
"LT": "Lithuania",
"LU": "Luxembourg",
"MO": "Macao",
"MY": "Malaysia",
"MV": "Maldives",
"MT": "Malta",
"MQ": "Martinique",
"MU": "Mauritius",
"MX": "Mexico",
"MD": "Moldova",
"MC": "Monaco",
"MN": "Mongolia",
"ME": "Montenegro",
"MA": "Morocco",
"MZ": "Mozambique",
"MM": "Myanmar",
"NA": "Namibia",
"NP": "Nepal",
"NL": "Netherlands",
"NZ": "New Zealand",
"NI": "Nicaragua",
"NE": "Niger",
"NG": "Nigeria",
"MK": "North Macedonia",
"NO": "Norway",
"OM": "Oman",
"PK": "Pakistan",
"PS": "Palestine",
"PA": "Panama",
"PG": "Papua New Guinea",
"PY": "Paraguay",
"PE": "Peru",
"PH": "Philippines",
"PL": "Poland",
"PT": "Portugal",
"PR": "Puerto Rico",
"QA": "Qatar",
"CG": "Republic of the Congo",
"RO": "Romania",
"RU": "Russia",
"RW": "Rwanda",
"LC": "Saint Lucia",
"SM": "San Marino",
"SA": "Saudi Arabia",
"SN": "Senegal",
"RS": "Serbia",
"SG": "Singapore",
"SX": "Sint Maarten",
"SK": "Slovakia",
"SI": "Slovenia",
"SO": "Somalia",
"ZA": "South Africa",
"KR": "South Korea",
"ES": "Spain",
"LK": "Sri Lanka",
"SD": "Sudan",
"SR": "Suriname",
"SE": "Sweden",
"CH": "Switzerland",
"SY": "Syria",
"TW": "Taiwan",
"TJ": "Tajikistan",
"TZ": "Tanzania",
"TH": "Thailand",
"TG": "Togo",
"TT": "Trinidad and Tobago",
"TN": "Tunisia",
"TR": "Turkey",
"TM": "Turkmenistan",
"UG": "Uganda",
"UA": "Ukraine",
"AE": "United Arab Emirates",
"UK": "United Kingdom",
"US": "United States",
"UY": "Uruguay",
"UZ": "Uzbekistan",
"VE": "Venezuela",
"VN": "Vietnam",
"EH": "Western Sahara",
"YE": "Yemen",
"ZW": "Zimbabwe"
};
const CURRENT_TIMEZONE = Intl.DateTimeFormat().resolvedOptions().timeZone;
const TIMEZONE = '' || CURRENT_TIMEZONE;
// Use DOMContentLoaded instead of window.onload for faster initialization
document.addEventListener('DOMContentLoaded', () => {
updateTime();
setInterval(updateTime, 1000);
initializeApp();
});
// Left Sidebar Toggle Functionality
document.addEventListener('DOMContentLoaded', function () {
const menuToggle = document.getElementById('menu-toggle');
const leftSidebar = document.getElementById('left-sidebar');
if (menuToggle && leftSidebar) {
// Toggle sidebar function
function toggleSidebar() {
const isOpen = leftSidebar.classList.contains('translate-x-0');
if (isOpen) {
// Close sidebar
leftSidebar.classList.remove('translate-x-0');
leftSidebar.classList.add('-translate-x-full');
} else {
// Open sidebar
leftSidebar.classList.remove('-translate-x-full');
leftSidebar.classList.add('translate-x-0');
// Right sidebar
const rightSidebar = document.querySelector('.right-sidebar');
if (rightSidebar && !rightSidebar.classList.contains('inactive')) {
rightSidebar.classList.add('inactive');
}
}
}
// Menu toggle button click
menuToggle.addEventListener('click', toggleSidebar);
// Close sidebar on escape key
document.addEventListener('keydown', function (e) {
if (e.key === 'Escape' && leftSidebar.classList.contains('translate-x-0')) {
toggleSidebar();
}
});
// Close sidebar when clicking outside on desktop
document.addEventListener('click', function (e) {
if (window.innerWidth >= 768 &&
leftSidebar.classList.contains('translate-x-0') &&
!leftSidebar.contains(e.target) &&
!menuToggle.contains(e.target)) {
toggleSidebar();
}
});
}
const rightSidebar = document.querySelector('.right-sidebar');
if (rightSidebar) {
// Window size lower than 1024px
setTimeout(() => {
if (window.innerWidth < 1024) {
rightSidebar.classList.add('inactive');
}
setTimeout(() => {
rightSidebar.classList.add('show');
}, 1000);
}, 500);
}
});
window.addEventListener('resize', () => {
const rightSidebar = document.querySelector('.right-sidebar');
if (rightSidebar) {
if (window.innerWidth < 1024) {
rightSidebar.classList.add('inactive');
} else {
rightSidebar.classList.remove('inactive');
}
}
});
let selectedChannel = null;
let world = null;
// Globe orientation storage functions
function saveGlobeOrientation() {
if (!world) return;
try {
const camera = world.camera();
const controls = world.controls();
if (!camera || !controls) {
console.warn('Camera or controls not available for saving orientation');
return;
}
const orientation = {
cameraPosition: {
x: camera.position.x,
y: camera.position.y,
z: camera.position.z
},
target: {
x: controls.target.x,
y: controls.target.y,
z: controls.target.z
},
timestamp: Date.now()
};
localStorage.setItem('globe_orientation', JSON.stringify(orientation));
console.log('Globe orientation saved:', orientation);
} catch (error) {
console.warn('Failed to save globe orientation:', error);
}
}
function loadGlobeOrientation() {
try {
const stored = localStorage.getItem('globe_orientation');
if (stored) {
const orientation = JSON.parse(stored);
// Check if the stored orientation is not too old (7 days)
const maxAge = 7 * 24 * 60 * 60 * 1000; // 7 days in milliseconds
if (Date.now() - orientation.timestamp < maxAge) {
return orientation;
}
}
} catch (error) {
console.warn('Failed to load globe orientation:', error);
}
return null;
}
function restoreGlobeOrientation() {
console.log('start restoreGlobeOrientation');
if (!world) return;
console.log('restoreGlobeOrientation 2');
const orientation = loadGlobeOrientation();
if (orientation) {
try {
console.log('restoreGlobeOrientation 3', world);
// Get the Three.js camera and controls directly
const camera = world.camera();
const controls = world.controls();
if (camera && controls) {
// Animate camera to restored position smoothly
animateCameraToPosition(camera, controls, orientation);
console.log('Globe orientation restoration initiated');
} else {
console.warn('Camera or controls not available for orientation restoration');
}
} catch (error) {
console.warn('Failed to restore globe orientation:', error);
}
}
}
function animateCameraToPosition(camera, controls, orientation) {
const duration = 1000; // 1 second
const startTime = Date.now();
// Store initial positions
const startCameraPos = {
x: camera.position.x,
y: camera.position.y,
z: camera.position.z
};
const startTarget = {
x: controls.target.x,
y: controls.target.y,
z: controls.target.z
};
// Target positions
const endCameraPos = orientation.cameraPosition;
const endTarget = orientation.target;
function animate() {
const elapsed = Date.now() - startTime;
const progress = Math.min(elapsed / duration, 1);
// Easing function (ease out)
const easeOut = 1 - Math.pow(1 - progress, 3);
// Interpolate camera position
camera.position.x = startCameraPos.x + (endCameraPos.x - startCameraPos.x) * easeOut;
camera.position.y = startCameraPos.y + (endCameraPos.y - startCameraPos.y) * easeOut;
camera.position.z = startCameraPos.z + (endCameraPos.z - startCameraPos.z) * easeOut;
// Interpolate target position
controls.target.x = startTarget.x + (endTarget.x - startTarget.x) * easeOut;
controls.target.y = startTarget.y + (endTarget.y - startTarget.y) * easeOut;
controls.target.z = startTarget.z + (endTarget.z - startTarget.z) * easeOut;
// Update controls
controls.update();
if (progress < 1) {
requestAnimationFrame(animate);
} else {
console.log('Globe orientation restored successfully');
}
}
animate();
}
function setupGlobeOrientationTracking() {
if (!world) return;
const controls = world.controls();
if (controls) {
// Save orientation when user interacts with the globe
let saveTimeout;
const scheduleSave = () => {
clearTimeout(saveTimeout);
saveTimeout = setTimeout(saveGlobeOrientation, 1000); // Save after 1 second of inactivity
};
// Listen to control events
controls.addEventListener('change', scheduleSave);
controls.addEventListener('end', saveGlobeOrientation); // Save immediately when interaction ends
// Periodic save every 2 minutes during active use
setInterval(() => {
saveGlobeOrientation();
}, 2 * 60 * 1000); // 2 minutes
restoreGlobeOrientation();
}
}
// Utility Functions
function getFlagEmoji(countryCode) {
if (countryCode === 'UK') {
countryCode = 'GB';
}
const codePoints = countryCode
.toUpperCase()
.split('')
.map(char => 127397 + char.charCodeAt(0));
return String.fromCodePoint(...codePoints);
}
function updateTime() {
const now = new Date();
const timeString = now.toLocaleTimeString('en-US', {
hour: 'numeric',
minute: '2-digit',
hour12: true,
timeZone: TIMEZONE
});
document.getElementById('current-time').textContent = timeString;
}
function getColorFromString(str) {
let hash = 0;
for (let i = 0; i < str.length; i++) {
hash = str.charCodeAt(i) + ((hash << 5) - hash);
}
const h = hash % 360;
return `hsl(${h}, 70%, 60%)`;
}
function createUrlSlug(name) {
return name.toLowerCase().replace(/ /g, '-');
}
function hideLoadingIndicator() {
const loadingIndicator = document.getElementById('stream-loading');
loadingIndicator.classList.add('hidden');
}
function showLoadingIndicator() {
const loadingIndicator = document.getElementById('stream-loading');
loadingIndicator.classList.remove('hidden');
}
function clearStreamTimeout() {
if (window.streamTimeout) {
clearTimeout(window.streamTimeout);
}
}
// Navigation Functions
function navigateToCountry(countrySlug) {
window.location.href = '/' + countrySlug;
}
function navigateToChannel(countrySlug, channelTitle) {
window.location.href = '/' + countrySlug + '/' + channelTitle;
}
function navigateToHome() {
window.location.href = '/';
}
// UI State Management Functions
function showCountryHeader(countryName, countryCode) {
const countryHeader = document.getElementById('country-header');
countryHeader.querySelector('h2').textContent = countryName;
const localTime = new Date().toLocaleTimeString('en-US', {
hour: 'numeric',
minute: '2-digit',
hour12: true,
timeZone: TIMEZONE
});
countryHeader.querySelector('div').textContent = `${localTime}`;
countryHeader.classList.remove('hidden');
}
function hideCountryHeader() {
const countryHeader = document.getElementById('country-header');
countryHeader.classList.add('hidden');
}
function showBackButton() {
const backButton = document.getElementById('back-button');
backButton.style.transform = 'translateX(-100%)';
}
function hideBackButton() {
const backButton = document.getElementById('back-button');
backButton.style.transform = 'translateX(0)';
}
function showCountrySelector() {
const countrySelector = document.getElementById('country-selector');
countrySelector.classList.remove('hidden');
}
function hideCountrySelector() {
const countrySelector = document.getElementById('country-selector');
countrySelector.classList.add('hidden');
}
function showCountriesList() {
const countriesList = document.getElementById('countries-list');
countriesList.classList.remove('hidden');
}
function hideCountriesList() {
const countriesList = document.getElementById('countries-list');
countriesList.classList.add('hidden');
}
function showChannelsList() {
const channelsList = document.getElementById('channels-list');
channelsList.classList.remove('hidden');
}
function hideChannelsList() {
const channelsList = document.getElementById('channels-list');
channelsList.classList.add('hidden');
}
function showVideoContainer() {
const videoContainer = document.getElementById('videoContainer');
if (videoContainer) {
videoContainer.classList.remove('hidden');
}
}
function hideVideoContainer() {
const videoContainer = document.getElementById('videoContainer');
if (videoContainer) {
videoContainer.classList.add('hidden');
}
}
function clearSelectedChannel() {
if (selectedChannel) {
selectedChannel.classList.remove('selected');
selectedChannel = null;
} else {
// Search for the selected channel in the channels list
const channelItems = document.querySelectorAll('.country-item');
channelItems.forEach(item => {
item.classList.remove('selected');
});
}
}
// Analytics Tracking Functions
function trackChannelSelection(channel, countryName) {
gtag('event', 'select_content', {
content_type: 'channel',
content_id: channel.title,
event_category: 'channel_selection',
event_label: `${countryName} - ${channel.title}`,
custom_parameters: {
country: countryName,
channel_name: channel.title
}
});
}
function trackVideoError(channel, error) {
gtag('event', 'exception', {
description: error.message || 'Unknown video error',
fatal: false,
event_category: 'video_error',
event_label: `${channel.title} - ${error.code || 'UNKNOWN_ERROR'}`,
custom_parameters: {
channel_name: channel.title,
error_code: error.code || 'UNKNOWN',
error_message: error.message || 'Unknown error'
}
});
}
function trackCountrySelection(countryCode, countryName) {
gtag('event', 'select_content', {
content_type: 'country',
content_id: countryCode,
event_category: 'country_selection',
event_label: `${countryName} (${countryCode})`,
custom_parameters: {
country_code: countryCode,
country_name: countryName
}
});
}
function trackSearch(searchTerm, resultsCount) {
gtag('event', 'search', {
search_term: searchTerm,
event_category: 'channel_search',
event_label: `"${searchTerm}" - ${resultsCount} results`,
custom_parameters: {
search_query: searchTerm,
results_count: resultsCount
}
});
}
function trackUIInteraction(action, element, details = {}) {
gtag('event', action, {
event_category: 'ui_interaction',
event_label: element,
custom_parameters: {
element_type: element,
...details
}
});
}
function trackVideoStop(reason, channelTitle = '') {
gtag('event', 'video_stop', {
event_category: 'video',
event_label: `${reason} - ${channelTitle}`,
custom_parameters: {
stop_reason: reason,
channel_name: channelTitle
}
});
}
// Video Player Functions
function initializeVideoPlayer(channel) {
let player;
if (window.VIDEOJS) {
player = window.VIDEOJS;
player.error(null);
player.src({ type: 'application/x-mpegURL', src: channel.url });
} else {
player = videojs('videoPlayer', {
autoplay: true,
controls: true,
sources: [{
src: channel.url,
type: 'application/x-mpegURL'
}],
width: document.querySelector('#videoContainer').clientWidth,
height: document.querySelector('#videoContainer').clientHeight
});
window.VIDEOJS = player;
window.addEventListener('resize', () => {
player.width(document.querySelector('#videoContainer').clientWidth);
player.height(document.querySelector('#videoContainer').clientHeight);
});
// // Player on play
// player.on('play', () => {
// setTimeout(() => {
// const actionsGroup = document.querySelector('.actions-group');
// actionsGroup.classList.remove('show');
// }, 1000);
// });
}
return player;
}
function setupVideoPlayerEvents(player, channel) {
player.on('error', function () {
const error = player.error();
console.error('Video.js error:', error);
trackVideoError(channel, error);
hideLoadingIndicator();
showVideoError(channel, error);
});
player.on('loadstart', function () {
clearStreamTimeout();
window.streamTimeout = setTimeout(() => {
if (player.readyState() === 0) {
const timeoutError = {
code: 'TIMEOUT',
message: 'Stream failed to load within 30 seconds'
};
trackVideoError(channel, timeoutError);
hideLoadingIndicator();
showVideoError(channel, timeoutError);
}
}, 30000);
});
player.on('loadeddata', function () {
hideLoadingIndicator();
clearStreamTimeout();
});
player.on('canplay', function () {
hideLoadingIndicator();
});
player.on('playing', function () {
console.log('Video started playing');
hideLoadingIndicator();
console.log(channel);
// Track video play event with gtag
gtag('event', 'play', {
event_category: 'video',
event_label: channel.title,
custom_parameters: {
country: channel.country,
channel_name: channel.title
}
});
});
}
function playChannel(channel, countryName) {
const videoContainer = document.getElementById('videoContainer');
if (!videoContainer) {
return;
}
document.getElementById('loading').classList.add('hidden');
showVideoContainer();
// Remove any existing error messages or no-stream messages
const existingError = videoContainer.querySelector('.error-message');
if (existingError) {
existingError.remove();
}
const existingMessage = videoContainer.querySelector('.no-stream-message');
if (existingMessage) {
existingMessage.remove();
}
// Check if this is a YouTube embed
if (channel.url && channel.url.includes('youtube') && channel.url.includes('embed')) {
console.log('YouTube embed detected');
// Hide the video player and show iframe for YouTube
const videoPlayer = document.getElementById('videoPlayer');
if (videoPlayer) {
videoPlayer.style.display = 'none';
}
// Remove any existing iframe
const existingIframe = videoContainer.querySelector('iframe');
if (existingIframe) {
existingIframe.remove();
}
// Create fullscreen iframe for YouTube
const iframe = document.createElement('iframe');
iframe.src = channel.url + (channel.url.includes('?') ? '&' : '?') + 'autoplay=1';
iframe.className = 'absolute inset-0 w-full h-full';
iframe.allow = 'accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share';
iframe.allowFullscreen = true;
iframe.frameBorder = '0';
iframe.title = channel.title || 'Video Player';
iframe.loading = 'lazy';
iframe.sandbox = 'allow-same-origin allow-scripts allow-forms allow-presentation';
videoContainer.appendChild(iframe);
// Track YouTube play event
gtag('event', 'play', {
event_category: 'video',
event_label: channel.title,
custom_parameters: {
country: channel.country,
channel_name: channel.title,
stream_type: 'youtube_embed'
}
});
} else {
// Remove any existing iframe
const existingIframe = videoContainer.querySelector('iframe');
if (existingIframe) {
existingIframe.remove();
}
// Show the video player for regular streams
const videoPlayer = document.getElementById('videoPlayer');
if (videoPlayer) {
videoPlayer.style.display = 'block';
}
const player = initializeVideoPlayer(channel);
setupVideoPlayerEvents(player, channel);
player.play().catch(e => {
console.error('Error playing video:', e);
if (e.message.indexOf("interact with the document first") !== -1) {
return;
}
const playbackError = {
code: 'PLAYBACK_ERROR',
message: e.message || 'Failed to start playback'
};
trackVideoError(channel, playbackError);
hideLoadingIndicator();
showVideoError(channel, playbackError);
});
}
}
function showVideoError(channel, error) {
const videoContainer = document.getElementById('videoContainer');
const existingError = videoContainer.querySelector('.error-message');
if (existingError) {
existingError.remove();
}
const errorDiv = document.createElement('div');
errorDiv.className = 'error-message absolute inset-0 bg-black bg-opacity-80 flex flex-col items-center justify-center text-white z-50';
errorDiv.innerHTML = `
<div class="text-center p-8 max-w-md">
<svg class="w-16 h-16 mx-auto mb-4 text-red-500" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L3.732 16.5c-.77.833.192 2.5 1.732 2.5z"></path>
</svg>
<h3 class="text-xl font-bold mb-2">Stream Error</h3>
<p class="text-gray-300 mb-2">Unable to load "${channel.title}"</p>
<p class="text-sm text-gray-400 mb-6">${error.message || 'The stream may be offline or unavailable'}</p>
<div class="space-y-2">
<button id="retry-stream" class="bg-blue-600 hover:bg-blue-700 text-white px-6 py-2 rounded-md transition-colors">
Retry Stream
</button>
<button id="close-error" class="bg-gray-600 hover:bg-gray-700 text-white px-6 py-2 rounded-md transition-colors ml-2">
Close
</button>
</div>
</div>
`;
videoContainer.appendChild(errorDiv);
errorDiv.querySelector('#retry-stream').addEventListener('click', () => {
errorDiv.remove();
setTimeout(() => playChannel(channel), 1000);
});
errorDiv.querySelector('#close-error').addEventListener('click', () => {
trackVideoStop('error_close', channel.title);
hideVideoContainer();
errorDiv.remove();
clearSelectedChannel();
// navigateToCountry(COUNTRY);
});
}
function showNoStreamMessage() {
showVideoContainer();
const videoContainer = document.getElementById('videoContainer');
// Hide the video player if it exists
const videoPlayer = document.getElementById('videoPlayer');
if (videoPlayer) {
videoPlayer.style.display = 'none';
}
// Stop and clear any existing video player
if (window.VIDEOJS) {
window.VIDEOJS.pause();
window.VIDEOJS.error(null);
}
// Remove any existing error messages
const existingError = videoContainer.querySelector('.error-message');
if (existingError) {
existingError.remove();
}
const existingMessage = videoContainer.querySelector('.no-stream-message');
if (existingMessage) {
existingMessage.remove();
}
const messageDiv = document.createElement('div');
messageDiv.className = 'no-stream-message absolute inset-0 flex items-center justify-center z-50';
messageDiv.innerHTML = `
<div class="w-full h-full flex items-center justify-center">
<img src="/images/temp-message.png?v2" alt="No live streams are running right now" class="max-w-full max-h-full object-contain" />
</div>
`;
videoContainer.appendChild(messageDiv);
// Hide loading indicator if it's showing
hideLoadingIndicator();
}
function closeVideo() {
// Track video close
const currentChannelTitle = selectedChannel ?
selectedChannel.textContent.replace(/^./, '').trim() : // Remove flag emoji
CHANNEL || 'Unknown';
trackVideoStop('user_close', currentChannelTitle);
hideVideoContainer();
hideLoadingIndicator();
clearStreamTimeout();
clearSelectedChannel();
if (window.VIDEOJS) {
window.VIDEOJS.pause();
window.VIDEOJS.error(null);
}
// navigateToCountry(COUNTRY);
}
// Channel Management Functions
function createChannelElement(channel, countryCode, countryName, selectedChannelId) {
const div = document.createElement('div');
div.className = 'country-item';
const flagSpan = document.createElement('span');
flagSpan.className = 'country-flag';
flagSpan.textContent = getFlagEmoji(countryCode);
const nameSpan = document.createElement('span');
nameSpan.textContent = channel.title;
div.appendChild(flagSpan);
div.appendChild(nameSpan);
if (selectedChannelId && selectedChannelId == channel.id) {
div.classList.add('selected');
selectedChannel = div;
playChannel(channel, countryName);
// Scroll to the selected channel item
setTimeout(() => {
div.scrollIntoView({
behavior: 'instant',
block: 'center'
});
}, 100);
}
div.onclick = () => {
clearSelectedChannel();
selectedChannel = div;
selectedChannel.classList.add('selected');
trackChannelSelection(channel, countryName);
playChannel(channel, countryName);
navigateToChannel(COUNTRY, channel.title);
};
return div;
}
function populateChannelsList(countryCode, countryName, channels) {
const channelsList = document.getElementById('channels-list');
channelsList.innerHTML = '';
const urlParams = new URLSearchParams(window.location.search);
const selectedChannelId = urlParams.get('channel');
const countryChannels = channels.filter(channel =>
channel.country.toUpperCase() === countryCode.toUpperCase()
);
countryChannels.forEach(channel => {
const channelElement = createChannelElement(channel, countryCode, countryName, selectedChannelId);
channelsList.appendChild(channelElement);
});
}
function showCountryChannels(countryCode, countryName) {
showBackButton();
showCountryHeader(countryName, countryCode);
hideCountriesList();
showChannelsList();
hideCountrySelector();
const { channels } = FEEDS;
populateChannelsList(countryCode, countryName, channels);
}
function showCountriesView() {
// Check #schedule is showing
const schedule = document.querySelector('#schedule');
if (schedule && !schedule.classList.contains('hidden')) {
toggleSchedule();
} else {
navigateToHome();
}
// hideBackButton();
// hideCountryHeader();
// showCountrySelector();
// showCountriesList();
// hideChannelsList();
// navigateToHome();
}
// Globe Functions
function stopAutoRotateTemporarily() {
// Implementation for stopping auto-rotate if needed
}
function setupGlobeEvents(world) {
world.onPolygonHover(hoverD => {
stopAutoRotateTemporarily();
world
.polygonAltitude(d => d === hoverD ? 0.06 : 0.03)
.polygonCapColor(d => d === hoverD ? 'steelblue' : getColorFromString(d.properties.ADMIN));
});
world.onPolygonClick(d => {
stopAutoRotateTemporarily();
// Save current orientation when user clicks on a country
saveGlobeOrientation();
const countryCode = d.properties.ISO_A2;
const countryName = COUNTRY_MAP[countryCode] || countryName;
trackCountrySelection(countryCode, countryName);
// showCountryChannels(countryCode, countryName);
// navigateToCountry(createUrlSlug(countryName));
// Show loading indicator over globe
const loadingIndicator = document.getElementById('loading');
if (loadingIndicator) {
loadingIndicator.classList.remove('hidden');
}
// Navigate to country page
navigateToCountry(createUrlSlug(countryName));
});
}
function createGlobe(countries) {
const filteredCountries = countries.features.filter(d =>
d.properties.ISO_A2 !== 'AQ'
);
world = new Globe(document.getElementById('globeViz'))
.lineHoverPrecision(0)
.polygonsData(filteredCountries)
.polygonAltitude(0.01)
.polygonCapColor(feat => getColorFromString(feat.properties.ADMIN))
.polygonSideColor(() => 'rgba(0, 100, 0, 0.15)')
.polygonStrokeColor(() => '#111')
.polygonLabel((data) => {
const d = data.properties;
let iso_a2 = d.ISO_A2;
if (isFinite(iso_a2)) {
iso_a2 = d.FIPS_10_;
}
const channelCount = CHANNEL_COUNTS[iso_a2] || 0;
return `
<b>${d.ADMIN} (${iso_a2}):</b> <br />
Channels: <i>${channelCount}</i>
`;
})
.polygonsTransitionDuration(300)
.width(document.querySelector('.main-content').clientWidth)
.height(document.querySelector('.main-content').clientHeight)
.onGlobeReady(() => {
// Set up orientation tracking and restore saved orientation
setupGlobeOrientationTracking();
});
setupGlobeEvents(world);
window.addEventListener('resize', () => {
world
.width(document.querySelector('.main-content').clientWidth)
.height(document.querySelector('.main-content').clientHeight);
});
document.getElementById('loading').classList.add('hidden');
}
// Event Listeners Setup
function setupEventListeners() {
document.getElementById('back-button').addEventListener('click', showCountriesView);
// Save globe orientation when user navigates away or closes tab
window.addEventListener('beforeunload', saveGlobeOrientation);
window.addEventListener('pagehide', saveGlobeOrientation);
// SEO Overlay functionality
const seoToggleBtn = document.getElementById('seo-toggle-btn');
const seoOverlay = document.getElementById('seo-overlay');
const seoCloseBtn = document.getElementById('seo-close-btn');
const seoCloseBtnAlt = document.getElementById('seo-close-btn-alt');
function closeSeoOverlay() {
seoOverlay.classList.add('hidden');
document.body.style.overflow = '';
}
if (seoToggleBtn && seoOverlay && seoCloseBtn) {
seoToggleBtn.addEventListener('click', function () {
seoOverlay.classList.remove('hidden');
document.body.style.overflow = 'hidden';
});
seoCloseBtn.addEventListener('click', closeSeoOverlay);
if (seoCloseBtnAlt) {
seoCloseBtnAlt.addEventListener('click', closeSeoOverlay);
}
// Close overlay when clicking outside content
seoOverlay.addEventListener('click', function (e) {
if (e.target === seoOverlay) {
closeSeoOverlay();
}
});
// Close overlay with Escape key
document.addEventListener('keydown', function (e) {
if (e.key === 'Escape' && !seoOverlay.classList.contains('hidden')) {
closeSeoOverlay();
}
});
}
}
// Auto-play Functions
function autoPlaySelectedChannel() {
if (COUNTRY && CHANNEL) {
if (STREAM && STREAM.trim() !== '') {
console.log('autoPlaySelectedChannel', STREAM, CHANNEL, COUNTRY_NAME);
playChannel({
url: STREAM,
title: CHANNEL,
country: COUNTRY_NAME
}, COUNTRY_NAME);
// Scroll to the selected channel after a short delay
setTimeout(() => {
const selectedChannelElement = document.querySelector('.country-item.selected');
if (selectedChannelElement) {
selectedChannelElement.scrollIntoView({
behavior: 'instant',
block: 'center'
});
}
}, 500);
} else if (COUNTRY !== 'all' && COUNTRY !== 'random' && COUNTRY !== 'category') {
// Show no stream message when STREAM is empty
showNoStreamMessage();
}
}
}
// Main Initialization
function initializeApp() {
if (COUNTRY === 'all' || COUNTRY === 'random' || COUNTRY === 'category') {
// Wait for globe dependencies before loading
waitForGlobeDependencies(() => {
fetch('/storage/mockup.geojson')
.then(response => response.json())
.then(data => {
createGlobe(data);
});
});
}
setupEventListeners();
autoPlaySelectedChannel();
setupSearchFunctionality();
handleScheduleClick();
// setTimeout(() => {
// const actionsGroup = document.querySelector('.actions-group');
// if (actionsGroup) {
// actionsGroup.classList.remove('show');
// }
// }, 10000);
// LCP monitoring from web.dev article
setupLCPMonitoring();
}
// LCP Monitoring Function
function setupLCPMonitoring() {
if ('PerformanceObserver' in window) {
new PerformanceObserver((list) => {
const latestEntry = list.getEntries().at(-1);
if (latestEntry?.element?.getAttribute('loading') == 'lazy') {
console.warn('🚨 Performance Warning: LCP element was lazy loaded', latestEntry);
console.log('LCP Element:', latestEntry.element);
console.log('Consider removing lazy loading from above-the-fold elements');
}
}).observe({ type: 'largest-contentful-paint', buffered: true });
}
}
// Search Functions
function setupSearchFunctionality() {
const searchInput = document.getElementById('search-input');
if (!searchInput) return;
searchInput.addEventListener('input', function (e) {
const searchTerm = e.target.value.toLowerCase().trim();
if (searchTerm === '') {
// Show all channels when search is empty
showAllChannels();
return;
}
const channelItems = document.querySelectorAll('.country-item');
let resultsCount = 0;
channelItems.forEach(item => {
const title = item.textContent.toLowerCase();
const matchesTitle = title.includes(searchTerm);
if (matchesTitle) {
item.classList.remove('hidden');
resultsCount++;
} else {
item.classList.add('hidden');
}
});
// Track search with results count
if (searchTerm.length >= 2) { // Only track searches with 2+ characters
trackSearch(searchTerm, resultsCount);
}
});
// Clear search on escape key
searchInput.addEventListener('keydown', function (e) {
if (e.key === 'Escape') {
e.target.value = '';
showAllChannels();
}
});
}
function showAllChannels() {
const channelsList = document.getElementById('channels-list');
const channelItems = channelsList.querySelectorAll('.country-item');
channelItems.forEach(item => {
item.classList.remove('hidden');
});
}
function toggleSchedule() {
const schedule = document.getElementById('schedule');
const isHidden = schedule.classList.contains('hidden');
schedule.classList.toggle('hidden');
// Track schedule toggle
trackUIInteraction('toggle', 'schedule', {
action: isHidden ? 'open' : 'close'
});
if (!schedule.classList.contains('hidden')) {
scrollToCurrentTime();
}
}
function handleScheduleClick() {
const scheduleButton = document.getElementById('schedule-button');
scheduleButton.addEventListener('click', toggleSchedule);
}
// Function to scroll to current time
function scrollToCurrentTime() {
// Get current time in the specified timezone
const now = new Date();
const timestamp = now.getTime() / 1000;
const tick = (timestamp - (timestamp % 1800)) - 1800;
const time_header = document.querySelector('.time-header[data-time="' + tick + '"]');
if (time_header) {
console.log('scrollToCurrentTime', time_header, tick);
time_header.scrollIntoView({
behavior: 'instant',
block: 'nearest',
inline: 'start'
});
}
}
function toggleRightSidebar() {
const rightSidebar = document.querySelector('.right-sidebar');
if (rightSidebar) {
// if (!rightSidebar.classList.contains('show')) {
// rightSidebar.classList.add('show');
// }
console.log('toggleRightSidebar', rightSidebar.classList);
rightSidebar.classList.toggle('inactive');
// Left sidebar
const leftSidebar = document.querySelector('#left-sidebar');
if (leftSidebar && leftSidebar.classList.contains('translate-x-0')) {
leftSidebar.classList.remove('translate-x-0');
leftSidebar.classList.add('-translate-x-full');
}
}
}
</script>
</html>