PS5 Directo 1.20.3

This commit is contained in:
JesterDev committed 2026-10-27 18:51:59 +01:00
1 parent 80bba19d57
commit 1f4b37acfd
27 files changed
+3818 -2778

No files matched your search

File renamed without changes.
View File
File renamed without changes.
+69 -1
View File
@@ -300,6 +300,74 @@ instalado) y PS5Directo-X.Y.Z-portable-windows.zip, que trae Python dentro:
descomprimir y abrir, sin instalar nada.
NOVEDADES 1.20.3
- Biblioteca: «Comprobar» en cada aplicación, para cuando no abre o se
cierra al arrancar. Revisa la carpeta (ejecutable, param.json, permisos,
firmware, backports y el empaquetado LZ4), muestra los registros (.log) y
las capturas de los últimos minutos, explica el código de error que salió
en la tele y guarda un informe .zip. Solo lee: no cambia nada.
- Ventana de bienvenida la primera vez: resume qué es PS5 Directo y qué hace.
- Biblioteca: también lo instalado en la consola (PS4 y PS5), con portada,
versión y firmware, y filtro para verlo.
- Biblioteca, «En tu PC»: eliges carpetas del PC o del NAS, marca lo que ya
está en la consola y lo que no, y lo envías con un clic.
- Biblioteca: «Ver actualizaciones» abre en el navegador la lista pública de
actualizaciones oficiales de cada título (Prospero Patches). Avisa de que
las que piden firmware 14.00 o más no se pueden instalar. El programa no
descarga nada.
- Biblioteca: si tienes PS5 Game Updater en la consola, un botón lo abre; si
su carpeta está mal colocada, lo detecta y la coloca bien.
- Biblioteca: las imágenes y las carpetas sin param.json salen con nombre,
portada y firmware.
- Nueva pestaña «Copia de seguridad»: guarda en el PC las partidas, los
ajustes de ShadowMountPlus y de los payloads y la base de datos de
aplicaciones, a mano o una vez al día. Las partidas se pueden restaurar en
la misma consola (antes guarda las de ahora).
- Nueva pestaña «Capturas»: capturas y vídeos de la consola con miniaturas,
para verlos y bajarlos al PC.
- «Diagnóstico» en las transferencias con error: qué ha pasado, códigos y cómo
arreglarlo, y un informe .zip (sin contraseñas) para pasar a quien te ayude.
En Ajustes, «Crear informe de fallo».
- Torrents: pega un magnet o un .torrent. Se baja primero al PC con aria2 (se
descarga solo) y luego se envía, descomprime o convierte. No comparte al
terminar y lo borra del PC.
- PS5 Dump Forge se actualiza solo (una vez al día como mucho), comprobando
antes que la versión nueva funciona; si no, sigue con la anterior.
- Las versiones nuevas de PS5 Directo se avisan solas con una ventana y sus
novedades.
- Avisa si la velocidad hacia la PS5 cae de golpe (suele ser la consola
inactiva: pulsa un botón del mando).
- «Formato en la PS5» empieza plegado y dice cuánto tarda: sin convertir,
descarga y envío a la vez; convirtiendo, 3 pasos. Tarjetas ordenadas por lo
más usado y «¿Cuál elijo?» por necesidades.
- Firmware de tu PS5 junto al título (se guarda solo) y la tarjeta .fpkg dice
si te vale.
- En la cola, «Convertir a …» dice a qué formato, y avisa si algo no se pudo
convertir.
- Arreglado: un comprimido con versión normal y backport no se convertía;
ahora separa la que toca.
- Arreglado: lo convertido se mezclaba con una carpeta anterior del mismo
nombre.
- Arreglado: muchas carpetas de la Biblioteca salían sin nombre.
NOVEDADES 1.20.1
- Si no conecta y el PC y la PS5 están en redes distintas (por ejemplo
192.168.50.x y 192.168.1.x), lo dice y explica cómo arreglarlo.
- Botones «Usar en el móvil» y «Extensión del navegador» más visibles, y el
asistente de inicio los ofrece al final.
- «Descargar de nuevo» en la cola (terminados, con error o cancelados) y en
Actividad: vuelve a empezar desde cero sin tener que pegar el enlace.
- Si al colocar ya existe esa carpeta, pregunta (colocar igualmente con otro
nombre, reemplazar o cancelar) en vez de dar error.
- Arreglado: si el comprimido trae la versión normal y un «backport», ya no
da «Ya existe»: coloca la normal y aparta el backport (o lo descarta si tu
firmware no lo necesita). Y si en el destino hay un envío anterior a
medias, lo sustituye.
- «Guía de uso» renovada: explica el convertidor de formatos, cada pestaña,
el uso desde el móvil y la extensión del navegador.
- La ventana «¿Cuál elijo?» añade velocidades estimadas donde no había datos
y textos más claros sobre LZ4 y .ffpfsc.
NOVEDADES 1.20.0
- Asistente de primeros pasos (IP, comprobar la conexión y cargar lo que
falta, firmware) y una guía más corta y sencilla.
@@ -438,7 +506,7 @@ NOVEDADES 1.14.1
NOVEDADES 1.14
- Guía de bienvenida la primera vez que se abre: enseña para qué es cada
parte. Se puede volver a ver con el botón "Guía" de arriba.
parte. Se puede volver a ver con el botón "Guía de uso" de arriba.
NOVEDADES 1.13.1
- El logo de la cabecera va dentro de la página (al actualizar desde una
+16 -9
View File
@@ -2,14 +2,14 @@
**English** · [Español](#español)
A Windows file-transfer tool for jailbroken PS5 consoles. It sends files to the console over FTP **while they download**, without storing them on your PC. It then extracts them, either on the console with BFpilot or on the PC with 7-Zip, and places apps in `/data/homebrew` so ShadowMountPlus shows them in the menu.
An all-in-one Windows tool for jailbroken PS5 consoles: it **downloads, converts and sends** in a single step. Sent as is, files go to the console over FTP **while they download**, without storing them on your PC; or it **converts them on the fly** (LZ4, `.exfat`, folder, `.ffpfsc`…) as part of the same job, no second program needed. It extracts on the console (BFpilot) or on the PC (7-Zip), places apps in `/data/homebrew` so ShadowMountPlus shows them in the menu, and lets you browse your console's library with covers and control everything from your phone.
![PS5 Directo: paste a link, it's sent, extracted and shows up in the library](docs/demo_en.gif)
![PS5 Directo: paste a link, send it as is or convert it, and it shows up in the library](docs/demo_en.gif)
<sub>Demo with a sample homebrew app served from a NAS on the local network.</sub>
- ✅ Streams downloads straight to the console: nothing is saved on the PC
- ✅ Works from download links, ftp:// links (e.g. a NAS) or files on your PC
- ✅ Works from download links, ftp:// links (e.g. a NAS), torrents (magnet or .torrent) or files on your PC
- ✅ Joins split parts (.part1, .part2… / .001, .002…) and extracts RAR, 7z, ZIP and tar (.gz/.bz2/.xz)
- ✅ Extracts on the console (BFpilot) or on the PC (7-Zip, every file CRC-checked)
- ✅ Fixes the file permissions that stop BFpilot-extracted content from launching (CE-107750-0)
@@ -24,8 +24,13 @@ A Windows file-transfer tool for jailbroken PS5 consoles. It sends files to the
- ✅ Optional browser extension: links arrive by themselves with your browser session (same speed and access as the browser)
- ✅ Drag and drop, or "Send to" from Explorer
- ✅ Welcome guide, one-click updates, English and Spanish
- ✅ **Library tab**: covers, versions and the firmware each app needs, flagging what won't launch on your console (backport-aware), duplicates and incomplete folders
- ✅ **Images and LZ4** with [PS5 Dump Forge](https://github.com/quer3q/ps5-dump-forge) (optional): send an app as a single `.ffpkg` / `.ffpfsc` image or LZ4-packed, prepared on the PC
- ✅ **Library tab**: covers, versions and the firmware each app needs, flagging what won't launch on your console (backport-aware), duplicates and incomplete folders. Also shows what's installed (PS4 and PS5), your PC/NAS collection with what's missing on the console, and links to each title's public update list
- ✅ **Backup tab**: saved data, ShadowMountPlus/payload settings and the app database copied to the PC, manually or daily; restore saved data to the same console
- ✅ **Captures tab**: view the console's screenshots and videos and download them
- ✅ **Diagnosis** on failed transfers (cause, codes and fixes) and a one-click problem report (.zip, no passwords)
- ✅ **Format converter** with [PS5 Dump Forge](https://github.com/quer3q/ps5-dump-forge) (optional): send it as is, or turn it on the PC into a plain folder, `.exfat`, LZ4, `.ffpfsc`, `.ffpkg`, `.ffpfs` or `.fpkg`, with a "Which one?" guide by need. Archives with a normal version plus a backport are split automatically
- ✅ Shows your PS5 firmware at the top and tells you which formats and apps will work on it
- ✅ "Download again" from the queue or the history, without pasting the link
- ✅ Asks before sending something that's already on the console (send anyway, replace or cancel)
- ✅ Checks every part against its `.sfv` / `.md5` / `.sha1` while sending
- ✅ "Make room": suggests what to delete when space runs out
@@ -55,7 +60,7 @@ The full guide is in [README_EN.txt](README_EN.txt) (Spanish: [LEEME.txt](LEEME.
## Publishing a release
Bump `VERSION` in `app.py`, add the notes to `LEEME.txt` / `README_EN.txt`, then push a tag (`git tag v1.20.0 && git push --tags`). The GitHub Action builds both zips (plain and portable with Python) and creates the release.
Bump `VERSION` in `app.py`, add the notes to `LEEME.txt` / `README_EN.txt`, then push a tag (`git tag v1.20.3 && git push --tags`). The GitHub Action builds both zips (plain and portable with Python) and creates the release.
## Disclaimer
@@ -70,11 +75,13 @@ Independent project, not affiliated with Sony or with the authors of the tools m
## Español
![PS5 Directo: pegas un enlace, se envía, se descomprime y aparece en la biblioteca](docs/demo_es.gif)
![PS5 Directo: pegas un enlace, lo envías tal cual o lo conviertes, y aparece en la biblioteca](docs/demo_es.gif)
Herramienta de transferencia de archivos para Windows: envía archivos a una PS5 con jailbreak por FTP **mientras se descargan**, sin pasar por el disco del PC. Después los descomprime (en la consola con BFpilot, o en el PC con 7-Zip) y coloca las aplicaciones en `/data/homebrew` para que ShadowMountPlus las muestre en el menú.
Herramienta todo en uno para Windows y PS5 con jailbreak: **descarga, convierte y envía** en un solo paso. Tal cual, los archivos van a la consola por FTP **mientras se descargan**, sin pasar por el disco del PC; o los **convierte sobre la marcha** (LZ4, `.exfat`, carpeta, `.ffpfsc`…) dentro del mismo trabajo, sin usar otro programa. Descomprime en la consola (BFpilot) o en el PC (7-Zip), coloca las aplicaciones en `/data/homebrew` para que ShadowMountPlus las muestre en el menú, y te deja ver la biblioteca de la consola con portadas y controlarlo todo desde el móvil.
**Novedades 1.20:** pestaña Biblioteca con portadas y aviso de firmware, imágenes `.ffpkg`/`.ffpfsc` y LZ4 con [PS5 Dump Forge](https://github.com/quer3q/ps5-dump-forge), pregunta si ya está en la consola, comprobación con `.sfv`/`.md5`, "Hacer sitio", cargar ftpsrv/BFpilot desde el programa, diagnóstico de red, acceso desde el móvil con QR y programar la cola.
**Novedades 1.20.3:** ventana de bienvenida, Biblioteca con lo instalado (PS4 y PS5) y con tu colección del PC/NAS, copias de seguridad de partidas y ajustes, capturas y vídeos, diagnóstico de errores con informe, torrents y avisos de actualización automáticos.
**Novedades 1.20:** pestaña Biblioteca con portadas y aviso de firmware, convertidor de formatos con [PS5 Dump Forge](https://github.com/quer3q/ps5-dump-forge) (carpeta, `.exfat`, LZ4, `.ffpfsc`, `.ffpkg`, `.ffpfs` y `.fpkg`), firmware de tu PS5 siempre a la vista, «Descargar de nuevo», pregunta si ya está en la consola, comprobación con `.sfv`/`.md5`, "Hacer sitio", cargar ftpsrv/BFpilot desde el programa, diagnóstico de red, acceso desde el móvil con QR y programar la cola.
**Requisitos:** Windows 10/11. Descarga el `-portable-windows.zip` (trae Python, no hay que instalar nada) o el `.zip` normal con [Python 3.9+](https://www.python.org/downloads/). Para descomprimir en el PC, [7-Zip](https://www.7-zip.org/). En la PS5: servidor FTP ([ftpsrv](https://github.com/ps5-payload-dev/ftpsrv)), [BFpilot](https://github.com/ItsBlurf/BFpilot) y [ShadowMountPlus](https://github.com/drakmor/ShadowMountPlus).
+72 -10
View File
@@ -152,7 +152,7 @@ HOW TO USE IT
-------------
1. Extract this folder anywhere you like.
2. Open PS5 Directo from the desktop icon. A short welcome guide explains
each part (you can see it again with the "Guide" button).
each part (you can see it again with the "User guide" button).
3. The first time, Settings opens: enter your PS5's IP (on the PS5:
Settings > Network > View Connection Status), click "Save" and then
"Test connection". Both dots at the top should turn green.
@@ -313,20 +313,81 @@ PS5Directo-X.Y.Z-portable-windows.zip, which includes Python: extract and run.
WHAT'S NEW
----------
1.20.3 - Library: "Check" on each app, for when it won't open or closes on
launch. It checks the folder (executable, param.json, permissions,
firmware, backports and LZ4 packing), shows logs (.log) and captures
from the last minutes, explains the error code shown on the TV and
saves a .zip report. Read-only: it changes nothing.
- Welcome window on first launch: sums up what PS5 Directo is and does.
- Library: also what's installed on the console (PS4 and PS5), with
cover, version and firmware, and a filter for it.
- Library, "On your PC": pick PC or NAS folders, see what's already on
the console and what isn't, and send it with one click.
- Library: "See updates" opens each title's public official update list
in your browser (Prospero Patches). Warns that updates needing
firmware 14.00 or higher can't be installed. The program downloads
nothing.
- Library: if PS5 Game Updater is on the console, a button opens it; if
its folder is misplaced, it detects and fixes it.
- Library: images and folders without param.json show name, cover and
firmware.
- New "Backup" tab: saves saved data, ShadowMountPlus and payload
settings and the app database to the PC, manually or daily. Saved data
can be restored to the same console (current data is backed up first).
- New "Captures" tab: the console's screenshots and videos with
thumbnails, to view and download to the PC.
- "Diagnosis" on failed transfers: what happened, codes and how to fix
it, plus a .zip report (no passwords) to send to whoever helps you. In
Settings, "Create problem report".
- Torrents: paste a magnet or a .torrent. It's downloaded to the PC
first with aria2 (fetched automatically) and then sent, extracted or
converted. No seeding afterwards; deleted from the PC.
- PS5 Dump Forge updates itself (at most daily), checking first the new
version works; otherwise it keeps the previous one.
- New PS5 Directo versions are announced by themselves in a window with
what's new.
- Warns if the speed to the PS5 suddenly drops (usually the console
idling: press a controller button).
- "Format on the PS5" starts folded and says how long it takes: no
conversion downloads and sends at once; converting takes 3 steps.
Cards sorted by most used and "Which one?" by need.
- Your PS5 firmware next to the title (saves automatically) and the
.fpkg card tells you if it works.
- In the queue, "Convert to …" names the format, and it warns if
something couldn't be converted.
- Fixed: an archive with a normal version plus a backport wasn't
converted; now it picks the right one.
- Fixed: converted files got mixed into an older folder with the same
name.
- Fixed: many Library folders showed no name.
1.20.1 - If it can't connect and the PC and PS5 are on different networks,
it says so and explains how to fix it.
- Clearer "Use on your phone" and "Browser extension" buttons, also
offered at the end of the first-steps wizard.
- "Download again" in the queue and in Activity: starts over without
pasting the link again. If the target already exists when placing,
it asks (keep both, replace or cancel) instead of failing.
- Fixed: archives with the normal app plus a "backport" folder no
longer fail with "Already exists"; half-sent leftovers are
replaced.
- Updated "User guide": explains the format converter, every tab,
phone access and the browser extension.
- The "Which one?" window adds estimated speeds where there was no
data, with clearer notes on LZ4 and .ffpfsc.
1.20.0 - First-steps wizard (IP, connection check and loading what's
missing, firmware) and a shorter, simpler guide.
- New Library tab: what's on the console with cover, version, format
and required firmware, flagging what won't launch on yours.
- .ffpkg / .ffpfsc images and LZ4 with PS5 Dump Forge (optional):
prepared on the PC and sent as a single file. Picked with cards under
the destination, each explained, with the room needed on the PC; the
first time it warns that converting takes PC space until it's done.
A download that's already an image is sent as is or converted to
the chosen format, and placed even without BFpilot.
prepared on the PC and sent as a single file. Picked with cards
under the destination, each explained, with the room needed on the
PC; the first time it warns that converting takes PC space until
it's done. A download that's already an image is sent as is or
converted to the chosen format, and placed even without BFpilot.
- New formats: plain folder, .exfat, .ffpfs and .fpkg (with a
compression choice). Without 7-Zip, PS5 Dump Forge extracts it.
- Formats are grouped (space savers first) and "Which one?"
compares the pros and cons of each.
- Formats are grouped (space savers first) and "Which one?" compares
the pros and cons of each.
- Time left (and rough finish time) when sending, extracting and
converting. On the phone, a big alert with vibration and a beep
when something finishes or fails (with the page open).
@@ -346,8 +407,9 @@ WHAT'S NEW
- Schedule the queue, sleep or shut down when done, no sleep while
sending.
- Portable version with Python included.
- Fixed: with FTP only (no BFpilot), ftpsrv returned the console's root
when listing a folder; it affected the file browser and folder uploads.
- Fixed: with FTP only (no BFpilot), ftpsrv returned the console's
root when listing a folder; it affected the file browser and
folder uploads.
- Phone access: a button to allow it in Windows Firewall if the page
stays blank.
1.19.2 - Fixed "504 Option not supported" in Console files when BFpilot is
Binary file not shown.
+1741 -33
View File
File diff suppressed because it is too large. Load diff
-84
View File
@@ -1,84 +0,0 @@
const EN = !(navigator.language || "es").toLowerCase().startsWith("es");
// PS5 Directo - captura de enlaces.
// Cuando el navegador empieza a descargar un archivo comprimido o paquete (.rar, .7z, .zip, .pkg...),
// manda el enlace FINAL (despues de redirecciones) a PS5 Directo y cancela la descarga.
// Si PS5 Directo no esta abierto, no toca nada: la descarga sigue normal.
const WANTED_FILE = /\.(part\d+\.rar|rar|r\d{2,3}|7z(\.\d{3})?|zip|z\d{2}|\d{3}|pkg|exfat|ffpkg|ffpfsc?|ufs)$/i;
const PORTS = [8777, 8778, 8779];
async function settings() {
return chrome.storage.local.get({ enabled: true, captured: 0 });
}
async function findApp() {
for (const port of PORTS) {
try {
const r = await fetch(`http://127.0.0.1:${port}/api/ext/ping`, { cache: "no-store" });
if (r.ok) {
const j = await r.json();
if (j.app === "PS5 Directo") return { port, version: j.version };
}
} catch (e) { /* no esta en ese puerto */ }
}
return null;
}
function fileName(item) {
const f = (item.filename || "").split(/[\\/]/).pop();
if (f) return f;
try { return decodeURIComponent(new URL(item.finalUrl || item.url).pathname.split("/").pop()); }
catch (e) { return ""; }
}
async function handle(item) {
const cfg = await settings();
if (!cfg.enabled) return;
const url = item.finalUrl || item.url;
if (!/^https?:/i.test(url)) return;
const name = fileName(item);
const path = url.split("?")[0];
if (!WANTED_FILE.test(name) && !WANTED_FILE.test(path)) return; // no es un archivo que nos interese
const app = await findApp();
if (!app) { // PS5 Directo cerrado: no tocar
chrome.action.setBadgeText({ text: "off" });
return;
}
// Como los gestores de descargas: pasamos las cookies de ese alojamiento (sesion, cuenta
// premium), el navegador y la pagina de origen, para que el servidor nos trate igual.
// Solo van a PS5 Directo en este PC (127.0.0.1), a ningun otro sitio.
const cookies = {};
for (const u of [url, item.url]) {
try {
const host = new URL(u).host.toLowerCase();
if (host in cookies) continue;
const list = await chrome.cookies.getAll({ url: u });
cookies[host] = list.map(c => `${c.name}=${c.value}`).join("; ");
} catch (e) { /* sin permiso o enlace raro: sin cookies */ }
}
try {
const r = await fetch(`http://127.0.0.1:${app.port}/api/ext/capture`, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ url, original: item.url, name, cookies,
ua: navigator.userAgent, referrer: item.referrer || "" })
});
if (!r.ok) return;
} catch (e) { return; }
try { await chrome.downloads.cancel(item.id); } catch (e) {}
try { await chrome.downloads.erase({ id: item.id }); } catch (e) {}
const n = (cfg.captured || 0) + 1;
await chrome.storage.local.set({ captured: n, last: name });
chrome.action.setBadgeBackgroundColor({ color: "#2563eb" });
chrome.action.setBadgeText({ text: String(n % 1000) });
chrome.notifications.create({
type: "basic", iconUrl: "icon128.png", title: EN ? "Sent to PS5 Directo" : "Enviado a PS5 Directo",
message: (name || (EN ? "Link" : "Enlace")) + (EN ? " — not downloaded to the PC." : " — no se descarga en el PC.")
});
}
// Cuando ya se sabe el nombre del archivo y el enlace final (tras las redirecciones)
chrome.downloads.onDeterminingFilename.addListener((item, suggest) => {
suggest(); // no cambiamos el nombre
handle(item);
});
BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 266 KiB

BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 275 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 896 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 928 KiB

+85 -4
View File
@@ -547,9 +547,32 @@ def ftp_read(f, path, offset=0, n=256 * 1024):
f.voidresp()
except ftplib.all_errors:
pass
if len(buf) >= n:
_ftp_resync(f)
return bytes(buf)
def _ftp_resync(f):
"""Al cortar una descarga a medias algunos servidores mandan una respuesta de mas (426 y luego 226),
y la siguiente orden recibiria la respuesta equivocada. Manda un NOOP y lee hasta su 200."""
old = None
try:
old = f.sock.gettimeout()
f.sock.settimeout(5)
f.putcmd("NOOP")
for _ in range(4):
line = f.getmultiline()
if line.startswith("200"):
break
except Exception:
pass
finally:
try:
f.sock.settimeout(old)
except Exception:
pass
def title_from_param(text):
try:
j = json.loads(text) if isinstance(text, str) else text
@@ -585,6 +608,40 @@ def param_facts(text):
}
def parse_sfo(data):
"""param.sfo (PS4): diccionario con sus claves (TITLE, TITLE_ID, APP_VER, SYSTEM_VER, CATEGORY...)."""
import struct
out = {}
if len(data) < 20 or data[:4] != b"\0PSF":
return out
_, _, key_off, data_off, n = struct.unpack_from("<4sIIII", data, 0)
for i in range(min(n, 256)):
e = 20 + i * 16
if e + 16 > len(data):
break
k_off, fmt, ln, _mx, d_off = struct.unpack_from("<HHIII", data, e)
ks = key_off + k_off
key = data[ks:data.find(b"\0", ks)].decode("ascii", "replace")
raw = data[data_off + d_off:data_off + d_off + ln]
if fmt == 0x0404 and len(raw) >= 4:
out[key] = struct.unpack_from("<I", raw)[0]
else:
out[key] = raw.split(b"\0", 1)[0].decode("utf-8", "replace")
return out
def sfo_facts(data):
s = parse_sfo(data)
sv = s.get("SYSTEM_VER")
fw = None
if isinstance(sv, int) and sv:
fw = "%x.%02x" % (sv >> 24, (sv >> 16) & 0xFF)
cat = str(s.get("CATEGORY") or "")
return {"title": s.get("TITLE") or None, "tid": s.get("TITLE_ID") or None,
"version": s.get("APP_VER") or s.get("VERSION") or None, "fw_param": fw, "need_fw": fw,
"extra": cat in ("ac", "gp", "sd")}
def inspect_remote_game(f, path, listing=None):
"""Datos de una aplicacion en carpeta en la consola, por FTP. listing: entradas de 'path'."""
names = {n: x for n, x in (listing if listing is not None else E.ftp_listdir(f, path))}
@@ -597,7 +654,11 @@ def inspect_remote_game(f, path, listing=None):
out["icon"] = "icon0.png" in sce
if "param.json" in sce:
raw = ftp_read(f, path + "/sce_sys/param.json", 0, 512 * 1024)
out.update(param_facts(raw.decode("utf-8", "replace")))
out.update(param_facts(raw.decode("utf-8-sig", "replace")))
if not out.get("tid"):
out["param_err"] = "param.json: %d bytes leídos (%r)" % (len(raw), raw[:60])
elif sce:
out["param_err"] = "sce_sys no tiene param.json"
if out["has_eboot"]:
try:
out["fw_exe"] = exe_firmware(lambda off, n: ftp_read(f, path + "/eboot.bin", off, n))
@@ -763,7 +824,25 @@ def forge_cli_name():
return "ps5-dump-forge.exe" if os.name == "nt" else "ps5-dump-forge"
def find_forge(custom, data_dir):
FORGE_NEEDED_FLAGS = ("--to", "--lz4-pack", "--lz4-unpack", "--kraken", "--level")
def forge_cli_ok(exe):
"""Comprueba que una version de Forge sigue entendiendo las opciones que usa PS5 Directo.
True = vale, False = le faltan opciones, None = no se ha podido saber."""
import subprocess
try:
p = subprocess.run([exe, "convert", "--help"], stdin=subprocess.DEVNULL, stdout=subprocess.PIPE,
stderr=subprocess.STDOUT, timeout=60, creationflags=E._NOWIN)
except Exception:
return None
out = p.stdout.decode("utf-8", "replace")
if "--to" not in out:
return None
return all(f in out for f in FORGE_NEEDED_FLAGS)
def find_forge(custom, data_dir, skip=()):
custom = (custom or "").strip().strip('"')
if custom and os.path.isfile(custom):
return custom
@@ -771,6 +850,8 @@ def find_forge(custom, data_dir):
best = None
if os.path.isdir(root):
for d in os.listdir(root):
if d in skip:
continue
p = os.path.join(root, d, forge_cli_name())
if os.path.isfile(p) and (best is None or os.path.getmtime(p) > os.path.getmtime(best)):
best = p
@@ -794,8 +875,8 @@ def _forge_asset(assets):
return None
def download_forge(data_dir, log=None, progress=None):
tag, assets = github_release(FORGE_REPO)
def download_forge(data_dir, log=None, progress=None, release=None):
tag, assets = release or github_release(FORGE_REPO)
a = _forge_asset(assets)
if not a:
raise E.PipeError("La última versión de PS5 Dump Forge no trae descarga para este sistema")
BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 778 B

BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

-2369
View File
File diff suppressed because it is too large. Load diff
-30
View File
@@ -1,30 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256">
<defs>
<linearGradient id="bg" x1="0" y1="0" x2="1" y2="1">
<stop offset="0" stop-color="#3a7bff"/>
<stop offset=".55" stop-color="#4b4fe6"/>
<stop offset="1" stop-color="#7b3fe4"/>
</linearGradient>
<radialGradient id="glow" cx=".3" cy=".2" r=".9">
<stop offset="0" stop-color="#fff" stop-opacity=".35"/>
<stop offset=".5" stop-color="#fff" stop-opacity="0"/>
</radialGradient>
<linearGradient id="arrow" x1="0" y1="0" x2="0" y2="1">
<stop offset="0" stop-color="#ffffff"/>
<stop offset="1" stop-color="#dfe6ff"/>
</linearGradient>
</defs>
<rect x="8" y="8" width="240" height="240" rx="58" fill="url(#bg)"/>
<rect x="8" y="8" width="240" height="240" rx="58" fill="url(#glow)"/>
<rect x="9.5" y="9.5" width="237" height="237" rx="56.5" fill="none" stroke="#fff" stroke-opacity=".22" stroke-width="3"/>
<!-- estelas de velocidad -->
<g stroke="#fff" stroke-linecap="round" stroke-opacity=".45" stroke-width="9">
<line x1="62" y1="58" x2="62" y2="92"/>
<line x1="194" y1="58" x2="194" y2="92"/>
</g>
<!-- flecha -->
<path d="M128 44 c9 0 15 6 15 15 v58 h22 c11 0 16 13 8 21 l-35 37 c-6 6-14 6-20 0 l-35-37 c-8-8-3-21 8-21 h22 v-58 c0-9 6-15 15-15z" fill="url(#arrow)"/>
<!-- bandeja / consola -->
<path d="M52 168 v18 c0 14 10 24 24 24 h104 c14 0 24-10 24-24 v-18" fill="none" stroke="#fff" stroke-width="16" stroke-linecap="round" stroke-linejoin="round"/>
<circle cx="176" cy="190" r="5.5" fill="#7dffb2"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.5 KiB

-32
View File
@@ -1,32 +0,0 @@
{
"manifest_version": 3,
"name": "PS5 Directo - Capturar enlaces",
"version": "1.1.0",
"description": "Cuando descargas un .rar/.7z/.zip/.pkg, manda el enlace (con la sesion del navegador) a PS5 Directo en vez de bajarlo al PC.",
"permissions": [
"downloads",
"storage",
"notifications",
"cookies"
],
"host_permissions": [
"http://127.0.0.1/*",
"<all_urls>"
],
"background": {
"service_worker": "bg.js"
},
"action": {
"default_popup": "popup.html",
"default_title": "PS5 Directo",
"default_icon": {
"16": "icon16.png",
"32": "icon32.png"
}
},
"icons": {
"16": "icon16.png",
"48": "icon48.png",
"128": "icon128.png"
}
}
-20
View File
@@ -1,20 +0,0 @@
<!doctype html>
<html lang="es"><head><meta charset="utf-8">
<style>
body{font:14px system-ui,sans-serif;background:#0d1117;color:#e6edf3;margin:0;padding:14px;width:280px}
h1{font-size:15px;margin:0 0 10px}
.row{display:flex;align-items:center;justify-content:space-between;margin:8px 0}
.st{font-size:13px;opacity:.85}
.ok{color:#4ade80}.bad{color:#f87171}
small{opacity:.6;display:block;margin-top:10px;line-height:1.4}
button{background:#1f2937;color:#e6edf3;border:1px solid #374151;border-radius:6px;padding:4px 10px;cursor:pointer}
</style></head>
<body>
<h1>PS5 Directo</h1>
<div class="row"><label for="en" id="lblEn">Capturar enlaces</label><input type="checkbox" id="en"></div>
<div class="st" id="st">Comprobando…</div>
<div class="st" id="cnt"></div>
<div class="row"><span></span><button id="reset">Poner contador a 0</button></div>
<small id="help">Pasa el captcha y pulsa Descargar como siempre: si es un .rar, .7z, .zip, .pkg… y PS5 Directo está abierto, el enlace va a su cuadro de enlaces y el navegador no descarga nada. Si PS5 Directo está cerrado, la descarga sigue normal.</small>
<script src="popup.js"></script>
</body></html>
-42
View File
@@ -1,42 +0,0 @@
const EN = !(navigator.language || "es").toLowerCase().startsWith("es");
const T = EN ? {
capture: "Capture links", checking: "Checking…", reset: "Reset counter",
help: "Pass the captcha and click Download as usual: if it's a .rar, .7z, .zip, .pkg… and PS5 Directo is open, the link goes to its link box and the browser downloads nothing. If PS5 Directo is closed, the download goes ahead normally.",
sent: "Sent", last: "last", connected: "● Connected", to: "to PS5 Directo", closed: "● PS5 Directo is not open", normal: "(downloads will work normally)"
} : {
capture: "Capturar enlaces", checking: "Comprobando…", reset: "Poner contador a 0",
help: null, sent: "Enviados", last: "último", connected: "● Conectado", to: "a PS5 Directo", closed: "● PS5 Directo no está abierto", normal: "(las descargas seguirán normales)"
};
if (EN) {
document.documentElement.lang = "en";
document.getElementById("lblEn").textContent = T.capture;
document.getElementById("st").textContent = T.checking;
document.getElementById("reset").textContent = T.reset;
document.getElementById("help").textContent = T.help;
}
async function findApp() {
for (const port of [8777, 8778, 8779]) {
try {
const r = await fetch(`http://127.0.0.1:${port}/api/ext/ping`, { cache: "no-store" });
if (r.ok) { const j = await r.json(); if (j.app === "PS5 Directo") return j; }
} catch (e) {}
}
return null;
}
(async () => {
const cfg = await chrome.storage.local.get({ enabled: true, captured: 0, last: "" });
const en = document.getElementById("en");
en.checked = cfg.enabled;
en.onchange = () => chrome.storage.local.set({ enabled: en.checked });
document.getElementById("cnt").textContent =
cfg.captured ? `${T.sent}: ${cfg.captured}${cfg.last ? " (" + T.last + ": " + cfg.last + ")" : ""}` : "";
document.getElementById("reset").onclick = async () => {
await chrome.storage.local.set({ captured: 0, last: "" });
chrome.action.setBadgeText({ text: "" });
document.getElementById("cnt").textContent = "";
};
const app = await findApp();
const st = document.getElementById("st");
if (app) { st.innerHTML = `<span class="ok">${T.connected}</span> ${T.to} v${app.version}`; chrome.action.setBadgeText({ text: "" }); }
else st.innerHTML = `<span class="bad">${T.closed}</span> ${T.normal}`;
})();
BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 62 KiB

View File
File renamed without changes.
View File
File renamed without changes.
View File
File renamed without changes.
+1835 -144
View File
File diff suppressed because it is too large. Load diff