feat(bt): support disabling DHT and PEX (#1555)

This commit is contained in:
Junker der Provinz authored and GitHub committed 2026-10-17 11:22:34 +08:00
1 parent eee39e012f
commit 5462b14705
30 files changed
+149

No files matched your search

@@ -105,6 +105,8 @@ class BtConfig {
bool seedKeep;
double seedRatio;
int seedTime;
bool disableDht;
bool disablePex;
BtConfig({
this.listenPort = 0,
@@ -112,6 +114,8 @@ class BtConfig {
this.seedKeep = false,
this.seedRatio = 0,
this.seedTime = 0,
this.disableDht = false,
this.disablePex = false,
});
factory BtConfig.fromJson(Map<String, dynamic> json) => _$BtConfigFromJson(json);
@@ -98,6 +98,8 @@ BtConfig _$BtConfigFromJson(Map<String, dynamic> json) => BtConfig(
seedKeep: json['seedKeep'] as bool? ?? false,
seedRatio: (json['seedRatio'] as num?)?.toDouble() ?? 0,
seedTime: (json['seedTime'] as num?)?.toInt() ?? 0,
disableDht: json['disableDht'] as bool? ?? false,
disablePex: json['disablePex'] as bool? ?? false,
);
Map<String, dynamic> _$BtConfigToJson(BtConfig instance) => <String, dynamic>{
@@ -106,6 +108,8 @@ Map<String, dynamic> _$BtConfigToJson(BtConfig instance) => <String, dynamic>{
'seedKeep': instance.seedKeep,
'seedRatio': instance.seedRatio,
'seedTime': instance.seedTime,
'disableDht': instance.disableDht,
'disablePex': instance.disablePex,
};
Ed2kConfig _$Ed2kConfigFromJson(Map<String, dynamic> json) => Ed2kConfig(
@@ -623,6 +623,22 @@ class _SettingsPageState extends ConsumerState<SettingsPage> {
max: 65535,
),
),
SettingsItem(
title: context.l10n.enableDht,
subtitle: context.l10n.restartRequired,
child: shad.Switch(
value: !config.protocolConfig.bt.disableDht,
onChanged: (value) => _mutateConfig((next) => next.protocolConfig.bt.disableDht = !value),
),
),
SettingsItem(
title: context.l10n.enablePex,
subtitle: context.l10n.restartRequired,
child: shad.Switch(
value: !config.protocolConfig.bt.disablePex,
onChanged: (value) => _mutateConfig((next) => next.protocolConfig.bt.disablePex = !value),
),
),
SettingsItem(
title: context.l10n.seedKeep,
child: shad.Switch(
+2
View File
@@ -154,6 +154,8 @@
"seedKeep": "الاستمرار في المشاركة حتى الإيقاف اليدوي",
"seedRatio": "نسبة المشاركة",
"seedTime": "مدة المشاركة (دقائق)",
"enableDht": "تفعيل DHT",
"enablePex": "تفعيل PEX",
"setAsDefaultBtClient": "تعيين كعميل تورنت افتراضي",
"taskDetail": "تفاصيل المهمة",
"taskName": "اسم المهمة",
+2
View File
@@ -161,6 +161,8 @@
"seedKeep": "Əl ilə dayandırılana qədər seed etməyə davam et",
"seedRatio": "Seed nisbəti",
"seedTime": "Seed müddəti (dəqiqə)",
"enableDht": "DHT-ni aktivləşdir",
"enablePex": "PEX-i aktivləşdir",
"setAsDefaultBtClient": "Standart BT müştərisi kimi təyin et",
"taskDetail": "Tapşırıq Detalları",
"taskName": "Tapşırığın Adı",
+2
View File
@@ -154,6 +154,8 @@
"seedKeep": "Continua sembrant fins que s'aturi manualment",
"seedRatio": "Proporció de les llavors",
"seedTime": "Temps de la llavor (minuts)",
"enableDht": "Activa DHT",
"enablePex": "Activa PEX",
"setAsDefaultBtClient": "Estableix com a client BT per defecte",
"taskDetail": "Detall de la tasca",
"taskName": "Nom de la tasca",
+2
View File
@@ -154,6 +154,8 @@
"seedKeep": "Weiter-seeden bis manuell gestoppt",
"seedRatio": "Seed Verhältniss",
"seedTime": "Seed-Zeit (Minuten)",
"enableDht": "DHT aktivieren",
"enablePex": "PEX aktivieren",
"setAsDefaultBtClient": "Als Standard-BT-Client festlegen",
"taskDetail": "Aufgabendetails",
"taskName": "Aufgabenname",
+2
View File
@@ -168,6 +168,8 @@
"seedKeep": "Keep seeding until manually stopped",
"seedRatio": "Seed ratio",
"seedTime": "Seed time (minutes)",
"enableDht": "Enable DHT",
"enablePex": "Enable PEX",
"setAsDefaultBtClient": "Set as the default BT client",
"taskDetail": "Task Detail",
"taskName": "Task Name",
+2
View File
@@ -154,6 +154,8 @@
"seedKeep": "Mantener sembrado",
"seedRatio": "Ratio de semilla",
"seedTime": "Tiempo de semilla (minutos)",
"enableDht": "Activar DHT",
"enablePex": "Activar PEX",
"setAsDefaultBtClient": "Establecer como el cliente BT predeterminado",
"taskDetail": "Detalles de la Tarea",
"taskName": "Nombre de la Tarea",
+2
View File
@@ -154,6 +154,8 @@
"seedKeep": "بذر را نگه دارید تا زمانی که به صورت دستی متوقف شود",
"seedRatio": "نسبت دید",
"seedTime": "زمان ( دقیقه)",
"enableDht": "فعال‌سازی DHT",
"enablePex": "فعال‌سازی PEX",
"setAsDefaultBtClient": "تنظیم به‌عنوان کلاینت پیش‌فرض BT",
"taskDetail": "جزئیات وظیفه",
"taskName": "نام وظیفه",
+2
View File
@@ -154,6 +154,8 @@
"seedKeep": "Continuer à semer jusqu'à ce qu'il soit arrêté manuellement",
"seedRatio": "Taux de semences",
"seedTime": "Temps de semis (minutes)",
"enableDht": "Activer DHT",
"enablePex": "Activer PEX",
"setAsDefaultBtClient": "Définir comme le client BT par défaut",
"taskDetail": "Détail de la tâche",
"taskName": "Nom de la tâche",
+2
View File
@@ -154,6 +154,8 @@
"seedKeep": "Tartsa a seedet amíg manuálisan le nem állítják",
"seedRatio": "Seed arány",
"seedTime": "Seed idő (perc)",
"enableDht": "DHT engedélyezése",
"enablePex": "PEX engedélyezése",
"setAsDefaultBtClient": "Alapértelmezett BT klienseként beállít",
"taskDetail": "Feladat részlete",
"taskName": "Feladat neve",
+2
View File
@@ -154,6 +154,8 @@
"seedKeep": "Terus seeding hingga dihentikan secara manual",
"seedRatio": "Rasio Seed",
"seedTime": "Waktu Seed (menit)",
"enableDht": "Aktifkan DHT",
"enablePex": "Aktifkan PEX",
"setAsDefaultBtClient": "Atur sebagai klien baku BT",
"taskDetail": "Detail Tugas",
"taskName": "Nama Tugas",
+2
View File
@@ -154,6 +154,8 @@
"seedKeep": "Continuare a vedere fino a quando non è stato interrotto manualmente",
"seedRatio": "Rapporto di taglio",
"seedTime": "Tempo di seme (minuti)",
"enableDht": "Abilita DHT",
"enablePex": "Abilita PEX",
"setAsDefaultBtClient": "Impostare come client BT predefinito",
"taskDetail": "Dettaglio delle attività",
"taskName": "Nome della missione",
+2
View File
@@ -154,6 +154,8 @@
"seedKeep": "手動で停止するまでシードを継続する",
"seedRatio": "シード共有比",
"seedTime": "シード時間 (分)",
"enableDht": "DHT を有効にする",
"enablePex": "PEX を有効にする",
"setAsDefaultBtClient": "デフォルトのBTクライアントとして設定",
"taskDetail": "タスク詳細",
"taskName": "タスク名",
+2
View File
@@ -154,6 +154,8 @@
"seedKeep": "수동으로 중지할 때까지 계속 시드",
"seedRatio": "시드 비율",
"seedTime": "시드 시간(분)",
"enableDht": "DHT 사용",
"enablePex": "PEX 사용",
"setAsDefaultBtClient": "기본 BT 클라이언트로 설정",
"taskDetail": "작업 상세 정보",
"taskName": "작업 이름",
+2
View File
@@ -154,6 +154,8 @@
"seedKeep": "Siew siewny do momentu ręcznego zatrzymania",
"seedRatio": "Stosunek materiału siewnego",
"seedTime": "Czas nasadzenia (minuty)",
"enableDht": "Włącz DHT",
"enablePex": "Włącz PEX",
"setAsDefaultBtClient": "Ustaw jako domyślny klient BT",
"taskDetail": "Szczegóły zadania",
"taskName": "Nazwa zadania",
+2
View File
@@ -154,6 +154,8 @@
"seedKeep": "Manter a semeadura até parar manualmente",
"seedRatio": "Relação entre sementes",
"seedTime": "Tempo de semente (minutos)",
"enableDht": "Ativar DHT",
"enablePex": "Ativar PEX",
"setAsDefaultBtClient": "Definir como o cliente BT padrão",
"taskDetail": "Detalhes da Tarefa",
"taskName": "Nome da Tarefa",
+2
View File
@@ -154,6 +154,8 @@
"seedKeep": "Раздавать пока не остановлю вручную",
"seedRatio": "Коэффициент раздачи",
"seedTime": "Время раздачи (минуты)",
"enableDht": "Включить DHT",
"enablePex": "Включить PEX",
"setAsDefaultBtClient": "Установить как клиент BT по умолчанию",
"taskDetail": "Детали задания",
"taskName": "Название задачи",
+2
View File
@@ -168,6 +168,8 @@
"seedKeep": "Pokračovať v seedovaní až do manuálneho zastavenia",
"seedRatio": "Pomer seedovania",
"seedTime": "Čas seedovania (minúty)",
"enableDht": "Povoliť DHT",
"enablePex": "Povoliť PEX",
"setAsDefaultBtClient": "Nastaviť ako predvoleného BT klienta",
"taskDetail": "Detail úlohy",
"taskName": "Názov úlohy",
+2
View File
@@ -154,6 +154,8 @@
"seedKeep": "கைமுறையாக நிறுத்தப்படும் வரை விதைப்பதைத் தொடரவும்",
"seedRatio": "விதை விகிதம்",
"seedTime": "விதை நேரம் (நிமிடங்கள்)",
"enableDht": "DHT ஐ இயக்கு",
"enablePex": "PEX ஐ இயக்கு",
"setAsDefaultBtClient": "இயல்புநிலை BT கிளையண்டாக அமைக்கவும்",
"taskDetail": "பணி விவரம்",
"taskName": "செயல் பெயர்",
+2
View File
@@ -154,6 +154,8 @@
"seedKeep": "Manuel olarak durdurulana kadar seed'e devam et",
"seedRatio": "Seed oranı",
"seedTime": "Seed süresi (dakika)",
"enableDht": "DHT'yi etkinleştir",
"enablePex": "PEX'i etkinleştir",
"setAsDefaultBtClient": "Varsayılan BitTorrent istemcisi olarak ayarla",
"taskDetail": "İşlem Detayı",
"taskName": "İşlem Adı",
+2
View File
@@ -154,6 +154,8 @@
"seedKeep": "Роздавати доки не зупиню вручну",
"seedRatio": "Коефіцієнт роздачі",
"seedTime": "Час роздачі (хвилини)",
"enableDht": "Увімкнути DHT",
"enablePex": "Увімкнути PEX",
"setAsDefaultBtClient": "Встановити як клієнт BT за замовчуванням",
"taskDetail": "Деталі завдання",
"taskName": "Назва завдання",
+2
View File
@@ -154,6 +154,8 @@
"seedKeep": "Giữ hạt giống cho đến khi tay dừng lại",
"seedRatio": "Tốc độ Hạt giống",
"seedTime": "Thời gian hạt giống ( Phút)",
"enableDht": "Bật DHT",
"enablePex": "Bật PEX",
"setAsDefaultBtClient": "Đặt là trình khách BT mặc định",
"taskDetail": "Chi tiết tác vụ",
"taskName": "Tên tác vụ",
+2
View File
@@ -154,6 +154,8 @@
"seedKeep": "持续做种直到手动停止",
"seedRatio": "做种分享率",
"seedTime": "做种时间(分钟)",
"enableDht": "启用 DHT",
"enablePex": "启用 PEX",
"setAsDefaultBtClient": "设为系统默认 BT 客户端",
"taskDetail": "任务详情",
"taskName": "任务名称",
+2
View File
@@ -154,6 +154,8 @@
"seedKeep": "持續做種直到手動停止",
"seedRatio": "做種分享率",
"seedTime": "做種時間(分鐘)",
"enableDht": "啟用 DHT",
"enablePex": "啟用 PEX",
"setAsDefaultBtClient": "設為系統預設 BT 客戶端",
"taskDetail": "任務詳情",
"taskName": "任務名稱",
@@ -36,6 +36,28 @@ void main() {
expect(decoded.token, 'secret');
});
test('BitTorrent peer discovery settings round-trip with the Go json keys', () {
final config = DownloaderConfig();
config.protocolConfig.bt
..disableDht = true
..disablePex = true;
final json = config.toJson();
final bt = (json['protocolConfig'] as Map<String, dynamic>)['bt'] as Map<String, dynamic>;
expect(bt['disableDht'], isTrue);
expect(bt['disablePex'], isTrue);
final decoded = DownloaderConfig.fromJson(json).protocolConfig.bt;
expect(decoded.disableDht, isTrue);
expect(decoded.disablePex, isTrue);
});
test('BitTorrent peer discovery stays on when a stored config lacks the keys', () {
final bt = BtConfig.fromJson({'listenPort': 6881, 'seedRatio': 1.0});
expect(bt.disableDht, isFalse);
expect(bt.disablePex, isFalse);
});
test('Flutter preferences round-trip through the Go-owned extra config', () {
final config = DownloaderConfig();
config.extra