diff --git a/app/run.py b/app/run.py index abb33d5..15eee65 100644 --- a/app/run.py +++ b/app/run.py @@ -486,6 +486,31 @@ def get_data(): data["plugins"]["alist"]["storage_id"] ) + # 初始化插件配置模式(如果不存在) + if "plugin_config_mode" not in data: + data["plugin_config_mode"] = { + "aria2": "independent", + "alist_strm_gen": "independent", + "emby": "independent" + } + + # 初始化全局插件配置(如果不存在) + if "global_plugin_config" not in data: + data["global_plugin_config"] = { + "aria2": { + "auto_download": True, + "pause": False, + "auto_delete_quark_files": False + }, + "alist_strm_gen": { + "auto_gen": True + }, + "emby": { + "try_match": True, + "media_id": "" + } + } + # 发送webui信息,但不发送密码原文 data["webui"] = { "username": config_data["webui"]["username"], @@ -505,6 +530,7 @@ def sync_task_plugins_config(): 4. 保留原有的自定义配置 5. 只处理已启用的插件(通过PLUGIN_FLAGS检查) 6. 清理被禁用插件的配置 + 7. 应用全局插件配置(如果启用) """ global config_data, task_plugins_config_default @@ -516,6 +542,10 @@ def sync_task_plugins_config(): disabled_plugins = set() if PLUGIN_FLAGS: disabled_plugins = {name.lstrip('-') for name in PLUGIN_FLAGS.split(',')} + + # 获取插件配置模式 + plugin_config_mode = config_data.get("plugin_config_mode", {}) + global_plugin_config = config_data.get("global_plugin_config", {}) # 遍历所有任务 for task in config_data["tasklist"]: @@ -533,23 +563,31 @@ def sync_task_plugins_config(): # 跳过被禁用的插件 if plugin_name in disabled_plugins: continue - - # 如果任务中没有该插件的配置,添加默认配置 - if plugin_name not in task["addition"]: - task["addition"][plugin_name] = default_config.copy() - else: - # 如果任务中有该插件的配置,检查是否有新的配置项 - current_config = task["addition"][plugin_name] - # 确保current_config是字典类型 - if not isinstance(current_config, dict): - # 如果不是字典类型,使用默认配置 + + # 检查是否使用全局配置模式 + if plugin_name in plugin_config_mode and plugin_config_mode[plugin_name] == "global": + # 使用全局配置 + if plugin_name in global_plugin_config: + task["addition"][plugin_name] = global_plugin_config[plugin_name].copy() + else: task["addition"][plugin_name] = default_config.copy() - continue - - # 遍历默认配置的每个键值对 - for key, default_value in default_config.items(): - if key not in current_config: - current_config[key] = default_value + else: + # 使用独立配置 + if plugin_name not in task["addition"]: + task["addition"][plugin_name] = default_config.copy() + else: + # 如果任务中有该插件的配置,检查是否有新的配置项 + current_config = task["addition"][plugin_name] + # 确保current_config是字典类型 + if not isinstance(current_config, dict): + # 如果不是字典类型,使用默认配置 + task["addition"][plugin_name] = default_config.copy() + continue + + # 遍历默认配置的每个键值对 + for key, default_value in default_config.items(): + if key not in current_config: + current_config[key] = default_value def parse_comma_separated_config(value): @@ -1528,6 +1566,31 @@ def init(): if plugin_name in disabled_plugins: del task["addition"][plugin_name] + # 初始化插件配置模式(如果不存在) + if "plugin_config_mode" not in config_data: + config_data["plugin_config_mode"] = { + "aria2": "independent", + "alist_strm_gen": "independent", + "emby": "independent" + } + + # 初始化全局插件配置(如果不存在) + if "global_plugin_config" not in config_data: + config_data["global_plugin_config"] = { + "aria2": { + "auto_download": True, + "pause": False, + "auto_delete_quark_files": False + }, + "alist_strm_gen": { + "auto_gen": True + }, + "emby": { + "try_match": True, + "media_id": "" + } + } + # 同步更新任务的插件配置 sync_task_plugins_config() diff --git a/app/templates/index.html b/app/templates/index.html index 317a9b1..846c703 100644 --- a/app/templates/index.html +++ b/app/templates/index.html @@ -554,6 +554,32 @@ :placeholder="getPluginConfigPlaceholder(pluginName, key)" :title="getPluginConfigHelp(pluginName, key)"> + +
+
+ 插件配置模式 +
+ +
+ +
+
+
+ +
+ + +
+
@@ -1096,10 +1122,10 @@ -
+
- +
@@ -2023,10 +2049,10 @@ -
+
- +
@@ -2111,6 +2137,25 @@ api_page_size: 200, cache_expire_time: 30, discovery_items_count: 30 + }, + plugin_config_mode: { + aria2: "independent", + alist_strm_gen: "independent", + emby: "independent" + }, + global_plugin_config: { + aria2: { + auto_download: true, + pause: false, + auto_delete_quark_files: false + }, + alist_strm_gen: { + auto_gen: true + }, + emby: { + try_match: true, + media_id: "" + } } }, userInfoList: [], // 用户信息列表 @@ -2743,6 +2788,139 @@ return ''; }, + // 获取插件任务配置 + getPluginTaskConfig(pluginName) { + const taskConfigs = { + aria2: { + auto_download: true, + pause: false, + auto_delete_quark_files: false + }, + alist_strm_gen: { + auto_gen: true + }, + emby: { + try_match: true, + media_id: "" + } + }; + return taskConfigs[pluginName] || {}; + }, + + // 获取插件配置模式的帮助文本 + getPluginConfigModeHelp(pluginName) { + return "选择插件的配置模式:独立配置允许每个任务单独设置,全局配置则所有任务共享同一套设置,且只能在系统配置页面修改"; + }, + + // 获取插件任务配置的帮助文本 + getPluginTaskConfigHelp(pluginName, key) { + const helpTexts = { + aria2: { + auto_download: "是否自动添加下载任务", + pause: "添加任务后为暂停状态,不自动开始(手动下载)", + auto_delete_quark_files: "是否在添加下载任务后自动删除夸克网盘文件" + }, + alist_strm_gen: { + auto_gen: "是否自动生成 strm 文件" + }, + emby: { + try_match: "是否尝试匹配", + media_id: "媒体ID,当为0时不刷新" + } + }; + return helpTexts[pluginName]?.[key] || ''; + }, + + // 获取插件任务配置的占位符文本 + getPluginTaskConfigPlaceholder(pluginName, key) { + const placeholders = { + aria2: { + auto_download: "", + pause: "", + auto_delete_quark_files: "" + }, + alist_strm_gen: { + auto_gen: "" + }, + emby: { + try_match: "", + media_id: "输入媒体ID,留空则自动匹配" + } + }; + return placeholders[pluginName]?.[key] || ''; + }, + + // 检查插件配置是否被禁用 + isPluginConfigDisabled(task) { + for (const pluginName of ['aria2', 'alist_strm_gen', 'emby']) { + if (this.formData.plugin_config_mode[pluginName] === 'global') { + return true; + } + } + return false; + }, + + // 插件配置模式改变时的处理 + onPluginConfigModeChange(pluginName) { + if (this.formData.plugin_config_mode[pluginName] === 'global') { + // 切换到全局模式时,初始化全局配置 + if (!this.formData.global_plugin_config[pluginName]) { + this.formData.global_plugin_config[pluginName] = { ...this.getPluginTaskConfig(pluginName) }; + } + } + + // 更新新任务的配置,应用全局配置 + this.applyGlobalPluginConfig(this.newTask); + + // 更新影视发现页面创建任务的配置,应用全局配置 + if (this.createTask && this.createTask.taskData) { + this.applyGlobalPluginConfig(this.createTask.taskData); + } + }, + + // 全局插件配置改变时的处理 + onGlobalPluginConfigChange() { + // 更新新任务的配置,应用全局配置 + this.applyGlobalPluginConfig(this.newTask); + + // 更新影视发现页面创建任务的配置,应用全局配置 + if (this.createTask && this.createTask.taskData) { + this.applyGlobalPluginConfig(this.createTask.taskData); + } + }, + + // 应用全局插件配置到任务 + applyGlobalPluginConfig(task) { + if (!task.addition) { + task.addition = {}; + } + + for (const pluginName of ['aria2', 'alist_strm_gen', 'emby']) { + if (this.formData.plugin_config_mode[pluginName] === 'global') { + // 应用全局配置到任务 + task.addition[pluginName] = { ...this.formData.global_plugin_config[pluginName] }; + } + } + }, + + + + // 获取插件配置的悬停提示文本 + getPluginConfigTitle(task) { + if (this.isPluginConfigDisabled(task)) { + return `单个任务的插件配置,具体键值由插件定义,当前有部分插件使用了全局配置模式,在该模式下对应的配置选项将被锁定,若要修改配置,请前往系统配置页面进行操作,查阅Wiki了解详情`; + } + return "单个任务的插件配置,具体键值由插件定义,查阅Wiki了解详情"; + }, + + // 获取创建任务时的插件配置悬停提示文本 + getCreateTaskPluginConfigTitle() { + if (this.isPluginConfigDisabled(this.createTask.taskData)) { + return `单个任务的插件配置,具体键值由插件定义,当前有部分插件使用了全局配置模式,在该模式下对应的配置选项将被锁定,若要修改配置,请前往系统配置页面进行操作,查阅Wiki了解详情`; + } + return "单个任务的插件配置,具体键值由插件定义,查阅Wiki了解详情"; + }, + fetchUserInfo() { // 获取所有cookie对应的用户信息 axios.get('/get_user_info') @@ -3153,7 +3331,9 @@ if (!this.taskDirs.includes(parentDir)) this.taskDirs.push(parentDir); }); - this.newTask.addition = config_data.task_plugins_config_default; + // 初始化新任务的插件配置,应用全局配置 + this.newTask.addition = { ...config_data.task_plugins_config_default }; + this.applyGlobalPluginConfig(this.newTask); // 确保source配置存在 if (!config_data.source) { config_data.source = {}; @@ -3297,6 +3477,9 @@ task.episode_naming = task.pattern; } } + + // 应用全局插件配置 + this.applyGlobalPluginConfig(task); }); } @@ -3368,6 +3551,9 @@ newTask.replace = lastTask.replace || ""; } + // 应用全局插件配置到新任务 + this.applyGlobalPluginConfig(newTask); + this.formData.tasklist.push(newTask) const index = this.formData.tasklist.length - 1; @@ -7548,9 +7734,10 @@ this.createTask.taskData.startfid = ""; this.createTask.taskData.update_subdir = ""; - // 设置默认的插件配置 + // 设置默认的插件配置,并应用全局配置 if (this.formData.task_plugins_config_default) { this.createTask.taskData.addition = { ...this.formData.task_plugins_config_default }; + this.applyGlobalPluginConfig(this.createTask.taskData); } return; } @@ -7644,9 +7831,10 @@ this.createTask.taskData.startfid = ""; this.createTask.taskData.update_subdir = ""; - // 设置默认的插件配置 + // 设置默认的插件配置,并应用全局配置 if (this.formData.task_plugins_config_default) { this.createTask.taskData.addition = { ...this.formData.task_plugins_config_default }; + this.applyGlobalPluginConfig(this.createTask.taskData); } }, isUsingCustomTaskSettingsForType(taskSettings, contentType) { @@ -7974,6 +8162,9 @@ // 创建新任务 const newTask = { ...this.createTask.taskData }; + // 应用全局插件配置 + this.applyGlobalPluginConfig(newTask); + // 处理命名模式 if (newTask.use_sequence_naming) { newTask.pattern = newTask.sequence_naming; @@ -8034,6 +8225,9 @@ // 创建新任务 const newTask = { ...this.createTask.taskData }; + // 应用全局插件配置 + this.applyGlobalPluginConfig(newTask); + // 处理命名模式 if (newTask.use_sequence_naming) { newTask.pattern = newTask.sequence_naming; @@ -8103,6 +8297,9 @@ // 创建新任务 const newTask = { ...this.createTask.taskData }; + // 应用全局插件配置 + this.applyGlobalPluginConfig(newTask); + // 处理命名模式 if (newTask.use_sequence_naming) { newTask.pattern = newTask.sequence_naming; diff --git a/plugins/aria2.py b/plugins/aria2.py index a1b3b7e..7646a16 100644 --- a/plugins/aria2.py +++ b/plugins/aria2.py @@ -45,7 +45,7 @@ class Aria2: "dir": "/downloads", # 下载目录,需要Aria2有权限访问 } default_task_config = { - "auto_download": False, # 是否自动添加下载任务 + "auto_download": True, # 是否自动添加下载任务 "pause": False, # 添加任务后为暂停状态,不自动开始(手动下载) "auto_delete_quark_files": False, # 是否在添加下载任务后自动删除夸克网盘文件 }