Skip to content

Commit c4675e9

Browse files
committed
更新
1 parent 0b16572 commit c4675e9

17 files changed

+229
-111
lines changed

src/component/scroll/smooth_scroll.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from PySide6.QtGui import QWheelEvent
77
from PySide6.QtWidgets import QApplication
88

9+
from config.setting import Setting
910
from view.read.read_enum import ReadMode
1011

1112

@@ -38,7 +39,8 @@ def wheelEvent(self, e):
3839
accerationRatio = min(len(self.scrollStamps) / 15, 1)
3940
self.qEventParam = (e.position(), e.globalPosition(), e.buttons())
4041
# 计算步数
41-
self.stepsTotal = self.fps * self.duration / 1000
42+
duration = int(self.duration)
43+
self.stepsTotal = self.fps * duration / 1000
4244
# 计算每一个事件对应的移动距离
4345
delta = e.angleDelta().y() * self.stepRatio
4446
if self.acceleration > 0:

src/config/config.py

+9-15
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,12 @@
55

66

77
# Url = "https://jmcomic1.cc" # 域名
8-
Url2 = "https://www.asjmapihost.cc" # 域名
8+
Url2 = "https://www.jmapinode.biz" # 域名
99
# Url2 = "https://www.jmapibranch3.cc" # 域名
10-
PicUrl2 = "https://cdn-msp.jmapiproxy2.cc" # 域名
10+
PicUrl2 = "https://cdn-msp.jmapinodeudzn.net" # 域名
1111

12-
Url2List = ["https://www.jmapinode1.top", "https://www.jmapinode2.top", "https://www.jmapinode3.top", "https://www.jmapibranch2.cc"]
13-
PicUrlList = ["https://cdn-msp.jmapiproxy1.cc", "https://cdn-msp.jmapiproxy2.cc", "https://cdn-msp.jmapiproxy3.cc", "https://cdn-msp.jmapiproxy4.cc"]
12+
Url2List = ["https://www.jmapinode.biz", "https://www.jmapinode.vip", "https://www.jmapinode3.top", "https://www.jmapibranch2.cc"]
13+
PicUrlList = ["https://cdn-msp.jmapinodeudzn.net", "https://cdn-msp2.jmapinodeudzn.net", "https://cdn-msp.jmapiproxy3.cc", "https://cdn-msp.jmapiproxy4.cc"]
1414
Now = int(time.time())
1515
ProxyApiDomain = "api.bika.life"
1616
ProxyImgDomain = "img.bika.life"
@@ -31,21 +31,15 @@
3131

3232
IsLoadingPicture = True
3333

34-
UpdateUrl = "https://github.com/tonquer/JMComic-qt/releases/latest"
35-
UpdateUrlApi = "https://api.github.com/repos/tonquer/JMComic-qt/releases"
36-
UpdateUrlBack = "https://github.com/tonquer/JMComic-qt/"
34+
AppUrl = "https://app.ggo.icu/JMComic"
3735

38-
UpdateUrl2 = "https://hub.ggo.icu/tonquer/JMComic-qt/releases/latest"
39-
UpdateUrl2Api = "https://api.ggo.icu/repos/tonquer/JMComic-qt/releases"
36+
UpdateUrlBack = "https://github.com/tonquer/JMComic-qt/"
4037
UpdateUrl2Back = "https://hub.ggo.icu/tonquer/JMComic-qt/"
41-
42-
UpdateUrl3 = "https://hub.fastgit.xyz/tonquer/JMComic-qt/releases/latest"
43-
UpdateUrl3Api = "https://api.fastgit.xyz/repos/tonquer/JMComic-qt/releases"
4438
UpdateUrl3Back = "https://hub.fastgit.xyz/tonquer/JMComic-qt"
4539

46-
UpdateVersion = "v1.1.8"
47-
RealVersion = "v1.1.8.1"
48-
VersionTime = "2023-11-22"
40+
UpdateVersion = "v1.1.9"
41+
RealVersion = "v1.1.9"
42+
VersionTime = "2024-1-31"
4943

5044
Waifu2xVersion = "1.1.6"
5145
LoginUserName = ""

src/config/setting.py

+2
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,8 @@ class Setting:
142142
TurnSpeed = SettingValue("ReadSetting", 5000, False)
143143
ScrollSpeed = SettingValue("ReadSetting", 400, False)
144144
PreDownWaifu2x = SettingValue("ReadSetting", 1, False)
145+
UpDownScrollSpeed = SettingValue("ReadSetting", 100, False)
146+
ScaleCnt = SettingValue("ReadSetting", 0, False)
145147

146148
# Other
147149
UserId = SettingValue("Other", "", False)

src/server/req.py

+26-11
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ def GetHeader(self, _url: str, method: str) -> dict:
6767
ua = "Mozilla/5.0 (Linux; Android 7.1.2; DT1901A Build/N2G47O; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/86.0.4240.198 Mobile Safari/537.36"
6868

6969
header = {
70-
"tokenparam": "{},1.6.1".format(self.now),
70+
"tokenparam": "{},1.6.6".format(self.now),
7171
"token": token,
7272
"user-agent": ua,
7373
"accept-encoding": "gzip",
@@ -81,7 +81,7 @@ def GetHeader2(self, _url: str, method: str) -> dict:
8181
token = hashlib.md5(param.encode("utf-8")).hexdigest()
8282

8383
header = {
84-
"tokenparam": "{},1.6.1".format(self.now),
84+
"tokenparam": "{},1.6.6".format(self.now),
8585
"token": token,
8686
"user-agent": "Mozilla/5.0 (Linux; Android 7.1.2; DT1901A Build/N2G47O; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/86.0.4240.198 Mobile Safari/537.36",
8787
"accept-encoding": "gzip",
@@ -132,26 +132,37 @@ def ParseData(self, data) -> str:
132132

133133
# 检查更新
134134
class CheckUpdateReq(ServerReq):
135-
def __init__(self, url):
136-
# url = config.UpdateUrl
135+
def __init__(self, isPre=False):
137136
method = "GET"
137+
data = dict()
138+
data["version"] = config.UpdateVersion
139+
data["ver_time"] = config.VersionTime
140+
if not isPre:
141+
url = config.AppUrl + "/version.txt?"
142+
else:
143+
url = config.AppUrl + "/version_pre.txt?"
144+
url += ToolUtil.DictToUrl(data)
138145
super(self.__class__, self).__init__(url, {}, method)
139146
self.isParseRes = False
140-
self.headers = {}
147+
self.useImgProxy = False
141148

142149

143-
# 检查Pre更新
144-
class CheckPreUpdateReq(ServerReq):
145-
def __init__(self, url=config.UpdateUrl):
150+
# 检查更新
151+
class CheckUpdateInfoReq(ServerReq):
152+
def __init__(self, newVersion):
146153
method = "GET"
147-
super(self.__class__, self).__init__(url.replace("/latest", ""), {}, method)
154+
data = dict()
155+
data["version"] = config.UpdateVersion
156+
url = config.AppUrl + "/{}.txt?".format(newVersion)
157+
url += ToolUtil.DictToUrl(data)
158+
super(self.__class__, self).__init__(url, {}, method)
148159
self.isParseRes = False
149160
self.useImgProxy = False
150161

151162

152163
# 下载图片
153164
class DownloadBookReq(ServerReq):
154-
def __init__(self, url, loadPath="", cachePath="", savePath="", saveParam=(0, 0, ""), isReload=False):
165+
def __init__(self, url, loadPath="", cachePath="", savePath="", saveParam=(0, 0, ""), isReload=False, resetCnt=1):
155166
method = "Download"
156167
self.url = url
157168
if self.url in ServerReq.SPACE_PIC:
@@ -162,6 +173,8 @@ def __init__(self, url, loadPath="", cachePath="", savePath="", saveParam=(0, 0,
162173
self.savePath = savePath
163174
self.saveParam = saveParam
164175
self.isReload = isReload
176+
self.resetCnt = resetCnt
177+
self.isReset = False
165178
super(self.__class__, self).__init__(self.url, {}, method)
166179
self.headers = dict()
167180
self.headers["Accept-Encoding"] ="None"
@@ -755,4 +768,6 @@ def __init__(self):
755768
self.headers['cache-control'] = 'no-cache'
756769
self.headers['expires'] = '0'
757770
self.headers['pragma'] = 'no-cache'
758-
self.isReload = False
771+
self.isReload = False
772+
self.resetCnt = 2
773+
self.isReset = False

src/server/server.py

+34-2
Original file line numberDiff line numberDiff line change
@@ -316,8 +316,14 @@ def Download(self, request, token="", backParams="", cacheAndLoadPath="", loadPa
316316
else:
317317
self._Download(task)
318318

319+
def ReDownload(self, task):
320+
task.res = ""
321+
task.status = Status.Ok
322+
self._downloadQueue.put(task)
323+
319324
def _Download(self, task):
320325
try:
326+
task.req.resetCnt -= 1
321327
if not task.req.isReload:
322328
if not isinstance(task.req, req.SpeedTestReq) and not task.req.savePath:
323329
for cachePath in [task.req.loadPath, task.req.cachePath]:
@@ -340,8 +346,30 @@ def _Download(self, task):
340346

341347
if request.headers == None:
342348
request.headers = {}
343-
Log.Info("request-> backId:{}, {}".format(task.backParam, task.req))
344-
r = self.session.get(request.url, proxies=request.proxy, headers=request.headers, stream=True, timeout=task.timeout, verify=False)
349+
if not request.isReset:
350+
Log.Info("request-> backId:{}, {}".format(task.bakParam, task.req))
351+
else:
352+
Log.Info("request reset:{} -> backId:{}, {}".format(task.req.resetCnt, task.bakParam, task.req))
353+
354+
history = []
355+
for i in range(10):
356+
r = self.session.get(request.url, proxies=request.proxy, headers=request.headers, timeout=task.timeout,
357+
verify=False, allow_redirects=False, stream=True)
358+
if r.status_code == 302 or r.status_code == 301:
359+
next = r.headers.get('Location')
360+
if ToolUtil.GetUrlHost(next) == "":
361+
next = "https://" + ToolUtil.GetUrlHost(request.url) + next
362+
request.url = next
363+
if not request.isReset:
364+
Log.Info("request 301 -> backId:{}, {}".format(task.bakParam, task.req))
365+
else:
366+
Log.Info("request 301 reset:{} -> backId:{}, {}".format(task.req.resetCnt, task.bakParam, task.req))
367+
368+
history.append(r)
369+
self.__DealHeaders(request, "")
370+
else:
371+
break
372+
r.history = history
345373
# task.res = res.BaseRes(r)
346374
# print(r.elapsed.total_seconds())
347375
task.res = r
@@ -362,6 +390,10 @@ def _Download(self, task):
362390
else:
363391
task.status = Status.NetError
364392
Log.Warn(task.req.url + " " + es.__repr__())
393+
if (task.req.resetCnt > 0):
394+
task.req.isReset = True
395+
self.ReDownload(task)
396+
return
365397
self.handler.get(task.req.__class__.__name__)(task)
366398
if task.res:
367399
task.res.close()

src/server/user_handler.py

+44-54
Original file line numberDiff line numberDiff line change
@@ -27,27 +27,15 @@ def __call__(self, task):
2727
if task.res.raw.status_code != 200:
2828
return
2929

30-
updateInfo = re.findall(r"<meta property=\"og:description\" content=\"([^\"]*)\"", task.res.raw.text)
31-
if updateInfo:
32-
rawData = updateInfo[0]
33-
else:
34-
rawData = ""
35-
36-
versionInfo = re.findall("<meta property=\"og:url\" content=\".*tag/([^\"]*)\"", task.res.raw.text)
37-
if versionInfo:
38-
verData = versionInfo[0]
39-
else:
40-
verData = ""
41-
30+
verData = task.res.GetText()
4231
info = verData.replace("v", "").split(".")
4332
version = int(info[0]) * 100 + int(info[1]) * 10 + int(info[2]) * 1
33+
4434
info2 = re.findall(r"\d+\d*", os.path.basename(config.UpdateVersion))
4535
curversion = int(info2[0]) * 100 + int(info2[1]) * 10 + int(info2[2]) * 1
4636

47-
rawData = "\n\nv" + ".".join(info) + "\n" + rawData
48-
4937
if version > curversion:
50-
data["data"] = rawData
38+
data["data"] = verData.replace("\r\n", "").replace("\n", "")
5139
else:
5240
data["data"] = "no"
5341
except Exception as es:
@@ -57,38 +45,22 @@ def __call__(self, task):
5745
TaskBase.taskObj.taskBack.emit(task.bakParam, pickle.dumps(data))
5846

5947

60-
@handler(req.CheckPreUpdateReq)
61-
class CheckPreUpdateReqHandler(object):
48+
@handler(req.CheckUpdateInfoReq)
49+
class CheckUpdateInfoHandler(object):
6250
def __call__(self, task):
6351
data = {"st": task.status, "data": ""}
6452
try:
6553
if not task.res.GetText() or task.status == Status.NetError:
6654
return
6755
if task.res.raw.status_code != 200:
6856
return
69-
rawData = json.loads(task.res.raw.text)
70-
if not rawData:
71-
return
72-
v = rawData[0]
73-
verData = v.get("tag_name")
74-
info = verData.replace("v", "").split(".")
75-
version = int(info[0]) * 100 + int(info[1]) * 10 + int(info[2]) * 1
76-
info2 = re.findall(r"\d+\d*", os.path.basename(config.UpdateVersion))
77-
curversion = int(info2[0]) * 100 + int(info2[1]) * 10 + int(info2[2]) * 1
78-
79-
rawData = v.get("body")
80-
81-
if version > curversion:
82-
data["data"] = rawData
83-
else:
84-
data["data"] = "no"
8557

58+
data["data"] = task.res.GetText()
8659
except Exception as es:
8760
pass
8861
finally:
8962
if task.bakParam:
9063
TaskBase.taskObj.taskBack.emit(task.bakParam, pickle.dumps(data))
91-
9264
# @handler(req.GetUserInfoReq)
9365
# class GetUserInfoReqHandler(object):
9466
# def __call__(self, task: Task):
@@ -761,27 +733,40 @@ def __call__(self, backData):
761733
if backData.bakParam:
762734
TaskBase.taskObj.downloadBack.emit(backData.bakParam, 0, -Status.Error, b"")
763735
return
736+
764737
fileSize = int(r.headers.get('Content-Length', 0))
765-
if fileSize <= 0:
766-
fileSize = 100000
767738
getSize = 0
768739
data = b""
769-
now = time.time()
770740

771741
addSize = 0
742+
now = time.time()
743+
isAlreadySend = False
772744
# 网速快,太卡了,优化成最多100ms一次
773-
for chunk in r.iter_content(chunk_size=4096):
774-
cur = time.time()
775-
tick = cur - now
776-
addSize += len(chunk)
777-
if tick >= 0.1:
778-
if backData.bakParam and addSize > 0:
779-
TaskBase.taskObj.downloadBack.emit(backData.bakParam, addSize, max(1, fileSize-getSize), b"")
780-
addSize = 0
781-
now = cur
782-
783-
getSize += len(chunk)
784-
data += chunk
745+
try:
746+
for chunk in r.iter_content(chunk_size=4096):
747+
cur = time.time()
748+
tick = cur - now
749+
addSize += len(chunk)
750+
if tick >= 0.1:
751+
isAlreadySend = True
752+
if backData.bakParam and addSize > 0:
753+
TaskBase.taskObj.downloadBack.emit(backData.bakParam, addSize,
754+
max(1, fileSize - getSize), b"")
755+
addSize = 0
756+
now = cur
757+
758+
getSize += len(chunk)
759+
data += chunk
760+
if not isAlreadySend:
761+
if backData.bakParam:
762+
TaskBase.taskObj.downloadBack.emit(backData.bakParam, 0, getSize, b"")
763+
764+
except Exception as es:
765+
Log.Error(es)
766+
if backData.req.resetCnt > 0:
767+
backData.req.isReset = True
768+
Server().ReDownload(backData)
769+
return
785770

786771
# Log.Info("size:{}, url:{}".format(ToolUtil.GetDownloadSize(fileSize), backData.req.url))
787772
_, _, mat, isAni = ToolUtil.GetPictureSize(data)
@@ -829,15 +814,17 @@ def __call__(self, backData):
829814
except Exception as es:
830815
Log.Error(es)
831816
# 保存失败了
832-
if backData.backParam:
833-
TaskBase.taskObj.downloadBack.emit(backData.backParam, 0, -2, b"")
817+
if backData.bakParam:
818+
TaskBase.taskObj.downloadBack.emit(backData.bakParam, 0, -2, b"")
834819

835820
if backData.bakParam:
836821
TaskBase.taskObj.downloadBack.emit(backData.bakParam, 0, 0, data)
822+
837823
except Exception as es:
824+
backData.status = Status.DownloadFail
838825
Log.Error(es)
839-
if backData.backParam:
840-
TaskBase.taskObj.downloadBack.emit(backData.backParam, 0, -1, b"")
826+
if backData.bakParam:
827+
TaskBase.taskObj.downloadBack.emit(backData.bakParam, 0, -backData.status, b"")
841828

842829

843830
@handler(req.DnsOverHttpsReq)
@@ -884,7 +871,9 @@ def __call__(self, backData):
884871
r = backData.res
885872
try:
886873
if r.status_code != 200:
874+
data["st"] = Status.Error
887875
if backData.bakParam:
876+
data["st"] = Status.Error
888877
TaskBase.taskObj.taskBack.emit(backData.bakParam, pickle.dumps(data))
889878
return
890879

@@ -897,13 +886,14 @@ def __call__(self, backData):
897886
if consume >= 3.0:
898887
break
899888
consume = time.time() - now
900-
downloadSize = getSize / max(0.0001, consume)
889+
downloadSize = getSize / consume
901890
speed = ToolUtil.GetDownloadSize(downloadSize)
902891
if backData.bakParam:
903892
data["data"] = speed
904893
TaskBase.taskObj.taskBack.emit(backData.bakParam, pickle.dumps(data))
905894

906895
except Exception as es:
907896
Log.Error(es)
897+
data["st"] = Status.DownloadFail
908898
if backData.bakParam:
909899
TaskBase.taskObj.taskBack.emit(backData.bakParam, pickle.dumps(data))

0 commit comments

Comments
 (0)