PageSourceSearch

https://bananagames.io/

html bananagames.io collected 2026-10-09 22:40:33 UTC 152,709 bytes, 2,247 lines download raw bytes

1<!DOCTYPE html>
2<html lang="vi">
3
4<head>
5  <meta charset="UTF-8" />
6  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7  <link rel="preconnect" href="https://fonts.googleapis.com" />
8  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
9  <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;700&display=swap" rel="stylesheet" />
10  <link rel="stylesheet" href="/wp-content/themes/cakhiatv/style.css" />
11  <meta name="google-site-verification" content="Pq_Jga--m75EW7KF7ApaQDIVNFlsbOZTLzW6tWRfI6M" />
12<script type="application/ld+json">
13{
14"@context": "https://schema.org",
15"@type": "Casino",
16"@id": "https://gohype.io/",
17"name": "Mitomtv",
18"alternateName": "Mitomtv",
19"logo": "https://cdn.gohype.io/wp-content/themes/cakhiatv/assets/images/mitomtv.png",
20"image": "https://cdn.gohype.io/wp-content/uploads/2025/12/gioi-thieu-trang-xem-bong-da-mitomtv.jpg",
21"description": "Mitomtv mang đến trải nghiệm xem bóng đá trực tuyến theo phong cách hiện đại, nhanh – gọn – chuẩn và chất lượng. Nền tảng mitom tv tập trung tối ưu tốc độ truyền tải, giúp người xem trực tiếp bóng đá theo dõi mọi trận đấu với hình ảnh rõ nét, âm thanh ổn định và hạn chế tối đa giật lag.
22Email: [email protected]
23Số điện thoại: 0907 037 073
24Website: https://gohype.io/
25Địa chỉ: 21 Cô Giang, Phường Cầu Ông Lãnh, Quận 1, Thành phố Hồ Chí Minh, Vietnam",
26"url":"https://gohype.io/",
27"telephone": "0907 037 073",
28"priceRange": "0",
29"address": {
30"@type": "PostalAddress",
31"streetAddress": "21 Cô Giang, Phường Cầu Ông Lãnh, Quận 1, Thành phố Hồ Chí Minh, Vietnam",
32"addressLocality": "21 Cô Giang, Phường Cầu Ông Lãnh, Quận 1",
33"addressRegion": "Hồ Chí Minh",
34"postalCode": "70000",
35"addressCountry": "Việt Nam"
36},
37"geo": {
38"@type": "GeoCoordinates",
39"latitude": 10.8768923,
40"longitude": 106.642066
41},
42"openingHoursSpecification": {
43"@type": "OpeningHoursSpecification",
44"dayOfWeek": [
45"Monday",
46"Tuesday",
47"Wednesday",
48"Thursday",
49"Friday",
50"Saturday",
51"Sunday"
52],
53"opens": "08:30",
54"closes": "17:00"
55},
56"sameAs": [
57"https://twitter.com/mitomtvttbd1",
58"https://www.pinterest.com/mitomtvttbd1/",
59"https://www.youtube.com/@mitomtvttbd1",
60"https://profile.hatena.ne.jp/mitomtvttbd1/",
61"https://www.tumblr.com/mitomtvttbd1",
62"https://500px.com/p/mitomtvttbd1",
63"https://qiita.com/mitomtvttbd1",
64"https://pubhtml5.com/homepage/vecck/preview",
65"https://www.speedrun.com/users/mitomtvttbd1",
66"https://stocktwits.com/mitomtvttbd1",
67"https://gravatar.com/mitomtvttbd1",
68"http://delphi.larsbo.org/user/mitomtvttbd1",
69"https://spiderum.com/nguoi-dung/mitomtvttbd1",
70"https://savelist.co/profile/users/mitomtvttbd1",
71"https://blender.community/mitomtvttbd1//",
72"http://forum.vodobox.com/profile.php?id=50315",
73"https://makeprojects.com/profile/mitomtvttbd1",
74"https://transfur.com/Users/mitomtvttbd1"
75]
76}
77</script>
77
78
79<!-- Google tag (gtag.js) -->
vendor: 65 bytes, lines 79-80
79
80<script async src="https://www.googletagmanager.com/gtag/js?id=
80G-TM77WL0G13
vendor: 13 bytes, line 80
80"></script>
81<script>
82  
vendor: 138 bytes, lines 82-86
82window.dataLayer = window.dataLayer || [];
83  function gtag(){dataLayer.push(arguments);}
84  gtag('js', new Date());
85
86  gtag('config', '
86G-TM77WL0G13
vendor: 5 bytes, line 86
86');
87</script>
87
88<meta name="google-site-verification" content="7F8Dr6W7dFfXw_8QxXahPXlMCGYu5fFFk-8k3HakkgY" />
89<meta name="google-site-verification" content="CRBmCBmj_NFdMmN3OOB6tlPFu_uE4S0lnXTMTjvKD8U" />
90<meta name="google-site-verification" content="meOQifpceFrLZp97dziCkiwzgf-vSZa0NYd7QoOxJYM" />
91<!-- Google tag (tổng) -->
vendor: 65 bytes, lines 91-92
91
92<script async src="https://www.googletagmanager.com/gtag/js?id=
92G-V8GXMSME5N
vendor: 13 bytes, line 92
92"></script>
93<script>
94  
vendor: 138 bytes, lines 94-98
94window.dataLayer = window.dataLayer || [];
95  function gtag(){dataLayer.push(arguments);}
96  gtag('js', new Date());
97
98  gtag('config', '
98G-V8GXMSME5N
vendor: 5 bytes, line 98
98');
99</script>
99
100
101
102<meta name="google-site-verification" content="cSKfvpMpLu-QNgfF41Ki_O80Ym3Tsv40cubyNCfEumg" />
103<meta name="google-site-verification" content="kmUgYRBJZNwhKmQ_OG9_vn1u6BqT9bchzWFD4_GfCeM" />
104<meta name="google-site-verification" content="AMV7AMWuJrDUgVNJhvedfluFJb-dpvs7KOc73BEnHPU" />
105<meta name="google-site-verification" content="IExbaBQ3JKqt-hu4PcdKB6ZkzHq_vKymzEyzJxOxdfo" />
106<meta name="google-site-verification" content="wPi9rBTJf6s14g0xj1BHnmprzGlcMtqpT8Tzkuayxpo" />
107<meta name="google-site-verification" content="kju9ATWoiwU1vXHS_YUfSw4jegbcqf72OwYT7y8memI" />
108<meta name="google-site-verification" content="BBeJHGTzgGKf_Q2lyV8gYJi1nFrhxN4yl11Ksls5_zY" />
109<meta name="google-site-verification" content="aJ1w9LgxHa1kevrQkToIXhBM4XukdNYqUfvND6keEKc" />
110<meta name="google-site-verification" content="gN9B5sJw2Dich_A1A23ieu2wsV7uOGiXaSIwmEaSly8" />  
111<script type="application/ld+json">
112{
113  "@context": "https://schema.org",
114  "@type": "BreadcrumbList",
115  "itemListElement": [
116
117        {
118        "@type": "ListItem",
119        "position": 1,
120        "name": "Trang chá»§",
121        "item": "https://bananagames.io"
122      },
123
124      {
125        "@type": "ListItem",
126        "position": 2,
127        "name": "Mitomtv Link mới nhất",
128        "item": "https://bananagames.io/tin-tuc"
129      }
130
131    
132  ]
133}
134</script>
134
135  	<style>img:is([sizes="auto" i], [sizes^="auto," i]) { contain-intrinsic-size: 3000px 1500px }</style>
136	
137<!-- Tối ưu hóa công cụ tìm kiếm bởi Rank Math PRO - https://rankmath.com/ -->
138<title>Mitomtv - Trang xem bóng đá trực tiếp Mì tôm TV miễn phí #1</title>
139<meta name="description" content="Mitomtv trang xem trực tiếp bóng đá miễn phí, chất lượng cực cao, tốc độ nhanh, không giật lag. cập nhật link xem bóng đá hôm nay, tối nay nhanh nhất hiện nay."/>
140<meta name="robots" content="follow, index, max-snippet:-1, max-video-preview:-1, max-image-preview:large"/>
141<link rel="canonical" href="https://bananagames.io/" />
142<meta property="og:locale" content="vi_VN" />
143<meta property="og:type" content="website" />
144<meta property="og:title" content="Mitomtv - Trang xem bóng đá trực tiếp Mì tôm TV miễn phí #1" />
145<meta property="og:description" content="Mitomtv trang xem trực tiếp bóng đá miễn phí, chất lượng cực cao, tốc độ nhanh, không giật lag. cập nhật link xem bóng đá hôm nay, tối nay nhanh nhất hiện nay." />
146<meta property="og:url" content="https://bananagames.io/" />
147<meta property="og:site_name" content="MITOMTV" />
148<meta property="og:updated_time" content="2025-12-05T16:11:21+07:00" />
149<meta property="og:image" content="https://cdn.bananagames.io/wp-content/uploads/2025/12/link-truy-cap-vao-trang-mitomtv.jpg" />
150<meta property="og:image:secure_url" content="https://cdn.bananagames.io/wp-content/uploads/2025/12/link-truy-cap-vao-trang-mitomtv.jpg" />
151<meta property="og:image:width" content="800" />
152<meta property="og:image:height" content="400" />
153<meta property="og:image:alt" content="Mitomtv" />
154<meta property="og:image:type" content="image/jpeg" />
155<meta property="article:published_time" content="2025-09-08T14:05:35+07:00" />
156<meta property="article:modified_time" content="2025-12-05T16:11:21+07:00" />
157<meta name="twitter:card" content="summary_large_image" />
158<meta name="twitter:title" content="Mitomtv - Trang xem bóng đá trực tiếp Mì tôm TV miễn phí #1" />
159<meta name="twitter:description" content="Mitomtv trang xem trực tiếp bóng đá miễn phí, chất lượng cực cao, tốc độ nhanh, không giật lag. cập nhật link xem bóng đá hôm nay, tối nay nhanh nhất hiện nay." />
160<meta name="twitter:image" content="https://cdn.bananagames.io/wp-content/uploads/2025/12/link-truy-cap-vao-trang-mitomtv.jpg" />
161<meta name="twitter:label1" content="Được viết bởi" />
162<meta name="twitter:data1" content="Admin" />
163<meta name="twitter:label2" content="Thời gian để đọc" />
164<meta name="twitter:data2" content="25 phút" />
165<script type="application/ld+json" class="rank-math-schema-pro">{"@context":"https://schema.org","@graph":[{"@type":["Organization","Person"],"@id":"https://bananagames.io/#person","name":"MITOMTV","url":"https://gohype.io/"},{"@type":"WebSite","@id":"https://bananagames.io/#website","url":"https://bananagames.io","name":"MITOMTV","publisher":{"@id":"https://bananagames.io/#person"},"inLanguage":"vi","potentialAction":{"@type":"SearchAction","target":"https://bananagames.io/?s={search_term_string}","query-input":"required name=search_term_string"}},{"@type":"ImageObject","@id":"https://cdn.bananagames.io/wp-content/uploads/2025/12/link-truy-cap-vao-trang-mitomtv.jpg","url":"https://cdn.bananagames.io/wp-content/uploads/2025/12/link-truy-cap-vao-trang-mitomtv.jpg","width":"800","height":"400","inLanguage":"vi"},{"@type":"WebPage","@id":"https://bananagames.io/#webpage","url":"https://bananagames.io/","name":"Mitomtv - Trang xem b\u00f3ng \u0111\u00e1 tr\u1ef1c ti\u1ebfp M\u00ec t\u00f4m TV mi\u1ec5n ph\u00ed #1","datePublished":"2025-09-08T14:05:35+07:00","dateModified":"2025-12-05T16:11:21+07:00","about":{"@id":"https://bananagames.io/#person"},"isPartOf":{"@id":"https://bananagames.io/#website"},"primaryImageOfPage":{"@id":"https://cdn.bananagames.io/wp-content/uploads/2025/12/link-truy-cap-vao-trang-mitomtv.jpg"},"inLanguage":"vi"},{"@type":"Person","@id":"https://bananagames.io/tac-gia/seo/","name":"Admin","url":"https://bananagames.io/tac-gia/seo/","image":{"@type":"ImageObject","@id":"https://secure.gravatar.com/avatar/ad61670926c47f2b732ffa3d7bcfeea37e9afab93cf5d1aaf83df66abc167a69?s=96&amp;d=mm&amp;r=g","url":"https://secure.gravatar.com/avatar/ad61670926c47f2b732ffa3d7bcfeea37e9afab93cf5d1aaf83df66abc167a69?s=96&amp;d=mm&amp;r=g","caption":"Admin","inLanguage":"vi"}},{"@type":"Article","headline":"Mitomtv - Trang xem b\u00f3ng \u0111\u00e1 tr\u1ef1c ti\u1ebfp M\u00ec t\u00f4m TV mi\u1ec5n ph\u00ed #1","keywords":"Mitomtv","datePublished":"2025-09-08T14:05:35+07:00","dateModified":"2025-12-05T16:11:21+07:00","author":{"@id":"https://bananagames.io/tac-gia/seo/","name":"Admin"},"publisher":{"@id":"https://bananagames.io/#person"},"description":"Mitomtv trang xem tr\u1ef1c ti\u1ebfp b\u00f3ng \u0111\u00e1 mi\u1ec5n ph\u00ed, ch\u1ea5t l\u01b0\u1ee3ng c\u1ef1c cao, t\u1ed1c \u0111\u1ed9 nhanh, kh\u00f4ng gi\u1eadt lag. c\u1eadp nh\u1eadt link xem b\u00f3ng \u0111\u00e1 h\u00f4m nay, t\u1ed1i nay nhanh nh\u1ea5t hi\u1ec7n nay.","name":"Mitomtv - Trang xem b\u00f3ng \u0111\u00e1 tr\u1ef1c ti\u1ebfp M\u00ec t\u00f4m TV mi\u1ec5n ph\u00ed #1","@id":"https://bananagames.io/#richSnippet","isPartOf":{"@id":"https://bananagames.io/#webpage"},"image":{"@id":"https://cdn.bananagames.io/wp-content/uploads/2025/12/link-truy-cap-vao-trang-mitomtv.jpg"},"inLanguage":"vi","mainEntityOfPage":{"@id":"https://bananagames.io/#webpage"}}]}</script>
165
166<meta name="google-site-verification" content="4V4Nk-aJkfRfz9xHiiWq9Cj2cICQbA4wuFeycxj_QOs" />
167<!-- /Plugin SEO WordPress Rank Math -->
168
169<link rel='dns-prefetch' href='//cdn.bananagames.io' />
170<script type="text/javascript">
171/* <![CDATA[ */
172window._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.bananagames.io\/wp-content\/wp-includes\/js\/wp-emoji-release.min.js?ver=6.8.1"}};
173/*! This file is auto-generated */
174!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);
175/* ]]> */
176</script>
176
177<style id='wp-emoji-styles-inline-css' type='text/css'>
178
179	img.wp-smiley, img.emoji {
180		display: inline !important;
181		border: none !important;
182		box-shadow: none !important;
183		height: 1em !important;
184		width: 1em !important;
185		margin: 0 0.07em !important;
186		vertical-align: -0.1em !important;
187		background: none !important;
188		padding: 0 !important;
189	}
190</style>
191<link rel='stylesheet' id='wp-block-library-css' href='https://cdn.bananagames.io/wp-content/wp-includes/css/dist/block-library/style.min.css?ver=6.8.1' type='text/css' media='all' />
192<style id='classic-theme-styles-inline-css' type='text/css'>
193/*! This file is auto-generated */
194.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}
195</style>
196<style id='global-styles-inline-css' type='text/css'>
197: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%);
197--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;}
197.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;}
198:where(.wp-block-post-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-post-template.is-layout-grid){gap: 1.25em;}
199:where(.wp-block-columns.is-layout-flex){gap: 2em;}:where(.wp-block-columns.is-layout-grid){gap: 2em;}
200:root :where(.wp-block-pullquote){font-size: 1.5em;line-height: 1.6;}
201</style>
202<link rel='stylesheet' id='main-style-css' href='https://cdn.bananagames.io/wp-content/themes/cakhiatv/style.css?ver=1763739275' type='text/css' media='all' />
203<link rel="https://api.w.org/" href="https://bananagames.io/wp-json/" /><link rel="alternate" title="JSON" type="application/json" href="https://bananagames.io/wp-json/wp/v2/pages/1040" /><link rel="EditURI" type="application/rsd+xml" title="RSD" href="https://bananagames.io/xmlrpc.php?rsd" />
204<meta name="generator" content="WordPress 6.8.1" />
205<link rel='shortlink' href='https://bananagames.io/' />
206<link rel="alternate" title="oNhúng (JSON)" type="application/json+oembed" href="https://bananagames.io/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fbananagames.io%2F" />
207<link rel="alternate" title="oNhúng (XML)" type="text/xml+oembed" href="https://bananagames.io/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fbananagames.io%2F&#038;format=xml" />
208    <style>
209   .chat-message .cw-message-content{
210        color: #fff;
211    }
212        @media (min-width: 1024px) {
213            h1 {
214                font-size: 1.5em !important;
215            }
216        }
217
218        .match-teams-score {
219            display: flex !important;
220        }
221
222        @media (max-width: 767px) {
223            .xgplayer .xg-inner-controls {
224                height: 60px !important;
225            }
226            .header .logo img{
227                height: 35px;
228            }
229        }
230
231        @media (min-width: 481px) and (max-width: 767px) {
232            div#chat_messages {
233                max-height: 60vh !important;
234            }
235        }
236    </style>
237    <style>
238            .match-section {
239                min-height: 100%;
240            }
241            
242            .match-card__status {
243                position: absolute;
244                top: 13%;
245                left: 50%;
246                transform: translate(-50%, -50%);
247            }
248            
249            .match-card__stats-content {
250                background: none !important;
251                box-shadow: none !important
252            }
253            
254            
255            
256            @media (max-width: 480px) {
257                .team__logo {
258                    width: 40px !important;
259                    height: 40px !important;
260                }
261                .match-card__league {
262                    max-width: 100px;
263                }
264                
265                .match-card__time {
266                    max-width: 100px;
267                }
268                
269                .match-card__status {
270                    max-width: 120px;
271                    order: 1 !important;
272                    font-size: 12px
273                }
274                
275                .streaming {
276                    padding: 4px;
277                }
278                
279                .btn-view-truc-tiep {
280                    padding: 8px 4px !important;
281                    font-size: 12px;
282                }
283                .match-card__stats-content {
284                    display: block !important;
285                }
286                
287                .match-card__stats {
288                    display: block !important
289                }
290            }
291            
292            @media (min-width: 768px) and (max-width: 1024px) {
293                .match-card__status {
294                    position: absolute;
295                    top: 13%;
296                    left: 50%;
297                    transform: translate(-50%, -50%);
298                }
299                
300                .match-card__league {
301                    max-width: 110px;
302                }
303            }
304        </style><link rel="icon" href="https://cdn.bananagames.io/wp-content/uploads/2025/12/cropped-mitomtv-1-32x32.png" sizes="32x32" />
305<link rel="icon" href="https://cdn.bananagames.io/wp-content/uploads/2025/12/cropped-mitomtv-1-192x192.png" sizes="192x192" />
306<link rel="apple-touch-icon" href="https://cdn.bananagames.io/wp-content/uploads/2025/12/cropped-mitomtv-1-180x180.png" />
307<meta name="msapplication-TileImage" content="https://cdn.bananagames.io/wp-content/uploads/2025/12/cropped-mitomtv-1-270x270.png" />
308  
309
310</head>
311
312<body>
313  <!-- Header -->
314<header class="header">
315    <div class="container">
316      <div class="header__inner">
317        <a href="/" class="logo">
318          <img src="https://cdn.bananagames.io/wp-content/themes/cakhiatv/assets/images/mitomtv.png" alt="Menu" />
319        </a>
320        <div style="display: flex; align-items: center">
321          <nav class="nav">
322            <button class="nav__toggle">
323              <img src="https://cdn.bananagames.io/wp-content/themes/cakhiatv/assets/images/hamburger.svg" alt="Menu" />
324            </button>
325
326            <ul class="nav__menu">
327              <button class="nav__close" aria-label="Close menu"></button>
328              <li class="nav__item"><a href="/" class=" active">Mitom TV</a></li><li class="nav__item"><a href="https://bananagames.io/bang-xep-hang/" class="">Bảng xếp hạng</a></li><li class="nav__item"><a href="https://bananagames.io/ket-qua-bong-da/" class="">Kết quả bóng đá</a></li><li class="nav__item"><a href="https://bananagames.io/lich-thi-dau/" class="">Lịch thi đấu</a></li><li class="nav__item"><a href="https://bananagames.io/nhan-dinh/" class="">Nhận định bóng đá</a></li><li class="nav__item"><a href="https://bananagames.io/soi-keo/" class="">Soi kèo bóng đá</a></li><li class="nav__item"><a href="https://bananagames.io/tin-tuc/" class="">Tin tức</a></li>            </ul>
329          </nav>
330          <div class="header__buttons">
331            <a href="https://vsbetz75.com/login" target="_blank" class="btn btn--secondary header-button" rel="nofollow">
332              <span class="header-text">Đăng nhập</span>
333            </a>
334            <a href="https://vsbetz75.com/registered" rel="nofollow" target="_blank" class="btn btn--default header-button">
335              <span class="header-text">Đăng ký</span>
336            </a>
337          </div>
338
339        </div>
340
341
342
343      </div>
344    </div>
345  </header>
346 
347   <!-- Main Content -->
348     <!-- Main Content -->
349     <main style="padding-top: 1px">
350      <section class="ads">
351        <div class="container">
352           <a href="<br />
353<b>Warning</b>:  file_get_contents(): php_network_getaddresses: getaddrinfo for xoilackvb.cc failed: Name or service not known in <b>/www/sites/bananagames.io/wp-content/themes/cakhiatv/front-page.php</b> on line <b>11</b><br />
354<br />
355<b>Warning</b>:  file_get_contents(https://xoilackvb.cc/link.php): Failed to open stream: php_network_getaddresses: getaddrinfo for xoilackvb.cc failed: Name or service not known in <b>/www/sites/bananagames.io/wp-content/themes/cakhiatv/front-page.php</b> on line <b>11</b><br />
356" target="_blank" rel="nofollow"><img style="display: none" src="<br />
357<b>Warning</b>:  file_get_contents(): php_network_getaddresses: getaddrinfo for xoilackvb.cc failed: Name or service not known in <b>/www/sites/bananagames.io/wp-content/themes/cakhiatv/front-page.php</b> on line <b>11</b><br />
358<br />
359<b>Warning</b>:  file_get_contents(https://xoilackvb.cc/banner.php): Failed to open stream: php_network_getaddresses: getaddrinfo for xoilackvb.cc failed: Name or service not known in <b>/www/sites/bananagames.io/wp-content/themes/cakhiatv/front-page.php</b> on line <b>11</b><br />
360" /></a>
361        </div>
362      </section>
363      <!-- Hero Section -->
364      <section class="hero">
365        <div class="container">
366          <div class="hero__content">
367            <h1 class="text-uppercase">
368              <p>Mitomtv &#8211; Trang xem bóng đá trực tiếp Mì tôm TV miễn phí #1</p>
369            </h1>
370          </div>
371        </div>
372      </section>
373
374      <!-- Sports Filter -->
375      <section class="sports-filter" >
376        <div class="container">
377          <div class="sports-filter__inner" style="display: none">
378            <!-- Group 1: Sports Categories -->
379            <!--<div class="sports-filter__group sports-categories">
380            <button
381                class="sports-filter__button"
382                data-sport="all"
383              >
384                <div class="sports-filter__button-icon">
385                  <img
386                    src="https://cdn.bananagames.io/wp-content/themes/cakhiatv/assets/images/icons/football.png"
387                    alt="Tất Cả"
388                  />
389                </div>
390                <div class="sports-filter__button-text">Tất Cả</div>
391                <div class="sports-filter__button-count" id="count-all-type"></div>
392              </button>
393
394              <button
395                class="sports-filter__button"
396                data-sport="football"
397              >
398                <div class="sports-filter__button-icon">
399                  <img
400                    src="https://cdn.bananagames.io/wp-content/themes/cakhiatv/assets/images/icons/football.png"
401                    alt="Football"
402                  />
403                </div>
404                <div class="sports-filter__button-text">Bóng đá</div>
405                <div class="sports-filter__button-count" id="count-football"></div>
406              </button>
407
408              <button class="sports-filter__button" data-sport="basketball">
409                <div class="sports-filter__button-icon">
410                  <img
411                    src="https://cdn.bananagames.io/wp-content/themes/cakhiatv/assets/images/icons/basketball.png"
412                    alt="Basketball"
413                  />
414                </div>
415                <div class="sports-filter__button-text">Bóng rổ</div>
416                <div class="sports-filter__button-count" id="count-basketball"></div>
417              </button>
418
419             <!-- <button class="sports-filter__button" data-sport="tennis">
420                <div class="sports-filter__button-icon">
421                  <img src="https://cdn.bananagames.io/wp-content/themes/cakhiatv/assets/images/icons/tennis.png" alt="Tennis" />
422                </div>
423                <div class="sports-filter__button-text">Tennis</div>
424                <div class="sports-filter__button-count" id="count-tennis"></div>
425              </button> -->
426
427              <!--<button class="sports-filter__button" data-sport="volleyball">
428                <div class="sports-filter__button-icon">
429                  <img
430                    src="https://cdn.bananagames.io/wp-content/themes/cakhiatv/assets/images/icons/volleyball.png"
431                    alt="Volleyball"
432                  />
433                </div>
434                <div class="sports-filter__button-text">Bóng chuyền</div>
435                <div class="sports-filter__button-count" id="count-volleyball"></div>
436              </button> -->
437
438              <div class="livescore-switch">
439                <label class="switch">
440                  <input type="checkbox" id="livescoreToggle" />
441                  <span class="slider"></span>
442                </label>
443                <span class="livescore-label">Livescore</span>
444              </div>
445            </div>
446
447            <!-- Divider -->
448            <div class="sports-filter__divider"></div>
449
450            <!-- Group 2: Match Filters -->
451            <div class="sports-filter__group match-filters">
452            <button class="sports-filter__button_child active" data-filter="child_all">
453                <div class="sports-filter__button-icon">
454                  <img src="https://cdn.bananagames.io/wp-content/themes/cakhiatv/assets/images/icons/all.png" alt="All" />
455                </div>
456                <div class="sports-filter__button-text">Tất cả</div>
457                <div class="sports-filter__button-count" id="count-all-type"></div>
458              </button>
459
460              <button class="sports-filter__button_child live" data-filter="live">
461                <div class="sports-filter__button-icon">
462                  <img src="https://cdn.bananagames.io/wp-content/themes/cakhiatv/assets/images/icons/live.png" alt="Live" />
463                </div>
464                <div class="sports-filter__button-text">Đang Live</div>
465                <div class="sports-filter__button-count" id="count-live"></div>
466              </button>
467
468              <!--<button class="sports-filter__button_child" data-filter="hot">
469                <div class="sports-filter__button-icon">
470                  <img src="https://cdn.bananagames.io/wp-content/themes/cakhiatv/assets/images/icons/hot.png" alt="Hot" />
471                </div>
472                <div class="sports-filter__button-text">Trận HOT</div>
473                <div class="sports-filter__button-count" id="count-hot">48</div>
474              </button>-->
475
476              <!--<button class="sports-filter__button_child" data-filter="date" data-value="2026-10-09">
477                <div class="sports-filter__button-icon">
478                  <img src="https://cdn.bananagames.io/wp-content/themes/cakhiatv/assets/images/icons/calendar.png" alt="Today" />
479                </div>
480                <div class="sports-filter__button-text">Hôm Nay</div>
481                <div class="sports-filter__button-count" id="count-today"></div>
482              </button>-->
483
484              <!--<button class="sports-filter__button_child" data-filter="date" data-value="2026-10-10">
485                <div class="sports-filter__button-icon">
486                  <img
487                    src="https://cdn.bananagames.io/wp-content/themes/cakhiatv/assets/images/icons/calendar.png"
488                    alt="Tomorrow"
489                  />
490                </div>
491                <div class="sports-filter__button-text">Ngày Mai</div>
492                <div class="sports-filter__button-count" id="count-tomorrow"></div>
493              </button>-->           
494            <!--  
495             <button class="sports-filter__button_child" data-filter="no_blv">
496                <div class="sports-filter__button-text">Live không BLV</div>
497                <div class="sports-filter__button-count" id="noblv-live">0</div>
498              </button>
499              -->
500            </div>
501          </div>
502        </div>
503      </section>
504
505      <!-- Featured Matches -->
506      <section class="featured-matches" style="">
507        <div class="container">
508        <div class="match-section">
509            <div id="match-list" class="matches">
510            </div>
511          </div>
512
513          <!--<div
514            style="
515              display: flex;
516              justify-content: center;
517              margin-top: 1rem;
518              margin-bottom: 1rem;
519            "
520          >
521            <a href="#" class="btn btn--readmore">
522              <span>Xem thêm lịch trực tiếp -></span>
523            </a>
524          </div>-->
525        </div>
526      </section>
527
528      <!-- Content Navigation Section -->
529      <section class="content-nav">
530  <div class="container">
531    <div class="content-nav__container" style="max-height:800px !important">
532      <div class="content-nav__lists">
533        <div class="content-nav__list">
534          <!-- Nếu bạn vẫn muốn giữ Mục lục này thủ công, thì để lại -->
535          <p style="font-weight: bold; font-size: 120%">Mục Lục</p>
536          <!-- Hoặc có thể xoá toàn bộ <ul>
536 này nếu muốn Gutenberg xử lý luôn -->
537
538          <div class="content-nav__divider"></div>
539
540          <div class="content-nav__text">
541            <p><a href="/">Mitomtv</a> là trang xem bóng đá hiện đại, nơi mang đến các trận đấu trực tiếp với chất lượng hình ảnh Full HD, âm thanh cực sống động và tốc độ tải trang ổn định. Trang truc tiep bong da cập nhật link xem bóng đá nhanh chóng, không giật lag. Trang còn cung cấp tin tức thể thao mới nhất, giúp người xem không bỏ lỡ bất kỳ khoảnh khắc nào.</p>
542<h2>Mitomtv &#8211; Trang xem bd trực tiếp hàng đầu thị trường</h2>
543<div id="attachment_1187" style="width: 810px" class="wp-caption aligncenter"><img fetchpriority="high" decoding="async" aria-describedby="caption-attachment-1187" class="size-full wp-image-1187" src="https://gohype.io/wp-content/uploads/2025/12/gioi-thieu-trang-xem-bong-da-mitomtv.jpg" alt="gioi thieu trang xem bong da mitomtv" width="800" height="400" title="Mitomtv - Trang xem bóng đá trực tiếp Mì tôm TV miễn phí #1 1" srcset="https://cdn.bananagames.io/wp-content/uploads/2025/12/gioi-thieu-trang-xem-bong-da-mitomtv.jpg 800w, https://cdn.bananagames.io/wp-content/uploads/2025/12/gioi-thieu-trang-xem-bong-da-mitomtv-300x150.jpg 300w, https://cdn.bananagames.io/wp-content/uploads/2025/12/gioi-thieu-trang-xem-bong-da-mitomtv-768x384.jpg 768w" sizes="(max-width: 800px) 100vw, 800px" /><p id="caption-attachment-1187" class="wp-caption-text">Tìm hiểu tổng quan về trang xem bóng đá Mitomtv</p></div>
544<p>Mitomtv là trang xem bóng đá hàng đầu hiện nay, ra đời với mục tiêu mang đến cho người hâm mộ trải nghiệm xem mượt mà, ổn định và chất lượng cao nhất. Trang web hướng đến việc tạo dựng một cộng đồng bóng đá trực tuyến năng động, nơi người dùng không chỉ xem trận đấu mà còn cùng nhau chia sẻ niềm đam mê.</p>
545<p>Mitom tv được thành lập trong bối cảnh nhu cầu xembd trực tuyến tăng cao nhưng thiếu các kênh uy tín, chất lượng. Trải qua quá trình phát triển, Mitomtv không ngừng cải thiện giao diện, nâng cấp đường truyền và mở rộng phạm vi phát sóng, đáp ứng nhu cầu xem bóng đá của hàng triệu người hâm mộ.</p>
546<p>Sứ mệnh là mang đến cho người dùng những phút giây giải trí trọn vẹn nhất cùng bóng đá. gohype.io luôn nỗ lực cung cấp đường truyền nhanh, hình ảnh sắc nét và bình luận chuyên nghiệp. Mitomtv còn hướng đến việc xây dựng một không gian xem bóng đá an toàn, giúp kết nối những người yêu thể thao trên toàn quốc.</p>
547<h2>Điểm nổi bật nhất của trang trực tiếp bóng đá mitomtv</h2>
548<div id="attachment_1192" style="width: 810px" class="wp-caption aligncenter"><img decoding="async" aria-describedby="caption-attachment-1192" class="size-full wp-image-1192" src="https://gohype.io/wp-content/uploads/2025/12/nhung-uu-diem-cua-trang-mitomtv.jpg" alt="nhung uu diem cua trang mitomtv" width="800" height="400" title="Mitomtv - Trang xem bóng đá trực tiếp Mì tôm TV miễn phí #1 2" srcset="https://cdn.bananagames.io/wp-content/uploads/2025/12/nhung-uu-diem-cua-trang-mitomtv.jpg 800w, https://cdn.bananagames.io/wp-content/uploads/2025/12/nhung-uu-diem-cua-trang-mitomtv-300x150.jpg 300w, https://cdn.bananagames.io/wp-content/uploads/2025/12/nhung-uu-diem-cua-trang-mitomtv-768x384.jpg 768w" sizes="(max-width: 800px) 100vw, 800px" /><p id="caption-attachment-1192" class="wp-caption-text">Một số lý do mà người dùng nên tham gia vào trang web</p></div>
549<p>MitomTV không chỉ là nơi xem bd truc tuyen mà còn là hệ thống giải trí thể thao tổng hợp, đáp ứng nhu cầu xem của hàng triệu khán giả Việt.</p>
550<h3>Đa dạng kênh cùng hệ thống để người dùng trải nghiệm</h3>
551<p>Mitomtv phát triển hệ thống đa kênh phong phú như mi tom 1, mitom 2, mitom live, mitom net hay mitom link, giúp người dùng dễ dàng lựa chọn đường truyền ổn định nhất. Mỗi kênh đều có giao diện riêng, tốc độ phát sóng nhanh và chất lượng hình ảnh sắc nét. Nhờ sự đa dạng này, người xem luôn có trải nghiệm mượt mà, không lo gián đoạn, dù truy cập vào bất kỳ thiết bị hay khung giờ nào.</p>
552<h3>Chất lượng hình ảnh, âm thanh vượt trội nhất</h3>
553<p>Một trong những yếu tố làm nên tên tuổi của trang xem bóng đá trực tiếp mitomtv chính là chất lượng hình ảnh Full HD và âm thanh sống động. Người xem sẽ cảm nhận được từng pha bóng, từng tiếng reo hò của khán giả như đang có mặt tại sân vận động. Đường truyền ổn định giúp giảm thiểu tình trạng giật lag, mitomTV không ngừng nâng cấp hệ thống để mang đến trải nghiệm mượt mà nhất cho khán giả.</p>
554<h3>MitomTV mang đến da dạng giải đấu &#8211; Cập nhật liên tục</h3>
555<p>MitomTV phát sóng hầu hết các giải đấu lớn trên thế giới như Ngoại Hạng Anh, La Liga, Serie A, Bundesliga, Champions League và cả World Cup. Ngoài ra, trang còn cập nhật thêm các giải đấu trong nước như V-League, Cúp Quốc gia. Lịch thi đấu và kết quả bóng đá được cập nhật liên tục, giúp người xem dễ dàng theo dõi mọi trận đấu hot trong ngày mà 
555không bỏ lỡ bất kỳ phút giây hấp dẫn nào.</p>
556<h3>Tốc độ tải trang xem bong da cực nhanh</h3>
557<p>Một ưu điểm đáng giá của mitomtv là tốc độ tải cực nhanh, giúp người dùng xem bóng đá mượt mà ngay cả khi mạng yếu. Hệ thống máy chủ phân tán thông minh giúp giảm tải cho từng khu vực. Đặc biệt, trang web tối ưu hiển thị quảng cáo ở mức tối thiểu, không che khuất nội dung, giúp người xem tập trung trọn vẹn vào trận đấu mà không bị làm phiền.</p>
558<h3>Đa dạng nội dung – từ trực tiếp đến tin tức bóng đá mới nhất</h3>
559<p>Không chỉ phát sóng trực tiếp các trận cầu hấp dẫn, mitomtv còn cập nhật tin tức bóng đá nhanh chóng, bảng xếp hạng, kết quả thi đấu, và lịch sử đối đầu giữa các đội. Tất cả đều được biên tập chuyên nghiệp, dễ đọc và phù hợp với người hâm mộ Việt Nam. Nhờ đó, người dùng có thể theo dõi toàn cảnh bóng đá thế giới chỉ tại một địa chỉ duy nhất &#8211; mitomtv.</p>
560<h3>Có các bình luận viên chuyên nghiệp, giàu cảm xúc</h3>
561<p>MitomTV sở hữu đội ngũ bình luận viên chuyên môn cao, am hiểu chiến thuật và có giọng nói truyền cảm. Họ mang đến những pha bình luận sống động, đôi khi hài hước nhưng vẫn giữ sự chuyên nghiệp. Đây là yếu tố giúp các trận đấu trên trang bóng đá live mitomtv trở nên hấp dẫn hơn, tăng trải nghiệm cảm xúc cho người xem và tạo nên bản sắc riêng biệt so với các trang web khác.</p>
562<h3>Tương thích với tất cả mọi thiết bị thông minh</h3>
563<p>MitomTV được tối ưu để hoạt động ổn định trên tất cả thiết bị – từ điện thoại Android, iPhone đến laptop hay Smart TV. Người dùng chỉ cần truy cập trang web hoặc tải ứng dụng để xem trực tiếp bóng đá hôm nay ở bất cứ đâu, bất cứ lúc nào. Sự tiện lợi này giúp mitomtv trở thành lựa chọn hàng đầu cho những ai yêu thích thể thao nhưng không muốn phụ thuộc vào tivi truyền thống.</p>
564<h2>Cách khắc phục link bị chặn khi tham gia vào mitomtv</h2>
565<div id="attachment_1183" style="width: 810px" class="wp-caption aligncenter"><img decoding="async" aria-describedby="caption-attachment-1183" class="size-full wp-image-1183" src="https://gohype.io/wp-content/uploads/2025/12/cach-khac-phuc-link-tham-gia-mitomtv.jpg" alt="cach khac phuc link tham gia mitomtv" width="800" height="400" title="Mitomtv - Trang xem bóng đá trực tiếp Mì tôm TV miễn phí #1 3" srcset="https://cdn.bananagames.io/wp-content/uploads/2025/12/cach-khac-phuc-link-tham-gia-mitomtv.jpg 800w, https://cdn.bananagames.io/wp-content/uploads/2025/12/cach-khac-phuc-link-tham-gia-mitomtv-300x150.jpg 300w, https://cdn.bananagames.io/wp-content/uploads/2025/12/cach-khac-phuc-link-tham-gia-mitomtv-768x384.jpg 768w" sizes="(max-width: 800px) 100vw, 800px" /><p id="caption-attachment-1183" class="wp-caption-text">Cách để người dùng có thể tham gia vào không bị chặn</p></div>
566<p>Khi truy cập mitomtv để xemtructiepbongda, đôi lúc người dùng gặp tình trạng link bị chặn hoặc không thể truy cập. Có nhiều cách khắc phục hiệu quả giúp bạn tiếp tục tận hưởng các trận cầu hấp dẫn mà không bị gián đoạn.</p>
567<h3>Sử dụng đường link dự phòng chính thức của mitomtv</h3>
568<p>Mitomtv luôn cung cấp nhiều link dự phòng để hỗ trợ người xem khi đường dẫn chính bị chặn. Bạn nên truy cập vào các tên miền thay thế như mitomtv1, mitomtv2 hoặc mitomlink để tiếp tục xem truc tiep bong da. Những link này được cập nhật liên tục, đảm bảo an toàn, ổn định và không bị chặn bởi các nhà mạng, giúp khán giả có thể xem mọi trận đấu mà không bị gián đoạn.</p>
569<h3>Dùng trình duyệt hỗ trợ vượt chặn như Opera hoặc Brave</h3>
570<p>Khi link bị chặn, việc đổi trình duyệt là cách đơn giản và hiệu quả. Các trình duyệt như Opera hoặc Brave có sẵn tính năng VPN giúp người dùng vượt qua giới hạn truy cập. Chỉ cần bật chế độ VPN tích hợp, bạn có thể truy cập mitomtv bình thường. Ngoài ra, các trình duyệt này còn chặn quảng cáo tự động, giúp việc xem bóng đá mượt mà và bảo mật hơn.</p>
571<h3>Bật và sử dụng VPN để thay đổi địa chỉ IP truy cập</h3>
572<p>VPN là giải pháp phổ biến giúp người dùng vượt qua tình trạng link bị chặn. Bạn có thể dùng các ứng dụng VPN miễn phí như UrbanVPN, ProtonVPN hoặc 1.1.1.1 để đổi IP sang quốc gia khác. Khi kích hoạt, hệ thống sẽ tự động cấp địa chỉ IP mới, giúp bạn truy cập mitomtv dễ dàng. Phương pháp này không chỉ khắc phục lỗi chặn link mà còn tăng tính bảo mật khi xem trực tiếp bóng đá miễn phí.</p>
573<h3>Xóa cache, cookie và lịch sử duyệt web trước khi truy cập lại</h3>
574<p>Đôi khi link gohype.io bị chặn do trình duyệt lưu dữ liệu cũ hoặc bị xung đột tạm thời. Người dùng nên vào phần cài đặt trình duyệt, chọn xóa cache, cookie và lịch sử truy cập. Sau đó, khởi động lại trình duyệt và truy cập lại mitomtv bằng link mới nhất. Cách làm này giúp làm mới kết nối, giảm lỗi tải trang và đảm bảo trải nghiệm xem bóng đá ổn định hơn.</p>
575<h3>Cập nhật link mới nhất từ mitom truc tiep bong da</h3>
576<p>Mitomtv có các kênh truyền thông chính thức như fanpage Facebook, nhóm Telegram và website cập nhật link mới mỗi ngày. Khi link cũ bị chặn, người xem chỉ cần truy cập nhữ
576ng nguồn này để lấy đường dẫn hoạt động ổn định nhất. Đây là cách an toàn nhất giúp bạn không bị dính phải các trang giả mạo, đồng thời bảo đảm tốc độ xem bóng đá luôn nhanh và mượt.</p>
577<h3>Sử dụng DNS công cộng để tăng khả năng truy cập trang web</h3>
578<p>Thay đổi DNS cũng là cách hữu hiệu để khắc phục tình trạng bị chặn link. Bạn có thể sử dụng DNS công cộng như Google DNS (8.8.8.8 – 8.8.4.4) hoặc Cloudflare DNS (1.1.1.1 – 1.0.0.1). Việc đổi DNS không chỉ giúp truy cập mitomtv nhanh hơn mà còn ổn định, tránh tình trạng bị nhà mạng giới hạn. Cách này đặc biệt hiệu quả với người dùng máy tính và điện thoại Android.</p>
579<h2>Mi tom tivi có bản quyền của tất cả các giải đấu hàng đầu</h2>
580<div id="attachment_1190" style="width: 810px" class="wp-caption aligncenter"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-1190" class="size-full wp-image-1190" src="https://gohype.io/wp-content/uploads/2025/12/mitomtv-co-ban-quyen-cua-cac-giai-dau-hang-dau.jpg" alt="mitomtv co ban quyen cua cac giai dau hang dau" width="800" height="400" title="Mitomtv - Trang xem bóng đá trực tiếp Mì tôm TV miễn phí #1 4" srcset="https://cdn.bananagames.io/wp-content/uploads/2025/12/mitomtv-co-ban-quyen-cua-cac-giai-dau-hang-dau.jpg 800w, https://cdn.bananagames.io/wp-content/uploads/2025/12/mitomtv-co-ban-quyen-cua-cac-giai-dau-hang-dau-300x150.jpg 300w, https://cdn.bananagames.io/wp-content/uploads/2025/12/mitomtv-co-ban-quyen-cua-cac-giai-dau-hang-dau-768x384.jpg 768w" sizes="auto, (max-width: 800px) 100vw, 800px" /><p id="caption-attachment-1190" class="wp-caption-text">Tất cả giải đấu hàng đầu trên thế giới đều có mặt tại đây</p></div>
581<p>gohype.io là địa chỉ quen thuộc của người hâm mộ bóng đá khi muốn theo dõi những trận cầu đỉnh cao mỗi ngày. Trang liên tục cập nhật các giải đấu lớn nhỏ trên thế giới, đảm bảo mang đến cho người xem những phút giây cuồng nhiệt.</p>
582<h3>Xem bóng đá trực tiếp Ngoại Hạng Anh</h3>
583<p>Mitomtv phát sóng đầy đủ các trận đấu của Ngoại Hạng Anh – giải bóng đá được yêu thích nhất thế giới. Người xem có thể theo dõi những cuộc đối đầu nảy lửa giữa Manchester United, Liverpool, Arsenal hay Manchester City với hình ảnh sắc nét, bình luận tiếng Việt rõ ràng. Các trận đấu được cập nhật lịch phát sóng sớm giúp khán giả chủ động sắp xếp thời gian theo dõi.</p>
584<h3>Xem bd La Liga &#8211; Nơi hội tụ những nghệ sĩ sân cỏ Tây Ban Nha</h3>
585<p>La Liga luôn thu hút người hâm mộ bởi phong cách thi đấu kỹ thuật, đậm chất nghệ thuật. Mitomtv phát sóng toàn bộ các trận đấu của Real Madrid, Barcelona, Atletico Madrid cùng nhiều câu lạc bộ nổi tiếng khác. Với đường truyền ổn định và bình luận cuốn hút, người xem sẽ được hòa mình vào không khí sôi động của giải đấu hàng đầu Tây Ban Nha mỗi tuần.</p>
586<h3>Xem bd truc tiep Serie A</h3>
587<p>Mitomtv mang đến trọn vẹn các trận cầu hấp dẫn của Serie A – giải đấu nơi chiến thuật và kỷ luật được đặt lên hàng đầu. Những màn đối đầu giữa AC Milan, Inter Milan, Juventus hay Napoli luôn được phát sóng trực tiếp với chất lượng cao. Người xem không chỉ được thưởng thức bóng đá đẹp mắt mà còn hiểu thêm về chiến thuật đặc trưng của bóng đá Ý.</p>
588<h3>Xem TTBD Champions League</h3>
589<p>Champions League luôn là tâm điểm của người hâm mộ mỗi khi đến mùa giải mới. Mitomtv cập nhật nhanh lịch thi đấu và phát sóng toàn bộ các trận đấu của giải đấu danh giá này. Xem trực tiếp bóng đá full HD hôm nay, bình luận viên chuyên nghiệp và tốc độ tải mượt mà, người xem được sống trọn cảm xúc cùng những “đêm không ngủ” của bóng đá châu Âu.</p>
590<h3>Xem bong da World Cup &#8211; Ngày hội lớn nhất của bong da mitom</h3>
591<p>Mitomtv không thể thiếu các trận đấu cá»§a World Cup – nÆ¡i quy tụ những đội tuyển mạnh nhất thế giới. Người hâm mộ được theo dõi từng pha bóng, từng bàn thắng kinh điển cá»§a các siêu sao hàng đá
591º§u. Vào kỳ world cup sắp tới, mitomtv mang đến đường truyền ổn định, tốc độ cao, giúp hàng triệu fan bóng đá Việt Nam xem ttbd world cup 2026 trọn vẹn và cháy hết mình cùng đam mê.</p>
592<h3>Trực tiếp bóng đá Copa America &#8211; Giải vô địch bóng đá hàng đầu Nam Mỹ</h3>
593<p>Copa America là giải vô địch bóng đá lâu đời nhất thế giới, quy tụ các đội tuyển hàng đầu Nam Mỹ như Brazil, Argentina, Uruguay và Chile. Giải đấu được tổ chức bốn năm một lần, mang đến những màn so tài đỉnh cao, giàu cảm xúc và kỹ thuật. Mitomtv phát sóng đầy đủ Copa America với chất lượng HD, giúp người hâm mộ Việt Nam thưởng thức trọn vẹn từng pha bóng và bàn thắng mãn nhãn.</p>
594<h3>Xem trực tiếp đá bóng các giải đấu châu Á và tại trong nước</h3>
595<p>Không chỉ dừng lại ở sân chơi quốc tế, mitomtv còn phát sóng các giải đấu châu Á như AFC Cup, Asian Cup và đặc biệt là V-League – niềm tự hào của bóng đá Việt Nam. Người hâm mộ dễ dàng theo dõi các trận đấu của đội tuyển quốc gia, CLB trong nước và cập nhật lịch thi đấu, kết quả chi tiết từng vòng. Đây là điểm cộng lớn giúp trang xem bong da mitomtv chiếm được cảm tình của fan Việt.</p>
596<h2>Link truy cập an toàn vào trang xem bóng đá mì tôm</h2>
597<div id="attachment_1189" style="width: 810px" class="wp-caption aligncenter"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-1189" class="size-full wp-image-1189" src="https://gohype.io/wp-content/uploads/2025/12/link-truy-cap-vao-trang-mitomtv.jpg" alt="link truy cap vao trang mitomtv" width="800" height="400" title="Mitomtv - Trang xem bóng đá trực tiếp Mì tôm TV miễn phí #1 5" srcset="https://cdn.bananagames.io/wp-content/uploads/2025/12/link-truy-cap-vao-trang-mitomtv.jpg 800w, https://cdn.bananagames.io/wp-content/uploads/2025/12/link-truy-cap-vao-trang-mitomtv-300x150.jpg 300w, https://cdn.bananagames.io/wp-content/uploads/2025/12/link-truy-cap-vao-trang-mitomtv-768x384.jpg 768w" sizes="auto, (max-width: 800px) 100vw, 800px" /><p id="caption-attachment-1189" class="wp-caption-text">Truy cập qua link được cung cấp để có trải nghiệm an toàn</p></div>
598<p>Việc truy cập đúng đường dẫn chính thức của mitomtv giúp người dùng tránh được các rủi ro như virus, mã độc hay trang giả mạo. Nhiều website mạo danh mitomtv xuất hiện nhằm phát tán quảng cáo độc hại hoặc đánh cắp thông tin người dùng. Vì vậy, người xem nên tìm link truy cập thông qua các nguồn uy tín, được xác thực từ trang chủ hoặc fanpage chính thức để đảm bảo an toàn tuyệt đối khi xem bd tt.</p>
599<p>Mitomtv luôn duy trì hệ thống bảo mật SSL giúp mã hóa toàn bộ dữ liệu người dùng, ngăn chặn rò rỉ thông tin cá nhân khi truy cập. Bên cạnh đó, trang còn thường xuyên cập nhật và thay đổi tên miền dự phòng để đảm bảo người xem không bị gián đoạn khi nhà mạng chặn link. Tất cả các đường dẫn đều được kiểm duyệt kỹ, giúp trải nghiệm xem bóng đá trực tuyến luô
599n mượt mà và an toàn.</p>
600<p>Để đảm bảo xem bd truc tuyen hom nay ổn định, người dùng nên lưu lại địa chỉ truy cập chính thức của mitomtv và tránh click vào các link xuất hiện trên mạng xã hội không rõ nguồn gốc. Bạn cũng có thể theo dõi các trang phụ trợ thuộc hệ thống mitomtv như mitom link hoặc mitom live để tìm link thay thế khi cần thiết. Việc sử dụng đúng địa chỉ giúp người xem yên tâm tận hưởng các trận đấu hấp dẫn.</p>
601<h2>Mitomtv cập nhật các bình luận viên với chuyên môn cao</h2>
602<div id="attachment_1191" style="width: 810px" class="wp-caption aligncenter"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-1191" class="size-full wp-image-1191" src="https://gohype.io/wp-content/uploads/2025/12/mitomtv-co-cac-blv-chuyen-sau.jpg" alt="mitomtv co cac blv chuyen sau" width="800" height="400" title="Mitomtv - Trang xem bóng đá trực tiếp Mì tôm TV miễn phí #1 6" srcset="https://cdn.bananagames.io/wp-content/uploads/2025/12/mitomtv-co-cac-blv-chuyen-sau.jpg 800w, https://cdn.bananagames.io/wp-content/uploads/2025/12/mitomtv-co-cac-blv-chuyen-sau-300x150.jpg 300w, https://cdn.bananagames.io/wp-content/uploads/2025/12/mitomtv-co-cac-blv-chuyen-sau-768x384.jpg 768w" sizes="auto, (max-width: 800px) 100vw, 800px" /><p id="caption-attachment-1191" class="wp-caption-text">Trang web có các BLV với sự am hiểu sâu rộng về bóng đá</p></div>
603<p>Trang xem bóng đá trực tuyến Mitomtv không chỉ nổi tiếng nhờ chất lượng phát sóng ổn định, tốc độ nhanh và hình ảnh sắc nét mà còn được khán giả yêu thích bởi đội ngũ bình luận viên có chuyên môn cao, giàu kinh nghiệm và truyền cảm hứng.</p>
604<h3>BLV Tuấn Anh &#8211; Phân tích chiến thuật sắc bén, chuyên nghiệp</h3>
605<p>Tuấn Anh là bình luận viên nổi bật được mitomtv hợp tác thường xuyên trong các trận cầu quốc tế. Với phong cách bình luận hiện đại, anh có khả năng phân tích chiến thuật nhanh, chính xác và dễ hiểu. Giọng nói mạnh mẽ, cách diễn đạt rõ ràng giúp khán giả nắm bắt tình huống trên sân tức thì. Anh luôn tạo sự kịch tính và truyền cảm hứng cho người xem trong từng pha bóng căng thẳng.</p>
606<h3>BLV long Vũ &#8211; Giọng nói truyền cảm, giàu cảm xúc</h3>
607<p>Long Vũ là gương mặt quen thuộc trên sóng trực tiếp bóng đá và được mitomtv tin tưởng mời tham gia bình luận nhiều giải đấu lớn. Anh có giọng nói trầm ấm, truyền cảm, tạo nên sự hấp dẫn cho mỗi trận đấu. Bên cạnh đó, anh còn có khiếu hài hước, giúp không khí trở nên sôi nổi và gần gũi. Với khả năng dẫn dắt khéo léo, Long Vũ luôn khiến khán giả cuốn theo từng pha bóng kịch tính.</p>
608<h3>BLV Quang Huy &#8211; Kinh nghiệm dày dạn, phong cách chuyên nghiệp</h3>
609<p>Trang xem bd live Mitomtv tự hào khi được hợp tác với BLV Quang Huy – người đã có hơn 20 năm gắn bó với nghề. Anh mang đến cho người xem cái nhìn sâu sắc, khách quan và chuyên nghiệp trong từng lời bình. Giọng nói truyền cảm, dứt khoát cùng sự am hiểu sâu về bóng đá giúp Quang Huy trở thành biểu tượng trong làng bình luận Việt Nam.</p>
610<h3>BLV Huy Phước &#8211; Cảm xúc mãnh liệt, phong cách độc đáo</h3>
611<p>Huy Phước là cái tên gắn liền với nhiều thế hệ khán giả yêu bóng đá Việt. Mitomtv đánh giá cao anh nhờ phong cách bình luận đậm cá tính, giàu cảm xúc và cách lựa chọn từ ngữ tinh tế. Anh khiến mỗi trận cầu trở nên sống động, hấp dẫn và đầy nhiệt huyết. Dưới giọng nói quen thuộc ấy, người hâm mộ cảm nhận rõ tinh thần thể thao và niềm đam mê cháy bỏng trên sân cỏ.</p>
612<h3>BLV Khắc Cường &#8211; Trẻ trung, am hiểu sâu về bóng đá quốc tế</h3>
613<p>Khắc Cường là bình luận viên trẻ năng động được mitomtv tin tưởng giao phó các trận đấu châu Âu. Anh tường thuật tructiepbongda các giải đấu lớn như Premier League hay Champions League. Phong cách bình luận rõ ràng, tốc độ nhanh và chính xác giúp anh tạo ấn tượng mạnh. Sự trẻ trung và nhiệt huyết khiến Khắc Cường trở thành gương mặt được khán giả trẻ yêu thích.</p>
614<h3>BLV Anh Ngọc &#8211; Phong cách nhẹ nhàng, tinh tế và nhiều chiều sâu</h3>
615<p>BLV Anh Ngọc là giọng nói được khán giả yêu thích vì sự điềm đạm, sâu sắc. Trang bongdatructiep Mitomtv mời anh tham gia bình luận các trận cầu lớn, nơi anh thể hiện sự am hiểu và p
615hân tích tinh tế. Cách bình luận của Anh Ngọc không ồn ào mà cuốn hút nhờ giọng nói truyền cảm, dễ chịu. Anh giúp người xem hiểu thêm về văn hóa, lối chơi và tâm lý cầu thủ qua từng nhận định chuyên sâu.</p>
616<h3>BLV Thành Lương &#8211; Sôi động và truyền năng lượng tích cực</h3>
617<p>Thành Lương là bình luận viên trẻ đại diện cho thế hệ mới của mitomtv. Anh có phong cách bình luận hiện đại, gần gũi, kết hợp giữa sự chuyên môn và tính giải trí. Cách dẫn dắt dí dỏm, linh hoạt giúp anh tạo không khí sôi động trong mỗi trận đấu. Với giọng nói rõ ràng, nhịp bình ổn định và kiến thức vững vàng, Thành Lương góp phần mang lại sức sống mới cho kênh bình luận thể thao của mì tôm tv.</p>
618<h2>Danh sách các kênh cùng hệ thống với trang web mitomtv</h2>
619<div id="attachment_1186" style="width: 810px" class="wp-caption aligncenter"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-1186" class="size-full wp-image-1186" src="https://gohype.io/wp-content/uploads/2025/12/danh-sach-kenh-cung-he-thong-mitomtv.jpg" alt="danh sach kenh cung he thong mitomtv" width="800" height="400" title="Mitomtv - Trang xem bóng đá trực tiếp Mì tôm TV miễn phí #1 7" srcset="https://cdn.bananagames.io/wp-content/uploads/2025/12/danh-sach-kenh-cung-he-thong-mitomtv.jpg 800w, https://cdn.bananagames.io/wp-content/uploads/2025/12/danh-sach-kenh-cung-he-thong-mitomtv-300x150.jpg 300w, https://cdn.bananagames.io/wp-content/uploads/2025/12/danh-sach-kenh-cung-he-thong-mitomtv-768x384.jpg 768w" sizes="auto, (max-width: 800px) 100vw, 800px" /><p id="caption-attachment-1186" class="wp-caption-text">Có thể tham gia các kênh phụ để trải nghiệm xem bóng đá</p></div>
620<p>Để phục vụ lượng người xem ngày càng tăng, mitomtv phát triển nhiều kênh phụ trợ nằm trong cùng hệ thống. Các kênh này hoạt động ổn định, giúp người hâm mộ dễ dàng truy cập, theo dõi bóng đá mọi lúc mọi nơi mà không lo gián đoạn.</p>
621<ul>
622<li style="font-weight: 400;" aria-level="1"><strong>Mitom 2</strong>: Mitom2 được xây dựng như kênh dự phòng, hoạt động song song với trang chính, đảm bảo người xem luôn có link xem bóng đá trực tiếp, truy cập ổn định khi lượng truy cập tăng cao.</li>
623<li style="font-weight: 400;" aria-level="1"><strong>Mitom tv1</strong>: Mitom tv1 chuyên phát sóng các trận cầu quốc tế, đặc biệt là các giải đấu lớn như Champions League, Europa League, Copa America và World Cup.</li>
624<li style="font-weight: 400;" aria-level="1"><strong>Mitom 5</strong>: Mitom 5 được thiết kế tối ưu cho người dùng di động, giao diện gọn nhẹ, tốc độ tải nhanh, giúp khán giả xem bóng đá mượt mà dù ở bất cứ đâu.</li>
625<li style="font-weight: 400;" aria-level="1"><strong>Mitom 1</strong>: Mitom1 là kênh cung cấp link xem trực tiếp các trận đấu trong nước, bao gồm V-League và các giải giao hữu có đội tuyển Việt Nam tham gia. Mì tôm 1 là một trong những kênh phụ đầu tiên của hệ thống.</li>
626<li style="font-weight: 400;" aria-level="1"><strong>Mitom live</strong>: Mitom live là kênh phát sóng trực tiếp bóng đá theo thời gian thực, giúp người xem theo dõi trận đấu ngay khi bóng lăn, không độ trễ, không giật lag.</li>
627<li style="font-weight: 400;" aria-level="1"><strong>Mitom in</strong>: Mitom in tập trung vào tin tức bóng đá và phân tích chuyên sâu, cập nhật nhanh chóng tình hình các giải đấu, chuyển nhượng, đội hình và phong độ cầu thủ.</li>
628<li style="font-weight: 400;" aria-level="1"><strong>Mitom link</strong>: Mitom link là nơi tổng hợp xem bd link chất lượng cao, giúp người dùng nhanh chóng tìm được đường dẫn ổn định, phù hợp với tốc độ mạng của mình.</li>
629<li style="font-weight: 400;" aria-level="1"><strong>Mitom 1 tv</strong>: Mitom1 tv phục vụ các trận đấu quốc tế tầm trung, giải trẻ và giao hữu, đảm bảo người hâm mộ luôn có nguồn xem phong p
629hú, đa dạng và đáng tin cậy.</li>
630<li style="font-weight: 400;" aria-level="1"><strong>Mitom net</strong>: Mitom net là cổng thông tin tổng hợp, cung cấp lịch thi đấu, kết quả, bảng xếp hạng và tin thể thao nóng hổi, đồng thời liên kết trực tiếp đến các kênh xem chính.</li>
631<li style="font-weight: 400;" aria-level="1"><strong>Mitom1 live</strong>: Mitom1 live là kênh chuyên phát sóng các trận cầu đêm khuya và giải đấu châu Âu, mang đến trải nghiệm trọn vẹn cho fan yêu bóng đá quốc tế.</li>
632<li style="font-weight: 400;" aria-level="1"><strong>Mitom3</strong>: Mitom3 là trang hỗ trợ phát sóng song song với các kênh chính, giúp người xem dễ dàng chuyển đổi khi có sự cố hoặc cần tìm link thay thế nhanh chóng.</li>
633</ul>
634<h2>Hướng dẫn người dùng xem live bóng đá trên mitomtv</h2>
635<div id="attachment_1188" style="width: 810px" class="wp-caption aligncenter"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-1188" class="size-full wp-image-1188" src="https://gohype.io/wp-content/uploads/2025/12/huong-dan-nguoi-dung-tham-gia-mitomtv.jpg" alt="huong dan nguoi dung tham gia mitomtv" width="800" height="400" title="Mitomtv - Trang xem bóng đá trực tiếp Mì tôm TV miễn phí #1 8" srcset="https://cdn.bananagames.io/wp-content/uploads/2025/12/huong-dan-nguoi-dung-tham-gia-mitomtv.jpg 800w, https://cdn.bananagames.io/wp-content/uploads/2025/12/huong-dan-nguoi-dung-tham-gia-mitomtv-300x150.jpg 300w, https://cdn.bananagames.io/wp-content/uploads/2025/12/huong-dan-nguoi-dung-tham-gia-mitomtv-768x384.jpg 768w" sizes="auto, (max-width: 800px) 100vw, 800px" /><p id="caption-attachment-1188" class="wp-caption-text">Thực hiện vài bước đơn giản để có thể tham gia vào trang web</p></div>
636<p>Mitomtv mang đến trải nghiệm xem truc tiep bd nhanh, ổn định và dễ thao tác. Chỉ với vài bước đơn giản dưới đây, bạn có thể thưởng thức ngay các trận cầu đỉnh cao cùng bình luận tiếng Việt sống động.</p>
637<h3>Bước 1 &#8211; Truy cập đúng đường dẫn mitomtv chính thức</h3>
638<p>Người dùng nên truy cập đúng link chính thức của mitomtv từ nguồn uy tín như gohype.io. Điều này giúp tránh việc bị chuyển hướng sang website giả mạo, chứa quảng cáo độc hại hoặc gây mất an toàn cho thiết bị.</p>
639<h3>Bước 2 &#8211; Hãy chọn cho mình một trận đấu</h3>
640<p>Sau khi vào trang chủ, bạn chỉ cần chọn mục “Trực tiếp hôm nay” hoặc “Lịch phát sóng”. Tại đây, danh sách các trận cầu hot nhất được cập nhật liên tục giúp bạn dễ dàng tìm và theo dõi trận đấu yêu thích.</p>
641<h3>Bước 3 &#8211; Nhấn vào link phát sóng ổn định nhất</h3>
642<p>Mi tom tv luôn cung cấp nhiều link dự phòng để người xem lựa chọn. Bạn nên chọn đường truyền có biểu tượng ổn định cao hoặc ít người truy cập nhằm đảm bảo video phát mượt mà, không giật lag hay gián đoạn trong suốt trận đấu.</p>
643<h3>Bước 4 &#8211; Tùy chỉnh chế độ xem phù hợp thiết bị</h3>
644<p>Tùy theo tốc độ mạng và loại thiết bị, người dùng có thể chỉnh chất lượng video từ 480p đến Full HD. Ngoài ra, bạn có thể bật chế độ toàn màn hình, tăng giảm âm thanh, hoặc chuyển sang chế độ ban đêm để xem dễ chịu hơn.</p>
645<h3>Bước 5 &#8211; Tham gia bình luận và chia sẻ cảm xúc</h3>
646<p>Khi trận đấu diễn ra, bạn có thể tham gia khung bình luận ngay dưới video, chia sẻ cảm xúc, dự đoán tỉ số hoặc bàn luận cùng cộng đồng fan. Đây là tính năng đặc biệt giúp người xem cảm thấy gắn kết và hào hứng hơn khi xem trực tuyến bóng đá.</p>
647<h2>Cách tải ứng dụng bong da mi tom về thiết bị nhanh chóng</h2>
648<div id="attachment_1184" style="width: 810px" class="wp-caption aligncenter"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-1184" class="size-full wp-image-1184" src="https://gohype.io
648/wp-content/uploads/2025/12/cach-tai-ung-dung-mitomtv.jpg" alt="cach tai ung dung mitomtv" width="800" height="400" title="Mitomtv - Trang xem bóng đá trực tiếp Mì tôm TV miễn phí #1 9" srcset="https://cdn.bananagames.io/wp-content/uploads/2025/12/cach-tai-ung-dung-mitomtv.jpg 800w, https://cdn.bananagames.io/wp-content/uploads/2025/12/cach-tai-ung-dung-mitomtv-300x150.jpg 300w, https://cdn.bananagames.io/wp-content/uploads/2025/12/cach-tai-ung-dung-mitomtv-768x384.jpg 768w" sizes="auto, (max-width: 800px) 100vw, 800px" /><p id="caption-attachment-1184" class="wp-caption-text">Tải app cực đơn giản, nhanh chóng ai cũng có thể làm được</p></div>
649<p>Để mang đến trải nghiệm xem bd trực tuyến tiện lợi mọi lúc, mitomtv đã phát triển ứng dụng dành riêng cho điện thoại và máy tính. Chỉ cần vài thao tác đơn giản, bạn có thể tải app mitomtv về thiết bị trong tích tắc.</p>
650<h3>Hướng dẫn tải cho iOS</h3>
651<ul>
652<li style="font-weight: 400;" aria-level="1"><strong>Bước 1</strong>: Người dùng truy cập App Store, nhập từ khóa “mitomtv” vào ô tìm kiếm để hiển thị ứng dụng chính thức có biểu tượng đặc trưng màu xanh và logo quả bóng.</li>
653<li style="font-weight: 400;" aria-level="1"><strong>Bước 2</strong>: Kiểm tra kỹ thông tin nhà phát hành để tránh tải nhầm app giả mạo. Sau đó, nhấn nút “Tải về” hoặc “Get” để bắt đầu quá trình cài đặt tự động.</li>
654<li style="font-weight: 400;" aria-level="1"><strong>Bước 3</strong>: Sau khi tải xong, ứng dụng mi tôm tv sẽ tự động cài đặt vào thiết bị. Bạn chỉ cần nhấn “Mở” để truy cập giao diện chính và bắt đầu xem bóng đá.</li>
655<li style="font-weight: 400;" aria-level="1"><strong>Bước 4</strong>: Người dùng có thể đăng nhập tài khoản để lưu lịch sử xem, chọn chất lượng video, bật thông báo trận đấu yêu thích và trải nghiệm toàn bộ tính năng mượt mà của ứng dụng mitomtv.</li>
656</ul>
657<h3>Hướng dẫn tải cho Android</h3>
658<ul>
659<li style="font-weight: 400;" aria-level="1"><strong>Bước 1</strong>: Truy cập vào website chính thức của trang xembd live mitomtv, tìm mục “Tải ứng dụng Android” để lấy đường dẫn tải file .apk an toàn, tránh nhầm với các nguồn không chính thống.</li>
660<li style="font-weight: 400;" aria-level="1"><strong>Bước 2</strong>: Sau khi đã tải xong file apk, vào phần “Cài đặt” của điện thoại, bật tùy chọn cho phép cài đặt ứng dụng từ nguồn không xác định để có thể tiến hành cài đặt.</li>
661<li style="font-weight: 400;" aria-level="1"><strong>Bước 3</strong>: Mở file .apk vừa tải về, nhấn “Cài đặt” và chờ vài giây để quá trình cài đặt hoàn tất. Khi cài đặt xong, biểu tượng mitomtv sẽ xuất hiện trên màn hình chính.</li>
662<li style="font-weight: 400;" aria-level="1"><strong>Bước 4</strong>: Mở ứng dụng mitomtv, đăng nhập hoặc xem ngay mà không cần tài khoản. Bạn có thể xem bd trực tiếp, cập nhật tin tức và lịch thi đấu nhanh chóng, tiện lợi.</li>
663</ul>
664<h2>Đánh giá của người dùng về trang xem bóng đá mitomtv</h2>
665<div id="attachment_1185" style="width: 810px" class="wp-caption aligncenter"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-1185" class="size-full wp-image-1185" src="https://gohype.io/wp-content/uploads/2025/12/danh-gia-cua-nguoi-dung-ve-mitomtv.jpg" alt="danh gia cua nguoi dung ve mitomtv" width="800" height="400" title="Mitomtv - Trang xem bóng đá trực tiếp Mì tôm TV miễn phí #1 10" srcset="https://cdn.bananagames.io/wp-content/uploads/2025/12/danh-gia-cua-nguoi-dung-ve-mitomtv.jpg 800w, https://cdn.bananagames.io/wp-content/uploads/2025/12/danh-gia-cua-nguoi-dung-ve-mitomtv-300x150.jpg 300w, https://cdn.bananagames.io/wp-content/uploads/2025/12/danh-gia-cua-nguoi-dung-ve-mitomtv-768x384.jpg 768w" sizes="auto, (max-width: 800px) 100v
665w, 800px" /><p id="caption-attachment-1185" class="wp-caption-text">Một số những đánh giá về trang web của người xem khắp Việt Nam</p></div>
666<p>Mitomtv nhận được rất nhiều phản hồi tích cực từ cộng đồng người hâm mộ bóng đá Việt Nam. Dưới đây là những cảm nhận chân thật nhất từ khán giả thường xuyên sử dụng trang xem trực tiếp bóng đá này.</p>
667<ul>
668<li style="font-weight: 400;" aria-level="1"><strong>Anh Minh – Hà Nội</strong>: Tôi đã xem bóng đá trên mitomtv hơn 2 năm nay, chất lượng hình ảnh rất sắc nét và ổn định. Đặc biệt, tốc độ tải nhanh, không bị giật lag ngay cả khi xem vào giờ cao điểm.</li>
669<li style="font-weight: 400;" aria-level="1"><strong>Chị Lan – TP. Hồ Chí Minh</strong>: Mitom truc tiep có giao diện thân thiện, dễ sử dụng và ít quảng cáo. Tôi thường xem các trận Ngoại hạng Anh vào cuối tuần, cảm giác mượt mà và bình luận viên nói rất tự nhiên, cuốn hút.</li>
670<li style="font-weight: 400;" aria-level="1"><strong>Anh Huy – Đà Nẵng</strong>: Tôi thích nhất là mitomtv luôn có nhiều link dự phòng để chọn. Dù mạng yếu vẫn xem được, không bị ngắt quãng. Đây là điểm cộng lớn mà nhiều trang khác không làm được.</li>
671<li style="font-weight: 400;" aria-level="1"><strong>Bạn Linh – Hải Phòng</strong>: Mitomtv mang lại cảm giác như đang xem trên TV thật. Hình ảnh HD cực rõ nét, âm thanh sống động, tốc độ truyền tải tốt. Tôi hài lòng và thường chia sẻ link xem trực tiếp bóng đá cho bạn bè cùng xem.</li>
672<li style="font-weight: 400;" aria-level="1"><strong>Anh Tuấn – Cần Thơ</strong>: Trang này không chỉ chiếu bóng đá trực tiếp mà còn cập nhật tin tức, lịch thi đấu và kết quả bóng đá hôm nay rất nhanh. Tôi chỉ cần vào mitomtv là nắm được mọi thứ trong vài phút.</li>
673<li style="font-weight: 400;" aria-level="1"><strong>Chị Thảo – Bình Dương</strong>: Tôi thường xem bóng đá qua điện thoại, và trang ttbd mitomtv hoạt động cực kỳ ổn định. Ứng dụng nhẹ, dễ tải, không tốn dung lượng. Giao diện hiển thị rõ ràng, phù hợp cho người dùng di động.</li>
674<li style="font-weight: 400;" aria-level="1"><strong>Anh Long – Nha Trang</strong>: Mitomtv có đội ngũ bình luận viên chuyên nghiệp, giọng dễ nghe, truyền cảm. Họ không chỉ bình luận hay mà còn mang đến nhiều thông tin thú vị, giúp tôi hiểu thêm về chiến thuật và cầu thủ.</li>
675<li style="font-weight: 400;" aria-level="1"><strong>Bạn Phương – Hà Nam</strong>: Tôi rất thích tính năng bình luận trực tiếp của trang xembd line mitomtv. Có thể trò chuyện với nhiều người cùng xem, cảm giác rất vui. Đây đúng là nơi tụ họp của fan bóng đá Việt Nam.</li>
676<li style="font-weight: 400;" aria-level="1"><strong>Anh Nam – Quảng Ninh</strong>: Tôi từng thử nhiều trang khác nhưng quay lại dùng mitomtv vì tốc độ ổn định và không quảng cáo che màn hình. Xem trên laptop hoặc điện thoại đều mượt, không gián đoạn.</li>
677<li style="font-weight: 400;" aria-level="1"><strong>Chị Hằng – Nghệ An</strong>: Mitomtv thực sự là lựa chọn hàng đầu để xem bd truc tiep keo nha cai miễn phí. Giao diện đẹp, tốc độ nhanh, nội dung phong phú và có đủ mọi giải đấu lớn nhỏ trên thế giới. Tôi đánh giá 10/10.</li>
678</ul>
679<h2>Tổng kết</h2>
680<p>Mitomtv hiện là một trong những trang xem bđ trực tiếp hôm nay uy tín và phổ biến nhất tại Việt Nam. Với chất lượng phát sóng ổn định và đội ngũ bình luận viên chuyên nghiệp, trang web luôn mang đến trải nghiệm xem bóng đá tuyệt vời nhất. Đây chính là điểm đến hoàn hảo cho mọi người yêu bóng đá, muốn theo dõi nhữ
680ng trận cầu đỉnh cao mọi lúc, mọi nơi.</p>
681          </div>
682        </div>
683      </div>
684    </div>
685  </div>
686</section>
687    </main>
688    
688<script>
689// Sample data (trận đấu)
690const matches ={};
691</script>
691
692<!-- Footer -->
693<!-- <footer class="footer">
694      <div class="container">
695        <div class="footer__content">
696          <p style="font-size: 14px">
697            Bản quyền bởi
698            <a href="#"><span class="text-primary">CakhiaTV</span></a> - All
699            rights reserved
700          </p>
701        </div>
702      </div>
703    </footer> -->
704<footer style="background-color: #111; color: #fff;  padding: 30px 15px;">
705
706    <div class="container">
707        <div class="footer-column-top">
708
709            <img src="https://cdn.bananagames.io/wp-content/themes/cakhiatv/assets/images/mitomtv.png" alt="Xoilac TV" style="vertical-align: middle; height: 70px;margin-bottom:15px">
710            <div style="margin-top: 15px;">
711                <a href="#"><img src="https://cdn.bananagames.io/wp-content/wp-content/uploads/2025/04/icon-facebook.webp" alt="Facebook" style="width: 24px; margin: 0 5px;"></a>
712                <a href="#" rel="nofollow" target="_blank"><img src="/wp-content/uploads/2025/04/twitter_x-logo-freelogovectors.net_.png" alt="Twitter" style="width: 24px; margin: 0 5px;"></a>
713                <a href="#" rel="nofollow" target="_blank"><img src="https://cdn.bananagames.io/wp-content/wp-content/uploads/2025/04/pngimg.com-twitch_PNG28.png" alt="Twitch" style="width: 24px; margin: 0 5px;"></a>
714                <a href="#" rel="nofollow" target="_blank"><img src="https://cdn.bananagames.io/wp-content/wp-content/uploads/2025/04/Youtube_logo.png" alt="Youtube" style="width: 24px; margin: 0 5px;"></a>
715                <a href="#" rel="nofollow" target="_blank"><img src="https://cdn.bananagames.io/wp-content/wp-content/uploads/2025/04/reddit-logo-1.png" alt="Reddit" style="width: 24px; margin: 0 5px;"></a>
716                <a href="#" rel="nofollow" target="_blank"><img src="https://cdn.bananagames.io/wp-content/wp-content/uploads/2025/04/pngimg.com-pinterest_PNG63.png" alt="Pinterest" style="width: 24px; margin: 0 5px;"></a>
717                <a href="#" rel="nofollow" target="_blank"><img src="https://cdn.bananagames.io/wp-content/wp-content/uploads/2025/04/free-tumblr-logo-icon-2434-thumb.png" alt="Tumblr" style="width: 24px; margin: 0 5px;"></a>
718            </div>
719
720        </div>
721
722
723  <div class="footer-content">
724        <div class="footer-column">
725            <div class="footer-title">
726                VỀ CHÚNG TÔI
727            </div>
728            <p class="footer-descript">
729                  <p><strong><a href="/">Mitomtv</a></strong> mang đến trải nghiệm xem bóng đá trực tuyến theo phong cách hiện đại, nhanh – gọn – chuẩn và chất lượng. Nền tảng mitom tv tập trung tối ưu tốc độ truyền tải, giúp người xem trực tiếp bóng đá theo dõi mọi trận đấu với hình ảnh rõ nét, âm thanh ổn định và hạn chế tối đa giật lag.</p>
730            </p>
731        </div>
732
733        <div class="footer-column">
734            <div class="footer-title">
735                DANH MỤC
736            </div>
737            <ul>
738<li><strong><a href="/dieu-khoan-su-dung">Điều khoản sử dụng</a></strong></li>
739<li><strong><a href="/chinh-sach-bao-mat">Chính sách bảo mật</a></strong></li>
740<li><strong><a href="/mien-tru-trach-nhiem">Miễn trừ trách nhiệm</a></strong></li>
741<li><a href="/lien-he"><strong>Liên hệ</strong></a></li>
742</ul>
743        </div>
744
745        <div class="footer-column">
746            <div class="footer-title">
747                LIÊN HỆ
748            </div>
749        <ul>
750<li style="list-style-type: none">
751<ul>
752<li class="footer-text"><strong>Tên doanh nghiệp</strong>: <strong>MITOMTV</strong></li>
753<li class="footer-text"><strong>Số điện thoại</strong>: 0907 037 073</li>
754<li class="footer-text"><strong>Email</strong>: <a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="f19c98859e9c8587c1c6c2b1969c90989ddf929e9c">[email&#160;protected]</a></li>
755<li class="footer-text"><strong>Địa chỉ</strong>: <a href="https://maps.app.goo.gl/FMvSrDSzaY6XuSvu6">21 Cô Giang, Phường Cầu Ông Lãnh, Quận 1, Thành phố Hồ Chí Minh, Vietnam</a></li>
756</ul>
757</li>
758</ul>
759<p>&nbsp;</p>
760
761        </div>
762    </div>
763    </div>
764  
765    
766
767
768
769
770
771
772
773
774</footer>
775
776
777<button onclick="scrollToTop()" id="scrollTopBtn" title="Go to top">
778    <svg viewBox="0 0 24 24">
779        <path
780            d="M13,20H11V8L5.5,13.5L4.08,12.08L12,4.16L19.92,12.08L18.5,13.5L13,8V20Z"></path>
781    </svg>
782</button>
vendor: 110 bytes, lines 782-784
782
783
784<script data-cfasync="false" src="/cdn-cgi/scripts/5c5dd728/cloudflare-static/email-decode.min.js"></script>
784<script src="https://cdn.bananagames.io/wp-content/themes/cakhiatv/assets/js/main.js"></script>
784
785
786</body>
787    
787<script>
788        if ('serviceWorker' in navigator) {
789            window.addEventListener('load', function () {
790                navigator.serviceWorker.register('/sw.js')
791                    .then(function (reg) { /*console.log('[SW] ✅ Registered, scope:', reg.scope);*/ })
792                    .catch(function (err) { /*console.warn('[SW] Registration failed:', err);*/ });
793            });
794        }
795    </script>
795
796    
796<script type="speculationrules">
797{"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"}]}
798</script>
798
799        
799<script src="https://bananagames.io/js/websocket-client.js"></script>
799
800        <style>
801            @keyframes spin {
802                0% {
803                    transform: rotate(0deg);
804                }
805
806                100% {
807                    transform: rotate(360deg);
808                }
809            }
810
811            .loading-spinner {
812                animation: spin 1s linear infinite;
813            }
814
815            #match-list {
816                position: relative;
817            }
818
819            #match-list>div[style*="display: flex"] {
820                width: 100% !important;
821                max-width: 100% !important;
822            }
823        </style>
824        
824<script>
825            // ─── LocalStorage Cache (giống colatv40.live) ────────────────
826            const LS_MATCHES_KEY = 'colatv_matches_v1';
827            const LS_MATCHES_TTL = 10 * 60 * 1000; // 10 phút
828
829            function loadMatchesFromCache() {
830                try {
831                    const raw = localStorage.getItem(LS_MATCHES_KEY);
832                    if (!raw) return null;
833                    const { data, ts } = JSON.parse(raw);
834                    if (!data || !Array.isArray(data) || data.length === 0) return null;
835                    if (Date.now() - ts > LS_MATCHES_TTL) return null;
836                    return data;
837                } catch { return null; }
838            }
839
840            function saveMatchesToCache(matches) {
841                try {
842                    if (!matches || matches.length === 0) return;
843                    localStorage.setItem(LS_MATCHES_KEY, JSON.stringify({ data: matches, ts: Date.now() }));
844                } catch { /* localStorage full, bỏ qua */ }
845            }
846            // ─────────────────────────────────────────────────────────────
847
848            // Tối ưu: Cache DOM selectors để tránh query lại
849            const filterCountCache = {
850                countAllType: null,
851                countAll: null,
852                countElements: {},
853                noBlvElement: null,
854                liveElement: null,
855                hotElement: null,
856                todayElement: null,
857                tomorrowElement: null,
858                initialized: false
859            };
860
861            function initFilterCountCache() {
862                if (filterCountCache.initialized) return;
863
864                filterCountCache.countAllType = document.getElementById('count-all-type');
865                filterCountCache.countAll = document.getElementById('count-all');
866                filterCountCache.noBlvElement = document.getElementById('noblv-live');
867                filterCountCache.liveElement = document.getElementById('count-live');
868                filterCountCache.hotElement = document.getElementById('count-hot');
869                filterCountCache.todayElement = document.getElementById('count-today');
870                filterCountCache.tomorrowElement = document.getElementById('count-tomorrow');
871
872                ['football', 'basketball', 'tennis', 'volleyball'].forEach(sport => {
873                    filterCountCache.countElements[sport] = document.getElementById(`count-${sport}`);
874                });
875
876                filterCountCache.initialized = true;
877            }
878
879            // Hàm đếm số lượng trận đấu theo bộ lọc - Tối ưu với cached selectors
880            function updateFilterCounts(visibleMatchCards, allMatchCards) {
881                initFilterCountCache();
882
883                if (filterCountCache.countAllType) {
884                    filterCountCache.countAllType.textContent = allMatchCards.length;
885                }
886
887                if (filterCountCache.countAll) {
888                    filterCountCache.countAll.textContent = visibleMatchCards.length;
889                }
890
891                ['football', 'basketball', 'tennis', 'volleyball'].forEach(sport => {
892                    const countElement = filterCountCache.countElements[sport];
893                    if (countElement) {
894                        const count = Array.from(allMatchCards).filter(card => card.dataset.sport === sport).length;
895                        countElement.textContent = count;
896                    }
897                });
898
899                if (filterCountCache.noBlvElement) {
900                    const noBlvCount = Array.from(visibleMatchCards).filter(card => card.dataset.blv === 'false').length;
901                    filterCountCache.noBlvElement.textContent = noBlvCount;
902                }
903
904                if (filterCountCache.liveElement) {
905                    const noBlvCount = Array.from(visibleMatchCards).filter(card => card.dataset.blv === 'false').length;
906                    const liveCount = Array.from(visibleMatchCards).filter(card => card.dataset.live === 'true').length - noBlvCount;
907                    filterCountCache.liveElement.textContent = liveCount;
908                }
909
910                if (filterCountCache.hotElement) {
911                    const noBlvCount = Array.from(visibleMatchCards).filter(card => card.dataset.blv === 'false').length;
912                    const hotCount = Array.from(visibleMatchCards).filter(card => card.dataset.hot === 'true').length - noBlvCount;
913                    filterCountCache.hotElement.textContent = hotCount;
914                }
915
916                const today = new Date().toISOString().split('T')[0];
917                const tomorrow = new Date(Date.now() + 86400000).toISOString().split('T')[0];
918
919                if (filterCountCache.todayElement) {
920                    const todayCount = Array.from(visibleMatchCards).filter(card => card.dataset.date === today).length;
921                    filterCountCache.todayElement.textContent = todayCount;
922                }
923
924                if (filterCountCache.tomorrowElement) {
925                    const tomorrowCount = Array.from(visibleMatchCards).filter(card => card.dataset.date === tomorrow).length;
926                    filterCountCache.tomorrowElement.textContent = tomorrowCount;
927                }
928            }
929
930            // Hàm chuyển đổi ID môn thể thao thành tên
931            function sportName(sportId) {
932                const sports = {
933                    1: 'football',
934                    2: 'basketball',
935                };
936                return sports[sportId] || 'unknown';
937            }
938
939            // Hàm xử lý timestamp
940            function fixtime(timestamp) {
941                return isNaN(timestamp) ? new Date(timestamp).getTime() : timestamp;
942            }
943
944            // Hàm định dạng ngày giờ
945            function formatDate(timestamp, format) {
946                const date = new Date(timestamp * 1000);
947                const day = String(date.getDate()).padStart(2, '0');
948                const month = String(date.getMonth() + 1).padStart(2, '0');
949                const year = date.getFullYear();
950                const hours = String(date.getHours()).padStart(2, '0');
951                const minutes = String(date.getMinutes()).padStart(2, '0');
952                if (format === 'd/m') return `${day}/${month}`;
953                if (format === 'Y-m-d') return `${year}-${month}-${day}`;
954                if (format === 'H:i') return `${hours}:${minutes}`;
955                return date;
956            }
957
958            // Hàm lấy domain API random để tránh Cloudflare rate limit
959            function getApiDomain() {
960                const domains = ['api.gvapi.cc'];
961
962                // Random chọn một domain
963                const index = Math.floor(Math.random() * domains.length);
964                const selected = domains[index];
965
966                return 'https://' + selected;
967            }
968
969            // Hàm lấy domain API random cho video-home (pinned-home)
970            function getVideoHomeApiDomain() {
971                const domains = ['video-home.gvapi.cc'];
972
973                // Random chọn một domain
974                const index = Math.floor(Math.random() * domains.length);
975                const selected = domains[index];
976
977                return 'https://' + selected;
978            }
979
980            // Hàm hiển thị loading
981            function showLoading() {
982                const matchList = getMatchList();
983                if (!matchList) return;
984
985                // Hiển thị trực tiếp trong match-list, thay thế toàn bộ nội dung
986                matchList.innerHTML = `
987                <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;">
988                    <div class="loading-spinner" style="display: block; width: 50px; height: 50px; border: 4px solid #f3f3f3;
988 border-top: 4px solid #3498db; border-radius: 50%; animation: spin 1s linear infinite; margin: 0 auto;"></div>
989                    <p style="margin-top: 20px; color: #666; font-size: 16px; text-align: center; width: 100%;">Đang tải dữ liệu...</p>
990                </div>
991            `;
992            }
993
994            // Hàm hiển thị lỗi với các button đề xuất
995            function showErrorWithSuggestions() {
996                const matchList = getMatchList();
997                if (!matchList) return;
998
999                const suggestionLinks = [
1000                    { name: 'iotditr.com', url: 'https://iotditr.com' },
1001                    { name: 'cntsiend.com', url: 'https://cntsiend.com' },
1002                    { name: 'euwygrb.com', url: 'https://euwygrb.com' },
1003                    { name: 'ppoemlg.com', url: 'https://ppoemlg.com' },
1004                    { name: 'eyhtldu.com', url: 'https://eyhtldu.com' }
1005                ];
1006
1007                const buttonsHtml = suggestionLinks.map(link =>
1008                    `<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>`
1009                ).join('');
1010
1011                // Hiển thị trực tiếp trong match-list, thay thế toàn bộ nội dung
1012                matchList.innerHTML = `
1013                <div style="text-align: center; padding: 60px 20px; width: 100%; min-height: 400px; display: flex; flex-direction: column; justify-content: center; align-items: center;">
1014                    <div style="margin-bottom: 20px;">
1015                        <svg width="64" height="64" viewBox="0 0 24 24" fill="none" stroke="#e74c3c" stroke-width="2" style="margin: 0 auto; display: block;">
1016                            <circle cx="12" cy="12" r="10"></circle>
1017                            <line x1="12" y1="8" x2="12" y2="12"></line>
1018                            <line x1="12" y1="16" x2="12.01" y2="16"></line>
1019                        </svg>
1020                    </div>
1021                    <h3 style="color: #e74c3c; margin-bottom: 15px; font-size: 24px; font-weight: bold;">Hệ thống gặp sự cố</h3>
1022                    <p style="color: #666; margin-bottom: 30px; font-size: 16px; max-width: 500px;">Bạn có thể chọn kênh khác:</p>
1023                    <div style="display: flex; flex-wrap: wrap; justify-content: center; gap: 10px; width: 100%; max-width: 800px;">
1024                        ${buttonsHtml}
1025                    </div>
1026                </div>
1027            `;
1028            }
1029
1030            // Hàm fetch với timeout
1031            function fetchWithTimeout(url, timeout = 10000) {
1032                return Promise.race([
1033                    fetch(url),
1034                    new Promise((_, reject) =>
1035                        setTimeout(() => reject(new Error('Request timeout')), timeout)
1036                    )
1037                ]);
1038            }
1039
1040            // Hàm lấy dữ liệu trận đấu từ API và render
1041            async function refreshMatches() {
1042                const matchList = getMatchList();
1043                if (!matchList) {
1044                    console.error('Không tìm thấy phần tử match-list');
1045                    return;
1046                }
1047
1048                // Chỉ hiển thị loading nếu chưa có data từ cache
1049                if (!matchList.querySelector('.match-card')) {
1050                    showLoading();
1051                }
1052
1053                try {
1054                    const apiBase = getApiDomain();
1055                    const response = await fetchWithTimeout(apiBase + '/api/matches?t=' + new Date().getTime(), 10000);
1056
1057                    if (!response.ok) {
1058                        throw new Error('Lỗi khi lấy dữ liệu API: ' + response.status);
1059                    }
1060
1061                    const datas = await response.json();
1062
1063                    if (!datas.data || typeof datas.data !== 'object') {
1064                        throw new Error('Cấu trúc dữ liệu API không hợp lệ');
1065                    }
1066
1067                    const newMatches = [];
1068                    const matchesByGroup = {}; // Nhóm matches theo competitionName
1069
1070                    for (const [key, data] of Object.entries(datas.data)) {
1071                        // Bảo vệ nếu anchorAppointmentVoList không phải array
1072                        const anchorList = Array.isArray(data.anchorAppointmentVoList) ? data.anchorAppointmentVoList : [];
1073                        //if (!anchorList.length) continue;
1074
1075                        // Bỏ các trận "Live streaming"
1076                        if (anchorList[0]?.nickName === 'Live streaming') continue;
1077
1078                        // Bảo vệ tỉ số
1079                        const homeScoreArr = Array.isArray(data.homeScore) ? data.homeScore : [];
1080                        const awayScoreArr = Array.isArray(data.awayScore) ? data.awayScore : [];
1081                        const homeScore = homeScoreArr.length ? homeScoreArr[0] : 0;
1082                        const awayScore = awayScoreArr.length ? awayScoreArr[0] : 0;
1083
1084                        // Nếu match có house_id khác null, thêm ?houseId=... vào slug
1085                        let slug = key;
1086                        if (data.house_id && data.house_id !== null) {
1087                            slug = `${key}?houseId=${data.house_id}`;
1088                        }
1089
1090                        const competitionName = data.competitionName || 'NBA';
1091                        const matchData = {
1092                            id: 2,
1093                            slug: slug,
1094                            sport: sportName(data.sportId),
1095                            live: data.matchStatus === 2,
1096                            hot: true,
1097                            blv: anchorList[0]?.nickName !== 'Live streaming',
1098                            date: formatDate(fixtime(data.matchTime), 'd/m'),
1099                            datesearch: formatDate(fixtime(data.matchTime), 'Y-m-d'),
1100                            hour: formatDate(fixtime(data.matchTime), 'H:i'),
1101                            competitionName: competitionName,
1102                            teams: [
1103                                data.homeTeamName || 'Team C',
1104                                data.awayTeamName || 'Team D'
1105                            ],
1106                            score: `${homeScore}:${awayScore}`,
1107                            videoUrl: data.videoUrl || 'https://live2.example.com',
1108                            animationUrl: data.animationUrl || 'https://animation.example.com',
1109                            data: data
1110                        };
1111
1112                        newMatches.push(matchData);
1113
1114                        // Nhóm matches theo competitionName
1115                        if (!matchesByGroup[competitionName]) {
1116                            matchesByGroup[competitionName] = [];
1117                        }
1118                        matchesByGroup[competitionName].push(matchData);
1119                    }
1120
1121                    // Gọi hàm render với danh sách trận đấu mới
1122                    renderAllMatches(newMatches);
1123                    filterMatches('parent', newMatches);
1124                    saveMatchesToCache(newMatches); // 
1125                } catch (error) {
1126                    console.error('Lỗi khi làm mới trận đấu:', error);
1127                    // Đã 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.
1128                    // Hệ thống sẽ âm thầm giữ nguyên giao diện SSR và đợi Socket cập nhật.
1129                }
1130            }
1131
1132            function createMatchCard(match) {
1133                // Bảo vệ dữ liệu, tránh crash nếu cache cũ thiếu data
1134                if (!match || !match.data) return '';
1135
1136                // Bảo vệ anchorAppointmentVoList
1137                const anchorList = Array.isArray(match.data.anchorAppointmentVoList)
1138                    ? match.data.anchorAppointmentVoList
1139                    : [];
1140
1141                // Xử lý slug an toàn
1142                const slugStr = match.slug || '';
1143                const baseSlug = slugStr.includes('?') ? slugStr.split('?')[0] : slugStr;
1144
1145                const nicknames = anchorList.map(item => {
1146                    const itemHouseId = item.houseId || '';
1147                    if (itemHouseId !== '') {
1148                        const separator = baseSlug.includes('?') ? '&' : '?';
1149                        return `<a href="https://bananagames.io/truc-tiep/${baseSlug}${separator}houseId=${itemHouseId}" rel="nofollow">${item.nickName}</a>`;
1150                    } else {
1151                        return `<a href="https://bananagames.io/truc-tiep/${slugStr}" rel="nofollow">${item.nickName}</a>`;
1152                    }
1153                });
1154
1155                const nicknameString = nicknames.join(' | ');
1156
1157                // Bảo vệ tỉ số (dùng lại match.score nếu muốn)
1158                const homeScoreArr = Array.isArray(match.data.homeScore) ? match.data.homeScore : [];
1159                const awayScoreArr = Array.isArray(match.data.awayScore) ? match.data.awayScore : [];
1160                const homeScore = homeScoreArr.length ? homeScoreArr[0] : 0;
1161                const awayScore = awayScoreArr.length ? awayScoreArr[0] : 0;
1162
1163                return `
1164                <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}">
1165                    <div class="match-card__body">
1166                        <a href="https://bananagames.io/truc-tiep/${match.slug}" class="link-match" rel="nofollow"></a>
1167                        <div class="match-card__header">
1168                            <div class="match-card__league">
1169                                <span>${match.data.competitionName}</span>
1170                            </div>
1171                            <div class="match-card__status">
1172                                ${match.data.matchStatus == 1
1173                ? '<div class="match-card__status text-warning text-uppercase">CHƯA BẮT ĐẦU</div>'
1174                : match.data.matchStatus == 2
1175                    ? '<div class="match-card__status streaming">ĐANG TRỰC TIẾP</div>'
1176                    : match.data.matchStatus == 3
1177                        ? '<span class="btn btn--warning text-uppercase">Tạm ngừng phát sóng</span>'
1178                        : match.data.matchStatus == 4
1179                            ? '<span class="btn btn--danger text-uppercase">Cấm phát sóng vĩnh viễn</span>'
1180                            : '<span class="btn btn--secondary text-uppercase">Không xác định</span>'
1181            }
1182                            </div>
1183                            <div class="match-card__time"><span class="match-time">${match.hour} - ${match.date}</span></div>
1184                        </div>
1185                        <div class="match-card__teams">
1186                            <div class="team home">
1187                                <img src="${match.data.homeTeamLogo}" alt="${match.data.homeTeamName}" class="team__logo">
1188                                <span class="team__name">${match.data.homeTeamName}</span>
1189                            </div>
1190                            <div class="match-card__score">${homeScore} - ${awayScore}</div>
1191                            <div class="team">
1192                                <img src="${match.data.awayTeamLogo}" alt="${match.data.awayTeamName}" class="team__logo">
1193                                <span class="team__name">${match.data.awayTeamName}</span>
1194                            </div>
1195                        </div>
1196                        <div class="match-card__info">
1197                            <div class="match-card__stats">
1198                                <div class="match-card__stats-content">
1199                                    ${nicknameString}
1200                                </div>
1201                            </div>
1202                            <div class="match-card__odds">
1203                                <a href="https://bananagames.io/truc-tiep/${match.slug}" class="btn btn--primary" rel="nofollow">
1204                                    <span>XEM NGAY</span>
1205                                </a>
1206                            </div>
1207                        </div>
1208                    </div>
1209                </div>
1210            `;
1211            }
1212
1213            // Khởi tạo bộ lọc
1214            let currentFilters = {
1215                sport: 'all',
1216                live: false,
1217                blv: false,
1218                hot: false,
1219                commentator: false,
1220                date: 'all',
1221                league: 'all'
1222            };
1223
1224            // Tối ưu: Preload video metadata để tăng tốc độ load khi click vào match
1225            const videoPreloadCache = new Map(); // Cache preloaded videos
1226            function preloadVideoMetadata(videoUrl) {
1227                if (!videoUrl || videoPreloadCache.has(videoUrl)) {
1228                    return; // Đã preload rồi
1229                }
1230
1231                // Mark as preloading
1232                videoPreloadCache.set(videoUrl, { status: 'loading', timestamp: Date.now() });
1233
1234                // Preload bằng cách tạo video element và load metadata
1235                const video = document.createElement('video');
1236                video.preload = 'metadata'; // Chỉ load metadata, không load toàn bộ video
1237                video.muted = true;
1238                video.playsInline = true;
1239                video.style.display = 'none';
1240
1241                video.addEventListener('loadedmetadata', function () {
1242                    videoPreloadCache.set(videoUrl, { status: 'loaded', timestamp: Date.now() });
1243                    document.body.removeChild(video);
1244                });
1245
1246                video.addEventListener('error', function () {
1247                    videoPreloadCache.set(videoUrl, { status: 'error', timestamp: Date.now() });
1248                    if (document.body.contains(video)) {
1249                        document.body.removeChild(video);
1250                    }
1251                });
1252
1253                video.src = videoUrl;
1254                document.body.appendChild(video);
1255
1256                // Cleanup cache sau 5 phút
1257                setTimeout(() => {
1258                    videoPreloadCache.delete(videoUrl);
1259                }, 5 * 60 * 1000);
1260            }
1261
1262            // Tối ưu: Cache match-list selector
1263            let matchListCache = null;
1264            function getMatchList() {
1265                if (!matchListCache) {
1266                    matchListCache = document.getElementById('match-list');
1267                }
1268                return matchListCache;
1269            }
1270
1271            // Hàm render toàn bộ trận đấu
1272            function renderAllMatches(matches) {
1273                const matchList = getMatchList();
1274                if (!matchList) {
1275                    console.error('Không tìm thấy phần tử match-list');
1276                    return;
1277                }
1278
1279                // Xóa danh sách cũ
1280                matchList.innerHTML = '';
1281
1282                // Render danh sách mới
1283                matches.forEach(match => {
1284                    if (!match || !match.data) return; // Bỏ qua match lỗi
1285
1286                    const cardHTML = createMatchCard(match);
1287                    if (!cardHTML) return; // Bỏ qua nếu không tạo được thẻ
1288                    
1289                    const tempDiv = document.createElement('div');
1290                    tempDiv.innerHTML = cardHTML.trim();
1291                    const cardElement = tempDiv.firstChild;
1292                    if (!cardElement) return;
1293
1294                    // Ẩn các trận không có bình luận viên
1295                    /*if (cardElement.getAttribute('data-blv') === 'false') {
1296                        cardElement.classList.add('d-none');
1297                    }*/
1298
1299                    // Tối ưu: Preload video metadata khi hover vào match card
1300                    if (match.data && match.data.videoUrl) {
1301                        let preloadTimeout = null;
1302                        cardElement.addEventListener('mouseenter', function () {
1303                            // Debounce: chỉ preload sau 500ms hover
1304                            preloadTimeout = setTimeout(() => {
1305                                preloadVideoMetadata(match.data.videoUrl);
1306                            }, 500);
1307                        });
1308                        cardElement.addEventListener('mouseleave', function () {
1309                            if (preloadTimeout) {
1310                                clearTimeout(preloadTimeout);
1311                                preloadTimeout = null;
1312                            }
1313                        });
1314                    }
1315
1316                    matchList.appendChild(cardElement);
1317                });
1318
1319                // Cập nhật bộ đếm
1320                const visibleMatches = document.querySelectorAll('.match-card:not(.d-none)');
1321                updateFilterCounts(visibleMatches, document.querySelectorAll('.match-card'));
1322            }
1323
1324            // Hàm lọc trận đấu
1325            function filterMatches(type, matches) {
1326                const allCards = document.querySelectorAll('.match-card');
1327
1328                // Lọc theo môn thể thao
1329                const sportFiltered = Array.from(allCards).filter(card => {
1330                    const sport = card.dataset.sport;
1331                    return currentFilters.sport === 'all' || sport === currentFilters.sport;
1332                });
1333
1334                let finalFiltered = sportFiltered;
1335
1336                // Áp dụng các bộ lọc khác
1337                if (currentFilters.live) {
1338                    finalFiltered = finalFiltered.filter(card => card.dataset.live === 'true' && card.dataset.blv === 'true');
1339                } else if (currentFilters.blv) {
1340                    finalFiltered = finalFiltered.filter(card => card.dataset.blv === 'false');
1341                } else if (currentFilters.hot) {
1342                    finalFiltered = finalFiltered.filter(card => card.dataset.hot === 'true' && card.dataset.blv === 'true');
1343                } else if (currentFilters.date !== 'all') {
1344                    finalFiltered = finalFiltered.filter(card => card.dataset.date === currentFilters.date && card.dataset.blv === 'true');
1345                }
1346
1347                // Hiển thị/ẩn các thẻ
1348                allCards.forEach(card => {
1349                    card.classList.toggle('d-none', !finalFiltered.includes(card));
1350                });
1351
1352                // Cập nhật bộ đếm
1353                if (type === 'parent') {
1354                    updateFilterCounts(sportFiltered, allCards);
1355                } else {
1356                    updateFilterCounts(finalFiltered, allCards);
1357                }
1358            }
1359
1360            // Gắn sự kiện cho nút lọc môn thể thao
1361            document.querySelectorAll('.sports-filter__button[data-sport]').forEach(button => {
1362                button.addEventListener('click', () => {
1363                    currentFilters.sport = button.getAttribute('data-sport');
1364                    filterMatches('parent');
1365                });
1366            });
1367
1368            // Gắn sự kiện cho nút lọc con
1369            document.querySelectorAll('.sports-filter__button_child').forEach(btn => {
1370                btn.addEventListener('click', function () {
1371                    const filterType = this.getAttribute('data-filter');
1372                    const value = this.getAttribute('data-value');
1373
1374                    if (filterType === 'date') {
1375                        currentFilters.date = value;
1376                        currentFilters.live = false;
1377                        currentFilters.hot = false;
1378                        currentFilters.blv = false;
1379                    } else if (filterType === 'live') {
1380                        currentFilters.live = true;
1381                        currentFilters.date = 'all';
1382                        currentFilters.hot = false;
1383                        currentFilters.blv = false;
1384                    } else if (filterType === 'hot') {
1385                        currentFilters.hot = true;
1386                        currentFilters.date = 'all';
1387                        currentFilters.live = false;
1388                        currentFilters.blv = false;
1389                    } else if (filterType === 'child_all') {
1390                        currentFilters.live = false;
1391                        currentFilters.hot = false;
1392                        currentFilters.blv = false;
1393                        currentFilters.date = 'all';
1394                    }
1395
1396                    document.querySelectorAll('.sports-filter__button_child').forEach(b => b.classList.remove('active'));
1397                    this.classList.add('active');
1398
1399                    filterMatches('child');
1400                });
1401            });
1402
1403            // Gắn sự kiện cho toggle livescore
1404            const liveToggle = document.getElementById('livescoreToggle');
1405            if (liveToggle) {
1406                liveToggle.addEventListener('change', () => {
1407                    currentFilters.live = liveToggle.checked;
1408                    filterMatches('parent');
1409                });
1410            }
1411
1412            // ===== WEBSOCKET INTEGRATION =====
1413            let wsClient = null;
1414            let matchesWebSocketConnected = false;
1415            let fallbackPollingInterval = null;
1416
1417            // Function để transform WebSocket data format
1418            function transformWebSocketMatches(data) {
1419                const newMatches = [];
1420
1421                for (const [key, matchData] of Object.entries(data)) {
1422                    // Logic tương tự như trong refreshMatches()
1423                    const anchorList = Array.isArray(matchData.anchorAppointmentVoList)
1424                        ? matchData.anchorAppointmentVoList
1425                        : [];
1426
1427                    if (anchorList[0]?.nickName === 'Live streaming') continue;
1428
1429                    const homeScoreArr = Array.isArray(matchData.homeScore) ? matchData.homeScore : [];
1430                    const awayScoreArr = Array.isArray(matchData.awayScore) ? matchData.awayScore : [];
1431                    const homeScore = homeScoreArr.length ? homeScoreArr[0] : 0;
1432                    const awayScore = awayScoreArr.length ? awayScoreArr[0] : 0;
1433
1434                    let slug = key;
1435                    if (matchData.house_id && matchData.house_id !== null) {
1436                        slug = `${key}?houseId=${matchData.house_id}`;
1437                    }
1438
1439                    const competitionName = matchData.competitionName || 'NBA';
1440                    const matchDataObj = {
1441                        id: 2,
1442                        slug: slug,
1443                        sport: sportName(matchData.sportId),
1444                        live: matchData.matchStatus === 2,
1445                        hot: true,
1446                        blv: anchorList[0]?.nickName !== 'Live streaming',
1447                        date: formatDate(fixtime(matchData.matchTime), 'd/m'),
1448                        datesearch: formatDate(fixtime(matchData.matchTime), 'Y-m-d'),
1449                        hour: formatDate(fixtime(matchData.matchTime), 'H:i'),
1450                        competitionName: competitionName,
1451                        teams: [
1452                            matchData.homeTeamName || 'Team C',
1453                            matchData.awayTeamName || 'Team D'
1454                        ],
1455                        score: `${homeScore}:${awayScore}`,
1456                        videoUrl: matchData.videoUrl || 'https://live2.example.com',
1457                        animationUrl: matchData.animationUrl || 'https://animation.example.com',
1458                        data: matchData
1459                    };
1460
1461                    newMatches.push(matchDataObj);
1462                }
1463
1464                return newMatches;
1465            }
1466
1467            // Function để init WebSocket
1468            function initMatchesWebSocket() {
1469                // WebSocket URL - có thể config từ PHP hoặc hardcode
1470                // Nếu có server-socket service, dùng URL đó
1471                // Format: wss://server.gvapi.cc hoặc ws://localhost:3320
1472                const wsUrl = 'wss://server.colahd.tv/ws'; // Thay bằng URL thực tế của bạn
1473
1474                // Check nếu RealtimeWebSocketClient đã được load
1475                if (typeof RealtimeWebSocketClient === 'undefined') {
1476                    console.warn('[Homepage] RealtimeWebSocketClient not loaded, falling back to polling');
1477                    startFallbackPolling();
1478                    return;
1479                }
1480
1481                wsClient = new RealtimeWebSocketClient(wsUrl);
1482
1483                // Subscribe to matches updates
1484                wsClient.subscribe('matches:updated', (data) => {
1485                    //console.log('[Homepage] Received matches update from WebSocket');
1486
1487                    if (data.code === '0000' && data.data) {
1488                        // Transform data để tương thích với renderAllMatches()
1489                        const transformedMatches = transformWebSocketMatches(data.data);
1490                        renderAllMatches(transformedMatches);
1491                        filterMatches('parent', transformedMatches);
1492                        saveMatchesToCache(transformedMatches); // 
1493                    } else if (data.data && typeof data.data === 'object') {
1494                        // Nếu data trực tiếp là object (không có code)
1495                        const transformedMatches = transformWebSocketMatches(data.data);
1496                        renderAllMatches(transformedMatches);
1497                        filterMatches('parent', transformedMatches);
1498                        saveMatchesToCache(transformedMatches); // 
1499                    }
1500                });
1501
1502                // Handle connection events
1503                wsClient.subscribe('connected', () => {
1504                    //console.log('[Homepage] WebSocket connected');
1505                    matchesWebSocketConnected = true;
1506                    // Stop fallback polling nếu đang chạy
1507                    if (fallbackPollingInterval) {
1508                        clearInterval(fallbackPollingInterval);
1509                        fallbackPollingInterval = null;
1510                    }
1511                });
1512
1513                wsClient.subscribe('disconnected', () => {
1514                    //console.log('[Homepage] WebSocket disconnected, falling back to polling');
1515                    matchesWebSocketConnected = false;
1516                    startFallbackPolling();
1517                });
1518
1519                wsClient.subscribe('error', (error) => {
1520                    console.error('[Homepage] WebSocket error:', error);
1521                    matchesWebSocketConnected = false;
1522                    startFallbackPolling();
1523                });
1524
1525                wsClient.connect();
1526            }
1527
1528            // Fallback polling nếu WebSocket fail
1529            function startFallbackPolling() {
1530                if (fallbackPollingInterval) return; // Already running
1531
1532                //('[Homepage] Starting fallback polling');
1533                fallbackPollingInterval = setInterval(() => {
1534                    if (!matchesWebSocketConnected) {
1535                        refreshMatches(); // Use existing function
1536                    } else {
1537                        // WebSocket reconnected, stop polling
1538                        clearInterval(fallbackPollingInterval);
1539                        fallbackPollingInterval = null;
1540                    }
1541                }, 120000); // 2 minutes như cũ
1542            }
1543
1544            // 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)
1545            const ssrCardsCount = document.querySelectorAll('.match-card').length;
1546            
1547            if (ssrCardsCount === 0) {
1548                // Thử load từ cache trước nếu không có SSR
1549                const cachedMatches = loadMatchesFromCache();
1550                if (cachedMatches && cachedMatches.length > 0) {
1551                    try {
1552                        renderAllMatches(cachedMatches);
1553                        filterMatches('parent', cachedMatches);
1554                    } catch (error) {
1555                        console.error('[Cache Render Error]', error);
1556                    }
1557                }
1558
1559                // Fetch fresh data từ API (cập nhật + ghi đè cache)
1560                refreshMatches();
1561            }
1562
1563            // Thử WebSocket trước, fallback to polling nếu fail
1564            // Delay một chút để đảm bảo RealtimeWebSocketClient đã được load
1565            setTimeout(() => {
1566                initMatchesWebSocket();
1567            }, 500);
1568
1569            // Cleanup khi page unload
1570            window.addEventListener('beforeunload', () => {
1571                if (wsClient) {
1572                    wsClient.disconnect();
1573                }
1574                if (fallbackPollingInterval) {
1575                    clearInterval(fallbackPollingInterval);
1576                }
1577            });
1578        </script>
1578
1579            <style>
1580        .home-banner-slider {
1581            width: 100%;
1582            margin: 15px 0;
1583            border-radius: 8px;
1584            overflow: hidden;
1585            position: relative;
1586            box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2);
1587            display: none;
1588            /* Hidden by default until loaded */
1589            z-index: 10;
1590        }
1591
1592        .home-banner-track {
1593            display: flex;
1594            transition: transform 0.5s ease-in-out;
1595            height: 100%;
1596        }
1597
1598        .home-banner-slide {
1599            min-width: 100%;
1600            display: block;
1601            text-decoration: none;
1602        }
1603
1604        .home-banner-slide img {
1605            width: 100%;
1606            height: auto;
1607            display: block;
1608            object-fit: cover;
1609        }
1610
1611        .home-banner-dots {
1612            position: absolute;
1613            bottom: 10px;
1614            left: 0;
1615            right: 0;
1616            display: flex;
1617            justify-content: center;
1618            gap: 6px;
1619        }
1620
1621        .home-banner-dot {
1622            width: 8px;
1623            height: 8px;
1624            background: rgba(255, 255, 255, 0.5);
1625            border-radius: 50%;
1626            cursor: pointer;
1627            transition: background 0.3s;
1628        }
1629
1630        .home-banner-dot.active {
1631            background: white;
1632            transform: scale(1.2);
1633        }
1634    </style>
1635    
1635<script>
1636        document.addEventListener('DOMContentLoaded', async function () {
1637            try {
1638                // Fetch settings
1639                const res = await fetch('https://api.gvapi.cc/api/settings');
1640                const data = await res.json();
1641
1642                if (data.success && data.home_banners && data.home_banners.length > 0) {
1643                    const banners = data.home_banners.sort((a, b) => a.order - b.order);
1644
1645                    // Create slider container
1646                    const sliderContainer = document.createElement('div');
1647                    sliderContainer.className = 'home-banner-slider';
1648
1649                    const track = document.createElement('div');
1650                    track.className = 'home-banner-track';
1651
1652                    const dotsContainer = document.createElement('div');
1653                    dotsContainer.className = 'home-banner-dots';
1654
1655                    banners.forEach((banner, index) => {
1656                        // Slide
1657                        const slide = document.createElement('a');
1658                        slide.className = 'home-banner-slide';
1659                        slide.href = banner.link_url && banner.link_url !== '#' ? banner.link_url : 'javascript:void(0)';
1660                        slide.target = banner.link_url && banner.link_url !== '#' ? '_blank' : '_self';
1661
1662                        const img = document.createElement('img');
1663                        img.src = banner.image_url;
1664                        img.alt = banner.name || 'Banner';
1665
1666                        slide.appendChild(img);
1667                        track.appendChild(slide);
1668
1669                        // Dot
1670                        const dot = document.createElement('div');
1671                        dot.className = 'home-banner-dot';
1672                        if (index === 0) dot.classList.add('active');
1673
1674                        dot.addEventListener('click', () => {
1675                            goToSlide(index);
1676                        });
1677
1678                        dotsContainer.appendChild(dot);
1679                    });
1680
1681                    sliderContainer.appendChild(track);
1682                    if (banners.length > 1) {
1683                        sliderContainer.appendChild(dotsContainer);
1684                    }
1685
1686                    // Inject into DOM (after h1 in hero content)
1687                    const h1 = document.querySelector('.hero__content h1');
1688                    if (h1) {
1689                        h1.insertAdjacentElement('afterend', sliderContainer);
1690                        sliderContainer.style.display = 'block';
1691
1692                        // Slider Logic
1693                        let currentIndex = 0;
1694                        let autoPlayInterval;
1695                        const totalSlides = banners.length;
1696
1697                        function goToSlide(index) {
1698                            if (totalSlides <= 1) return;
1699                            currentIndex = index;
1700                            track.style.transform = `translateX(-${currentIndex * 100}%)`;
1701
1702                            // Update dots
1703                            Array.from(dotsContainer.children).forEach((d, i) => {
1704                                if (i === currentIndex) d.classList.add('active');
1705                                else d.classList.remove('active');
1706                            });
1707
1708                            resetAutoPlay();
1709                        }
1710
1711                        function nextSlide() {
1712                            let next = currentIndex + 1;
1713                            if (next >= totalSlides) next = 0;
1714                            goToSlide(next);
1715                        }
1716
1717                        function resetAutoPlay() {
1718                            clearInterval(autoPlayInterval);
1719                            autoPlayInterval = setInterval(nextSlide, 3000);
1720                        }
1721
1722                        if (totalSlides > 1) {
1723                            resetAutoPlay();
1724                        }
1725                    }
1726                }
1727            } catch (err) {
1728                console.error('Lỗi load home banners:', err);
1729            }
1730        });
1731    </script>
1731
1732            <style>
1733            @media (min-width: 481px) and (max-width: 767px) {
1734                .match-card__status {
1735                    max-width: 120px;
1736                    font-size: 12px;
1737                }
1738            }
1739
1740            @media (min-width: 576px) and (max-width: 767px) {
1741                .match-card__league {
1742                    max-width: 100px;
1743                }
1744            }
1745
1746            @media (min-width: 481px) and (max-width: 575px) {
1747                .match-card__header {
1748                    flex-direction: row !important;
1749                }
1750
1751                .match-card__time {
1752                    max-width: 100px !important;
1753                }
1754            }
1755
1756            .top-live-box {
1757                width: 100%;
1758                height: auto;
1759                display: flex;
1760                gap: 8px;
1761            }
1762
1763            .top-live-box .left {
1764                width: 100%;
1765                min-height: 564px;
1766                background-color: #000;
1767                border-radius: 4px;
1768                overflow: hidden;
1769            }
1770
1771            .top-live-box .live-list {
1772                width: 240px;
1773                flex-shrink: 0;
1774            }
1775
1776            .top-live-box .live-list .live-item {
1777                width: 100%;
1778                height: 144px;
1779                margin-bottom: 6px;
1780                cursor: pointer;
1781                border-radius: 4px;
1782                transition: all .1s ease-in-out;
1783                overflow: hidden;
1784                border: 2px solid transparent;
1785                position: relative;
1786            }
1787
1788            .top-live-box .live-list .live-item .anchor-item {
1789                width: 100%;
1790                height: 100%;
1791            }
1792
1793            .el-image img {
1794                display: block;
1795                width: 100%;
1796                height: 100%;
1797                object-fit: cover;
1798            }
1799
1800            .btn-view-truc-tiep {
1801                position: absolute;
1802                top: 70%;
1803                left: 50%;
1804                transform: translate(-50%, -50%);
1805                z-index: 5;
1806                background: #f2152d;
1807                padding: 20px;
1808                border-radius: 30px;
1809                cursor: pointer;
1810                text-align: center;
1811            }
1812
1813            .btn-view-truc-tiep:hover {
1814                opacity: 0.8;
1815            }
1816
1817            .video-player {
1818                position: relative;
1819            }
1820
1821            .top-live-box .live-list .live-item.active {
1822                border: 2px solid #ff0202;
1823            }
1824
1825            .overlay-click {
1826                position: absolute;
1827                top: 0;
1828                left: 0;
1829                width: 100%;
1830                height: 100%;
1831                z-index: 10;
1832                display: block;
1833            }
1834
1835            /* Responsive */
1836            @media screen and (max-width: 1024px) {
1837                .top-live-box {
1838                    flex-direction: column;
1839                }
1840
1841                .top-live-box .left {
1842                    width: 100%;
1843                    min-height: 400px;
1844                }
1845
1846                .top-live-box .live-list {
1847                    display: none !important;
1848                    width: 100%;
1849                    flex-direction: row;
1850                    flex-wrap: wrap;
1851                    justify-content: center;
1852                    gap: 6px;
1853                    margin-top: 12px;
1854                }
1855
1856                .top-live-box .live-list .live-item {
1857                    width: calc(50% - 6px);
1858                    height: 120px;
1859                }
1860            }
1861
1862            @media screen and (max-width: 768px) {
1863                .top-live-box .left {
1864                    min-height: unset;
1865                }
1866
1867                .btn-view-truc-tiep {
1868                    padding: 10px 10px;
1869                    font-size: 12px;
1870                }
1871
1872                .top-live-box .live-list .live-item {
1873                    width: calc(50% - 3px);
1874                    height: 100px;
1875                }
1876            }
1877
1878            @media screen and (max-width: 480px) {
1879                .top-live-box .live-list .live-item {
1880                    width: calc(50% - 3px);
1881                    height: 100px;
1882                }
1883
1884                .btn-view-truc-tiep {
1885                    padding: 8px 14px;
1886                    font-size: 13px;
1887                }
1888
1889                .match-card__body {
1890                    gap: 0.6rem;
1891                }
1892            }
1893        </style>
1894        
1894<script src="//unpkg.byted-static.com/xgplayer/3.0.0-next.1/dist/index.min.js"></script>
1894
1895        
1895<script src="//unpkg.com/[email protected]/dist/index.min.js"></script>
1895
1896        <link rel="stylesheet" href="//unpkg.byted-static.com/xgplayer/3.0.0-alpha.100/dist/xgplayer.min.css" />
1897        
1897<script type="text/javascript">
1898            // Hàm lấy domain API random cho video-home (pinned-home)
1899            function getVideoHomeApiDomain() {
1900                const domains = [
1901                    'video-home.gvapi.cc'
1902                ];
1903
1904                // Random chọn một domain
1905                const index = Math.floor(Math.random() * domains.length);
1906                const selected = domains[index];
1907
1908                return 'https://' + selected;
1909            }
1910
1911            document.addEventListener('DOMContentLoaded', function () {
1912                const apiBase = getVideoHomeApiDomain();
1913                const STORAGE_KEY = 'pinnedMatchesCache';
1914                const heroSection = document.querySelector('section.hero');
1915                if (!heroSection) {
1916                    console.error('Hero section not found.');
1917                    return;
1918                }
1919
1920                const skeletonHtml = `
1921                    <div class="top-live-box container skeleton-loading" id="pinned-matches-container">
1922                        <style>
1923                            .skeleton-box {
1924                                display: inline-block;
1925                                height: 100%;
1926                                width: 100%;
1927                                position: relative;
1928                                overflow: hidden;
1929                                background-color: #2a2a2a;
1930                                border-radius: 8px;
1931                            }
1932                            .skeleton-box::after {
1933                                position: absolute;
1934                                top: 0;
1935                                right: 0;
1936                                bottom: 0;
1937                                left: 0;
1938                                transform: translateX(-100%);
1939                                background-image: linear-gradient(
1940                                    90deg,
1941                                    rgba(255, 255, 255, 0) 0,
1942                                    rgba(255, 255, 255, 0.05) 20%,
1943                                    rgba(255, 255, 255, 0.2) 60%,
1944                                    rgba(255, 255, 255, 0)
1945                                );
1946                                animation: shimmer 2s infinite;
1947                                content: '';
1948                            }
1949                            @keyframes shimmer { 100% { transform: translateX(100%); } }
1950                            .skeleton-loading .left { aspect-ratio: 16/9; background: #1a1a1a; padding: 10px; border-radius: 8px;}
1951                            .skeleton-loading .live-list { display: flex; gap: 10px; margin-top: 10px; }
1952                            .skeleton-loading .live-item { flex: 1; aspect-ratio: 1/1; background: #1a1a1a; border-radius: 8px; overflow: hidden; }
1953                        </style>
1954                        <div class="left">
1955                            <div class="skeleton-box" style="min-height: 300px;"></div>
1956                        </div>
1957                        <div class="live-list">
1958                            <div class="live-item"><div class="skeleton-box"></div></div>
1959                            <div class="live-item"><div class="skeleton-box"></div></div>
1960                            <div class="live-item"><div class="skeleton-box"></div></div>
1961                            <div class="live-item"><div class="skeleton-box"></div></div>
1962                        </div>
1963                    </div>
1964                `;
1965
1966                function renderMatches(matches) {
1967                    const anchors = matches.slice(0, 4).map((match, index) => ({
1968                        streamUrl: match.playStreamAddress2,
1969                        image: match.houseImage,
1970                        name: match.nickName,
1971                        slug: match.slugKey + '?houseId=' + match.houseId
1972                    }));
1973
1974                    if (anchors.length === 0) return;
1975
1976                    const streamUrl = anchors[0].streamUrl;
1977
1978                    const liveBoxHtml = `
1979                        <div class="top-live-box container" id="pinned-matches-container">
1980                            <div class="left">
1981                                <div class="video-container">
1982                                    <div class="video-player">
1983                                        <div id="mse" style="width: 100%;"></div>
1984                                        <a href="/truc-tiep/${anchors[0].slug}" class="overlay-click" id="btn-view-link" rel="nofollow"></a>
1985                                        <span class="btn-view-truc-tiep" rel="nofollow">Vào phòng live đang phát sóng</span>
1986                                    </div>
1987                                </div>
1988                            </div>
1989                            <div class="live-list">
1990                                ${anchors.map((anchor, index) => `
1991                                    <div class="live-item ${index === 0 ? 'active' : ''} live-living-item" data-index="${index}">
1992                                        <div class="anchor-item">
1993                                            <div class="placeholder img">
1994                                                <img src="${anchor.image}" alt="${anchor.name}" style="object-fit: cover;">
1995                                            </div>
1996                                        </div>
1997                                    </div>
1998                                `).join('')}
1999                            </div>
2000                        </div>
2001                    `;
2002
2003                    const existingContainer = document.getElementById('pinned-matches-container');
2004                    if (existingContainer) {
2005                        existingContainer.outerHTML = liveBoxHtml;
2006                    } else {
2007                        heroSection.insertAdjacentHTML('afterend', liveBoxHtml);
2008                    }
2009
2010                    if (window.Player && window.HlsPlayer) {
2011                        new Player({
2012                            plugins: [window.HlsPlayer],
2013                            id: "mse",
2014                            ignores: ["time", "progress"],
2015                            autoplayMuted: true,
2016                            autoplay: true,
2017                            playsinline: true,
2018                            isLive: true,
2019                            fluid: true,
2020                            pip: true,
2021                            muted: true,
2022                            url: streamUrl
2023                        });
2024                    }
2025
2026                    const liveItems = document.querySelectorAll('#pinned-matches-container .live-item');
2027                    const viewLink = document.getElementById('btn-view-link');
2028
2029                    liveItems.forEach(item => {
2030                        item.addEventListener('click', () => {
2031                            const index = parseInt(item.getAttribute('data-index'));
2032                            liveItems.forEach(i => i.classList.remove('active'));
2033                            item.classList.add('active');
2034
2035                            if (window.Player && window.HlsPlayer) {
2036                                new Player({
2037                                    plugins: [window.HlsPlayer],
2038                                    id: "mse",
2039                                    ignores: ["time", "progress"],
2040                                    autoplayMuted: true,
2041                                    autoplay: true,
2042                                    playsinline: true,
2043                                    isLive: true,
2044                                    fluid: true,
2045                                    pip: true,
2046                                    muted: true,
2047                                    url: anchors[index].streamUrl
2048                                });
2049                            }
2050                            if (viewLink) {
2051                                viewLink.href = '/truc-tiep/' + anchors[index].slug;
2052                            }
2053                        });
2054                    });
2055                }
2056
2057                let hasLocalData = false;
2058                try {
2059                    const cached = localStorage.getItem(STORAGE_KEY);
2060                    if (cached) {
2061                        const parsed = JSON.parse(cached);
2062                        if (parsed && parsed.length > 0) {
2063                            renderMatches(parsed);
2064                            hasLocalData = true;
2065                        }
2066                    }
2067                } catch (e) {
2068                    console.error('Error parsing localStorage:', e);
2069                }
2070
2071                if (!hasLocalData) {
2072                    heroSection.insertAdjacentHTML('afterend', skeletonHtml);
2073                }
2074
2075                fetch('https://video-home.gvapi.cc/api/pinned-home?t=' + new Date().getTime())
2076                    .then(response => {
2077                        if (!response.ok) throw new Error('API Response not ok: ' + response.status);
2078                        return response.json();
2079                    })
2080                    .then(data => {
2081                        const matches = data.pinnedMatches;
2082                        if (!matches || matches.length < 1) {
2083                            if (!hasLocalData) {
2084                                const existingContainer = document.getElementById('pinned-matches-container');
2085                                if (existingContainer) existingContainer.remove();
2086                            }
2087                            return;
2088                        }
2089                        localStorage.setItem(STORAGE_KEY, JSON.stringify(matches));
2090                        renderMatches(matches);
2091                    })
2092                    .catch(error => {
2093                        console.error('Error fetching API data:', error);
2094                        if (!hasLocalData) {
2095                            const existingContainer = document.getElementById('pinned-matches-container');
2096                            if (existingContainer) existingContainer.remove();
2097                        }
2098                    });
2099            });
2100        </script>
2100
2101
2102            <style>
2103        .aligncenter {
2104            margin: 0 auto;
2105
2106        }
2107
2108        .wp-caption {
2109            max-width: 100%;
2110        }
2111
2112        footer .container {
2113            grid-template-columns: 1fr;
2114        }
2115    </style>
2116        
2116<script>
2117        const mini = document.querySelector('.video-player.is-floating.floating-draggable');
2118        const margin = 8; // cách mép
2119
2120        function clampFloatingVideo() {
2121            if (!mini) return;
2122
2123            const rect = mini.getBoundingClientRect();
2124
2125            let x = rect.left;
2126            let y = rect.top;
2127
2128            const vw = window.innerWidth;
2129            const vh = window.innerHeight;
2130
2131            const minX = margin;
2132            const minY = margin;           // nếu muốn chừa notch: + safeTop
2133            const maxX = vw - rect.width - margin;
2134            const maxY = vh - rect.height - margin;
2135
2136            if (x < minX) x = minX;
2137            if (x > maxX) x = maxX;
2138            if (y < minY) y = minY;
2139            if (y > maxY) y = maxY;
2140
2141            mini.style.left = x + 'px';
2142            mini.style.top = y + 'px';
2143        }
2144
2145        // chạy lại mỗi khi viewport thay đổi
2146        window.addEventListener('scroll', clampFloatingVideo);
2147        window.addEventListener('resize', clampFloatingVideo);
2148        window.addEventListener('orientationchange', clampFloatingVideo);
2149
2150        // iOS Safari thanh URL co giãn → nên dùng thêm:
2151        if (window.visualViewport) {
2152            visualViewport.addEventListener('resize', clampFloatingVideo);
2153            visualViewport.addEventListener('scroll', clampFloatingVideo);
2154        }
2155    </script>
2155
2156
2157        
2157<script>
2158        // === Catfish Banner Global: lấy từ API /api/catfish-banners (giống React CatfishBanners.jsx) ===
2159        (function () {
2160            var apiUrl = 'https://api.gvapi.cc/api/catfish-banners';
2161            fetch(apiUrl)
2162                .then(function (res) { return res.ok ? res.json() : null; })
2163                .then(function (data) {
2164                    if (!data || !data.success || !data.data || !data.data.length) return;
2165
2166                    // === Video catfish overlay (nếu có trong trang watch) ===
2167                    var catfishLink = data.data[0].link_url || '';
2168                    if (catfishLink) {
2169                        var overlayTop = document.querySelector('.video-catfish-overlay-top');
2170                        var overlayBottom = document.querySelector('.video-catfish-overlay');
2171                        if (overlayTop) {
2172                            overlayTop.href = catfishLink;
2173                            overlayTop.style.display = 'block';
2174                        }
2175                        if (overlayBottom) {
2176                            overlayBottom.href = catfishLink;
2177                            overlayBottom.style.display = 'block';
2178                        }
2179                    }
2180
2181                    // === Tạo container catfish-banner-global (fixed bottom, giống React) ===
2182                    var wrapper = document.createElement('div');
2183                    wrapper.className = 'catfish-banner-global';
2184                    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;';
2185
2186                    // Nút đóng
2187                    var closeBtn = document.createElement('button');
2188                    closeBtn.className = 'catfish-banner-close';
2189                    closeBtn.innerHTML = '✕';
2190                    closeBtn.setAttribute('aria-label', 'Đóng quảng cáo');
2191                    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;';
2192                    closeBtn.addEventListener('click', function () { wrapper.remove(); });
2193                    wrapper.appendChild(closeBtn);
2194
2195                    // Render banners
2196                    data.data.forEach(function (banner) {
2197                        var a = document.createElement('a');
2198                        a.className = 'catfish-banner-global-item';
2199                        a.href = banner.link_url || '#';
2200                        a.target = '_blank';
2201                        a.rel = 'nofollow noopener noreferrer';
2202                        a.style.cssText = 'display:block;width:100%;pointer-events:auto;line-height:0;cursor:pointer;';
2203                        var img = document.createElement('img');
2204                        img.src = banner.image_url;
2205                        img.alt = banner.name || 'Banner';
2206                        img.style.cssText = 'width:100%;height:auto;display:block;object-fit:contain;';
2207                        a.appendChild(img);
2208                        wrapper.appendChild(a);
2209                    });
2210
2211                    document.body.appendChild(wrapper);
2212
2213                    // Mobile: full width
2214                    var mq = window.matchMedia('(max-width: 768px)');
2215                    function applyMobile(e) { wrapper.style.width = e.matches ? '100%' : '50%'; }
2216                    applyMobile(mq);
2217                    mq.addListener(applyMobile);
2218                })
2219                .catch(function (e) { console.warn('Catfish banner load failed:', e); });
2220        })();
2221    </script>
2221
2222    
2222<script>
2223        // === FIX: Chặn smooth-scroll handlers can thiệp vào catfish overlay ===
2224        (function () {
2225            document.addEventListener('click', function (e) {
2226                var overlay = e.target.closest('.video-catfish-overlay, .video-catfish-overlay-top');
2227                if (!overlay) return;
2228                var href = overlay.getAttribute('href');
2229                if (href && href !== '#' && !href.startsWith('#')) {
2230                    e.stopImmediatePropagation();
2231                }
2232            }, true);
2233        })();
2234    </script>
2234
2235        
2235<script>
2236    document.addEventListener("DOMContentLoaded", function () {
2237        const walker = document.createTreeWalker(document.body, NodeFilter.SHOW_TEXT, null, false);
2238        while (walker.nextNode()) {
2239            const node = walker.currentNode;
2240            if (node.nodeValue.match(/vô địch quốc gia/i)) {
2241                node.nodeValue = node.nodeValue.replace(/vô địch quốc gia/gi, "VĐQG");
2242            }
2243        }
2244    });
2245    </script>
2245
2246    
2247</html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.