Skip to content

Commit 182cd70

Browse files
authored
Merge branch 'hect0x7:master' into master
2 parents e8785b2 + 0651403 commit 182cd70

File tree

7 files changed

+62
-71
lines changed

7 files changed

+62
-71
lines changed

src/jmcomic/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
# 被依赖方 <--- 使用方
33
# config <--- entity <--- toolkit <--- client <--- option <--- downloader
44

5-
__version__ = '2.6.10'
5+
__version__ = '2.6.11'
66

77
from .api import *
88
from .jm_plugin import *

src/jmcomic/jm_client_impl.py

Lines changed: 30 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -765,55 +765,17 @@ def fetch_photo_additional_field(self, photo: JmPhotoDetail, fetch_album: bool,
765765

766766
def setting(self) -> JmApiResp:
767767
"""
768-
禁漫app的setting请求,返回如下内容(resp.res_data)
769-
{
770-
"logo_path": "https://cdn-msp.jmapiproxy1.monster/media/logo/new_logo.png",
771-
"main_web_host": "18-comic.work",
772-
"img_host": "https://cdn-msp.jmapiproxy1.monster",
773-
"base_url": "https://www.jmapinode.biz",
774-
"is_cn": 0,
775-
"cn_base_url": "https://www.jmapinode.biz",
776-
"version": "1.6.0",
777-
"test_version": "1.6.1",
778-
"store_link": "https://play.google.com/store/apps/details?id=com.jiaohua_browser",
779-
"ios_version": "1.6.0",
780-
"ios_test_version": "1.6.1",
781-
"ios_store_link": "https://18comic.vip/stray/",
782-
"ad_cache_version": 1698140798,
783-
"bundle_url": "https://18-comic.work/static/apk/patches1.6.0.zip",
784-
"is_hot_update": true,
785-
"api_banner_path": "https://cdn-msp.jmapiproxy1.monster/media/logo/channel_log.png?v=",
786-
"version_info": "\nAPP & IOS更新\nV1.6.0\n#禁漫 APK 更新拉!!\n更新調整以下項目\n1. 系統優化\n\nV1.5.9\n1. 跳錯誤新增 重試 網頁 按鈕\n2. 圖片讀取優化\n3.
787-
線路調整優化\n\n無法順利更新或是系統題是有風險請使用下方\n下載點2\n有問題可以到DC群反饋\nhttps://discord.gg/V74p7HM\n",
788-
"app_shunts": [
789-
{
790-
"title": "圖源1",
791-
"key": 1
792-
},
793-
{
794-
"title": "圖源2",
795-
"key": 2
796-
},
797-
{
798-
"title": "圖源3",
799-
"key": 3
800-
},
801-
{
802-
"title": "圖源4",
803-
"key": 4
804-
}
805-
],
806-
"download_url": "https://18-comic.work/static/apk/1.6.0.apk",
807-
"app_landing_page": "https://jm365.work/pXYbfA",
808-
"float_ad": true
809-
}
768+
禁漫app的setting请求
810769
"""
811770
resp = self.req_api('/setting')
812771

813772
# 检查禁漫最新的版本号
814-
setting_ver = str(resp.model_data.version)
773+
setting_ver = str(resp.model_data.jm3_version)
815774
# 禁漫接口的版本 > jmcomic库内置版本
816-
if setting_ver > JmMagicConstants.APP_VERSION and JmModuleConfig.FLAG_USE_VERSION_NEWER_IF_BEHIND:
775+
if (
776+
JmModuleConfig.FLAG_USE_VERSION_NEWER_IF_BEHIND
777+
and JmcomicText.compare_versions(setting_ver, JmMagicConstants.APP_VERSION) == 1
778+
):
817779
jm_log('api.setting', f'change APP_VERSION from [{JmMagicConstants.APP_VERSION}] to [{setting_ver}]')
818780
JmMagicConstants.APP_VERSION = setting_ver
819781

@@ -959,10 +921,7 @@ def require_resp_success(cls, resp: JmApiResp, url: Optional[str] = None):
959921

960922
# 1. 检查是否 album_missing
961923
# json: {'code': 200, 'data': []}
962-
data = resp.model().data
963-
if isinstance(data, list) and len(data) == 0:
964-
ExceptionTool.raise_missing(resp, JmcomicText.parse_to_jm_id(url))
965-
924+
# 最新api已不存在这种情况,无需检查
966925
# 2. 是否是特殊的内容
967926
# 暂无
968927

@@ -1007,7 +966,8 @@ def raise_if_resp_should_retry(self, resp, is_image):
1007966
def after_init(self):
1008967
# 自动更新禁漫API域名
1009968
if JmModuleConfig.FLAG_API_CLIENT_AUTO_UPDATE_DOMAIN:
1010-
self.update_api_domain()
969+
new_server_list = self.fetch_latest_api_domain_for_module()
970+
self.update_old_api_domain(new_server_list)
1011971

1012972
# 保证拥有cookies,因为移动端要求必须携带cookies,否则会直接跳转同一本子【禁漫娘】
1013973
if JmModuleConfig.FLAG_API_CLIENT_REQUIRE_COOKIES:
@@ -1032,13 +992,19 @@ def req_api_domain_server(self, url):
1032992
else:
1033993
return res_data['Server']
1034994

1035-
def update_api_domain(self):
1036-
if True is JmModuleConfig.FLAG_API_CLIENT_AUTO_UPDATE_DOMAIN_DONE:
1037-
return
995+
def update_old_api_domain(self, new_server_list: List[str]):
996+
if new_server_list and sorted(self.domain_list) == sorted(JmModuleConfig.DOMAIN_API_LIST):
997+
self.domain_list = new_server_list
998+
999+
def fetch_latest_api_domain_for_module(self):
1000+
if JmModuleConfig.DOMAIN_API_UPDATED_LIST is not None:
1001+
return JmModuleConfig.DOMAIN_API_UPDATED_LIST
10381002

10391003
with self.client_update_domain_lock:
1040-
if True is JmModuleConfig.FLAG_API_CLIENT_AUTO_UPDATE_DOMAIN_DONE:
1041-
return
1004+
# double check
1005+
if JmModuleConfig.DOMAIN_API_UPDATED_LIST is not None:
1006+
return JmModuleConfig.DOMAIN_API_UPDATED_LIST
1007+
10421008
# 遍历多个域名服务器
10431009
for url in JmModuleConfig.API_URL_DOMAIN_SERVER_LIST:
10441010
try:
@@ -1050,18 +1016,20 @@ def update_api_domain(self):
10501016
jm_log('api.update_domain.success',
10511017
f'获取到最新的API域名,替换jmcomic内置域名:(new){new_server_list} ---→ (old){old_server_list}'
10521018
)
1053-
# 更新域名
1054-
if sorted(self.domain_list) == sorted(old_server_list):
1055-
self.domain_list = new_server_list
1056-
JmModuleConfig.DOMAIN_API_LIST = new_server_list
1057-
break
1019+
JmModuleConfig.DOMAIN_API_UPDATED_LIST = new_server_list
1020+
return new_server_list
10581021
except Exception as e:
10591022
jm_log('api.update_domain.error',
1060-
f'通过[{url}]自动更新API域名失败,仍使用jmcomic内置域名。'
1023+
f'通过[{url}]自动更新API域名失败,尝试下一个地址。'
10611024
f'可通过代码[JmModuleConfig.FLAG_API_CLIENT_AUTO_UPDATE_DOMAIN=False]关闭自动更新API域名. 异常: {e}'
10621025
)
1063-
# set done finally
1064-
JmModuleConfig.FLAG_API_CLIENT_AUTO_UPDATE_DOMAIN_DONE = True
1026+
continue
1027+
1028+
# 走到这里,说明没有获取到域名更新
1029+
# 为了本方法不被重复执行,把新域名字段修改为空列表
1030+
# 空列表相当于一个done标识
1031+
JmModuleConfig.DOMAIN_API_UPDATED_LIST = []
1032+
return JmModuleConfig.DOMAIN_API_UPDATED_LIST
10651033

10661034
client_init_cookies_lock = Lock()
10671035

src/jmcomic/jm_client_interface.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,18 +122,24 @@ def decoded_data(self) -> str:
122122
def encoded_data(self) -> str:
123123
return self.json()['data']
124124

125+
def require_have_data(self):
126+
data = self.encoded_data
127+
if isinstance(data, list) and len(data) == 0 and self.json().get('errorMsg', None):
128+
ExceptionTool.raises_resp(f'data返回值异常: {self.text}', self)
129+
125130
@property
126131
def res_data(self) -> Any:
127132
self.require_success()
133+
self.require_have_data()
128134
from json import loads
129135
return loads(self.decoded_data)
130136

131137
@property
132138
def model_data(self) -> AdvancedDict:
133139
self.require_success()
140+
self.require_have_data()
134141
return AdvancedDict(self.res_data)
135142

136-
137143
# album-comment
138144
class JmAlbumCommentResp(JmJsonResp):
139145

src/jmcomic/jm_config.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ class JmMagicConstants:
7777
APP_TOKEN_SECRET_2 = '18comicAPPContent'
7878
APP_DATA_SECRET = '185Hcomic3PAPP7R'
7979
API_DOMAIN_SERVER_SECRET = 'diosfjckwpqpdfjkvnqQjsik'
80-
APP_VERSION = '2.0.6'
80+
APP_VERSION = '2.0.13'
8181

8282

8383
# 模块级别共用配置
@@ -134,6 +134,8 @@ class JmModuleConfig:
134134
www.cdnplaystation6.cc
135135
''')
136136

137+
DOMAIN_API_UPDATED_LIST = None
138+
137139
# 获取最新移动端API域名的地址
138140
API_URL_DOMAIN_SERVER_LIST = shuffled('''
139141
https://rup4a04-c01.tos-ap-southeast-1.bytepluses.com/newsvr-2025.txt
@@ -209,7 +211,6 @@ class JmModuleConfig:
209211
FLAG_API_CLIENT_REQUIRE_COOKIES = True
210212
# 自动更新禁漫API域名
211213
FLAG_API_CLIENT_AUTO_UPDATE_DOMAIN = True
212-
FLAG_API_CLIENT_AUTO_UPDATE_DOMAIN_DONE = None
213214
# log开关标记
214215
FLAG_ENABLE_JM_LOG = True
215216
# log时解码url

src/jmcomic/jm_option.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -130,9 +130,9 @@ def parse_bd_rule(self, album, photo, rule):
130130
@classmethod
131131
def parse_f_string_rule(cls, album, photo, rule: str):
132132
properties = {}
133-
if album:
133+
if album is not None:
134134
properties.update(album.get_properties_dict())
135-
if photo:
135+
if photo is not None:
136136
properties.update(photo.get_properties_dict())
137137
return rule.format(**properties)
138138

src/jmcomic/jm_toolkit.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -414,6 +414,22 @@ def get_album_cover_url(cls,
414414
path = f'/media/albums/{cls.parse_to_jm_id(album_id)}{size}.jpg'
415415
return cls.format_url(path, image_domain)
416416

417+
@classmethod
418+
def compare_versions(cls, v1: str, v2: str) -> int:
419+
parts1 = list(map(int, v1.split(".")))
420+
parts2 = list(map(int, v2.split(".")))
421+
422+
# 补齐长度
423+
length = max(len(parts1), len(parts2))
424+
parts1 += [0] * (length - len(parts1))
425+
parts2 += [0] * (length - len(parts2))
426+
427+
if parts1 > parts2:
428+
return 1 # v1 大
429+
elif parts1 < parts2:
430+
return -1 # v2 大
431+
else:
432+
return 0 # 相等
417433

418434
# 支持dsl: #{???} -> os.getenv(???)
419435
JmcomicText.dsl_replacer.add_dsl_and_replacer(r'\$\{(.*?)\}', JmcomicText.match_os_env)

tests/test_jmcomic/test_jm_custom.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,8 @@ class MyClient(JmApiClient):
4444
JmModuleConfig.register_client(MyClient)
4545

4646
self.assertListEqual(
47-
JmModuleConfig.DOMAIN_API_LIST,
48-
self.option.new_jm_client(domain_list=[], impl=MyClient.client_key).get_domain_list()
47+
self.option.new_jm_client(domain_list=[], impl=MyClient.client_key).get_domain_list(),
48+
JmModuleConfig.DOMAIN_API_UPDATED_LIST if JmModuleConfig.DOMAIN_API_UPDATED_LIST else JmModuleConfig.DOMAIN_API_LIST,
4949
)
5050

5151
def test_extends_html_client(self):
@@ -104,7 +104,7 @@ class MyClient(JmApiClient):
104104

105105
JmModuleConfig.register_client(MyClient)
106106
self.assertListEqual(
107-
JmModuleConfig.DOMAIN_API_LIST,
108107
self.option.new_jm_client(domain_list=[], impl=MyClient.client_key).get_domain_list(),
108+
JmModuleConfig.DOMAIN_API_UPDATED_LIST if JmModuleConfig.DOMAIN_API_UPDATED_LIST else JmModuleConfig.DOMAIN_API_LIST,
109109
msg='继承client,不配置域名',
110110
)

0 commit comments

Comments
 (0)