From a1d035313e913537dc15d3b359374c2d3dc4581a Mon Sep 17 00:00:00 2001 From: Knutwurst <36196269+knutwurst@users.noreply.github.com> Date: Wed, 24 Jun 2026 20:59:47 +0200 Subject: [PATCH] Release 0.0.4 Update all skips shadowmount titles. They pass the download policy but not the install policy (their app slot has no real source medium), so sweeping them in would burn tens of GB on a download AppInstUtil would refuse. Single shadowmount downloads via the per-title button still work for the "pop the disc in later" workflow. --- src/patchdl_version.h | 2 +- web/app.js | 17 ++++++++++------- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/patchdl_version.h b/src/patchdl_version.h index 5fb897b..7dc7a93 100644 --- a/src/patchdl_version.h +++ b/src/patchdl_version.h @@ -1,3 +1,3 @@ #pragma once -#define PATCHDL_VERSION "0.0.3" +#define PATCHDL_VERSION "0.0.4" diff --git a/web/app.js b/web/app.js index 0a13d03..c60d975 100644 --- a/web/app.js +++ b/web/app.js @@ -755,17 +755,20 @@ async function saveConfig() { /* ---------------- actions (data layer) ---------------- */ -// Queue a download for every game that currently has an available, allowed -// update. The server tolerates duplicate requests (already-queued/active jobs -// return their existing state), so a second click is harmless. If -// install_after_download is on, the per-job auto-install pipeline kicks in -// once each download finishes — no further client action needed. +// Queue a download for every game that has an available update AND could +// actually be installed afterwards. Shadowmounts pass isDownloadAllowed but +// fail isInstallAllowed (their app slot has no real source medium), so a +// sweep would otherwise pull tens of GB that AppInstUtil will refuse — the +// user picks those up by hand when the disc is ready. The server tolerates +// duplicate requests, so a second click is harmless. If install_after_download +// is on, the per-job auto-install pipeline kicks in once each download +// finishes — no further client action needed. async function updateAll() { const targets = state.games.filter((g) => - g.status === "available" && isDownloadAllowed(g) && + g.status === "available" && isInstallAllowed(g) && !g.downloading && !g.downloaded); if (!targets.length) { - showToast("No updates to queue."); + showToast("No installable updates to queue."); return; } showToast(`Queueing ${targets.length} update${targets.length === 1 ? "" : "s"}…`);