fix: index-stable.html英文版+渠道持久化+highlight

This commit is contained in:
LukeMackin
2026-07-22 01:13:39 +08:00
parent 3a1058d10c
commit 45cce458ac
2 changed files with 29 additions and 26 deletions

View File

@@ -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{display:inline-block;padding:2px 8px;border-radius:4px;font-size:10px;margin-left:8px}
.badge-new{background:#dc2626;color:#fff} .badge-new{background:#dc2626;color:#fff}
</style></head><body> </style></head><body>
<div class="gear" onclick="openSettings()"></div> <div class="gear" onclick="openSettings()"></div>
<h1>Yuzu GCA</h1> <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="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> <div class="card"><div class="card-title">Channel: <span id="chLabel">Stable</span></div></div>
<button class="btn btn-check" onclick="checkUpdate()">检查更新</button> <button class="btn btn-check" onclick="checkUpdate()">Check Update</button>
<button class="btn btn-download" id="btnApply" onclick="applyUpdate()">下载更新</button> <button class="btn btn-download" id="btnApply" onclick="applyUpdate()">Download Update</button>
<div class="log" id="log"></div> <div class="log" id="log"></div>
<div class="modal" id="modal"> <div class="modal" id="modal">
<div class="modal-box"> <div class="modal-box">
<div class="modal-title">选择渠道</div> <div class="modal-title">Select Channel</div>
<button class="ch-opt on" onclick="setChannel('stable')">Stable (发行)</button> <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('beta')">Beta</button>
<button class="ch-opt" onclick="setChannel('nightly')">Nightly (开发)</button> <button class="ch-opt" onclick="setChannel('nightly')">Nightly</button>
<button class="btn btn-check" style="margin-top:12px" onclick="closeSettings()">关闭</button> <button class="btn btn-check" style="margin-top:12px" onclick="closeSettings()">Close</button>
</div> </div>
</div> </div>
<script> <script>
var channel=localStorage.getItem('gca_channel')||'stable'; var channel=localStorage.getItem('gca_channel')||'stable';
var dlUrl='',dlVer='',dlSha=''; var dlUrl='',dlVer='',dlSha='';
function log(m){var l=document.getElementById('log');l.innerText+=m+'\n';l.scrollTop=l.scrollHeight} 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 closeSettings(){document.getElementById('modal').classList.remove('show')}
function setChannel(ch){ function setChannel(ch){
channel=ch;localStorage.setItem('gca_channel',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() closeSettings();checkUpdate()
} }
function checkUpdate(){ function checkUpdate(){
log('channel: '+channel+' checking manifest...'); log('channel:'+channel);
var j=JSON.parse(Android.fetchManifest(channel)); var j=JSON.parse(Android.fetchManifest(channel));
if(j.error){log('ERR: '+j.error);return} if(j.error){log('ERR:'+j.error);return}
var h5=j.h5;log('latest: '+h5.latest+' min: '+h5.min_version); 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,''); 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(parseInt(my||'0')<parseInt(v||'0')){log('ERR:APK too old (need v'+h5.min_version+')');return}
dlUrl=h5.url;dlSha=h5.sha256||''; dlUrl=h5.url;dlSha=h5.sha256||'';
if(!dlSha||/^(0{64}|TBD)/.test(dlSha)){log('ERR: channel no build');return} if(!dlSha||/^(0{64}|TBD)/.test(dlSha)){log('ERR:channel no build');return}
if(h5.latest!==document.getElementById('ver').innerText){ 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 ***')} dlVer=h5.latest;document.getElementById('btnApply').classList.add('show');log('***NEW VERSION***')}
else log('up to date') else log('up to date')
} }
function applyUpdate(){ function applyUpdate(){
log('downloading...'); log('download...');
var t=Android.fetchText(h5UrlRelative(dlUrl)); var t=Android.fetchText('h5/index-stable.html');
if(typeof t!=='string'||t.startsWith('ERROR:')){log('ERR: '+t);return} if(typeof t!=='string'||t.startsWith('ERROR:')){log('ERR:'+t);return}
var h=Android.sha256(t); var h=Android.sha256(t);
if(h!==dlSha){log('SHA256 MISMATCH!');return} 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; document.getElementById('ver').innerText=Android.fetchManifest(channel).match(/"latest":"([^"]+)"/)?.[1]||channel;
</script></body></html> </script></body></html>

View File

@@ -1 +1 @@
{"stable":{"h5":{"latest":"0.1.0-dav-android-6","min_version":"0.1.0-dav-android-5","url":"https://git.childish-ghost.com/LukeMackin/Yuzu-GCA/raw/branch/main/ota/h5/index-stable.html","sha256":"f82ea977d7916d9316661186beac13a08156b64a0b613c6dac82a7b2f243214a"},"apk":{"version":"0.1.0-dav-android-5","versionCode":5,"url":"https://git.childish-ghost.com/LukeMackin/Yuzu-GCA/releases/download/v0.1.0-dav-android-5/v0.1.0-dav-android-5-debug.apk","sha256":"56b0e384f53015b0a1a5eb2507fd792dfc31fe44aff40342cd8a8d3bd5c1e14a"}},"beta":{"h5":{"latest":"0.1.0-dav-android-6","min_version":"0.1.0-dav-android-5","url":"https://git.childish-ghost.com/LukeMackin/Yuzu-GCA/raw/branch/main/ota/h5/index-stable.html","sha256":"f82ea977d7916d9316661186beac13a08156b64a0b613c6dac82a7b2f243214a"},"apk":{"version":"0.1.0-dav-android-5","versionCode":5,"url":"https://git.childish-ghost.com/LukeMackin/Yuzu-GCA/releases/download/v0.1.0-dav-android-5/v0.1.0-dav-android-5-debug.apk","sha256":"56b0e384f53015b0a1a5eb2507fd792dfc31fe44aff40342cd8a8d3bd5c1e14a"}},"nightly":{"h5":{"latest":"0.1.0-dav-android-6","min_version":"0.1.0-dav-android-5","url":"https://git.childish-ghost.com/LukeMackin/Yuzu-GCA/raw/branch/main/ota/h5/index-stable.html","sha256":"f82ea977d7916d9316661186beac13a08156b64a0b613c6dac82a7b2f243214a"},"apk":{"version":"0.1.0-dav-android-5","versionCode":5,"url":"https://git.childish-ghost.com/LukeMackin/Yuzu-GCA/releases/download/v0.1.0-dav-android-5/v0.1.0-dav-android-5-debug.apk","sha256":"56b0e384f53015b0a1a5eb2507fd792dfc31fe44aff40342cd8a8d3bd5c1e14a"}}} {"stable":{"h5":{"latest":"0.1.0-dav-android-6","min_version":"0.1.0-dav-android-5","url":"https://git.childish-ghost.com/LukeMackin/Yuzu-GCA/raw/branch/main/ota/h5/index-stable.html","sha256":"e392604584d3326254fff7e10e8a814e477f27f670550168a6f4096c2c439808"},"apk":{"version":"0.1.0-dav-android-5","versionCode":5,"url":"https://git.childish-ghost.com/LukeMackin/Yuzu-GCA/releases/download/v0.1.0-dav-android-5/v0.1.0-dav-android-5-debug.apk","sha256":"56b0e384f53015b0a1a5eb2507fd792dfc31fe44aff40342cd8a8d3bd5c1e14a"}},"beta":{"h5":{"latest":"0.1.0-dav-android-6","min_version":"0.1.0-dav-android-5","url":"https://git.childish-ghost.com/LukeMackin/Yuzu-GCA/raw/branch/main/ota/h5/index-stable.html","sha256":"e392604584d3326254fff7e10e8a814e477f27f670550168a6f4096c2c439808"},"apk":{"version":"0.1.0-dav-android-5","versionCode":5,"url":"https://git.childish-ghost.com/LukeMackin/Yuzu-GCA/releases/download/v0.1.0-dav-android-5/v0.1.0-dav-android-5-debug.apk","sha256":"56b0e384f53015b0a1a5eb2507fd792dfc31fe44aff40342cd8a8d3bd5c1e14a"}},"nightly":{"h5":{"latest":"0.1.0-dav-android-6","min_version":"0.1.0-dav-android-5","url":"https://git.childish-ghost.com/LukeMackin/Yuzu-GCA/raw/branch/main/ota/h5/index-stable.html","sha256":"e392604584d3326254fff7e10e8a814e477f27f670550168a6f4096c2c439808"},"apk":{"version":"0.1.0-dav-android-5","versionCode":5,"url":"https://git.childish-ghost.com/LukeMackin/Yuzu-GCA/releases/download/v0.1.0-dav-android-5/v0.1.0-dav-android-5-debug.apk","sha256":"56b0e384f53015b0a1a5eb2507fd792dfc31fe44aff40342cd8a8d3bd5c1e14a"}}}