Skip to content

Commit a59ebc4

Browse files
committed
1.4.8
1 parent ee19139 commit a59ebc4

12 files changed

Lines changed: 266 additions & 202 deletions

File tree

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,12 @@ This project follows Semantic Versioning.
1515
- Logging for pre-create and resume scanning tuned to reduce noise while keeping progress visibility.
1616
- Connection controls are now managed automatically (no manual slider). Defaults: Payload 4, FTP 10; auto-tune adjusts based on file size/count.
1717
- Archive uploads now emit stall hints when progress pauses early.
18+
- RAR extraction now uses a single turbo mode (max speed) and the mode selector has been removed.
1819

1920
### Fixed
2021
- Archive extraction progress handler is now available across archive workflows.
22+
- Archive uploads now queue extraction (with temp cleanup) so extraction appears in the Extraction queue after upload finishes.
23+
- Queued extraction now runs in turbo mode consistently.
2124

2225
## [1.4.6] - 2026-02-04
2326

FAQ.md

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -247,14 +247,19 @@ Stop retries automatically—no need to click multiple times.
247247
## Archives & Extraction
248248

249249
**Q: How does RAR extraction work?**
250-
If **RAR Extract Mode** is enabled, the archive is uploaded to a temp folder and extracted on the PS5.
250+
RAR extraction runs in a single turbo mode for maximum speed. The archive is uploaded to a temp folder and extracted on the PS5.
251251
If **RAR Temp Storage** is set, the temp folder is `<selected storage>/ps5upload/tmp` (e.g. `/mnt/usb0/ps5upload/tmp`); otherwise it uses the destination’s storage root.
252252
This requires a payload that supports the TMP override (older payloads will ignore the selection).
253253

254254
**Q: Why keep failed RARs?**
255255
Failed extractions keep the archive so you can **Requeue**.
256256
Temp files are deleted only on **success** or **Clear tmp**.
257257

258+
**Q: My archive upload looks stuck at the beginning. Is it frozen?**
259+
Large archives may pause briefly before progress appears while the payload signals READY and the client primes the read pipeline.
260+
If the source file is on a shared/network drive (for example `hgfs`), the first read can be slow.
261+
Check the Transfer log for stall hints; they indicate whether the delay is from payload READY or source reads.
262+
258263
---
259264

260265
## Manage Tab (PS5 Browser)

README.md

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ Release bundle option:
143143
* Pick a preset location (like `homebrew` or `etaHEN/games`).
144144
* Give your folder a name.
145145
4. **Upload:** Click **Upload** in the bottom right. The bar will track real-time progress.
146-
5. **RAR uploads (optional):** If your source is a `.rar`, you can pick a **RAR Extract Mode** and (optionally) a **RAR Temp Storage** in Transfer settings to control where the archive is staged before extraction.
146+
5. **RAR uploads (optional):** If your source is a `.rar`, extraction runs in a single turbo mode for maximum speed. You can still pick an optional **RAR Temp Storage** in Transfer settings to control where the archive is staged before extraction.
147147

148148
### 5. Manage Files (Optional)
149149
Open the **Manage** tab to browse your PS5's storage. You can rename, move, copy, delete, and `chmod 777` files or folders. You can also download files and folders from your PS5 to your computer (folder downloads run in a safe, sequential mode for stability). If something gets stuck, use **Reset UI** in Manage to recover.
@@ -187,6 +187,11 @@ Open the **FAQ** tab for built‑in help and troubleshooting (offline, bundled w
187187
**Q: "No writable storage found"?**
188188
* The tool protects you from trying to write to read-only system partitions. If you want to use a USB drive, make sure it's formatted (exFAT is best) and plugged in *before* you load the payload.
189189

190+
**Q: Archive upload shows 0% or looks stuck at the start?**
191+
* Large archives can pause briefly while the payload reports READY and the client primes the read pipeline.
192+
* If the source is on a shared/network drive (for example `hgfs`), the first read can be slow.
193+
* The Transfer log now emits stall hints so you can see whether the delay is from payload READY or source reads.
194+
190195
**Q: macOS: "App is damaged" or "Unidentified Developer"?**
191196
* This is normal for unsigned apps. Right-click the app, select **Open**, and then click **Open** in the dialog.
192197
* If macOS still blocks it, go to **System Settings -> Privacy & Security** and click **Open Anyway** for PS5 Upload.

app/server.js

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1328,7 +1328,13 @@ async function precreateRemoteDirectories(ip, destRoot, files, options = {}) {
13281328

13291329
const workers = Array.from({ length: PRECREATE_DIR_CONCURRENCY }, () => runWorker());
13301330
await Promise.all(workers);
1331-
if (log) log(`Pre-create: done (${created} created, ${failed} failed).`);
1331+
if (log) {
1332+
if (failed > 0) {
1333+
log(`Pre-create: done (${created} created, ${failed} failed).`);
1334+
} else {
1335+
log(`Pre-create: done (${created} created).`);
1336+
}
1337+
}
13321338
return { total, created, skipped: failed };
13331339
}
13341340

@@ -1805,8 +1811,18 @@ async function payloadMaintenance(ip, port) {
18051811
return true;
18061812
}
18071813

1808-
async function queueExtract(ip, port, src, dst) {
1809-
const response = await sendSimpleCommand(ip, port, `QUEUE_EXTRACT ${src}\t${dst}\n`);
1814+
async function queueExtract(ip, port, src, dst, opts = {}) {
1815+
const cleanupPath = typeof opts.cleanupPath === 'string' ? opts.cleanupPath.trim() : '';
1816+
const deleteSource = opts.deleteSource === true;
1817+
const tokens = [src, dst];
1818+
if (cleanupPath || deleteSource) {
1819+
tokens.push(cleanupPath);
1820+
if (deleteSource) {
1821+
tokens.push('DEL');
1822+
}
1823+
}
1824+
const cmd = `QUEUE_EXTRACT ${tokens.join('\t')}\n`;
1825+
const response = await sendSimpleCommand(ip, port, cmd);
18101826
if (!response.startsWith('OK ')) throw new Error(`Queue extract failed: ${response}`);
18111827
return Number.parseInt(response.substring(3).trim(), 10);
18121828
}
@@ -3048,14 +3064,14 @@ async function handleInvoke(cmd, args, runtime) {
30483064
},
30493065
});
30503066
}
3051-
const queuedId = await queueExtract(ip, TRANSFER_PORT, remoteRarPath, destPath);
3067+
const queuedId = await queueExtract(ip, TRANSFER_PORT, remoteRarPath, destPath, { deleteSource: true });
30523068
return { fileSize: stat.size, bytes: stat.size, files: 1, queuedId };
30533069
}
30543070

30553071
const ftpPort = await findFtpPort(ip, 'auto');
30563072
if (!ftpPort) throw new Error('FTP not reachable on ports 1337/2121. Enable ftpsrv or etaHEN FTP service.');
30573073
await uploadFilesViaFtpSimple(ip, ftpPort, remoteDir, [{ abs_path: rarPath, rel_path: path.basename(rarPath), size: stat.size }]);
3058-
const queuedId = await queueExtract(ip, TRANSFER_PORT, remoteRarPath, destPath);
3074+
const queuedId = await queueExtract(ip, TRANSFER_PORT, remoteRarPath, destPath, { deleteSource: true });
30593075
return { fileSize: stat.size, bytes: stat.size, files: 1, queuedId };
30603076
}
30613077

0 commit comments

Comments
 (0)