Skip to content

Commit 5df41b5

Browse files
author
Taois
committed
feat:发个版本修复上个版本问题
1 parent 8374c04 commit 5df41b5

27 files changed

+555
-2243
lines changed

README.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# drpyS(drpy-node)
22

33
nodejs作为服务端的drpy实现。全面升级异步写法
4-
~~积极开发中,每日一更~~,当前进度 `99.999%`
4+
~~积极开发中,每日一更~~,当前进度 `99.9999%`
55
~~找工作中,随缘更新~~
66
上班当牛马,下班要带娃,阶段性佛系趁娃睡觉熬夜更新
77

@@ -49,6 +49,10 @@ nodejs作为服务端的drpy实现。全面升级异步写法
4949

5050
## 更新记录
5151

52+
### 20250919
53+
54+
更新至V1.3.4
55+
5256
### 20250918
5357

5458
更新至V1.3.3

controllers/config.js

Lines changed: 149 additions & 166 deletions
Large diffs are not rendered by default.

docs/updateRecord.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,13 @@
11
# drpyS更新记录
22

3+
### 20250919
4+
5+
更新至V1.3.4
6+
7+
1. 修复dr2,并移除了dr2目录下几个坏了的源
8+
2. 增加可可影视和几个小说ds
9+
3. 开发了一个脚本 `scripts/python/compare_source.py` 可以用来处理重复的js文件
10+
311
### 20250918
412

513
更新至V1.3.3

libs/drpysParser.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -672,9 +672,11 @@ export async function playParseAfter(rule, obj, playUrl, flag) {
672672
jx: tellIsJx(playUrl)
673673
};
674674
let lazy_play;
675+
const is_lazy_function = rule.play_parse && rule.lazy && typeof (rule.lazy) === 'function';
676+
const is_lazy_function_str = rule.play_parse && rule.lazy && typeof (rule.lazy) === 'string' && rule.lazy.startsWith('js:');
675677
if (!rule.play_parse || !rule.lazy) {
676678
lazy_play = common_play;
677-
} else if (rule.play_parse && rule.lazy && typeof (rule.lazy) === 'function') {
679+
} else if (is_lazy_function || is_lazy_function_str) {
678680
try {
679681
lazy_play = typeof (obj) === 'object' ? obj : {
680682
parse: SPECIAL_URL.test(obj) || /^(push:)/.test(obj) ? 0 : 1,

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "drpy-node",
3-
"version": "1.3.3",
3+
"version": "1.3.4",
44
"main": "index.js",
55
"type": "module",
66
"scripts": {

scripts/python/compare_source.py

Lines changed: 332 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,332 @@
1+
#!/usr/bin/env python3
2+
# -*- coding: utf-8 -*-
3+
"""
4+
JavaScript源文件对比工具
5+
功能:对比js和js_dr2目录中的文件,找出js_dr2_old目录中的重复文件并提供删除功能
6+
作者:AI Assistant
7+
创建时间:2025年1月
8+
"""
9+
10+
import argparse
11+
import re
12+
import sys
13+
from datetime import datetime
14+
from pathlib import Path
15+
from typing import Set, List, Dict
16+
17+
18+
class SourceFileComparator:
19+
"""JavaScript源文件对比器"""
20+
21+
def __init__(self, base_dir: str = None):
22+
"""
23+
初始化对比器
24+
25+
Args:
26+
base_dir: 项目根目录,默认为当前脚本所在项目根目录
27+
"""
28+
if base_dir is None:
29+
# 获取项目根目录(脚本在scripts/python目录下)
30+
script_dir = Path(__file__).parent
31+
self.base_dir = script_dir.parent.parent
32+
else:
33+
self.base_dir = Path(base_dir)
34+
35+
# 定义三个目录路径
36+
self.js_dir = self.base_dir / "spider" / "js"
37+
self.js_dr2_dir = self.base_dir / "spider" / "js_dr2"
38+
self.js_dr2_old_dir = self.base_dir / "spider" / "js_dr2_old"
39+
40+
# 存储文件信息
41+
self.js_files: Set[str] = set()
42+
self.js_dr2_files: Set[str] = set()
43+
self.js_dr2_old_files: Set[str] = set()
44+
self.duplicate_files: List[str] = []
45+
46+
# 存储标准化文件名映射
47+
self.js_normalized_map: Dict[str, str] = {}
48+
self.js_dr2_normalized_map: Dict[str, str] = {}
49+
self.js_dr2_old_normalized_map: Dict[str, str] = {}
50+
51+
def _normalize_filename(self, filename: str) -> str:
52+
"""
53+
标准化文件名,去除中括号及其内容
54+
55+
Args:
56+
filename: 原始文件名
57+
58+
Returns:
59+
str: 标准化后的文件名
60+
"""
61+
# 去除中括号及其内容,例如:可可影视[优].js -> 可可影视.js
62+
normalized = re.sub(r'\[.*?\]', '', filename)
63+
return normalized
64+
65+
def _is_valid_js_file(self, filename: str) -> bool:
66+
"""
67+
检查是否为有效的JavaScript文件(非_开头的.js文件)
68+
69+
Args:
70+
filename: 文件名
71+
72+
Returns:
73+
bool: 是否为有效的JavaScript文件
74+
"""
75+
return (filename.endswith('.js') and
76+
not filename.startswith('_') and
77+
not filename.startswith('.'))
78+
79+
def _scan_directory(self, directory: Path, normalized_map: Dict[str, str] = None) -> Set[str]:
80+
"""
81+
扫描目录中的有效JavaScript文件
82+
83+
Args:
84+
directory: 要扫描的目录路径
85+
normalized_map: 用于存储标准化文件名映射的字典
86+
87+
Returns:
88+
Set[str]: 文件名集合
89+
"""
90+
files = set()
91+
if not directory.exists():
92+
print(f"警告:目录不存在 - {directory}")
93+
return files
94+
95+
try:
96+
for file_path in directory.iterdir():
97+
if file_path.is_file() and self._is_valid_js_file(file_path.name):
98+
files.add(file_path.name)
99+
# 如果提供了映射字典,则建立标准化文件名映射
100+
if normalized_map is not None:
101+
normalized_name = self._normalize_filename(file_path.name)
102+
normalized_map[normalized_name] = file_path.name
103+
except PermissionError:
104+
print(f"错误:没有权限访问目录 - {directory}")
105+
except Exception as e:
106+
print(f"错误:扫描目录时发生异常 - {directory}: {e}")
107+
108+
return files
109+
110+
def scan_all_directories(self):
111+
"""扫描所有目录中的JavaScript文件"""
112+
print("正在扫描目录...")
113+
print(f"项目根目录: {self.base_dir}")
114+
115+
# 扫描js目录
116+
print(f"扫描目录: {self.js_dir}")
117+
self.js_files = self._scan_directory(self.js_dir, self.js_normalized_map)
118+
print(f"找到 {len(self.js_files)} 个有效JS文件")
119+
120+
# 扫描js_dr2目录
121+
print(f"扫描目录: {self.js_dr2_dir}")
122+
self.js_dr2_files = self._scan_directory(self.js_dr2_dir, self.js_dr2_normalized_map)
123+
print(f"找到 {len(self.js_dr2_files)} 个有效JS文件")
124+
125+
# 扫描js_dr2_old目录
126+
print(f"扫描目录: {self.js_dr2_old_dir}")
127+
self.js_dr2_old_files = self._scan_directory(self.js_dr2_old_dir, self.js_dr2_old_normalized_map)
128+
print(f"找到 {len(self.js_dr2_old_files)} 个有效JS文件")
129+
130+
def find_duplicates(self):
131+
"""查找重复文件(基于标准化文件名)"""
132+
print("\n正在分析重复文件...")
133+
134+
# 合并js和js_dr2目录的标准化文件名
135+
source_normalized_names = set(self.js_normalized_map.keys()).union(set(self.js_dr2_normalized_map.keys()))
136+
137+
# 查找js_dr2_old中与源目录重复的文件(基于标准化文件名)
138+
self.duplicate_files = []
139+
for normalized_name, original_name in self.js_dr2_old_normalized_map.items():
140+
if normalized_name in source_normalized_names:
141+
self.duplicate_files.append(original_name)
142+
143+
print(f"发现 {len(self.duplicate_files)} 个重复文件(基于标准化文件名匹配)")
144+
145+
def generate_report(self) -> Dict:
146+
"""
147+
生成详细报告
148+
149+
Returns:
150+
Dict: 包含统计信息的报告
151+
"""
152+
report = {
153+
'scan_time': datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
154+
'directories': {
155+
'js': str(self.js_dir),
156+
'js_dr2': str(self.js_dr2_dir),
157+
'js_dr2_old': str(self.js_dr2_old_dir)
158+
},
159+
'file_counts': {
160+
'js': len(self.js_files),
161+
'js_dr2': len(self.js_dr2_files),
162+
'js_dr2_old': len(self.js_dr2_old_files),
163+
'duplicates': len(self.duplicate_files)
164+
},
165+
'duplicate_files': sorted(self.duplicate_files),
166+
'unique_files_in_old': sorted(list(self.js_dr2_old_files - set(self.duplicate_files)))
167+
}
168+
return report
169+
170+
def print_report(self):
171+
"""打印详细报告"""
172+
report = self.generate_report()
173+
174+
print("\n" + "=" * 60)
175+
print("JavaScript文件对比报告")
176+
print("=" * 60)
177+
print(f"扫描时间: {report['scan_time']}")
178+
print(f"项目根目录: {self.base_dir}")
179+
180+
print(f"\n目录统计:")
181+
print(f" js目录: {report['file_counts']['js']} 个文件")
182+
print(f" js_dr2目录: {report['file_counts']['js_dr2']} 个文件")
183+
print(f" js_dr2_old目录: {report['file_counts']['js_dr2_old']} 个文件")
184+
185+
print(f"\n重复文件分析:")
186+
print(f" 重复文件数量: {report['file_counts']['duplicates']} 个")
187+
print(f" js_dr2_old中唯一文件: {len(report['unique_files_in_old'])} 个")
188+
189+
if self.duplicate_files:
190+
print(f"\n重复文件清单:")
191+
for i, filename in enumerate(report['duplicate_files'], 1):
192+
print(f" {i:2d}. {filename}")
193+
194+
if report['unique_files_in_old']:
195+
print(f"\njs_dr2_old中的唯一文件(不会被删除):")
196+
for i, filename in enumerate(report['unique_files_in_old'], 1):
197+
print(f" {i:2d}. {filename}")
198+
199+
def delete_duplicates(self, confirm: bool = False) -> bool:
200+
"""
201+
删除重复文件
202+
203+
Args:
204+
confirm: 是否已确认删除
205+
206+
Returns:
207+
bool: 删除是否成功
208+
"""
209+
if not self.duplicate_files:
210+
print("没有发现重复文件,无需删除。")
211+
return True
212+
213+
if not confirm:
214+
print(f"\n即将删除 {len(self.duplicate_files)} 个重复文件:")
215+
for filename in self.duplicate_files:
216+
print(f" - {filename}")
217+
218+
response = input(f"\n确认删除这些文件吗?(y/N): ").strip().lower()
219+
if response not in ['y', 'yes', '是']:
220+
print("取消删除操作。")
221+
return False
222+
223+
# 执行删除
224+
deleted_count = 0
225+
failed_files = []
226+
227+
for filename in self.duplicate_files:
228+
file_path = self.js_dr2_old_dir / filename
229+
try:
230+
if file_path.exists():
231+
file_path.unlink()
232+
deleted_count += 1
233+
print(f"已删除: {filename}")
234+
else:
235+
print(f"文件不存在: {filename}")
236+
except Exception as e:
237+
failed_files.append((filename, str(e)))
238+
print(f"删除失败: {filename} - {e}")
239+
240+
print(f"\n删除完成:")
241+
print(f" 成功删除: {deleted_count} 个文件")
242+
if failed_files:
243+
print(f" 删除失败: {len(failed_files)} 个文件")
244+
for filename, error in failed_files:
245+
print(f" - {filename}: {error}")
246+
247+
return len(failed_files) == 0
248+
249+
250+
def main():
251+
"""主函数"""
252+
parser = argparse.ArgumentParser(
253+
description="JavaScript源文件对比工具",
254+
formatter_class=argparse.RawDescriptionHelpFormatter,
255+
epilog="""
256+
使用示例:
257+
python compare_source.py # 扫描并显示报告
258+
python compare_source.py --delete # 扫描并交互式删除重复文件
259+
python compare_source.py --delete --force # 扫描并强制删除重复文件(无确认)
260+
python compare_source.py --base-dir /path # 指定项目根目录
261+
"""
262+
)
263+
264+
parser.add_argument(
265+
'--base-dir',
266+
type=str,
267+
help='项目根目录路径(默认为脚本所在项目根目录)'
268+
)
269+
parser.add_argument(
270+
'--delete',
271+
action='store_true',
272+
help='删除重复文件'
273+
)
274+
parser.add_argument(
275+
'--force',
276+
action='store_true',
277+
help='强制删除,不需要确认(需要与--delete一起使用)'
278+
)
279+
parser.add_argument(
280+
'--quiet',
281+
action='store_true',
282+
help='静默模式,只显示关键信息'
283+
)
284+
285+
args = parser.parse_args()
286+
287+
try:
288+
# 创建对比器实例
289+
comparator = SourceFileComparator(args.base_dir)
290+
291+
# 扫描目录
292+
if not args.quiet:
293+
comparator.scan_all_directories()
294+
else:
295+
comparator.js_files = comparator._scan_directory(comparator.js_dir)
296+
comparator.js_dr2_files = comparator._scan_directory(comparator.js_dr2_dir)
297+
comparator.js_dr2_old_files = comparator._scan_directory(comparator.js_dr2_old_dir)
298+
299+
# 查找重复文件
300+
comparator.find_duplicates()
301+
302+
# 显示报告
303+
if not args.quiet:
304+
comparator.print_report()
305+
else:
306+
print(f"发现 {len(comparator.duplicate_files)} 个重复文件")
307+
308+
# 删除重复文件
309+
if args.delete:
310+
success = comparator.delete_duplicates(confirm=args.force)
311+
if success:
312+
print("\n重复文件清理完成!")
313+
return 0
314+
else:
315+
print("\n重复文件清理失败!")
316+
return 1
317+
else:
318+
if comparator.duplicate_files:
319+
print(f"\n提示:使用 --delete 参数可以删除这 {len(comparator.duplicate_files)} 个重复文件")
320+
321+
return 0
322+
323+
except KeyboardInterrupt:
324+
print("\n\n操作被用户中断。")
325+
return 1
326+
except Exception as e:
327+
print(f"\n错误:{e}")
328+
return 1
329+
330+
331+
if __name__ == "__main__":
332+
sys.exit(main())

0 commit comments

Comments
 (0)