diff --git a/installer/PSLauncher.iss b/installer/PSLauncher.iss
index 2a21121..54aeff3 100644
--- a/installer/PSLauncher.iss
+++ b/installer/PSLauncher.iss
@@ -11,7 +11,7 @@
#define MyAppName "PROSERVE Launcher"
#define MyAppShortName "PS_Launcher"
-#define MyAppVersion "0.18.0"
+#define MyAppVersion "0.19.0"
#define MyAppPublisher "ASTERION VR"
#define MyAppURL "https://asterionvr.com"
#define MyAppExeName "PS_Launcher.exe"
diff --git a/src/PSLauncher.App/App.xaml.cs b/src/PSLauncher.App/App.xaml.cs
index ca5ef35..1490fd4 100644
--- a/src/PSLauncher.App/App.xaml.cs
+++ b/src/PSLauncher.App/App.xaml.cs
@@ -112,16 +112,16 @@ public partial class App : Application
services.AddSingleton(sp =>
{
// Handler tuné pour les gros téléchargements parallèles :
- // - MaxConnectionsPerServer=16 pour autoriser le multi-segment (8 par défaut).
- // - AutomaticDecompression sur l'API JSON uniquement (None ici car les builds
- // sont des ZIPs déjà compressés ; éviter la CPU+RAM gaspillée par un éventuel
- // wrapping gzip côté serveur).
+ // - MaxConnectionsPerServer=32 pour aligner avec le clamp DownloadManager (8-32).
+ // Default WPF = 8 → trop bas pour notre multi-segment.
+ // - AutomaticDecompression=None : les builds sont des ZIPs déjà compressés ;
+ // éviter la CPU+RAM gaspillée par un éventuel wrapping gzip côté serveur.
// - PooledConnectionLifetime court pour éviter qu'OVH ferme nos sockets sous nous.
var handler = new SocketsHttpHandler
{
PooledConnectionLifetime = TimeSpan.FromMinutes(5),
PooledConnectionIdleTimeout = TimeSpan.FromSeconds(60),
- MaxConnectionsPerServer = 16,
+ MaxConnectionsPerServer = 32,
EnableMultipleHttp2Connections = true,
AutomaticDecompression = System.Net.DecompressionMethods.None,
};
diff --git a/src/PSLauncher.App/PSLauncher.App.csproj b/src/PSLauncher.App/PSLauncher.App.csproj
index f7ac82d..054698d 100644
--- a/src/PSLauncher.App/PSLauncher.App.csproj
+++ b/src/PSLauncher.App/PSLauncher.App.csproj
@@ -15,9 +15,9 @@
PROSERVE Launcher
© 2026 ASTERION VR — All rights reserved
PSLauncher.App
- 0.18.0
- 0.18.0.0
- 0.18.0.0
+ 0.19.0
+ 0.19.0.0
+ 0.19.0.0
true
diff --git a/src/PSLauncher.App/ViewModels/SettingsViewModel.cs b/src/PSLauncher.App/ViewModels/SettingsViewModel.cs
index 8cc218a..e8ee19e 100644
--- a/src/PSLauncher.App/ViewModels/SettingsViewModel.cs
+++ b/src/PSLauncher.App/ViewModels/SettingsViewModel.cs
@@ -49,6 +49,7 @@ public sealed partial class SettingsViewModel : ObservableObject
[ObservableProperty] private string _language;
[ObservableProperty] private string _reportUrl;
[ObservableProperty] private string _documentationUrl;
+ [ObservableProperty] private int _parallelSegments;
// ----- DB Migration settings -----
[ObservableProperty] private string _dbHost;
@@ -173,6 +174,7 @@ public sealed partial class SettingsViewModel : ObservableObject
_language = string.IsNullOrWhiteSpace(config.Language) ? "auto" : config.Language;
_reportUrl = config.ReportUrl;
_documentationUrl = config.DocumentationUrl;
+ _parallelSegments = config.ParallelDownloadSegments;
_dbHost = config.Database.Host;
_dbPort = config.Database.Port;
@@ -303,6 +305,7 @@ public sealed partial class SettingsViewModel : ObservableObject
_config.Language = Language ?? "auto";
_config.ReportUrl = ReportUrl?.Trim() ?? "";
_config.DocumentationUrl = DocumentationUrl?.Trim() ?? "";
+ _config.ParallelDownloadSegments = Math.Clamp(ParallelSegments, 1, 32);
// DB settings
_config.Database.Host = DbHost.Trim();
diff --git a/src/PSLauncher.App/Views/SettingsDialog.xaml b/src/PSLauncher.App/Views/SettingsDialog.xaml
index 59cdc27..250cc22 100644
--- a/src/PSLauncher.App/Views/SettingsDialog.xaml
+++ b/src/PSLauncher.App/Views/SettingsDialog.xaml
@@ -230,6 +230,19 @@
Background="#1A1A20" Foreground="{StaticResource Brush.Text.Primary}"
BorderBrush="{StaticResource Brush.Border}" BorderThickness="1" Padding="8"
FontFamily="Consolas" />
+
+
+
+
+
diff --git a/src/PSLauncher.Core/Downloads/DownloadManager.cs b/src/PSLauncher.Core/Downloads/DownloadManager.cs
index 76c7027..522ec06 100644
--- a/src/PSLauncher.Core/Downloads/DownloadManager.cs
+++ b/src/PSLauncher.Core/Downloads/DownloadManager.cs
@@ -176,7 +176,10 @@ public sealed class DownloadManager : IDownloadManager
}
// 2. Choix single vs multi-segment
- var requestedSegments = Math.Clamp(_config.ParallelDownloadSegments, 1, 16);
+ // Hard-cap à 32 : au-delà OVH mutualisé risque le rate-limit per-IP et le
+ // gain marginal devient négatif. 16 = défaut, 24-32 OK pour les serveurs
+ // qui le supportent. 1 = comportement single-segment legacy.
+ var requestedSegments = Math.Clamp(_config.ParallelDownloadSegments, 1, 32);
var useMultiSegment = requestedSegments > 1
&& job.ExpectedSize >= MultiSegmentMinSize
&& (existing is null || existing.Segments.Count > 0);
diff --git a/src/PSLauncher.Core/Localization/Strings.cs b/src/PSLauncher.Core/Localization/Strings.cs
index 5e66921..913181e 100644
--- a/src/PSLauncher.Core/Localization/Strings.cs
+++ b/src/PSLauncher.Core/Localization/Strings.cs
@@ -177,6 +177,21 @@ public static class Strings
$"تعذر تحميل {url}\n\n{detail}\n\nتأكد من تشغيل XAMPP وأن العنوان صحيح (الإعدادات → متقدم)."
);
+ public static string SettingsParallelSegments => T(
+ "Connexions parallèles pour les téléchargements (1-32, défaut 16)",
+ "Parallel connections for downloads (1-32, default 16)",
+ "下载的并行连接数 (1-32,默认 16)",
+ "การเชื่อมต่อแบบขนานสำหรับการดาวน์โหลด (1-32, ค่าเริ่มต้น 16)",
+ "اتصالات متوازية للتنزيلات (1-32، الافتراضي 16)"
+ );
+ public static string SettingsParallelSegmentsHint => T(
+ "Plus de connexions = débit pic plus élevé et queue de fin de DL plus courte. Au-delà de 16 le serveur peut throttler.",
+ "More connections = higher peak throughput and shorter end-of-DL tail. Above 16 the server may throttle.",
+ "更多连接 = 更高的峰值吞吐量和更短的下载尾部。超过 16 服务器可能会限速。",
+ "การเชื่อมต่อมากขึ้น = ปริมาณงานสูงสุดมากขึ้นและส่วนท้ายของการดาวน์โหลดสั้นลง สูงกว่า 16 เซิร์ฟเวอร์อาจจำกัด",
+ "اتصالات أكثر = إنتاجية ذروة أعلى وذيل تنزيل أقصر. فوق 16 قد يقيّد الخادم."
+ );
+
public static string SettingsAdvanced => T(
"▸ PARAMÈTRES AVANCÉS (serveur, installation, base de données, logs)",
"▸ ADVANCED SETTINGS (server, installation, database, logs)",
diff --git a/src/PSLauncher.Models/LocalConfig.cs b/src/PSLauncher.Models/LocalConfig.cs
index 7cf0dbc..5a170c6 100644
--- a/src/PSLauncher.Models/LocalConfig.cs
+++ b/src/PSLauncher.Models/LocalConfig.cs
@@ -16,9 +16,13 @@ public sealed class LocalConfig
///
/// Nombre de connexions HTTP parallèles utilisées pour télécharger un build.
/// 1 = comportement legacy single-connection. 4-8 contourne le throttling
- /// per-connection d'Apache/OVH mutualisé. 8 est un bon défaut.
+ /// per-connection d'Apache/OVH mutualisé. 16 = défaut depuis v0.19 pour
+ /// raccourcir la « queue » en fin de DL : avec 8 segments sur 14 Go, le
+ /// dernier segment doit finir seul ~1.75 Go (visible comme un effondrement
+ /// du débit en fin de course) ; avec 16, c'est ~875 Mo. Push à 24/32 si
+ /// ton serveur l'accepte (OVH mutualisé tient bien jusqu'à 16-24).
///
- public int ParallelDownloadSegments { get; set; } = 8;
+ public int ParallelDownloadSegments { get; set; } = 16;
///
/// Si false, ignore la vérification SHA-256 même si le manifest l'exige.
diff --git a/src/PSLauncher.Updater/PSLauncher.Updater.csproj b/src/PSLauncher.Updater/PSLauncher.Updater.csproj
index cbc0bab..f9f6501 100644
--- a/src/PSLauncher.Updater/PSLauncher.Updater.csproj
+++ b/src/PSLauncher.Updater/PSLauncher.Updater.csproj
@@ -8,7 +8,7 @@
latest
PS_Launcher.Updater
PSLauncher.Updater
- 0.18.0
+ 0.19.0
..\PSLauncher.App\Resources\favicon.ico
ASTERION VR
© 2026 ASTERION VR — All rights reserved