Showing source for: https://openblox.io/
Duration: 0.397123s
Server: TencentEdgeOne

<!DOCTYPE html>
<html lang="vi" style="margin-top: 0px !important">

<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <link rel="preconnect" href="https://fonts.googleapis.com" />
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
  <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;700&display=swap" rel="stylesheet" />
  <link rel="stylesheet" href="/wp-content/themes/cakhiatv/style.css" />
  <link rel="shortcut icon" href="/favicon.ico" type="image/x-icon" />
    <link rel="icon" href="/favicon.ico" type="image/x-icon" />
  	<style>img:is([sizes="auto" i], [sizes^="auto," i]) { contain-intrinsic-size: 3000px 1500px }</style>
	
<!-- Tối ưu hóa công cụ tìm kiếm bởi Rank Math PRO - https://rankmath.com/ -->
<title>Xoilac TV | Trực Tiếp Bóng Đá HD - Link Xôi Lạc TV #1 Hôm Nay</title>
<meta name="description" content="Xoilac TV trực tiếp bóng đá HD hàng đầu Việt Nam, đường truyền ổn định, đa dạng link trực tuyến, đa dạng giải đấu, BLV chuyên môn cao và hoàn toàn miễn phí."/>
<meta name="robots" content="follow, index, max-snippet:-1, max-video-preview:-1, max-image-preview:large"/>
<link rel="canonical" href="https://openblox.io" />
<meta property="og:locale" content="vi_VN" />
<meta property="og:type" content="website" />
<meta property="og:title" content="Xoilac TV | Trực Tiếp Bóng Đá HD - Link Xôi Lạc TV #1 Hôm Nay" />
<meta property="og:description" content="Xoilac TV trực tiếp bóng đá HD hàng đầu Việt Nam, đường truyền ổn định, đa dạng link trực tuyến, đa dạng giải đấu, BLV chuyên môn cao và hoàn toàn miễn phí." />
<meta property="og:url" content="https://openblox.io" />
<meta property="og:site_name" content="Xoilac TV | Trực Tiếp Bóng Đá HD - Link Xôi Lạc TV #1 Hôm Nay" />
<meta property="og:updated_time" content="2025-11-13T23:12:37+07:00" />
<meta property="og:image" content="https://cdn.adminmypham.site/wp-content/uploads/2025/07/logo-squared.jpg" />
<meta property="og:image:secure_url" content="https://cdn.adminmypham.site/wp-content/uploads/2025/07/logo-squared.jpg" />
<meta property="og:image:width" content="1080" />
<meta property="og:image:height" content="1080" />
<meta property="og:image:alt" content="xoilac tv" />
<meta property="og:image:type" content="image/jpeg" />
<meta property="article:published_time" content="2025-06-22T18:41:07+07:00" />
<meta property="article:modified_time" content="2025-11-13T23:12:37+07:00" />
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:title" content="Xoilac TV | Trực Tiếp Bóng Đá HD - Link Xôi Lạc TV #1 Hôm Nay" />
<meta name="twitter:description" content="Xoilac TV trực tiếp bóng đá HD hàng đầu Việt Nam, đường truyền ổn định, đa dạng link trực tuyến, đa dạng giải đấu, BLV chuyên môn cao và hoàn toàn miễn phí." />
<meta name="twitter:image" content="https://cdn.adminmypham.site/wp-content/uploads/2025/07/logo-squared.jpg" />
<meta name="twitter:label1" content="Được viết bởi" />
<meta name="twitter:data1" content="Vương Triệu Vũ" />
<meta name="twitter:label2" content="Thời gian để đọc" />
<meta name="twitter:data2" content="16 phút" />
<script type="application/ld+json" class="rank-math-schema-pro">{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://openblox.io/#organization","name":"Xoilac TV","sameAs":["https://www.youtube.com/@xoilacbachdangco","https://www.reddit.com/user/xoilacbachdangco/","https://www.pinterest.com/xoilacbachdangco/","https://www.tumblr.com/xoilacbachdangco","https://www.quora.com/profile/Xoilacbachdangco","https://issuu.com/xoilacbachdangco"],"logo":{"@type":"ImageObject","@id":"https://openblox.io/#logo","url":"https://cdn.xoilac88xg.cc/wp-content/uploads/2025/07/logo-squared.jpg","contentUrl":"https://cdn.xoilac88xg.cc/wp-content/uploads/2025/07/logo-squared.jpg","caption":"Xoilac TV | Tr\u1ef1c Ti\u1ebfp B\u00f3ng \u0110\u00e1 HD - Link X\u00f4i L\u1ea1c TV #1 H\u00f4m Nay","inLanguage":"vi","width":"1080","height":"1080"}},{"@type":"WebSite","@id":"https://openblox.io/#website","url":"https://openblox.io","name":"Xoilac TV | Tr\u1ef1c Ti\u1ebfp B\u00f3ng \u0110\u00e1 HD - Link X\u00f4i L\u1ea1c TV #1 H\u00f4m Nay","alternateName":"Xoilac TV | Tr\u1ef1c Ti\u1ebfp B\u00f3ng \u0110\u00e1 HD - Link X\u00f4i L\u1ea1c TV #1 H\u00f4m Nay","publisher":{"@id":"https://openblox.io/#organization"},"inLanguage":"vi","potentialAction":{"@type":"SearchAction","target":"https://openblox.io/?s={search_term_string}","query-input":"required name=search_term_string"}},{"@type":"ImageObject","@id":"https://cdn.adminmypham.site/wp-content/uploads/2025/07/logo-squared.jpg","url":"https://cdn.adminmypham.site/wp-content/uploads/2025/07/logo-squared.jpg","width":"1080","height":"1080","inLanguage":"vi"},{"@type":"WebPage","@id":"https://openblox.io#webpage","url":"https://openblox.io","name":"Xoilac TV | Tr\u1ef1c Ti\u1ebfp B\u00f3ng \u0110\u00e1 HD - Link X\u00f4i L\u1ea1c TV #1 H\u00f4m Nay","datePublished":"2025-06-22T18:41:07+07:00","dateModified":"2025-11-13T23:12:37+07:00","about":{"@id":"https://openblox.io/#organization"},"isPartOf":{"@id":"https://openblox.io/#website"},"primaryImageOfPage":{"@id":"https://cdn.adminmypham.site/wp-content/uploads/2025/07/logo-squared.jpg"},"inLanguage":"vi"},{"@type":"Person","@id":"https://openblox.io/author/vuongtrieuvu","name":"V\u01b0\u01a1ng Tri\u1ec7u V\u0169","url":"https://openblox.io/author/vuongtrieuvu","image":{"@type":"ImageObject","@id":"https://secure.gravatar.com/avatar/25585f2404eae6739b03e93fc25ec832098a5595d3d9f9ea238cdb873130c508?s=96&amp;d=mm&amp;r=g","url":"https://secure.gravatar.com/avatar/25585f2404eae6739b03e93fc25ec832098a5595d3d9f9ea238cdb873130c508?s=96&amp;d=mm&amp;r=g","caption":"V\u01b0\u01a1ng Tri\u1ec7u V\u0169","inLanguage":"vi"},"worksFor":{"@id":"https://openblox.io/#organization"}},{"@type":"Article","headline":"Xoilac TV | Tr\u1ef1c Ti\u1ebfp B\u00f3ng \u0110\u00e1 HD - Link X\u00f4i L\u1ea1c TV #1 H\u00f4m Nay","keywords":"xoilac tv","datePublished":"2025-06-22T18:41:07+07:00","dateModified":"2025-11-13T23:12:37+07:00","author":{"@id":"https://openblox.io/author/vuongtrieuvu","name":"V\u01b0\u01a1ng Tri\u1ec7u V\u0169"},"publisher":{"@id":"https://openblox.io/#organization"},"description":"Xoilac TV tr\u1ef1c ti\u1ebfp b\u00f3ng \u0111\u00e1 HD h\u00e0ng \u0111\u1ea7u Vi\u1ec7t Nam, \u0111\u01b0\u1eddng truy\u1ec1n \u1ed5n \u0111\u1ecbnh, \u0111a d\u1ea1ng link tr\u1ef1c tuy\u1ebfn, \u0111a d\u1ea1ng gi\u1ea3i \u0111\u1ea5u, BLV chuy\u00ean m\u00f4n cao v\u00e0 ho\u00e0n to\u00e0n mi\u1ec5n ph\u00ed.","name":"Xoilac TV | Tr\u1ef1c Ti\u1ebfp B\u00f3ng \u0110\u00e1 HD - Link X\u00f4i L\u1ea1c TV #1 H\u00f4m Nay","@id":"https://openblox.io#richSnippet","isPartOf":{"@id":"https://openblox.io#webpage"},"image":{"@id":"https://cdn.adminmypham.site/wp-content/uploads/2025/07/logo-squared.jpg"},"inLanguage":"vi","mainEntityOfPage":{"@id":"https://openblox.io#webpage"}}]}</script>
<!-- /Plugin SEO WordPress Rank Math -->

<link rel='dns-prefetch' href='//cdn.openblox.io' />
<script type="text/javascript">
/* <![CDATA[ */
window._wpemojiSettings = {"baseUrl":"https:\/\/s.w.org\/images\/core\/emoji\/15.1.0\/72x72\/","ext":".png","svgUrl":"https:\/\/s.w.org\/images\/core\/emoji\/15.1.0\/svg\/","svgExt":".svg","source":{"concatemoji":"https:\/\/cdn.openblox.io\/wp-content\/wp-includes\/js\/wp-emoji-release.min.js?ver=6.8.1"}};
/*! This file is auto-generated */
!function(i,n){var o,s,e;function c(e){try{var t={supportTests:e,timestamp:(new Date).valueOf()};sessionStorage.setItem(o,JSON.stringify(t))}catch(e){}}function p(e,t,n){e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(t,0,0);var t=new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data),r=(e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(n,0,0),new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data));return t.every(function(e,t){return e===r[t]})}function u(e,t,n){switch(t){case"flag":return n(e,"\ud83c\udff3\ufe0f\u200d\u26a7\ufe0f","\ud83c\udff3\ufe0f\u200b\u26a7\ufe0f")?!1:!n(e,"\ud83c\uddfa\ud83c\uddf3","\ud83c\uddfa\u200b\ud83c\uddf3")&&!n(e,"\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f","\ud83c\udff4\u200b\udb40\udc67\u200b\udb40\udc62\u200b\udb40\udc65\u200b\udb40\udc6e\u200b\udb40\udc67\u200b\udb40\udc7f");case"emoji":return!n(e,"\ud83d\udc26\u200d\ud83d\udd25","\ud83d\udc26\u200b\ud83d\udd25")}return!1}function f(e,t,n){var r="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?new OffscreenCanvas(300,150):i.createElement("canvas"),a=r.getContext("2d",{willReadFrequently:!0}),o=(a.textBaseline="top",a.font="600 32px Arial",{});return e.forEach(function(e){o[e]=t(a,e,n)}),o}function t(e){var t=i.createElement("script");t.src=e,t.defer=!0,i.head.appendChild(t)}"undefined"!=typeof Promise&&(o="wpEmojiSettingsSupports",s=["flag","emoji"],n.supports={everything:!0,everythingExceptFlag:!0},e=new Promise(function(e){i.addEventListener("DOMContentLoaded",e,{once:!0})}),new Promise(function(t){var n=function(){try{var e=JSON.parse(sessionStorage.getItem(o));if("object"==typeof e&&"number"==typeof e.timestamp&&(new Date).valueOf()<e.timestamp+604800&&"object"==typeof e.supportTests)return e.supportTests}catch(e){}return null}();if(!n){if("undefined"!=typeof Worker&&"undefined"!=typeof OffscreenCanvas&&"undefined"!=typeof URL&&URL.createObjectURL&&"undefined"!=typeof Blob)try{var e="postMessage("+f.toString()+"("+[JSON.stringify(s),u.toString(),p.toString()].join(",")+"));",r=new Blob([e],{type:"text/javascript"}),a=new Worker(URL.createObjectURL(r),{name:"wpTestEmojiSupports"});return void(a.onmessage=function(e){c(n=e.data),a.terminate(),t(n)})}catch(e){}c(n=f(s,u,p))}t(n)}).then(function(e){for(var t in e)n.supports[t]=e[t],n.supports.everything=n.supports.everything&&n.supports[t],"flag"!==t&&(n.supports.everythingExceptFlag=n.supports.everythingExceptFlag&&n.supports[t]);n.supports.everythingExceptFlag=n.supports.everythingExceptFlag&&!n.supports.flag,n.DOMReady=!1,n.readyCallback=function(){n.DOMReady=!0}}).then(function(){return e}).then(function(){var e;n.supports.everything||(n.readyCallback(),(e=n.source||{}).concatemoji?t(e.concatemoji):e.wpemoji&&e.twemoji&&(t(e.twemoji),t(e.wpemoji)))}))}((window,document),window._wpemojiSettings);
/* ]]> */
</script>
<style id='wp-emoji-styles-inline-css' type='text/css'>

	img.wp-smiley, img.emoji {
		display: inline !important;
		border: none !important;
		box-shadow: none !important;
		height: 1em !important;
		width: 1em !important;
		margin: 0 0.07em !important;
		vertical-align: -0.1em !important;
		background: none !important;
		padding: 0 !important;
	}
</style>
<link rel='stylesheet' id='wp-block-library-css' href='https://cdn.openblox.io/wp-content/wp-includes/css/dist/block-library/style.min.css?ver=6.8.1' type='text/css' media='all' />
<style id='classic-theme-styles-inline-css' type='text/css'>
/*! This file is auto-generated */
.wp-block-button__link{color:#fff;background-color:#32373c;border-radius:9999px;box-shadow:none;text-decoration:none;padding:calc(.667em + 2px) calc(1.333em + 2px);font-size:1.125em}.wp-block-file__button{background:#32373c;color:#fff;text-decoration:none}
</style>
<style id='global-styles-inline-css' type='text/css'>
:root{--wp--preset--aspect-ratio--square: 1;--wp--preset--aspect-ratio--4-3: 4/3;--wp--preset--aspect-ratio--3-4: 3/4;--wp--preset--aspect-ratio--3-2: 3/2;--wp--preset--aspect-ratio--2-3: 2/3;--wp--preset--aspect-ratio--16-9: 16/9;--wp--preset--aspect-ratio--9-16: 9/16;--wp--preset--color--black: #000000;--wp--preset--color--cyan-bluish-gray: #abb8c3;--wp--preset--color--white: #ffffff;--wp--preset--color--pale-pink: #f78da7;--wp--preset--color--vivid-red: #cf2e2e;--wp--preset--color--luminous-vivid-orange: #ff6900;--wp--preset--color--luminous-vivid-amber: #fcb900;--wp--preset--color--light-green-cyan: #7bdcb5;--wp--preset--color--vivid-green-cyan: #00d084;--wp--preset--color--pale-cyan-blue: #8ed1fc;--wp--preset--color--vivid-cyan-blue: #0693e3;--wp--preset--color--vivid-purple: #9b51e0;--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple: linear-gradient(135deg,rgba(6,147,227,1) 0%,rgb(155,81,224) 100%);--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan: linear-gradient(135deg,rgb(122,220,180) 0%,rgb(0,208,130) 100%);--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange: linear-gradient(135deg,rgba(252,185,0,1) 0%,rgba(255,105,0,1) 100%);--wp--preset--gradient--luminous-vivid-orange-to-vivid-red: linear-gradient(135deg,rgba(255,105,0,1) 0%,rgb(207,46,46) 100%);--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray: linear-gradient(135deg,rgb(238,238,238) 0%,rgb(169,184,195) 100%);--wp--preset--gradient--cool-to-warm-spectrum: linear-gradient(135deg,rgb(74,234,220) 0%,rgb(151,120,209) 20%,rgb(207,42,186) 40%,rgb(238,44,130) 60%,rgb(251,105,98) 80%,rgb(254,248,76) 100%);--wp--preset--gradient--blush-light-purple: linear-gradient(135deg,rgb(255,206,236) 0%,rgb(152,150,240) 100%);--wp--preset--gradient--blush-bordeaux: linear-gradient(135deg,rgb(254,205,165) 0%,rgb(254,45,45) 50%,rgb(107,0,62) 100%);--wp--preset--gradient--luminous-dusk: linear-gradient(135deg,rgb(255,203,112) 0%,rgb(199,81,192) 50%,rgb(65,88,208) 100%);--wp--preset--gradient--pale-ocean: linear-gradient(135deg,rgb(255,245,203) 0%,rgb(182,227,212) 50%,rgb(51,167,181) 100%);--wp--preset--gradient--electric-grass: linear-gradient(135deg,rgb(202,248,128) 0%,rgb(113,206,126) 100%);--wp--preset--gradient--midnight: linear-gradient(135deg,rgb(2,3,129) 0%,rgb(40,116,252) 100%);--wp--preset--font-size--small: 13px;--wp--preset--font-size--medium: 20px;--wp--preset--font-size--large: 36px;--wp--preset--font-size--x-large: 42px;--wp--preset--spacing--20: 0.44rem;--wp--preset--spacing--30: 0.67rem;--wp--preset--spacing--40: 1rem;--wp--preset--spacing--50: 1.5rem;--wp--preset--spacing--60: 2.25rem;--wp--preset--spacing--70: 3.38rem;--wp--preset--spacing--80: 5.06rem;--wp--preset--shadow--natural: 6px 6px 9px rgba(0, 0, 0, 0.2);--wp--preset--shadow--deep: 12px 12px 50px rgba(0, 0, 0, 0.4);--wp--preset--shadow--sharp: 6px 6px 0px rgba(0, 0, 0, 0.2);--wp--preset--shadow--outlined: 6px 6px 0px -3px rgba(255, 255, 255, 1), 6px 6px rgba(0, 0, 0, 1);--wp--preset--shadow--crisp: 6px 6px 0px rgba(0, 0, 0, 1);}:where(.is-layout-flex){gap: 0.5em;}:where(.is-layout-grid){gap: 0.5em;}body .is-layout-flex{display: flex;}.is-layout-flex{flex-wrap: wrap;align-items: center;}.is-layout-flex > :is(*, div){margin: 0;}body .is-layout-grid{display: grid;}.is-layout-grid > :is(*, div){margin: 0;}:where(.wp-block-columns.is-layout-flex){gap: 2em;}:where(.wp-block-columns.is-layout-grid){gap: 2em;}:where(.wp-block-post-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-post-template.is-layout-grid){gap: 1.25em;}.has-black-color{color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-color{color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-color{color: var(--wp--preset--color--white) !important;}.has-pale-pink-color{color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-color{color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-color{color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-color{color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-color{color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-color{color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-color{color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-color{color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-color{color: var(--wp--preset--color--vivid-purple) !important;}.has-black-background-color{background-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-background-color{background-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-background-color{background-color: var(--wp--preset--color--white) !important;}.has-pale-pink-background-color{background-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-background-color{background-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-background-color{background-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-background-color{background-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-background-color{background-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-background-color{background-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-background-color{background-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-background-color{background-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-background-color{background-color: var(--wp--preset--color--vivid-purple) !important;}.has-black-border-color{border-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-border-color{border-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-border-color{border-color: var(--wp--preset--color--white) !important;}.has-pale-pink-border-color{border-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-border-color{border-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-border-color{border-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-border-color{border-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-border-color{border-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-border-color{border-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-border-color{border-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-border-color{border-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-border-color{border-color: var(--wp--preset--color--vivid-purple) !important;}.has-vivid-cyan-blue-to-vivid-purple-gradient-background{background: var(--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple) !important;}.has-light-green-cyan-to-vivid-green-cyan-gradient-background{background: var(--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan) !important;}.has-luminous-vivid-amber-to-luminous-vivid-orange-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange) !important;}.has-luminous-vivid-orange-to-vivid-red-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-orange-to-vivid-red) !important;}.has-very-light-gray-to-cyan-bluish-gray-gradient-background{background: var(--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray) !important;}.has-cool-to-warm-spectrum-gradient-background{background: var(--wp--preset--gradient--cool-to-warm-spectrum) !important;}.has-blush-light-purple-gradient-background{background: var(--wp--preset--gradient--blush-light-purple) !important;}.has-blush-bordeaux-gradient-background{background: var(--wp--preset--gradient--blush-bordeaux) !important;}.has-luminous-dusk-gradient-background{background: var(--wp--preset--gradient--luminous-dusk) !important;}.has-pale-ocean-gradient-background{background: var(--wp--preset--gradient--pale-ocean) !important;}.has-electric-grass-gradient-background{background: var(--wp--preset--gradient--electric-grass) !important;}.has-midnight-gradient-background{background: var(--wp--preset--gradient--midnight) !important;}.has-small-font-size{font-size: var(--wp--preset--font-size--small) !important;}.has-medium-font-size{font-size: var(--wp--preset--font-size--medium) !important;}.has-large-font-size{font-size: var(--wp--preset--font-size--large) !important;}.has-x-large-font-size{font-size: var(--wp--preset--font-size--x-large) !important;}
:where(.wp-block-post-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-post-template.is-layout-grid){gap: 1.25em;}
:where(.wp-block-columns.is-layout-flex){gap: 2em;}:where(.wp-block-columns.is-layout-grid){gap: 2em;}
:root :where(.wp-block-pullquote){font-size: 1.5em;line-height: 1.6;}
</style>
<link rel='stylesheet' id='ez-toc-css' href='https://cdn.openblox.io/wp-content/plugins/easy-table-of-contents/assets/css/screen.min.css?ver=2.0.74' type='text/css' media='all' />
<style id='ez-toc-inline-css' type='text/css'>
div#ez-toc-container .ez-toc-title {font-size: 120%;}div#ez-toc-container .ez-toc-title {font-weight: 500;}div#ez-toc-container ul li , div#ez-toc-container ul li a {font-size: 95%;}div#ez-toc-container ul li , div#ez-toc-container ul li a {font-weight: 500;}div#ez-toc-container nav ul ul li {font-size: 90%;}
.ez-toc-container-direction {direction: ltr;}.ez-toc-counter ul{counter-reset: item ;}.ez-toc-counter nav ul li a::before {content: counters(item, '.', decimal) '. ';display: inline-block;counter-increment: item;flex-grow: 0;flex-shrink: 0;margin-right: .2em; float: left; }.ez-toc-widget-direction {direction: ltr;}.ez-toc-widget-container ul{counter-reset: item ;}.ez-toc-widget-container nav ul li a::before {content: counters(item, '.', decimal) '. ';display: inline-block;counter-increment: item;flex-grow: 0;flex-shrink: 0;margin-right: .2em; float: left; }
</style>
<link rel='stylesheet' id='main-style-css' href='https://cdn.openblox.io/wp-content/themes/cakhiatv/style.css?ver=6.8.1' type='text/css' media='all' />
<script type="text/javascript" src="https://cdn.openblox.io/wp-content/wp-includes/js/jquery/jquery.min.js?ver=3.7.1" id="jquery-core-js"></script>
<script type="text/javascript" src="https://cdn.openblox.io/wp-content/wp-includes/js/jquery/jquery-migrate.min.js?ver=3.4.1" id="jquery-migrate-js"></script>
<link rel="https://api.w.org/" href="https://openblox.io/wp-json/" /><link rel="alternate" title="JSON" type="application/json" href="https://openblox.io/wp-json/wp/v2/pages/1060" /><link rel="EditURI" type="application/rsd+xml" title="RSD" href="https://openblox.io/xmlrpc.php?rsd" />
<meta name="generator" content="WordPress 6.8.1" />
<link rel='shortlink' href='https://openblox.io/' />
<link rel="alternate" title="oNhúng (JSON)" type="application/json+oembed" href="https://openblox.io/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fopenblox.io%2F" />
<link rel="alternate" title="oNhúng (XML)" type="text/xml+oembed" href="https://openblox.io/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fopenblox.io%2F&#038;format=xml" />
    <style>
        @media (min-width: 1024px) {
            h1 {
                font-size: 1.5em !important;
            }
        }

        .match-teams-score {
            display: flex !important;
        }

        @media (max-width: 767px) {
            .xgplayer .xg-inner-controls {
                height: 60px !important;
            }
            .header .logo img{
                height: 35px;
            }
        }

        @media (min-width: 481px) and (max-width: 767px) {
            div#chat_messages {
                max-height: 60vh !important;
            }
        }
    </style>
    <style>
            .match-section {
                min-height: 4800px;
            }
            
            .match-card__status {
                position: absolute;
                top: 13%;
                left: 50%;
                transform: translate(-50%, -50%);
            }
            
            .match-card__stats-content {
                background: none !important;
                box-shadow: none !important
            }
            
            
            
            @media (max-width: 480px) {
                .team__logo {
                    width: 40px !important;
                    height: 40px !important;
                }
                .match-card__league {
                    max-width: 100px;
                }
                
                .match-card__time {
                    max-width: 100px;
                }
                
                .match-card__status {
                    max-width: 120px;
                    order: 1 !important;
                    font-size: 12px
                }
                
                .streaming {
                    padding: 4px;
                }
                
                .btn-view-truc-tiep {
                    padding: 8px 4px !important;
                    font-size: 12px;
                }
                .match-card__stats-content {
                    display: block !important;
                }
                
                .match-card__stats {
                    display: block !important
                }
            }
            
            @media (min-width: 768px) and (max-width: 1024px) {
                .match-card__status {
                    position: absolute;
                    top: 13%;
                    left: 50%;
                    transform: translate(-50%, -50%);
                }
                
                .match-card__league {
                    max-width: 110px;
                }
            }
        </style>  
      <!-- Google tag (tổng) -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-V8GXMSME5N"></script>
<script>
  window.dataLayer = window.dataLayer || [];
  function gtag(){dataLayer.push(arguments);}
  gtag('js', new Date());

  gtag('config', 'G-V8GXMSME5N');
</script>

<!-- Google tag (gtag.js) -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-DKKD5K87H5"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());

gtag('config', 'G-DKKD5K87H5');
</script>

</head>

<body>
  <!-- Header -->
<header class="header">
    <div class="container">
      <div class="header__inner">
        <a href="/" class="logo">
          <img src="/wp-content/uploads/2025/07/logo_xoilactv.png" alt="Xoilac TV" style="max-height: 50px"/>
        </a>
        <div style="display: flex; align-items: center">
          <nav class="nav">
            <button class="nav__toggle">
              <img src="https://cdn.openblox.io/wp-content/themes/cakhiatv/assets/images/hamburger.svg" alt="Menu" />
            </button>

            <ul class="nav__menu">
              <button class="nav__close" aria-label="Close menu"></button>
              <li class="nav__item"><a href="/" class=" active">TRANG CHỦ</a></li><li class="nav__item"><a href="https://openblox.io/lich-thi-dau" class="">LỊCH THI ĐẤU</a></li><li class="nav__item"><a href="https://openblox.io/bang-xep-hang" class="">BẢNG XẾP HẠNG</a></li><li class="nav__item"><a href="https://openblox.io/ket-qua-bong-da" class="">KẾT QUẢ BÓNG ĐÁ</a></li><li class="nav__item"><a href="https://openblox.io/nhan-dinh" class="">NHẬN ĐỊNH</a></li><li class="nav__item"><a href="https://openblox.io/tin-tuc" class="">TIN TỨC</a></li>            </ul>
          </nav>
          <div class="header__buttons">
            <a href="https://refvsbf.com/" target="_blank" class="btn btn--secondary header-button" rel="nofollow">
              <span class="header-text">CƯỢC VSBET</span>
            </a>
            <a href="https://t.me/vsbet88888888888888888" rel="nofollow" target="_blank" class="btn btn--default header-button">
              <span class="header-text">LIÊN HỆ KM</span>
            </a>
          </div>

        </div>



      </div>
    </div>
  </header>
 
   <!-- Main Content -->
     <!-- Main Content -->
     <main style="padding-top: 1px">
      <!-- Hero Section -->
      <section class="hero">
        <div class="container">
          <div class="hero__content">
            <h1 class="text-uppercase">
                Xoilac TV | Trực Tiếp Bóng Đá HD - Link Xôi Lạc TV #1 Hôm Nay
            </h1>
          </div>
        </div>
      </section>

      <!-- Sports Filter -->
      <section class="sports-filter">
        <div class="container">
          <div class="sports-filter__inner" style="display: none">
            <!-- Group 1: Sports Categories -->
            <!--<div class="sports-filter__group sports-categories">
            <button
                class="sports-filter__button"
                data-sport="all"
              >
                <div class="sports-filter__button-icon">
                  <img
                    src="https://cdn.openblox.io/wp-content/themes/cakhiatv/assets/images/icons/football.png"
                    alt="Tất Cả"
                  />
                </div>
                <div class="sports-filter__button-text">Tất Cả</div>
                <div class="sports-filter__button-count" id="count-all-type"></div>
              </button>

              <button
                class="sports-filter__button"
                data-sport="football"
              >
                <div class="sports-filter__button-icon">
                  <img
                    src="https://cdn.openblox.io/wp-content/themes/cakhiatv/assets/images/icons/football.png"
                    alt="Football"
                  />
                </div>
                <div class="sports-filter__button-text">Bóng đá</div>
                <div class="sports-filter__button-count" id="count-football"></div>
              </button>

              <button class="sports-filter__button" data-sport="basketball">
                <div class="sports-filter__button-icon">
                  <img
                    src="https://cdn.openblox.io/wp-content/themes/cakhiatv/assets/images/icons/basketball.png"
                    alt="Basketball"
                  />
                </div>
                <div class="sports-filter__button-text">Bóng rổ</div>
                <div class="sports-filter__button-count" id="count-basketball"></div>
              </button>

             <!-- <button class="sports-filter__button" data-sport="tennis">
                <div class="sports-filter__button-icon">
                  <img src="https://cdn.openblox.io/wp-content/themes/cakhiatv/assets/images/icons/tennis.png" alt="Tennis" />
                </div>
                <div class="sports-filter__button-text">Tennis</div>
                <div class="sports-filter__button-count" id="count-tennis"></div>
              </button> -->

              <!--<button class="sports-filter__button" data-sport="volleyball">
                <div class="sports-filter__button-icon">
                  <img
                    src="https://cdn.openblox.io/wp-content/themes/cakhiatv/assets/images/icons/volleyball.png"
                    alt="Volleyball"
                  />
                </div>
                <div class="sports-filter__button-text">Bóng chuyền</div>
                <div class="sports-filter__button-count" id="count-volleyball"></div>
              </button> -->

              <div class="livescore-switch">
                <label class="switch">
                  <input type="checkbox" id="livescoreToggle" />
                  <span class="slider"></span>
                </label>
                <span class="livescore-label">Livescore</span>
              </div>
            </div>

            <!-- Divider -->
            <div class="sports-filter__divider"></div>

            <!-- Group 2: Match Filters -->
            <div class="sports-filter__group match-filters">
            <button class="sports-filter__button_child active" data-filter="child_all">
                <div class="sports-filter__button-icon">
                  <img src="https://cdn.openblox.io/wp-content/themes/cakhiatv/assets/images/icons/all.png" alt="All" />
                </div>
                <div class="sports-filter__button-text">Tất cả</div>
                <div class="sports-filter__button-count" id="count-all-type"></div>
              </button>

              <button class="sports-filter__button_child live" data-filter="live">
                <div class="sports-filter__button-icon">
                  <img src="https://cdn.openblox.io/wp-content/themes/cakhiatv/assets/images/icons/live.png" alt="Live" />
                </div>
                <div class="sports-filter__button-text">Đang Live</div>
                <div class="sports-filter__button-count" id="count-live"></div>
              </button>

              <button class="sports-filter__button_child" data-filter="hot">
                <div class="sports-filter__button-icon">
                  <img src="https://cdn.openblox.io/wp-content/themes/cakhiatv/assets/images/icons/hot.png" alt="Hot" />
                </div>
                <div class="sports-filter__button-text">Trận HOT</div>
                <div class="sports-filter__button-count" id="count-hot"></div>
              </button>

              <button class="sports-filter__button_child" data-filter="date" data-value="">
                <div class="sports-filter__button-icon">
                  <img src="https://cdn.openblox.io/wp-content/themes/cakhiatv/assets/images/icons/calendar.png" alt="Today" />
                </div>
                <div class="sports-filter__button-text">Hôm Nay</div>
                <div class="sports-filter__button-count" id="count-today"></div>
              </button>

              <button class="sports-filter__button_child" data-filter="date" data-value="">
                <div class="sports-filter__button-icon">
                  <img
                    src="https://cdn.openblox.io/wp-content/themes/cakhiatv/assets/images/icons/calendar.png"
                    alt="Tomorrow"
                  />
                </div>
                <div class="sports-filter__button-text">Ngày Mai</div>
                <div class="sports-filter__button-count" id="count-tomorrow"></div>
              </button>         
             
             <!--<button class="sports-filter__button_child" data-filter="no_blv">
                <div class="sports-filter__button-text">Live không BLV</div>
                <div class="sports-filter__button-count" id="noblv-live">0</div>
              </button>-->
              
            </div>
          </div>
        </div>
      </section>

      <!-- Featured Matches -->
      <section class="featured-matches">
        <div class="container">
        <div class="match-section">
            <div id="match-list" class="matches">
            </div>
          </div>

          <!--<div
            style="
              display: flex;
              justify-content: center;
              margin-top: 1rem;
              margin-bottom: 1rem;
            "
          >
            <a href="#" class="btn btn--readmore">
              <span>Xem thêm lịch trực tiếp -></span>
            </a>
          </div>-->
        </div>
      </section>

      <!-- Content Navigation Section -->
      <section class="content-nav">
  <div class="container">
    <div class="content-nav__container" style="max-height:800px !important">
      <div class="content-nav__lists">
        <div class="content-nav__list">
          <!-- Nếu bạn vẫn muốn giữ Mục lục này thủ công, thì để lại -->
          <p style="font-weight: bold; font-size: 120%">Mục Lục</p>
          <!-- Hoặc có thể xoá toàn bộ <ul> này nếu muốn Gutenberg xử lý luôn -->

          <div class="content-nav__divider"></div>

          <div class="content-nav__text">
            <div id="ez-toc-container" class="ez-toc-v2_0_74 counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction">
<div class="ez-toc-title-container">
<p class="ez-toc-title" style="cursor:inherit">Table of Contents</p>
<span class="ez-toc-title-toggle"><a href="#" class="ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle" aria-label="Toggle Table of Content"><span class="ez-toc-js-icon-con"><span class=""><span class="eztoc-hide" style="display:none;">Toggle</span><span class="ez-toc-icon-toggle-span"><svg style="fill: #999;color:#999" xmlns="https://www.w3.org/2000/svg" class="list-377408" width="20px" height="20px" viewBox="0 0 24 24" fill="none"><path d="M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z" fill="currentColor"></path></svg><svg style="fill: #999;color:#999" class="arrow-unsorted-368013" xmlns="https://www.w3.org/2000/svg" width="10px" height="10px" viewBox="0 0 24 24" version="1.2" baseProfile="tiny"><path d="M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z"/></svg></span></span></span></a></span></div>
<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-1" href="#Gioi_thieu_ve_Xoilac_TV" >Giới thiệu về Xoilac TV</a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-2" href="#Xoilac_TV_la_gi" >Xoilac TV là gì?</a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-3" href="#Muc_tieu_ton_chi_cua_nen_tang" >Mục tiêu &amp; tôn chỉ của nền tảng</a></li></ul></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-4" href="#Vi_sao_Xoilac_TV_tro_thanh_lua_chon_hang_dau_cua_nguoi_xem_Viet_Nam" >Vì sao Xoilac TV trở thành lựa chọn hàng đầu của người xem Việt Nam?</a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-5" href="#Xem_mien_phi_moi_giai_dau_lon_nho" >Xem miễn phí mọi giải đấu lớn nhỏ</a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-6" href="#Truyen_hinh_truc_tiep_bong_da_chat_luong_Full_HD" >Truyền hình trực tiếp bóng đá chất lượng Full HD</a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-7" href="#Khong_giat_lag_%E2%80%93_Khong_quang_cao_che_man_hinh" >Không giật lag – Không quảng cáo che màn hình</a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-8" href="#Ho_tro_xem_tren_moi_thiet_bi_TV_PC_iPhone_Android" >Hỗ trợ xem trên mọi thiết bị: TV, PC, iPhone, Android</a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-9" href="#Server_livestream_sieu_nhanh_%E2%80%93_Khong_delay" >Server livestream siêu nhanh – Không delay</a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-10" href="#Tu_dong_toi_uu_theo_toc_do_mang_hien_tai" >Tự động tối ưu theo tốc độ mạng hiện tại</a></li></ul></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-11" href="#Danh_sach_cac_giai_dau_duoc_truc_tiep_tai_Xoilac_TV" >Danh sách các giải đấu được trực tiếp tại Xoilac TV</a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-12" href="#Cac_giai_dau_hang_dau_chau_Au" >Các giải đấu hàng đầu châu Âu</a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-13" href="#Cac_giai_dau_chau_A_Viet_Nam" >Các giải đấu châu Á &amp; Việt Nam</a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-14" href="#Cac_giai_dau_quoc_te" >Các giải đấu quốc tế</a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-15" href="#Cac_giai_tre_giao_huu_quoc_te" >Các giải trẻ &amp; giao hữu quốc tế</a></li></ul></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-16" href="#Cac_chuyen_muc_huu_ich_khac_tai_Xoilac_TV" >Các chuyên mục hữu ích khác tại Xoilac TV</a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-17" href="#Lich_thi_dau_bong_da_hom_nay_%E2%80%93_Cap_nhat_nhanh_nhat" >Lịch thi đấu bóng đá hôm nay – Cập nhật nhanh nhất</a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-18" href="#Xem_ket_qua_bong_da_%E2%80%93_Tong_hop_day_du_theo_thoi_gian_thuc" >Xem kết quả bóng đá – Tổng hợp đầy đủ theo thời gian thực</a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-19" href="#Bang_xep_hang_bong_da_%E2%80%93_Cap_nhat_lien_tuc" >Bảng xếp hạng bóng đá – Cập nhật liên tục</a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-20" href="#Nhan_dinh_bong_da_%E2%80%93_Phan_tich_chuyen_sau_truoc_tran" >Nhận định bóng đá – Phân tích chuyên sâu trước trận</a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-21" href="#Tin_tuc_bong_da_%E2%80%93_Cap_nhat_nong_hoi_moi_ngay" >Tin tức bóng đá – Cập nhật nóng hổi mỗi ngày</a></li></ul></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-22" href="#Vi_sao_nen_chon_Xoilac_TV_thay_vi_cac_nen_tang_truc_tiep_bong_da_khac" >Vì sao nên chọn Xoilac TV thay vì các nền tảng trực tiếp bóng đá khác?</a></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-23" href="#He_thong_chong_lag_%E2%80%93_Cong_nghe_toi_uu_xem_bong_da" >Hệ thống chống lag – Công nghệ tối ưu xem bóng đá</a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-24" href="#CDN_da_lop_%E2%80%93_Tu_dong_can_bang_tai" >CDN đa lớp – Tự động cân bằng tải</a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-25" href="#Toi_uu_duong_truyen_cho_nguoi_dung_Viet_Nam" >Tối ưu đường truyền cho người dùng Việt Nam</a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-26" href="#Cong_nghe_nen_video_thong_minh" >Công nghệ nén video thông minh</a></li></ul></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-27" href="#Ket_luan" >Kết luận</a></li></ul></nav></div>




<p>Bóng đá ngày càng trở thành một phần không thể thiếu trong đời sống tinh thần của người Việt Nam. Nhu cầu theo dõi các giải đấu lớn nhỏ với chất lượng hình ảnh cao, đường truyền ổn định và khả năng truy cập linh hoạt đang tăng mạnh hơn bao giờ hết. </p>



<p>Trong bối cảnh nhiều nền tảng trực tuyến vẫn tồn tại hạn chế về băng thông, độ trễ hay quảng cáo gây gián đoạn, Xoilac TV xuất hiện như một giải pháp toàn diện, đáp ứng đầy đủ những yêu cầu khắt khe của người xem hiện đại. Với hệ thống công nghệ được đầu tư bài bản và khả năng cung cấp dữ liệu phong phú, Xoilac TV không chỉ là một website xem bóng đá, mà còn là một trung tâm thông tin chuyên sâu dành cho người hâm mộ bóng đá tại Việt Nam.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="800" height="400" src="https://bachdangco.com/wp-content/uploads/2025/11/image.png" alt="Giới thiệu Xoilac TV" class="wp-image-3472" srcset="https://cdn.adminmypham.site/wp-content/uploads/2025/11/image.png 800w, https://cdn.adminmypham.site/wp-content/uploads/2025/11/image-300x150.png 300w, https://cdn.adminmypham.site/wp-content/uploads/2025/11/image-768x384.png 768w" sizes="auto, (max-width: 800px) 100vw, 800px" /></figure>



<h2 class="wp-block-heading"><span class="ez-toc-section" id="Gioi_thieu_ve_Xoilac_TV"></span><strong>Giới thiệu về Xoilac TV</strong><span class="ez-toc-section-end"></span></h2>



<h3 class="wp-block-heading"><span class="ez-toc-section" id="Xoilac_TV_la_gi"></span><strong>Xoilac TV là gì?</strong><span class="ez-toc-section-end"></span></h3>



<p><strong><a href="/">Xoilac</a></strong> TV là một nền tảng trực tiếp bóng đá trực tuyến được phát triển nhằm đáp ứng nhu cầu xem bóng đá chất lượng cao cho khán giả tại Việt Nam. Trong bối cảnh nhu cầu theo dõi các giải đấu ngày càng tăng, đặc biệt là Ngoại hạng Anh, Champions League hay các giải thuộc hệ thống đội tuyển quốc gia, Xoilac TV ra đời như một giải pháp tối ưu, mang đến trải nghiệm xem bóng đá mượt mà, sắc nét và ổn định.</p>



<p>Không chỉ là một website cung cấp link xem bóng đá, <strong><a href="/">Xoilac TV</a></strong> còn hoạt động như một hệ sinh thái bóng đá toàn diện, bao gồm lịch thi đấu, kết quả, bảng xếp hạng, phân tích chuyên sâu và tin tức cập nhật. Tất cả được thiết kế với mục tiêu xây dựng một nền tảng tập trung cho người hâm mộ bóng đá Việt Nam, nơi họ có thể theo dõi mọi trận đấu từ cấp CLB đến cấp đội tuyển.</p>



<h3 class="wp-block-heading"><span class="ez-toc-section" id="Muc_tieu_ton_chi_cua_nen_tang"></span><strong>Mục tiêu &amp; tôn chỉ của nền tảng</strong><span class="ez-toc-section-end"></span></h3>



<p>Mục tiêu của Xoilac TV là cung cấp trải nghiệm xem <strong><a href="/\">trực tiếp bóng đá</a></strong> <strong>ổn định – chất lượng – miễn phí</strong>, hướng tới tối ưu hóa khả năng tiếp cận cho mọi người dùng, bất kể thiết bị hay băng thông mạng.</p>



<p>Các nguyên tắc hoạt động chính của Xoilac TV bao gồm:</p>



<ul class="wp-block-list">
<li><strong>Chất lượng đường truyền ổn định:</strong> Tập trung vào công nghệ CDN và cân bằng tải để giảm độ trễ.</li>



<li><strong>Tối ưu hóa trải nghiệm người dùng:</strong> Giao diện rõ ràng, dễ thao tác, hỗ trợ mọi thiết bị.</li>



<li><strong>Khả năng truy cập cao:</strong> Không yêu cầu đăng ký hoặc chi phí.</li>



<li><strong>Cung cấp thông tin đầy đủ:</strong> Hỗ trợ dữ liệu trận đấu, tin tức và phân tích chuyên sâu.</li>
</ul>



<p>Nhờ tuân thủ các tôn chỉ này, Xoilac TV từng bước xây dựng vị thế là một trong những nền tảng xem bóng đá trực tuyến hàng đầu tại Việt Nam.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="800" height="400" src="https://bachdangco.com/wp-content/uploads/2025/11/image-1.png" alt="Mục tiêu và sứ mệnh của Xoilac TV" class="wp-image-3473" srcset="https://cdn.adminmypham.site/wp-content/uploads/2025/11/image-1.png 800w, https://cdn.adminmypham.site/wp-content/uploads/2025/11/image-1-300x150.png 300w, https://cdn.adminmypham.site/wp-content/uploads/2025/11/image-1-768x384.png 768w" sizes="auto, (max-width: 800px) 100vw, 800px" /></figure>



<h2 class="wp-block-heading"><span class="ez-toc-section" id="Vi_sao_Xoilac_TV_tro_thanh_lua_chon_hang_dau_cua_nguoi_xem_Viet_Nam"></span><strong>Vì sao Xoilac TV trở thành lựa chọn hàng đầu của người xem Việt Nam?</strong><span class="ez-toc-section-end"></span></h2>



<h3 class="wp-block-heading"><span class="ez-toc-section" id="Xem_mien_phi_moi_giai_dau_lon_nho"></span><strong>Xem miễn phí mọi giải đấu lớn nhỏ</strong><span class="ez-toc-section-end"></span></h3>



<p>Một trong những yếu tố tạo nên sự phổ biến của Xoilac TV chính là khả năng cung cấp đường truyền trực tiếp của hầu hết các giải đấu lớn nhỏ hoàn toàn miễn phí. Người dùng không phải trả bất kỳ chi phí nào, không yêu cầu tài khoản hay gói thuê bao — chỉ cần truy cập và xem ngay.</p>



<p>Việc hỗ trợ miễn phí một số lượng lớn giải đấu giúp Xoilac TV trở thành một trong những nền tảng được truy cập nhiều nhất vào cuối tuần, đặc biệt trong các khung giờ cao điểm như Ngoại hạng Anh, La Liga hay Champions League.</p>



<h3 class="wp-block-heading"><span class="ez-toc-section" id="Truyen_hinh_truc_tiep_bong_da_chat_luong_Full_HD"></span><strong>Truyền hình trực tiếp bóng đá chất lượng Full HD</strong><span class="ez-toc-section-end"></span></h3>



<p>Các luồng streaming Full HD của Xoilac TV được xử lý qua hệ thống mã hóa hiện đại, giúp:</p>



<ul class="wp-block-list">
<li>Giảm nhiễu hình</li>



<li>Tối ưu độ sáng – độ tương phản</li>



<li>Giữ độ ổn định khi xem full màn hình</li>



<li>Tăng tốc tải khung hình cho các trận đấu tốc độ cao</li>
</ul>



<p>Xoilac TV ứng dụng công nghệ streaming đa phân giải, cho phép người dùng xem bóng đá với chất lượng từ 480p đến 1080p tùy theo điều kiện băng thông. Hệ thống sẽ tự động điều chỉnh để tối ưu hình ảnh, đảm bảo người xem luôn nhận được độ nét cao nhất có thể mà vẫn giữ được sự ổn định trong quá trình truyền tải. Nhờ cơ chế mã hóa video hiện đại, hình ảnh thu được có độ sắc nét vượt trội, hạn chế nhiễu, tối ưu độ sáng và độ tương phản để phù hợp với từng loại màn hình khác nhau.</p>



<p>Điểm mạnh của nền tảng nằm ở khả năng duy trì chất lượng khung hình cao ngay trong những pha bóng tốc độ, giúp giảm hiện tượng mờ nhoè hoặc mất nét khi camera di chuyển nhanh. Khi xem full màn hình, chất lượng hình ảnh vẫn được giữ nguyên mà không bị bể hình hoặc giảm độ chi tiết. Điều này mang đến cảm giác sống động, giúp người xem như đang trải nghiệm trận đấu trực tiếp trên sân vận động.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="800" height="400" src="https://bachdangco.com/wp-content/uploads/2025/11/image-2.png" alt="Hình ảnh và âm thanh chất lượng cao" class="wp-image-3474" srcset="https://cdn.adminmypham.site/wp-content/uploads/2025/11/image-2.png 800w, https://cdn.adminmypham.site/wp-content/uploads/2025/11/image-2-300x150.png 300w, https://cdn.adminmypham.site/wp-content/uploads/2025/11/image-2-768x384.png 768w" sizes="auto, (max-width: 800px) 100vw, 800px" /></figure>



<h3 class="wp-block-heading"><span class="ez-toc-section" id="Khong_giat_lag_%E2%80%93_Khong_quang_cao_che_man_hinh"></span><strong>Không giật lag – Không quảng cáo che màn hình</strong><span class="ez-toc-section-end"></span></h3>



<p>Điểm khác biệt lớn giữa Xoilac TV và nhiều trang web xem bóng đá miễn phí khác nằm ở việc nền tảng không hiển thị quảng cáo che lên video. Nhờ đó, màn hình trận đấu luôn được giữ trọn vẹn, không bị che khuất trong những tình huống quan trọng. Việc loại bỏ lớp quảng cáo gây cản trở giúp trải nghiệm xem trở nên liền mạch hơn rất nhiều, đặc biệt trong những trận đấu có nhịp độ cao.</p>



<p>Về mặt kỹ thuật, Xoilac TV xây dựng hệ thống chống lag dựa trên cơ chế kiểm soát tải và tối ưu đường truyền liên tục. Điều này giúp hạn chế tình trạng tụt FPS, khựng hình, suy giảm chất lượng hoặc nghẽn tín hiệu vào những thời điểm có lượng người truy cập lớn. Nhờ đó, người xem có thể theo dõi trận đấu một cách ổn định, không bị gián đoạn bởi những vấn đề thường gặp ở nền tảng khác.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="800" height="400" src="https://bachdangco.com/wp-content/uploads/2025/11/image-4.png" alt="Xoilac TV không quảng cáo khi xem bóng đá" class="wp-image-3476" srcset="https://cdn.adminmypham.site/wp-content/uploads/2025/11/image-4.png 800w, https://cdn.adminmypham.site/wp-content/uploads/2025/11/image-4-300x150.png 300w, https://cdn.adminmypham.site/wp-content/uploads/2025/11/image-4-768x384.png 768w" sizes="auto, (max-width: 800px) 100vw, 800px" /></figure>



<h3 class="wp-block-heading"><span class="ez-toc-section" id="Ho_tro_xem_tren_moi_thiet_bi_TV_PC_iPhone_Android"></span><strong>Hỗ trợ xem trên mọi thiết bị: TV, PC, iPhone, Android</strong><span class="ez-toc-section-end"></span></h3>



<p>Xoilac TV hỗ trợ đa thiết bị dựa trên công nghệ hiển thị responsive:</p>



<ul class="wp-block-list">
<li><strong>TV thông minh:</strong> Hỗ trợ trình duyệt tivi Samsung, LG, Android TV.</li>



<li><strong>Laptop/PC:</strong> Tương thích Google Chrome, Firefox, Edge, Safari.</li>



<li><strong>Điện thoại:</strong> Tối ưu đặc biệt cho iOS và Android để giảm tải CPU và tiết kiệm dữ liệu.</li>
</ul>



<p>Tính đa nền tảng của Xoilac TV được phát triển dựa trên công nghệ thiết kế giao diện responsive, cho phép website tự điều chỉnh để phù hợp với từng loại thiết bị. Khi xem trên TV thông minh, người dùng vẫn có thể trải nghiệm hình ảnh độ nét cao với giao diện rõ ràng và dễ điều khiển bằng remote. Trên laptop hoặc máy tính bàn, nền tảng hoạt động mượt mà trên các trình duyệt phổ biến mà không yêu cầu cài đặt thêm phần mềm.</p>



<p>Đối với điện thoại di động, Xoilac TV được tối ưu hóa để giảm tải tài nguyên, đảm bảo hiệu năng ổn định ngay cả trên thiết bị cấu hình trung bình. Việc điều chỉnh kích thước video, giảm tiêu hao pin và tiết kiệm dữ liệu di động giúp người dùng có thể xem bóng đá ở mọi nơi, mọi thời điểm. Dù trên thiết bị nào, nền tảng đều giữ được chất lượng hình ảnh và sự mượt mà khi xem trực tiếp.</p>



<h3 class="wp-block-heading"><span class="ez-toc-section" id="Server_livestream_sieu_nhanh_%E2%80%93_Khong_delay"></span><strong>Server livestream siêu nhanh – Không delay</strong><span class="ez-toc-section-end"></span></h3>



<p>Một trong những yếu tố kỹ thuật quan trọng nhất của Xoilac TV là hệ thống server livestream được phân bố tại nhiều khu vực, giúp rút ngắn khoảng cách truyền tải và giảm tối đa độ trễ. Trong thực tế, độ delay của Xoilac TV thường chỉ nằm trong khoảng 5 đến 15 giây — thấp hơn đáng kể so với các website xem bóng đá thông thường hoặc các ứng dụng OTT quốc tế vốn có thể chậm tới 30–60 giây.</p>



<p>Độ trễ trung bình:</p>



<ul class="wp-block-list">
<li>Website bóng đá thông thường: 25–45 giây</li>



<li>Một số nền tảng OTT quốc tế: 30–60 giây</li>



<li><strong>Xoilac TV: 5–15 giây</strong></li>
</ul>



<p>Sự vượt trội này là kết quả của cơ chế định tuyến thông minh giúp tối ưu hướng truyền dữ liệu và giảm số lượng điểm trung gian. Khi lượng người xem tăng đột biến, hệ thống vẫn giữ được tốc độ ổn định nhờ khả năng phân bổ tải linh hoạt, đảm bảo trải nghiệm liền mạch ngay cả trong những trận cầu tâm điểm thu hút hàng trăm nghìn người truy cập cùng lúc.</p>



<h3 class="wp-block-heading"><span class="ez-toc-section" id="Tu_dong_toi_uu_theo_toc_do_mang_hien_tai"></span><strong>Tự động tối ưu theo tốc độ mạng hiện tại</strong><span class="ez-toc-section-end"></span></h3>



<p>Xoilac TV sử dụng thuật toán Adaptive Bitrate Streaming, một trong những công nghệ tiên tiến nhất trong lĩnh vực truyền tải video trực tuyến. Thuật toán này liên tục đánh giá tốc độ tải xuống, độ ổn định băng thông và tình trạng mất gói dữ liệu để quyết định chất lượng phát phù hợp nhất cho người dùng tại từng thời điểm. Tính năng này tự đánh giá:</p>



<p>Khi tốc độ mạng không ổn định, hệ thống lập tức giảm độ phân giải xuống mức phù hợp để giữ hình ảnh mượt mà, không bị đứng hình hoặc giật lag. Ngược lại, khi băng thông mạnh trở lại, chất lượng video sẽ tự động tăng lên 720p hoặc 1080p mà không cần bất kỳ thao tác nào từ phía người xem. Điều này tạo nên một trải nghiệm liền mạch, giúp người dùng luôn cảm nhận trận đấu ở mức chất lượng tối ưu nhất mà đường truyền cho phép.</p>



<p>Ví dụ:</p>



<ul class="wp-block-list">
<li>Mạng yếu → tự động chuyển 480p</li>



<li>Mạng ổn → 720p</li>



<li>Mạng mạnh → 1080p</li>
</ul>



<h2 class="wp-block-heading"><span class="ez-toc-section" id="Danh_sach_cac_giai_dau_duoc_truc_tiep_tai_Xoilac_TV"></span><strong>Danh sách các giải đấu được trực tiếp tại Xoilac TV</strong><span class="ez-toc-section-end"></span></h2>



<h3 class="wp-block-heading"><span class="ez-toc-section" id="Cac_giai_dau_hang_dau_chau_Au"></span><strong>Các giải đấu hàng đầu châu Âu</strong><span class="ez-toc-section-end"></span></h3>



<p>Xoilac TV truyền tải đầy đủ các giải đấu lớn nhất châu Âu với chất lượng cao và cập nhật liên tục:</p>



<ul class="wp-block-list">
<li><strong>Ngoại hạng Anh (Premier League):</strong> Giải đấu được xem nhiều nhất tại Việt Nam.</li>



<li><strong>Champions League:</strong> Cung cấp các trận đấu vòng bảng, vòng loại trực tiếp và chung kết.</li>



<li><strong>Europa League / Europa Conference League:</strong> Phù hợp với người xem yêu thích bóng đá chiến thuật.</li>



<li><strong>La Liga:</strong> Nơi quy tụ kỹ thuật đỉnh cao với Barcelona, Real Madrid, Atletico.</li>



<li><strong>Serie A:</strong> Giải đấu giàu tính chiến thuật của châu Âu.</li>



<li><strong>Bundesliga:</strong> Tốc độ cao, nhiều bàn thắng.</li>



<li><strong>Ligue 1:</strong> Theo dõi các đội bóng lớn như PSG, Marseille, Monaco.</li>
</ul>



<p>Mỗi giải đấu đều được cập nhật lịch thi đấu, đội hình, thông tin chuyên sâu ngay trước trận.</p>



<h3 class="wp-block-heading"><span class="ez-toc-section" id="Cac_giai_dau_chau_A_Viet_Nam"></span><strong>Các giải đấu châu Á &amp; Việt Nam</strong><span class="ez-toc-section-end"></span></h3>



<ul class="wp-block-list">
<li><strong>V.League:</strong> Giải vô địch quốc gia Việt Nam với các CLB hàng đầu.</li>



<li><strong>Cúp Quốc gia Việt Nam</strong></li>



<li><strong>U23 châu Á:</strong> Các đội tuyển trẻ, đặc biệt quan trọng với người hâm mộ Việt Nam.</li>



<li><strong>AFC Champions League:</strong> Cup C1 châu Á với sự góp mặt của nhiều CLB mạnh.</li>
</ul>



<h3 class="wp-block-heading"><span class="ez-toc-section" id="Cac_giai_dau_quoc_te"></span><strong>Các giải đấu quốc tế</strong><span class="ez-toc-section-end"></span></h3>



<p>Xoilac TV phát trực tiếp toàn bộ các giải lớn cấp đội tuyển:</p>



<ul class="wp-block-list">
<li><strong>World Cup</strong></li>



<li><strong>Euro</strong></li>



<li><strong>Copa America</strong></li>



<li><strong>Asian Cup</strong></li>



<li><strong>SEA Games – AFF Cup</strong></li>
</ul>



<p>Các giải này luôn thu hút lượng truy cập khổng lồ, nên Xoilac TV sử dụng server riêng để đảm bảo trải nghiệm.</p>



<h3 class="wp-block-heading"><span class="ez-toc-section" id="Cac_giai_tre_giao_huu_quoc_te"></span><strong>Các giải trẻ &amp; giao hữu quốc tế</strong><span class="ez-toc-section-end"></span></h3>



<p>Bao gồm:</p>



<ul class="wp-block-list">
<li>U17, U19, U21</li>



<li>Trận giao hữu CLB</li>



<li>Giao hữu đội tuyển quốc gia</li>
</ul>



<p>Những trận đấu này thường khó tìm link xem, nhưng Xoilac TV vẫn cố gắng cung cấp đầy đủ.</p>



<h2 class="wp-block-heading"><span class="ez-toc-section" id="Cac_chuyen_muc_huu_ich_khac_tai_Xoilac_TV"></span><strong>Các chuyên mục hữu ích khác tại Xoilac TV</strong><span class="ez-toc-section-end"></span></h2>



<p>Ngoài trực tiếp bóng đá, Xoilac TV phát triển thêm nhiều chuyên mục hỗ trợ:</p>



<ul class="wp-block-list">
<li><strong>Lịch thi đấu:</strong> Cập nhật theo ngày, theo giải đấu.</li>



<li><strong>Kết quả:</strong> Có thống kê bàn thắng, thẻ phạt, kiểm soát bóng.</li>



<li><strong>Bảng xếp hạng:</strong> BXH chi tiết theo từng giải.</li>



<li><strong>Nhận định:</strong> Phân tích từ chuyên gia, phong độ, đối đầu.</li>



<li><strong>Tin tức:</strong> Thị trường chuyển nhượng, đội tuyển Việt Nam, chấn thương…</li>
</ul>



<p>Hệ sinh thái thông tin giúp người xem không cần truy cập nhiều website khác.</p>



<h3 class="wp-block-heading"><span class="ez-toc-section" id="Lich_thi_dau_bong_da_hom_nay_%E2%80%93_Cap_nhat_nhanh_nhat"></span><strong>Lịch thi đấu bóng đá hôm nay – Cập nhật nhanh nhất</strong><span class="ez-toc-section-end"></span></h3>



<p>Lịch thi đấu trên Xoilac TV được cập nhật theo thời gian thực nhờ hệ thống đồng bộ hóa dữ liệu toàn cầu, đảm bảo người xem luôn tiếp cận đúng và đủ thông tin cho mỗi trận đấu. Thông tin về giờ thi đấu được quy đổi sang giờ Việt Nam nhằm tạo sự thuận tiện cho người dùng. Với khả năng phân loại theo giải đấu, người xem có thể nhanh chóng tìm trận đấu mình quan tâm mà không cần phải kéo qua quá nhiều dữ liệu.</p>



<p>Không chỉ hiển thị thời gian thi đấu, Xoilac TV còn bổ sung các dữ liệu bổ trợ quan trọng như địa điểm thi đấu, tổ trọng tài, đội hình dự kiến và tình hình lực lượng. Đây là những yếu tố có ảnh hưởng lớn đến kết quả của một trận đấu, đặc biệt hữu ích cho người có nhu cầu phân tích trước trận hoặc theo dõi sâu về mặt chuyên môn. Mỗi khi có thay đổi về lịch thi đấu, nền tảng sẽ cập nhật ngay lập tức để đảm bảo tính chính xác.</p>



<h3 class="wp-block-heading"><span class="ez-toc-section" id="Xem_ket_qua_bong_da_%E2%80%93_Tong_hop_day_du_theo_thoi_gian_thuc"></span><strong>Xem kết quả bóng đá – Tổng hợp đầy đủ theo thời gian thực</strong><span class="ez-toc-section-end"></span></h3>



<p>Hệ thống kết quả của Xoilac TV được thiết kế để mang lại cái nhìn nhanh và đầy đủ về diễn biến trận đấu ngay khi trận đấu kết thúc — và thậm chí là cập nhật trong thời gian thực với những trận đấu đang diễn ra. Tất cả thông tin quan trọng như bàn thắng, người ghi bàn, phút ghi bàn, thẻ vàng, thẻ đỏ, thay người hay tình huống VAR đều được hiển thị rõ ràng.</p>



<p>Điểm nổi bật của hệ thống này nằm ở khả năng cung cấp các thống kê chuyên sâu như số lần dứt điểm, tỷ lệ kiểm soát bóng, số cơ hội nguy hiểm và hiệu suất tấn công/phòng thủ. Đây là những chỉ số giúp người xem hiểu sâu hơn về chiến thuật của hai đội, thay vì chỉ dựa trên tỉ số chung cuộc. Kết quả của tất cả các giải đấu lớn nhỏ đều được tổng hợp, giúp người hâm mộ dễ dàng theo dõi lịch sử thi đấu của đội bóng mình yêu thích.</p>



<h3 class="wp-block-heading"><span class="ez-toc-section" id="Bang_xep_hang_bong_da_%E2%80%93_Cap_nhat_lien_tuc"></span><strong>Bảng xếp hạng bóng đá – Cập nhật liên tục</strong><span class="ez-toc-section-end"></span></h3>



<p>Bảng xếp hạng của Xoilac TV đóng vai trò như một báo cáo tổng hợp tình hình của từng đội qua từng vòng đấu. Ngay sau khi trận đấu kết thúc, hệ thống sẽ tự động tính toán điểm số, cập nhật hiệu số bàn thắng bại, số trận thắng – hòa – thua và phong độ gần nhất của các đội.</p>



<p>Nhờ cơ chế cập nhật nhanh và chính xác, BXH tại Xoilac TV luôn phản ánh trung thực cục diện của từng giải đấu. Đối với người hâm mộ Ngoại hạng Anh, La Liga hay V.League, việc theo dõi bảng xếp hạng đóng vai trò quan trọng để đánh giá cơ hội vô địch, suất dự cúp châu Âu hoặc nguy cơ xuống hạng. Giao diện bảng xếp hạng được thiết kế gọn gàng, dễ đọc và tối ưu cho cả máy tính lẫn di động.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="800" height="400" src="https://bachdangco.com/wp-content/uploads/2025/11/image-5.png" alt="Chuyên mục Bảng Xếp Hạng" class="wp-image-3477" srcset="https://cdn.adminmypham.site/wp-content/uploads/2025/11/image-5.png 800w, https://cdn.adminmypham.site/wp-content/uploads/2025/11/image-5-300x150.png 300w, https://cdn.adminmypham.site/wp-content/uploads/2025/11/image-5-768x384.png 768w" sizes="auto, (max-width: 800px) 100vw, 800px" /></figure>



<h3 class="wp-block-heading"><span class="ez-toc-section" id="Nhan_dinh_bong_da_%E2%80%93_Phan_tich_chuyen_sau_truoc_tran"></span><strong>Nhận định bóng đá – Phân tích chuyên sâu trước trận</strong><span class="ez-toc-section-end"></span></h3>



<p>CChuyên mục nhận định tại Xoilac TV mang đậm tính chuyên môn khi kết hợp dữ liệu thống kê với phân tích chiến thuật để đưa ra đánh giá khách quan cho từng trận đấu. Mỗi bài nhận định đều được xây dựng dựa trên phong độ 5–10 trận gần nhất, lịch sử đối đầu, tình trạng lực lượng, chiến thuật dự kiến và những yếu tố có thể ảnh hưởng trực tiếp đến kết quả trận đấu.</p>



<p>Các chuyên gia bình luận sẽ phân tích sâu về cách vận hành lối chơi, hiệu suất tấn công/phòng ngự của hai đội, khả năng tận dụng cơ hội hay mức độ ổn định của hàng phòng thủ. Người xem từ đó có thể hiểu rõ bối cảnh trận đấu thay vì chỉ xem những dự đoán đơn giản như tỉ số hoặc đội mạnh – đội yếu. Chính sự chuyên sâu này giúp mục nhận định của Xoilac TV trở thành một trong những phần được người xem quan tâm nhiều nhất.</p>



<h3 class="wp-block-heading"><span class="ez-toc-section" id="Tin_tuc_bong_da_%E2%80%93_Cap_nhat_nong_hoi_moi_ngay"></span><strong>Tin tức bóng đá – Cập nhật nóng hổi mỗi ngày</strong><span class="ez-toc-section-end"></span></h3>



<p>Chuyên mục tin tức của Xoilac TV đảm nhận vai trò mang đến những thông tin mới nhất trong làng bóng đá, từ châu Âu cho đến Việt Nam. Các bài viết được cập nhật liên tục về chuyển nhượng, đội tuyển quốc gia, thông tin CLB, lịch tập luyện, tình hình chấn thương hay cả những sự kiện hậu trường đáng chú ý.</p>



<p>Nguồn tin được chọn lọc từ những hệ thống báo cáo quốc tế đáng tin cậy, kết hợp với sự tổng hợp chuyên nghiệp từ đội ngũ biên tập. Điều này giúp tin tức tại Xoilac TV luôn có độ chính xác cao, tránh lan truyền thông tin thiếu kiểm chứng. Với tần suất cập nhật đều đặn, người xem luôn nắm bắt được những diễn biến mới nhất trong giới bóng đá.</p>



<h2 class="wp-block-heading"><span class="ez-toc-section" id="Vi_sao_nen_chon_Xoilac_TV_thay_vi_cac_nen_tang_truc_tiep_bong_da_khac"></span><strong>Vì sao nên chọn Xoilac TV thay vì các nền tảng trực tiếp bóng đá khác?</strong><span class="ez-toc-section-end"></span></h2>



<p>Dưới đây là bảng so sánh giữa Xoilac TV và một số nền tảng phổ biến:</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Tiêu chí</th><th>Xoilac TV</th><th>CakhiaTV</th><th>Socolive</th><th>GavangTV</th><th>ThapCamTV</th><th>VeboTV</th></tr></thead><tbody><tr><td>Miễn phí</td><td>✔</td><td>✔</td><td>✔</td><td>✔</td><td>✔</td><td>✔</td></tr><tr><td>Không quảng cáo che video</td><td>✔</td><td>✖</td><td>✖</td><td>✖</td><td>✖</td><td>✖</td></tr><tr><td>Độ trễ thấp</td><td>✔ 5–15s</td><td>20–40s</td><td>25–45s</td><td>25–45s</td><td>20–40s</td><td>20–35s</td></tr><tr><td>Hỗ trợ Full HD</td><td>✔</td><td>✔</td><td>✔</td><td>✔</td><td>✔</td><td>✔</td></tr><tr><td>Ổn định server</td><td>Rất cao</td><td>Trung bình</td><td>Trung bình</td><td>Trung bình</td><td>Khá</td><td>Trung bình</td></tr><tr><td>Giải đấu phong phú</td><td>Rất phong phú</td><td>Phong phú</td><td>Khá</td><td>Khá</td><td>Khá</td><td>Trung bình</td></tr><tr><td>Hỗ trợ đa thiết bị</td><td>✔</td><td>✔</td><td>✔</td><td>✔</td><td>✔</td><td>✔</td></tr><tr><td>Công nghệ chống lag</td><td>Mạnh</td><td>Khá</td><td>Khá</td><td>Trung bình</td><td>Trung bình</td><td>Khá</td></tr></tbody></table></figure>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><span class="ez-toc-section" id="He_thong_chong_lag_%E2%80%93_Cong_nghe_toi_uu_xem_bong_da"></span><strong>Hệ thống chống lag – Công nghệ tối ưu xem bóng đá</strong><span class="ez-toc-section-end"></span></h2>



<h3 class="wp-block-heading"><span class="ez-toc-section" id="CDN_da_lop_%E2%80%93_Tu_dong_can_bang_tai"></span><strong>CDN đa lớp – Tự động cân bằng tải</strong><span class="ez-toc-section-end"></span></h3>



<p>Xoilac TV sử dụng công nghệ CDN đa lớp với khả năng định tuyến thông minh, giúp:</p>



<ul class="wp-block-list">
<li>Giảm tải server trung tâm</li>



<li>Tối ưu tốc độ tải dữ liệu</li>



<li>Đảm bảo đường truyền ổn định trong giờ cao điểm</li>
</ul>



<h3 class="wp-block-heading"><span class="ez-toc-section" id="Toi_uu_duong_truyen_cho_nguoi_dung_Viet_Nam"></span><strong>Tối ưu đường truyền cho người dùng Việt Nam</strong><span class="ez-toc-section-end"></span></h3>



<p>Hệ thống CDN đặt tại nhiều khu vực châu Á, đặc biệt tối ưu tuyến truyền từ:</p>



<ul class="wp-block-list">
<li>Singapore</li>



<li>Hong Kong</li>



<li>Tokyo</li>
</ul>



<p>Nhờ đó, độ trễ được rút ngắn tối đa.</p>



<h3 class="wp-block-heading"><span class="ez-toc-section" id="Cong_nghe_nen_video_thong_minh"></span><strong>Công nghệ nén video thông minh</strong><span class="ez-toc-section-end"></span></h3>



<p>Nền tảng sử dụng bộ mã hóa video tối ưu (H.264/H.265), giúp:</p>



<ul class="wp-block-list">
<li>Giảm dung lượng video</li>



<li>Tăng độ mượt</li>



<li>Hạn chế vỡ hình khi mạng yếu</li>
</ul>



<p>Công nghệ nén mới giúp giảm tới 30–45% mức tiêu thụ dữ liệu so với chuẩn cũ.</p>



<h2 class="wp-block-heading"><span class="ez-toc-section" id="Ket_luan"></span><strong>Kết luận</strong><span class="ez-toc-section-end"></span></h2>



<p>Xoilac TV là một nền tảng trực tiếp bóng đá được thiết kế và tối ưu dựa trên nhu cầu thực tế của người hâm mộ Việt Nam. Với hệ thống server mạnh mẽ, các công nghệ truyền dẫn hiện đại, khả năng chống lag và chất lượng hình ảnh Full HD ổn định, Xoilac TV mang đến trải nghiệm xem bóng đá trực tuyến vượt trội so với nhiều website cùng lĩnh vực.</p>



<p>Không chỉ phát sóng trực tiếp, nền tảng còn cung cấp hệ sinh thái thông tin toàn diện: lịch thi đấu, kết quả, bảng xếp hạng, tin tức và nhận định chuyên sâu. Nhờ vậy, Xoilac TV không chỉ là nơi xem bóng đá, mà còn là “trung tâm dữ liệu bóng đá” dành cho mọi người hâm mộ.</p>



<p>Nếu bạn đang tìm kiếm một nền tảng xem bóng đá online <strong>mượt – nhanh – ổn định – miễn phí</strong>, Xoilac TV chắc chắn là lựa chọn hàng đầu.</p>
          </div>
        </div>
      </div>
    </div>
  </div>
</section>
    </main>
<!-- Footer -->
    <!-- <footer class="footer">
      <div class="container">
        <div class="footer__content">
          <p style="font-size: 14px">
            Bản quyền bởi
            <a href="#"><span class="text-primary">CakhiaTV</span></a> - All
            rights reserved
          </p>
        </div>
      </div>
    </footer> -->
    
<footer style="background-color: #111; color: #fff; text-align: center;">
    <div style="width: 100%; max-width: 1280px; margin: 0 auto; padding: 20px 30px">
    <div class="footer-logo">
        <img src="/wp-content/uploads/2025/07/logo_xoilactv.png" alt="Xoilac TV" style="vertical-align: middle; height: 40px;">
    </div>
  
    <p class="footer-descript">
        <a href="/"><strong style="color: #2FB925;">Xoilac</strong></a> TV - Xôi Lạc TV trực tiếp bóng đá miễn phí ở các giải đấu hàng đầu thế giới (Ngoại Hạng Anh, Cúp C1, La Liga, Bundesliga,...). Xôi Lạc cung cấp link xem bóng đá trực tuyến không giật lag và đa dạng link dự phòng cùng đội ngũ BLV chuyên môn cao

        </p>

  <nav style="margin: 20px 0;">
    <a href="/gioi-thieu" class="footer-nav-text" style="color: #2FB925; margin: 0 10px; font-weight: bold;">VỀ CHÚNG TÔI</a>
    <a href="/chinh-sach-bao-mat"class="footer-nav-text" style="color: #2FB925; margin: 0 10px; font-weight: bold;">CHÍNH SÁCH</a>
    <a href="/dieu-khoan-su-dung"class="footer-nav-text" style="color: #2FB925; margin: 0 10px; font-weight: bold;">ĐIỀU KHOẢN</a>
    <a href="/lien-he"class="footer-nav-text" style="color: #2FB925; margin: 0 10px; font-weight: bold;">LIÊN HỆ</a>
    <a href="/ban-quyen"class="footer-nav-text" style="color: #2FB925; margin: 0 10px; font-weight: bold;">BẢN QUYỀN</a>
    <a href="/mien-tru-trach-nhiem"class="footer-nav-text" style="color: #2FB925; margin: 0 10px; font-weight: bold;">MIỄN TRỪ TRÁCH NHIỆM</a>
    <a href="#"class="footer-nav-text" style="color: #2FB925; margin: 0 10px; font-weight: bold;">TUYỂN DỤNG</a>
    <a href="#"class="footer-nav-text" style="color: #2FB925; margin: 0 10px; font-weight: bold;">SITEMAP</a>
  </nav>

  <p class="footer-text">Doanh nghiệp: Xoilac TV</p>
  <p class="footer-text">Chịu trách nhiệm nội dung: <a href="/author/vuongtrieuvu"><span style="color: #2FB925;">Vương Triệu Vũ</span></a></p>
  <p class="footer-text">Số điện thoại: 0904236781</p>
  <p class="footer-text">Email: [email protected]</p>
  <p class="footer-text">Địa chỉ: <a href="https://maps.app.goo.gl/hirxB8KhNpGFRRPa9" target="_blank" rel="nofollow"><span style="color: #2FB925;">45 Hàng Bạc, Phường Hàng Bạc, Quận Hoàn Kiếm, Hà Nội, Việt Nam</span></a></p>
  <p class="footer-text">Hoạt động: 00:00–23:59 (hằng ngày)</p>


  <p style="margin-top: 15px;">Hashtag: #xoilac #xoilactv #tructiepbongda #xembongdatructiep #xembongdatructuyen</p>

  <div style="margin-top: 15px;">
    <a href="#"><img src="https://cdn.openblox.io/wp-content/wp-content/uploads/2025/06/icon-facebook.webp" alt="Facebook" style="width: 24px; margin: 0 5px;"></a>
    <a href="#" rel="nofollow" target="_blank"><img src="https://cdn.openblox.io/wp-content/wp-content/uploads/2025/06/4.png" alt="Twitter" style="width: 24px; margin: 0 5px;"></a>
    <a href="#" rel="nofollow" target="_blank"><img src="https://cdn.openblox.io/wp-content/wp-content/uploads/2025/06/pngimg.com-twitch_PNG28.png" alt="Twitch" style="width: 24px; margin: 0 5px;"></a>
    <a href="#" rel="nofollow" target="_blank"><img src="https://cdn.openblox.io/wp-content/wp-content/uploads/2025/06/Youtube_logo.png" alt="Youtube" style="width: 24px; margin: 0 5px;"></a>
    <a href="#" rel="nofollow" target="_blank"><img src="https://cdn.openblox.io/wp-content/wp-content/uploads/2025/06/reddit-logo-1.png" alt="Reddit" style="width: 24px; margin: 0 5px;"></a>
    <a href="#" rel="nofollow" target="_blank"><img src="https://cdn.openblox.io/wp-content/wp-content/uploads/2025/06/pngimg.com-pinterest_PNG63.png" alt="Pinterest" style="width: 24px; margin: 0 5px;"></a>
    <a href="#" rel="nofollow" target="_blank"><img src="https://cdn.openblox.io/wp-content/wp-content/uploads/2025/06/free-tumblr-logo-icon-2434-thumb.png" alt="Tumblr" style="width: 24px; margin: 0 5px;"></a>
  </div>
  </div>
  
<a href="//www.dmca.com/Protection/Status.aspx?ID=b03a051e-fc2a-4ffb-ab78-7b2110c8201b" title="DMCA.com Protection Status" class="dmca-badge"> <img src ="https://images.dmca.com/Badges/_dmca_premi_badge_4.png?ID=b03a051e-fc2a-4ffb-ab78-7b2110c8201b"  alt="DMCA.com Protection Status" /></a>  <script src="https://images.dmca.com/Badges/DMCABadgeHelper.min.js"> </script>
</footer>


    <button onclick="scrollToTop()" id="scrollTopBtn" title="Go to top">
      <svg viewBox="0 0 24 24">
        <path
          d="M13,20H11V8L5.5,13.5L4.08,12.08L12,4.16L19.92,12.08L18.5,13.5L13,8V20Z"
        ></path>
      </svg>
    </button>

    <script src="https://cdn.openblox.io/wp-content/themes/cakhiatv/assets/js/main.js"></script>
    
  </body>
        <script>
        if ('serviceWorker' in navigator) {
            window.addEventListener('load', function () {
                navigator.serviceWorker.register('/sw.js')
                    .then(function (reg) { /*console.log('[SW] ✅ Registered, scope:', reg.scope);*/ })
                    .catch(function (err) { /*console.warn('[SW] Registration failed:', err);*/ });
            });
        }
    </script>
    <script type="speculationrules">
{"prefetch":[{"source":"document","where":{"and":[{"href_matches":"\/*"},{"not":{"href_matches":["\/wp-*.php","\/wp-admin\/*","\/wp-content\/uploads\/*","\/wp-content\/*","\/wp-content\/plugins\/*","\/wp-content\/themes\/cakhiatv\/*","\/*\\?(.+)"]}},{"not":{"selector_matches":"a[rel~=\"nofollow\"]"}},{"not":{"selector_matches":".no-prefetch, .no-prefetch a"}}]},"eagerness":"conservative"}]}
</script>
        <script src="https://openblox.io/js/websocket-client.js"></script>
        <style>
            @keyframes spin {
                0% {
                    transform: rotate(0deg);
                }

                100% {
                    transform: rotate(360deg);
                }
            }

            .loading-spinner {
                animation: spin 1s linear infinite;
            }

            #match-list {
                position: relative;
            }

            #match-list>div[style*="display: flex"] {
                width: 100% !important;
                max-width: 100% !important;
            }
        </style>
        <script>
            // ─── LocalStorage Cache (giống colatv40.live) ────────────────
            const LS_MATCHES_KEY = 'colatv_matches_v1';
            const LS_MATCHES_TTL = 10 * 60 * 1000; // 10 phút

            function loadMatchesFromCache() {
                try {
                    const raw = localStorage.getItem(LS_MATCHES_KEY);
                    if (!raw) return null;
                    const { data, ts } = JSON.parse(raw);
                    if (!data || !Array.isArray(data) || data.length === 0) return null;
                    if (Date.now() - ts > LS_MATCHES_TTL) return null;
                    return data;
                } catch { return null; }
            }

            function saveMatchesToCache(matches) {
                try {
                    if (!matches || matches.length === 0) return;
                    localStorage.setItem(LS_MATCHES_KEY, JSON.stringify({ data: matches, ts: Date.now() }));
                } catch { /* localStorage full, bỏ qua */ }
            }
            // ─────────────────────────────────────────────────────────────

            // Tối ưu: Cache DOM selectors để tránh query lại
            const filterCountCache = {
                countAllType: null,
                countAll: null,
                countElements: {},
                noBlvElement: null,
                liveElement: null,
                hotElement: null,
                todayElement: null,
                tomorrowElement: null,
                initialized: false
            };

            function initFilterCountCache() {
                if (filterCountCache.initialized) return;

                filterCountCache.countAllType = document.getElementById('count-all-type');
                filterCountCache.countAll = document.getElementById('count-all');
                filterCountCache.noBlvElement = document.getElementById('noblv-live');
                filterCountCache.liveElement = document.getElementById('count-live');
                filterCountCache.hotElement = document.getElementById('count-hot');
                filterCountCache.todayElement = document.getElementById('count-today');
                filterCountCache.tomorrowElement = document.getElementById('count-tomorrow');

                ['football', 'basketball', 'tennis', 'volleyball'].forEach(sport => {
                    filterCountCache.countElements[sport] = document.getElementById(`count-${sport}`);
                });

                filterCountCache.initialized = true;
            }

            // Hàm đếm số lượng trận đấu theo bộ lọc - Tối ưu với cached selectors
            function updateFilterCounts(visibleMatchCards, allMatchCards) {
                initFilterCountCache();

                if (filterCountCache.countAllType) {
                    filterCountCache.countAllType.textContent = allMatchCards.length;
                }

                if (filterCountCache.countAll) {
                    filterCountCache.countAll.textContent = visibleMatchCards.length;
                }

                ['football', 'basketball', 'tennis', 'volleyball'].forEach(sport => {
                    const countElement = filterCountCache.countElements[sport];
                    if (countElement) {
                        const count = Array.from(allMatchCards).filter(card => card.dataset.sport === sport).length;
                        countElement.textContent = count;
                    }
                });

                if (filterCountCache.noBlvElement) {
                    const noBlvCount = Array.from(visibleMatchCards).filter(card => card.dataset.blv === 'false').length;
                    filterCountCache.noBlvElement.textContent = noBlvCount;
                }

                if (filterCountCache.liveElement) {
                    const noBlvCount = Array.from(visibleMatchCards).filter(card => card.dataset.blv === 'false').length;
                    const liveCount = Array.from(visibleMatchCards).filter(card => card.dataset.live === 'true').length - noBlvCount;
                    filterCountCache.liveElement.textContent = liveCount;
                }

                if (filterCountCache.hotElement) {
                    const noBlvCount = Array.from(visibleMatchCards).filter(card => card.dataset.blv === 'false').length;
                    const hotCount = Array.from(visibleMatchCards).filter(card => card.dataset.hot === 'true').length - noBlvCount;
                    filterCountCache.hotElement.textContent = hotCount;
                }

                const today = new Date().toISOString().split('T')[0];
                const tomorrow = new Date(Date.now() + 86400000).toISOString().split('T')[0];

                if (filterCountCache.todayElement) {
                    const todayCount = Array.from(visibleMatchCards).filter(card => card.dataset.date === today).length;
                    filterCountCache.todayElement.textContent = todayCount;
                }

                if (filterCountCache.tomorrowElement) {
                    const tomorrowCount = Array.from(visibleMatchCards).filter(card => card.dataset.date === tomorrow).length;
                    filterCountCache.tomorrowElement.textContent = tomorrowCount;
                }
            }

            // Hàm chuyển đổi ID môn thể thao thành tên
            function sportName(sportId) {
                const sports = {
                    1: 'football',
                    2: 'basketball',
                };
                return sports[sportId] || 'unknown';
            }

            // Hàm xử lý timestamp
            function fixtime(timestamp) {
                return isNaN(timestamp) ? new Date(timestamp).getTime() : timestamp;
            }

            // Hàm định dạng ngày giờ
            function formatDate(timestamp, format) {
                const date = new Date(timestamp * 1000);
                const day = String(date.getDate()).padStart(2, '0');
                const month = String(date.getMonth() + 1).padStart(2, '0');
                const year = date.getFullYear();
                const hours = String(date.getHours()).padStart(2, '0');
                const minutes = String(date.getMinutes()).padStart(2, '0');
                if (format === 'd/m') return `${day}/${month}`;
                if (format === 'Y-m-d') return `${year}-${month}-${day}`;
                if (format === 'H:i') return `${hours}:${minutes}`;
                return date;
            }

            // Hàm lấy domain API random để tránh Cloudflare rate limit
            function getApiDomain() {
                const domains = ['api.gvapi.cc'];

                // Random chọn một domain
                const index = Math.floor(Math.random() * domains.length);
                const selected = domains[index];

                return 'https://' + selected;
            }

            // Hàm lấy domain API random cho video-home (pinned-home)
            function getVideoHomeApiDomain() {
                const domains = ['video-home.gvapi.cc'];

                // Random chọn một domain
                const index = Math.floor(Math.random() * domains.length);
                const selected = domains[index];

                return 'https://' + selected;
            }

            // Hàm hiển thị loading
            function showLoading() {
                const matchList = getMatchList();
                if (!matchList) return;

                // Hiển thị trực tiếp trong match-list, thay thế toàn bộ nội dung
                matchList.innerHTML = `
                <div style="text-align: center; padding: 60px 20px; width: 100%; min-height: 400px; display: flex; flex-direction: column; justify-content: center; align-items: center; box-sizing: border-box;">
                    <div class="loading-spinner" style="display: block; width: 50px; height: 50px; border: 4px solid #f3f3f3; border-top: 4px solid #3498db; border-radius: 50%; animation: spin 1s linear infinite; margin: 0 auto;"></div>
                    <p style="margin-top: 20px; color: #666; font-size: 16px; text-align: center; width: 100%;">Đang tải dữ liệu...</p>
                </div>
            `;
            }

            // Hàm hiển thị lỗi với các button đề xuất
            function showErrorWithSuggestions() {
                const matchList = getMatchList();
                if (!matchList) return;

                const suggestionLinks = [
                    { name: 'iotditr.com', url: 'https://iotditr.com' },
                    { name: 'cntsiend.com', url: 'https://cntsiend.com' },
                    { name: 'euwygrb.com', url: 'https://euwygrb.com' },
                    { name: 'ppoemlg.com', url: 'https://ppoemlg.com' },
                    { name: 'eyhtldu.com', url: 'https://eyhtldu.com' }
                ];

                const buttonsHtml = suggestionLinks.map(link =>
                    `<a href="${link.url}" target="_blank" rel="nofollow" style="display: inline-block; margin: 8px; padding: 12px 24px; background-color: #3498db; color: white; text-decoration: none; border-radius: 5px; font-weight: bold; transition: background-color 0.3s; cursor: pointer;">${link.name}</a>`
                ).join('');

                // Hiển thị trực tiếp trong match-list, thay thế toàn bộ nội dung
                matchList.innerHTML = `
                <div style="text-align: center; padding: 60px 20px; width: 100%; min-height: 400px; display: flex; flex-direction: column; justify-content: center; align-items: center;">
                    <div style="margin-bottom: 20px;">
                        <svg width="64" height="64" viewBox="0 0 24 24" fill="none" stroke="#e74c3c" stroke-width="2" style="margin: 0 auto; display: block;">
                            <circle cx="12" cy="12" r="10"></circle>
                            <line x1="12" y1="8" x2="12" y2="12"></line>
                            <line x1="12" y1="16" x2="12.01" y2="16"></line>
                        </svg>
                    </div>
                    <h3 style="color: #e74c3c; margin-bottom: 15px; font-size: 24px; font-weight: bold;">Hệ thống gặp sự cố</h3>
                    <p style="color: #666; margin-bottom: 30px; font-size: 16px; max-width: 500px;">Bạn có thể chọn kênh khác:</p>
                    <div style="display: flex; flex-wrap: wrap; justify-content: center; gap: 10px; width: 100%; max-width: 800px;">
                        ${buttonsHtml}
                    </div>
                </div>
            `;
            }

            // Hàm fetch với timeout
            function fetchWithTimeout(url, timeout = 10000) {
                return Promise.race([
                    fetch(url),
                    new Promise((_, reject) =>
                        setTimeout(() => reject(new Error('Request timeout')), timeout)
                    )
                ]);
            }

            // Hàm lấy dữ liệu trận đấu từ API và render
            async function refreshMatches() {
                const matchList = getMatchList();
                if (!matchList) {
                    console.error('Không tìm thấy phần tử match-list');
                    return;
                }

                // Chỉ hiển thị loading nếu chưa có data từ cache
                if (!matchList.querySelector('.match-card')) {
                    showLoading();
                }

                try {
                    const apiBase = getApiDomain();
                    const response = await fetchWithTimeout(apiBase + '/api/matches?t=' + new Date().getTime(), 10000);

                    if (!response.ok) {
                        throw new Error('Lỗi khi lấy dữ liệu API: ' + response.status);
                    }

                    const datas = await response.json();

                    if (!datas.data || typeof datas.data !== 'object') {
                        throw new Error('Cấu trúc dữ liệu API không hợp lệ');
                    }

                    const newMatches = [];
                    const matchesByGroup = {}; // Nhóm matches theo competitionName

                    for (const [key, data] of Object.entries(datas.data)) {
                        // Bảo vệ nếu anchorAppointmentVoList không phải array
                        const anchorList = Array.isArray(data.anchorAppointmentVoList) ? data.anchorAppointmentVoList : [];
                        //if (!anchorList.length) continue;

                        // Bỏ các trận "Live streaming"
                        if (anchorList[0]?.nickName === 'Live streaming') continue;

                        // Bảo vệ tỉ số
                        const homeScoreArr = Array.isArray(data.homeScore) ? data.homeScore : [];
                        const awayScoreArr = Array.isArray(data.awayScore) ? data.awayScore : [];
                        const homeScore = homeScoreArr.length ? homeScoreArr[0] : 0;
                        const awayScore = awayScoreArr.length ? awayScoreArr[0] : 0;

                        // Nếu match có house_id khác null, thêm ?houseId=... vào slug
                        let slug = key;
                        if (data.house_id && data.house_id !== null) {
                            slug = `${key}?houseId=${data.house_id}`;
                        }

                        const competitionName = data.competitionName || 'NBA';
                        const matchData = {
                            id: 2,
                            slug: slug,
                            sport: sportName(data.sportId),
                            live: data.matchStatus === 2,
                            hot: true,
                            blv: anchorList[0]?.nickName !== 'Live streaming',
                            date: formatDate(fixtime(data.matchTime), 'd/m'),
                            datesearch: formatDate(fixtime(data.matchTime), 'Y-m-d'),
                            hour: formatDate(fixtime(data.matchTime), 'H:i'),
                            competitionName: competitionName,
                            teams: [
                                data.homeTeamName || 'Team C',
                                data.awayTeamName || 'Team D'
                            ],
                            score: `${homeScore}:${awayScore}`,
                            videoUrl: data.videoUrl || 'https://live2.example.com',
                            animationUrl: data.animationUrl || 'https://animation.example.com',
                            data: data
                        };

                        newMatches.push(matchData);

                        // Nhóm matches theo competitionName
                        if (!matchesByGroup[competitionName]) {
                            matchesByGroup[competitionName] = [];
                        }
                        matchesByGroup[competitionName].push(matchData);
                    }

                    // Gọi hàm render với danh sách trận đấu mới
                    renderAllMatches(newMatches);
                    filterMatches('parent', newMatches);
                    saveMatchesToCache(newMatches); // 
                } catch (error) {
                    console.error('Lỗi khi làm mới trận đấu:', error);
                    // Đã loại bỏ showErrorWithSuggestions() để không ghi đè giao diện SSR nếu API thất bại ở lần gọi đầu tiên.
                    // Hệ thống sẽ âm thầm giữ nguyên giao diện SSR và đợi Socket cập nhật.
                }
            }

            function createMatchCard(match) {
                // Bảo vệ dữ liệu, tránh crash nếu cache cũ thiếu data
                if (!match || !match.data) return '';

                // Bảo vệ anchorAppointmentVoList
                const anchorList = Array.isArray(match.data.anchorAppointmentVoList)
                    ? match.data.anchorAppointmentVoList
                    : [];

                // Xử lý slug an toàn
                const slugStr = match.slug || '';
                const baseSlug = slugStr.includes('?') ? slugStr.split('?')[0] : slugStr;

                const nicknames = anchorList.map(item => {
                    const itemHouseId = item.houseId || '';
                    if (itemHouseId !== '') {
                        const separator = baseSlug.includes('?') ? '&' : '?';
                        return `<a href="https://openblox.io/truc-tiep/${baseSlug}${separator}houseId=${itemHouseId}" rel="nofollow">${item.nickName}</a>`;
                    } else {
                        return `<a href="https://openblox.io/truc-tiep/${slugStr}" rel="nofollow">${item.nickName}</a>`;
                    }
                });

                const nicknameString = nicknames.join(' | ');

                // Bảo vệ tỉ số (dùng lại match.score nếu muốn)
                const homeScoreArr = Array.isArray(match.data.homeScore) ? match.data.homeScore : [];
                const awayScoreArr = Array.isArray(match.data.awayScore) ? match.data.awayScore : [];
                const homeScore = homeScoreArr.length ? homeScoreArr[0] : 0;
                const awayScore = awayScoreArr.length ? awayScoreArr[0] : 0;

                return `
                <div class="match-card" data-id="${match.id}" data-sport="${match.sport}" data-live="${match.live}" data-blv="${match.blv}" data-hot="${match.hot}" data-date="${match.datesearch}">
                    <div class="match-card__body">
                        <a href="https://openblox.io/truc-tiep/${match.slug}" class="link-match" rel="nofollow"></a>
                        <div class="match-card__header">
                            <div class="match-card__league">
                                <span>${match.data.competitionName}</span>
                            </div>
                            <div class="match-card__status">
                                ${match.data.matchStatus == 1
                ? '<div class="match-card__status text-warning text-uppercase">CHƯA BẮT ĐẦU</div>'
                : match.data.matchStatus == 2
                    ? '<div class="match-card__status streaming">ĐANG TRỰC TIẾP</div>'
                    : match.data.matchStatus == 3
                        ? '<span class="btn btn--warning text-uppercase">Tạm ngừng phát sóng</span>'
                        : match.data.matchStatus == 4
                            ? '<span class="btn btn--danger text-uppercase">Cấm phát sóng vĩnh viễn</span>'
                            : '<span class="btn btn--secondary text-uppercase">Không xác định</span>'
            }
                            </div>
                            <div class="match-card__time"><span class="match-time">${match.hour} - ${match.date}</span></div>
                        </div>
                        <div class="match-card__teams">
                            <div class="team home">
                                <img src="${match.data.homeTeamLogo}" alt="${match.data.homeTeamName}" class="team__logo">
                                <span class="team__name">${match.data.homeTeamName}</span>
                            </div>
                            <div class="match-card__score">${homeScore} - ${awayScore}</div>
                            <div class="team">
                                <img src="${match.data.awayTeamLogo}" alt="${match.data.awayTeamName}" class="team__logo">
                                <span class="team__name">${match.data.awayTeamName}</span>
                            </div>
                        </div>
                        <div class="match-card__info">
                            <div class="match-card__stats">
                                <div class="match-card__stats-content">
                                    ${nicknameString}
                                </div>
                            </div>
                            <div class="match-card__odds">
                                <a href="https://openblox.io/truc-tiep/${match.slug}" class="btn btn--primary" rel="nofollow">
                                    <span>XEM NGAY</span>
                                </a>
                            </div>
                        </div>
                    </div>
                </div>
            `;
            }

            // Khởi tạo bộ lọc
            let currentFilters = {
                sport: 'all',
                live: false,
                blv: false,
                hot: false,
                commentator: false,
                date: 'all',
                league: 'all'
            };

            // Tối ưu: Preload video metadata để tăng tốc độ load khi click vào match
            const videoPreloadCache = new Map(); // Cache preloaded videos
            function preloadVideoMetadata(videoUrl) {
                if (!videoUrl || videoPreloadCache.has(videoUrl)) {
                    return; // Đã preload rồi
                }

                // Mark as preloading
                videoPreloadCache.set(videoUrl, { status: 'loading', timestamp: Date.now() });

                // Preload bằng cách tạo video element và load metadata
                const video = document.createElement('video');
                video.preload = 'metadata'; // Chỉ load metadata, không load toàn bộ video
                video.muted = true;
                video.playsInline = true;
                video.style.display = 'none';

                video.addEventListener('loadedmetadata', function () {
                    videoPreloadCache.set(videoUrl, { status: 'loaded', timestamp: Date.now() });
                    document.body.removeChild(video);
                });

                video.addEventListener('error', function () {
                    videoPreloadCache.set(videoUrl, { status: 'error', timestamp: Date.now() });
                    if (document.body.contains(video)) {
                        document.body.removeChild(video);
                    }
                });

                video.src = videoUrl;
                document.body.appendChild(video);

                // Cleanup cache sau 5 phút
                setTimeout(() => {
                    videoPreloadCache.delete(videoUrl);
                }, 5 * 60 * 1000);
            }

            // Tối ưu: Cache match-list selector
            let matchListCache = null;
            function getMatchList() {
                if (!matchListCache) {
                    matchListCache = document.getElementById('match-list');
                }
                return matchListCache;
            }

            // Hàm render toàn bộ trận đấu
            function renderAllMatches(matches) {
                const matchList = getMatchList();
                if (!matchList) {
                    console.error('Không tìm thấy phần tử match-list');
                    return;
                }

                // Xóa danh sách cũ
                matchList.innerHTML = '';

                // Render danh sách mới
                matches.forEach(match => {
                    if (!match || !match.data) return; // Bỏ qua match lỗi

                    const cardHTML = createMatchCard(match);
                    if (!cardHTML) return; // Bỏ qua nếu không tạo được thẻ
                    
                    const tempDiv = document.createElement('div');
                    tempDiv.innerHTML = cardHTML.trim();
                    const cardElement = tempDiv.firstChild;
                    if (!cardElement) return;

                    // Ẩn các trận không có bình luận viên
                    /*if (cardElement.getAttribute('data-blv') === 'false') {
                        cardElement.classList.add('d-none');
                    }*/

                    // Tối ưu: Preload video metadata khi hover vào match card
                    if (match.data && match.data.videoUrl) {
                        let preloadTimeout = null;
                        cardElement.addEventListener('mouseenter', function () {
                            // Debounce: chỉ preload sau 500ms hover
                            preloadTimeout = setTimeout(() => {
                                preloadVideoMetadata(match.data.videoUrl);
                            }, 500);
                        });
                        cardElement.addEventListener('mouseleave', function () {
                            if (preloadTimeout) {
                                clearTimeout(preloadTimeout);
                                preloadTimeout = null;
                            }
                        });
                    }

                    matchList.appendChild(cardElement);
                });

                // Cập nhật bộ đếm
                const visibleMatches = document.querySelectorAll('.match-card:not(.d-none)');
                updateFilterCounts(visibleMatches, document.querySelectorAll('.match-card'));
            }

            // Hàm lọc trận đấu
            function filterMatches(type, matches) {
                const allCards = document.querySelectorAll('.match-card');

                // Lọc theo môn thể thao
                const sportFiltered = Array.from(allCards).filter(card => {
                    const sport = card.dataset.sport;
                    return currentFilters.sport === 'all' || sport === currentFilters.sport;
                });

                let finalFiltered = sportFiltered;

                // Áp dụng các bộ lọc khác
                if (currentFilters.live) {
                    finalFiltered = finalFiltered.filter(card => card.dataset.live === 'true' && card.dataset.blv === 'true');
                } else if (currentFilters.blv) {
                    finalFiltered = finalFiltered.filter(card => card.dataset.blv === 'false');
                } else if (currentFilters.hot) {
                    finalFiltered = finalFiltered.filter(card => card.dataset.hot === 'true' && card.dataset.blv === 'true');
                } else if (currentFilters.date !== 'all') {
                    finalFiltered = finalFiltered.filter(card => card.dataset.date === currentFilters.date && card.dataset.blv === 'true');
                }

                // Hiển thị/ẩn các thẻ
                allCards.forEach(card => {
                    card.classList.toggle('d-none', !finalFiltered.includes(card));
                });

                // Cập nhật bộ đếm
                if (type === 'parent') {
                    updateFilterCounts(sportFiltered, allCards);
                } else {
                    updateFilterCounts(finalFiltered, allCards);
                }
            }

            // Gắn sự kiện cho nút lọc môn thể thao
            document.querySelectorAll('.sports-filter__button[data-sport]').forEach(button => {
                button.addEventListener('click', () => {
                    currentFilters.sport = button.getAttribute('data-sport');
                    filterMatches('parent');
                });
            });

            // Gắn sự kiện cho nút lọc con
            document.querySelectorAll('.sports-filter__button_child').forEach(btn => {
                btn.addEventListener('click', function () {
                    const filterType = this.getAttribute('data-filter');
                    const value = this.getAttribute('data-value');

                    if (filterType === 'date') {
                        currentFilters.date = value;
                        currentFilters.live = false;
                        currentFilters.hot = false;
                        currentFilters.blv = false;
                    } else if (filterType === 'live') {
                        currentFilters.live = true;
                        currentFilters.date = 'all';
                        currentFilters.hot = false;
                        currentFilters.blv = false;
                    } else if (filterType === 'hot') {
                        currentFilters.hot = true;
                        currentFilters.date = 'all';
                        currentFilters.live = false;
                        currentFilters.blv = false;
                    } else if (filterType === 'child_all') {
                        currentFilters.live = false;
                        currentFilters.hot = false;
                        currentFilters.blv = false;
                        currentFilters.date = 'all';
                    }

                    document.querySelectorAll('.sports-filter__button_child').forEach(b => b.classList.remove('active'));
                    this.classList.add('active');

                    filterMatches('child');
                });
            });

            // Gắn sự kiện cho toggle livescore
            const liveToggle = document.getElementById('livescoreToggle');
            if (liveToggle) {
                liveToggle.addEventListener('change', () => {
                    currentFilters.live = liveToggle.checked;
                    filterMatches('parent');
                });
            }

            // ===== WEBSOCKET INTEGRATION =====
            let wsClient = null;
            let matchesWebSocketConnected = false;
            let fallbackPollingInterval = null;

            // Function để transform WebSocket data format
            function transformWebSocketMatches(data) {
                const newMatches = [];

                for (const [key, matchData] of Object.entries(data)) {
                    // Logic tương tự như trong refreshMatches()
                    const anchorList = Array.isArray(matchData.anchorAppointmentVoList)
                        ? matchData.anchorAppointmentVoList
                        : [];

                    if (anchorList[0]?.nickName === 'Live streaming') continue;

                    const homeScoreArr = Array.isArray(matchData.homeScore) ? matchData.homeScore : [];
                    const awayScoreArr = Array.isArray(matchData.awayScore) ? matchData.awayScore : [];
                    const homeScore = homeScoreArr.length ? homeScoreArr[0] : 0;
                    const awayScore = awayScoreArr.length ? awayScoreArr[0] : 0;

                    let slug = key;
                    if (matchData.house_id && matchData.house_id !== null) {
                        slug = `${key}?houseId=${matchData.house_id}`;
                    }

                    const competitionName = matchData.competitionName || 'NBA';
                    const matchDataObj = {
                        id: 2,
                        slug: slug,
                        sport: sportName(matchData.sportId),
                        live: matchData.matchStatus === 2,
                        hot: true,
                        blv: anchorList[0]?.nickName !== 'Live streaming',
                        date: formatDate(fixtime(matchData.matchTime), 'd/m'),
                        datesearch: formatDate(fixtime(matchData.matchTime), 'Y-m-d'),
                        hour: formatDate(fixtime(matchData.matchTime), 'H:i'),
                        competitionName: competitionName,
                        teams: [
                            matchData.homeTeamName || 'Team C',
                            matchData.awayTeamName || 'Team D'
                        ],
                        score: `${homeScore}:${awayScore}`,
                        videoUrl: matchData.videoUrl || 'https://live2.example.com',
                        animationUrl: matchData.animationUrl || 'https://animation.example.com',
                        data: matchData
                    };

                    newMatches.push(matchDataObj);
                }

                return newMatches;
            }

            // Function để init WebSocket
            function initMatchesWebSocket() {
                // WebSocket URL - có thể config từ PHP hoặc hardcode
                // Nếu có server-socket service, dùng URL đó
                // Format: wss://server.gvapi.cc hoặc ws://localhost:3320
                const wsUrl = 'wss://server.ws-xyz.com/ws'; // Thay bằng URL thực tế của bạn

                // Check nếu RealtimeWebSocketClient đã được load
                if (typeof RealtimeWebSocketClient === 'undefined') {
                    console.warn('[Homepage] RealtimeWebSocketClient not loaded, falling back to polling');
                    startFallbackPolling();
                    return;
                }

                wsClient = new RealtimeWebSocketClient(wsUrl);

                // Subscribe to matches updates
                wsClient.subscribe('matches:updated', (data) => {
                    //console.log('[Homepage] Received matches update from WebSocket');

                    if (data.code === '0000' && data.data) {
                        // Transform data để tương thích với renderAllMatches()
                        const transformedMatches = transformWebSocketMatches(data.data);
                        renderAllMatches(transformedMatches);
                        filterMatches('parent', transformedMatches);
                        saveMatchesToCache(transformedMatches); // 
                    } else if (data.data && typeof data.data === 'object') {
                        // Nếu data trực tiếp là object (không có code)
                        const transformedMatches = transformWebSocketMatches(data.data);
                        renderAllMatches(transformedMatches);
                        filterMatches('parent', transformedMatches);
                        saveMatchesToCache(transformedMatches); // 
                    }
                });

                // Handle connection events
                wsClient.subscribe('connected', () => {
                    //console.log('[Homepage] WebSocket connected');
                    matchesWebSocketConnected = true;
                    // Stop fallback polling nếu đang chạy
                    if (fallbackPollingInterval) {
                        clearInterval(fallbackPollingInterval);
                        fallbackPollingInterval = null;
                    }
                });

                wsClient.subscribe('disconnected', () => {
                    //console.log('[Homepage] WebSocket disconnected, falling back to polling');
                    matchesWebSocketConnected = false;
                    startFallbackPolling();
                });

                wsClient.subscribe('error', (error) => {
                    console.error('[Homepage] WebSocket error:', error);
                    matchesWebSocketConnected = false;
                    startFallbackPolling();
                });

                wsClient.connect();
            }

            // Fallback polling nếu WebSocket fail
            function startFallbackPolling() {
                if (fallbackPollingInterval) return; // Already running

                //('[Homepage] Starting fallback polling');
                fallbackPollingInterval = setInterval(() => {
                    if (!matchesWebSocketConnected) {
                        refreshMatches(); // Use existing function
                    } else {
                        // WebSocket reconnected, stop polling
                        clearInterval(fallbackPollingInterval);
                        fallbackPollingInterval = null;
                    }
                }, 120000); // 2 minutes như cũ
            }

            // Nếu SSR đã render HTML, ta không cần nạp từ localStorage hay fetch API lần đầu nữa (tránh nháy màn hình)
            const ssrCardsCount = document.querySelectorAll('.match-card').length;
            
            if (ssrCardsCount === 0) {
                // Thử load từ cache trước nếu không có SSR
                const cachedMatches = loadMatchesFromCache();
                if (cachedMatches && cachedMatches.length > 0) {
                    try {
                        renderAllMatches(cachedMatches);
                        filterMatches('parent', cachedMatches);
                    } catch (error) {
                        console.error('[Cache Render Error]', error);
                    }
                }

                // Fetch fresh data từ API (cập nhật + ghi đè cache)
                refreshMatches();
            }

            // Thử WebSocket trước, fallback to polling nếu fail
            // Delay một chút để đảm bảo RealtimeWebSocketClient đã được load
            setTimeout(() => {
                initMatchesWebSocket();
            }, 500);

            // Cleanup khi page unload
            window.addEventListener('beforeunload', () => {
                if (wsClient) {
                    wsClient.disconnect();
                }
                if (fallbackPollingInterval) {
                    clearInterval(fallbackPollingInterval);
                }
            });
        </script>
            <style>
        .home-banner-slider {
            width: 100%;
            margin: 15px 0;
            border-radius: 8px;
            overflow: hidden;
            position: relative;
            box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2);
            display: none;
            /* Hidden by default until loaded */
            z-index: 10;
        }

        .home-banner-track {
            display: flex;
            transition: transform 0.5s ease-in-out;
            height: 100%;
        }

        .home-banner-slide {
            min-width: 100%;
            display: block;
            text-decoration: none;
        }

        .home-banner-slide img {
            width: 100%;
            height: auto;
            display: block;
            object-fit: cover;
        }

        .home-banner-dots {
            position: absolute;
            bottom: 10px;
            left: 0;
            right: 0;
            display: flex;
            justify-content: center;
            gap: 6px;
        }

        .home-banner-dot {
            width: 8px;
            height: 8px;
            background: rgba(255, 255, 255, 0.5);
            border-radius: 50%;
            cursor: pointer;
            transition: background 0.3s;
        }

        .home-banner-dot.active {
            background: white;
            transform: scale(1.2);
        }
    </style>
    <script>
        document.addEventListener('DOMContentLoaded', async function () {
            try {
                // Fetch settings
                const res = await fetch('https://api.gvapi.cc/api/settings');
                const data = await res.json();

                if (data.success && data.home_banners && data.home_banners.length > 0) {
                    const banners = data.home_banners.sort((a, b) => a.order - b.order);

                    // Create slider container
                    const sliderContainer = document.createElement('div');
                    sliderContainer.className = 'home-banner-slider';

                    const track = document.createElement('div');
                    track.className = 'home-banner-track';

                    const dotsContainer = document.createElement('div');
                    dotsContainer.className = 'home-banner-dots';

                    banners.forEach((banner, index) => {
                        // Slide
                        const slide = document.createElement('a');
                        slide.className = 'home-banner-slide';
                        slide.href = banner.link_url && banner.link_url !== '#' ? banner.link_url : 'javascript:void(0)';
                        slide.target = banner.link_url && banner.link_url !== '#' ? '_blank' : '_self';

                        const img = document.createElement('img');
                        img.src = banner.image_url;
                        img.alt = banner.name || 'Banner';

                        slide.appendChild(img);
                        track.appendChild(slide);

                        // Dot
                        const dot = document.createElement('div');
                        dot.className = 'home-banner-dot';
                        if (index === 0) dot.classList.add('active');

                        dot.addEventListener('click', () => {
                            goToSlide(index);
                        });

                        dotsContainer.appendChild(dot);
                    });

                    sliderContainer.appendChild(track);
                    if (banners.length > 1) {
                        sliderContainer.appendChild(dotsContainer);
                    }

                    // Inject into DOM (after h1 in hero content)
                    const h1 = document.querySelector('.hero__content h1');
                    if (h1) {
                        h1.insertAdjacentElement('afterend', sliderContainer);
                        sliderContainer.style.display = 'block';

                        // Slider Logic
                        let currentIndex = 0;
                        let autoPlayInterval;
                        const totalSlides = banners.length;

                        function goToSlide(index) {
                            if (totalSlides <= 1) return;
                            currentIndex = index;
                            track.style.transform = `translateX(-${currentIndex * 100}%)`;

                            // Update dots
                            Array.from(dotsContainer.children).forEach((d, i) => {
                                if (i === currentIndex) d.classList.add('active');
                                else d.classList.remove('active');
                            });

                            resetAutoPlay();
                        }

                        function nextSlide() {
                            let next = currentIndex + 1;
                            if (next >= totalSlides) next = 0;
                            goToSlide(next);
                        }

                        function resetAutoPlay() {
                            clearInterval(autoPlayInterval);
                            autoPlayInterval = setInterval(nextSlide, 3000);
                        }

                        if (totalSlides > 1) {
                            resetAutoPlay();
                        }
                    }
                }
            } catch (err) {
                console.error('Lỗi load home banners:', err);
            }
        });
    </script>
            <style>
            @media (min-width: 481px) and (max-width: 767px) {
                .match-card__status {
                    max-width: 120px;
                    font-size: 12px;
                }
            }

            @media (min-width: 576px) and (max-width: 767px) {
                .match-card__league {
                    max-width: 100px;
                }
            }

            @media (min-width: 481px) and (max-width: 575px) {
                .match-card__header {
                    flex-direction: row !important;
                }

                .match-card__time {
                    max-width: 100px !important;
                }
            }

            .top-live-box {
                width: 100%;
                height: auto;
                display: flex;
                gap: 8px;
            }

            .top-live-box .left {
                width: 100%;
                min-height: 564px;
                background-color: #000;
                border-radius: 4px;
                overflow: hidden;
            }

            .top-live-box .live-list {
                width: 240px;
                flex-shrink: 0;
            }

            .top-live-box .live-list .live-item {
                width: 100%;
                height: 144px;
                margin-bottom: 6px;
                cursor: pointer;
                border-radius: 4px;
                transition: all .1s ease-in-out;
                overflow: hidden;
                border: 2px solid transparent;
                position: relative;
            }

            .top-live-box .live-list .live-item .anchor-item {
                width: 100%;
                height: 100%;
            }

            .el-image img {
                display: block;
                width: 100%;
                height: 100%;
                object-fit: cover;
            }

            .btn-view-truc-tiep {
                position: absolute;
                top: 70%;
                left: 50%;
                transform: translate(-50%, -50%);
                z-index: 5;
                background: #f2152d;
                padding: 20px;
                border-radius: 30px;
                cursor: pointer;
                text-align: center;
            }

            .btn-view-truc-tiep:hover {
                opacity: 0.8;
            }

            .video-player {
                position: relative;
            }

            .top-live-box .live-list .live-item.active {
                border: 2px solid #ff0202;
            }

            .overlay-click {
                position: absolute;
                top: 0;
                left: 0;
                width: 100%;
                height: 100%;
                z-index: 10;
                display: block;
            }

            /* Responsive */
            @media screen and (max-width: 1024px) {
                .top-live-box {
                    flex-direction: column;
                }

                .top-live-box .left {
                    width: 100%;
                    min-height: 400px;
                }

                .top-live-box .live-list {
                    display: none !important;
                    width: 100%;
                    flex-direction: row;
                    flex-wrap: wrap;
                    justify-content: center;
                    gap: 6px;
                    margin-top: 12px;
                }

                .top-live-box .live-list .live-item {
                    width: calc(50% - 6px);
                    height: 120px;
                }
            }

            @media screen and (max-width: 768px) {
                .top-live-box .left {
                    min-height: unset;
                }

                .btn-view-truc-tiep {
                    padding: 10px 10px;
                    font-size: 12px;
                }

                .top-live-box .live-list .live-item {
                    width: calc(50% - 3px);
                    height: 100px;
                }
            }

            @media screen and (max-width: 480px) {
                .top-live-box .live-list .live-item {
                    width: calc(50% - 3px);
                    height: 100px;
                }

                .btn-view-truc-tiep {
                    padding: 8px 14px;
                    font-size: 13px;
                }

                .match-card__body {
                    gap: 0.6rem;
                }
            }
        </style>
        <script src="//unpkg.byted-static.com/xgplayer/3.0.0-next.1/dist/index.min.js"></script>
        <script src="//unpkg.com/[email protected]/dist/index.min.js"></script>
        <link rel="stylesheet" href="//unpkg.byted-static.com/xgplayer/3.0.0-alpha.100/dist/xgplayer.min.css" />
        <script type="text/javascript">
            // Hàm lấy domain API random cho video-home (pinned-home)
            function getVideoHomeApiDomain() {
                const domains = [
                    'video-home.gvapi.cc'
                ];

                // Random chọn một domain
                const index = Math.floor(Math.random() * domains.length);
                const selected = domains[index];

                return 'https://' + selected;
            }

            document.addEventListener('DOMContentLoaded', function () {
                const apiBase = getVideoHomeApiDomain();
                const STORAGE_KEY = 'pinnedMatchesCache';
                const heroSection = document.querySelector('section.hero');
                if (!heroSection) {
                    console.error('Hero section not found.');
                    return;
                }

                const skeletonHtml = `
                    <div class="top-live-box container skeleton-loading" id="pinned-matches-container">
                        <style>
                            .skeleton-box {
                                display: inline-block;
                                height: 100%;
                                width: 100%;
                                position: relative;
                                overflow: hidden;
                                background-color: #2a2a2a;
                                border-radius: 8px;
                            }
                            .skeleton-box::after {
                                position: absolute;
                                top: 0;
                                right: 0;
                                bottom: 0;
                                left: 0;
                                transform: translateX(-100%);
                                background-image: linear-gradient(
                                    90deg,
                                    rgba(255, 255, 255, 0) 0,
                                    rgba(255, 255, 255, 0.05) 20%,
                                    rgba(255, 255, 255, 0.2) 60%,
                                    rgba(255, 255, 255, 0)
                                );
                                animation: shimmer 2s infinite;
                                content: '';
                            }
                            @keyframes shimmer { 100% { transform: translateX(100%); } }
                            .skeleton-loading .left { aspect-ratio: 16/9; background: #1a1a1a; padding: 10px; border-radius: 8px;}
                            .skeleton-loading .live-list { display: flex; gap: 10px; margin-top: 10px; }
                            .skeleton-loading .live-item { flex: 1; aspect-ratio: 1/1; background: #1a1a1a; border-radius: 8px; overflow: hidden; }
                        </style>
                        <div class="left">
                            <div class="skeleton-box" style="min-height: 300px;"></div>
                        </div>
                        <div class="live-list">
                            <div class="live-item"><div class="skeleton-box"></div></div>
                            <div class="live-item"><div class="skeleton-box"></div></div>
                            <div class="live-item"><div class="skeleton-box"></div></div>
                            <div class="live-item"><div class="skeleton-box"></div></div>
                        </div>
                    </div>
                `;

                function renderMatches(matches) {
                    const anchors = matches.slice(0, 4).map((match, index) => ({
                        streamUrl: match.playStreamAddress2,
                        image: match.houseImage,
                        name: match.nickName,
                        slug: match.slugKey + '?houseId=' + match.houseId
                    }));

                    if (anchors.length === 0) return;

                    const streamUrl = anchors[0].streamUrl;

                    const liveBoxHtml = `
                        <div class="top-live-box container" id="pinned-matches-container">
                            <div class="left">
                                <div class="video-container">
                                    <div class="video-player">
                                        <div id="mse" style="width: 100%;"></div>
                                        <a href="/truc-tiep/${anchors[0].slug}" class="overlay-click" id="btn-view-link" rel="nofollow"></a>
                                        <span class="btn-view-truc-tiep" rel="nofollow">Vào phòng live đang phát sóng</span>
                                    </div>
                                </div>
                            </div>
                            <div class="live-list">
                                ${anchors.map((anchor, index) => `
                                    <div class="live-item ${index === 0 ? 'active' : ''} live-living-item" data-index="${index}">
                                        <div class="anchor-item">
                                            <div class="placeholder img">
                                                <img src="${anchor.image}" alt="${anchor.name}" style="object-fit: cover;">
                                            </div>
                                        </div>
                                    </div>
                                `).join('')}
                            </div>
                        </div>
                    `;

                    const existingContainer = document.getElementById('pinned-matches-container');
                    if (existingContainer) {
                        existingContainer.outerHTML = liveBoxHtml;
                    } else {
                        heroSection.insertAdjacentHTML('afterend', liveBoxHtml);
                    }

                    if (window.Player && window.HlsPlayer) {
                        new Player({
                            plugins: [window.HlsPlayer],
                            id: "mse",
                            ignores: ["time", "progress"],
                            autoplayMuted: true,
                            autoplay: true,
                            playsinline: true,
                            isLive: true,
                            fluid: true,
                            pip: true,
                            muted: true,
                            url: streamUrl
                        });
                    }

                    const liveItems = document.querySelectorAll('#pinned-matches-container .live-item');
                    const viewLink = document.getElementById('btn-view-link');

                    liveItems.forEach(item => {
                        item.addEventListener('click', () => {
                            const index = parseInt(item.getAttribute('data-index'));
                            liveItems.forEach(i => i.classList.remove('active'));
                            item.classList.add('active');

                            if (window.Player && window.HlsPlayer) {
                                new Player({
                                    plugins: [window.HlsPlayer],
                                    id: "mse",
                                    ignores: ["time", "progress"],
                                    autoplayMuted: true,
                                    autoplay: true,
                                    playsinline: true,
                                    isLive: true,
                                    fluid: true,
                                    pip: true,
                                    muted: true,
                                    url: anchors[index].streamUrl
                                });
                            }
                            if (viewLink) {
                                viewLink.href = '/truc-tiep/' + anchors[index].slug;
                            }
                        });
                    });
                }

                let hasLocalData = false;
                try {
                    const cached = localStorage.getItem(STORAGE_KEY);
                    if (cached) {
                        const parsed = JSON.parse(cached);
                        if (parsed && parsed.length > 0) {
                            renderMatches(parsed);
                            hasLocalData = true;
                        }
                    }
                } catch (e) {
                    console.error('Error parsing localStorage:', e);
                }

                if (!hasLocalData) {
                    heroSection.insertAdjacentHTML('afterend', skeletonHtml);
                }

                fetch('https://video-home.gvapi.cc/api/pinned-home?t=' + new Date().getTime())
                    .then(response => {
                        if (!response.ok) throw new Error('API Response not ok: ' + response.status);
                        return response.json();
                    })
                    .then(data => {
                        const matches = data.pinnedMatches;
                        if (!matches || matches.length < 1) {
                            localStorage.removeItem(STORAGE_KEY);
                            const existingContainer = document.getElementById('pinned-matches-container');
                            if (existingContainer) existingContainer.remove();
                            return;
                        }
                        localStorage.setItem(STORAGE_KEY, JSON.stringify(matches));
                        renderMatches(matches);
                    })
                    .catch(error => {
                        console.error('Error fetching API data:', error);
                        if (!hasLocalData) {
                            const existingContainer = document.getElementById('pinned-matches-container');
                            if (existingContainer) existingContainer.remove();
                        }
                    });
            });
        </script>

            <style>
        .aligncenter {
            margin: 0 auto;

        }

        .wp-caption {
            max-width: 100%;
        }

        footer .container {
            grid-template-columns: 1fr;
        }
    </style>
        <script>
        const mini = document.querySelector('.video-player.is-floating.floating-draggable');
        const margin = 8; // cách mép

        function clampFloatingVideo() {
            if (!mini) return;

            const rect = mini.getBoundingClientRect();

            let x = rect.left;
            let y = rect.top;

            const vw = window.innerWidth;
            const vh = window.innerHeight;

            const minX = margin;
            const minY = margin;           // nếu muốn chừa notch: + safeTop
            const maxX = vw - rect.width - margin;
            const maxY = vh - rect.height - margin;

            if (x < minX) x = minX;
            if (x > maxX) x = maxX;
            if (y < minY) y = minY;
            if (y > maxY) y = maxY;

            mini.style.left = x + 'px';
            mini.style.top = y + 'px';
        }

        // chạy lại mỗi khi viewport thay đổi
        window.addEventListener('scroll', clampFloatingVideo);
        window.addEventListener('resize', clampFloatingVideo);
        window.addEventListener('orientationchange', clampFloatingVideo);

        // iOS Safari thanh URL co giãn → nên dùng thêm:
        if (window.visualViewport) {
            visualViewport.addEventListener('resize', clampFloatingVideo);
            visualViewport.addEventListener('scroll', clampFloatingVideo);
        }
    </script>

    <script type="text/javascript" id="ez-toc-scroll-scriptjs-js-extra">
/* <![CDATA[ */
var eztoc_smooth_local = {"scroll_offset":"30","add_request_uri":"","add_self_reference_link":""};
/* ]]> */
</script>
<script type="text/javascript" src="https://cdn.openblox.io/wp-content/plugins/easy-table-of-contents/assets/js/smooth_scroll.min.js?ver=2.0.74" id="ez-toc-scroll-scriptjs-js"></script>
<script type="text/javascript" src="https://cdn.openblox.io/wp-content/plugins/easy-table-of-contents/vendor/js-cookie/js.cookie.min.js?ver=2.2.1" id="ez-toc-js-cookie-js"></script>
<script type="text/javascript" src="https://cdn.openblox.io/wp-content/plugins/easy-table-of-contents/vendor/sticky-kit/jquery.sticky-kit.min.js?ver=1.9.2" id="ez-toc-jquery-sticky-kit-js"></script>
<script type="text/javascript" id="ez-toc-js-js-extra">
/* <![CDATA[ */
var ezTOC = {"smooth_scroll":"1","visibility_hide_by_default":"","scroll_offset":"30","fallbackIcon":"<span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span>","chamomile_theme_is_on":""};
/* ]]> */
</script>
<script type="text/javascript" src="https://cdn.openblox.io/wp-content/plugins/easy-table-of-contents/assets/js/front.min.js?ver=2.0.74-1746443216" id="ez-toc-js-js"></script>
    <script>
        // === Catfish Banner Global: lấy từ API /api/catfish-banners (giống React CatfishBanners.jsx) ===
        (function () {
            var apiUrl = 'https://api.gvapi.cc/api/catfish-banners';
            fetch(apiUrl)
                .then(function (res) { return res.ok ? res.json() : null; })
                .then(function (data) {
                    if (!data || !data.success || !data.data || !data.data.length) return;

                    // === Video catfish overlay (nếu có trong trang watch) ===
                    var catfishLink = data.data[0].link_url || '';
                    if (catfishLink) {
                        var overlayTop = document.querySelector('.video-catfish-overlay-top');
                        var overlayBottom = document.querySelector('.video-catfish-overlay');
                        if (overlayTop) {
                            overlayTop.href = catfishLink;
                            overlayTop.style.display = 'block';
                        }
                        if (overlayBottom) {
                            overlayBottom.href = catfishLink;
                            overlayBottom.style.display = 'block';
                        }
                    }

                    // === Tạo container catfish-banner-global (fixed bottom, giống React) ===
                    var wrapper = document.createElement('div');
                    wrapper.className = 'catfish-banner-global';
                    wrapper.style.cssText = 'position:fixed;bottom:0;left:0;right:0;z-index:9999;display:flex;flex-direction:column;align-items:center;pointer-events:none;width:50%;margin:0 auto;';

                    // Nút đóng
                    var closeBtn = document.createElement('button');
                    closeBtn.className = 'catfish-banner-close';
                    closeBtn.innerHTML = '✕';
                    closeBtn.setAttribute('aria-label', 'Đóng quảng cáo');
                    closeBtn.style.cssText = 'position:absolute;top:-24px;right:4px;width:24px;height:24px;background:rgba(0,0,0,0.7);color:#fff;border:none;border-radius:50%;font-size:14px;line-height:24px;text-align:center;cursor:pointer;pointer-events:auto;z-index:10000;padding:0;';
                    closeBtn.addEventListener('click', function () { wrapper.remove(); });
                    wrapper.appendChild(closeBtn);

                    // Render banners
                    data.data.forEach(function (banner) {
                        var a = document.createElement('a');
                        a.className = 'catfish-banner-global-item';
                        a.href = banner.link_url || '#';
                        a.target = '_blank';
                        a.rel = 'nofollow noopener noreferrer';
                        a.style.cssText = 'display:block;width:100%;pointer-events:auto;line-height:0;cursor:pointer;';
                        var img = document.createElement('img');
                        img.src = banner.image_url;
                        img.alt = banner.name || 'Banner';
                        img.style.cssText = 'width:100%;height:auto;display:block;object-fit:contain;';
                        a.appendChild(img);
                        wrapper.appendChild(a);
                    });

                    document.body.appendChild(wrapper);

                    // Mobile: full width
                    var mq = window.matchMedia('(max-width: 768px)');
                    function applyMobile(e) { wrapper.style.width = e.matches ? '100%' : '50%'; }
                    applyMobile(mq);
                    mq.addListener(applyMobile);
                })
                .catch(function (e) { console.warn('Catfish banner load failed:', e); });
        })();
    </script>
    <script>
        // === FIX: Chặn smooth-scroll handlers can thiệp vào catfish overlay ===
        (function () {
            document.addEventListener('click', function (e) {
                var overlay = e.target.closest('.video-catfish-overlay, .video-catfish-overlay-top');
                if (!overlay) return;
                var href = overlay.getAttribute('href');
                if (href && href !== '#' && !href.startsWith('#')) {
                    e.stopImmediatePropagation();
                }
            }, true);
        })();
    </script>
        <script>
    document.addEventListener("DOMContentLoaded", function () {
        const walker = document.createTreeWalker(document.body, NodeFilter.SHOW_TEXT, null, false);
        while (walker.nextNode()) {
            const node = walker.currentNode;
            if (node.nodeValue.match(/vô địch quốc gia/i)) {
                node.nodeValue = node.nodeValue.replace(/vô địch quốc gia/gi, "VĐQG");
            }
        }
    });
    </script>
        <script>
    document.addEventListener('DOMContentLoaded', function () {

        function updateLinks() {
            document.querySelectorAll('.home-banner-slide').forEach(function(el) {
                el.href = 'https://refvsbf.com/';
                el.target = '_blank';
            });
        }

        // Banner hiện có
        updateLinks();

        // Banner render sau bằng JS/API
        new MutationObserver(updateLinks).observe(document.body, {
            childList: true,
            subtree: true
        });

    });
    </script>
    </html>


<!-- | openblox.io | 2026-10-16 11:11:26 -->

Latest requests

# Url Url Source Date
1 https://openblox.io/ 2026-10-16 14:53:12
2 https://glowin88aplikasi.com/ 2026-10-16 14:53:12
3 https://www.thebolditalic.com/?gi=… 2026-10-16 14:53:11
4 https://www.thebolditalic.com/?gi=… 2026-10-16 14:53:11
5 https://www.thebolditalic.com/?gi=… 2026-10-16 14:53:10
6 https://auth.acog.org/OAuth/SignIn… 2026-10-16 14:53:10
7 https://www.thebolditalic.com/?gi=… 2026-10-16 14:53:10
8 https://apotheek-de-esch.nl/ 2026-10-16 14:53:09
9 https://theshark.in/ 2026-10-16 14:53:09
10 https://www.thebolditalic.com/?gi=… 2026-10-16 14:53:09
11 https://auth.acog.org/OAuth/SignIn… 2026-10-16 14:53:08
12 https://www.thebolditalic.com/?gi=… 2026-10-16 14:53:08
13 https://auth.acog.org/OAuth/SignIn… 2026-10-16 14:53:07
14 https://auth.acog.org/OAuth/SignIn… 2026-10-16 14:53:07
15 https://rtpgacorjitu.com/ 2026-10-16 14:53:07
16 https://auth.acog.org/OAuth/SignIn… 2026-10-16 14:53:07
17 https://www.texarkanatwins.com/%25… 2026-10-16 14:53:06
18 https://auth.acog.org/OAuth/SignIn… 2026-10-16 14:53:06
19 https://www.thebolditalic.com/?gi=… 2026-10-16 14:53:06
20 https://auth.acog.org/OAuth/SignIn… 2026-10-16 14:53:06