fix: index-stable.html英文版+渠道持久化+highlight
This commit is contained in:
@@ -22,55 +22,58 @@ h1{font-size:18px;color:#38bdf8}
|
||||
.badge{display:inline-block;padding:2px 8px;border-radius:4px;font-size:10px;margin-left:8px}
|
||||
.badge-new{background:#dc2626;color:#fff}
|
||||
</style></head><body>
|
||||
<div class="gear" onclick="openSettings()">⚙️</div>
|
||||
<div class="gear" onclick="openSettings()">⚙</div>
|
||||
<h1>Yuzu GCA</h1>
|
||||
<div class="ver"><span id="ver"></span><span id="badge" class="badge badge-new" style="display:none">NEW</span></div>
|
||||
<div class="card"><div class="card-title">当前渠道: <span id="chLabel">Stable</span></div></div>
|
||||
<button class="btn btn-check" onclick="checkUpdate()">检查更新</button>
|
||||
<button class="btn btn-download" id="btnApply" onclick="applyUpdate()">下载更新</button>
|
||||
<div class="card"><div class="card-title">Channel: <span id="chLabel">Stable</span></div></div>
|
||||
<button class="btn btn-check" onclick="checkUpdate()">Check Update</button>
|
||||
<button class="btn btn-download" id="btnApply" onclick="applyUpdate()">Download Update</button>
|
||||
<div class="log" id="log"></div>
|
||||
|
||||
<div class="modal" id="modal">
|
||||
<div class="modal-box">
|
||||
<div class="modal-title">选择渠道</div>
|
||||
<button class="ch-opt on" onclick="setChannel('stable')">Stable (发行)</button>
|
||||
<button class="ch-opt" onclick="setChannel('beta')">Beta (测试)</button>
|
||||
<button class="ch-opt" onclick="setChannel('nightly')">Nightly (开发)</button>
|
||||
<button class="btn btn-check" style="margin-top:12px" onclick="closeSettings()">关闭</button>
|
||||
<div class="modal-title">Select Channel</div>
|
||||
<button class="ch-opt on" onclick="setChannel('stable')">Stable</button>
|
||||
<button class="ch-opt" onclick="setChannel('beta')">Beta</button>
|
||||
<button class="ch-opt" onclick="setChannel('nightly')">Nightly</button>
|
||||
<button class="btn btn-check" style="margin-top:12px" onclick="closeSettings()">Close</button>
|
||||
</div>
|
||||
</div>
|
||||
<script>
|
||||
var channel=localStorage.getItem('gca_channel')||'stable';
|
||||
var dlUrl='',dlVer='',dlSha='';
|
||||
function log(m){var l=document.getElementById('log');l.innerText+=m+'\n';l.scrollTop=l.scrollHeight}
|
||||
function openSettings(){document.getElementById('modal').classList.add('show')}
|
||||
function openSettings(){
|
||||
var m=document.getElementById('modal');m.classList.add('show');
|
||||
document.querySelectorAll('.ch-opt').forEach(function(b){b.classList.toggle('on',b.textContent.toLowerCase()===channel)})
|
||||
}
|
||||
function closeSettings(){document.getElementById('modal').classList.remove('show')}
|
||||
function setChannel(ch){
|
||||
channel=ch;localStorage.setItem('gca_channel',ch);
|
||||
document.getElementById('chLabel').innerText=ch==='stable'?'Stable (发行)':ch==='beta'?'Beta (测试)':'Nightly (开发)';
|
||||
document.getElementById('chLabel').innerText=ch.charAt(0).toUpperCase()+ch.slice(1);
|
||||
document.querySelectorAll('.ch-opt').forEach(function(b){b.classList.toggle('on',b.textContent.toLowerCase()===ch)});
|
||||
closeSettings();checkUpdate()
|
||||
}
|
||||
function checkUpdate(){
|
||||
log('channel: '+channel+' checking manifest...');
|
||||
log('channel:'+channel);
|
||||
var j=JSON.parse(Android.fetchManifest(channel));
|
||||
if(j.error){log('ERR: '+j.error);return}
|
||||
var h5=j.h5;log('latest: '+h5.latest+' min: '+h5.min_version);
|
||||
var v=h5.min_version.replace(/[^0-9]/g,''),my=(document.getElementById('ver').innerText||'').replace(/[^0-9]/g,'');
|
||||
if(parseInt(my||'0')<parseInt(v||'0')){log('ERR: APK too old (need v'+h5.min_version+')');return}
|
||||
if(j.error){log('ERR:'+j.error);return}
|
||||
var h5=j.h5;log('latest:'+h5.latest+' min:'+h5.min_version);
|
||||
var v=(h5.min_version||'').replace(/[^0-9]/g,''),my=(document.getElementById('ver').innerText||'').replace(/[^0-9]/g,'');
|
||||
if(parseInt(my||'0')<parseInt(v||'0')){log('ERR:APK too old (need v'+h5.min_version+')');return}
|
||||
dlUrl=h5.url;dlSha=h5.sha256||'';
|
||||
if(!dlSha||/^(0{64}|TBD)/.test(dlSha)){log('ERR: channel no build');return}
|
||||
if(h5.latest!==document.getElementById('ver').innerText){
|
||||
dlVer=h5.latest;document.getElementById('btnApply').classList.add('show');log('*** NEW VERSION ***')}
|
||||
if(!dlSha||/^(0{64}|TBD)/.test(dlSha)){log('ERR:channel no build');return}
|
||||
if(h5.latest!==document.getElementById('ver').innerText&&h5.latest!=='v'+document.getElementById('ver').innerText){
|
||||
dlVer=h5.latest;document.getElementById('btnApply').classList.add('show');log('***NEW VERSION***')}
|
||||
else log('up to date')
|
||||
}
|
||||
function applyUpdate(){
|
||||
log('downloading...');
|
||||
var t=Android.fetchText(h5UrlRelative(dlUrl));
|
||||
if(typeof t!=='string'||t.startsWith('ERROR:')){log('ERR: '+t);return}
|
||||
log('download...');
|
||||
var t=Android.fetchText('h5/index-stable.html');
|
||||
if(typeof t!=='string'||t.startsWith('ERROR:')){log('ERR:'+t);return}
|
||||
var h=Android.sha256(t);
|
||||
if(h!==dlSha){log('SHA256 MISMATCH!');return}
|
||||
Android.saveCache(t);log('OK! restart app to apply')
|
||||
Android.saveCache(t);log('OK! restart app')
|
||||
}
|
||||
function h5UrlRelative(u){var p=u.split('/ota/');return p.length>1?'h5/'+p[1].split('/h5/')[1]:u}
|
||||
document.getElementById('ver').innerText=Android.fetchManifest(channel).match(/"latest":"([^"]+)"/)?.[1]||channel;
|
||||
</script></body></html>
|
||||
</script></body></html>
|
||||
|
||||
Reference in New Issue
Block a user