/* Always-on muted idle loop; foreground broadcast temporarily owns the scene. */ (function(){ 'use strict'; const stage=document.querySelector('#stage'),scene=document.querySelector('#idle-scene'); const video=document.querySelector('#idle-video'),poster=document.querySelector('#idle-poster'); const fullscreen=document.querySelector('#idle-fullscreen'); if(!stage||!scene||!video||!poster||!fullscreen||document.documentElement.classList.contains('content-reader'))return; let failed=false,blocked=false,pending=false,pageActive=true,hasFrame=false,retries=0,retryTimer=0; video.muted=true;video.defaultMuted=true;video.loop=true;video.autoplay=true; video.setAttribute('aria-label','知微自动循环待机视频'); const broadcasting=()=>stage.classList.contains('broadcast-scene-visible'); const shouldPlay=()=>pageActive&&!document.hidden&&!broadcasting()&&!failed&&!blocked; const activate=()=>stage.classList.add('has-idle-scene'); const inFullscreen=()=>document.fullscreenElement===video||video.webkitDisplayingFullscreen; function controls(){fullscreen.hidden=broadcasting();fullscreen.disabled=failed;} function source(){if(!video.getAttribute('src'))video.src=video.dataset.src;} function sync(){ if(!shouldPlay()){if(!video.paused)video.pause();controls();return;} if(!pending&&(video.paused||video.ended)){ source();pending=true; Promise.resolve(video.play()).then(()=>{if(!shouldPlay())video.pause();}) .catch(error=>{if(shouldPlay()&&error.name!=='AbortError'){blocked=true;scene.classList.remove('is-video-visible');}}) .finally(()=>{pending=false;controls();}); } controls(); } function recover(){ if(document.hidden||!pageActive)return; blocked=false; if(failed){failed=false;source();video.load();} sync(); } function retry(){ if(retryTimer||retries>=2)return; retryTimer=setTimeout(()=>{retryTimer=0;retries++;recover();},retries?4000:1500); } poster.addEventListener('load',activate); poster.addEventListener('error',()=>{if(!hasFrame)stage.classList.remove('has-idle-scene');}); if(poster.complete&&poster.naturalWidth)activate(); video.addEventListener('playing',()=>{ if(!shouldPlay()){video.pause();return;} hasFrame=true;activate();scene.classList.add('is-video-visible');controls(); }); video.addEventListener('pause',()=>{controls();if(shouldPlay()&&!inFullscreen())queueMicrotask(sync);}); video.addEventListener('error',()=>{ failed=true;hasFrame=false;scene.classList.remove('is-video-visible');video.pause(); if(!poster.naturalWidth)stage.classList.remove('has-idle-scene'); controls();retry(); }); function gesture(){if(blocked||failed)recover();} document.addEventListener('pointerdown',gesture,{passive:true}); document.addEventListener('keydown',gesture); fullscreen.addEventListener('click',()=>{ recover();source();sync(); try{Promise.resolve(video.requestFullscreen?video.requestFullscreen():video.webkitEnterFullscreen?.()) .catch(()=>{fullscreen.title='当前浏览器暂不支持全屏播放';});} catch{fullscreen.title='当前浏览器暂不支持全屏播放';} }); function fullscreenControls(){ const active=inFullscreen();video.controls=!!active;scene.setAttribute('aria-hidden',String(!active));if(!active)sync(); } video.addEventListener('fullscreenchange',fullscreenControls); video.addEventListener('webkitbeginfullscreen',()=>{video.controls=true;scene.setAttribute('aria-hidden','false');}); video.addEventListener('webkitendfullscreen',()=>{video.controls=false;scene.setAttribute('aria-hidden','true');sync();}); new MutationObserver(sync).observe(stage,{attributes:true,attributeFilter:['class']}); document.addEventListener('visibilitychange',()=>{if(!document.hidden)recover();else sync();}); window.addEventListener('pagehide',()=>{pageActive=false;video.pause();clearTimeout(retryTimer);retryTimer=0;}); window.addEventListener('pageshow',()=>{pageActive=true;recover();}); window.addEventListener('online',()=>{retries=0;recover();}); window.IdleBackground={resetAnchor(){if(video.readyState>=1){try{video.currentTime=0;}catch{}}}}; sync(); })();