"use strict"; const baseUrl = "https://seamlessupdate.app/"; const versionBaseUrl = "https://github.com/GrapheneOS/platform_manifest/releases/tag/"; const devices = ["crosshatch", "blueline", "taimen", "walleye", "marlin", "sailfish"]; const snapshot = []; const channels = ["stable", "beta"]; function createLink(href, text) { const link = document.createElement("a"); link.appendChild(document.createTextNode(text)); link.href = href; return link; } for (const channel of channels) { for (const device of devices) { fetch(baseUrl + device + "-" + channel).then(response => { if (!response.ok) { return Promise.reject(); } return response.text(); }).then(text => { const metadata = text.trim().split(" "); const factoryFilename = device + "-factory-" + metadata[0] + ".zip"; const factoryUrl = baseUrl + factoryFilename; const updateFilename = device + "-ota_update-" + metadata[0] + ".zip"; const updateUrl = baseUrl + updateFilename; const release = document.getElementById(device + "-" + channel); const tag = metadata[2] + "." + metadata[0]; const version = document.createElement("p"); if (snapshot.includes(device)) { version.appendChild(document.createTextNode("Version: " + tag)); } else { version.appendChild(document.createTextNode("Version: ")); version.appendChild(createLink(versionBaseUrl + tag, tag)); } release.replaceChild(version, release.getElementsByTagName("p")[0]); const links = release.getElementsByTagName("a"); links[2].innerText = factoryFilename; links[2].setAttribute("href", factoryUrl); links[3].innerText = factoryFilename + ".sig"; links[3].setAttribute("href", factoryUrl + ".sig"); links[4].innerText = updateFilename; links[4].setAttribute("href", updateUrl); }); } }