diff --git a/README.md b/README.md index f644469..29e0e4b 100644 --- a/README.md +++ b/README.md @@ -14,12 +14,13 @@ - **文件整理**:支持浏览和管理多个夸克账号的网盘文件,支持单项/批量重命名(支持应用完整的命名、过滤规则和撤销重命名等操作)、移动文件、删除文件、新建文件夹等操作。 - **更新状态**:支持在任务列表页面显示任务的最近更新日期、最近转存文件,支持在任务列表、转存记录、文件整理页面显示当日更新标识(对于当日更新的内容)。 - **影视发现**:支持在影视发现页面浏览豆瓣热门影视榜单,一键快速创建任务,智能填充任务配置,实现便捷订阅。 -- **任务筛选**:支持在任务列表页面按照任务类型(如剧集、动画、综艺等)筛选任务,在对应的筛选视图下创建任务将会自动继承同类任务的基础配置,便于自动填充任务配置。 +- **类型筛选**:支持在任务列表页面按照任务类型(如剧集、动画、综艺等)筛选任务,在对应的筛选视图下创建任务将会自动继承同类任务的基础配置,便于自动填充任务配置。 - **任务排序**:支持在任务列表页面按照任务编号、任务名称、任务进度和更新时间进行排序,支持升序和降序排列。 - **任务视图**:支持在任务列表页面使用列表视图和海报视图两种视图浏览和管理任务,海报视图将通过 TMDB 与任务对应的电视节目进行匹配,并显示对应的节目海报。 - **任务匹配**:在配置了 TMDB API 密钥后,所有任务将自动通过 TMDB 进行元数据匹配,匹配后将获取电视节目的海报和元数据,丰富任务相关信息的展示,包括集数信息统计、当前任务进度和电视节目状态等。 - **追剧日历**:支持在追剧日历页面查看和浏览任务对应电视节目的信息和播出时间表,追踪电视节目的播出情况,了解任务的完成进度。追剧日历支持海报视图和日历视图两种视图,可方便快捷的了解订阅内容的实时状态。 - **字幕命名规则**:支持在全局设置字幕文件的语言代码后缀,在重命名字幕文件时自动添加语言代码后缀,如 `.zh.srt`、`.zh.ass` 等。 +- **状态筛选**:支持在任务列表、转存记录、追剧日历页面按照任务状态(进度状态或对应节目状态)筛选任务(记录或节目),便于筛除次要信息。 本项目修改后的版本为个人需求定制版,目的是满足我自己的使用需求,某些(我不用的)功能可能会因为修改而出现 BUG,不一定会被修复。若你要使用本项目,请知晓本人不是程序员,我无法保证本项目的稳定性,如果你在使用过程中发现了 BUG,可以在 Issues 中提交,但不保证每个 BUG 都能被修复,请谨慎使用,风险自担。 diff --git a/app/run.py b/app/run.py index 863611e..19b0b16 100644 --- a/app/run.py +++ b/app/run.py @@ -1855,8 +1855,12 @@ def run_script_now(): if tasklist: process_env["TASKLIST"] = json.dumps(tasklist, ensure_ascii=False) # 添加原始任务索引的环境变量 - if len(tasklist) == 1 and 'original_index' in request.json: - process_env["ORIGINAL_TASK_INDEX"] = str(request.json['original_index']) + if len(tasklist) == 1: + # 单任务手动运行:前端传入 original_index,用于日志展示 + if 'original_index' in request.json: + process_env["ORIGINAL_TASK_INDEX"] = str(request.json['original_index']) + # 单任务手动运行应忽略执行周期和任务进度限制(包括自动模式下进度100%也要执行) + process_env["IGNORE_EXECUTION_RULES"] = "1" process = subprocess.Popen( command, stdout=subprocess.PIPE, @@ -3622,6 +3626,18 @@ def get_history_records(): # 获取筛选参数 task_name_filter = request.args.get("task_name", "") keyword_filter = request.args.get("keyword", "") + task_names_raw = request.args.get("task_names", "") + task_name_list = [] + if task_names_raw: + try: + decoded_names = json.loads(task_names_raw) + if isinstance(decoded_names, list): + task_name_list = [ + str(name).strip() for name in decoded_names + if isinstance(name, (str, bytes)) and str(name).strip() + ] + except Exception: + task_name_list = [] # 是否只请求所有任务名称 get_all_task_names = request.args.get("get_all_task_names", "").lower() in ["true", "1", "yes"] @@ -3644,6 +3660,7 @@ def get_history_records(): order=order, task_name_filter=task_name_filter, keyword_filter=keyword_filter, + task_name_list=task_name_list, exclude_task_names=["rename", "undo_rename"] ) # 添加所有任务名称到结果中 @@ -3665,6 +3682,7 @@ def get_history_records(): order=order, task_name_filter=task_name_filter, keyword_filter=keyword_filter, + task_name_list=task_name_list, exclude_task_names=["rename", "undo_rename"] ) diff --git a/app/sdk/db.py b/app/sdk/db.py index 77ecc53..3f70771 100644 --- a/app/sdk/db.py +++ b/app/sdk/db.py @@ -167,7 +167,8 @@ class RecordDB: @retry_on_locked(max_retries=3, base_delay=0.1) def get_records(self, page=1, page_size=20, sort_by="transfer_time", order="desc", - task_name_filter="", keyword_filter="", exclude_task_names=None): + task_name_filter="", keyword_filter="", exclude_task_names=None, + task_name_list=None): """获取转存记录列表,支持分页、排序和筛选 Args: @@ -178,6 +179,7 @@ class RecordDB: task_name_filter: 任务名称筛选条件(精确匹配) keyword_filter: 关键字筛选条件(模糊匹配任务名、转存为名称) exclude_task_names: 需要排除的任务名称列表 + task_name_list: 任务名称集合(包含多个任务名时使用IN筛选) """ cursor = self.conn.cursor() offset = (page - 1) * page_size @@ -208,6 +210,11 @@ class RecordDB: where_clauses.append("task_name NOT IN ({})".format(",".join(["?" for _ in exclude_task_names]))) params.extend(exclude_task_names) + if task_name_list: + placeholders = ",".join(["?" for _ in task_name_list]) + where_clauses.append(f"task_name IN ({placeholders})") + params.extend(task_name_list) + where_clause = " AND ".join(where_clauses) where_sql = f"WHERE {where_clause}" if where_clause else "" diff --git a/app/static/css/main.css b/app/static/css/main.css index 9ae107f..85e8db1 100644 --- a/app/static/css/main.css +++ b/app/static/css/main.css @@ -3244,6 +3244,13 @@ div.jsoneditor-treepath * { height: 32px; display: flex; align-items: center; + white-space: nowrap; + flex-shrink: 0; +} + +.pagination-settings .btn { + white-space: nowrap; + flex-shrink: 0; } /* 分页下拉菜单样式 */ @@ -7994,6 +8001,8 @@ div:has(> .collapse:not(.show)):has(+ .row.title[title^="资源搜索"]) { border-radius: 0 6px 6px 0; background: var(--button-gray-background-color) !important; font-size: 0.95rem; /* 与左侧类型按钮一致 */ + white-space: nowrap; + flex-shrink: 0; } /* 兼容旧结构:若存在下拉菜单 DOM,最小宽度不小于 160px */ @@ -8101,6 +8110,37 @@ div:has(> .collapse:not(.show)):has(+ .row.title[title^="资源搜索"]) { top: 0.5px; } +/* 任务列表:顶部筛选框列间距改为 8px */ +.tasklist-filter-row { + margin-left: -4px; + margin-right: -4px; + row-gap: 8px; +} +.tasklist-filter-row > [class*="col-"] { + padding-left: 4px; + padding-right: 4px; + margin-bottom: 0 !important; +} + +.tasklist-filter-row > [class*="col-"]:last-child { + margin-bottom: 0 !important; +} + +@media (min-width: 768px) { + .tasklist-filter-row { + display: flex; + flex-wrap: nowrap; + } + .tasklist-filter-row > [class*="col-"] { + flex: 1 1 0; + max-width: 33.3333%; + min-width: 0; + } + .tasklist-filter-row .input-group { + width: 100%; + } +} + /* 任务列表视图切换按钮的图标大小,统一为与追剧日历相同 */ .tasklist-view-toggle-btn i.bi-grid-3x3-gap { /* 切换至海报视图图标 */ color: var(--dark-text-color); @@ -8339,4 +8379,40 @@ div:has(> .collapse:not(.show)):has(+ .row.title[title^="资源搜索"]) { .crontab-link:hover { color: var(--focus-border-color); text-decoration: none; +} + +/* 任务列表:任务数量指示器 */ +.tasklist-count-indicator { + min-width: 32px; + height: 32px; + border-radius: 6px; + border: 1px solid var(--border-color); + background-color: var(--button-gray-background-color); + color: var(--dark-text-color); + display: inline-flex; + align-items: center; + justify-content: center; + padding: 0 8px; + font-size: 0.95rem; + line-height: 32px; + user-select: none; + cursor: default; + flex-shrink: 0; + white-space: nowrap; + box-sizing: border-box; +} + +/* 任务数量指示器悬停时显示文本光标,和其他标题框一致 */ +.tasklist-count-single-digit { + width: 32px; + padding: 0; +} + +.tasklist-count-number { + cursor: text; + user-select: text; +} + +.calendar-filter-row { + margin-bottom: 20px; /* 桌面端保持与下方组件净间距 8px(抵消分类与控制按钮的 -12px 上移) */ } \ No newline at end of file diff --git a/app/templates/index.html b/app/templates/index.html index 58a4228..25a30e5 100644 --- a/app/templates/index.html +++ b/app/templates/index.html @@ -967,8 +967,8 @@
-
-
+
+
名称筛选 @@ -979,14 +979,14 @@
-
+
任务筛选
- + @@ -996,6 +996,30 @@
+
+
+
+ 状态筛选 +
+
+ +
+
+ +
+
+
@@ -1033,6 +1057,13 @@ {{ tasklistSort.order === 'asc' ? '升序排列' : '降序排列' }}
+ +
+ {{ tasklistVisibleCount }} +