taotoolkit 2.0.0__tar.gz → 2.0.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: taotoolkit
3
- Version: 2.0.0
3
+ Version: 2.0.1
4
4
  Summary: Tao ToolKit
5
5
  Author-email: taotaoli <taotaoli@asrmicro.com>
6
6
  License-Expression: MIT
@@ -19,7 +19,7 @@ Requires-Dist: beautifulsoup4>=4.10.0
19
19
  Requires-Dist: pyyaml>=6.0.3
20
20
  Requires-Dist: pywinpty>=3.0.5; platform_system == "Windows"
21
21
  Provides-Extra: uiautomator
22
- Requires-Dist: uiautomator2>=2.0.0; extra == "uiautomator"
22
+ Requires-Dist: uiautomator2>=2.0.1; extra == "uiautomator"
23
23
 
24
24
  # TAO - Toolkit
25
25
 
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "taotoolkit"
7
- version = "2.0.0"
7
+ version = "2.0.1"
8
8
  description = "Tao ToolKit"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.8"
@@ -29,5 +29,5 @@ dependencies = [
29
29
 
30
30
  [project.optional-dependencies]
31
31
  uiautomator = [
32
- "uiautomator2>=2.0.0",
32
+ "uiautomator2>=2.0.1",
33
33
  ]
@@ -39,7 +39,7 @@ from .tao_camDvt import camDvtMain as camDvtMain, printHelp as camDvtHelp, CamDv
39
39
 
40
40
  from .asrVrf import Vrf
41
41
 
42
- __version__ = "2.0.0"
42
+ __version__ = "2.0.1"
43
43
 
44
44
  __all__ = [
45
45
  "debugCtrl",
@@ -1034,27 +1034,67 @@ class DevOp:
1034
1034
  sleep(interval)
1035
1035
  return False
1036
1036
 
1037
+ def getRefJpgSize(self, path: str, maxCount=5) -> Optional[int]:
1038
+ """取目录内最近几张 jpg 的中位尺寸, 用于识别 offlineSession 先落盘的小图"""
1039
+ out = rCmd(f"adb -s {self.serial} shell ls -lt {path}")[0]
1040
+ sizes = []
1041
+ for line in out.splitlines():
1042
+ parts = line.split()
1043
+ if len(parts) < 5 or not parts[4].isdigit():
1044
+ continue
1045
+ fileName = parts[-1].lower()
1046
+ if fileName.endswith((".jpg", ".jpeg")) and "thumb" not in fileName:
1047
+ sizes.append(int(parts[4]))
1048
+ if len(sizes) >= maxCount:
1049
+ break
1050
+ if not sizes:
1051
+ return None
1052
+ sizes.sort()
1053
+ return sizes[len(sizes) // 2]
1054
+
1037
1055
  def capJPG(self, name="null", wait=10):
1038
1056
  outPath = self.curPath
1039
1057
  logi(f"capture {os.path.join(outPath, name)}.jpg")
1040
1058
  jpgPath = r"/sdcard/DCIM/Camera/"
1041
1059
  oldFileList = self.getSuffixList(jpgPath, "jpg", "jpeg")
1060
+ refSize = self.getRefJpgSize(jpgPath)
1061
+ logd(f"ref jpg size {refSize}")
1042
1062
  cmd = f"adb -s {self.serial} shell input keyevent 27"
1043
1063
  rCmd(cmd, showCmd=True, logLevel="info")
1044
1064
 
1045
1065
  # 轮询替代固定等待: wait 为总超时(秒), 新文件写入稳定后立即返回
1066
+ # offlineSession 会先落一张小图(如 1440x1080)再替换为满尺寸图, 仅判稳定会拉到小图,
1067
+ # 故尺寸明显小于历史照片时跳过, 等大图替换完成; 无历史照片时加长稳定窗口
1068
+ stable_s = 1.0 if refSize else 2.5
1046
1069
  deadline = time.time() + wait
1047
1070
  jpgName = None
1071
+ fallbackName = None
1072
+ fallbackSize = 0
1048
1073
  while time.time() < deadline:
1049
1074
  fileList = [f for f in self.getSuffixList(jpgPath, "jpg", "jpeg") if "~" not in f]
1050
- jpgNameList = list(set(fileList) - set(oldFileList))
1051
- if jpgNameList:
1052
- jpgName = jpgNameList[0]
1053
- if self.waitFileStable(jpgPath + jpgName, timeOut=max(deadline - time.time(), 1.0)):
1075
+ for file in [f for f in fileList if f not in oldFileList]:
1076
+ size = self.getRemoteFileSize(jpgPath + file)
1077
+ if not size:
1078
+ continue
1079
+ if size > fallbackSize:
1080
+ fallbackName = file
1081
+ fallbackSize = size
1082
+ if refSize and size < refSize * 0.5:
1083
+ logd(f"skip intermediate jpg {file} size {size} < ref {refSize}")
1084
+ continue
1085
+ jpgName = file
1086
+ break
1087
+ if jpgName is not None:
1088
+ if self.waitFileStable(jpgPath + jpgName, timeOut=max(deadline - time.time(), 1.0), stable_s=stable_s):
1054
1089
  break
1055
1090
  jpgName = None
1056
1091
  sleep(0.2)
1057
1092
 
1093
+ if jpgName is None and fallbackName is not None:
1094
+ # 超时仍无满尺寸图时退回最大新文件, 避免直接失败
1095
+ logw(f"no full-size jpg before timeout, use largest new file {fallbackName}")
1096
+ if self.waitFileStable(jpgPath + fallbackName, timeOut=1.0, stable_s=0.5):
1097
+ jpgName = fallbackName
1058
1098
  if jpgName is None:
1059
1099
  loge(f"capture {os.path.join(outPath, name)}.jpg failed")
1060
1100
  return False
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: taotoolkit
3
- Version: 2.0.0
3
+ Version: 2.0.1
4
4
  Summary: Tao ToolKit
5
5
  Author-email: taotaoli <taotaoli@asrmicro.com>
6
6
  License-Expression: MIT
@@ -19,7 +19,7 @@ Requires-Dist: beautifulsoup4>=4.10.0
19
19
  Requires-Dist: pyyaml>=6.0.3
20
20
  Requires-Dist: pywinpty>=3.0.5; platform_system == "Windows"
21
21
  Provides-Extra: uiautomator
22
- Requires-Dist: uiautomator2>=2.0.0; extra == "uiautomator"
22
+ Requires-Dist: uiautomator2>=2.0.1; extra == "uiautomator"
23
23
 
24
24
  # TAO - Toolkit
25
25
 
@@ -14,4 +14,4 @@ pyyaml>=6.0.3
14
14
  pywinpty>=3.0.5
15
15
 
16
16
  [uiautomator]
17
- uiautomator2>=2.0.0
17
+ uiautomator2>=2.0.1
File without changes
File without changes