From 967a363d8745373d172f31c743420f76e846c881 Mon Sep 17 00:00:00 2001 From: x1ao4 Date: Sun, 31 Aug 2025 07:59:50 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20PanSou=20=E6=8F=92?= =?UTF-8?q?=E4=BB=B6=E8=B5=84=E6=BA=90=E5=8F=91=E5=B8=83=E6=97=B6=E9=97=B4?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E9=94=99=E8=AF=AF=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 简化时间处理规则:只有 TG 来源需要 +8 小时 - 其他所有来源(Unknown、Plugin 等)都不 +8 小时 - 修正前端 formatPublishDate 函数的判断逻辑 - 确保时间显示准确,避免错误的时间转换 --- app/sdk/pansou.py | 41 ++++++++++++++++++++++++++++++++++++---- app/templates/index.html | 23 +++++++++++++++------- 2 files changed, 53 insertions(+), 11 deletions(-) diff --git a/app/sdk/pansou.py b/app/sdk/pansou.py index 2adf95d..9184217 100644 --- a/app/sdk/pansou.py +++ b/app/sdk/pansou.py @@ -24,10 +24,33 @@ class PanSou: except Exception as e: return {"success": False, "message": str(e)} + def _get_pansou_source(self, result_item: dict, merged_item: dict = None) -> str: + """ + 获取PanSou内部来源信息 + 返回格式: + - "tg:频道名称" - 来自Telegram频道,需要+8小时 + - "plugin:插件名" - 来自指定插件,不+8小时 + - "unknown" - 未知来源,不+8小时 + """ + # 优先从 results 的 channel 字段判断 + if result_item and result_item.get("channel"): + channel = result_item.get("channel", "").strip() + if channel: + return f"tg:{channel}" + + # 从 merged_by_type 的 source 字段获取 + if merged_item and merged_item.get("source"): + source = merged_item.get("source", "").strip() + if source: + return source + + # 默认返回 unknown + return "unknown" + def search(self, keyword: str): """ 搜索资源(仅返回夸克网盘结果) - 返回:{"success": True, "data": [{taskname, content, shareurl, tags[]}]} + 返回:{"success": True, "data": [{taskname, content, shareurl, tags[], pansou_source}]} """ if not self.server: return {"success": False, "message": "PanSou未配置服务器"} @@ -82,6 +105,9 @@ class PanSou: content = result_item.get("content", "") datetime_str = result_item.get("datetime", "") # 获取发布日期 + # 获取PanSou内部来源 + pansou_source = self._get_pansou_source(result_item) + # 从 links 获取具体链接 links = result_item.get("links", []) if isinstance(links, list): @@ -96,7 +122,8 @@ class PanSou: "shareurl": url, "tags": [link_type] if link_type else (result_item.get("tags", []) or []), "publish_date": datetime_str, # 原始时间(可能是 ISO) - "source": "PanSou" # 添加来源标识 + "source": "PanSou", # 添加来源标识 + "pansou_source": pansou_source # 添加PanSou内部来源 }) # 2) merged_by_type: 兜底解析,使用 note 字段作为标题 @@ -112,6 +139,10 @@ class PanSou: note = link.get("note", "") # 使用 note 字段作为标题 note = strip_links(note) datetime_str = link.get("datetime", "") # 获取发布日期 + + # 获取PanSou内部来源 + pansou_source = self._get_pansou_source(None, link) + if url: cleaned.append({ "taskname": note, @@ -119,7 +150,8 @@ class PanSou: "shareurl": url, "tags": [cloud_type] if cloud_type else [], "publish_date": datetime_str, # 原始时间 - "source": "PanSou" # 添加来源标识 + "source": "PanSou", # 添加来源标识 + "pansou_source": pansou_source # 添加PanSou内部来源 }) # 3) 直接 data 数组兜底 @@ -132,7 +164,8 @@ class PanSou: "shareurl": item.get("url", ""), "tags": item.get("tags", []) or [], "publish_date": item.get("datetime", ""), # 原始时间 - "source": "PanSou" # 添加来源标识 + "source": "PanSou", # 添加来源标识 + "pansou_source": "unknown" # 兜底来源 }) except Exception as e: diff --git a/app/templates/index.html b/app/templates/index.html index 539c794..6d0c6f5 100644 --- a/app/templates/index.html +++ b/app/templates/index.html @@ -1038,7 +1038,7 @@ {{ suggestion.taskname }} · {{ suggestion.shareurl.replace(/^https?:\/\/pan\.quark\.cn\/s\//, '') }} - + @@ -1966,7 +1966,7 @@ {{ suggestion.taskname }} · {{ suggestion.shareurl.replace(/^https?:\/\/pan\.quark\.cn\/s\//, '') }} - + @@ -6724,7 +6724,7 @@ return isNaN(ts) ? 0 : ts; }, // 规范化资源发布日期展示:将 ISO 格式(含 T/Z/偏移)转为 "YYYY-MM-DD HH:mm:ss" - formatPublishDate(value) { + formatPublishDate(value, pansouSource = null, source = null) { if (!value) return ''; const s = String(value).trim(); @@ -6735,8 +6735,14 @@ const m = /^(\d{4})-(\d{2})-(\d{2})[T ](\d{2}):(\d{2}):(\d{2})/.exec(s); if (m) { const [, y, mo, d, h, mi, se] = m; - // 修复时区问题:如果时间以Z结尾或包含T,说明是UTC时间,需要+8小时 - if (s.includes('T') || s.includes('Z')) { + // 判断是否需要+8小时: + // 1. 如果是PanSou的tg来源,需要+8小时 + // 2. 如果是CloudSaver来源,需要+8小时 + // 3. 其他来源都不+8小时 + const needAdd8Hours = (pansouSource && pansouSource.startsWith('tg:')) || + (source === 'CloudSaver'); + + if (needAdd8Hours) { // 创建Date对象并加上8小时 const date = new Date(Number(y), Number(mo) - 1, Number(d), Number(h), Number(mi), Number(se)); date.setHours(date.getHours() + 8); @@ -6755,8 +6761,11 @@ out = out.replace(/Z$/i, ''); out = out.replace(/([+-]\d{2}:?\d{2})$/i, ''); - // 如果原始时间包含T或Z,说明是UTC时间,需要+8小时 - if (s.includes('T') || s.includes('Z')) { + // 判断是否需要+8小时 + const needAdd8Hours = (pansouSource && pansouSource.startsWith('tg:')) || + (source === 'CloudSaver'); + + if (needAdd8Hours) { try { const date = new Date(out); if (!isNaN(date.getTime())) {