@@ -12,6 +12,35 @@ def handleWebhook(req):
1212 }
1313 title = None
1414 text = None
15+ if isinstance (req , dict ):
16+ # 兼容 apikey 在第一层的情况,无论是否在 title/text 中找到
17+ if 'apikey' in req :
18+ req_apikey_val = str (req .get ('apikey' )).strip ()
19+ # 临时存入 req 以便后续验证逻辑使用(虽然 req 本身就是 dict,但为了逻辑清晰)
20+ req ['apikey' ] = req_apikey_val
21+
22+ # API Key 验证逻辑(前置)
23+ # 只要配置了 API Key,无论是否解析出 remark,都要验证
24+ # 注意:必须在 parse_tv_title_to_remark 之前验证,因为如果 title/text 为 None,
25+ # 之前的逻辑会直接跳过。但现在我们需要在这里拦截。
26+ # 从 req 中获取 apikey(如果是 dict)
27+ req_key = None
28+ if isinstance (req , dict ):
29+ req_key = (req .get ('apikey' ) or '' ).strip ()
30+
31+ api_key_env = (os .getenv ('WEBHOOK_APIKEY' ) or '' ).strip ()
32+ # 只有当环境变量中有值,且值不为空时,才进行验证
33+ # 如果环境变量配置了但为空(如 WEBHOOK_APIKEY=),则视为不启用验证
34+ if api_key_env :
35+ if req_key != api_key_env :
36+ try :
37+ import logging
38+ logging .getLogger ().warning (f"Webhook ignored: apikey mismatch. Expecting configured key, got '{ req_key } '" )
39+ except Exception :
40+ pass
41+ result ['job' ] = 'ignored: apikey mismatch'
42+ return result
43+
1544 if isinstance (req , dict ):
1645 title = req .get ('title' )
1746 text = req .get ('text' )
@@ -26,14 +55,17 @@ def parse_tv_title_to_remark(s):
2655 return None
2756 if '已入库' not in s :
2857 return None
29- m = re .search (r"\s*(.+?\(\d{4}\))\s*(S\d{1,2}|E\d{1,3}|E\d{1,3}-E?\d{1,3})?\s*已入库" , s )
58+ # 优化正则:支持 "剧名 (年份) S01 E01 已入库" 或 "剧名 (年份) S01E01 已入库" 等多种格式
59+ # 只要能提取出 "剧名 (年份)" 即可,中间的内容不做严格限制
60+ m = re .search (r"\s*(.+?\(\d{4}\)).*?已入库" , s )
3061 if m :
3162 return m .group (1 ).strip ()
3263 m2 = re .search (r"^\s*(.+?\(\d{4}\))" , s )
3364 if m2 :
3465 return m2 .group (1 ).strip ()
3566 return None
3667 remark = parse_tv_title_to_remark (title ) or parse_tv_title_to_remark (text )
68+
3769 if remark :
3870 delay = req .get ('delay' , None )
3971 def _read_env_file (key ):
@@ -60,6 +92,7 @@ def _read_env_file(key):
6092 except Exception :
6193 delay = 30
6294 def _trigger ():
95+ nonlocal remark
6396 try :
6497 import logging
6598 lg = logging .getLogger ()
@@ -136,13 +169,33 @@ def _is_tv(s):
136169 mov_src = os .getenv ('MOVsource' ) or ''
137170 media_root = tv_src if tv_flag else mov_src
138171 has_src = False
172+
173+ # 尝试查找源目录,支持半角冒号转全角冒号
174+ final_remark = remark
139175 if client is not None :
140176 try :
141177 dirs = client .filePathList (media_root )
142178 names = [d ['path' ] for d in dirs ]
143- has_src = remark in names
179+ if remark in names :
180+ has_src = True
181+ elif ':' in remark :
182+ # 尝试将半角冒号替换为全角冒号
183+ remark_cn = remark .replace (':' , ':' )
184+ if remark_cn in names :
185+ has_src = True
186+ final_remark = remark_cn
187+ elif ':' in remark :
188+ # 尝试将全角冒号替换为半角冒号
189+ remark_en = remark .replace (':' , ':' )
190+ if remark_en in names :
191+ has_src = True
192+ final_remark = remark_en
144193 except Exception :
145194 has_src = False
195+
196+ # 更新 remark 为实际存在的目录名(如果有替换)
197+ remark = final_remark
198+
146199 force_create = False
147200 try :
148201 force_create = bool (req .get ('force' , False )) or (os .getenv ('WEBHOOK_FORCE_CREATE' , 'false' ).lower () in ['1' ,'true' ,'yes' ])
0 commit comments