@@ -66,6 +66,17 @@ def parse_tv_title_to_remark(s):
6666 return None
6767 remark = parse_tv_title_to_remark (title ) or parse_tv_title_to_remark (text )
6868
69+ def parse_second_level (s ):
70+ if not s :
71+ return None
72+ m = re .search (r"类别[::]\s*([^\n\r,,;;]+)" , s )
73+ if m :
74+ val = m .group (1 ).strip ()
75+ # 清理可能的括号说明等
76+ val = re .sub (r"\s+" , " " , val )
77+ return val if val else None
78+ return None
79+
6980 if remark :
7081 delay = req .get ('delay' , None )
7182 def _read_env_file (key ):
@@ -168,13 +179,23 @@ def _is_tv(s):
168179 tv_src = os .getenv ('TVsource' ) or ''
169180 mov_src = os .getenv ('MOVsource' ) or ''
170181 media_root = tv_src if tv_flag else mov_src
182+ # 二级目录开关
183+ second_level_enable = (os .getenv ('SECOND' , 'false' ).lower () in ['1' ,'true' ,'yes' ])
184+ second_level = parse_second_level (title or '' ) or parse_second_level (text or '' )
171185 has_src = False
172186
173187 # 尝试查找源目录,支持半角冒号转全角冒号
174188 final_remark = remark
175189 if client is not None :
176190 try :
177- dirs = client .filePathList (media_root )
191+ # 当启用二级目录且存在二级名称时,优先在二级目录下查找
192+ root_for_list = media_root
193+ if second_level_enable and second_level :
194+ try :
195+ root_for_list = re .sub (r"/{2,}" , "/" , f"{ media_root .rstrip ('/' )} /{ second_level } " )
196+ except Exception :
197+ root_for_list = media_root
198+ dirs = client .filePathList (root_for_list )
178199 names = [d ['path' ] for d in dirs ]
179200 if remark in names :
180201 has_src = True
@@ -268,7 +289,11 @@ def max_replacer(match):
268289
269290 return re .sub (r"(^|.*?/)([^/]*)\{max\}" , max_replacer , path_str )
270291
271- srcPath = f"{ media_root .rstrip ('/' )} /{ remark } /"
292+ # 组装源目录(支持二级目录)
293+ if second_level_enable and second_level :
294+ srcPath = f"{ media_root .rstrip ('/' )} /{ second_level } /{ remark } /"
295+ else :
296+ srcPath = f"{ media_root .rstrip ('/' )} /{ remark } /"
272297 dst_env = os .getenv ('DST_TV_TARGETS' ) if tv_flag else os .getenv ('DST_MOV_TARGETS' )
273298 dsts = []
274299 if dst_env and client is not None :
@@ -280,10 +305,17 @@ def max_replacer(match):
280305 if not base .startswith ('/' ):
281306 base = '/' + base
282307 base = re .sub (r"/{2,}" , "/" , base ).rstrip ('/' )
283- exists_dirs = client .filePathList (base )
308+ # 二级目录下的存在性检测
309+ base_for_list = base
310+ if second_level_enable and second_level :
311+ base_for_list = f"{ base } /{ second_level } "
312+ exists_dirs = client .filePathList (base_for_list )
284313 names = [d ['path' ] for d in exists_dirs ]
285314 if remark in names :
286- dsts = [f"{ base } /{ remark } /" ]
315+ if second_level_enable and second_level :
316+ dsts = [f"{ base } /{ second_level } /{ remark } /" ]
317+ else :
318+ dsts = [f"{ base } /{ remark } /" ]
287319 break
288320 except Exception :
289321 pass
@@ -297,7 +329,10 @@ def max_replacer(match):
297329 if not base .startswith ('/' ):
298330 base = '/' + base
299331 base = re .sub (r"/{2,}" , "/" , base ).rstrip ('/' )
300- dsts .append (f"{ base } /{ remark } /" )
332+ if second_level_enable and second_level :
333+ dsts .append (f"{ base } /{ second_level } /{ remark } /" )
334+ else :
335+ dsts .append (f"{ base } /{ remark } /" )
301336 else :
302337 try :
303338 notify_list = notifyService .getNotifyList (True )
0 commit comments