p115client 0.0.5.9.2__py3-none-any.whl → 0.0.5.10__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 CHANGED
@@ -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, dropwhile, product, repeat
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, stat, PathLike, path as ospath
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 rsa_encode, rsa_decode, ecdh_encode_token, ecdh_aes_encode, ecdh_aes_decode, make_upload_payload
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(EIO, resp)
363
+ raise LoginError(errno.EAUTH, resp)
364
364
  # {"state": false, "errno": 911, "error": "请验证账号"}
365
365
  case 911:
366
- raise AuthenticationError(EIO, resp)
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 FileExistsError(EEXIST, resp)
372
+ raise P115FileExistsError(errno.EEXIST, resp)
373
373
  # {"state": false, "errno": 20009, "error": "父目录不存在。"}
374
374
  case 20009:
375
- raise FileNotFoundError(ENOENT, resp)
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 FileNotFoundError(ENOENT, resp)
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(ENOTSUP, resp)
384
+ case 20020 | 20021:
385
+ raise OperationalError(errno.EINVAL, resp)
388
386
  # {"state": false, "errno": 31001, "error": "所预览的文件不存在。"}
389
387
  case 31001:
390
- raise FileNotFoundError(ENOENT, resp)
388
+ raise P115FileNotFoundError(errno.ENOENT, resp)
391
389
  # {"state": false, "errno": 31004, "error": "文档未上传完整,请上传完成后再进行查看。"}
392
390
  case 31004:
393
- raise FileNotFoundError(ENOENT, resp)
391
+ raise P115FileNotFoundError(errno.ENOENT, resp)
394
392
  # {"state": false, "errno": 50003, "error": "很抱歉,该文件提取码不存在。"}
395
393
  case 50003:
396
- raise FileNotFoundError(ENOENT, resp)
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 FileNotFoundError(ENOENT, resp)
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 FileNotFoundError(ENOENT, resp)
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(EIO, resp)
422
+ raise AuthenticationError(errno.EAUTH, resp)
425
423
  # {"state": false, "errno": 990002, "error": "参数错误。"}
426
424
  case 990002:
427
- raise P115OSError(EINVAL, resp)
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(EIO, resp)
447
+ raise LoginError(errno.EAUTH, resp)
449
448
  # {"state": 0, "errno": 40101017, "error": "用户验证失败!"}
450
449
  case 40101017:
451
- raise AuthenticationError(EIO, resp)
450
+ raise AuthenticationError(errno.EAUTH, resp)
452
451
  # {"state": 0, "errno": 40101032, "error": "请重新登录"}
453
452
  case 40101032:
454
- raise LoginError(EIO, resp)
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 IsADirectoryError(EISDIR, resp)
546
+ raise P115IsADirectoryError(errno.EISDIR, resp)
461
547
  case 70005 | 70008:
462
- raise FileNotFoundError(ENOENT, resp)
548
+ raise P115FileNotFoundError(errno.ENOENT, resp)
463
549
  elif "error" in resp:
464
550
  match resp["error"]:
465
551
  case "目录不存在或已转移":
466
- raise FileNotFoundError(ENOENT, resp)
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
- else:
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(EIO, "[status=-1] qrcode: expired")
1855
+ raise LoginError(errno.EAUTH, "[status=-1] qrcode: expired")
1771
1856
  case -2:
1772
- raise LoginError(EIO, "[status=-2] qrcode: canceled")
1857
+ raise LoginError(errno.EAUTH, "[status=-2] qrcode: canceled")
1773
1858
  case _:
1774
- raise LoginError(EIO, f"qrcode: aborted with {resp!r}")
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(EIO, "[status=-1] qrcode: expired")
1953
+ raise LoginError(errno.EAUTH, "[status=-1] qrcode: expired")
1869
1954
  case -2:
1870
- raise LoginError(EIO, "[status=-2] qrcode: canceled")
1955
+ raise LoginError(errno.EAUTH, "[status=-2] qrcode: canceled")
1871
1956
  case _:
1872
- raise LoginError(EIO, f"qrcode: aborted with {resp!r}")
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 IsADirectoryError(
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 FileNotFoundError(
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 P115OSError(EINVAL, resp)
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 need_fetch_cert_first is None:
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 IsADirectoryError(
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 FileNotFoundError(
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 FileNotFoundError(
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 IsADirectoryError(
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 FileNotFoundError(
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 IsADirectoryError(
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 P115OSError(EINVAL, resp)
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: