mirror of
https://github.com/jstrdev/ps5directo.git
synced 2026-10-29 04:01:51 +01:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
80bba19d57 | ||
|
|
088c46f548 | ||
|
|
b65a3b34dd | ||
|
|
3e642e0986 | ||
|
|
d8113534ea | ||
|
|
5128f49f8b | ||
|
|
c8a0466854 | ||
|
|
3314a0f1b0 |
No files matched your search
@@ -2,11 +2,15 @@
|
||||
chcp 65001 >nul
|
||||
title PS5 Directo
|
||||
cd /d "%~dp0"
|
||||
where py >nul 2>nul
|
||||
if %errorlevel%==0 (
|
||||
py -3 app.py %*
|
||||
if exist "%~dp0python\python.exe" (
|
||||
"%~dp0python\python.exe" app.py %*
|
||||
) else (
|
||||
python app.py %*
|
||||
where py >nul 2>nul
|
||||
if not errorlevel 1 (
|
||||
py -3 app.py %*
|
||||
) else (
|
||||
python app.py %*
|
||||
)
|
||||
)
|
||||
if %errorlevel%==3 exit /b 0
|
||||
echo.
|
||||
|
||||
@@ -1,7 +1,55 @@
|
||||
PS5 DIRECTO 1.18
|
||||
================
|
||||
PS5 DIRECTO 1.20.0
|
||||
==================
|
||||
(English: see README_EN.txt)
|
||||
|
||||
EMPIEZA AQUÍ (5 MINUTOS)
|
||||
========================
|
||||
Lo que necesitas antes:
|
||||
- Una PS5 con el jailbreak ya hecho. PS5 Directo no hace el jailbreak.
|
||||
- Un PC con Windows 10 u 11 conectado a la misma red que la PS5.
|
||||
|
||||
Paso 1. Descarga
|
||||
En la página de GitHub del programa, entra en "Releases" y descarga
|
||||
PS5Directo-X.Y.Z-portable-windows.zip (trae todo, no hay que instalar
|
||||
nada más). Descomprímelo en una carpeta, por ejemplo en Documentos.
|
||||
|
||||
Paso 2. Ábrelo
|
||||
Doble clic en "PS5 Directo.vbs". Se abre en su propia ventana y crea un
|
||||
icono en el escritorio para la próxima vez. Si Windows pregunta si quieres
|
||||
abrir un archivo descargado de internet, pulsa "Abrir".
|
||||
|
||||
Paso 3. En la PS5
|
||||
Carga el jailbreak como siempre y ShadowMountPlus (es lo que hace que lo
|
||||
que envíes aparezca en el menú). Si tu menú de payloads también carga el
|
||||
FTP (ftpsrv) y BFpilot, mejor; si no, PS5 Directo te ayuda en el paso 5.
|
||||
|
||||
Paso 4. La IP de la PS5
|
||||
El asistente que sale al abrir te la pide. En la PS5: Ajustes > Red >
|
||||
Ver estado de la conexión > "Dirección IPv4" (algo como 192.168.1.50).
|
||||
|
||||
Paso 5. Comprobar la conexión
|
||||
El asistente mira si responden el FTP y BFpilot. Si alguno sale en rojo,
|
||||
pulsa "Cargar" a su lado y se envía solo. (Con Y2JB Autoloader eso no
|
||||
funciona: cárgalos desde Payload Manager en la PS5 y pulsa "Volver a
|
||||
comprobar".)
|
||||
|
||||
Paso 6. Envía algo
|
||||
Pega un enlace de descarga directa (o arrastra un archivo de tu PC a la
|
||||
ventana) y pulsa "Añadir a la cola". Cuando ponga "Listo", ya está en el
|
||||
menú de la PS5.
|
||||
|
||||
¿Algo no va?
|
||||
Ajustes > "Revisión completa" dice qué falla y cómo arreglarlo. Los dos
|
||||
puntos de arriba (FTP y BFpilot) en rojo: púlsalos para cargarlos. Puedes
|
||||
repetir el asistente en Ajustes > "Asistente de primeros pasos".
|
||||
|
||||
Aviso: PS5 Directo solo copia archivos. Úsalo con contenido que tengas
|
||||
derecho a usar (tus copias de seguridad y homebrew). Lo que hagas con él
|
||||
es responsabilidad tuya.
|
||||
|
||||
(Lo de abajo es la guía completa: no hace falta leerla para empezar.)
|
||||
|
||||
|
||||
Pega los enlaces (o arrastra archivos de tu PC) y la herramienta hace todo sola:
|
||||
|
||||
1. Descarga los archivos y los manda a la PS5 por FTP mientras bajan
|
||||
@@ -24,13 +72,20 @@ PESTAÑAS
|
||||
luego "Pegar aquí" en la carpeta de destino), borrar, bajar al PC
|
||||
(a Descargas\PS5 Directo), poner permisos 777 y subir archivos o
|
||||
carpetas tal cual a la carpeta en la que estás.
|
||||
Copiar, mover, borrar y calcular tamaños necesitan BFpilot; sin él, el
|
||||
explorador funciona en solo lectura por FTP.
|
||||
Clic derecho en un archivo o en el hueco para el menú; atajos: Supr,
|
||||
F2, Ctrl+C / Ctrl+X / Ctrl+V, Ctrl+A y Retroceso. "Mover a…" y "Copiar
|
||||
a…" abren un selector de carpetas con los destinos recientes. Si al pegar
|
||||
ya existe algo con el mismo nombre, eliges reemplazar/combinar, conservar
|
||||
ambos u omitir. "Extraer…" descomprime en la consola un .rar/.7z/.zip que
|
||||
ya esté allí. A la izquierda tienes las unidades (con su espacio libre) y
|
||||
accesos rápidos. Puedes arrastrar archivos del PC a la carpeta abierta.
|
||||
Sin BFpilot casi todo funciona por FTP (copiar pasa por el PC, más
|
||||
lento); descomprimir y ver el espacio libre sí necesitan BFpilot.
|
||||
- Espacio: gráfico de quesitos con lo que ocupa sitio en la consola, con
|
||||
el nombre de cada juego y su tamaño. Avisa de juegos repetidos (por
|
||||
el nombre de cada aplicación y su tamaño. Avisa de contenido repetido (por
|
||||
ejemplo la carpeta y su versión convertida a imagen), envíos a medias y
|
||||
restos, y permite borrarlos desde ahí (pide confirmación). Necesita
|
||||
BFpilot. Los juegos instalados desde la propia PS5 se ven pero se borran
|
||||
BFpilot. Lo instalado desde la propia PS5 se ve pero se borra
|
||||
desde la consola.
|
||||
- Actividad: historial de lo que se ha terminado o ha fallado.
|
||||
|
||||
@@ -168,9 +223,179 @@ de quien es la culpa cuando va lento. Tambien hay uno solo PC -> PS5 en
|
||||
Ajustes.
|
||||
|
||||
|
||||
BIBLIOTECA
|
||||
----------
|
||||
La pestaña Biblioteca enseña lo que hay en /data/homebrew (y en los USB) con su
|
||||
portada, nombre, Title ID, versión, si es carpeta o imagen (.ffpkg, .ffpfsc,
|
||||
.exfat) y qué firmware pide. Si pones el firmware de tu PS5 en Ajustes
|
||||
(por ejemplo 13.60), marca en rojo los que no arrancarán. También avisa de
|
||||
contenido repetido, de DLC/actualizaciones y de carpetas incompletas. Funciona
|
||||
solo con FTP; con BFpilot además ve cuánto ocupa cada carpeta.
|
||||
El firmware sale de param.json y, si trae backport (carpeta
|
||||
fakelib), de lo que piden sus ejecutables. Al terminar cada transferencia
|
||||
también se comprueba y te avisa si no va a arrancar.
|
||||
|
||||
|
||||
IMÁGENES Y LZ4 (PS5 DUMP FORGE)
|
||||
-------------------------------
|
||||
En "Cómo dejarlo en la PS5" la opción por defecto es «Sin convertir»: se deja
|
||||
tal como viene (un comprimido se descomprime; si ya es una imagen .ffpkg,
|
||||
.exfat o .ffpfsc, o viene en LZ4, se envía sin tocar). Además puedes elegir:
|
||||
- Carpeta normal: siempre acaba en carpeta; si es una imagen, un .fpkg o
|
||||
viene en LZ4, se deshace en el PC.
|
||||
- Imagen .ffpkg: la que recomienda ShadowMountPlus. Velocidad completa.
|
||||
- Imagen .exfat o .ffpfs: también las monta ShadowMountPlus.
|
||||
- Imagen comprimida .ffpfsc: ocupa un 30-60 % menos, pero la consola la lee
|
||||
más despacio (150-250 MB/s) y algunos títulos pueden dar tirones.
|
||||
- Paquete .fpkg: se instala como una app de la tienda. Solo firmware 11.60
|
||||
o inferior (kstuff, fpkg-enable y ppr-patch). Se deja en /data/pkg.
|
||||
Para .fpkg y .ffpfsc puedes elegir la compresión (rápida, equilibrada,
|
||||
mínimo tamaño o sin comprimir).
|
||||
- LZ4 (carpeta o dentro de una .ffpkg): solo títulos AMPR. Experimental: con
|
||||
algunos títulos se cuelga al guardar partida. Si no es AMPR, se
|
||||
manda como carpeta o como .ffpkg normal.
|
||||
Se prepara en el PC con PS5 Dump Forge (github.com/quer3q/ps5-dump-forge, se
|
||||
descarga solo la primera vez) y se envía un único archivo: va más rápido por
|
||||
FTP que miles de archivos pequeños y no tiene el problema de permisos. Hace
|
||||
falta sitio en el PC para la imagen. Las imágenes .ffpkg/.ffpfsc no son
|
||||
paquetes FPKG: no se instalan, ShadowMountPlus las monta (hasta 13.60 con
|
||||
ShadowMountPlus 1.7). Los DLC y actualizaciones se mandan como carpeta.
|
||||
|
||||
|
||||
ANTES DE ENVIAR
|
||||
---------------
|
||||
- Si ya está en la consola (mismo Title ID), la transferencia se
|
||||
para y te pregunta: enviar igualmente, reemplazar la copia que hay o
|
||||
cancelar. Se puede desactivar en Ajustes.
|
||||
- Si pegas el .sfv / .md5 / .sha1 junto con las partes (o están en la misma
|
||||
carpeta del PC), cada parte se comprueba mientras se envía. Si una llega
|
||||
dañada, se borra de la consola y se avisa antes de descomprimir.
|
||||
- Si falta sitio, el error trae un botón "Hacer sitio": en la pestaña Espacio
|
||||
te propone qué borrar (restos, copias repetidas, instaladores .pkg) hasta
|
||||
llegar a lo que necesitas. Nada se borra sin confirmar.
|
||||
|
||||
|
||||
PAYLOADS, DIAGNÓSTICO, MÓVIL Y PROGRAMAR
|
||||
----------------------------------------
|
||||
- Pulsa en los puntos FTP / BFpilot (o Ajustes > Cargar payloads) para
|
||||
mandar ftpsrv o BFpilot a la PS5 por el cargador de ELF (puerto 9021,
|
||||
etaHEN o elfldr). Se descargan de GitHub y se guardan. El cargador de
|
||||
Y2JB Autoloader solo acepta la propia consola: con él usa Payload Manager.
|
||||
- "¿Por qué va lento?" revisa si el PC va por Wi-Fi o cable, la banda y la
|
||||
señal, cables a 100 Mb/s, VPN, redes distintas y el ping a la PS5, y te
|
||||
dice qué cambiar.
|
||||
- El botón del móvil (arriba) enseña un código QR para abrir PS5 Directo
|
||||
desde el móvil en la misma red: pegar enlaces, ver la cola, pausar, ver
|
||||
tu biblioteca. Desde el móvil no se pueden instalar actualizaciones ni
|
||||
cambiar rutas de programas.
|
||||
- "Programar" (en la cola): empezar a una hora y suspender o apagar el PC
|
||||
al terminar (avisa y espera 1 minuto). Mientras hay envíos, el PC no se
|
||||
suspende solo.
|
||||
|
||||
|
||||
VERSIÓN PORTABLE
|
||||
----------------
|
||||
En cada versión hay dos descargas: PS5Directo-X.Y.Z.zip (necesita Python
|
||||
instalado) y PS5Directo-X.Y.Z-portable-windows.zip, que trae Python dentro:
|
||||
descomprimir y abrir, sin instalar nada.
|
||||
|
||||
|
||||
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.
|
||||
- Pestaña Biblioteca: lo que hay en la consola con portada, versión, formato y
|
||||
el firmware que pide; marca los que no arrancan en tu firmware, repetidos,
|
||||
DLC e incompletos.
|
||||
- Imágenes .ffpkg / .ffpfsc y LZ4 con PS5 Dump Forge (opcional): se preparan
|
||||
en el PC y se envía un solo archivo. Se eligen con tarjetas debajo del
|
||||
destino, con la explicación de cada uno y el espacio que hace falta en el PC;
|
||||
la primera vez avisa de que convertir ocupa sitio en el PC hasta terminar.
|
||||
Si lo descargado ya es una imagen, se envía tal cual o se convierte al
|
||||
formato elegido, y se coloca aunque BFpilot no esté cargado.
|
||||
- Nuevos formatos: carpeta normal, .exfat, .ffpfs y .fpkg (con compresión
|
||||
a elegir). Se aceptan carpetas, .zip/.7z/.rar, imágenes, .fpkg y LZ4, y
|
||||
sin 7-Zip el contenido se saca con PS5 Dump Forge.
|
||||
- Los formatos van agrupados (primero los que ocupan menos) y el botón
|
||||
«¿Cuál elijo?» compara ventajas e inconvenientes de cada uno.
|
||||
- Tiempo que queda (y hora aproximada) al enviar, descomprimir y convertir.
|
||||
- En el móvil, al terminar o fallar algo sale un aviso grande, vibra y pita
|
||||
(con la página abierta).
|
||||
- Biblioteca: marca como LZ4 las carpetas empaquetadas en LZ4 (y filtro LZ4).
|
||||
- Arreglado: al reanudar un envío preguntaba «Ya está en la consola» por lo
|
||||
que ese mismo envío había dejado a medias.
|
||||
- Arreglado: en algunos Chrome de Android la página del móvil salía en
|
||||
blanco.
|
||||
- Abrir en el móvil: la página va comprimida (carga antes por Wi-Fi) y la
|
||||
ventana muestra «Qué le llega del móvil» para saber si llega y si se corta.
|
||||
- Aviso de firmware: pon el de tu PS5 en Ajustes y te avisa de lo que no
|
||||
arrancará (tiene en cuenta el backport).
|
||||
- Si ya está en la consola, pregunta antes de enviarlo (enviar
|
||||
igualmente, reemplazar o cancelar).
|
||||
- Comprobación con .sfv / .md5 / .sha1 mientras se envía.
|
||||
- "Hacer sitio": propone qué borrar cuando falta espacio.
|
||||
- Cargar ftpsrv y BFpilot en la PS5 desde el programa (puerto 9021).
|
||||
- "¿Por qué va lento?": diagnóstico de la red del PC.
|
||||
- Abrir desde el móvil con un código QR.
|
||||
- Programar la cola, suspender o apagar al terminar, y el PC no se
|
||||
suspende mientras envía.
|
||||
- Versión portable con Python incluido.
|
||||
- Arreglado: solo con FTP (sin BFpilot), ftpsrv devolvía la raíz de la consola
|
||||
al listar una carpeta; afectaba al explorador y al envío de carpetas.
|
||||
- Abrir en el móvil: botón para dar permiso en el Firewall de Windows si la
|
||||
página se queda en blanco.
|
||||
|
||||
NOVEDADES 1.19.2
|
||||
- Arreglado "504 Option not supported" en Archivos de la consola cuando
|
||||
BFpilot no está cargado: el explorador ya lista las carpetas solo con
|
||||
ftpsrv (y con servidores FTP que no tienen MLSD).
|
||||
|
||||
NOVEDADES 1.19.1
|
||||
- Arreglado: la cola dejaba de actualizarse sola (desde la 1.18.3), así que
|
||||
"Quitar" parecía no hacer nada y luego decía "no existe".
|
||||
- El explorador vuelve a listar la carpeta abierta cuando termina una subida
|
||||
a esa carpeta.
|
||||
- Arreglado "Descargar al PC" con aplicaciones: ftpsrv descifraba al vuelo los
|
||||
eboot.bin/.prx/.sprx y la descarga salía incompleta. Ahora se transfieren
|
||||
tal cual están (también mejora comparar tamaños al reanudar carpetas).
|
||||
Gracias a RichyMX por encontrarlo y proponer el arreglo.
|
||||
|
||||
NOVEDADES 1.19
|
||||
- Explorador de archivos renovado: menú de clic derecho, atajos de teclado,
|
||||
ruta por tramos, unidades y accesos a la izquierda, "Mover a…" / "Copiar
|
||||
a…" con destinos recientes, aviso al pegar si ya existe (reemplazar,
|
||||
combinar, conservar ambos u omitir), "Extraer…" de comprimidos que ya
|
||||
están en la consola, y arrastrar archivos del PC a la carpeta abierta.
|
||||
- El explorador ya no necesita BFpilot para casi nada: renombrar, mover,
|
||||
borrar, crear carpetas, permisos, tamaños y copiar funcionan solo con FTP.
|
||||
- Campana de notificaciones arriba: transferencias terminadas o con error,
|
||||
operaciones de archivos, desconexiones de la consola y versiones nuevas.
|
||||
|
||||
NOVEDADES 1.18.4
|
||||
- Arreglado: si dejabas la ventana minimizada o en segundo plano un rato, el
|
||||
programa se cerraba solo y al volver salía "Failed to fetch". Ahora solo se
|
||||
cierra cuando cierras la ventana de verdad.
|
||||
|
||||
NOVEDADES 1.18.3
|
||||
- Arreglado "Failed to fetch" y la cola que aparecía y desaparecía: en Windows
|
||||
podían quedar dos PS5 Directo escuchando en el mismo puerto (por ejemplo al
|
||||
abrirlo dos veces seguidas). Ahora solo puede haber uno abierto.
|
||||
- Si la conexión con el programa falla un instante, se reintenta sola.
|
||||
|
||||
NOVEDADES 1.18.2
|
||||
- Crea automáticamente un acceso directo "PS5 Directo" en el escritorio (y en "Enviar a")
|
||||
con el icono del programa. Si lo borras no vuelve a aparecer; si apuntaba a
|
||||
una copia vieja del programa, se corrige.
|
||||
- La barra de tareas enseña el icono nuevo mientras el programa está abierto.
|
||||
- Si se había quedado abierta una versión antigua (por ejemplo una copia vieja
|
||||
en otra carpeta), al abrir esta se cierra la vieja sola en vez de enseñarla.
|
||||
|
||||
NOVEDADES 1.18.1
|
||||
- Al borrar algo grande se ve cuánto se ha liberado y el tiempo que lleva, y el
|
||||
espacio libre del explorador se actualiza mientras tanto.
|
||||
|
||||
NOVEDADES 1.18
|
||||
- Pestaña "Espacio": gráfico de quesitos y lista de todo lo que ocupa sitio en
|
||||
la consola, con el nombre de cada juego y su tamaño. Marca juegos repetidos
|
||||
la consola, con el nombre de cada aplicación y su tamaño. Marca contenido repetido
|
||||
(por ejemplo la carpeta y su versión convertida), envíos a medias y restos,
|
||||
y se pueden borrar desde ahí. También con discos USB/externos.
|
||||
- Descargas más rápidas: cada conexión se reutiliza para muchos trozos
|
||||
|
||||
+4
-2
@@ -9,13 +9,15 @@ For Each a In WScript.Arguments
|
||||
args = args & " """ & a & """"
|
||||
Next
|
||||
py = ""
|
||||
If sh.Run("cmd /c where pyw >nul 2>nul", 0, True) = 0 Then
|
||||
If fso.FileExists(dir & "\python\pythonw.exe") Then
|
||||
py = """" & dir & "\python\pythonw.exe"""
|
||||
ElseIf sh.Run("cmd /c where pyw >nul 2>nul", 0, True) = 0 Then
|
||||
py = "pyw -3"
|
||||
ElseIf sh.Run("cmd /c where pythonw >nul 2>nul", 0, True) = 0 Then
|
||||
py = "pythonw"
|
||||
End If
|
||||
If py = "" Then
|
||||
MsgBox "No encuentro Python. Instala Python 3 (marca 'Add to PATH') o usa 'Iniciar PS5 Directo.bat'.", 48, "PS5 Directo"
|
||||
MsgBox "No encuentro Python. Descarga la version portable (trae Python) o instala Python 3 (marca 'Add to PATH').", 48, "PS5 Directo"
|
||||
Else
|
||||
sh.Run py & " """ & dir & "\app.py""" & args, 0, False
|
||||
End If
|
||||
@@ -4,14 +4,19 @@
|
||||
|
||||
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.
|
||||
|
||||

|
||||
|
||||
<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
|
||||
- ✅ 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)
|
||||
- ✅ Pause, resume and retry where it left off, even after a dropped connection
|
||||
- ✅ Built-in console file browser: sizes, copy, move, rename, delete, download to PC, upload
|
||||
- ✅ Storage view: a pie chart of what fills the console, by game name and size, flagging duplicates and leftovers you can delete
|
||||
- ✅ Built-in console file browser (works over plain FTP, BFpilot optional): right-click menu, shortcuts, move/copy to…, extract archives on the console, drag & drop uploads, download to PC
|
||||
- ✅ Notification bell: finished or failed transfers, disconnections and new versions
|
||||
- ✅ Storage view: a pie chart of what fills the console, by app name and size, flagging duplicates and leftovers you can delete
|
||||
- ✅ Send whole PC folders over several connections, skipping what's already there and resuming what got cut off
|
||||
- ✅ Watches free space so the console never fills up
|
||||
- ✅ Speed limit and built-in speed test
|
||||
@@ -19,10 +24,18 @@ 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
|
||||
- ✅ 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
|
||||
- ✅ Loads ftpsrv and BFpilot on the PS5 from the app (ELF loader, port 9021)
|
||||
- ✅ "Why is it slow?" network diagnostics (Wi-Fi band and signal, 100 Mb/s cables, VPNs, ping)
|
||||
- ✅ Open it from your phone with a QR code; schedule the queue and sleep or shut down the PC when it's done
|
||||
|
||||
## Requirements
|
||||
|
||||
- **PC:** Windows 10/11 and [Python 3.9+](https://www.python.org/downloads/) (tick "Add python.exe to PATH"). For extracting on the PC, also install [7-Zip](https://www.7-zip.org/).
|
||||
- **PC:** Windows 10/11. Get the `-portable-windows.zip` (Python included, nothing to install), or the plain `.zip` with [Python 3.9+](https://www.python.org/downloads/) installed (tick "Add python.exe to PATH"). For extracting on the PC, also install [7-Zip](https://www.7-zip.org/).
|
||||
- **Jailbroken PS5:**
|
||||
- An FTP server, for example [ftpsrv](https://github.com/ps5-payload-dev/ftpsrv) on port 2121.
|
||||
- [BFpilot](https://github.com/ItsBlurf/BFpilot) on port 5905.
|
||||
@@ -31,7 +44,7 @@ A Windows file-transfer tool for jailbroken PS5 consoles. It sends files to the
|
||||
|
||||
## Getting started
|
||||
|
||||
1. Download the `.zip` from the latest [release](../../releases) and extract it anywhere.
|
||||
1. Download the `-portable-windows.zip` (or the plain `.zip` if you have Python) from the latest [release](../../releases) and extract it anywhere.
|
||||
2. Run `Crear accesos directos.bat` ("create shortcuts"). It adds a desktop icon and a "Send to → PS5 Directo" entry.
|
||||
3. Open **PS5 Directo** from the desktop. The language follows Windows; switch it with the **English / Español** button at the top.
|
||||
4. Follow the welcome guide, enter your PS5's IP in Settings, then paste links or drop files.
|
||||
@@ -40,18 +53,31 @@ A Windows file-transfer tool for jailbroken PS5 consoles. It sends files to the
|
||||
|
||||
The full guide is in [README_EN.txt](README_EN.txt) (Spanish: [LEEME.txt](LEEME.txt)).
|
||||
|
||||
## 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.
|
||||
|
||||
## Disclaimer
|
||||
|
||||
Independent project, not affiliated with Sony or with the authors of the tools mentioned. It's a file-transfer tool: it includes no third-party content, no Sony keys or files, and no links to download sites. Use it only with content you have the right to use (your own backups and homebrew).
|
||||
|
||||
- It does not jailbreak the console or bypass any protection: it only copies files to a console you have already modified yourself.
|
||||
- No piracy: don't use it to copy or run software you don't own or aren't licensed to use. Requests for help getting such content are not answered.
|
||||
- You are responsible for how you use it. Modifying a console can void its warranty, break its terms of service or lose data: back up what matters.
|
||||
- Provided "as is", without warranty of any kind. "PlayStation" and "PS5" are trademarks of Sony Interactive Entertainment, used only to describe compatibility.
|
||||
|
||||
---
|
||||
|
||||
## Español
|
||||
|
||||

|
||||
|
||||
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ú.
|
||||
|
||||
**Requisitos:** Windows 10/11, [Python 3.9+](https://www.python.org/downloads/) y, 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).
|
||||
**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.
|
||||
|
||||
**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).
|
||||
|
||||
**Uso:** descarga el `.zip` de la última [release](../../releases), ejecuta `Crear accesos directos.bat` y abre **PS5 Directo** desde el escritorio. La guía completa está en [LEEME.txt](LEEME.txt).
|
||||
|
||||
**Aviso:** proyecto independiente, sin relación con Sony ni con los autores de las herramientas citadas. No incluye contenido de terceros, claves ni archivos de Sony, ni enlaces a sitios de descargas. Úsalo solo con contenido que tengas derecho a usar (copias de seguridad propias y homebrew).
|
||||
**Aviso:** proyecto independiente, sin relación con Sony ni con los autores de las herramientas citadas. No incluye contenido de terceros, claves ni archivos de Sony, ni enlaces a sitios de descargas. Úsalo solo con contenido que tengas derecho a usar (copias de seguridad propias y homebrew). No hace el jailbreak ni salta ninguna protección: solo copia archivos a una consola que ya has modificado tú. No se da ayuda para conseguir contenido sin licencia. Se ofrece tal cual, sin garantías, y lo que hagas con él es responsabilidad tuya.
|
||||
+171
-7
@@ -1,5 +1,31 @@
|
||||
PS5 DIRECTO 1.18 — USER GUIDE (English)
|
||||
=======================================
|
||||
PS5 DIRECTO 1.20.0 — USER GUIDE (English)
|
||||
=========================================
|
||||
|
||||
QUICK START (5 MINUTES)
|
||||
=======================
|
||||
You need: a PS5 that is already jailbroken (PS5 Directo doesn't do that)
|
||||
and a Windows 10/11 PC on the same network.
|
||||
|
||||
1. Download PS5Directo-X.Y.Z-portable-windows.zip from the GitHub Releases
|
||||
page (nothing else to install) and extract it, e.g. into Documents.
|
||||
2. Double-click "PS5 Directo.vbs". If Windows asks whether to open a file
|
||||
downloaded from the internet, click "Open".
|
||||
3. On the PS5, load your jailbreak and ShadowMountPlus as usual.
|
||||
4. The wizard asks for the PS5's IP: on the PS5, Settings > Network >
|
||||
View Connection Status > "IPv4 Address".
|
||||
5. It checks the FTP server and BFpilot. If one is red, click "Load" next to
|
||||
it. (With Y2JB Autoloader that doesn't work: load them from Payload
|
||||
Manager on the PS5 and click "Check again".)
|
||||
6. Paste a direct download link (or drag a file onto the window) and click
|
||||
"Add to queue". When it says "Done", it's in the PS5's menu.
|
||||
|
||||
Something wrong? Settings > "Full check" tells you what and how to fix it.
|
||||
|
||||
Note: PS5 Directo only copies files. Use it with content you have the
|
||||
right to use (your own backups and homebrew).
|
||||
|
||||
(The full guide follows; you don't need it to get started.)
|
||||
|
||||
|
||||
Paste links (or drag files from your PC) and the tool does the rest:
|
||||
|
||||
@@ -23,13 +49,20 @@ TABS
|
||||
destination folder), delete, download to the PC (to Downloads\PS5
|
||||
Directo), set 777 permissions, and upload files or folders as-is into
|
||||
the current folder.
|
||||
Copy, move, delete and folder sizes need BFpilot; without it the
|
||||
browser is read-only over FTP.
|
||||
Right-click a file or the empty space for the menu; shortcuts: Del,
|
||||
F2, Ctrl+C / Ctrl+X / Ctrl+V, Ctrl+A and Backspace. "Move to…" and
|
||||
"Copy to…" open a folder picker with recent destinations. If something
|
||||
with the same name already exists when pasting, you choose replace/merge,
|
||||
keep both or skip. "Extract…" unpacks a .rar/.7z/.zip that is already on
|
||||
the console. Drives (with free space) and quick places are on the left.
|
||||
You can drag files from the PC onto the open folder.
|
||||
Without BFpilot almost everything works over FTP (copying goes through
|
||||
the PC, slower); extracting and showing free space do need BFpilot.
|
||||
- Space: a pie chart of what takes up space on the console, with each
|
||||
game's name and size. It flags repeated games (for example a folder and
|
||||
app's name and size. It flags duplicate content (for example a folder and
|
||||
its version converted to an image), half-sent transfers and leftovers,
|
||||
and lets you delete them from there (it asks first). Needs BFpilot.
|
||||
Games installed from the PS5 itself are shown but deleted on the console.
|
||||
Anything installed from the PS5 itself is shown but deleted on the console.
|
||||
- Activity: history of finished and failed transfers.
|
||||
|
||||
PC FOLDERS
|
||||
@@ -218,10 +251,141 @@ Images (.exfat, .ffpkg, .ffpfsc) go to /data/homebrew.
|
||||
Settings and queue are stored in %USERPROFILE%\.ps5directo
|
||||
|
||||
|
||||
LIBRARY
|
||||
-------
|
||||
The Library tab shows what's in /data/homebrew (and on USB drives) with its
|
||||
cover, name, Title ID, version, folder or image (.ffpkg, .ffpfsc, .exfat)
|
||||
and the firmware it needs. Set your PS5's firmware in Settings (e.g. 13.60)
|
||||
and the ones that won't launch are flagged in red. It also flags duplicates,
|
||||
DLC/updates and incomplete folders. Works with FTP alone; with BFpilot it
|
||||
also shows how much each folder takes. Firmware comes from param.json and,
|
||||
for backported titles (fakelib folder), from what the executables require.
|
||||
Every finished transfer is checked too.
|
||||
|
||||
IMAGES AND LZ4 (PS5 DUMP FORGE)
|
||||
-------------------------------
|
||||
"How to leave it on the PS5" defaults to "No conversion": left as it comes
|
||||
(archives are extracted; an .ffpkg, .exfat or .ffpfsc image or LZ4 content
|
||||
is sent untouched). You can also pick:
|
||||
- Plain folder: always ends up as a folder; images, .fpkg and LZ4 are
|
||||
unpacked on the PC.
|
||||
- .ffpkg image: recommended by ShadowMountPlus. Full speed.
|
||||
- .exfat or .ffpfs image: ShadowMountPlus mounts them too.
|
||||
- Compressed .ffpfsc image: 30-60% smaller, but read more slowly
|
||||
(150-250 MB/s); some titles may stutter.
|
||||
- .fpkg package: installs like a store app. Firmware 11.60 or lower only
|
||||
(kstuff, fpkg-enable and ppr-patch). Left in /data/pkg. For .fpkg and
|
||||
.ffpfsc you can pick the compression.
|
||||
- LZ4 (folder or inside an .ffpkg): AMPR titles only. Experimental: some
|
||||
titles crash when saving. Non-AMPR content is sent as a folder or plain
|
||||
.ffpkg.
|
||||
It's prepared on the PC with PS5 Dump Forge (github.com/quer3q/ps5-dump-forge,
|
||||
downloaded automatically the first time) and sent as a single file. Needs
|
||||
room on the PC for the image. .ffpkg/.ffpfsc images are not FPKG packages:
|
||||
they aren't installed, ShadowMountPlus mounts them. DLC and updates are
|
||||
sent as folders.
|
||||
|
||||
BEFORE SENDING
|
||||
--------------
|
||||
- If it's already on the console (same Title ID), the transfer
|
||||
stops and asks: send anyway, replace the copy there, or cancel.
|
||||
- Paste the .sfv / .md5 / .sha1 with the parts (or keep it next to them on
|
||||
the PC) and every part is checked while it's sent.
|
||||
- When there's no room, the error has a "Make room" button that suggests
|
||||
what to delete in the Space tab. Nothing is deleted without confirmation.
|
||||
|
||||
PAYLOADS, DIAGNOSTICS, PHONE AND SCHEDULE
|
||||
-----------------------------------------
|
||||
- Click the FTP / BFpilot dots (or Settings > Load payloads) to send ftpsrv
|
||||
or BFpilot to the PS5's ELF loader (port 9021, etaHEN or elfldr). The Y2JB
|
||||
Autoloader loader only accepts the console itself: use Payload Manager.
|
||||
- "Why is it slow?" checks Wi-Fi vs cable, band and signal, 100 Mb/s links,
|
||||
VPNs, different networks and the ping to the PS5.
|
||||
- The phone button shows a QR code to open PS5 Directo from your phone on
|
||||
the same network.
|
||||
- "Schedule" (queue): start at a set time and sleep or shut down the PC when
|
||||
done. The PC doesn't go to sleep while transfers are running.
|
||||
|
||||
PORTABLE VERSION
|
||||
----------------
|
||||
Each release has PS5Directo-X.Y.Z.zip (needs Python installed) and
|
||||
PS5Directo-X.Y.Z-portable-windows.zip, which includes Python: extract and run.
|
||||
|
||||
WHAT'S NEW
|
||||
----------
|
||||
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.
|
||||
- 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.
|
||||
- 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).
|
||||
- Library: LZ4-packed folders are tagged LZ4 (plus an LZ4 filter).
|
||||
- Fixed: resuming a transfer asked "Already on the console" about
|
||||
its own half-sent copy.
|
||||
- Fixed: the phone page was blank in some Android Chrome versions.
|
||||
- Open on phone: the page is sent compressed and the dialog shows
|
||||
"What arrives from the phone" to tell whether it gets there.
|
||||
- Firmware warning (set yours in Settings), backport-aware.
|
||||
- Asks before sending something that's already on the console.
|
||||
- .sfv / .md5 / .sha1 checks while sending.
|
||||
- "Make room": suggests what to delete when space runs out.
|
||||
- Load ftpsrv and BFpilot on the PS5 from the app (port 9021).
|
||||
- "Why is it slow?" network diagnostics.
|
||||
- Open from your phone with a QR code.
|
||||
- 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.
|
||||
- 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
|
||||
not loaded: the file browser now lists folders with ftpsrv alone
|
||||
(and with FTP servers that have no MLSD).
|
||||
1.19.1 - Fixed: the queue stopped updating by itself (since 1.18.3), so
|
||||
"Remove" seemed to do nothing and then said "no existe". The file
|
||||
browser now relists the open folder when an upload to it finishes.
|
||||
Fixed "Download to PC" for apps: ftpsrv decrypted eboot.bin/.prx/
|
||||
.sprx on the fly, so downloads came out incomplete. Files are now
|
||||
transferred exactly as stored (this also makes size comparisons
|
||||
when resuming folders correct). Thanks to RichyMX for finding it.
|
||||
1.19 - Renewed file browser: right-click menu, keyboard shortcuts,
|
||||
clickable path, drives and places on the left, "Move to…" / "Copy
|
||||
to…" with recent destinations, a choice when pasting over existing
|
||||
items (replace, merge, keep both or skip), "Extract…" for archives
|
||||
already on the console, and dragging files from the PC onto the
|
||||
open folder.
|
||||
- The file browser no longer needs BFpilot for most things: rename,
|
||||
move, delete, new folder, permissions, sizes and copy work over FTP.
|
||||
- Notification bell at the top: finished or failed transfers, file
|
||||
operations, console disconnections and new versions.
|
||||
1.18.4 - Fixed: leaving the window minimized or in the background for a while
|
||||
made the program close itself, showing "Failed to fetch" on return.
|
||||
Now it only closes when you actually close the window.
|
||||
1.18.3 - Fixed "Failed to fetch" and the queue appearing and disappearing: on
|
||||
Windows two PS5 Directo could end up listening on the same port (e.g.
|
||||
when opened twice in a row). Now only one can be open. Brief
|
||||
connection hiccups are retried automatically.
|
||||
1.18.2 - Creates a "PS5 Directo" shortcut on the desktop (and in "Send to")
|
||||
with the program's icon. If you delete it, it won't come back; if it
|
||||
pointed to an old copy, it's fixed. The taskbar shows the new icon.
|
||||
If an old version was still open (e.g. an old copy in another folder),
|
||||
it's closed automatically instead of being shown.
|
||||
1.18.1 - When deleting something big you see how much has been freed and how
|
||||
long it has taken, and the browser's free space updates meanwhile.
|
||||
1.18 - "Space" tab: a pie chart and list of everything that takes up space
|
||||
on the console, by game name and size. It flags repeated games (for
|
||||
on the console, by app name and size. It flags duplicate content (for
|
||||
example a folder and its converted version), half-sent transfers and
|
||||
leftovers, and deletes them from there. USB/external drives too.
|
||||
- Faster downloads: each connection is reused for many chunks in a row,
|
||||
|
||||
Binary file not shown.
@@ -44,11 +44,24 @@ async function handle(item) {
|
||||
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 })
|
||||
body: JSON.stringify({ url, original: item.url, name, cookies,
|
||||
ua: navigator.userAgent, referrer: item.referrer || "" })
|
||||
});
|
||||
if (!r.ok) return;
|
||||
} catch (e) { return; }
|
||||
|
||||
BIN
Binary file not shown.
|
After Width: | Height: | Size: 266 KiB |
BIN
Binary file not shown.
|
After Width: | Height: | Size: 275 KiB |
@@ -762,6 +762,110 @@ def make_source(text):
|
||||
return FileSource(text)
|
||||
|
||||
|
||||
_MONTHS = {m: i for i, m in enumerate(("jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep",
|
||||
"oct", "nov", "dec"), 1)}
|
||||
|
||||
|
||||
def _list_mode(perm):
|
||||
"""'drwxr-xr-x' -> 0o755 (None si no se entiende)."""
|
||||
if len(perm) < 10:
|
||||
return None
|
||||
m = 0
|
||||
for i, ch in enumerate(perm[1:10]):
|
||||
if ch not in "-":
|
||||
m |= 1 << (8 - i)
|
||||
return m
|
||||
|
||||
|
||||
def _list_mtime(mon, day, yt):
|
||||
import time as _t
|
||||
try:
|
||||
mo = _MONTHS[mon[:3].lower()]
|
||||
d = int(day)
|
||||
if ":" in yt:
|
||||
hh, mm = (int(x) for x in yt.split(":"))
|
||||
now = _t.localtime()
|
||||
y = now.tm_year if (mo, d) <= (now.tm_mon, now.tm_mday) else now.tm_year - 1
|
||||
else:
|
||||
y, hh, mm = int(yt), 0, 0
|
||||
return int(_t.mktime((y, mo, d, hh, mm, 0, 0, 0, -1)))
|
||||
except Exception:
|
||||
return None
|
||||
|
||||
|
||||
def ftp_listdir(f, path):
|
||||
"""[(nombre, {"type": "file"|"dir", "size": int, "mtime": int|None, "mode": int|None})].
|
||||
Usa MLSD tal cual (sin OPTS MLST: ftpsrv responde "504 Option not supported") y, si el
|
||||
servidor no tiene MLSD, LIST. Lanza ftplib.error_perm 550 si la carpeta no existe."""
|
||||
import time as _t
|
||||
out = []
|
||||
# Primero se entra en la carpeta y se lista "lo de aqui": ftpsrv no hace caso a la ruta de
|
||||
# MLSD/LIST y devolvia la carpeta actual (la raiz de la PS5). Si no existe, CWD da 550.
|
||||
f.cwd(path)
|
||||
try:
|
||||
lines = []
|
||||
f.retrlines("MLSD", lines.append)
|
||||
for ln in lines:
|
||||
facts_s, _, name = ln.partition(" ")
|
||||
if not name or name in (".", ".."):
|
||||
continue
|
||||
facts = {}
|
||||
for kv in facts_s.split(";"):
|
||||
k, _, v = kv.partition("=")
|
||||
if k:
|
||||
facts[k.lower()] = v
|
||||
t = facts.get("type", "").lower()
|
||||
if t not in ("file", "dir"):
|
||||
continue
|
||||
mt = facts.get("modify")
|
||||
try:
|
||||
mt = int(_t.mktime(_t.strptime(mt[:14], "%Y%m%d%H%M%S"))) if mt else None
|
||||
except Exception:
|
||||
mt = None
|
||||
mode = facts.get("unix.mode")
|
||||
try:
|
||||
mode = int(mode, 8) if mode else None
|
||||
except ValueError:
|
||||
mode = None
|
||||
try:
|
||||
size = int(facts.get("size") or 0)
|
||||
except ValueError:
|
||||
size = 0
|
||||
out.append((name, {"type": t, "size": size, "mtime": mt, "mode": mode}))
|
||||
return out
|
||||
except ftplib.error_perm as e:
|
||||
if str(e).startswith("550"):
|
||||
raise
|
||||
finally:
|
||||
try:
|
||||
f.voidcmd("TYPE I")
|
||||
except Exception:
|
||||
pass
|
||||
# servidor sin MLSD: LIST al estilo "ls -l"
|
||||
lines = []
|
||||
try:
|
||||
f.retrlines("LIST", lines.append)
|
||||
finally:
|
||||
try:
|
||||
f.voidcmd("TYPE I")
|
||||
except Exception:
|
||||
pass
|
||||
for ln in lines:
|
||||
parts = ln.split(None, 8)
|
||||
if len(parts) < 9 or parts[8] in (".", ".."):
|
||||
continue
|
||||
kind = "dir" if ln.startswith("d") else ("file" if ln.startswith("-") else None)
|
||||
if not kind:
|
||||
continue
|
||||
try:
|
||||
size = int(parts[4])
|
||||
except ValueError:
|
||||
size = 0
|
||||
out.append((parts[8], {"type": kind, "size": size, "mtime": _list_mtime(parts[5], parts[6], parts[7]),
|
||||
"mode": _list_mode(parts[0])}))
|
||||
return out
|
||||
|
||||
|
||||
def ftp_sizes(f, path):
|
||||
"""{nombre: tamano} de los archivos de una carpeta remota (None si no existe)."""
|
||||
try:
|
||||
@@ -774,31 +878,11 @@ def ftp_sizes(f, path):
|
||||
|
||||
|
||||
def _ftp_sizes(f, path):
|
||||
out = {}
|
||||
try:
|
||||
for name, facts in f.mlsd(path, facts=["type", "size"]):
|
||||
if facts.get("type") == "file":
|
||||
out[name] = int(facts.get("size") or 0)
|
||||
return out
|
||||
except ftplib.error_perm as e:
|
||||
if str(e).startswith("550"):
|
||||
return None
|
||||
except Exception:
|
||||
pass
|
||||
# servidor sin MLSD: LIST y leer el tamano de cada linea
|
||||
lines = []
|
||||
try:
|
||||
f.retrlines("LIST " + path, lines.append)
|
||||
ents = ftp_listdir(f, path)
|
||||
except ftplib.error_perm:
|
||||
return None
|
||||
for ln in lines:
|
||||
parts = ln.split(None, 8)
|
||||
if len(parts) == 9 and not ln.startswith("d"):
|
||||
try:
|
||||
out[parts[8]] = int(parts[4])
|
||||
except ValueError:
|
||||
pass
|
||||
return out
|
||||
return {n: x["size"] for n, x in ents if x["type"] == "file"}
|
||||
|
||||
|
||||
def upload_tree(cfg, src, remote_root, cancel, log, progress, workers=None, on_plan=None):
|
||||
@@ -967,6 +1051,21 @@ def clean_host(text):
|
||||
return t.strip(".").strip("[]"), port
|
||||
|
||||
|
||||
def raw_mode(f):
|
||||
"""ftpsrv (ps5-payload-dev) descifra al vuelo los SELF (eboot.bin, .prx, .sprx): al bajarlos
|
||||
llega el ELF de dentro, con otro tamano, y los listados tambien dan ese tamano. Su comando
|
||||
SELF lo activa/desactiva en cada conexion: lo dejamos apagado para ver los archivos tal
|
||||
cual estan. Los servidores que no lo conocen responden con error y no pasa nada.
|
||||
(Gracias a RichyMX por encontrarlo.)"""
|
||||
try:
|
||||
r = f.sendcmd("SELF")
|
||||
if "enabled" in r.lower():
|
||||
r = f.sendcmd("SELF")
|
||||
return "disabled" in r.lower()
|
||||
except ftplib.all_errors:
|
||||
return False
|
||||
|
||||
|
||||
class Ftp:
|
||||
def __init__(self, cfg):
|
||||
self.host = clean_host(cfg["ps5_ip"])[0]
|
||||
@@ -987,6 +1086,7 @@ class Ftp:
|
||||
f.login(self.user, self.pw)
|
||||
f.set_pasv(True)
|
||||
f.voidcmd("TYPE I")
|
||||
raw_mode(f)
|
||||
try:
|
||||
f.sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)
|
||||
except Exception:
|
||||
@@ -1257,11 +1357,16 @@ class BFpilot:
|
||||
except Exception:
|
||||
return ""
|
||||
|
||||
def wait_job(self, cancel, timeout=3600):
|
||||
def wait_job(self, cancel, timeout=3600, on_tick=None):
|
||||
t0 = time.time()
|
||||
while time.time() - t0 < timeout:
|
||||
if cancel is not None and cancel.is_set():
|
||||
raise Cancelled()
|
||||
if on_tick is not None:
|
||||
try:
|
||||
on_tick()
|
||||
except Exception:
|
||||
pass
|
||||
j = self._req("GET", "/api/fs/job/status")
|
||||
if not j.get("busy"):
|
||||
if j.get("error"):
|
||||
@@ -1270,7 +1375,7 @@ class BFpilot:
|
||||
time.sleep(1)
|
||||
raise PipeError("BFpilot tarda demasiado")
|
||||
|
||||
def delete(self, path, cancel=None):
|
||||
def delete(self, path, cancel=None, on_tick=None):
|
||||
for _ in range(60):
|
||||
try:
|
||||
self._req("POST", "/api/fs/delete", form={"path": path, "recursive": "1"})
|
||||
@@ -1282,7 +1387,7 @@ class BFpilot:
|
||||
if "No such file" in str(e) or "not found" in str(e).lower():
|
||||
return
|
||||
raise
|
||||
self.wait_job(cancel)
|
||||
self.wait_job(cancel, timeout=4 * 3600, on_tick=on_tick)
|
||||
|
||||
def du(self, path, timeout=20):
|
||||
"""Tamano total de una carpeta (o archivo), o None."""
|
||||
|
||||
+1252
File diff suppressed because it is too large.
Load diff
Binary file not shown.
|
After Width: | Height: | Size: 21 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 30 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 98 KiB |
+1518
-130
File diff suppressed because it is too large.
Load diff
+29
-8
@@ -1,11 +1,32 @@
|
||||
{
|
||||
"manifest_version": 3,
|
||||
"name": "PS5 Directo - Capturar enlaces",
|
||||
"version": "1.0.0",
|
||||
"description": "Cuando descargas un .rar/.7z/.zip/.pkg, manda el enlace a PS5 Directo en vez de bajarlo al PC.",
|
||||
"permissions": ["downloads", "storage", "notifications"],
|
||||
"host_permissions": ["http://127.0.0.1/*"],
|
||||
"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" }
|
||||
}
|
||||
"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"
|
||||
}
|
||||
}
|
||||
+48
@@ -0,0 +1,48 @@
|
||||
# Publica una version: al subir una etiqueta vX.Y.Z crea la release de GitHub con dos .zip:
|
||||
# - PS5Directo-X.Y.Z.zip la app (la que usa "Actualizar" dentro del programa)
|
||||
# - PS5Directo-X.Y.Z-portable-windows.zip la app + Python incluido: descomprimir y abrir, sin instalar nada
|
||||
name: Publicar version
|
||||
|
||||
on:
|
||||
push:
|
||||
tags: ["v*"]
|
||||
workflow_dispatch:
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Version de app.py
|
||||
id: v
|
||||
run: echo "ver=$(grep -oP 'VERSION = "\K[^"]+' app.py)" >> "$GITHUB_OUTPUT"
|
||||
|
||||
- name: La etiqueta tiene que coincidir con la version
|
||||
if: startsWith(github.ref, 'refs/tags/')
|
||||
run: test "${GITHUB_REF_NAME#v}" = "${{ steps.v.outputs.ver }}"
|
||||
|
||||
- name: Paquete normal
|
||||
run: |
|
||||
mkdir -p dist/PS5Directo
|
||||
git archive HEAD | tar -x -C dist/PS5Directo
|
||||
rm -rf dist/PS5Directo/.github
|
||||
(cd dist && zip -qr "PS5Directo-${{ steps.v.outputs.ver }}.zip" PS5Directo)
|
||||
|
||||
- name: Paquete portable (con Python para Windows)
|
||||
run: |
|
||||
PY=3.12.10
|
||||
curl -fsSL -o py.zip "https://www.python.org/ftp/python/$PY/python-$PY-embed-amd64.zip"
|
||||
mkdir -p dist/PS5Directo/python
|
||||
unzip -q py.zip -d dist/PS5Directo/python
|
||||
# que el Python incluido vea la carpeta del programa
|
||||
for f in dist/PS5Directo/python/python*._pth; do printf '..\n' >> "$f"; done
|
||||
(cd dist && zip -qr "PS5Directo-${{ steps.v.outputs.ver }}-portable-windows.zip" PS5Directo)
|
||||
|
||||
- uses: softprops/action-gh-release@v2
|
||||
if: startsWith(github.ref, 'refs/tags/')
|
||||
with:
|
||||
files: dist/*.zip
|
||||
+3
-2
@@ -404,7 +404,7 @@ tr:hover .rowact{opacity:1}
|
||||
<div class="toast" id="toast"></div>
|
||||
<script>
|
||||
const I18N_EXACT={"Novedades": "What's new", "Entendido": "Got it", "Se ha actualizado. Esto es lo nuevo:": "PS5 Directo has been updated. Here is what's new:", "Transferencias es la cola. En Archivos de la consola navegas por la PS5: ves tamaños, copias, mueves, renombras, borras, bajas al PC o subes archivos y carpetas. Espacio te enseña en un gráfico qué ocupa más y qué puedes borrar. Actividad guarda el historial.": "Transfers is the queue. In Console files you browse the PS5: see sizes, copy, move, rename, delete, download to the PC or upload files and folders. Space shows in a chart what takes up the most room and what you can delete. Activity keeps the history.", "Espacio": "Space", "Almacenamiento interno": "Internal storage", "Analizar": "Analyze", "Mira qué ocupa sitio en la consola, con nombres y tamaños, para decidir qué borrar. Avisa de juegos repetidos (por ejemplo la carpeta y su versión convertida), envíos a medias y restos. Necesita BFpilot.": "See what takes up space on the console, with names and sizes, to decide what to delete. It flags repeated games (for example a folder and its converted version), half-sent transfers and leftovers. Needs BFpilot.", "Todo lo que ocupa sitio": "Everything that takes up space", "Borrar seleccionados": "Delete selected", "Disco externo": "External drive", "Libre": "Free", "Abrir": "Open", "Borrando…": "Deleting…", "¿Borrar de la consola? No se puede deshacer.": "Delete from the console? This cannot be undone.", "Juegos instalados desde la PS5": "Games installed from the PS5", "Sistema y otros datos de la consola": "System and other console data", "Otros": "Other", "Borrado. Vuelvo a medir el espacio…": "Deleted. Measuring the space again…", "Envía archivos a tu consola por la red local, sin pasar por el disco del PC": "Send files to your console over your local network, without going through your PC's disk", "Guía": "Guide", "Guía rápida: para qué es cada cosa": "Quick guide: what each part does", "Extensión": "Extension", "Capturar enlaces desde el navegador sin copiar y pegar": "Capture links from your browser without copy and paste", "Actualizar": "Update", "Buscar o instalar una versión nueva": "Check for or install a new version", "Ajustes": "Settings", "Salir": "Quit", "Cierra PS5 Directo del todo": "Closes PS5 Directo completely", "Nueva transferencia": "New transfer", "Enlaces directos (uno por línea). Pega todas las partes juntas: .part1.rar, .part2.rar… o .001, .002…": "Direct links (one per line). Paste all parts together: .part1.rar, .part2.rar… or .001, .002…", "https://servidor/archivo.part1.rar": "https://server/file.part1.rar", "https://servidor/archivo.part2.rar": "https://server/file.part2.rar", "También vale la ruta de un archivo de tu PC, por ejemplo: D:\\Descargas\\archivo.rar": "A file path on your PC also works, for example: D:\\Downloads\\file.rar", "Archivos de tu PC: suéltalos en esta página y los busco en tu PC, o arrástralos sobre el": "Files on your PC: drop them on this page and I'll find them on your PC, or drag them onto the", "icono de PS5 Directo": "PS5 Directo icon", ", o clic derecho →": ", or right-click →", "Enviar a → PS5 Directo": "Send to → PS5 Directo", "Contraseña del comprimido (si la tiene)": "Archive password (if any)", "Opcional. Si la dejas vacía prueba las de Ajustes y las del nombre": "Optional. If empty, it tries the ones in Settings and the one in the file name", "Destino en la PS5": "Destination on the PS5", "Dónde descomprimir": "Where to extract", "En la PS5 (BFpilot)": "On the PS5 (BFpilot)", "En el PC (7-Zip)": "On the PC (7-Zip)", "Añadir a la cola": "Add to queue", "Si pegas enlaces de varios archivos distintos, los separa solo. «En el PC» usa 7-Zip y manda el contenido ya descomprimido y comprobado (más datos por el Wi-Fi, pero sin BFpilot).": "If you paste links to several different files, it splits them automatically. \"On the PC\" uses 7-Zip and sends the content already extracted and verified (more data over Wi-Fi, but no BFpilot needed).", "Cola": "Queue", "Quitar terminados": "Clear finished", "No hay nada en la cola. Pega enlaces arriba.": "The queue is empty. Paste links above.", "Transferencia": "Transfer", "Pausar": "Pause", "Reanudar": "Resume", "Cancelar": "Cancel", "Reintentar": "Retry", "Quitar": "Remove", "Test de velocidad": "Speed test", "Mide descarga, envío y las dos cosas a la vez": "Measures download, upload and both at once", "Bajar al PC": "Download to PC", "Descomprimir y enviar": "Extract and send", "Colocar": "Place", "Listo": "Done", "Enviar": "Send", "Descomprimir": "Extract", "Enviado": "Sent", "de": "of", "Velocidad a la PS5": "Speed to PS5", "Quedan": "Remaining", "Descompresión en la PS5": "Extraction on the PS5", "Archivos y registro": "Files and log", "Copiar registro": "Copy log", "Registro copiado. Pégalo donde quieras (Ctrl+V).": "Log copied. Paste it anywhere (Ctrl+V).", "Registro copiado.": "Log copiLine truncated
|
||||
const I18N_RX=[["^Este ZIP usa cifrado AES y BFpilot todavia no sabe abrirlo \\(solo el cifrado ZIP clasico\\)\\. Los archivos ya estan en la PS5, en ([\\s\\S]*?)\\. Puedes bajarlos al PC, extraerlos con 7-Zip y subir la carpeta\\.$", "This ZIP uses AES encryption and BFpilot can't open it yet (only classic ZIP encryption). The files are already on the PS5, in {0}. You can download them to the PC, extract them with 7-Zip and upload the folder."], ["^Aviso: lo descomprimido puede ocupar hasta ~5 veces el RAR \\(~([\\s\\S]*?)\\) y quedan ([\\s\\S]*?) libres\\. Puede bastar, pero si el espacio baja del margen lo paro\\. Si puedes, libera espacio\\.$", "Warning: extracted content can take up to ~5 times the RAR (~{0}) and {1} is free. It may be enough, but if space drops below the margin I stop. Free up space if you can."], ["^Ojo: el contenido descomprimido puede ocupar hasta ~5 veces el RAR \\(~([\\s\\S]*?)\\) y no se si cabra\\. Si al descomprimir baja del margen, lo paro y los RAR se quedan en la PS5\\.$", "Heads up: extracted content can take up to ~5 times the RAR (~{0}) and it may not fit. If space drops below the margin while extracting, I stop and the RARs stay on the PS5."], ["^AVISO: no pude poner los permisos de ([\\s\\S]*?) \\(([\\s\\S]*?)\\)\\. Si no arranca, en FileZilla: clic derecho en la carpeta > Permisos > 777 > recurrir a subdirectorios\\.$", "WARNING: couldn't set permissions on {0} ({1}). If it doesn't launch, in FileZilla: right-click the folder > File permissions > 777 > recurse into subdirectories."], ["^No cabe en el PC: hay que bajar ([\\s\\S]*?) a ([\\s\\S]*?) y solo hay ([\\s\\S]*?) libres\\. Libera espacio, cambia la carpeta temporal en Ajustes o descomprime en la PS5\\.$", "Not enough space on the PC: {0} must be downloaded to {1} and only {2} is free. Free up space, change the temporary folder in Settings, or extract on the PS5."], ["^No cabe en la PS5: descomprimido ocupa ([\\s\\S]*?), faltan por mandar ([\\s\\S]*?), hay ([\\s\\S]*?) libres y dejo ([\\s\\S]*?) de margen\\. Libera espacio y pulsa Reintentar\\.$", "Not enough space on the PS5: extracted it takes {0}, {1} left to send, {2} free and I keep {3} as margin. Free up space and click Retry."], ["^No hay sitio en la PS5: faltan por enviar ([\\s\\S]*?), hay ([\\s\\S]*?) libres y dejo ([\\s\\S]*?) de margen \\(Ajustes\\)\\. Libera espacio y pulsa Reintentar\\.$", "Not enough space on the PS5: {0} left to send, {1} free and I keep {2} as margin (Settings). Free up space and click Retry."], ["^La IP de la PS5 no es valida \\(([\\s\\S]*?)\\): en Ajustes escribe solo los numeros, por ejemplo 192\\.168\\.1\\.50, sin ftp:\\/\\/ ni puerto$", "The PS5 IP is not valid ({0}): in Settings type just the numbers, for example 192.168.1.50, without ftp:// or a port"], ["^Parado para no llenar la PS5 \\(([\\s\\S]*?)\\): quedan ([\\s\\S]*?) libres y el margen es ([\\s\\S]*?)\\. Libera espacio y pulsa Reintentar; sigue donde iba\\.$", "Stopped so the PS5 doesn't fill up ({0}): {1} free and the margin is {2}. Free up space and click Retry; it continues where it left off."], ["^BFpilot no abre ZIP partidos \\(\\.z01, \\.z02\\.\\.\\.\\)\\. Uno los RAR\\/7z partidos, pero este formato no\\. Los archivos estan en ([\\s\\S]*?)\\.$", "BFpilot can't open split ZIPs (.z01, .z02...). I can join split RAR/7z, but not this format. The files are in {0}."], ["^No cabe en la PS5: faltan ([\\s\\S]*?) por enviar, hay ([\\s\\S]*?) libres y el margen es ([\\s\\S]*?)\\. Libera espacio y pulsa Reintentar\\.$", "It doesn't fit on the PS5: {0} left to send, {1} free and the margin is {2}. Free up space and click Retry."], ["^Ojo: ya tienes ([\\s\\S]*?) en ([\\s\\S]*?)\\. Dos copias con el mismo Title ID pueden liar a ShadowMountPlus \\(deja solo una\\)\\.([\\s\\S]*?)$", "Heads up: you already have {0} in {1}. Two copies with the same Title ID can confuse ShadowMountPlus (keep only one).{2}"], ["^Ojo: ya tienes ([\\s\\S]*?) en ([\\s\\S]*?)\\. Dos copias con el mismo Title ID pueden liar a ShadowMountPlus \\(deja solo una\\)\\.$", "Heads up: you already have {0} in {1}. Two copies with the same Title ID can confuse ShadowMountPlus (keep only one)."], ["^El comprimido tiene enlaces \\(([\\s\\S]*?)\\); eso solo lo sabe extraer BFpilot\\. Descomprimelo en la PS5\\.$", "The archive contains links ({0}); only BFpilot can extract those. Extract it on the PS5."], ["^No hay sitio en la PS5: quedan ([\\s\\S]*?) libres y el margen es ([\\s\\S]*?)\\. Libera espacio y pulsa Reintentar\\.$", "Not enough space on the PS5: {0} free and the margin is {1}. Free up space and click Retry."], ["^Ya existe ([\\s\\S]*?)\\. No lo piso: borralo o renombralo y pulsa Reintentar\\. Lo extraido esta en ([\\s\\S]*?)$", "{0} already exists. I won't overwrite it: delete or rename it and click Retry. What was extracted is in {1}"], ["^Recibido de la extensión: ([\\s\\S]*?)\\. Cuando estén todas las partes, pulsa \"Añadir a la cola\"\\.$", "Received from the extension: {0}. When all parts are iLine truncated
|
||||
const I18N_RX=[["^Este ZIP usa cifrado AES y BFpilot todavia no sabe abrirlo \\(solo el cifrado ZIP clasico\\)\\. Los archivos ya estan en la PS5, en ([\\s\\S]*?)\\. Puedes bajarlos al PC, extraerlos con 7-Zip y subir la carpeta\\.$", "This ZIP uses AES encryption and BFpilot can't open it yet (only classic ZIP encryption). The files are already on the PS5, in {0}. You can download them to the PC, extract them with 7-Zip and upload the folder."], ["^Aviso: lo descomprimido puede ocupar hasta ~5 veces el RAR \\(~([\\s\\S]*?)\\) y quedan ([\\s\\S]*?) libres\\. Puede bastar, pero si el espacio baja del margen lo paro\\. Si puedes, libera espacio\\.$", "Warning: extracted content can take up to ~5 times the RAR (~{0}) and {1} is free. It may be enough, but if space drops below the margin I stop. Free up space if you can."], ["^Ojo: el contenido descomprimido puede ocupar hasta ~5 veces el RAR \\(~([\\s\\S]*?)\\) y no se si cabra\\. Si al descomprimir baja del margen, lo paro y los RAR se quedan en la PS5\\.$", "Heads up: extracted content can take up to ~5 times the RAR (~{0}) and it may not fit. If space drops below the margin while extracting, I stop and the RARs stay on the PS5."], ["^AVISO: no pude poner los permisos de ([\\s\\S]*?) \\(([\\s\\S]*?)\\)\\. Si no arranca, en FileZilla: clic derecho en la carpeta > Permisos > 777 > recurrir a subdirectorios\\.$", "WARNING: couldn't set permissions on {0} ({1}). If it doesn't launch, in FileZilla: right-click the folder > File permissions > 777 > recurse into subdirectories."], ["^No cabe en el PC: hay que bajar ([\\s\\S]*?) a ([\\s\\S]*?) y solo hay ([\\s\\S]*?) libres\\. Libera espacio, cambia la carpeta temporal en Ajustes o descomprime en la PS5\\.$", "Not enough space on the PC: {0} must be downloaded to {1} and only {2} is free. Free up space, change the temporary folder in Settings, or extract on the PS5."], ["^No cabe en la PS5: descomprimido ocupa ([\\s\\S]*?), faltan por mandar ([\\s\\S]*?), hay ([\\s\\S]*?) libres y dejo ([\\s\\S]*?) de margen\\. Libera espacio y pulsa Reintentar\\.$", "Not enough space on the PS5: extracted it takes {0}, {1} left to send, {2} free and I keep {3} as margin. Free up space and click Retry."], ["^No hay sitio en la PS5: faltan por enviar ([\\s\\S]*?), hay ([\\s\\S]*?) libres y dejo ([\\s\\S]*?) de margen \\(Ajustes\\)\\. Libera espacio y pulsa Reintentar\\.$", "Not enough space on the PS5: {0} left to send, {1} free and I keep {2} as margin (Settings). Free up space and click Retry."], ["^La IP de la PS5 no es valida \\(([\\s\\S]*?)\\): en Ajustes escribe solo los numeros, por ejemplo 192\\.168\\.1\\.50, sin ftp:\\/\\/ ni puerto$", "The PS5 IP is not valid ({0}): in Settings type just the numbers, for example 192.168.1.50, without ftp:// or a port"], ["^Parado para no llenar la PS5 \\(([\\s\\S]*?)\\): quedan ([\\s\\S]*?) libres y el margen es ([\\s\\S]*?)\\. Libera espacio y pulsa Reintentar; sigue donde iba\\.$", "Stopped so the PS5 doesn't fill up ({0}): {1} free and the margin is {2}. Free up space and click Retry; it continues where it left off."], ["^BFpilot no abre ZIP partidos \\(\\.z01, \\.z02\\.\\.\\.\\)\\. Uno los RAR\\/7z partidos, pero este formato no\\. Los archivos estan en ([\\s\\S]*?)\\.$", "BFpilot can't open split ZIPs (.z01, .z02...). I can join split RAR/7z, but not this format. The files are in {0}."], ["^No cabe en la PS5: faltan ([\\s\\S]*?) por enviar, hay ([\\s\\S]*?) libres y el margen es ([\\s\\S]*?)\\. Libera espacio y pulsa Reintentar\\.$", "It doesn't fit on the PS5: {0} left to send, {1} free and the margin is {2}. Free up space and click Retry."], ["^Ojo: ya tienes ([\\s\\S]*?) en ([\\s\\S]*?)\\. Dos copias con el mismo Title ID pueden liar a ShadowMountPlus \\(deja solo una\\)\\.([\\s\\S]*?)$", "Heads up: you already have {0} in {1}. Two copies with the same Title ID can confuse ShadowMountPlus (keep only one).{2}"], ["^Ojo: ya tienes ([\\s\\S]*?) en ([\\s\\S]*?)\\. Dos copias con el mismo Title ID pueden liar a ShadowMountPlus \\(deja solo una\\)\\.$", "Heads up: you already have {0} in {1}. Two copies with the same Title ID can confuse ShadowMountPlus (keep only one)."], ["^El comprimido tiene enlaces \\(([\\s\\S]*?)\\); eso solo lo sabe extraer BFpilot\\. Descomprimelo en la PS5\\.$", "The archive contains links ({0}); only BFpilot can extract those. Extract it on the PS5."], ["^No hay sitio en la PS5: quedan ([\\s\\S]*?) libres y el margen es ([\\s\\S]*?)\\. Libera espacio y pulsa Reintentar\\.$", "Not enough space on the PS5: {0} free and the margin is {1}. Free up space and click Retry."], ["^Ya existe ([\\s\\S]*?)\\. No lo piso: borralo o renombralo y pulsa Reintentar\\. Lo extraido esta en ([\\s\\S]*?)$", "{0} already exists. I won't overwrite it: delete or rename it and click Retry. What was extracted is in {1}"], ["^Recibido de la extensión: ([\\s\\S]*?)\\. Cuando estén todas las partes, pulsa \"Añadir a la cola\"\\.$", "Received from the extension: {0}. When all parts are iLine truncated
|
||||
// --- idioma: español (original) o inglés. Traduce el texto de la página y los mensajes del programa.
|
||||
const LANG=(()=>{try{const v=localStorage.getItem('ps5d_lang');if(v==='es'||v==='en')return v}catch(e){}
|
||||
return (navigator.language||'es').toLowerCase().startsWith('es')?'es':'en'})();
|
||||
@@ -1143,6 +1143,7 @@ async function fmOpStart(url,body){
|
||||
fm.busy=true; fmButtons(); fmWatch(); return true;
|
||||
}
|
||||
function fmWatch(){clearInterval(fmPoll); fmPoll=setInterval(fmPollOp,900); fmPollOp()}
|
||||
function fmtSecs(n){n=Math.max(0,Math.round(n));const m=Math.floor(n/60);return m?m+' min '+(n%60)+' s':n+' s'}
|
||||
async function fmPollOp(){
|
||||
let r; try{r=await api('/api/fm/op',{})}catch(e){return}
|
||||
const o=r.op, box=$('fmOp');
|
||||
@@ -1152,7 +1153,7 @@ async function fmPollOp(){
|
||||
if(o.busy){
|
||||
box.innerHTML=`<b>${esc(tr(OPNAME[o.op]||o.op))}</b> <span class="hint" data-noi18n>${esc((o.current||'').split('/').pop())}</span>
|
||||
<div class="bar"><i style="width:${pct.toFixed(1)}%"></i></div>
|
||||
<span class="hint">${o.bytes_total?human(o.bytes_done)+' / '+human(o.bytes_total):(o.items_done+' / '+o.items_total)}</span>
|
||||
<span class="hint">${o.bytes_total?human(o.bytes_done)+' / '+human(o.bytes_total):(o.items_done+' / '+o.items_total)}${o.op==='delete'?' · '+esc(tr('liberados {0}').replace('{0}',human(o.bytes_done||0)))+' · '+fmtSecs(Date.now()/1000-(o.t0||Date.now()/1000)):''}</span>
|
||||
<button class="small" id="fmOpCancel">${esc(tr('Cancelar'))}</button>`;
|
||||
$('fmOpCancel').onclick=()=>api('/api/fm/cancel',{});
|
||||
} else {
|
||||
|
||||
Reference in new issue
Block a user