p115client 0.0.5.12.3__py3-none-any.whl → 0.0.5.13__py3-none-any.whl

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.
p115client/tool/life.py CHANGED
@@ -19,6 +19,7 @@ from iterutils import run_gen_step_iter, with_iter_next, Yield
19
19
  from p115client import check_response, P115Client
20
20
 
21
21
 
22
+ # 115 生活操作事件,默认在迭代时会被忽略的一些事件(都是一些浏览而不是改动的操作)
22
23
  IGNORE_BEHAVIOR_TYPES: Final = frozenset((3, 4, 7, 8, 9, 10, 19))
23
24
  #: 115 生活操作事件名称到类型的映射
24
25
  BEHAVIOR_NAME_TO_TYPE: Final = {
@@ -181,6 +182,7 @@ def iter_life_behavior_once(
181
182
  from_time: int | float = 0,
182
183
  from_id: int = 0,
183
184
  type: str = "",
185
+ ignore_types: None | Container[int] = IGNORE_BEHAVIOR_TYPES,
184
186
  date: str = "",
185
187
  first_batch_size = 0,
186
188
  app: str = "web",
@@ -196,6 +198,7 @@ def iter_life_behavior_once(
196
198
  from_time: int | float = 0,
197
199
  from_id: int = 0,
198
200
  type: str = "",
201
+ ignore_types: None | Container[int] = IGNORE_BEHAVIOR_TYPES,
199
202
  date: str = "",
200
203
  first_batch_size = 0,
201
204
  app: str = "web",
@@ -210,6 +213,7 @@ def iter_life_behavior_once(
210
213
  from_time: int | float = 0,
211
214
  from_id: int = 0,
212
215
  type: str = "",
216
+ ignore_types: None | Container[int] = IGNORE_BEHAVIOR_TYPES,
213
217
  date: str = "",
214
218
  first_batch_size = 0,
215
219
  app: str = "web",
@@ -229,6 +233,7 @@ def iter_life_behavior_once(
229
233
  :param from_time: 开始时间(含),若为 0 则从当前时间开始,若小于 0 则从最早开始
230
234
  :param from_id: 开始的事件 id (不含)
231
235
  :param type: 指定拉取的操作事件名称,若不指定则是全部
236
+ :param ignore_types: 一组要被忽略的操作事件类型代码,仅当 `type` 为空时生效
232
237
  :param date: 日期,格式为 YYYY-MM-DD,若指定则只拉取这一天的数据
233
238
  :param first_batch_size: 首批的拉取数目
234
239
  :param app: 使用某个 app (设备)的接口
@@ -262,7 +267,8 @@ def iter_life_behavior_once(
262
267
  return
263
268
  fid = event["file_id"]
264
269
  if fid not in seen:
265
- yield Yield(event)
270
+ if type or not ignore_types or event["type"] not in ignore_types:
271
+ yield Yield(event)
266
272
  seen_add(fid)
267
273
  offset += len(events)
268
274
  if offset >= int(resp["data"]["count"]):
p115client/tool/upload.py CHANGED
@@ -34,6 +34,7 @@ from p115client._upload import (
34
34
  oss_multipart_part_iter, oss_multipart_upload_init,
35
35
  oss_multipart_upload_url, oss_multipart_upload_complete,
36
36
  )
37
+ from p115pickcode import to_id
37
38
  from urlopen import urlopen
38
39
  from yarl import URL
39
40
 
@@ -45,12 +46,13 @@ from .util import determine_part_size
45
46
  ALIYUN_DOMAIN = "oss-cn-shenzhen.aliyuncs.com"
46
47
 
47
48
 
49
+ # TODO: 支持 open 接口
48
50
  @overload
49
51
  def iter_115_to_115(
50
52
  from_client: P115Client,
51
53
  to_client: P115Client,
52
- from_cid: int = 0,
53
- to_pid: int = 0,
54
+ from_cid: int | str = 0,
55
+ to_pid: int | str = 0,
54
56
  max_workers: int = 8,
55
57
  with_root: bool = True,
56
58
  use_iter_files: bool = False,
@@ -63,8 +65,8 @@ def iter_115_to_115(
63
65
  def iter_115_to_115(
64
66
  from_client: P115Client,
65
67
  to_client: P115Client,
66
- from_cid: int = 0,
67
- to_pid: int = 0,
68
+ from_cid: int | str = 0,
69
+ to_pid: int | str = 0,
68
70
  max_workers: int = 8,
69
71
  with_root: bool = True,
70
72
  use_iter_files: bool = False,
@@ -76,8 +78,8 @@ def iter_115_to_115(
76
78
  def iter_115_to_115(
77
79
  from_client: P115Client,
78
80
  to_client: P115Client,
79
- from_cid: int = 0,
80
- to_pid: int = 0,
81
+ from_cid: int | str = 0,
82
+ to_pid: int | str = 0,
81
83
  max_workers: int = 8,
82
84
  with_root: bool = True,
83
85
  use_iter_files: bool = False,
@@ -88,8 +90,8 @@ def iter_115_to_115(
88
90
 
89
91
  :param from_client: 来源 115 客户端对象
90
92
  :param to_client: 去向 115 客户端对象
91
- :param from_cid: 来源 115 的目录 id
92
- :param to_pid: 去向 115 的父目录 id
93
+ :param from_cid: 来源 115 的目录 id 或 pickcode
94
+ :param to_pid: 去向 115 的父目录 id 或 pickcode
93
95
  :param max_workers: 最大并发数
94
96
  :param with_root: 是否保留 `from_cid` 对应的目录名(如果为 False,则会少 1 级目录)
95
97
  :param use_iter_files: 如果为 True,则调用 iter_files_with_path,否则调用 iter_download_files
@@ -98,6 +100,8 @@ def iter_115_to_115(
98
100
 
99
101
  :return: 迭代器,产生转移结果,有 3 种类型:"good"、"fail" 和 "skip"
100
102
  """
103
+ from_cid = to_id(from_cid)
104
+ to_pid = to_id(to_pid)
101
105
  @as_gen_step
102
106
  def upload(attr: dict, pid: int, /):
103
107
  @as_gen_step
@@ -218,12 +222,13 @@ def iter_115_to_115(
218
222
 
219
223
 
220
224
  # TODO: 支持一次性把所有文件找完,也支持慢慢处理(可能会风控)
225
+ # TODO: 支持 open 接口
221
226
  @overload
222
227
  def iter_115_to_115_resume(
223
228
  from_client: P115Client,
224
229
  to_client: P115Client,
225
- from_cid: int = 0,
226
- to_pid: int = 0,
230
+ from_cid: int | str = 0,
231
+ to_pid: int | str = 0,
227
232
  max_workers: int = 8,
228
233
  with_root: bool = True,
229
234
  *,
@@ -235,8 +240,8 @@ def iter_115_to_115_resume(
235
240
  def iter_115_to_115_resume(
236
241
  from_client: P115Client,
237
242
  to_client: P115Client,
238
- from_cid: int = 0,
239
- to_pid: int = 0,
243
+ from_cid: int | str = 0,
244
+ to_pid: int | str = 0,
240
245
  max_workers: int = 8,
241
246
  with_root: bool = True,
242
247
  *,
@@ -247,8 +252,8 @@ def iter_115_to_115_resume(
247
252
  def iter_115_to_115_resume(
248
253
  from_client: P115Client,
249
254
  to_client: P115Client,
250
- from_cid: int = 0,
251
- to_pid: int = 0,
255
+ from_cid: int | str = 0,
256
+ to_pid: int | str = 0,
252
257
  max_workers: int = 8,
253
258
  with_root: bool = True,
254
259
  *,
@@ -259,8 +264,8 @@ def iter_115_to_115_resume(
259
264
 
260
265
  :param from_client: 来源 115 客户端对象
261
266
  :param to_client: 去向 115 客户端对象
262
- :param from_cid: 来源 115 的目录 id(文件数最好控制在 100 万以内,太多的话,里面多个子文件夹分别传即可)
263
- :param to_pid: 去向 115 的父目录 id
267
+ :param from_cid: 来源 115 的目录 id 或 pickcode(文件数最好控制在 100 万以内,太多的话,里面多个子文件夹分别传即可)
268
+ :param to_pid: 去向 115 的父目录 id 或 pickcode
264
269
  :param max_workers: 最大并发数
265
270
  :param with_root: 是否保留 `from_cid` 对应的目录名(如果为 False,则会少 1 级目录)
266
271
  :param async_: 是否异步
@@ -268,6 +273,8 @@ def iter_115_to_115_resume(
268
273
 
269
274
  :return: 迭代器,产生转移结果,有 3 种类型:"good"、"fail" 和 "skip"
270
275
  """
276
+ from_cid = to_id(from_cid)
277
+ to_pid = to_id(to_pid)
271
278
  @as_gen_step
272
279
  def upload(attr: dict, pid: int, /):
273
280
  @as_gen_step
@@ -463,7 +470,7 @@ def iter_115_to_115_resume(
463
470
  def multipart_upload_init(
464
471
  client: str | P115Client | P115OpenClient,
465
472
  path: str | PathLike | URL | SupportsGeturl,
466
- pid: int = 0,
473
+ pid: int | str = 0,
467
474
  filename: str = "",
468
475
  filesize: int = -1,
469
476
  filesha1: str = "",
@@ -480,7 +487,7 @@ def multipart_upload_init(
480
487
  def multipart_upload_init(
481
488
  client: str | P115Client | P115OpenClient,
482
489
  path: str | PathLike | URL | SupportsGeturl,
483
- pid: int = 0,
490
+ pid: int | str = 0,
484
491
  filename: str = "",
485
492
  filesize: int = -1,
486
493
  filesha1: str = "",
@@ -496,7 +503,7 @@ def multipart_upload_init(
496
503
  def multipart_upload_init(
497
504
  client: str | P115Client | P115OpenClient,
498
505
  path: str | PathLike | URL | SupportsGeturl,
499
- pid: int = 0,
506
+ pid: int | str = 0,
500
507
  filename: str = "",
501
508
  filesize: int = -1,
502
509
  filesha1: str = "",
@@ -512,7 +519,7 @@ def multipart_upload_init(
512
519
 
513
520
  :param client: 115 客户端或 cookies
514
521
  :param path: 路径 或 链接(仅支持 GET 请求,http(s)协议)
515
- :param pid: 上传文件到此目录的 id
522
+ :param pid: 上传文件到此目录的 id 或 pickcode
516
523
  :param filename: 文件名,若为空则自动确定
517
524
  :param filesize: 文件大小,若为负数则自动计算
518
525
  :param filesha1: 文件的 sha1 摘要,若为空则自动计算
@@ -525,6 +532,7 @@ def multipart_upload_init(
525
532
 
526
533
  :return: 如果秒传成功,则返回响应信息(有 "status" 字段),否则返回上传配置信息(可用于断点续传)
527
534
  """
535
+ pid = to_id(pid)
528
536
  if not domain:
529
537
  domain = ALIYUN_DOMAIN
530
538
  if isinstance(client, str):
p115client/tool/util.py CHANGED
@@ -3,24 +3,24 @@
3
3
 
4
4
  __author__ = "ChenyangGao <https://chenyanggao.github.io>"
5
5
  __all__ = [
6
- "get_status_code", "is_timeouterror", "posix_escape_name", "reduce_image_url_layers",
7
- "share_extract_payload", "unescape_115_charref", "determine_part_size",
6
+ "get_status_code", "is_timeouterror", "posix_escape_name",
7
+ "reduce_image_url_layers", "share_extract_payload",
8
+ "unescape_115_charref", "determine_part_size",
8
9
  ]
9
10
  __doc__ = "这个模块提供了一些工具函数"
10
11
 
11
12
  from re import compile as re_compile
12
- from typing import cast, Final, TypedDict
13
- from urllib.parse import urlsplit
13
+ from typing import cast, Final, NotRequired, TypedDict
14
+ from urllib.parse import parse_qsl, urlsplit
14
15
 
15
16
 
16
17
  CRE_115_CHARREF_sub: Final = re_compile("\\[\x02([0-9]+)\\]").sub
17
- CRE_SHARE_LINK_search1 = re_compile(r"(?:/s/|share\.115\.com/)(?P<share_code>[a-z0-9]+)\?password=(?:(?P<receive_code>[a-z0-9]{4}))?").search
18
- CRE_SHARE_LINK_search2 = re_compile(r"(?P<share_code>[a-z0-9]+)(?:-(?P<receive_code>[a-z0-9]{4}))?").search
18
+ CRE_SHARE_LINK_search = re_compile(r"(?:^|(?<=/))(?P<share_code>[a-z0-9]+)(?:-|\?|\?password=)(?P<receive_code>[a-z0-9]{4})").search
19
19
 
20
20
 
21
21
  class SharePayload(TypedDict):
22
22
  share_code: str
23
- receive_code: None | str
23
+ receive_code: NotRequired[None | str]
24
24
 
25
25
 
26
26
  def get_status_code(e: BaseException, /) -> None | int:
@@ -78,20 +78,23 @@ def reduce_image_url_layers(url: str, /, size: str | int = "") -> str:
78
78
 
79
79
  def share_extract_payload(link: str, /) -> SharePayload:
80
80
  """从链接中提取 share_code 和 receive_code
81
-
82
- .. hint::
83
- `link` 支持 3 种形式(圆括号中的字符表示可有可无):
84
-
85
- 1. http(s)://115.com/s/{share_code}?password={receive_code}(#) 或 http(s)://share.115.com/{share_code}?password={receive_code}(#)
86
- 2. (/){share_code}-{receive_code}(/)
87
- 3. {share_code}
88
81
  """
89
- m = CRE_SHARE_LINK_search1(link)
90
- if m is None:
91
- m = CRE_SHARE_LINK_search2(link)
92
- if m is None:
93
- raise ValueError("not a valid 115 share link")
94
- return cast(SharePayload, m.groupdict())
82
+ link = link.strip("/")
83
+ if link.isalnum():
84
+ return SharePayload(share_code=link)
85
+ elif m := CRE_SHARE_LINK_search(link):
86
+ return cast(SharePayload, m.groupdict())
87
+ urlp = urlsplit(link)
88
+ if urlp.path:
89
+ payload = SharePayload(share_code=urlp.path.rstrip("/").rpartition("/")[-1])
90
+ if urlp.query:
91
+ for k, v in parse_qsl(urlp.query):
92
+ if k == "password":
93
+ payload["receive_code"] = v
94
+ break
95
+ return payload
96
+ else:
97
+ raise ValueError("can't extract share_code for {link!r}")
95
98
 
96
99
 
97
100
  def unescape_115_charref(s: str, /) -> str:
p115client/tool/xys.py CHANGED
@@ -391,5 +391,4 @@ def wish_aid_iter(
391
391
  payload["page"] += 1
392
392
  return run_gen_step_iter(gen_step, async_)
393
393
 
394
-
395
394
  # TODO: 再实现一个漂流瓶
p115client/type.py CHANGED
@@ -81,6 +81,10 @@ class P115Cookies(str):
81
81
  def cid(self, /) -> str:
82
82
  return self.mapping["CID"]
83
83
 
84
+ @cached_property
85
+ def kid(self, /) -> str:
86
+ return self.mapping["KID"]
87
+
84
88
  @cached_property
85
89
  def seid(self, /) -> str:
86
90
  return self.mapping["SEID"]
@@ -113,9 +117,12 @@ class P115Cookies(str):
113
117
 
114
118
  @cached_property
115
119
  def cookies(self, /) -> str:
116
- """115 登录的 cookies,包含 UID, CID 和 SEID 这 3 个字段
120
+ """115 登录的 cookies,包含 UIDCID、KID 和 SEID 这 4 个字段
117
121
  """
118
- return f"UID={self.uid}; CID={self.cid}; SEID={self.seid}"
122
+ cookies = f"UID={self.uid}; CID={self.cid}; SEID={self.seid}"
123
+ if "KID" in self.mapping:
124
+ cookies += f"; KID={self.mapping['KID']}"
125
+ return cookies
119
126
 
120
127
  @classmethod
121
128
  def from_cookiejar(cls, cookiejar: CookieJar, /) -> Self:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: p115client
3
- Version: 0.0.5.12.3
3
+ Version: 0.0.5.13
4
4
  Summary: Python 115 webdisk client.
5
5
  Home-page: https://github.com/ChenyangGao/p115client
6
6
  License: MIT
@@ -29,10 +29,11 @@ Requires-Dist: iter_collect (>=0.0.5.1)
29
29
  Requires-Dist: multidict
30
30
  Requires-Dist: orjson
31
31
  Requires-Dist: p115cipher (>=0.0.3)
32
+ Requires-Dist: p115pickcode (>=0.0.1)
32
33
  Requires-Dist: posixpatht (>=0.0.3)
33
34
  Requires-Dist: python-argtools (>=0.0.1)
34
- Requires-Dist: python-asynctools (>=0.1.2)
35
- Requires-Dist: python-concurrenttools (>=0.0.8.2)
35
+ Requires-Dist: python-asynctools (>=0.1.3)
36
+ Requires-Dist: python-concurrenttools (>=0.1.0)
36
37
  Requires-Dist: python-cookietools (>=0.0.2.2)
37
38
  Requires-Dist: python-dictattr (>=0.0.4)
38
39
  Requires-Dist: python-encode_uri (>=0.0.1)
@@ -40,7 +41,7 @@ Requires-Dist: python-filewrap (>=0.2.8)
40
41
  Requires-Dist: python-hashtools (>=0.0.3.3)
41
42
  Requires-Dist: python-http_request (>=0.0.6)
42
43
  Requires-Dist: python-httpfile (>=0.0.5.2)
43
- Requires-Dist: python-iterutils (>=0.2.4.1)
44
+ Requires-Dist: python-iterutils (>=0.2.5)
44
45
  Requires-Dist: python-property (>=0.0.3)
45
46
  Requires-Dist: python-startfile (>=0.0.2)
46
47
  Requires-Dist: python-undefined (>=0.0.3)
@@ -0,0 +1,28 @@
1
+ LICENSE,sha256=o5242_N2TgDsWwFhPn7yr8YJNF7XsJM5NxUMtcT97bc,1100
2
+ p115client/__init__.py,sha256=1mx7njuAlqcuEWONTjSiiGnXyyNyqOcJyNX1FMHqQ-4,214
3
+ p115client/_upload.py,sha256=199Hc9B9vUMphDdwh8vK3yCIPusIfeAzzOLpC-WZ8C8,31184
4
+ p115client/client.py,sha256=CSbn1w0yRKTxE_wCq_VmB9FIknM20Zp_SchKXS5dED0,799905
5
+ p115client/const.py,sha256=ZYtBtTFB0eljIR0tze21_52Gl0pQxvyqMmDwgB1bqNU,7803
6
+ p115client/exception.py,sha256=4SZ8ubOLMRxtcqc0u1kNzXqH1a6wwXJFwGnRDURoEgQ,3708
7
+ p115client/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
+ p115client/tool/__init__.py,sha256=IwwzbCQ7jpRoFGTQUCfGBx8zvjqjgSFs98yKpYyI46s,429
9
+ p115client/tool/attr.py,sha256=G91V71EhsqIIPkhGDnv2z6nxVq7wgl6nNPDj3AKzw1I,3079
10
+ p115client/tool/auth.py,sha256=qlRcfEjzebseiHR2dyBpOoPpxB4k8P6Tj729S2TLB1s,1672
11
+ p115client/tool/download.py,sha256=JGw_AW4qe2Uor9tmbh2ve4wFGhKyO9n26bPG8lsJmpc,64980
12
+ p115client/tool/edit.py,sha256=eAlINrXEAwAwliZFako5vrne_sLmxEyBr1Bk05YZsAc,17332
13
+ p115client/tool/export_dir.py,sha256=jq097N2Crlz4JUFgbqTUZfq8pD3fNjxQOJxDPEMN31I,24491
14
+ p115client/tool/fs_files.py,sha256=3t1R-bDUdIUGwLMZ-GhHMRpYnkYYLcsI3MzFhJzg8g8,15890
15
+ p115client/tool/history.py,sha256=9pgF9l8VvQkpjsVgtIzNcrUQZzLH9tt4JysBwJ4yHsk,11636
16
+ p115client/tool/iterdir.py,sha256=_oYETYMpeSEBW5t6A6RNMs0-owz4IjJEUV5Tw23zOPw,161383
17
+ p115client/tool/life.py,sha256=dfwm5jKfo0K9pIUZKpZ32oPBrlcfrezflSJyyDIbX8E,17721
18
+ p115client/tool/offline.py,sha256=6HaGkbsAAx3FPFvSr_7LZvrUw_fp3QRB2y2kVRHNgZ0,6291
19
+ p115client/tool/pool.py,sha256=PImYG4fU7retZVFDPYib9e87J3RvJvugOW1mxX9jSU0,13831
20
+ p115client/tool/request.py,sha256=rjXuQwRganE5Z-4rfgnyPFjE4jzdQSLdIs9s0cIDshU,7043
21
+ p115client/tool/upload.py,sha256=dpww3TGSOyjqz1EogQEJDiZ9QWERd47izZOw9mNCCiA,32945
22
+ p115client/tool/util.py,sha256=gvA-o-TcEAR3o754Kn82Bu6yggmnAhScUCrRpMVCI50,3934
23
+ p115client/tool/xys.py,sha256=r9wzE5VgpR6ATYHM1uVZ06uIU4qqVeDyRTYU6W_N_Tc,10190
24
+ p115client/type.py,sha256=h_pGKTlz07g64Y_93ylF-fUyC8g-HiQacMhu4KOXjYA,6457
25
+ p115client-0.0.5.13.dist-info/LICENSE,sha256=o5242_N2TgDsWwFhPn7yr8YJNF7XsJM5NxUMtcT97bc,1100
26
+ p115client-0.0.5.13.dist-info/METADATA,sha256=pOvhK7Guy2Pj3uLoq3e8EHWPeBc7RLqts8zENd9Q14k,8226
27
+ p115client-0.0.5.13.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
28
+ p115client-0.0.5.13.dist-info/RECORD,,
@@ -1,28 +0,0 @@
1
- LICENSE,sha256=o5242_N2TgDsWwFhPn7yr8YJNF7XsJM5NxUMtcT97bc,1100
2
- p115client/__init__.py,sha256=1mx7njuAlqcuEWONTjSiiGnXyyNyqOcJyNX1FMHqQ-4,214
3
- p115client/_upload.py,sha256=199Hc9B9vUMphDdwh8vK3yCIPusIfeAzzOLpC-WZ8C8,31184
4
- p115client/client.py,sha256=KEn5zBVTx6qfc6LCA-1zY2CcwJuYqYgXW0TIx-z41i4,796153
5
- p115client/const.py,sha256=ZYtBtTFB0eljIR0tze21_52Gl0pQxvyqMmDwgB1bqNU,7803
6
- p115client/exception.py,sha256=4SZ8ubOLMRxtcqc0u1kNzXqH1a6wwXJFwGnRDURoEgQ,3708
7
- p115client/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
- p115client/tool/__init__.py,sha256=IwwzbCQ7jpRoFGTQUCfGBx8zvjqjgSFs98yKpYyI46s,429
9
- p115client/tool/attr.py,sha256=8szVu_V3_s0DU4oL3wU_XpYBsBzJ3AAHZqX1oCTZlk0,2956
10
- p115client/tool/auth.py,sha256=qlRcfEjzebseiHR2dyBpOoPpxB4k8P6Tj729S2TLB1s,1672
11
- p115client/tool/download.py,sha256=_Kp5_AKNAFmBXsUvL0zm8XBkPVlJxC4n4vj6-E0t6BE,61009
12
- p115client/tool/edit.py,sha256=UCECvHYTy_GGpsaYbaNGtEBT0s5pMD4k1M-s8GG6iFI,17725
13
- p115client/tool/export_dir.py,sha256=WZAiRFqe984-oXTEgkVhwHi4MTrExVL_tGZIzWCkdL0,24364
14
- p115client/tool/fs_files.py,sha256=3t1R-bDUdIUGwLMZ-GhHMRpYnkYYLcsI3MzFhJzg8g8,15890
15
- p115client/tool/history.py,sha256=Hk7W1Qko6P68AoukNc-cYFoGV5XemtZBqWBEm4uKt5c,7416
16
- p115client/tool/iterdir.py,sha256=t17T5XTCof7ZAbPKAzTAyhpVzfknVsJFb4SK5giXdsI,199635
17
- p115client/tool/life.py,sha256=Ik8jdFM9_DiT5ivd5h2Hag4ViBVOY5WRCCrmbCqKnMY,17209
18
- p115client/tool/offline.py,sha256=6HaGkbsAAx3FPFvSr_7LZvrUw_fp3QRB2y2kVRHNgZ0,6291
19
- p115client/tool/pool.py,sha256=PImYG4fU7retZVFDPYib9e87J3RvJvugOW1mxX9jSU0,13831
20
- p115client/tool/request.py,sha256=rjXuQwRganE5Z-4rfgnyPFjE4jzdQSLdIs9s0cIDshU,7043
21
- p115client/tool/upload.py,sha256=z8eD5BAlw6SgWdaJBJ4VtyDMPr8xG3wz6oCxE6xxPTg,32568
22
- p115client/tool/util.py,sha256=pAa8gc4BcnVTpNcXbNZU4tBUMjSB04DGOpzDdzfbto8,3934
23
- p115client/tool/xys.py,sha256=Xx8sRh4h4jlowFhRMTDTtOhftgmhevehAU27jMsKh8s,10191
24
- p115client/type.py,sha256=7kOp98uLaYqcTTCgCrb3DRcl8ukMpn7ibsnVvtw2nG8,6250
25
- p115client-0.0.5.12.3.dist-info/LICENSE,sha256=o5242_N2TgDsWwFhPn7yr8YJNF7XsJM5NxUMtcT97bc,1100
26
- p115client-0.0.5.12.3.dist-info/METADATA,sha256=aJFJYIWgaAVDYRNfThXftTSdDHHoqEiSyiCVWQHmbwo,8194
27
- p115client-0.0.5.12.3.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
28
- p115client-0.0.5.12.3.dist-info/RECORD,,