From 71c9e6947a6454b1acc3a2c60280f43250d29dce Mon Sep 17 00:00:00 2001 From: Copilot <198982749+Copilot@users.noreply.github.com> Date: Mon, 5 Jan 2026 21:11:42 +0800 Subject: [PATCH] feat: add auto-start incomplete tasks on application startup (#1203) --- .../lib/api/model/downloader_config.dart | 2 ++ .../lib/api/model/downloader_config.g.dart | 2 ++ ui/flutter/lib/api/model/task.g.dart | 16 +++++++-------- .../modules/setting/views/setting_view.dart | 20 +++++++++++++++++++ ui/flutter/lib/i18n/langs/de_de.dart | 1 + ui/flutter/lib/i18n/langs/en_us.dart | 1 + ui/flutter/lib/i18n/langs/es_es.dart | 1 + ui/flutter/lib/i18n/langs/fr_fr.dart | 1 + ui/flutter/lib/i18n/langs/ja_jp.dart | 1 + ui/flutter/lib/i18n/langs/ru_ru.dart | 1 + ui/flutter/lib/i18n/langs/zh_cn.dart | 1 + ui/flutter/lib/i18n/langs/zh_tw.dart | 1 + ui/flutter/lib/main.dart | 10 ++++++++++ 13 files changed, 50 insertions(+), 8 deletions(-) diff --git a/ui/flutter/lib/api/model/downloader_config.dart b/ui/flutter/lib/api/model/downloader_config.dart index 3b736a4b..868e60db 100644 --- a/ui/flutter/lib/api/model/downloader_config.dart +++ b/ui/flutter/lib/api/model/downloader_config.dart @@ -84,6 +84,7 @@ class ExtraConfig { bool defaultDirectDownload; bool defaultBtClient; bool notifyWhenNewVersion; + bool autoStartTasks; List downloadCategories; ExtraConfigBt bt = ExtraConfigBt(); @@ -96,6 +97,7 @@ class ExtraConfig { this.defaultDirectDownload = false, this.defaultBtClient = true, this.notifyWhenNewVersion = true, + this.autoStartTasks = false, this.downloadCategories = const [], }); diff --git a/ui/flutter/lib/api/model/downloader_config.g.dart b/ui/flutter/lib/api/model/downloader_config.g.dart index 739b2474..d89538d1 100644 --- a/ui/flutter/lib/api/model/downloader_config.g.dart +++ b/ui/flutter/lib/api/model/downloader_config.g.dart @@ -81,6 +81,7 @@ ExtraConfig _$ExtraConfigFromJson(Map json) => ExtraConfig( defaultDirectDownload: json['defaultDirectDownload'] as bool? ?? false, defaultBtClient: json['defaultBtClient'] as bool? ?? true, notifyWhenNewVersion: json['notifyWhenNewVersion'] as bool? ?? true, + autoStartTasks: json['autoStartTasks'] as bool? ?? false, downloadCategories: (json['downloadCategories'] as List?) ?.map((e) => DownloadCategory.fromJson(e as Map)) .toList() ?? @@ -98,6 +99,7 @@ Map _$ExtraConfigToJson(ExtraConfig instance) => 'defaultDirectDownload': instance.defaultDirectDownload, 'defaultBtClient': instance.defaultBtClient, 'notifyWhenNewVersion': instance.notifyWhenNewVersion, + 'autoStartTasks': instance.autoStartTasks, 'downloadCategories': instance.downloadCategories.map((e) => e.toJson()).toList(), 'bt': instance.bt.toJson(), diff --git a/ui/flutter/lib/api/model/task.g.dart b/ui/flutter/lib/api/model/task.g.dart index 3eaf9b65..4b65632c 100644 --- a/ui/flutter/lib/api/model/task.g.dart +++ b/ui/flutter/lib/api/model/task.g.dart @@ -53,14 +53,6 @@ const _$ProtocolEnumMap = { Protocol.bt: 'bt', }; -const _$ExtractStatusEnumMap = { - ExtractStatus.none: '', - ExtractStatus.extracting: 'extracting', - ExtractStatus.done: 'done', - ExtractStatus.error: 'error', - ExtractStatus.waitingParts: 'waitingParts', -}; - Progress _$ProgressFromJson(Map json) => Progress( used: (json['used'] as num).toInt(), speed: (json['speed'] as num).toInt(), @@ -82,3 +74,11 @@ Map _$ProgressToJson(Progress instance) => { 'extractStatus': _$ExtractStatusEnumMap[instance.extractStatus]!, 'extractProgress': instance.extractProgress, }; + +const _$ExtractStatusEnumMap = { + ExtractStatus.none: '', + ExtractStatus.extracting: 'extracting', + ExtractStatus.done: 'done', + ExtractStatus.error: 'error', + ExtractStatus.waitingParts: 'waitingParts', +}; diff --git a/ui/flutter/lib/app/modules/setting/views/setting_view.dart b/ui/flutter/lib/app/modules/setting/views/setting_view.dart index 6be7bb74..b18f2746 100644 --- a/ui/flutter/lib/app/modules/setting/views/setting_view.dart +++ b/ui/flutter/lib/app/modules/setting/views/setting_view.dart @@ -150,6 +150,25 @@ class SettingView extends GetView { ); }); + final buildAutoStartTasks = _buildConfigItem('autoStartTasks', () { + return appController.downloaderConfig.value.extra.autoStartTasks + ? 'on'.tr + : 'off'.tr; + }, (Key key) { + return Container( + alignment: Alignment.centerLeft, + child: Switch( + value: appController.downloaderConfig.value.extra.autoStartTasks, + onChanged: (bool value) async { + appController.downloaderConfig.update((val) { + val!.extra.autoStartTasks = value; + }); + await debounceSave(); + }, + ), + ); + }); + // Archive auto extract configuration final buildAutoExtract = _buildConfigItem('autoExtract', () { return appController.downloaderConfig.value.archive.autoExtract @@ -1394,6 +1413,7 @@ class SettingView extends GetView { buildDownloadCategories(), buildMaxRunning(), buildDefaultDirectDownload(), + buildAutoStartTasks(), buildBrowserExtension(), buildAutoStartup(), buildMenubarMode(), diff --git a/ui/flutter/lib/i18n/langs/de_de.dart b/ui/flutter/lib/i18n/langs/de_de.dart index 96204018..46b59d70 100644 --- a/ui/flutter/lib/i18n/langs/de_de.dart +++ b/ui/flutter/lib/i18n/langs/de_de.dart @@ -41,6 +41,7 @@ const deDE = { 'useServerCtime': 'Serverzeit für die Dateierstellung verwenden', 'maxRunning': 'Maximale Anzahl ausgeführter Aufgaben', 'defaultDirectDownload': 'Direkten Download standardmäßig aktivieren', + 'autoStartTasks': 'Unvollständige Aufgaben beim Start automatisch starten', 'items': '@count Artikel', 'subscribeTracker': 'Abonnement-Tracker', 'subscribeFail': diff --git a/ui/flutter/lib/i18n/langs/en_us.dart b/ui/flutter/lib/i18n/langs/en_us.dart index 5b4e51d5..783111fd 100644 --- a/ui/flutter/lib/i18n/langs/en_us.dart +++ b/ui/flutter/lib/i18n/langs/en_us.dart @@ -38,6 +38,7 @@ const enUS = { 'useServerCtime': 'Use server time for file creation', 'maxRunning': 'Max Running Tasks', 'defaultDirectDownload': 'Check direct download by default', + 'autoStartTasks': 'Auto-start incomplete tasks on startup', 'items': '@count items', 'subscribeTracker': 'Subscribe Tracker', 'subscribeFail': diff --git a/ui/flutter/lib/i18n/langs/es_es.dart b/ui/flutter/lib/i18n/langs/es_es.dart index 36db7049..7bb793f8 100644 --- a/ui/flutter/lib/i18n/langs/es_es.dart +++ b/ui/flutter/lib/i18n/langs/es_es.dart @@ -38,6 +38,7 @@ const esES = { 'connections': 'Conexiones', 'useServerCtime': 'Usar tiempo del servidor para la creación de archivos', 'maxRunning': 'Máximo de Tareas en Ejecución', + 'autoStartTasks': 'Iniciar automáticamente tareas incompletas al arrancar', 'items': '@count elementos', 'subscribeTracker': 'Suscribirse al Tracker', 'subscribeFail': diff --git a/ui/flutter/lib/i18n/langs/fr_fr.dart b/ui/flutter/lib/i18n/langs/fr_fr.dart index 0a8dc9a4..266e5df8 100644 --- a/ui/flutter/lib/i18n/langs/fr_fr.dart +++ b/ui/flutter/lib/i18n/langs/fr_fr.dart @@ -38,6 +38,7 @@ const frFR = { 'useServerCtime': 'Utiliser l\'heure du serveur pour la création de fichier', 'maxRunning': 'Tâches en cours maximum', + 'autoStartTasks': 'Démarrer automatiquement les tâches incomplètes au lancement', 'items': '@count éléments', 'subscribeTracker': 'S\'abonner au tracker', 'subscribeFail': diff --git a/ui/flutter/lib/i18n/langs/ja_jp.dart b/ui/flutter/lib/i18n/langs/ja_jp.dart index 400ac725..94f156fe 100644 --- a/ui/flutter/lib/i18n/langs/ja_jp.dart +++ b/ui/flutter/lib/i18n/langs/ja_jp.dart @@ -29,6 +29,7 @@ const jaJP = { 'downloadDirValid': 'ダウンロードディレクトリを選択してください', 'connections': '接続', 'maxRunning': '最大実行タスク', + 'autoStartTasks': '起動時に未完了のタスクを自動的に開始', 'items': '@count アイテム', 'subscribeTracker': 'トラッカーを購読', 'subscribeFail': '登録に失敗しました。ネットワークを確認するか、後でもう一度お試しください', diff --git a/ui/flutter/lib/i18n/langs/ru_ru.dart b/ui/flutter/lib/i18n/langs/ru_ru.dart index 58965b6d..335405e5 100644 --- a/ui/flutter/lib/i18n/langs/ru_ru.dart +++ b/ui/flutter/lib/i18n/langs/ru_ru.dart @@ -39,6 +39,7 @@ const ruRU = { 'useServerCtime': 'Использовать время сервера для создания файла', 'maxRunning': 'Максимальное количество активных задач', 'defaultDirectDownload': 'Прямая загрузка по умолчанию', + 'autoStartTasks': 'Автоматически запускать незавершённые задачи при старте', 'items': '@подсчет элементов', 'subscribeTracker': 'Подпись трекера', 'subscribeFail': diff --git a/ui/flutter/lib/i18n/langs/zh_cn.dart b/ui/flutter/lib/i18n/langs/zh_cn.dart index 5776aa31..39c4fe9e 100644 --- a/ui/flutter/lib/i18n/langs/zh_cn.dart +++ b/ui/flutter/lib/i18n/langs/zh_cn.dart @@ -38,6 +38,7 @@ const zhCN = { 'useServerCtime': '创建文件使用服务器时间', 'maxRunning': '最大下载数', 'defaultDirectDownload': '默认勾选直接下载', + 'autoStartTasks': '启动时自动开始未完成的任务', 'items': '@count 项', 'subscribeTracker': '订阅 Tracker', 'subscribeFail': '订阅失败,请检查网络或稍后重试', diff --git a/ui/flutter/lib/i18n/langs/zh_tw.dart b/ui/flutter/lib/i18n/langs/zh_tw.dart index 5f01047c..aa162750 100644 --- a/ui/flutter/lib/i18n/langs/zh_tw.dart +++ b/ui/flutter/lib/i18n/langs/zh_tw.dart @@ -38,6 +38,7 @@ const zhTW = { 'useServerCtime': '使用伺服器時間作為檔案建立時間', 'maxRunning': '最大執行任務數', 'defaultDirectDownload': '預設勾選直接下載', + 'autoStartTasks': '啟動時自動開始未完成的任務', 'items': '@count 個項目', 'subscribeTracker': '訂閱 Tracker', 'subscribeFail': '訂閱失敗,請檢查網路或稍後再試', diff --git a/ui/flutter/lib/main.dart b/ui/flutter/lib/main.dart index d651ab32..da749f34 100644 --- a/ui/flutter/lib/main.dart +++ b/ui/flutter/lib/main.dart @@ -133,6 +133,16 @@ Future init(Args args) async { logger.e("load config fail", e); } + // Auto-start incomplete tasks if enabled + if (controller.downloaderConfig.value.extra.autoStartTasks) { + try { + await api.continueAllTasks(null); + logger.i("auto-start tasks completed"); + } catch (e) { + logger.w("auto-start tasks fail", e); + } + } + () async { if (Util.isDesktop()) { try {