fix(dl): fallback tags quand releases absentes

This commit is contained in:
2026-05-28 19:13:34 +02:00
parent 07f232b70b
commit 41c2c58dba
+94 -69
View File
@@ -1,13 +1,15 @@
(() => { (() => {
const OWNER = "You-re-like-Windows-a-bitch"; const OWNER = "You-re-like-Windows-a-bitch";
const REPO = "ISO"; const REPO = "ISO";
const API_URL = `https://api.github.com/repos/${OWNER}/${REPO}/releases?per_page=6`; const RELEASES_URL = `https://api.github.com/repos/${OWNER}/${REPO}/releases?per_page=6`;
const TAGS_URL = `https://api.github.com/repos/${OWNER}/${REPO}/tags?per_page=6`;
const REPO_URL = `https://github.com/${OWNER}/${REPO}`; const REPO_URL = `https://github.com/${OWNER}/${REPO}`;
const currentVersionNode = document.querySelector("[data-current-version]"); const currentVersionNode = document.querySelector("[data-current-version]");
const currentVersionDateNode = document.querySelector("[data-current-version-date]"); const currentVersionDateNode = document.querySelector("[data-current-version-date]");
const currentReleaseNoteNode = document.querySelector("[data-current-release-note]"); const currentReleaseNoteNode = document.querySelector("[data-current-release-note]");
const latestDownloadNode = document.querySelector("[data-latest-download]"); const latestDownloadNode = document.querySelector("[data-latest-download]");
const viewMoreNode = document.querySelector("[data-view-more]");
const versionsListNode = document.querySelector("[data-versions-list]"); const versionsListNode = document.querySelector("[data-versions-list]");
function formatDate(value) { function formatDate(value) {
@@ -21,48 +23,71 @@
}); });
} }
function getDirectDownloadUrl(release) { function getReleaseLabel(entry) {
if (release?.assets?.length) { return entry?.name || entry?.tag_name || entry?.ref || "Sans nom";
return release.assets[0].browser_download_url || release.assets[0].url || release.html_url || "#";
}
return release?.html_url || "#";
} }
function getReleaseLabel(release) { function pickDirectDownloadUrl(release) {
return release.name || release.tag_name || "Sans nom"; const assets = Array.isArray(release?.assets) ? release.assets : [];
const isoAsset = assets.find((asset) => /\.iso$/i.test(asset?.name || ""));
const directAsset = isoAsset || assets[0];
if (directAsset) {
return directAsset.browser_download_url || directAsset.url || release.html_url || REPO_URL;
} }
function renderReleaseList(releases) { return release?.zipball_url || release?.html_url || REPO_URL;
}
function renderEmptyState(title, message) {
if (!versionsListNode) return; if (!versionsListNode) return;
versionsListNode.innerHTML = "";
if (!releases.length) {
versionsListNode.innerHTML = ` versionsListNode.innerHTML = `
<li class="version-item version-item-empty"> <li class="version-item version-item-empty">
<div class="version-main"> <div class="version-main">
<strong>Aucune release trouvée</strong> <strong>${title}</strong>
<span>Le dépôt n'a pas encore publié de version.</span> <span>${message}</span>
</div> </div>
<div class="version-side"> <div class="version-side">
<a class="button button-secondary" href="${REPO_URL}" target="_blank" rel="noreferrer">Voir le repo</a> <a class="button button-secondary" href="${REPO_URL}" target="_blank" rel="noreferrer">Voir le repo</a>
</div> </div>
</li> </li>
`; `;
}
function renderList(items, mode) {
if (!versionsListNode) return;
versionsListNode.innerHTML = "";
const visibleItems = items.slice(1, 6);
if (!visibleItems.length) {
if (items.length === 0) {
renderEmptyState("Aucune release trouvée", "Le dépôt n'expose pas encore de release ou les releases ne sont pas accessibles.");
} else {
renderEmptyState(
mode === "releases" ? "Aucune release précédente trouvée" : "Aucun tag précédent trouvé",
mode === "releases"
? "Il n'y a qu'une seule release publiée pour le moment."
: "Il n'y a qu'un seul tag disponible pour le moment."
);
}
return; return;
} }
releases.slice(1, 6).forEach((release) => { visibleItems.forEach((entry) => {
const li = document.createElement("li"); const li = document.createElement("li");
li.className = "version-item"; li.className = "version-item";
const versionLabel = getReleaseLabel(release); const label = getReleaseLabel(entry);
const downloadUrl = getDirectDownloadUrl(release); const downloadUrl = mode === "releases"
const published = formatDate(release.published_at); ? pickDirectDownloadUrl(entry)
: `https://github.com/${OWNER}/${REPO}/archive/refs/tags/${encodeURIComponent(entry.name)}.zip`;
const published = formatDate(entry.published_at || entry.commit?.committer?.date);
li.innerHTML = ` li.innerHTML = `
<div class="version-main"> <div class="version-main">
<strong>${versionLabel}</strong> <strong>${label}</strong>
<span>${published ? `Publié le ${published}` : "Date inconnue"}</span> <span>${published ? `Publié le ${published}` : mode === "releases" ? "Date inconnue" : "Tag GitHub"}</span>
</div> </div>
<div class="version-side"> <div class="version-side">
<a class="button button-secondary" href="${downloadUrl}" target="_blank" rel="noreferrer">Télécharger</a> <a class="button button-secondary" href="${downloadUrl}" target="_blank" rel="noreferrer">Télécharger</a>
@@ -71,80 +96,80 @@
versionsListNode.appendChild(li); versionsListNode.appendChild(li);
}); });
if (releases.length === 1) {
const li = document.createElement("li");
li.className = "version-item version-item-empty";
li.innerHTML = `
<div class="version-main">
<strong>Aucune release précédente trouvée</strong>
<span>La liste s'affiche ici quand il y en a au moins 2.</span>
</div>
`;
versionsListNode.appendChild(li);
}
} }
async function loadReleases() { async function fetchJson(url) {
if (currentVersionNode) currentVersionNode.textContent = "Chargement..."; const response = await fetch(url, {
headers: { Accept: "application/vnd.github+json" },
try {
const response = await fetch(API_URL, {
headers: {
Accept: "application/vnd.github+json",
},
}); });
if (!response.ok) { if (!response.ok) {
throw new Error(`GitHub API ${response.status}`); throw new Error(`GitHub API ${response.status}`);
} }
const releases = await response.json(); return response.json();
if (!Array.isArray(releases)) {
throw new Error("Réponse GitHub invalide");
} }
if (releases.length === 0) { async function loadReleases() {
if (currentVersionNode) currentVersionNode.textContent = "Aucune release trouvée"; if (currentVersionNode) currentVersionNode.textContent = "Chargement...";
if (currentVersionDateNode) currentVersionDateNode.textContent = ""; if (currentVersionDateNode) currentVersionDateNode.textContent = "";
if (currentReleaseNoteNode) currentReleaseNoteNode.textContent = "Le dépôt n'a pas encore publié de release GitHub."; if (currentReleaseNoteNode) currentReleaseNoteNode.textContent = "";
if (latestDownloadNode) latestDownloadNode.href = REPO_URL; if (latestDownloadNode) latestDownloadNode.href = REPO_URL;
renderReleaseList([]); if (viewMoreNode) viewMoreNode.href = `${REPO_URL}/releases`;
return;
}
try {
const releases = await fetchJson(RELEASES_URL);
if (Array.isArray(releases) && releases.length > 0) {
const latest = releases[0]; const latest = releases[0];
const latestLabel = getReleaseLabel(latest); const latestLabel = getReleaseLabel(latest);
const latestDownloadUrl = getDirectDownloadUrl(latest); const latestDownloadUrl = pickDirectDownloadUrl(latest);
const latestDate = formatDate(latest.published_at); const latestDate = formatDate(latest.published_at);
if (currentVersionNode) currentVersionNode.textContent = latestLabel; if (currentVersionNode) currentVersionNode.textContent = latestLabel;
if (currentVersionDateNode) currentVersionDateNode.textContent = latestDate ? ` · ${latestDate}` : ""; if (currentVersionDateNode) currentVersionDateNode.textContent = latestDate ? ` · ${latestDate}` : "";
if (currentReleaseNoteNode) currentReleaseNoteNode.textContent = latest.body || "Release GitHub la plus récente."; if (currentReleaseNoteNode) {
currentReleaseNoteNode.textContent = latest.body || "Release GitHub la plus récente.";
}
if (latestDownloadNode) latestDownloadNode.href = latestDownloadUrl; if (latestDownloadNode) latestDownloadNode.href = latestDownloadUrl;
renderReleaseList(releases); renderList(releases, "releases");
return;
}
} catch (error) {
// On tente le fallback tags ci-dessous.
}
try {
const tags = await fetchJson(TAGS_URL);
if (Array.isArray(tags) && tags.length > 0) {
const latestTag = tags[0];
const latestLabel = getReleaseLabel(latestTag);
const latestDownloadUrl = `https://github.com/${OWNER}/${REPO}/archive/refs/tags/${encodeURIComponent(latestTag.name)}.zip`;
if (currentVersionNode) currentVersionNode.textContent = `${latestLabel} (tag)`;
if (currentVersionDateNode) currentVersionDateNode.textContent = "";
if (currentReleaseNoteNode) {
currentReleaseNoteNode.textContent = "Aucune release GitHub publiée pour le moment, affichage des tags du dépôt.";
}
if (latestDownloadNode) latestDownloadNode.href = latestDownloadUrl;
renderList(tags, "tags");
return;
}
if (currentVersionNode) currentVersionNode.textContent = "Aucune release trouvée";
if (currentReleaseNoteNode) {
currentReleaseNoteNode.textContent = "Le dépôt ne renvoie ni release ni tag public.";
}
renderEmptyState("Aucune release trouvée", "Le dépôt ne renvoie ni release ni tag public.");
} catch (error) { } catch (error) {
if (currentVersionNode) currentVersionNode.textContent = "Impossible de charger les releases"; if (currentVersionNode) currentVersionNode.textContent = "Impossible de charger les releases";
if (currentReleaseNoteNode) { if (currentReleaseNoteNode) {
currentReleaseNoteNode.textContent = `Erreur: ${error.message}. Vérifie que le repo GitHub est public et qu'il expose des releases.`; currentReleaseNoteNode.textContent = `Erreur: ${error.message}. Vérifie que le repo GitHub est public et qu'il expose des releases ou des tags.`;
}
if (latestDownloadNode) {
latestDownloadNode.href = REPO_URL;
}
if (versionsListNode) {
versionsListNode.innerHTML = `
<li class="version-item version-item-empty">
<div class="version-main">
<strong>Impossible de charger les anciennes versions</strong>
<span>Ouvre le repo GitHub pour voir les releases.</span>
</div>
<div class="version-side">
<a class="button button-secondary" href="${REPO_URL}" target="_blank" rel="noreferrer">Voir le repo</a>
</div>
</li>
`;
} }
renderEmptyState("Impossible de charger les releases", "Ouvre le repo GitHub pour vérifier les releases ou les tags.");
} }
} }