p115client 0.0.5.9.2__tar.gz → 0.0.5.10__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.
- {p115client-0.0.5.9.2 → p115client-0.0.5.10}/PKG-INFO +3 -3
- {p115client-0.0.5.9.2 → p115client-0.0.5.10}/p115client/client.py +160 -75
- {p115client-0.0.5.9.2 → p115client-0.0.5.10}/p115client/const.py +183 -1
- {p115client-0.0.5.9.2 → p115client-0.0.5.10}/p115client/exception.py +42 -18
- {p115client-0.0.5.9.2 → p115client-0.0.5.10}/p115client/tool/__init__.py +2 -0
- p115client-0.0.5.10/p115client/tool/attr.py +104 -0
- {p115client-0.0.5.9.2 → p115client-0.0.5.10}/p115client/tool/download.py +7 -22
- {p115client-0.0.5.9.2 → p115client-0.0.5.10}/p115client/tool/edit.py +1 -2
- {p115client-0.0.5.9.2 → p115client-0.0.5.10}/p115client/tool/fs_files.py +4 -13
- {p115client-0.0.5.9.2 → p115client-0.0.5.10}/p115client/tool/iterdir.py +56 -101
- {p115client-0.0.5.9.2 → p115client-0.0.5.10}/p115client/tool/life.py +1 -1
- {p115client-0.0.5.9.2 → p115client-0.0.5.10}/p115client/tool/pool.py +6 -29
- {p115client-0.0.5.9.2 → p115client-0.0.5.10}/p115client/tool/request.py +1 -0
- p115client-0.0.5.10/p115client/tool/util.py +107 -0
- p115client-0.0.5.10/p115client/tool/xys.py +392 -0
- {p115client-0.0.5.9.2 → p115client-0.0.5.10}/p115client/type.py +16 -1
- {p115client-0.0.5.9.2 → p115client-0.0.5.10}/pyproject.toml +1 -1
- {p115client-0.0.5.9.2 → p115client-0.0.5.10}/readme.md +2 -2
- p115client-0.0.5.9.2/p115client/tool/xys.py +0 -125
- {p115client-0.0.5.9.2 → p115client-0.0.5.10}/LICENSE +0 -0
- {p115client-0.0.5.9.2 → p115client-0.0.5.10}/p115client/__init__.py +0 -0
- {p115client-0.0.5.9.2 → p115client-0.0.5.10}/p115client/_upload.py +0 -0
- {p115client-0.0.5.9.2 → p115client-0.0.5.10}/p115client/py.typed +0 -0
- {p115client-0.0.5.9.2 → p115client-0.0.5.10}/p115client/tool/export_dir.py +0 -0
- {p115client-0.0.5.9.2 → p115client-0.0.5.10}/p115client/tool/history.py +0 -0
- {p115client-0.0.5.9.2 → p115client-0.0.5.10}/p115client/tool/upload.py +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: p115client
|
3
|
-
Version: 0.0.5.
|
3
|
+
Version: 0.0.5.10
|
4
4
|
Summary: Python 115 webdisk client.
|
5
5
|
Home-page: https://github.com/ChenyangGao/p115client
|
6
6
|
License: MIT
|
@@ -108,7 +108,7 @@ client = P115Client(Path("~/115-cookies.txt").expanduser(), check_for_relogin=Tr
|
|
108
108
|
|
109
109
|
如果你有一个申请通过的开放接口的应用,则可以创建开放接口的客户端实例
|
110
110
|
|
111
|
-
你可以直接从一个 `P115Client`
|
111
|
+
你可以直接从一个 `P115Client` 实例拿到授权(自动扫码登录并授权),如果不提供 `app_id`,则使用默认值
|
112
112
|
|
113
113
|
```python
|
114
114
|
app_id = <开放接口应用的 AppID>
|
@@ -143,7 +143,7 @@ from p115client import P115Client, P115OpenClient
|
|
143
143
|
from pathlib import Path
|
144
144
|
|
145
145
|
client = P115Client(Path("~/115-cookies.txt").expanduser(), check_for_relogin=True)
|
146
|
-
client_open = client.login_another_open(
|
146
|
+
client_open = client.login_another_open()
|
147
147
|
```
|
148
148
|
|
149
149
|
### 2. 接口调用
|
@@ -16,23 +16,20 @@ from collections.abc import (
|
|
16
16
|
ItemsView, Iterable, Iterator, Mapping, MutableMapping, Sequence,
|
17
17
|
)
|
18
18
|
from datetime import date, datetime, timedelta
|
19
|
-
from errno import EBUSY, EEXIST, EFBIG, EINVAL, EIO, EISDIR, ENODATA, ENOENT, ENOSPC, ENOSYS, ENOTSUP
|
20
19
|
from functools import partial
|
21
20
|
from hashlib import md5, sha1
|
22
21
|
from http.cookiejar import Cookie, CookieJar
|
23
22
|
from http.cookies import Morsel
|
24
23
|
from inspect import isawaitable
|
25
|
-
from itertools import count, cycle,
|
24
|
+
from itertools import count, cycle, product, repeat
|
26
25
|
from math import nan
|
27
26
|
from operator import itemgetter
|
28
|
-
from os import fsdecode, fstat, isatty,
|
27
|
+
from os import fsdecode, fstat, isatty, PathLike, path as ospath
|
29
28
|
from pathlib import Path, PurePath
|
30
29
|
from platform import system
|
31
30
|
from posixpath import splitext
|
32
31
|
from re import compile as re_compile, MULTILINE
|
33
32
|
from string import digits
|
34
|
-
from sys import exc_info
|
35
|
-
from _thread import start_new_thread
|
36
33
|
from tempfile import TemporaryFile
|
37
34
|
from threading import Lock
|
38
35
|
from time import time
|
@@ -57,17 +54,20 @@ from http_response import get_total_length
|
|
57
54
|
from httpfile import HTTPFileReader, AsyncHTTPFileReader
|
58
55
|
from iterutils import run_gen_step
|
59
56
|
from orjson import dumps, loads
|
60
|
-
from p115cipher.fast import
|
57
|
+
from p115cipher.fast import (
|
58
|
+
rsa_encode, rsa_decode, ecdh_encode_token, ecdh_aes_encode, ecdh_aes_decode, make_upload_payload,
|
59
|
+
)
|
61
60
|
from property import locked_cacheproperty
|
62
61
|
from re import compile as re_compile
|
63
62
|
from startfile import startfile, startfile_async # type: ignore
|
64
63
|
from undefined import undefined
|
65
64
|
from yarl import URL
|
66
65
|
|
67
|
-
from .const import CLASS_TO_TYPE, CLIENT_API_MAP, SSOENT_TO_APP, SUFFIX_TO_TYPE
|
66
|
+
from .const import CLASS_TO_TYPE, CLIENT_API_MAP, SSOENT_TO_APP, SUFFIX_TO_TYPE, errno
|
68
67
|
from .exception import (
|
69
68
|
AuthenticationError, BusyOSError, DataError, LoginError, NotSupportedError,
|
70
|
-
P115OSError, OperationalError, P115Warning,
|
69
|
+
P115OSError, OperationalError, P115Warning, P115FileExistsError,
|
70
|
+
P115FileNotFoundError, P115IsADirectoryError,
|
71
71
|
)
|
72
72
|
from .type import RequestKeywords, MultipartResumeData, P115Cookies, P115URL
|
73
73
|
from ._upload import buffer_length, make_dataiter, oss_upload, oss_multipart_upload
|
@@ -229,7 +229,7 @@ def json_loads(content: Buffer, /):
|
|
229
229
|
except Exception as e:
|
230
230
|
if isinstance(content, memoryview):
|
231
231
|
content = content.tobytes()
|
232
|
-
raise DataError(ENODATA, content) from e
|
232
|
+
raise DataError(errno.ENODATA, content) from e
|
233
233
|
|
234
234
|
|
235
235
|
def default_parse(resp, content: Buffer, /):
|
@@ -350,7 +350,7 @@ def check_response(resp: dict | Awaitable[dict], /) -> dict | Coroutine[Any, Any
|
|
350
350
|
"""
|
351
351
|
def check(resp, /) -> dict:
|
352
352
|
if not isinstance(resp, dict):
|
353
|
-
raise P115OSError(EIO, resp)
|
353
|
+
raise P115OSError(errno.EIO, resp)
|
354
354
|
if resp.get("state", True):
|
355
355
|
return resp
|
356
356
|
if code := get_first(resp, "errno", "errNo", "errcode", "errCode", "code"):
|
@@ -360,121 +360,206 @@ def check_response(resp: dict | Awaitable[dict], /) -> dict | Coroutine[Any, Any
|
|
360
360
|
match code:
|
361
361
|
# {"state": false, "errno": 99, "error": "请重新登录"}
|
362
362
|
case 99:
|
363
|
-
raise LoginError(
|
363
|
+
raise LoginError(errno.EAUTH, resp)
|
364
364
|
# {"state": false, "errno": 911, "error": "请验证账号"}
|
365
365
|
case 911:
|
366
|
-
raise AuthenticationError(
|
366
|
+
raise AuthenticationError(errno.EAUTH, resp)
|
367
367
|
# {"state": false, "errno": 20001, "error": "目录名称不能为空"}
|
368
368
|
case 20001:
|
369
|
-
raise OperationalError(EINVAL, resp)
|
369
|
+
raise OperationalError(errno.EINVAL, resp)
|
370
370
|
# {"state": false, "errno": 20004, "error": "该目录名称已存在。"}
|
371
371
|
case 20004:
|
372
|
-
raise
|
372
|
+
raise P115FileExistsError(errno.EEXIST, resp)
|
373
373
|
# {"state": false, "errno": 20009, "error": "父目录不存在。"}
|
374
374
|
case 20009:
|
375
|
-
raise
|
375
|
+
raise P115FileNotFoundError(errno.ENOENT, resp)
|
376
376
|
# {"state": false, "errno": 20018, "error": "文件不存在或已删除。"}
|
377
377
|
# {"state": false, "errno": 50015, "error": "文件不存在或已删除。"}
|
378
378
|
# {"state": false, "errno": 90008, "error": "文件(夹)不存在或已经删除。"}
|
379
379
|
# {"state": false, "errno": 430004, "error": "文件(夹)不存在或已删除。"}
|
380
380
|
case 20018 | 50015 | 90008 | 430004:
|
381
|
-
raise
|
381
|
+
raise P115FileNotFoundError(errno.ENOENT, resp)
|
382
382
|
# {"state": false, "errno": 20020, "error": "后缀名不正确,请重新输入"}
|
383
|
-
case 20020:
|
384
|
-
raise OperationalError(ENOTSUP, resp)
|
385
383
|
# {"state": false, "errno": 20021, "error": "后缀名不正确,请重新输入"}
|
386
|
-
case 20021:
|
387
|
-
raise OperationalError(
|
384
|
+
case 20020 | 20021:
|
385
|
+
raise OperationalError(errno.EINVAL, resp)
|
388
386
|
# {"state": false, "errno": 31001, "error": "所预览的文件不存在。"}
|
389
387
|
case 31001:
|
390
|
-
raise
|
388
|
+
raise P115FileNotFoundError(errno.ENOENT, resp)
|
391
389
|
# {"state": false, "errno": 31004, "error": "文档未上传完整,请上传完成后再进行查看。"}
|
392
390
|
case 31004:
|
393
|
-
raise
|
391
|
+
raise P115FileNotFoundError(errno.ENOENT, resp)
|
394
392
|
# {"state": false, "errno": 50003, "error": "很抱歉,该文件提取码不存在。"}
|
395
393
|
case 50003:
|
396
|
-
raise
|
394
|
+
raise P115FileNotFoundError(errno.ENOENT, resp)
|
397
395
|
# {"state": false, "errno": 91002, "error": "不能将文件复制到自身或其子目录下。"}
|
398
396
|
case 91002:
|
399
|
-
raise NotSupportedError(ENOTSUP, resp)
|
397
|
+
raise NotSupportedError(errno.ENOTSUP, resp)
|
400
398
|
# {"state": false, "errno": 91004, "error": "操作的文件(夹)数量超过5万个"}
|
401
399
|
case 91004:
|
402
|
-
raise NotSupportedError(ENOTSUP, resp)
|
400
|
+
raise NotSupportedError(errno.ENOTSUP, resp)
|
403
401
|
# {"state": false, "errno": 91005, "error": "空间不足,复制失败。"}
|
404
402
|
case 91005:
|
405
|
-
raise OperationalError(ENOSPC, resp)
|
403
|
+
raise OperationalError(errno.ENOSPC, resp)
|
406
404
|
# {"state": false, "errno": 231011, "error": "文件已删除,请勿重复操作"}
|
407
405
|
case 231011:
|
408
|
-
raise
|
406
|
+
raise P115FileNotFoundError(errno.ENOENT, resp)
|
409
407
|
# {"state": false, "errno": 300104, "error": "文件超过200MB,暂不支持播放"}
|
410
408
|
case 300104:
|
411
|
-
raise P115OSError(EFBIG, resp)
|
409
|
+
raise P115OSError(errno.EFBIG, resp)
|
412
410
|
# {"state": false, "errno": 590075, "error": "操作太频繁,请稍候再试"}
|
413
411
|
case 590075:
|
414
|
-
raise BusyOSError(EBUSY, resp)
|
412
|
+
raise BusyOSError(errno.EBUSY, resp)
|
415
413
|
# {"state": false, "errno": 800001, "error": "目录不存在。"}
|
416
414
|
case 800001:
|
417
|
-
raise
|
415
|
+
raise P115FileNotFoundError(errno.ENOENT, resp)
|
418
416
|
# {"state": false, "errno": 980006, "error": "404 Not Found"}
|
419
417
|
case 980006:
|
420
|
-
raise NotSupportedError(ENOSYS, resp)
|
418
|
+
raise NotSupportedError(errno.ENOSYS, resp)
|
421
419
|
# {"state": false, "errno": 990001, "error": "登陆超时,请重新登陆。"}
|
422
420
|
case 990001:
|
423
421
|
# NOTE: 可能就是被下线了
|
424
|
-
raise AuthenticationError(
|
422
|
+
raise AuthenticationError(errno.EAUTH, resp)
|
425
423
|
# {"state": false, "errno": 990002, "error": "参数错误。"}
|
426
424
|
case 990002:
|
427
|
-
raise
|
425
|
+
raise OperationalError(errno.EINVAL, resp)
|
428
426
|
# {"state": false, "errno": 990003, "error": "操作失败。"}
|
429
427
|
case 990003:
|
430
|
-
raise OperationalError(EIO, resp)
|
428
|
+
raise OperationalError(errno.EIO, resp)
|
431
429
|
# {"state": false, "errno": 990005, "error": "你的账号有类似任务正在处理,请稍后再试!"}
|
432
430
|
case 990005:
|
433
|
-
raise BusyOSError(EBUSY, resp)
|
431
|
+
raise BusyOSError(errno.EBUSY, resp)
|
434
432
|
# {"state": false, "errno": 990009, "error": "删除[...]操作尚未执行完成,请稍后再试!"}
|
435
433
|
# {"state": false, "errno": 990009, "error": "还原[...]操作尚未执行完成,请稍后再试!"}
|
436
434
|
# {"state": false, "errno": 990009, "error": "复制[...]操作尚未执行完成,请稍后再试!"}
|
437
435
|
# {"state": false, "errno": 990009, "error": "移动[...]操作尚未执行完成,请稍后再试!"}
|
438
436
|
case 990009:
|
439
|
-
raise BusyOSError(EBUSY, resp)
|
437
|
+
raise BusyOSError(errno.EBUSY, resp)
|
440
438
|
# {"state": false, "errno": 990023, "error": "操作的文件(夹)数量超过5万个"}
|
441
439
|
case 990023:
|
442
|
-
raise OperationalError(ENOTSUP, resp)
|
440
|
+
raise OperationalError(errno.ENOTSUP, resp)
|
443
441
|
# {"state": 0, "errno": 40100000, "error": "参数错误!"}
|
442
|
+
# {"state": 0, "errno": 40100000, "error": "参数缺失"}
|
444
443
|
case 40100000:
|
445
|
-
raise OperationalError(EINVAL, resp)
|
444
|
+
raise OperationalError(errno.EINVAL, resp)
|
446
445
|
# {"state": 0, "errno": 40101004, "error": "IP登录异常,请稍候再登录!"}
|
447
446
|
case 40101004:
|
448
|
-
raise LoginError(
|
447
|
+
raise LoginError(errno.EAUTH, resp)
|
449
448
|
# {"state": 0, "errno": 40101017, "error": "用户验证失败!"}
|
450
449
|
case 40101017:
|
451
|
-
raise AuthenticationError(
|
450
|
+
raise AuthenticationError(errno.EAUTH, resp)
|
452
451
|
# {"state": 0, "errno": 40101032, "error": "请重新登录"}
|
453
452
|
case 40101032:
|
454
|
-
raise LoginError(
|
453
|
+
raise LoginError(errno.EAUTH, resp)
|
454
|
+
#################################################################
|
455
|
+
# Reference: https://www.yuque.com/115yun/open/rnq0cbz8tt7cu43i #
|
456
|
+
#################################################################
|
457
|
+
# {"state": 0, "errno": 40110000, "error": "请求异常需要重试"}
|
458
|
+
case 40110000:
|
459
|
+
raise OperationalError(errno.EAGAIN, resp)
|
460
|
+
# {"state": 0, "errno": 40140100, "error": "client_id 错误"}
|
461
|
+
case 40140100:
|
462
|
+
raise OperationalError(errno.EINVAL, resp)
|
463
|
+
# {"state": 0, "errno": 40140101, "error": "code_challenge 必填"}
|
464
|
+
case 40140101:
|
465
|
+
raise OperationalError(errno.EINVAL, resp)
|
466
|
+
# {"state": 0, "errno": 40140102, "error": "code_challenge_method 必须是 sha256、sha1、md5 之一"}
|
467
|
+
case 40140102:
|
468
|
+
raise OperationalError(errno.EINVAL, resp)
|
469
|
+
# {"state": 0, "errno": 40140103, "error": "sign 必填"}
|
470
|
+
case 40140103:
|
471
|
+
raise OperationalError(errno.EINVAL, resp)
|
472
|
+
# {"state": 0, "errno": 40140104, "error": "sign 签名失败"}
|
473
|
+
case 40140104:
|
474
|
+
raise OperationalError(errno.EINVAL, resp)
|
475
|
+
# {"state": 0, "errno": 40140105, "error": "生成二维码失败"}
|
476
|
+
case 40140105:
|
477
|
+
raise OperationalError(errno.EIO, resp)
|
478
|
+
# {"state": 0, "errno": 40140106, "error": "APP ID 无效"}
|
479
|
+
case 40140106:
|
480
|
+
raise OperationalError(errno.EINVAL, resp)
|
481
|
+
# {"state": 0, "errno": 40140107, "error": "应用不存在"}
|
482
|
+
case 40140107:
|
483
|
+
raise OperationalError(errno.EINVAL, resp)
|
484
|
+
# {"state": 0, "errno": 40140108, "error": "应用未审核通过"}
|
485
|
+
case 40140108:
|
486
|
+
raise OperationalError(errno.EINVAL, resp)
|
487
|
+
# {"state": 0, "errno": 40140109, "error": "应用已被停用"}
|
488
|
+
case 40140109:
|
489
|
+
raise OperationalError(errno.EINVAL, resp)
|
490
|
+
# {"state": 0, "errno": 40140110, "error": "应用已过期"}
|
491
|
+
case 40140110:
|
492
|
+
raise OperationalError(errno.EINVAL, resp)
|
493
|
+
# {"state": 0, "errno": 40140111, "error": "APP Secret 错误"}
|
494
|
+
case 40140111:
|
495
|
+
raise OperationalError(errno.EINVAL, resp)
|
496
|
+
# {"state": 0, "errno": 40140112, "error": "code_verifier 长度要求43~128位"}
|
497
|
+
case 40140112:
|
498
|
+
raise OperationalError(errno.EINVAL, resp)
|
499
|
+
# {"state": 0, "errno": 40140113, "error": "code_verifier 验证失败"}
|
500
|
+
case 40140113:
|
501
|
+
raise OperationalError(errno.EINVAL, resp)
|
502
|
+
# {"state": 0, "errno": 40140114, "error": "refresh_token 格式错误(防篡改)"}
|
503
|
+
case 40140114:
|
504
|
+
raise OperationalError(errno.EINVAL, resp)
|
505
|
+
# {"state": 0, "errno": 40140115, "error": "refresh_token 签名校验失败(防篡改)"}
|
506
|
+
case 40140115:
|
507
|
+
raise OperationalError(errno.EINVAL, resp)
|
508
|
+
# {"state": 0, "errno": 40140116, "error": "refresh_token 无效(已解除授权)"}
|
509
|
+
case 40140116:
|
510
|
+
raise OperationalError(errno.EIO, resp)
|
511
|
+
# {"state": 0, "errno": 40140117, "error": "access_token 刷新太频繁"}
|
512
|
+
case 40140117:
|
513
|
+
raise BusyOSError(errno.EBUSY, resp)
|
514
|
+
# {"state": 0, "errno": 40140118, "error": "开发者认证已过期"}
|
515
|
+
case 40140118:
|
516
|
+
raise OperationalError(errno.EINVAL, resp)
|
517
|
+
# {"state": 0, "errno": 40140119, "error": "refresh_token 已过期"}
|
518
|
+
case 40140119:
|
519
|
+
raise OperationalError(errno.EINVAL, resp)
|
520
|
+
# {"state": 0, "errno": 40140120, "error": "refresh_token 检验失败(防篡改)"}
|
521
|
+
case 40140120:
|
522
|
+
raise OperationalError(errno.EINVAL, resp)
|
523
|
+
# {"state": 0, "errno": 40140121, "error": "access_token 刷新失败"}
|
524
|
+
case 40140121:
|
525
|
+
raise OperationalError(errno.EINVAL, resp)
|
526
|
+
# {"state": 0, "errno": 40140122, "error": "超出授权应用个数上限"}
|
527
|
+
case 40140122:
|
528
|
+
raise OperationalError(errno.EINVAL, resp)
|
529
|
+
# {"state": 0, "errno": 40140123, "error": "access_token 格式错误(防篡改)"}
|
530
|
+
case 40140123:
|
531
|
+
raise OperationalError(errno.EINVAL, resp)
|
532
|
+
# {"state": 0, "errno": 40140124, "error": "access_token 签名校验失败(防篡改)"}
|
533
|
+
case 40140124:
|
534
|
+
raise OperationalError(errno.EINVAL, resp)
|
535
|
+
# {"state": 0, "errno": 40140125, "error": "access_token 无效(已过期或者已解除授权)"}
|
536
|
+
case 40140125:
|
537
|
+
raise OperationalError(errno.EINVAL, resp)
|
538
|
+
# {"state": 0, "errno": 40140126, "error": "access_token 校验失败(防篡改)"}
|
539
|
+
case 40140126:
|
540
|
+
raise OperationalError(errno.EINVAL, resp)
|
455
541
|
elif "msg_code" in resp:
|
456
542
|
match resp["msg_code"]:
|
457
543
|
case 50028:
|
458
|
-
raise P115OSError(EFBIG, resp)
|
544
|
+
raise P115OSError(errno.EFBIG, resp)
|
459
545
|
case 70004:
|
460
|
-
raise
|
546
|
+
raise P115IsADirectoryError(errno.EISDIR, resp)
|
461
547
|
case 70005 | 70008:
|
462
|
-
raise
|
548
|
+
raise P115FileNotFoundError(errno.ENOENT, resp)
|
463
549
|
elif "error" in resp:
|
464
550
|
match resp["error"]:
|
465
551
|
case "目录不存在或已转移":
|
466
|
-
raise
|
552
|
+
raise P115FileNotFoundError(errno.ENOENT, resp)
|
467
553
|
case "更新的数据为空":
|
468
|
-
raise OperationalError(EINVAL, resp)
|
469
|
-
raise P115OSError(EIO, resp)
|
554
|
+
raise OperationalError(errno.EINVAL, resp)
|
555
|
+
raise P115OSError(errno.EIO, resp)
|
470
556
|
if isinstance(resp, dict):
|
471
557
|
return check(resp)
|
472
558
|
elif isawaitable(resp):
|
473
559
|
async def check_await() -> dict:
|
474
560
|
return check(await resp)
|
475
561
|
return check_await()
|
476
|
-
|
477
|
-
raise P115OSError(EIO, resp)
|
562
|
+
raise P115OSError(errno.EIO, resp)
|
478
563
|
|
479
564
|
|
480
565
|
def normalize_attr_web(
|
@@ -1767,11 +1852,11 @@ class ClientRequestMixin:
|
|
1767
1852
|
print("[status=2] qrcode: signed in")
|
1768
1853
|
break
|
1769
1854
|
case -1:
|
1770
|
-
raise LoginError(
|
1855
|
+
raise LoginError(errno.EAUTH, "[status=-1] qrcode: expired")
|
1771
1856
|
case -2:
|
1772
|
-
raise LoginError(
|
1857
|
+
raise LoginError(errno.EAUTH, "[status=-2] qrcode: canceled")
|
1773
1858
|
case _:
|
1774
|
-
raise LoginError(
|
1859
|
+
raise LoginError(errno.EAUTH, f"qrcode: aborted with {resp!r}")
|
1775
1860
|
if app:
|
1776
1861
|
return cls.login_qrcode_scan_result(
|
1777
1862
|
login_uid,
|
@@ -1865,11 +1950,11 @@ class ClientRequestMixin:
|
|
1865
1950
|
print("[status=2] qrcode: signed in")
|
1866
1951
|
break
|
1867
1952
|
case -1:
|
1868
|
-
raise LoginError(
|
1953
|
+
raise LoginError(errno.EAUTH, "[status=-1] qrcode: expired")
|
1869
1954
|
case -2:
|
1870
|
-
raise LoginError(
|
1955
|
+
raise LoginError(errno.EAUTH, "[status=-2] qrcode: canceled")
|
1871
1956
|
case _:
|
1872
|
-
raise LoginError(
|
1957
|
+
raise LoginError(errno.EAUTH, f"qrcode: aborted with {resp!r}")
|
1873
1958
|
return cls.login_qrcode_access_token_open(
|
1874
1959
|
login_uid,
|
1875
1960
|
async_=async_,
|
@@ -2597,8 +2682,8 @@ class P115OpenClient(ClientRequestMixin):
|
|
2597
2682
|
for fid, info in resp["data"].items():
|
2598
2683
|
url = info["url"]
|
2599
2684
|
if strict and not url:
|
2600
|
-
raise
|
2601
|
-
EISDIR,
|
2685
|
+
raise P115IsADirectoryError(
|
2686
|
+
errno.EISDIR,
|
2602
2687
|
f"{fid} is a directory, with response {resp}",
|
2603
2688
|
)
|
2604
2689
|
return P115URL(
|
@@ -2611,8 +2696,8 @@ class P115OpenClient(ClientRequestMixin):
|
|
2611
2696
|
is_directory=not url,
|
2612
2697
|
headers=resp["headers"],
|
2613
2698
|
)
|
2614
|
-
raise
|
2615
|
-
ENOENT,
|
2699
|
+
raise P115FileNotFoundError(
|
2700
|
+
errno.ENOENT,
|
2616
2701
|
f"no such pickcode: {pickcode!r}, with response {resp}",
|
2617
2702
|
)
|
2618
2703
|
if async_:
|
@@ -3977,7 +4062,7 @@ class P115OpenClient(ClientRequestMixin):
|
|
3977
4062
|
case 1:
|
3978
4063
|
bucket, object, callback = data["bucket"], data["object"], data["callback"]
|
3979
4064
|
case _:
|
3980
|
-
raise
|
4065
|
+
raise OperationalError(errno.EINVAL, resp)
|
3981
4066
|
url = self.upload_endpoint_url(bucket, object)
|
3982
4067
|
token = self.upload_token
|
3983
4068
|
if partsize <= 0:
|
@@ -5427,7 +5512,7 @@ class P115Client(P115OpenClient):
|
|
5427
5512
|
headers["cookie"] = self.cookies_str
|
5428
5513
|
for i in count(0):
|
5429
5514
|
try:
|
5430
|
-
if
|
5515
|
+
if fetch_cert_headers is None:
|
5431
5516
|
if is_open_api:
|
5432
5517
|
cert: str = headers["authorization"]
|
5433
5518
|
else:
|
@@ -6530,8 +6615,8 @@ class P115Client(P115OpenClient):
|
|
6530
6615
|
for fid, info in resp["data"].items():
|
6531
6616
|
url = info["url"]
|
6532
6617
|
if strict and not url:
|
6533
|
-
raise
|
6534
|
-
EISDIR,
|
6618
|
+
raise P115IsADirectoryError(
|
6619
|
+
errno.EISDIR,
|
6535
6620
|
f"{fid} is a directory, with response {resp}",
|
6536
6621
|
)
|
6537
6622
|
return P115URL(
|
@@ -6544,8 +6629,8 @@ class P115Client(P115OpenClient):
|
|
6544
6629
|
is_directory=not url,
|
6545
6630
|
headers=resp["headers"],
|
6546
6631
|
)
|
6547
|
-
raise
|
6548
|
-
ENOENT,
|
6632
|
+
raise P115FileNotFoundError(
|
6633
|
+
errno.ENOENT,
|
6549
6634
|
f"no such pickcode: {pickcode!r}, with response {resp}",
|
6550
6635
|
)
|
6551
6636
|
if async_:
|
@@ -17444,7 +17529,7 @@ class P115Client(P115OpenClient):
|
|
17444
17529
|
else:
|
17445
17530
|
payload = dict(payload)
|
17446
17531
|
if url:
|
17447
|
-
from .tool import share_extract_payload
|
17532
|
+
from .tool.util import share_extract_payload
|
17448
17533
|
share_payload = share_extract_payload(url)
|
17449
17534
|
payload["share_code"] = share_payload["share_code"]
|
17450
17535
|
payload["receive_code"] = share_payload["receive_code"] or ""
|
@@ -17456,14 +17541,14 @@ class P115Client(P115OpenClient):
|
|
17456
17541
|
info = check_response(resp)["data"]
|
17457
17542
|
file_id = payload["file_id"]
|
17458
17543
|
if not info:
|
17459
|
-
raise
|
17460
|
-
ENOENT,
|
17544
|
+
raise P115FileNotFoundError(
|
17545
|
+
errno.ENOENT,
|
17461
17546
|
f"no such id: {file_id!r}, with response {resp}",
|
17462
17547
|
)
|
17463
17548
|
url = info["url"]
|
17464
17549
|
if strict and not url:
|
17465
|
-
raise
|
17466
|
-
EISDIR,
|
17550
|
+
raise P115IsADirectoryError(
|
17551
|
+
errno.EISDIR,
|
17467
17552
|
f"{file_id} is a directory, with response {resp}",
|
17468
17553
|
)
|
17469
17554
|
return P115URL(
|
@@ -18208,14 +18293,14 @@ class P115Client(P115OpenClient):
|
|
18208
18293
|
info = check_response(resp)["data"]
|
18209
18294
|
file_id = payload["file_id"]
|
18210
18295
|
if not info:
|
18211
|
-
raise
|
18212
|
-
ENOENT,
|
18296
|
+
raise P115FileNotFoundError(
|
18297
|
+
errno.ENOENT,
|
18213
18298
|
f"no such id: {file_id!r}, with response {resp}",
|
18214
18299
|
)
|
18215
18300
|
url = info["url"]
|
18216
18301
|
if strict and not url:
|
18217
|
-
raise
|
18218
|
-
EISDIR,
|
18302
|
+
raise P115IsADirectoryError(
|
18303
|
+
errno.EISDIR,
|
18219
18304
|
f"{file_id} is a directory, with response {resp}",
|
18220
18305
|
)
|
18221
18306
|
return P115URL(
|
@@ -19939,7 +20024,7 @@ class P115Client(P115OpenClient):
|
|
19939
20024
|
elif status == 1 and statuscode == 0:
|
19940
20025
|
bucket, object, callback = resp["bucket"], resp["object"], resp["callback"]
|
19941
20026
|
else:
|
19942
|
-
raise
|
20027
|
+
raise OperationalError(errno.EINVAL, resp)
|
19943
20028
|
url = self.upload_endpoint_url(bucket, object)
|
19944
20029
|
token = self.upload_token
|
19945
20030
|
if partsize <= 0:
|