p115client 0.0.5.11.9__py3-none-any.whl → 0.0.5.11.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
@@ -5187,6 +5187,7 @@ class P115OpenClient(ClientRequestMixin):
5187
5187
  async_=async_, # type: ignore
5188
5188
  **request_kwargs,
5189
5189
  )
5190
+ check_response(resp)
5190
5191
  data = resp["data"]
5191
5192
  match data["status"]:
5192
5193
  case 2:
@@ -14148,6 +14149,49 @@ class P115Client(P115OpenClient):
14148
14149
  payload = {"file_id": 0, "user_asc": 1, "user_order": "user_ptime", **payload}
14149
14150
  return self.request(url=api, method="POST", data=payload, async_=async_, **request_kwargs)
14150
14151
 
14152
+ @overload
14153
+ def fs_preview(
14154
+ self,
14155
+ payload: str | dict,
14156
+ /,
14157
+ base_url: bool | str | Callable[[], str] = False,
14158
+ *,
14159
+ async_: Literal[False] = False,
14160
+ **request_kwargs,
14161
+ ) -> dict:
14162
+ ...
14163
+ @overload
14164
+ def fs_preview(
14165
+ self,
14166
+ payload: str | dict,
14167
+ /,
14168
+ base_url: bool | str | Callable[[], str] = False,
14169
+ *,
14170
+ async_: Literal[True],
14171
+ **request_kwargs,
14172
+ ) -> Coroutine[Any, Any, dict]:
14173
+ ...
14174
+ def fs_preview(
14175
+ self,
14176
+ payload: str | dict,
14177
+ /,
14178
+ base_url: bool | str | Callable[[], str] = False,
14179
+ *,
14180
+ async_: Literal[False, True] = False,
14181
+ **request_kwargs,
14182
+ ) -> dict | Coroutine[Any, Any, dict]:
14183
+ """文档预览
14184
+
14185
+ POST https://webapi.115.com/files/preview
14186
+
14187
+ :payload:
14188
+ - pickcode: str 💡 提取码
14189
+ """
14190
+ api = complete_webapi("/files/preview", base_url=base_url)
14191
+ if isinstance(payload, str):
14192
+ payload = {"pickcode": payload}
14193
+ return self.request(url=api, method="POST", data=payload, async_=async_, **request_kwargs)
14194
+
14151
14195
  @overload
14152
14196
  def fs_rename(
14153
14197
  self,
@@ -18314,7 +18358,7 @@ class P115Client(P115OpenClient):
18314
18358
  ) -> dict | Coroutine[Any, Any, dict]:
18315
18359
  """删除一组离线任务(无论是否已经完成)
18316
18360
 
18317
- POST https://lixian.115.com/lixianssp/?ac=task_del
18361
+ POST https://lixian.115.com/lixian/?ac=task_del
18318
18362
 
18319
18363
  :payload:
18320
18364
  - hash[0]: str
@@ -18331,6 +18375,56 @@ class P115Client(P115OpenClient):
18331
18375
  raise ValueError("no `hash` (info_hash) specified")
18332
18376
  return self.request(api, method="POST", data=payload, async_=async_, **request_kwargs)
18333
18377
 
18378
+ @overload
18379
+ def offline_restart(
18380
+ self,
18381
+ payload: str | dict,
18382
+ /,
18383
+ base_url: None | bool | str | Callable[[], str] = None,
18384
+ method: str = "POST",
18385
+ *,
18386
+ async_: Literal[False] = False,
18387
+ **request_kwargs,
18388
+ ) -> dict:
18389
+ ...
18390
+ @overload
18391
+ def offline_restart(
18392
+ self,
18393
+ payload: str | dict,
18394
+ /,
18395
+ base_url: None | bool | str | Callable[[], str] = None,
18396
+ method: str = "POST",
18397
+ *,
18398
+ async_: Literal[True],
18399
+ **request_kwargs,
18400
+ ) -> Coroutine[Any, Any, dict]:
18401
+ ...
18402
+ def offline_restart(
18403
+ self,
18404
+ payload: str | dict,
18405
+ /,
18406
+ base_url: None | bool | str | Callable[[], str] = None,
18407
+ method: str = "POST",
18408
+ *,
18409
+ async_: Literal[False, True] = False,
18410
+ **request_kwargs,
18411
+ ) -> dict | Coroutine[Any, Any, dict]:
18412
+ """重试用户云下载任务
18413
+
18414
+ POST https://lixian.115.com/lixian/?ac=restart
18415
+
18416
+ :payload:
18417
+ - info_hash: str 💡 待重试任务的 info_hash
18418
+ """
18419
+ api = complete_lixian_api("?ct=lixian&ac=restart", base_url=base_url)
18420
+ if isinstance(payload, str):
18421
+ payload = {"info_hash": payload}
18422
+ if method.upper() == "POST":
18423
+ request_kwargs["data"] = payload
18424
+ else:
18425
+ request_kwargs["params"] = payload
18426
+ return self.request(api, method=method, async_=async_, **request_kwargs)
18427
+
18334
18428
  @overload
18335
18429
  def offline_task_count(
18336
18430
  self,
p115client/tool/upload.py CHANGED
@@ -28,7 +28,7 @@ from iterutils import (
28
28
  with_iter_next, YieldFrom,
29
29
  )
30
30
  from orjson import loads
31
- from p115client import check_response, normalize_attr_simple, P115Client
31
+ from p115client import check_response, normalize_attr_simple, P115Client, P115OpenClient
32
32
  from p115client.exception import OperationalError
33
33
  from p115client._upload import (
34
34
  oss_multipart_part_iter, oss_multipart_upload_init,
@@ -461,7 +461,7 @@ def iter_115_to_115_resume(
461
461
 
462
462
  @overload
463
463
  def multipart_upload_init(
464
- client: str | P115Client,
464
+ client: str | P115Client | P115OpenClient,
465
465
  path: str | PathLike | URL | SupportsGeturl,
466
466
  pid: int = 0,
467
467
  filename: str = "",
@@ -470,6 +470,7 @@ def multipart_upload_init(
470
470
  partsize: int = -1,
471
471
  upload_data: None | dict = None,
472
472
  domain: str = ALIYUN_DOMAIN,
473
+ use_open_api: bool = False,
473
474
  *,
474
475
  async_: Literal[False] = False,
475
476
  **request_kwargs,
@@ -477,7 +478,7 @@ def multipart_upload_init(
477
478
  ...
478
479
  @overload
479
480
  def multipart_upload_init(
480
- client: str | P115Client,
481
+ client: str | P115Client | P115OpenClient,
481
482
  path: str | PathLike | URL | SupportsGeturl,
482
483
  pid: int = 0,
483
484
  filename: str = "",
@@ -486,13 +487,14 @@ def multipart_upload_init(
486
487
  partsize: int = -1,
487
488
  upload_data: None | dict = None,
488
489
  domain: str = ALIYUN_DOMAIN,
490
+ use_open_api: bool = False,
489
491
  *,
490
492
  async_: Literal[True],
491
493
  **request_kwargs,
492
494
  ) -> Coroutine[Any, Any, dict]:
493
495
  ...
494
496
  def multipart_upload_init(
495
- client: str | P115Client,
497
+ client: str | P115Client | P115OpenClient,
496
498
  path: str | PathLike | URL | SupportsGeturl,
497
499
  pid: int = 0,
498
500
  filename: str = "",
@@ -501,6 +503,7 @@ def multipart_upload_init(
501
503
  partsize: int = -1,
502
504
  upload_data: None | dict = None,
503
505
  domain: str = ALIYUN_DOMAIN,
506
+ use_open_api: bool = False,
504
507
  *,
505
508
  async_: Literal[False, True] = False,
506
509
  **request_kwargs,
@@ -516,13 +519,24 @@ def multipart_upload_init(
516
519
  :param partsize: 分块大小,若不为正数则自动确定
517
520
  :param upload_data: 上传相关信息,可用于以后的断点续传
518
521
  :param domain: 上传到指定的阿里云集群的网址(netloc)
522
+ :param use_open_api: 是否使用 open 接口,如果本身就是 P115OpenClient (而不是其子类)的实例,此值强制为 True
519
523
  :param async_: 是否异步
520
524
  :param request_kwargs: 其它请求参数
521
525
 
522
526
  :return: 如果秒传成功,则返回响应信息(有 "status" 字段),否则返回上传配置信息(可用于断点续传)
523
527
  """
528
+ if not domain:
529
+ domain = ALIYUN_DOMAIN
524
530
  if isinstance(client, str):
525
531
  client = P115Client(client, check_for_relogin=True)
532
+ if type(client) is P115OpenClient:
533
+ use_open_api = True
534
+ if use_open_api:
535
+ upload_file_init = client.upload_file_init_open
536
+ upload_resume = client.upload_resume_open
537
+ else:
538
+ upload_file_init = client.upload_file_init
539
+ upload_resume = client.upload_resume
526
540
  def gen_step():
527
541
  nonlocal upload_data, path, filename, filesha1, filesize, partsize
528
542
  if upload_data is None:
@@ -618,7 +632,7 @@ def multipart_upload_init(
618
632
  else:
619
633
  with urlopen(path, headers={"Range": "bytes="+sign_check}) as file:
620
634
  return file.read()
621
- resp = yield client.upload_file_init(
635
+ resp = yield upload_file_init(
622
636
  filename=filename,
623
637
  filesize=filesize,
624
638
  filesha1=filesha1,
@@ -627,14 +641,25 @@ def multipart_upload_init(
627
641
  async_=async_, # type: ignore
628
642
  **request_kwargs,
629
643
  )
630
- status = resp["status"]
631
- statuscode = resp.get("statuscode", 0)
632
- if status == 2 and statuscode == 0:
633
- return resp
634
- elif status == 1 and statuscode == 0:
635
- bucket, object, callback = resp["bucket"], resp["object"], resp["callback"]
644
+ if use_open_api:
645
+ check_response(resp)
646
+ data = resp["data"]
647
+ match data["status"]:
648
+ case 2:
649
+ return resp
650
+ case 1:
651
+ bucket, object, callback = data["bucket"], data["object"], data["callback"]
652
+ case _:
653
+ raise OperationalError(errno.EINVAL, resp)
636
654
  else:
637
- raise OperationalError(errno.EINVAL, resp)
655
+ status = resp["status"]
656
+ statuscode = resp.get("statuscode", 0)
657
+ if status == 2 and statuscode == 0:
658
+ return resp
659
+ elif status == 1 and statuscode == 0:
660
+ bucket, object, callback = resp["bucket"], resp["object"], resp["callback"]
661
+ else:
662
+ raise OperationalError(errno.EINVAL, resp)
638
663
  upload_data["bucket"] = bucket
639
664
  upload_data["object"] = object
640
665
  upload_data["callback"] = callback
@@ -648,7 +673,7 @@ def multipart_upload_init(
648
673
  bucket = upload_data["bucket"]
649
674
  object = upload_data["object"]
650
675
  callback_var = loads(upload_data["callback"]["callback_var"])
651
- resp = yield client.upload_resume(
676
+ resp = yield upload_resume(
652
677
  {
653
678
  "fileid": object,
654
679
  "file_size": upload_data["filesize"],
@@ -676,6 +701,7 @@ def multipart_upload_init(
676
701
  upload_data["part_number_next"] = len(parts) + (int(parts[-1]["Size"]) == upload_data["partsize"])
677
702
  else:
678
703
  upload_data["part_number_next"] = 1
704
+ upload_data["parts"] = parts
679
705
  else:
680
706
  upload_data["upload_id"] = yield oss_multipart_upload_init(
681
707
  client.request,
@@ -687,12 +713,14 @@ def multipart_upload_init(
687
713
  **request_kwargs,
688
714
  )
689
715
  upload_data["part_number_next"] = 1
716
+ upload_data["parts"] = []
717
+ upload_data["_upload_"] = None
690
718
  return upload_data
691
719
  return run_gen_step(gen_step, async_=async_)
692
720
 
693
721
 
694
722
  def multipart_upload_url(
695
- client: str | P115Client | dict,
723
+ client: str | P115Client | P115OpenClient | dict,
696
724
  upload_data: dict,
697
725
  part_number: int = 1,
698
726
  domain: str = ALIYUN_DOMAIN,
@@ -706,6 +734,8 @@ def multipart_upload_url(
706
734
 
707
735
  :return: 上传链接 和 请求头 的 2 元组
708
736
  """
737
+ if not domain:
738
+ domain = ALIYUN_DOMAIN
709
739
  if isinstance(client, dict):
710
740
  token = client
711
741
  else:
@@ -724,7 +754,7 @@ def multipart_upload_url(
724
754
 
725
755
  @overload
726
756
  def multipart_upload_complete(
727
- client: str | P115Client,
757
+ client: str | P115Client | P115OpenClient,
728
758
  upload_data: dict,
729
759
  domain: str = ALIYUN_DOMAIN,
730
760
  *,
@@ -734,7 +764,7 @@ def multipart_upload_complete(
734
764
  ...
735
765
  @overload
736
766
  def multipart_upload_complete(
737
- client: str | P115Client,
767
+ client: str | P115Client | P115OpenClient,
738
768
  upload_data: dict,
739
769
  domain: str = ALIYUN_DOMAIN,
740
770
  *,
@@ -743,7 +773,7 @@ def multipart_upload_complete(
743
773
  ) -> Coroutine[Any, Any, dict]:
744
774
  ...
745
775
  def multipart_upload_complete(
746
- client: str | P115Client,
776
+ client: str | P115Client | P115OpenClient,
747
777
  upload_data: dict,
748
778
  domain: str = ALIYUN_DOMAIN,
749
779
  *,
@@ -764,6 +794,7 @@ def multipart_upload_complete(
764
794
  你可以构建自己的分块上传逻辑,下面是一个例子
765
795
 
766
796
  .. code:: python
797
+
767
798
  from pathlib import Path
768
799
  from p115client import *
769
800
  from p115client.tool import *
@@ -773,6 +804,7 @@ def multipart_upload_complete(
773
804
 
774
805
  # TODO: 这里填一个文件的路径
775
806
  path = "test.txt"
807
+
776
808
  upload_data = multipart_upload_init(
777
809
  client,
778
810
  path,
@@ -780,9 +812,7 @@ def multipart_upload_complete(
780
812
  filename = "",
781
813
  upload_data = None,
782
814
  )
783
- if "status" in upload_data:
784
- resp = upload_data
785
- else:
815
+ if "_upload_" in upload_data:
786
816
  partsize = upload_data["partsize"]
787
817
  part_number_next = upload_data["part_number_next"]
788
818
  with open(path, "rb") as file:
@@ -797,18 +827,22 @@ def multipart_upload_complete(
797
827
  ## NOTE: 使用 requests
798
828
  # from requests import request
799
829
  # request("PUT", url, data=file.read(partsize), headers=headers)
800
- client.request(url=url, method="PUT", data=file.read(partsize), headers=headers, parse=False
830
+ client.request(url=url, method="PUT", data=file.read(partsize), headers=headers, parse=False)
801
831
  resp = multipart_upload_complete(client, upload_data)
832
+ else:
833
+ resp = upload_data
802
834
  print(resp)
803
835
  """
836
+ if not domain:
837
+ domain = ALIYUN_DOMAIN
804
838
  bucket = upload_data["bucket"]
805
839
  object = upload_data["object"]
806
840
  upload_id = upload_data["upload_id"]
807
841
  url = f"http://{bucket}.{domain}/{object}"
808
842
  if isinstance(client, str):
809
843
  client = P115Client(client, check_for_relogin=True)
810
- token = client.upload_token
811
844
  def gen_step():
845
+ token = client.upload_token
812
846
  parts = yield collect(oss_multipart_part_iter(
813
847
  client.request,
814
848
  url,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: p115client
3
- Version: 0.0.5.11.9
3
+ Version: 0.0.5.11.10
4
4
  Summary: Python 115 webdisk client.
5
5
  Home-page: https://github.com/ChenyangGao/p115client
6
6
  License: MIT
@@ -1,7 +1,7 @@
1
1
  LICENSE,sha256=o5242_N2TgDsWwFhPn7yr8YJNF7XsJM5NxUMtcT97bc,1100
2
2
  p115client/__init__.py,sha256=1mx7njuAlqcuEWONTjSiiGnXyyNyqOcJyNX1FMHqQ-4,214
3
3
  p115client/_upload.py,sha256=3uXwgFsXkZ4X5hjL1N2mx0y8tA8MjVxe49N0BoyYyno,31253
4
- p115client/client.py,sha256=PF2onKoO9z0xF8mf1Q87SXHmwk1NS7fOo34gERt8Ii8,781183
4
+ p115client/client.py,sha256=RmP5hmMX-qmEKP1ZA6hXRZqa3iGmF1djRQGk1ZfPox8,783893
5
5
  p115client/const.py,sha256=KqDGr9KsOnSkNVM3RIdQGptCMHbidMmZ_ffyFPiniww,7654
6
6
  p115client/exception.py,sha256=4SZ8ubOLMRxtcqc0u1kNzXqH1a6wwXJFwGnRDURoEgQ,3708
7
7
  p115client/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -17,11 +17,11 @@ p115client/tool/iterdir.py,sha256=dXBMPfxPzRcFhBpnBT3X1LYkhc3l31rYCLRKRFbggSk,20
17
17
  p115client/tool/life.py,sha256=ceweN2uNKYxigSOaBQ4Abo5u05zqppRm_P7k-_rHjcA,17301
18
18
  p115client/tool/pool.py,sha256=H65VhoNxQC6xWSL1THq_PximWnBOqB4EfU6kWBTAnlA,13946
19
19
  p115client/tool/request.py,sha256=rjXuQwRganE5Z-4rfgnyPFjE4jzdQSLdIs9s0cIDshU,7043
20
- p115client/tool/upload.py,sha256=fJnxozMWeFW7m2T3AKYWGJdABxK0tnMbBaDDc1LHKw4,31278
20
+ p115client/tool/upload.py,sha256=D2TPJlS--bGX-oHgTm6ktoqnX1_gwOMwxwMkiOwGuIY,32695
21
21
  p115client/tool/util.py,sha256=pAa8gc4BcnVTpNcXbNZU4tBUMjSB04DGOpzDdzfbto8,3934
22
22
  p115client/tool/xys.py,sha256=vU28Px2yeQzIxxGkopJIpvV6TdOnWJ5xB6NPXpTgM0Y,10306
23
23
  p115client/type.py,sha256=7kOp98uLaYqcTTCgCrb3DRcl8ukMpn7ibsnVvtw2nG8,6250
24
- p115client-0.0.5.11.9.dist-info/LICENSE,sha256=o5242_N2TgDsWwFhPn7yr8YJNF7XsJM5NxUMtcT97bc,1100
25
- p115client-0.0.5.11.9.dist-info/METADATA,sha256=ZtZoJ6AlBvgr-sNR4TtYBGFDKpqzZ30HZgAzSbgtg0A,8192
26
- p115client-0.0.5.11.9.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
27
- p115client-0.0.5.11.9.dist-info/RECORD,,
24
+ p115client-0.0.5.11.10.dist-info/LICENSE,sha256=o5242_N2TgDsWwFhPn7yr8YJNF7XsJM5NxUMtcT97bc,1100
25
+ p115client-0.0.5.11.10.dist-info/METADATA,sha256=4aN9NQjPAOoxtI4CTGRgFGjmB_Nia70kkV6EisvpNII,8193
26
+ p115client-0.0.5.11.10.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
27
+ p115client-0.0.5.11.10.dist-info/RECORD,,