fix(dl): fallback tags quand releases absentes

This commit is contained in:
2026-05-28 19:13:34 +02:00
parent 07f232b70b
commit 41c2c58dba
+105 -80
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 || "#"; }
function pickDirectDownloadUrl(release) {
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;
} }
return release?.html_url || "#";
return release?.zipball_url || release?.html_url || REPO_URL;
} }
function getReleaseLabel(release) { function renderEmptyState(title, message) {
return release.name || release.tag_name || "Sans nom"; if (!versionsListNode) return;
versionsListNode.innerHTML = `
<li class="version-item version-item-empty">
<div class="version-main">
<strong>${title}</strong>
<span>${message}</span>
</div>
<div class="version-side">
<a class="button button-secondary" href="${REPO_URL}" target="_blank" rel="noreferrer">Voir le repo</a>
</div>
</li>
`;
} }
function renderReleaseList(releases) { function renderList(items, mode) {
if (!versionsListNode) return; if (!versionsListNode) return;
versionsListNode.innerHTML = ""; versionsListNode.innerHTML = "";
if (!releases.length) { const visibleItems = items.slice(1, 6);
versionsListNode.innerHTML = `
<li class="version-item version-item-empty"> if (!visibleItems.length) {
<div class="version-main"> if (items.length === 0) {
<strong>Aucune release trouvée</strong> renderEmptyState("Aucune release trouvée", "Le dépôt n'expose pas encore de release ou les releases ne sont pas accessibles.");
<span>Le dépôt n'a pas encore publié de version.</span> } else {
</div> renderEmptyState(
<div class="version-side"> mode === "releases" ? "Aucune release précédente trouvée" : "Aucun tag précédent trouvé",
<a class="button button-secondary" href="${REPO_URL}" target="_blank" rel="noreferrer">Voir le repo</a> mode === "releases"
</div> ? "Il n'y a qu'une seule release publiée pour le moment."
</li> : "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) { async function fetchJson(url) {
const li = document.createElement("li"); const response = await fetch(url, {
li.className = "version-item version-item-empty"; headers: { Accept: "application/vnd.github+json" },
li.innerHTML = ` });
<div class="version-main">
<strong>Aucune release précédente trouvée</strong> if (!response.ok) {
<span>La liste s'affiche ici quand il y en a au moins 2.</span> throw new Error(`GitHub API ${response.status}`);
</div>
`;
versionsListNode.appendChild(li);
} }
return response.json();
} }
async function loadReleases() { async function loadReleases() {
if (currentVersionNode) currentVersionNode.textContent = "Chargement..."; if (currentVersionNode) currentVersionNode.textContent = "Chargement...";
if (currentVersionDateNode) currentVersionDateNode.textContent = "";
if (currentReleaseNoteNode) currentReleaseNoteNode.textContent = "";
if (latestDownloadNode) latestDownloadNode.href = REPO_URL;
if (viewMoreNode) viewMoreNode.href = `${REPO_URL}/releases`;
try { try {
const response = await fetch(API_URL, { const releases = await fetchJson(RELEASES_URL);
headers: {
Accept: "application/vnd.github+json",
},
});
if (!response.ok) { if (Array.isArray(releases) && releases.length > 0) {
throw new Error(`GitHub API ${response.status}`); const latest = releases[0];
const latestLabel = getReleaseLabel(latest);
const latestDownloadUrl = pickDirectDownloadUrl(latest);
const latestDate = formatDate(latest.published_at);
if (currentVersionNode) currentVersionNode.textContent = latestLabel;
if (currentVersionDateNode) currentVersionDateNode.textContent = latestDate ? ` · ${latestDate}` : "";
if (currentReleaseNoteNode) {
currentReleaseNoteNode.textContent = latest.body || "Release GitHub la plus récente.";
}
if (latestDownloadNode) latestDownloadNode.href = latestDownloadUrl;
renderList(releases, "releases");
return;
} }
} catch (error) {
// On tente le fallback tags ci-dessous.
}
const releases = await response.json(); try {
if (!Array.isArray(releases)) { const tags = await fetchJson(TAGS_URL);
throw new Error("Réponse GitHub invalide");
}
if (releases.length === 0) { if (Array.isArray(tags) && tags.length > 0) {
if (currentVersionNode) currentVersionNode.textContent = "Aucune release trouvée"; 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 (currentVersionDateNode) currentVersionDateNode.textContent = "";
if (currentReleaseNoteNode) currentReleaseNoteNode.textContent = "Le dépôt n'a pas encore publié de release GitHub."; if (currentReleaseNoteNode) {
if (latestDownloadNode) latestDownloadNode.href = REPO_URL; currentReleaseNoteNode.textContent = "Aucune release GitHub publiée pour le moment, affichage des tags du dépôt.";
renderReleaseList([]); }
if (latestDownloadNode) latestDownloadNode.href = latestDownloadUrl;
renderList(tags, "tags");
return; return;
} }
const latest = releases[0]; if (currentVersionNode) currentVersionNode.textContent = "Aucune release trouvée";
const latestLabel = getReleaseLabel(latest); if (currentReleaseNoteNode) {
const latestDownloadUrl = getDirectDownloadUrl(latest); currentReleaseNoteNode.textContent = "Le dépôt ne renvoie ni release ni tag public.";
const latestDate = formatDate(latest.published_at); }
renderEmptyState("Aucune release trouvée", "Le dépôt ne renvoie ni release ni tag public.");
if (currentVersionNode) currentVersionNode.textContent = latestLabel;
if (currentVersionDateNode) currentVersionDateNode.textContent = latestDate ? ` · ${latestDate}` : "";
if (currentReleaseNoteNode) currentReleaseNoteNode.textContent = latest.body || "Release GitHub la plus récente.";
if (latestDownloadNode) latestDownloadNode.href = latestDownloadUrl;
renderReleaseList(releases);
} 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.");
} }
} }