更新源

This commit is contained in:
qist
2026-02-03 10:45:52 +08:00
parent 3aa7a57bb8
commit d95555f1b1
24 changed files with 44896 additions and 376 deletions

View File

@@ -1,15 +1,14 @@
import json
import requests
import sys
import hashlib
import os
# 默认 jar 路径和下载 URL如需下载
default_jar = "./xiaosa/spider.jar"
default_jar_url = "../xiaosa/spider.jar"
# jar 路径(用于计算 md5
primary_jar_path = "jar/spider.jar"
fallback_jar_path = "../xiaosa/spider.jar"
# 需要删除的站点 key
remove_keys = {"巴士动漫"} # 可以加多个,例如 {"巴士动漫", "电影牛"}
# 需要删除的站点 key(在此填写即可删除)
remove_keys = {"版本信息","腾讯视频","优酷视频","芒果视频","爱奇艺","三六零","豆瓣"} # 可以加多个,例如 {"巴士动漫", "电影牛"}
# 保存 JSON 文件(折叠字典数组为单行,空数组和基础数组一行)
class CompactJSONEncoder(json.JSONEncoder):
@@ -38,12 +37,7 @@ def fetch_json(path_or_url):
if os.path.exists(path_or_url):
with open(path_or_url, "r", encoding="utf-8") as f:
return json.load(f)
elif path_or_url.startswith("http://") or path_or_url.startswith("https://"):
resp = requests.get(path_or_url)
resp.raise_for_status()
return resp.json()
else:
raise ValueError(f"无效路径或 URL{path_or_url}")
raise ValueError(f"无效路径或 URL{path_or_url}")
def get_md5(filepath):
@@ -53,35 +47,22 @@ def get_md5(filepath):
md5.update(chunk)
return md5.hexdigest()
def ensure_jar_with_md5(site):
def replace_drpy_path(site):
"""将 ./js/drpy2.min.js 替换为 ./lib/drpy2.min.js"""
if not isinstance(site, dict):
return
jar_val = site.get("jar")
if jar_val and ";md5;" in jar_val:
return # 已包含 md5
if not os.path.exists(default_jar_url):
print(f"⚠️ 找不到本地 jar 文件:{default_jar_url}")
return
md5_val = get_md5(default_jar_url)
site["jar"] = f"{default_jar};md5;{md5_val}"
for field in ("api", "ext"):
val = site.get(field)
if isinstance(val, str) and val == "./js/drpy2.min.js":
site[field] = "./lib/drpy2.min.js"
def ensure_xyqhiker_ext_and_jar(site):
"""修正所有 csp_XYQHiker 站点的 ext 路径,并加上 jar md5"""
if not isinstance(site, dict):
return
if site.get("api") == "csp_XYQHiker":
ext_val = site.get("ext", "")
if ext_val.startswith("./XYQHiker/"):
site["ext"] = ext_val.replace("./XYQHiker/", "./xiaosa/XYQHiker/")
ensure_jar_with_md5(site)
def insert_sites_at_key(base_sites, insert_sites, key_marker):
for i, item in enumerate(base_sites):
if item.get("key") == key_marker:
return base_sites[:i] + insert_sites + base_sites[i:]
return base_sites[:i + 1] + insert_sites + base_sites[i + 1:]
print(f"⚠️ 未找到 key 为 {key_marker} 的插入点,追加到末尾")
return base_sites + insert_sites
@@ -91,10 +72,16 @@ def remove_sites(sites, keys_to_remove):
return [s for s in sites if s.get("key") not in keys_to_remove]
def dedupe_by_name(base_sites, insert_sites):
"""按 name 去重:若重名,优先保留 base_sites 中的条目"""
base_names = {s.get("name") for s in base_sites if isinstance(s, dict)}
return [s for s in insert_sites if s.get("name") not in base_names]
if __name__ == "__main__":
if len(sys.argv) < 3:
print("用法: python script.py <远程json_url> <本地dianshi.json路径>")
print("示例: python script.py https://raw.githubusercontent.com/qist/tvbox/master/xiaosa/api.json dianshi.json")
print("用法: python xiao.py <本地api.json路径> <本地dianshi.json路径>")
print("示例: python xiao.py ../xiaosa/api.json dianshi.json")
sys.exit(1)
remote_url = sys.argv[1]
@@ -103,28 +90,33 @@ if __name__ == "__main__":
# 1. 下载远程 JSON
data = fetch_json(remote_url)
# 2. 筛选 sites,只保留 name 含 APP
# 2. 读取 sites(不再筛选)
sites = data.get("sites", [])
filtered_sites = [s for s in sites if isinstance(s, dict) and "name" in s and "APP" in s["name"]]
filtered_sites = [s for s in sites if isinstance(s, dict)]
# 3. 为每个 APP site 添加 jar 字段和 md5
# 3. 不再单独追加 XYQHiker已包含在 sites 中)
# 3.1 不删除站点,仅移除每个站点的 jar 字段
before_count = len(filtered_sites)
removed_sites = []
for site in filtered_sites:
ensure_jar_with_md5(site)
# 3.1 处理所有 csp_XYQHiker
for site in sites:
if isinstance(site, dict) and site.get("api") == "csp_XYQHiker":
ensure_xyqhiker_ext_and_jar(site)
filtered_sites.append(site)
print(f"✅ 筛选并更新 {len(filtered_sites)} 个站点APP + XYQHiker含 jar+md5")
replace_drpy_path(site)
if isinstance(site, dict) and "jar" in site:
site.pop("jar", None)
removed_count = before_count - len(filtered_sites)
print(f"✅ 更新 {len(filtered_sites)} 个站点")
# 4. 读取本地文件
with open(local_file, "r", encoding="utf-8") as f:
dianshi = json.load(f)
# 5. 插入到 key="玩偶" 处
# 5. 插入到 key="cbh" 之后(按 name 去重,保留本地)
dianshi_sites = dianshi.get("sites", [])
dianshi["sites"] = insert_sites_at_key(dianshi_sites, filtered_sites, "玩偶")
# 先按 key 删除来源站点
if remove_keys:
filtered_sites = [s for s in filtered_sites if s.get("key") not in remove_keys]
filtered_sites = dedupe_by_name(dianshi_sites, filtered_sites)
dianshi["sites"] = insert_sites_at_key(dianshi_sites, filtered_sites, "cbh")
# 6. 删除指定的站点
before_count = len(dianshi["sites"])
@@ -132,7 +124,16 @@ if __name__ == "__main__":
after_count = len(dianshi["sites"])
print(f"✅ 删除了 {before_count - after_count} 个指定站点: {', '.join(remove_keys)}")
# 7. 保存合并结果
# 7. 设置 spider 为 jar+md5统一在输出文件中
jar_path = primary_jar_path if os.path.exists(primary_jar_path) else fallback_jar_path
if os.path.exists(jar_path):
md5_val = get_md5(jar_path)
dianshi["spider"] = f"./jar/spider.jar;md5;{md5_val}"
print(f"🔄 spider 已更新为: {dianshi['spider']}")
else:
print(f"⚠️ 找不到 jar 文件,未更新 spider{primary_jar_path} / {fallback_jar_path}")
# 8. 保存合并结果(新文件)
output_file = f"{local_file.rsplit('.',1)[0]}_with_app_sites.json"
with open(output_file, "w", encoding="utf-8") as f:
json.dump(dianshi, f, ensure_ascii=False, indent=2, cls=CompactJSONEncoder)