From 41c2c58dbad24c7db31183b53b65eff78a506c3d Mon Sep 17 00:00:00 2001 From: BlackAngelTVdev Date: Thu, 28 May 2026 19:13:34 +0200 Subject: [PATCH] fix(dl): fallback tags quand releases absentes --- p/assets/js/downloads.js | 185 ++++++++++++++++++++++----------------- 1 file changed, 105 insertions(+), 80 deletions(-) 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."); } }