PageSourceSearch

https://xoigac.top/dist/js/core.bundle.js?v=icHE5APGMG30g9fEySb-7hZ5vZ3iHbgJVhyUPH3v4Q8

js xoigac.top collected 2026-10-10 02:21:57 UTC 13,412 bytes, 1 lines download raw bytes

1class ImageOptimizer{constructor(){this.init()}init(){document.addEventListener("error",this.handleImageError.bind(this),!1),this.optimizeExistingImages(),this.observeNewImages()}handleImageError(event){const img=event.target;if("IMG"!==img.tagName)return;if("true"===img.dataset.fallback)return;if(img.dataset.originalUrl&&"original"!==img.dataset.fallback)return img.dataset.fallback="original",void(img.src=img.dataset.originalUrl);if(img.hasAttribute("onerror"))return;const placeholderUrl=this.getPlaceholderImage(img);img.dataset.fallback="true",img.src=placeholderUrl}getPlaceholderImage(img){const src=img.src||"",alt=(img.alt||"").toLowerCase(),className=(img.className||"").toLowerCase();return src.includes("/leagues/")||alt.includes("league")||className.includes("league")?"/images/placeholder-league.svg":src.includes("/teams/")||alt.includes("team")||className.includes("team")?"/images/placeholder-team.svg":src.includes("/flags/")||alt.includes("flag")||className.includes("flag")?"/images/placeholder-flag.svg":"/images/placeholder-image.svg"}optimizeExistingImages(){document.querySelectorAll('img[src*="api-sports.io"]').forEach(img=>{this.replaceWithLocalImage(img)})}replaceWithLocalImage(img){const originalUrl=img.src;if(!originalUrl||!originalUrl.includes("api-sports.io"))return;const localUrl=this.getLocalUrl(originalUrl);localUrl&&localUrl!==originalUrl&&(img.dataset.originalUrl=originalUrl,img.src=localUrl)}getLocalUrl(originalUrl){try{const url=new URL(originalUrl),pathParts=url.pathname.split("/"),fileNameWithoutExt=pathParts[pathParts.length-1].split(".")[0];return url.pathname.includes("/leagues/")?`/images/football/leagues/${fileNameWithoutExt}.webp`:url.pathname.includes("/teams/")?`/images/football/teams/${fileNameWithoutExt}.webp`:url.pathname.includes("/flags/")?`/images/football/flags/${fileNameWithoutExt}.svg`:null}catch(e){return null}}observeNewImages(){new MutationObserver(mutations=>{mutations.forEach(mutation=>{mutation.addedNodes.forEach(node=>{if(1===node.nodeType){"IMG"===node.tagName&&node.src&&node.src.includes("api-sports.io")&&this.replaceWithLocalImage(node);const imgs=node.querySelectorAll?.('img[src*="api-sports.io"]');imgs&&imgs.forEach(img=>this.replaceWithLocalImage(img))}})})}).observe(document.body,{childList:!0,subtree:!0})}static optimizePage(){new ImageOptimizer}}document.addEventListener("DOMContentLoaded",()=>{ImageOptimizer.optimizePage()}),window.ImageOptimizer=ImageOptimizer;class StreamerCacheManager{constructor(){this.cacheKey="streamer_selection_cache",this.maxCacheAge=864e5}saveStreamerSelection(matchId,streamSessionId,templateType){try{const cache=this.getCache();cache[matchId]={streamSessionId:String(streamSessionId),templateType:templateType,timestamp:Date.now()},localStorage.setItem(this.cacheKey,JSON.stringify(cache)),String(streamSessionId)}catch(error){console.warn("[StreamerCache] 保存失败:",error)}}getStreamerSelection(matchId){try{const cache=this.getCache(),selection=cache[matchId];return selection?Date.now()-selection.timestamp>this.maxCacheAge?(delete cache[matchId],localStorage.setItem(this.cacheKey,JSON.stringify(cache)),null):selection:null}catch(error){return console.warn("[StreamerCache] 获取失败:",error),null}}clearStreamerSelection(matchId){try{const cache=this.getCache();delete cache[matchId],localStorage.setItem(this.cacheKey,JSON.stringify(cache))}catch(error){console.warn("[StreamerCache] 清除失败:",error)}}getCache(){try{const cacheStr=localStorage.getItem(this.cacheKey);return cacheStr?JSON.parse(cacheStr):{}}catch(error){return console.warn("[StreamerCache] 解析缓存失败:",error),{}}}cleanExpiredCache(){try{const cache=this.getCache(),now=Date.now();let cleaned=!1;Object.keys(cache).forEach(matchId=>{now-cache[matchId].timestamp>this.maxCacheAge&&(delete cache[matchId],cleaned=!0)}),cleaned&&localStorage.setItem(this.cacheKey,JSON.stringify(cache))}catch(error){console.warn("[StreamerCache] 清理缓存失败:",error)}}getDefaultStreamer(streamers){if(!streamers||0===streamers.length)return null;const liveStreamer=streamers.find(s=>s.isLive);return liveStreamer?{streamSessionId:liveStreamer.streamSessionId,templateType:liveStreamer.templateType}:{streamSessionId:streamers[0].streamSessionId,templateType:streamers[0].templateType}}testCache(){this.saveStreamerSelection("test_match","test_streamer","test_template");const result=this.getStreamerSelection("test_match");return this.clearStreamerSelection("test_match"),null!==result}}window.streamerCacheManager=new StreamerCacheManager,window.testStreamerCache=()=>window.streamerCacheManager.testCache(),"loading"===document.readyState?document.addEventListener("DOMContentLoaded",()=>{window.streamerCacheManager.cleanExpiredCache()}):window.streamerCacheManager.cleanExpiredCache(),function(){function formatBlvStreamerName(name){if(!name||"string"!=typeof name)return"";const trimmed=name.trim();return trimmed?/^BLV/i.test(trimmed)?trimmed.toLocaleUpperCase("vi-VN"):`BLV ${trimmed}`.toLocaleUpperCase("vi-VN"):""}function applyBlvToFocusCardStreamers(root){(root&&root.querySelectorAll?root:document).querySelectorAll(".focus-card-streamer").forEach(el=>{const raw=function getRawStreamerName(el){const card=el.closest(".focus-card-item")?.querySelector(".focus-card, .beauty-card, .focus-match-card");return(card?.dataset?.streamer||"").trim()||(el.textContent||"").replace(/\s+/g," ").trim()}(el);if(!raw)return;const formatted=formatBlvStreamerName(raw);(el.textContent||"").replace(/\s+/g," ").trim()!==formatted&&function setFocusCardStreamerText(el,formatted){const icon=el.querySelector("svg, i");el.textContent="",icon&&el.appendChild(icon),el.appendChild(document.createTextNode(formatted))}(el,formatted)})}function observeFocusCardStreamers(){["liveMatchCards","upcomingMatchCards"].forEach(id=>{const container=document.getElementById(id);container&&"undefined"!=typeof MutationObserver&&new MutationObserver(mutations=>{let shouldUpdate=!1;mutations.forEach(mutation=>{"childList"===mutation.type&&mutation.addedNodes.length>0&&(shouldUpdate=!0)}),shouldUpdate&&applyBlvToFocusCardStreamers(container)}).observe(container,{childList:!0,subtree:!0})})}window.formatBlvStreamerName=formatBlvStreamerName,window.applyBlvToFocusCardStreamers=applyBlvToFocusCardStreamers,"loading"===document.readyState?document.addEventListener("DOMContentLoaded",()=>{applyBlvToFocusCardStreamers(),observeFocusCardStreamers()}):(applyBlvToFocusCardStreamers(),observeFocusCardStreamers())}(),function(){"use strict";const SUPPORTED_LANGS=["vi","en","zh"];let currentLang="vi",translations={},isReady=!1;function setLang(lang){SUPPORTED_LANGS.includes(lang)?(currentLang=lang,localStorage.setItem("livescore_lang",lang),function setCookie(name,value,days){const expires=new Date;expires.setTime(expires.getTime()+24*days*60*60*1e3),document.cookie=`${name}=${value};expires=${expires.toUTCString()};path=/`}("livescore_lang",lang,365),document.documentElement.lang="zh"===lang?"zh-CN":lang,window.dispatchEvent(new CustomEvent("langChange",{detail:{lang:lang}}))):console.warn(`Unsupported language: ${lang}`)}async function loadLangFile(lang){try{const response=await fetch(`/i18n/${lang}.json`);if(!response.ok)throw new Error(`Failed to load ${lang}.json`);return await response.json()}catch(error){return console.error(`Error loading language file: ${error}`),null}}
1async function init(){currentLang=function getCurrentLang(){const storedLang=localStorage.getItem("livescore_lang");if(storedLang&&SUPPORTED_LANGS.includes(storedLang))return storedLang;const cookieLang=function getCookie(name){const match=document.cookie.match(new RegExp("(^| )"+name+"=([^;]+)"));return match?match[2]:null}("livescore_lang");return cookieLang&&SUPPORTED_LANGS.includes(cookieLang)?cookieLang:"vi"}(),translations=await loadLangFile(currentLang)||{},translations&&0!==Object.keys(translations).length||(console.warn(`[i18n] Failed to load ${currentLang}.json, falling back to vi`),"vi"!==currentLang&&(translations=await loadLangFile("vi")||{},translations&&Object.keys(translations).length>0&&(currentLang="vi"))),window.i18nData=translations,isReady=!0,document.documentElement.lang="zh"===currentLang?"zh-CN":currentLang,updatePageTranslations(),document.documentElement.classList.remove("i18n-loading"),window.dispatchEvent(new CustomEvent("i18nReady"))}function t(key,params={}){if(!key||"string"!=typeof key)return console.warn(`Invalid translation key: ${key}`),key||"";if(!isReady)return key;const keys=key.split(".");let value=translations;for(const k of keys){if(!value||"object"!=typeof value||!(k in value))return console.warn(`Translation not found: ${key}`),key;value=value[k]}return"string"!=typeof value?key:value.replace(/\{(\w+)\}/g,(match,paramName)=>void 0!==params[paramName]?params[paramName]:match)}function formatNumber(num){const numberFormats=translations.number||{};if(num>=1e6){const formatted=(num/1e6).toFixed(1);return(numberFormats.millions||"{n}M").replace("{n}",formatted)}if(num>=1e4){const formatted=(num/1e4).toFixed(1);return"zh"===currentLang?(numberFormats.tenThousands||"{n}万").replace("{n}",formatted):(numberFormats.tenThousands||"{n}k").replace("{n}",formatted)}if(num>=1e3){const formatted=(num/1e3).toFixed(1);return(numberFormats.thousands||"{n}k").replace("{n}",formatted)}return num.toString()}function formatTimeAgo(dateStr){const now=new Date,date=new Date(dateStr),diff=now-date,minutes=Math.floor(diff/6e4),hours=Math.floor(diff/36e5),days=Math.floor(diff/864e5),timeFormats=translations.time||{};if(minutes<60)return(timeFormats.minutesAgo||"{n}分钟前").replace("{n}",minutes);if(hours<24)return(timeFormats.hoursAgo||"{n}小时前").replace("{n}",hours);if(days<7)return(timeFormats.daysAgo||"{n}天前").replace("{n}",days);const options={timeZone:"Asia/Ho_Chi_Minh"};return"zh"===currentLang?date.toLocaleDateString("zh-CN",options):"vi"===currentLang?date.toLocaleDateString("vi-VN",options):date.toLocaleDateString("en-US",options)}function formatFullDate(dateStr){const date=new Date(dateStr),options={year:"numeric",month:"long",day:"numeric",hour:"2-digit",minute:"2-digit",timeZone:"Asia/Ho_Chi_Minh"};return"zh"===currentLang?date.toLocaleDateString("zh-CN",options):"vi"===currentLang?date.toLocaleDateString("vi-VN",options):date.toLocaleDateString("en-US",options)}function formatTimeAgo(dateStr){const now=new Date,date=new Date(dateStr),diff=now-date,minutes=Math.floor(diff/6e4),hours=Math.floor(diff/36e5),days=Math.floor(diff/864e5),timeFormats=translations.time||{};if(minutes<60)return(timeFormats.minutesAgo||"{n}分钟前").replace("{n}",minutes);if(hours<24)return(timeFormats.hoursAgo||"{n}小时前").replace("{n}",hours);if(days<7)return(timeFormats.daysAgo||"{n}天前").replace("{n}",days);const options={timeZone:"Asia/Ho_Chi_Minh"};return"zh"===currentLang?date.toLocaleDateString("zh-CN",options):"vi"===currentLang?date.toLocaleDateString("vi-VN",options):date.toLocaleDateString("en-US",options)}function formatFullDate(dateStr){const date=new Date(dateStr),options={year:"numeric",month:"long",day:"numeric",hour:"2-digit",minute:"2-digit",timeZone:"Asia/Ho_Chi_Minh"};return"zh"===currentLang?date.toLocaleDateString("zh-CN",options):"vi"===currentLang?date.toLocaleDateString("vi-VN",options):date.toLocaleDateString("en-US",options)}function updatePageTranslations(){document.querySelectorAll("[data-i18n]").forEach(el=>{const key=el.getAttribute("data-i18n");if(key){const text=t(key);text!==key&&(text.includes("<")&&text.includes(">")?el.innerHTML=text:el.textContent=text)}}),document.querySelectorAll("[data-i18n-placeholder]").forEach(el=>{const key=el.getAttribute("data-i18n-placeholder");if(key){const text=t(key);text!==key&&(el.placeholder=text)}}),document.querySelectorAll("[data-i18n-title]").forEach(el=>{const key=el.getAttribute("data-i18n-title");if(key){const text=t(key);text!==key&&(el.title=text)}}),document.querySelectorAll("[data-i18n-date]").forEach(el=>{const key=el.getAttribute("data-i18n"),dateValue=el.getAttribute("data-i18n-date");if(key){const text=t(key,{date:dateValue});text!==key&&(el.textContent=text)}}),document.querySelectorAll(".format-number").forEach(el=>{const num=parseInt(el.getAttribute("data-views"))||parseInt(el.textContent)||0;el.textContent=formatNumber(num)}),document.querySelectorAll(".format-time-ago").forEach(el=>{const timeStr=el.getAttribute("data-time")||el.textContent;el.textContent=formatTimeAgo(timeStr)}),document.querySelectorAll(".format-date-full").forEach(el=>{const timeStr=el.getAttribute("data-time")||el.textContent;el.textContent=formatFullDate(timeStr)})}window.i18n={init:init,t:t,setLang:setLang,getCurrentLang:()=>currentLang,isReady:()=>isReady,switchLang:async function switchLang(lang){lang!==currentLang&&(setLang(lang),translations=await loadLangFile(lang)||{},updatePageTranslations())},updatePageTranslations:updatePageTranslations,formatNumber:formatNumber,formatTimeAgo:formatTimeAgo,formatFullDate:formatFullDate,SUPPORTED_LANGS:SUPPORTED_LANGS},window.L=window.L||{},window.L.T=function(key,params){return window.i18n&&"function"==typeof window.i18n.t?window.i18n.t(key,params||{}):key}
1,window.i18nData=translations,window.__disableI18nUI,"loading"===document.readyState?document.addEventListener("DOMContentLoaded",()=>{init().then(()=>{updatePageTranslations()})}):init().then(()=>{updatePageTranslations()})}();

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.