3 Commits
4 changed files with 98 additions and 35 deletions

No files matched your search

+39
View File
@@ -1,5 +1,27 @@
# Changelog - PS5 Upload Suite
## Version 4.2.1 - Bugfix Release (February 8, 2026)
### 🐛 Bug Fixes
#### UI Scrolling Fix
- **Fixed connection panel eating screen space** - Added `MaxHeight` constraint (250px) and `ScrollViewer` to the connection/payload settings panel
- **Fixed header overflow** - Added `MaxHeight="120"` to header row
- **Fixed content area too small** - Added `MinHeight="200"` to main content area
- When the Auto-send Payload Expander was open, it consumed half the screen leaving no room for file lists
#### File Counting Fix
- **Fixed chunked files never counting as completed** - `fileChunkCounts` was set to the actual number of chunks (e.g., 4 for a 2GB file), but `UploadFileParallelAsync` handles all chunks internally as a single Task. The main loop only saw 1 task completion per file, so chunked files never reached their completion threshold
- Now correctly sets `fileChunkCounts = 1` per file since each file = 1 task
#### Progress Display Fix
- **Fixed progress appearing frozen during heavy uploads** - All UI updates used `DispatcherPriority.Background` (lowest priority), which got starved when 24 parallel connections flooded the dispatcher queue
- Upgraded `UpdateUploadStats` to `DispatcherPriority.Normal`
- Upgraded per-file progress bars to `DispatcherPriority.Render`
- Progress now updates smoothly even at 95%+ network saturation
---
## Version 4.2.0 - Game Mounter Integration (February 7, 2026)
### 🎮 Game Mounter Integration
@@ -36,13 +58,30 @@
- **MainWindow.xaml.cs** - Click handler with progress display and auto-registration
- **Auto Registration** - If new games detected, automatically runs `game_mounter.elf` via shell for home screen registration
### ⚡ Client Improvements
- **Real-Time Speed Display** - New sliding window algorithm (10 samples over 5 seconds) for accurate real-time upload speed
- **Smoother ETA** - Blended speed calculation (60% real-time + 40% average) with better time formatting (hours/minutes/seconds)
- **Speed Display** - Shows both real-time and average speed: `Speed: 95 MB/s (avg 88 MB/s)`
- **Duplicate File Dialog** - New `DuplicateFileDialog` for handling file conflicts during upload
- **Move Dialog Refactor** - Replaced inline move dialog code with reusable `ShowPathPickerDialogAsync()`
- **FormatFileSize Refactor** - Moved to static `FileUtils.FormatFileSize()` class for code reuse
- **ETA Smoothing** - Reduced `ETASmoothingFactor` from 0.3 to 0.15 for less jumpy ETA display
### 🐛 Bug Fixes
#### Payload Fixes
- **Fixed IOVEC_ENTRY(NULL) crash** - `strlen(NULL)` with `-O3` optimization caused segfault in `remount_system_ex()`
- **Fixed libSceAppInstUtil startup crash** - Library cannot be loaded in etaHEN payload context (crashes dynamic linker). Switched to standalone `game_mounter.elf` for registration
- **Fixed dlopen crash** - `dlopen("libSceAppInstUtil.sprx")` crashes payload thread. Removed dynamic loading approach
- **Removed system() calls** - `system("rm -rf ...")` replaced with safe recursive `rmdir_recursive()` to prevent payload hangs
- **Fixed compile warnings** - Removed unused `#include <dlfcn.h>`, re-enabled `auto_unmount_deleted_games()`
#### Client Fixes
- **Fixed Shell Terminal hardcoded IP** - Shell was connecting to hardcoded `192.168.0.160` instead of the configured PS5 IP address
- **Fixed ETA jumping** - ETA no longer jumps erratically during uploads due to improved smoothing
- **Fixed speed dropping to 0** - Sliding window prevents speed display from showing 0 during brief pauses
- **Fixed files remaining counter** - Simplified calculation with `Math.Max(0, ...)` to prevent negative values
### 📝 Technical Notes
- `libSceAppInstUtil.sprx` is **not available** in etaHEN payload context (both static linking and dlopen crash)
- Game registration (`sceAppInstUtilAppInstallTitleDir`) is handled by the standalone `game_mounter.elf` which runs as a separate ELF with its own library dependencies
+46 -23
View File
@@ -2,14 +2,19 @@
**By Manos**
**Version 4.2.0 - Game Mounter Integration**
**Version 4.2.1 - Bugfix Release**
Custom high-speed file transfer system for PS5 with etaHEN. Achieves **104+ MB/s** upload speeds for large files using parallel chunked uploads!
⭐ **NEW in v4.2.0:**
⭐ **NEW in v4.2.1 (Bugfix):**
- 🖥️ **Fixed UI scrolling** - Connection panel no longer eats half the screen
- 🔢 **Fixed file counting** - Chunked files now count correctly as completed
- 📊 **Fixed frozen progress** - Progress updates no longer freeze during heavy uploads
⭐ **v4.2.0 Features:**
- 🎮 **Mount Games Button** - Mount uploaded games directly from the client
- 🔍 **Multi-Path Scanning** - Scans internal storage, USB drives (0-3), and M.2 SSD
- � **Duplicate Detection** - Skips already-mounted games automatically
- 🔄 **Duplicate Detection** - Skips already-mounted games automatically
- 📊 **Mount Summary** - Detailed results with PS5 notifications
- 🧹 **Auto-Cleanup** - Removes mount entries for deleted games
@@ -36,9 +41,10 @@ Download the latest release from the [Releases](https://github.com/manos555555/P
- Self-contained executable (no .NET installation required)
- Modern dark theme UI
- Drag & drop file/folder upload
- Real-time upload progress with speed tracking
- Transfer History with success/failed tracking
- Privacy-focused (no storage monitoring)
- Real-time upload progress with sliding window speed tracking
- Transfer History with success/failed tracking and retry
- PS5 storage display (free/used/total)
- Game mounting with one-click Mount Games button
### 3. 📱 Android Mobile Client
- **File:** `PS5UploadMobile.apk`
@@ -77,38 +83,45 @@ Download the latest release from the [Releases](https://github.com/manos555555/P
## 🎨 Features
### PS5 Server
✅ **High-Speed Protocol** - Custom binary protocol
✅ **4MB Buffers** - Maximum throughput
✅ **Direct Disk I/O** - No temp files
✅ **Multi-threaded** - Handle multiple clients
✅ **Robust Error Handling** - Graceful failures
### PS5 Server Payload
✅ **High-Speed Protocol** - Custom binary protocol for maximum speed
✅ **8MB Buffer** - Large buffer for high throughput
✅ **16MB Socket Buffers** - Maximum network throughput
✅ **Direct Disk I/O** - No temp files, direct write syscalls
✅ **Multi-threaded** - Handle multiple clients simultaneously
✅ **Per-File Mutex** - Safe parallel uploads without corruption
✅ **5-Minute Socket Timeout** - No connection drops on large files
✅ **Game Mounting** - nullfs mount, DRM patching, metadata copy
✅ **Shell Commands** - Built-in shell with ls, cd, cat, mkdir, rm, etc.
✅ **Filesystem Indexing** - In-memory index for instant search
### Windows Client
✅ **Modern UI** - Dark theme, maximized window for better visibility
✅ **Modern UI** - Dark theme, maximized window
✅ **Drag & Drop** - Files and folders
✅ **Browse PS5** - Navigate filesystem
✅ **Real-time Progress** - Speed & percentage tracking
✅ **Optimized Upload** - 8 parallel connections for 88-110 MB/s aggregate speed
✅ **Browse PS5** - Navigate filesystem with favorites
✅ **Real-time Speed** - Sliding window algorithm for accurate speed display
✅ **Parallel Uploads** - 4 parallel chunked connections for 104+ MB/s
✅ **Transfer History** - Track all uploads/downloads with success/failed status
✅ **Auto-Clear History** - Optional auto-clear on startup
✅ **Retry Failed Transfers** - Right-click to retry failed uploads
✅ **Duplicate File Dialog** - Handle file conflicts during upload
✅ **Folder Upload** - Recursive directory upload
✅ **Download Files** - Download from PS5 to PC
✅ **🔍 Smart Search** - Full filesystem indexing with instant search (NEW v3.3)
✅ **💾 Storage Display** - Real-time PS5 storage info (free/used/total)
✅ **🔍 Smart Search** - Full filesystem indexing with instant search
- Wildcard support: `*.pkg`, `*loader*`, `game*.bin`
- Size filters: `size:>1GB`, `size:<100MB`
- Case-insensitive matching
- Search both filename and full path
- Double-click to navigate to folder
✅ **💻 Shell Terminal** - Execute commands directly on PS5 (NEW v3.3)
✅ **💻 Shell Terminal** - Execute commands directly on PS5
- Run system commands remotely
- Real-time output display
- Command history
- Working directory support
✅ **Favorites/Bookmarks** - Quick navigation to saved paths
✅ **Multi-PS5 Support** - Save and switch between multiple PS5 profiles
✅ **🎮 Mount Games** - Mount uploaded games directly from the client (NEW v4.2)
- Scans all game paths: internal, USB drives, M.2 SSD
✅ **⭐ Favorites/Bookmarks** - Quick navigation to saved paths
✅ **👥 Multi-PS5 Profiles** - Save and switch between multiple PS5 consoles
✅ **🎮 Mount Games** - Mount uploaded games directly from the client
- Scans all game paths: internal, USB drives (0-3), M.2 SSD
- Duplicate detection across storage locations
- Auto-cleanup of deleted game mounts
- PS5 notifications with mount progress
@@ -194,10 +207,20 @@ Download the latest release from the [Releases](https://github.com/manos555555/P
- **sce_sys Copy** - Copies game metadata to `/user/app/` and `/user/appmeta/`
- **mount.lnk Tracking** - Creates mount link files for persistent mount state
### ⚡ Client Improvements
- **Real-Time Speed Display** - Sliding window algorithm for accurate real-time upload speed
- **Smoother ETA** - Blended speed calculation (60% real-time + 40% average) with better formatting
- **Duplicate File Dialog** - New dialog for handling file conflicts during upload
- **Move Dialog Refactor** - Reusable `ShowPathPickerDialogAsync()` replaces inline code
### 🐛 Bug Fixes
- **Fixed IOVEC_ENTRY(NULL) crash** - `strlen(NULL)` with `-O3` optimization caused payload crash
- **Fixed libSceAppInstUtil crash** - Library not available in etaHEN payload context, switched to standalone registration
- **Removed system() calls** - Replaced `system("rm -rf ...")` with safe recursive delete to prevent hangs
- **Fixed Shell Terminal hardcoded IP** - Shell was connecting to hardcoded IP instead of configured PS5 address
- **Fixed ETA jumping** - ETA no longer jumps erratically during uploads
- **Fixed speed dropping to 0** - Sliding window prevents speed display from showing 0 during pauses
- **Fixed files remaining counter** - Prevented negative values in remaining files display
---
+6 -3
View File
@@ -66,10 +66,10 @@
<Grid Margin="20">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" MaxHeight="120"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
<RowDefinition Height="*" MinHeight="200"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
@@ -119,7 +119,9 @@
BorderThickness="1"
CornerRadius="4"
Padding="15"
Margin="0,0,0,15">
Margin="0,0,0,15"
MaxHeight="250">
<ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Disabled">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
@@ -323,6 +325,7 @@
</Expander>
</Grid>
</Grid>
</ScrollViewer>
</Border>
<!-- Storage Info Panel -->
+7 -9
View File
@@ -408,7 +408,7 @@ namespace PS5Upload
private void UpdateUploadStats(int completedFiles, int activeTaskCount)
{
// CRITICAL FIX: Use InvokeAsync instead of Invoke to prevent UI freezing
// When uploading thousands of small files, Invoke blocks the UI thread
// Use Normal priority (not Background) so updates aren't starved during heavy uploads
Dispatcher.InvokeAsync(() =>
{
// Update files remaining counter
@@ -491,7 +491,7 @@ namespace PS5Upload
{
UploadFileNameText.Text = $"Uploading {activeTaskCount} files in parallel...";
}
}, System.Windows.Threading.DispatcherPriority.Background);
}, System.Windows.Threading.DispatcherPriority.Normal);
}
private void Log(string message)
@@ -1158,11 +1158,9 @@ namespace PS5Upload
taskIsLargeFile[task] = isLargeFile;
taskIsHugeFile[task] = isHugeFile;
long chunkSizeForFile = fileSize >= HugeFileThresholdBytes ? HugeFileChunkSizeBytes : DefaultChunkSizeBytes;
int chunkCount = fileSize > ChunkThresholdBytes
? (int)((fileSize + chunkSizeForFile - 1) / chunkSizeForFile)
: 1;
fileChunkCounts[localPath] = chunkCount;
// Each file is ONE task (UploadFileParallelAsync handles chunks internally)
// So chunkCount must always be 1 for the completion counter to work
fileChunkCounts[localPath] = 1;
fileChunksCompleted[localPath] = 0;
}
@@ -1625,7 +1623,7 @@ namespace PS5Upload
{
UploadProgressBar.Value = filePercent;
UploadProgressText.Text = $"{FormatFileSize(aggregateBytes)} / {FormatFileSize(fileInfo.Length)} ({filePercent:F1}%)";
}, System.Windows.Threading.DispatcherPriority.Background);
}, System.Windows.Threading.DispatcherPriority.Render);
if (aggregateBytes == fileInfo.Length || aggregateBytes - previousLoggedBytes >= ChunkLogIntervalBytes)
{
@@ -1686,7 +1684,7 @@ namespace PS5Upload
{
UploadProgressBar.Value = filePercent;
UploadProgressText.Text = $"{FormatFileSize(p.BytesSent)} / {FormatFileSize(fileInfo.Length)} ({filePercent:F1}%)";
}, System.Windows.Threading.DispatcherPriority.Background);
}, System.Windows.Threading.DispatcherPriority.Render);
if (p.BytesSent == p.TotalBytes || p.BytesSent - previousLoggedBytes >= SmallFileLogIntervalBytes)
{