diff --git a/app/downloads/errors.js b/app/downloads/errors.js index 689332e..d7a3685 100644 --- a/app/downloads/errors.js +++ b/app/downloads/errors.js @@ -19,6 +19,7 @@ import { t } from '../i18n/core.js'; [/not enough memory to extract/i, "noMemory", "reopenApp"], [/archive password/i, "archivePassword", "otherSource"], [/not a game file/i, "notGameFile", "otherSource"], + [/fake PKGs install only/i, "pkgFirmware", "otherSource"], // A set's last volume ends where the archive goes on, or its first is not where it starts: the source lists // too few volumes, and downloading them again fails the same way. A lone archive the worker cannot open // fails with the same words; that one is downloaded again. diff --git a/app/i18n/locales/ar.json b/app/i18n/locales/ar.json index 5c6680e..0e0ea1d 100644 --- a/app/i18n/locales/ar.json +++ b/app/i18n/locales/ar.json @@ -173,6 +173,7 @@ "errors.interrupted": "توقف عند إغلاق التطبيق", "errors.linkGone": "رابط التحميل لم يعد يعمل", "errors.notGameFile": "أرسل المضيف صفحة ويب بدلاً من اللعبة", + "errors.pkgFirmware": "لا تُثبَّت حزم PKG المزيفة إلا على البرنامج الثابت 11.60 أو أقدم", "errors.missingParts": "هذا المصدر تنقصه أجزاء", "errors.needsBrowser": "هذا المصدر يحتاج متصفح ويب", "errors.noConnection": "لا يوجد اتصال بالخادم", diff --git a/app/i18n/locales/bn.json b/app/i18n/locales/bn.json index 0056436..ccdc401 100644 --- a/app/i18n/locales/bn.json +++ b/app/i18n/locales/bn.json @@ -173,6 +173,7 @@ "errors.interrupted": "অ্যাপ বন্ধ হওয়ার সময় থেমেছিল", "errors.linkGone": "ডাউনলোড লিঙ্ক আর কাজ করে না", "errors.notGameFile": "হোস্ট গেমের বদলে একটি ওয়েব পেজ পাঠিয়েছে", + "errors.pkgFirmware": "ফেক PKG শুধু ফার্মওয়্যার 11.60 বা তার আগের সংস্করণে ইনস্টল হয়", "errors.missingParts": "এই উৎসে কিছু অংশ নেই", "errors.needsBrowser": "এই উৎসের একটি ওয়েব ব্রাউজার প্রয়োজন", "errors.noConnection": "সার্ভারের সাথে কোনো সংযোগ নেই", diff --git a/app/i18n/locales/de.json b/app/i18n/locales/de.json index 87d1f40..b49c120 100644 --- a/app/i18n/locales/de.json +++ b/app/i18n/locales/de.json @@ -173,6 +173,7 @@ "errors.interrupted": "Gestoppt, als die App geschlossen wurde", "errors.linkGone": "Download-Link funktioniert nicht mehr", "errors.notGameFile": "Der Host hat eine Webseite statt des Spiels gesendet", + "errors.pkgFirmware": "Fake-PKGs lassen sich nur bis Firmware 11.60 installieren", "errors.missingParts": "Dieser Quelle fehlen Teile", "errors.needsBrowser": "Diese Quelle benötigt einen Webbrowser", "errors.noConnection": "Keine Verbindung zum Server", diff --git a/app/i18n/locales/en.json b/app/i18n/locales/en.json index 67625e7..e6f93c3 100644 --- a/app/i18n/locales/en.json +++ b/app/i18n/locales/en.json @@ -174,6 +174,7 @@ "errors.interrupted": "Stopped when the app closed", "errors.linkGone": "Download link no longer works", "errors.notGameFile": "The host sent a web page instead of the game", + "errors.pkgFirmware": "Fake PKGs only install on firmware 11.60 or older", "errors.missingParts": "This source is missing parts", "errors.needsBrowser": "This source needs a web browser", "errors.noConnection": "No connection to the server", diff --git a/app/i18n/locales/es.json b/app/i18n/locales/es.json index fa88e1c..5860577 100644 --- a/app/i18n/locales/es.json +++ b/app/i18n/locales/es.json @@ -173,6 +173,7 @@ "errors.interrupted": "Detenido cuando la app se cerró", "errors.linkGone": "El enlace de descarga ya no funciona", "errors.notGameFile": "El servidor envió una página web en lugar del juego", + "errors.pkgFirmware": "Los PKG falsos solo se instalan con firmware 11.60 o anterior", "errors.missingParts": "A esta fuente le faltan partes", "errors.needsBrowser": "Esta fuente necesita un navegador web", "errors.noConnection": "Sin conexión al servidor", diff --git a/app/i18n/locales/fa.json b/app/i18n/locales/fa.json index 4761c55..3713250 100644 --- a/app/i18n/locales/fa.json +++ b/app/i18n/locales/fa.json @@ -174,6 +174,7 @@ "errors.interrupted": "با بسته شدن برنامه متوقف شد", "errors.linkGone": "لینک دانلود دیگر کار نمی‌کند", "errors.notGameFile": "میزبان به جای بازی یک صفحهٔ وب فرستاد", + "errors.pkgFirmware": "PKGهای جعلی فقط روی فریمور 11.60 یا قدیمی‌تر نصب می‌شوند", "errors.missingParts": "این منبع بخش‌هایی کم دارد", "errors.needsBrowser": "این منبع به مرورگر وب نیاز دارد", "errors.noConnection": "اتصال به سرور برقرار نیست", diff --git a/app/i18n/locales/fr.json b/app/i18n/locales/fr.json index 42ed500..cf0cda8 100644 --- a/app/i18n/locales/fr.json +++ b/app/i18n/locales/fr.json @@ -173,6 +173,7 @@ "errors.interrupted": "Arrêté quand l'app s'est fermée", "errors.linkGone": "Le lien de téléchargement ne fonctionne plus", "errors.notGameFile": "L'hébergeur a envoyé une page web au lieu du jeu", + "errors.pkgFirmware": "Les faux PKG ne s'installent qu'en firmware 11.60 ou antérieur", "errors.missingParts": "Il manque des parties à cette source", "errors.needsBrowser": "Cette source nécessite un navigateur web", "errors.noConnection": "Pas de connexion au serveur", diff --git a/app/i18n/locales/hi.json b/app/i18n/locales/hi.json index faada89..3603ce6 100644 --- a/app/i18n/locales/hi.json +++ b/app/i18n/locales/hi.json @@ -173,6 +173,7 @@ "errors.interrupted": "जब ऐप बंद हुआ तो रुका", "errors.linkGone": "डाउनलोड लिंक अब काम नहीं करता", "errors.notGameFile": "होस्ट ने गेम की जगह एक वेब पेज भेजा", + "errors.pkgFirmware": "फ़ेक PKG केवल फ़र्मवेयर 11.60 या पुराने पर इंस्टॉल होते हैं", "errors.missingParts": "इस स्रोत में भाग कम हैं", "errors.needsBrowser": "यह स्रोत एक वेब ब्राउज़र की आवश्यकता है", "errors.noConnection": "सर्वर से कोई कनेक्शन नहीं", diff --git a/app/i18n/locales/id.json b/app/i18n/locales/id.json index 1c6e37c..1ea7227 100644 --- a/app/i18n/locales/id.json +++ b/app/i18n/locales/id.json @@ -173,6 +173,7 @@ "errors.interrupted": "Dihentikan saat aplikasi ditutup", "errors.linkGone": "Tautan unduhan tidak lagi berfungsi", "errors.notGameFile": "Host mengirim halaman web, bukan gamenya", + "errors.pkgFirmware": "PKG palsu hanya bisa dipasang di firmware 11.60 atau lebih lama", "errors.missingParts": "Sumber ini kekurangan bagian", "errors.needsBrowser": "Sumber ini memerlukan browser web", "errors.noConnection": "Tidak ada koneksi ke server", diff --git a/app/i18n/locales/it.json b/app/i18n/locales/it.json index 2a21994..45d487a 100644 --- a/app/i18n/locales/it.json +++ b/app/i18n/locales/it.json @@ -179,6 +179,7 @@ "errors.interrupted": "Interrotto alla chiusura dell'app", "errors.linkGone": "Il link di download non funziona più", "errors.notGameFile": "L'host ha inviato una pagina web invece del gioco", + "errors.pkgFirmware": "I fake PKG si installano solo con firmware 11.60 o precedente", "errors.missingParts": "In questa fonte mancano delle parti", "errors.needsBrowser": "Questa fonte richiede un browser web", "errors.noConnection": "Nessuna connessione al server", diff --git a/app/i18n/locales/ja.json b/app/i18n/locales/ja.json index 2173ef6..2657cbc 100644 --- a/app/i18n/locales/ja.json +++ b/app/i18n/locales/ja.json @@ -173,6 +173,7 @@ "errors.interrupted": "アプリの終了時に停止しました", "errors.linkGone": "ダウンロードリンクが無効です", "errors.notGameFile": "ホストがゲームではなくウェブページを送信しました", + "errors.pkgFirmware": "偽PKGはファームウェア11.60以前でのみインストールできます", "errors.missingParts": "この入手元にはパートが足りません", "errors.needsBrowser": "この入手元にはWebブラウザが必要です", "errors.noConnection": "サーバーに接続できません", diff --git a/app/i18n/locales/pt-BR.json b/app/i18n/locales/pt-BR.json index 10dead6..3f7e20d 100644 --- a/app/i18n/locales/pt-BR.json +++ b/app/i18n/locales/pt-BR.json @@ -173,6 +173,7 @@ "errors.interrupted": "Interrompido quando o app fechou", "errors.linkGone": "Link de download não funciona mais", "errors.notGameFile": "O servidor enviou uma página da web em vez do jogo", + "errors.pkgFirmware": "PKGs falsos só instalam no firmware 11.60 ou anterior", "errors.missingParts": "Faltam partes nesta fonte", "errors.needsBrowser": "Esta fonte precisa de navegador web", "errors.noConnection": "Sem conexão com o servidor", diff --git a/app/i18n/locales/ru.json b/app/i18n/locales/ru.json index 9dbe006..33e0f9d 100644 --- a/app/i18n/locales/ru.json +++ b/app/i18n/locales/ru.json @@ -173,6 +173,7 @@ "errors.interrupted": "Остановлено при закрытии приложения", "errors.linkGone": "Ссылка на загрузку больше не работает", "errors.notGameFile": "Хостинг прислал веб-страницу вместо игры", + "errors.pkgFirmware": "Фейковые PKG устанавливаются только на прошивке 11.60 и ниже", "errors.missingParts": "В этом источнике не хватает частей", "errors.needsBrowser": "Этот источник требует веб-браузер", "errors.noConnection": "Нет соединения с сервером", diff --git a/app/i18n/locales/ur.json b/app/i18n/locales/ur.json index d94b35a..81650d8 100644 --- a/app/i18n/locales/ur.json +++ b/app/i18n/locales/ur.json @@ -173,6 +173,7 @@ "errors.interrupted": "ایپ بند ہونے پر روک دی گئی", "errors.linkGone": "ڈاؤن لوڈ لنک اب کام نہیں کرتی", "errors.notGameFile": "ہوسٹ نے گیم کے بجائے ویب پیج بھیجا", + "errors.pkgFirmware": "جعلی PKG صرف فرم ویئر 11.60 یا اس سے پرانے پر انسٹال ہوتے ہیں", "errors.missingParts": "اس ذریعے میں حصے کم ہیں", "errors.needsBrowser": "اس ذریعے کو ویب براؤزر کی ضرورت ہے", "errors.noConnection": "سرور سے کوئی رابطہ نہیں", diff --git a/app/i18n/locales/zh-Hans.json b/app/i18n/locales/zh-Hans.json index 2ea51df..0141926 100644 --- a/app/i18n/locales/zh-Hans.json +++ b/app/i18n/locales/zh-Hans.json @@ -173,6 +173,7 @@ "errors.interrupted": "应用关闭时已停止", "errors.linkGone": "下载链接已失效", "errors.notGameFile": "托管网站发送的是网页而不是游戏", + "errors.pkgFirmware": "伪 PKG 仅能在 11.60 或更早的固件上安装", "errors.missingParts": "此来源缺少部分文件", "errors.needsBrowser": "此来源需要网页浏览器", "errors.noConnection": "无法连接到服务器", diff --git a/app/state/firmware.js b/app/state/firmware.js new file mode 100644 index 0000000..1858391 --- /dev/null +++ b/app/state/firmware.js @@ -0,0 +1,30 @@ +import { DeviceInfo } from '@ps5-react/core'; + + // Fake PKGs install only up to this firmware; above it the system refuses them, after the whole + // download (issues #6 and #17). Version strings read like "13.200.001": major and two minor digits. + var LAST_PKG_FIRMWARE = [11, 60]; + var PKG_FIRMWARE_ERROR = "Fake PKGs install only on firmware 11.60 or older. Choose another source."; + var PKG_FORMATS = /* @__PURE__ */ new Set(["pkg", "fpkg"]); + function firmwareVersion() { + let text; + try { + text = DeviceInfo.get().firmware; + } catch { + return null; + } + const match = /(\d+)\.(\d{2})/.exec(text || ""); + return match ? [Number(match[1]), Number(match[2])] : null; + } + // Unknown firmware (the desktop preview, an old runtime) keeps PKGs offered, as before. + function fakePackagesInstall() { + const version = firmwareVersion(); + if (!version) return true; + const [major, minor] = version, [lastMajor, lastMinor] = LAST_PKG_FIRMWARE; + return major < lastMajor || major === lastMajor && minor <= lastMinor; + } + function withoutUninstallablePackages(releases) { + if (fakePackagesInstall()) return releases; + return releases.map((release) => PKG_FORMATS.has(release.format) && !release.unavailableReason ? { ...release, unavailableReason: PKG_FIRMWARE_ERROR } : release); + } + +export { PKG_FIRMWARE_ERROR, fakePackagesInstall, withoutUninstallablePackages }; diff --git a/app/state/release-cache.js b/app/state/release-cache.js index fd54039..cf43b13 100644 --- a/app/state/release-cache.js +++ b/app/state/release-cache.js @@ -1,6 +1,7 @@ // ../pub-game-store/native/state/release-cache.js // reconstructed from the esbuild bundle in eboot.bin +import { withoutUninstallablePackages } from './firmware.js'; import { releaseSets } from './release-sets.js'; var KEPT2 = 6; @@ -12,7 +13,7 @@ import { releaseSets } from './release-sets.js'; if (!releases) { const parsed = JSON.parse(read(file)); if (!Array.isArray(parsed)) throw new Error("Invalid release data; rebuild the catalog."); - releases = releaseSets(parsed); + releases = withoutUninstallablePackages(releaseSets(parsed)); if (games2.size === KEPT2) games2.delete(games2.keys().next().value); } games2.delete(file);