diff --git a/p/assets/js/downloads.js b/p/assets/js/downloads.js
index 3ebbfaf..0aaf953 100644
--- a/p/assets/js/downloads.js
+++ b/p/assets/js/downloads.js
@@ -1,13 +1,15 @@
(() => {
const OWNER = "You-re-like-Windows-a-bitch";
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 currentVersionNode = document.querySelector("[data-current-version]");
const currentVersionDateNode = document.querySelector("[data-current-version-date]");
const currentReleaseNoteNode = document.querySelector("[data-current-release-note]");
const latestDownloadNode = document.querySelector("[data-latest-download]");
+ const viewMoreNode = document.querySelector("[data-view-more]");
const versionsListNode = document.querySelector("[data-versions-list]");
function formatDate(value) {
@@ -21,48 +23,71 @@
});
}
- function getDirectDownloadUrl(release) {
- if (release?.assets?.length) {
- return release.assets[0].browser_download_url || release.assets[0].url || release.html_url || "#";
+ function getReleaseLabel(entry) {
+ return entry?.name || entry?.tag_name || entry?.ref || "Sans nom";
+ }
+
+ 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) {
- return release.name || release.tag_name || "Sans nom";
+ function renderEmptyState(title, message) {
+ if (!versionsListNode) return;
+ versionsListNode.innerHTML = `
+
+
+ ${title}
+ ${message}
+
+
+
+ `;
}
- function renderReleaseList(releases) {
+ function renderList(items, mode) {
if (!versionsListNode) return;
versionsListNode.innerHTML = "";
- if (!releases.length) {
- versionsListNode.innerHTML = `
-
-
- Aucune release trouvée
- Le dépôt n'a pas encore publié de version.
-
-
-
- `;
+ 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;
}
- releases.slice(1, 6).forEach((release) => {
+ visibleItems.forEach((entry) => {
const li = document.createElement("li");
li.className = "version-item";
- const versionLabel = getReleaseLabel(release);
- const downloadUrl = getDirectDownloadUrl(release);
- const published = formatDate(release.published_at);
+ const label = getReleaseLabel(entry);
+ const downloadUrl = mode === "releases"
+ ? 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 = `
- ${versionLabel}
- ${published ? `Publié le ${published}` : "Date inconnue"}
+ ${label}
+ ${published ? `Publié le ${published}` : mode === "releases" ? "Date inconnue" : "Tag GitHub"}
Télécharger
@@ -71,80 +96,80 @@
versionsListNode.appendChild(li);
});
+ }
- if (releases.length === 1) {
- const li = document.createElement("li");
- li.className = "version-item version-item-empty";
- li.innerHTML = `
-
- Aucune release précédente trouvée
- La liste s'affiche ici quand il y en a au moins 2.
-
- `;
- versionsListNode.appendChild(li);
+ async function fetchJson(url) {
+ const response = await fetch(url, {
+ headers: { Accept: "application/vnd.github+json" },
+ });
+
+ if (!response.ok) {
+ throw new Error(`GitHub API ${response.status}`);
}
+
+ return response.json();
}
async function loadReleases() {
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 {
- const response = await fetch(API_URL, {
- headers: {
- Accept: "application/vnd.github+json",
- },
- });
+ const releases = await fetchJson(RELEASES_URL);
- if (!response.ok) {
- throw new Error(`GitHub API ${response.status}`);
+ if (Array.isArray(releases) && releases.length > 0) {
+ 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();
- if (!Array.isArray(releases)) {
- throw new Error("Réponse GitHub invalide");
- }
+ try {
+ const tags = await fetchJson(TAGS_URL);
- if (releases.length === 0) {
- if (currentVersionNode) currentVersionNode.textContent = "Aucune release trouvée";
+ 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 = "Le dépôt n'a pas encore publié de release GitHub.";
- if (latestDownloadNode) latestDownloadNode.href = REPO_URL;
- renderReleaseList([]);
+ 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;
}
- const latest = releases[0];
- const latestLabel = getReleaseLabel(latest);
- const latestDownloadUrl = getDirectDownloadUrl(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;
-
- renderReleaseList(releases);
+ 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) {
if (currentVersionNode) currentVersionNode.textContent = "Impossible de charger les releases";
if (currentReleaseNoteNode) {
- currentReleaseNoteNode.textContent = `Erreur: ${error.message}. Vérifie que le repo GitHub est public et qu'il expose des releases.`;
- }
- if (latestDownloadNode) {
- latestDownloadNode.href = REPO_URL;
- }
- if (versionsListNode) {
- versionsListNode.innerHTML = `
-
-
- Impossible de charger les anciennes versions
- Ouvre le repo GitHub pour voir les releases.
-
-
-
- `;
+ currentReleaseNoteNode.textContent = `Erreur: ${error.message}. Vérifie que le repo GitHub est public et qu'il expose des releases ou des tags.`;
}
+ renderEmptyState("Impossible de charger les releases", "Ouvre le repo GitHub pour vérifier les releases ou les tags.");
}
}