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/client.py +260 -188
- p115client/tool/attr.py +11 -5
- p115client/tool/download.py +350 -262
- p115client/tool/edit.py +27 -35
- p115client/tool/export_dir.py +37 -26
- p115client/tool/history.py +135 -11
- p115client/tool/iterdir.py +2407 -3292
- p115client/tool/life.py +7 -1
- p115client/tool/upload.py +28 -20
- p115client/tool/util.py +23 -20
- p115client/tool/xys.py +0 -1
- p115client/type.py +9 -2
- {p115client-0.0.5.12.3.dist-info → p115client-0.0.5.13.dist-info}/METADATA +5 -4
- p115client-0.0.5.13.dist-info/RECORD +28 -0
- p115client-0.0.5.12.3.dist-info/RECORD +0 -28
- {p115client-0.0.5.12.3.dist-info → p115client-0.0.5.13.dist-info}/LICENSE +0 -0
- {p115client-0.0.5.12.3.dist-info → p115client-0.0.5.13.dist-info}/WHEEL +0 -0
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
|
-
|
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",
|
7
|
-
"
|
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
|
-
|
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
|
-
|
90
|
-
if
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
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
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
|
120
|
+
"""115 登录的 cookies,包含 UID、CID、KID 和 SEID 这 4 个字段
|
117
121
|
"""
|
118
|
-
|
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.
|
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.
|
35
|
-
Requires-Dist: python-concurrenttools (>=0.0
|
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.
|
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,,
|
File without changes
|
File without changes
|