p115client 0.0.5.11.10.2__tar.gz → 0.0.5.12__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.
Files changed (27) hide show
  1. {p115client-0.0.5.11.10.2 → p115client-0.0.5.12}/PKG-INFO +1 -1
  2. {p115client-0.0.5.11.10.2 → p115client-0.0.5.12}/p115client/client.py +354 -98
  3. {p115client-0.0.5.11.10.2 → p115client-0.0.5.12}/p115client/tool/__init__.py +1 -0
  4. p115client-0.0.5.12/p115client/tool/offline.py +164 -0
  5. {p115client-0.0.5.11.10.2 → p115client-0.0.5.12}/pyproject.toml +1 -1
  6. {p115client-0.0.5.11.10.2 → p115client-0.0.5.12}/LICENSE +0 -0
  7. {p115client-0.0.5.11.10.2 → p115client-0.0.5.12}/p115client/__init__.py +0 -0
  8. {p115client-0.0.5.11.10.2 → p115client-0.0.5.12}/p115client/_upload.py +0 -0
  9. {p115client-0.0.5.11.10.2 → p115client-0.0.5.12}/p115client/const.py +0 -0
  10. {p115client-0.0.5.11.10.2 → p115client-0.0.5.12}/p115client/exception.py +0 -0
  11. {p115client-0.0.5.11.10.2 → p115client-0.0.5.12}/p115client/py.typed +0 -0
  12. {p115client-0.0.5.11.10.2 → p115client-0.0.5.12}/p115client/tool/attr.py +0 -0
  13. {p115client-0.0.5.11.10.2 → p115client-0.0.5.12}/p115client/tool/auth.py +0 -0
  14. {p115client-0.0.5.11.10.2 → p115client-0.0.5.12}/p115client/tool/download.py +0 -0
  15. {p115client-0.0.5.11.10.2 → p115client-0.0.5.12}/p115client/tool/edit.py +0 -0
  16. {p115client-0.0.5.11.10.2 → p115client-0.0.5.12}/p115client/tool/export_dir.py +0 -0
  17. {p115client-0.0.5.11.10.2 → p115client-0.0.5.12}/p115client/tool/fs_files.py +0 -0
  18. {p115client-0.0.5.11.10.2 → p115client-0.0.5.12}/p115client/tool/history.py +0 -0
  19. {p115client-0.0.5.11.10.2 → p115client-0.0.5.12}/p115client/tool/iterdir.py +0 -0
  20. {p115client-0.0.5.11.10.2 → p115client-0.0.5.12}/p115client/tool/life.py +0 -0
  21. {p115client-0.0.5.11.10.2 → p115client-0.0.5.12}/p115client/tool/pool.py +0 -0
  22. {p115client-0.0.5.11.10.2 → p115client-0.0.5.12}/p115client/tool/request.py +0 -0
  23. {p115client-0.0.5.11.10.2 → p115client-0.0.5.12}/p115client/tool/upload.py +0 -0
  24. {p115client-0.0.5.11.10.2 → p115client-0.0.5.12}/p115client/tool/util.py +0 -0
  25. {p115client-0.0.5.11.10.2 → p115client-0.0.5.12}/p115client/tool/xys.py +0 -0
  26. {p115client-0.0.5.11.10.2 → p115client-0.0.5.12}/p115client/type.py +0 -0
  27. {p115client-0.0.5.11.10.2 → p115client-0.0.5.12}/readme.md +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: p115client
3
- Version: 0.0.5.11.10.2
3
+ Version: 0.0.5.12
4
4
  Summary: Python 115 webdisk client.
5
5
  Home-page: https://github.com/ChenyangGao/p115client
6
6
  License: MIT
@@ -377,6 +377,9 @@ def check_response(resp: dict | Awaitable[dict], /) -> dict | Coroutine[Any, Any
377
377
  # {"state": false, "errno": 911, "error": "请验证账号"}
378
378
  case 911:
379
379
  raise AuthenticationError(errno.EAUTH, resp)
380
+ # {"state": false, "errno": 10004, "error": "错误的链接"}
381
+ case 10004:
382
+ raise OperationalError(errno.EINVAL, resp)
380
383
  # {"state": false, "errno": 20001, "error": "目录名称不能为空"}
381
384
  case 20001:
382
385
  raise OperationalError(errno.EINVAL, resp)
@@ -3180,8 +3183,8 @@ class P115OpenClient(ClientRequestMixin):
3180
3183
  - `c`: 允许同时打开次数,如果为 0,则是无限次数
3181
3184
  - `f`: 请求时要求携带请求头
3182
3185
  - 如果为空,则无要求
3183
- - 如果为 1,则需要 User-Agent(和请求直链时的一致)
3184
- - 如果为 3,则需要 User-Agent(和请求直链时的一致) 和 Cookie(由请求直链时的响应所返回的 Set-Cookie 响应头)
3186
+ - 如果为 1,则需要 user-agent(和请求直链时的一致)
3187
+ - 如果为 3,则需要 user-agent(和请求直链时的一致) 和 Cookie(由请求直链时的响应所返回的 Set-Cookie 响应头)
3185
3188
 
3186
3189
  :param pickcode: 提取码
3187
3190
  :param strict: 如果为 True,当目标是目录时,会抛出 IsADirectoryError 异常
@@ -7857,8 +7860,8 @@ class P115Client(P115OpenClient):
7857
7860
  - `c`: 允许同时打开次数,如果为 0,则是无限次数
7858
7861
  - `f`: 请求时要求携带请求头
7859
7862
  - 如果为空,则无要求
7860
- - 如果为 1,则需要 User-Agent(和请求直链时的一致)
7861
- - 如果为 3,则需要 User-Agent(和请求直链时的一致) 和 Cookie(由请求直链时的响应所返回的 Set-Cookie 响应头)
7863
+ - 如果为 1,则需要 user-agent(和请求直链时的一致)
7864
+ - 如果为 3,则需要 user-agent(和请求直链时的一致) 和 Cookie(由请求直链时的响应所返回的 Set-Cookie 响应头)
7862
7865
 
7863
7866
  :param pickcode: 提取码
7864
7867
  :param strict: 如果为 True,当目标是目录时,会抛出 IsADirectoryError 异常
@@ -17727,32 +17730,35 @@ class P115Client(P115OpenClient):
17727
17730
  ########## Offline Download API ##########
17728
17731
 
17729
17732
  @overload
17730
- def _offline_web_post(
17733
+ def _offline_web_request(
17731
17734
  self,
17732
- payload: dict,
17735
+ payload: dict = {},
17733
17736
  /,
17734
17737
  ac: str = "",
17738
+ method: str = "POST",
17735
17739
  *,
17736
17740
  async_: Literal[False] = False,
17737
17741
  **request_kwargs,
17738
17742
  ) -> dict:
17739
17743
  ...
17740
17744
  @overload
17741
- def _offline_web_post(
17745
+ def _offline_web_request(
17742
17746
  self,
17743
- payload: dict,
17747
+ payload: dict = {},
17744
17748
  /,
17745
17749
  ac: str = "",
17750
+ method: str = "POST",
17746
17751
  *,
17747
17752
  async_: Literal[True],
17748
17753
  **request_kwargs,
17749
17754
  ) -> Coroutine[Any, Any, dict]:
17750
17755
  ...
17751
- def _offline_web_post(
17756
+ def _offline_web_request(
17752
17757
  self,
17753
- payload: dict,
17758
+ payload: dict = {},
17754
17759
  /,
17755
17760
  ac: str = "",
17761
+ method: str = "POST",
17756
17762
  *,
17757
17763
  async_: Literal[False, True] = False,
17758
17764
  **request_kwargs,
@@ -17760,41 +17766,47 @@ class P115Client(P115OpenClient):
17760
17766
  api = "http://lixian.115.com/web/lixian/"
17761
17767
  if ac:
17762
17768
  payload["ac"] = ac
17769
+ if method.upper() == "POST":
17770
+ request_kwargs["data"] = payload
17771
+ else:
17772
+ request_kwargs["params"] = payload
17763
17773
  return self.request(
17764
17774
  url=api,
17765
- method="POST",
17766
- data=payload,
17775
+ method=method,
17767
17776
  async_=async_,
17768
17777
  **request_kwargs,
17769
17778
  )
17770
17779
 
17771
17780
  @overload
17772
- def _offline_lixian_post(
17781
+ def _offline_lixian_request(
17773
17782
  self,
17774
- payload: dict,
17783
+ payload: dict = {},
17775
17784
  /,
17776
17785
  ac: str = "",
17786
+ method: str = "POST",
17777
17787
  *,
17778
17788
  async_: Literal[False] = False,
17779
17789
  **request_kwargs,
17780
17790
  ) -> dict:
17781
17791
  ...
17782
17792
  @overload
17783
- def _offline_lixian_post(
17793
+ def _offline_lixian_request(
17784
17794
  self,
17785
- payload: dict,
17795
+ payload: dict = {},
17786
17796
  /,
17787
17797
  ac: str = "",
17798
+ method: str = "POST",
17788
17799
  *,
17789
17800
  async_: Literal[True],
17790
17801
  **request_kwargs,
17791
17802
  ) -> Coroutine[Any, Any, dict]:
17792
17803
  ...
17793
- def _offline_lixian_post(
17804
+ def _offline_lixian_request(
17794
17805
  self,
17795
- payload: dict,
17806
+ payload: dict = {},
17796
17807
  /,
17797
17808
  ac: str = "",
17809
+ method: str = "POST",
17798
17810
  *,
17799
17811
  async_: Literal[False, True] = False,
17800
17812
  **request_kwargs,
@@ -17802,19 +17814,22 @@ class P115Client(P115OpenClient):
17802
17814
  api = "http://lixian.115.com/lixian/"
17803
17815
  if ac:
17804
17816
  payload["ac"] = ac
17805
- request_kwargs["ecdh_encrypt"] = True
17817
+ if method.upper() == "POST":
17818
+ request_kwargs["data"] = payload
17819
+ request_kwargs["ecdh_encrypt"] = True
17820
+ else:
17821
+ request_kwargs["params"] = payload
17806
17822
  return self.request(
17807
17823
  url=api,
17808
- method="POST",
17809
- data=payload,
17824
+ method=method,
17810
17825
  async_=async_,
17811
17826
  **request_kwargs,
17812
17827
  )
17813
17828
 
17814
17829
  @overload
17815
- def _offline_lixianssp_post(
17830
+ def _offline_lixianssp_request(
17816
17831
  self,
17817
- payload: dict,
17832
+ payload: dict = {},
17818
17833
  /,
17819
17834
  ac: str = "",
17820
17835
  *,
@@ -17823,9 +17838,9 @@ class P115Client(P115OpenClient):
17823
17838
  ) -> dict:
17824
17839
  ...
17825
17840
  @overload
17826
- def _offline_lixianssp_post(
17841
+ def _offline_lixianssp_request(
17827
17842
  self,
17828
- payload: dict,
17843
+ payload: dict = {},
17829
17844
  /,
17830
17845
  ac: str = "",
17831
17846
  *,
@@ -17833,9 +17848,9 @@ class P115Client(P115OpenClient):
17833
17848
  **request_kwargs,
17834
17849
  ) -> Coroutine[Any, Any, dict]:
17835
17850
  ...
17836
- def _offline_lixianssp_post(
17851
+ def _offline_lixianssp_request(
17837
17852
  self,
17838
- payload: dict,
17853
+ payload: dict = {},
17839
17854
  /,
17840
17855
  ac: str = "",
17841
17856
  *,
@@ -17843,6 +17858,7 @@ class P115Client(P115OpenClient):
17843
17858
  **request_kwargs,
17844
17859
  ) -> dict | Coroutine[Any, Any, dict]:
17845
17860
  api = "http://lixian.115.com/lixianssp/"
17861
+ request_kwargs["method"] = "POST"
17846
17862
  for k, v in payload.items():
17847
17863
  payload[k] = str(v)
17848
17864
  if ac:
@@ -17864,61 +17880,81 @@ class P115Client(P115OpenClient):
17864
17880
  request_kwargs.setdefault("parse", parse)
17865
17881
  return self.request(
17866
17882
  url=api,
17867
- method="POST",
17868
17883
  data={"data": rsa_encode(dumps(payload)).decode("ascii")},
17869
17884
  async_=async_,
17870
17885
  **request_kwargs,
17871
17886
  )
17872
17887
 
17873
17888
  @overload
17874
- def _offline_post(
17889
+ def _offline_request(
17875
17890
  self,
17876
- payload: dict,
17891
+ payload: dict = {},
17877
17892
  /,
17878
17893
  ac: str = "",
17879
- use_web_api: bool = False,
17894
+ method: str = "POST",
17895
+ type: Literal[None, "", "web", "ssp"] = None,
17896
+ base_url: None | bool | str | Callable[[], str] = None,
17880
17897
  *,
17881
17898
  async_: Literal[False] = False,
17882
17899
  **request_kwargs,
17883
17900
  ) -> dict:
17884
17901
  ...
17885
17902
  @overload
17886
- def _offline_post(
17903
+ def _offline_request(
17887
17904
  self,
17888
- payload: dict,
17905
+ payload: dict = {},
17889
17906
  /,
17890
17907
  ac: str = "",
17891
- use_web_api: bool = False,
17908
+ method: str = "POST",
17909
+ type: Literal[None, "", "web", "ssp"] = None,
17910
+ base_url: None | bool | str | Callable[[], str] = None,
17892
17911
  *,
17893
17912
  async_: Literal[True],
17894
17913
  **request_kwargs,
17895
17914
  ) -> Coroutine[Any, Any, dict]:
17896
17915
  ...
17897
- def _offline_post(
17916
+ def _offline_request(
17898
17917
  self,
17899
- payload: dict,
17918
+ payload: dict = {},
17900
17919
  /,
17901
17920
  ac: str = "",
17902
- use_web_api: bool = False,
17921
+ method: str = "POST",
17922
+ type: Literal[None, "", "web", "ssp"] = None,
17923
+ base_url: None | bool | str | Callable[[], str] = None,
17903
17924
  *,
17904
17925
  async_: Literal[False, True] = False,
17905
- ecdh_encrypt: bool = False,
17906
17926
  **request_kwargs,
17907
17927
  ) -> dict | Coroutine[Any, Any, dict]:
17908
- if use_web_api:
17909
- method = self._offline_web_post
17910
- elif ecdh_encrypt:
17911
- method = self._offline_lixian_post
17912
- else:
17913
- method = self._offline_lixianssp_post
17914
- return method(payload, ac, async_=async_, ecdh_encrypt=ecdh_encrypt, **request_kwargs)
17928
+ if type is None:
17929
+ api = complete_lixian_api("?ct=lixian&ac="+ac, base_url=base_url)
17930
+ if method.upper() == "POST":
17931
+ request_kwargs["data"] = payload
17932
+ else:
17933
+ request_kwargs["params"] = payload
17934
+ return self.request(url=api, method=method, async_=async_, **request_kwargs)
17935
+ match type:
17936
+ case "web":
17937
+ call: Callable = self._offline_web_request
17938
+ case "ssp":
17939
+ call = self._offline_lixianssp_request
17940
+ case _:
17941
+ call = self._offline_lixian_request
17942
+ return call(
17943
+ payload,
17944
+ ac,
17945
+ method=method,
17946
+ async_=async_,
17947
+ **request_kwargs,
17948
+ )
17915
17949
 
17916
- @overload # type: ignore
17950
+ @overload
17917
17951
  def offline_add_torrent(
17918
17952
  self,
17919
17953
  payload: str | dict,
17920
17954
  /,
17921
- use_web_api: bool = False,
17955
+ base_url: None | bool | str | Callable[[], str] = None,
17956
+ method: str = "POST",
17957
+ type: Literal[None, "", "web", "ssp"] = "ssp",
17922
17958
  *,
17923
17959
  async_: Literal[False] = False,
17924
17960
  **request_kwargs,
@@ -17929,7 +17965,9 @@ class P115Client(P115OpenClient):
17929
17965
  self,
17930
17966
  payload: str | dict,
17931
17967
  /,
17932
- use_web_api: bool = False,
17968
+ base_url: None | bool | str | Callable[[], str] = None,
17969
+ method: str = "POST",
17970
+ type: Literal[None, "", "web", "ssp"] = "ssp",
17933
17971
  *,
17934
17972
  async_: Literal[True],
17935
17973
  **request_kwargs,
@@ -17939,7 +17977,9 @@ class P115Client(P115OpenClient):
17939
17977
  self,
17940
17978
  payload: str | dict,
17941
17979
  /,
17942
- use_web_api: bool = False,
17980
+ base_url: None | bool | str | Callable[[], str] = None,
17981
+ method: str = "POST",
17982
+ type: Literal[None, "", "web", "ssp"] = "ssp",
17943
17983
  *,
17944
17984
  async_: Literal[False, True] = False,
17945
17985
  **request_kwargs,
@@ -17961,14 +18001,24 @@ class P115Client(P115OpenClient):
17961
18001
  """
17962
18002
  if isinstance(payload, str):
17963
18003
  payload = {"info_hash": payload}
17964
- return self._offline_post(payload, "add_task_bt", use_web_api=use_web_api, async_=async_, **request_kwargs)
18004
+ return self._offline_request(
18005
+ payload,
18006
+ "add_task_bt",
18007
+ method=method,
18008
+ type=type,
18009
+ base_url=base_url,
18010
+ async_=async_,
18011
+ **request_kwargs,
18012
+ )
17965
18013
 
17966
18014
  @overload
17967
18015
  def offline_add_url(
17968
18016
  self,
17969
18017
  payload: str | dict,
17970
18018
  /,
17971
- use_web_api: bool = False,
18019
+ base_url: None | bool | str | Callable[[], str] = None,
18020
+ method: str = "POST",
18021
+ type: Literal[None, "", "web", "ssp"] = "ssp",
17972
18022
  *,
17973
18023
  async_: Literal[False] = False,
17974
18024
  **request_kwargs,
@@ -17979,7 +18029,9 @@ class P115Client(P115OpenClient):
17979
18029
  self,
17980
18030
  payload: str | dict,
17981
18031
  /,
17982
- use_web_api: bool = False,
18032
+ base_url: None | bool | str | Callable[[], str] = None,
18033
+ method: str = "POST",
18034
+ type: Literal[None, "", "web", "ssp"] = "ssp",
17983
18035
  *,
17984
18036
  async_: Literal[True],
17985
18037
  **request_kwargs,
@@ -17989,7 +18041,9 @@ class P115Client(P115OpenClient):
17989
18041
  self,
17990
18042
  payload: str | dict,
17991
18043
  /,
17992
- use_web_api: bool = False,
18044
+ base_url: None | bool | str | Callable[[], str] = None,
18045
+ method: str = "POST",
18046
+ type: Literal[None, "", "web", "ssp"] = "ssp",
17993
18047
  *,
17994
18048
  async_: Literal[False, True] = False,
17995
18049
  **request_kwargs,
@@ -18005,14 +18059,24 @@ class P115Client(P115OpenClient):
18005
18059
  """
18006
18060
  if isinstance(payload, str):
18007
18061
  payload = {"url": payload}
18008
- return self._offline_post(payload, "add_task_url", use_web_api=use_web_api, async_=async_, **request_kwargs)
18062
+ return self._offline_request(
18063
+ payload,
18064
+ "add_task_url",
18065
+ method=method,
18066
+ type=type,
18067
+ base_url=base_url,
18068
+ async_=async_,
18069
+ **request_kwargs,
18070
+ )
18009
18071
 
18010
- @overload # type: ignore
18072
+ @overload
18011
18073
  def offline_add_urls(
18012
18074
  self,
18013
18075
  payload: str | Iterable[str] | dict,
18014
18076
  /,
18015
- use_web_api: bool = False,
18077
+ base_url: None | bool | str | Callable[[], str] = None,
18078
+ method: str = "POST",
18079
+ type: Literal[None, "", "web", "ssp"] = "ssp",
18016
18080
  *,
18017
18081
  async_: Literal[False] = False,
18018
18082
  **request_kwargs,
@@ -18023,7 +18087,9 @@ class P115Client(P115OpenClient):
18023
18087
  self,
18024
18088
  payload: str | Iterable[str] | dict,
18025
18089
  /,
18026
- use_web_api: bool = False,
18090
+ base_url: None | bool | str | Callable[[], str] = None,
18091
+ method: str = "POST",
18092
+ type: Literal[None, "", "web", "ssp"] = "ssp",
18027
18093
  *,
18028
18094
  async_: Literal[True],
18029
18095
  **request_kwargs,
@@ -18033,7 +18099,9 @@ class P115Client(P115OpenClient):
18033
18099
  self,
18034
18100
  payload: str | Iterable[str] | dict,
18035
18101
  /,
18036
- use_web_api: bool = False,
18102
+ base_url: None | bool | str | Callable[[], str] = None,
18103
+ method: str = "POST",
18104
+ type: Literal[None, "", "web", "ssp"] = "ssp",
18037
18105
  *,
18038
18106
  async_: Literal[False, True] = False,
18039
18107
  **request_kwargs,
@@ -18043,6 +18111,7 @@ class P115Client(P115OpenClient):
18043
18111
  POST https://lixian.115.com/lixianssp/?ac=add_task_urls
18044
18112
 
18045
18113
  :payload:
18114
+ - url: str 💡 链接,支持HTTP、HTTPS、FTP、磁力链和电驴链接
18046
18115
  - url[0]: str 💡 链接,支持HTTP、HTTPS、FTP、磁力链和电驴链接
18047
18116
  - url[1]: str
18048
18117
  - ...
@@ -18052,10 +18121,18 @@ class P115Client(P115OpenClient):
18052
18121
  if isinstance(payload, str):
18053
18122
  payload = payload.strip("\n").split("\n")
18054
18123
  if not isinstance(payload, dict):
18055
- payload = {f"url[{i}]": url for i, url in enumerate(payload)}
18124
+ payload = {f"url[{i}]": url for i, url in enumerate(payload) if url}
18056
18125
  if not payload:
18057
18126
  raise ValueError("no `url` specified")
18058
- return self._offline_post(payload, "add_task_urls", use_web_api=use_web_api, async_=async_, **request_kwargs)
18127
+ return self._offline_request(
18128
+ payload,
18129
+ "add_task_urls",
18130
+ method=method,
18131
+ type=type,
18132
+ base_url=base_url,
18133
+ async_=async_,
18134
+ **request_kwargs,
18135
+ )
18059
18136
 
18060
18137
  @overload
18061
18138
  def offline_clear(
@@ -18063,6 +18140,8 @@ class P115Client(P115OpenClient):
18063
18140
  payload: int | dict = 0,
18064
18141
  /,
18065
18142
  base_url: None | bool | str | Callable[[], str] = None,
18143
+ method: str = "POST",
18144
+ type: Literal[None, "", "web", "ssp"] = None,
18066
18145
  *,
18067
18146
  async_: Literal[False] = False,
18068
18147
  **request_kwargs,
@@ -18074,6 +18153,8 @@ class P115Client(P115OpenClient):
18074
18153
  payload: int | dict = 0,
18075
18154
  /,
18076
18155
  base_url: None | bool | str | Callable[[], str] = None,
18156
+ method: str = "POST",
18157
+ type: Literal[None, "", "web", "ssp"] = None,
18077
18158
  *,
18078
18159
  async_: Literal[True],
18079
18160
  **request_kwargs,
@@ -18084,13 +18165,15 @@ class P115Client(P115OpenClient):
18084
18165
  payload: int | dict = 0,
18085
18166
  /,
18086
18167
  base_url: None | bool | str | Callable[[], str] = None,
18168
+ method: str = "POST",
18169
+ type: Literal[None, "", "web", "ssp"] = None,
18087
18170
  *,
18088
18171
  async_: Literal[False, True] = False,
18089
18172
  **request_kwargs,
18090
18173
  ) -> dict | Coroutine[Any, Any, dict]:
18091
18174
  """清空离线任务列表
18092
18175
 
18093
- POST https://115.com/web/lixian/?ct=lixian&ac=task_clear
18176
+ POST https://lixian.115.com/lixian/?ac=task_clear
18094
18177
 
18095
18178
  :payload:
18096
18179
  - flag: int = 0 💡 标识,用于对应某种情况
@@ -18102,10 +18185,17 @@ class P115Client(P115OpenClient):
18102
18185
  - 4: 已完成+删除源文件
18103
18186
  - 5: 全部+删除源文件
18104
18187
  """
18105
- api = complete_lixian_api("?ct=lixian&ac=task_clear", base_url=base_url)
18106
18188
  if isinstance(payload, int):
18107
18189
  payload = {"flag": payload}
18108
- return self.request(url=api, method="POST", data=payload, async_=async_, **request_kwargs)
18190
+ return self._offline_request(
18191
+ payload,
18192
+ "task_clear",
18193
+ method=method,
18194
+ type=type,
18195
+ base_url=base_url,
18196
+ async_=async_,
18197
+ **request_kwargs,
18198
+ )
18109
18199
 
18110
18200
  @overload
18111
18201
  def offline_download_path(
@@ -18142,6 +18232,49 @@ class P115Client(P115OpenClient):
18142
18232
  api = complete_webapi("/offine/downpath", base_url=base_url)
18143
18233
  return self.request(url=api, async_=async_, **request_kwargs)
18144
18234
 
18235
+ @overload
18236
+ def offline_download_path_set(
18237
+ self,
18238
+ payload: int | str | dict,
18239
+ /,
18240
+ base_url: bool | str | Callable[[], str] = False,
18241
+ *,
18242
+ async_: Literal[False] = False,
18243
+ **request_kwargs,
18244
+ ) -> dict:
18245
+ ...
18246
+ @overload
18247
+ def offline_download_path_set(
18248
+ self,
18249
+ payload: int | str | dict,
18250
+ /,
18251
+ base_url: bool | str | Callable[[], str] = False,
18252
+ *,
18253
+ async_: Literal[True],
18254
+ **request_kwargs,
18255
+ ) -> Coroutine[Any, Any, dict]:
18256
+ ...
18257
+ def offline_download_path_set(
18258
+ self,
18259
+ payload: int | str | dict,
18260
+ /,
18261
+ base_url: bool | str | Callable[[], str] = False,
18262
+ *,
18263
+ async_: Literal[False, True] = False,
18264
+ **request_kwargs,
18265
+ ) -> dict | Coroutine[Any, Any, dict]:
18266
+ """设置默认选择的离线下载到的目录信息
18267
+
18268
+ POST https://webapi.115.com/offine/downpath
18269
+
18270
+ :payload:
18271
+ - file_id: int | str 💡 目录 id
18272
+ """
18273
+ api = complete_webapi("/offine/downpath", base_url=base_url)
18274
+ if isinstance(payload, (int, str)):
18275
+ payload = {"file_id": payload}
18276
+ return self.request(url=api, method="POST", data=payload, async_=async_, **request_kwargs)
18277
+
18145
18278
  @overload
18146
18279
  def offline_info(
18147
18280
  self,
@@ -18177,12 +18310,14 @@ class P115Client(P115OpenClient):
18177
18310
  api = complete_api("/?ct=offline&ac=space", base_url=base_url)
18178
18311
  return self.request(url=api, async_=async_, **request_kwargs)
18179
18312
 
18180
- @overload # type: ignore
18313
+ @overload
18181
18314
  def offline_list(
18182
18315
  self,
18183
18316
  payload: int | dict = 1,
18184
18317
  /,
18185
18318
  base_url: None | bool | str | Callable[[], str] = None,
18319
+ method: str = "GET",
18320
+ type: Literal[None, "", "web", "ssp"] = None,
18186
18321
  *,
18187
18322
  async_: Literal[False] = False,
18188
18323
  **request_kwargs,
@@ -18191,9 +18326,11 @@ class P115Client(P115OpenClient):
18191
18326
  @overload
18192
18327
  def offline_list(
18193
18328
  self,
18194
- payload: int | dict,
18329
+ payload: int | dict = 1,
18195
18330
  /,
18196
18331
  base_url: None | bool | str | Callable[[], str] = None,
18332
+ method: str = "GET",
18333
+ type: Literal[None, "", "web", "ssp"] = None,
18197
18334
  *,
18198
18335
  async_: Literal[True],
18199
18336
  **request_kwargs,
@@ -18204,27 +18341,38 @@ class P115Client(P115OpenClient):
18204
18341
  payload: int | dict = 1,
18205
18342
  /,
18206
18343
  base_url: None | bool | str | Callable[[], str] = None,
18344
+ method: str = "GET",
18345
+ type: Literal[None, "", "web", "ssp"] = None,
18207
18346
  *,
18208
18347
  async_: Literal[False, True] = False,
18209
18348
  **request_kwargs,
18210
18349
  ) -> dict | Coroutine[Any, Any, dict]:
18211
18350
  """获取当前的离线任务列表
18212
18351
 
18213
- POST https://lixian.115.com/lixian/?ct=lixian&ac=task_lists
18352
+ GET https://lixian.115.com/lixian/?ac=task_lists
18214
18353
 
18215
18354
  :payload:
18216
18355
  - page: int | str = 1
18217
18356
  """
18218
- api = complete_lixian_api("?ct=lixian&ac=task_lists", base_url=base_url)
18219
18357
  if isinstance(payload, int):
18220
18358
  payload = {"page": payload}
18221
- return self.request(url=api, method="POST", data=payload, async_=async_, **request_kwargs)
18359
+ return self._offline_request(
18360
+ payload,
18361
+ "task_lists",
18362
+ method=method,
18363
+ type=type,
18364
+ base_url=base_url,
18365
+ async_=async_,
18366
+ **request_kwargs,
18367
+ )
18222
18368
 
18223
18369
  @overload
18224
18370
  def offline_quota_info(
18225
18371
  self,
18226
18372
  /,
18227
18373
  base_url: None | bool | str | Callable[[], str] = None,
18374
+ method: str = "GET",
18375
+ type: Literal[None, "", "web", "ssp"] = None,
18228
18376
  *,
18229
18377
  async_: Literal[False] = False,
18230
18378
  **request_kwargs,
@@ -18235,6 +18383,8 @@ class P115Client(P115OpenClient):
18235
18383
  self,
18236
18384
  /,
18237
18385
  base_url: None | bool | str | Callable[[], str] = None,
18386
+ method: str = "GET",
18387
+ type: Literal[None, "", "web", "ssp"] = None,
18238
18388
  *,
18239
18389
  async_: Literal[True],
18240
18390
  **request_kwargs,
@@ -18244,22 +18394,32 @@ class P115Client(P115OpenClient):
18244
18394
  self,
18245
18395
  /,
18246
18396
  base_url: None | bool | str | Callable[[], str] = None,
18397
+ method: str = "GET",
18398
+ type: Literal[None, "", "web", "ssp"] = None,
18247
18399
  *,
18248
18400
  async_: Literal[False, True] = False,
18249
18401
  **request_kwargs,
18250
18402
  ) -> dict | Coroutine[Any, Any, dict]:
18251
18403
  """获取当前离线配额信息(简略)
18252
18404
 
18253
- GET https://lixian.115.com/lixian/?ct=lixian&ac=get_quota_info
18405
+ GET https://lixian.115.com/lixian/?ac=get_quota_info
18254
18406
  """
18255
- api = complete_lixian_api("?ct=lixian&ac=get_quota_info", base_url=base_url)
18256
- return self.request(url=api, async_=async_, **request_kwargs)
18407
+ return self._offline_request(
18408
+ ac="get_quota_info",
18409
+ method=method,
18410
+ type=type,
18411
+ base_url=base_url,
18412
+ async_=async_,
18413
+ **request_kwargs,
18414
+ )
18257
18415
 
18258
18416
  @overload
18259
18417
  def offline_quota_package_array(
18260
18418
  self,
18261
18419
  /,
18262
18420
  base_url: None | bool | str | Callable[[], str] = None,
18421
+ method: str = "GET",
18422
+ type: Literal[None, "", "web", "ssp"] = None,
18263
18423
  *,
18264
18424
  async_: Literal[False] = False,
18265
18425
  **request_kwargs,
@@ -18270,6 +18430,8 @@ class P115Client(P115OpenClient):
18270
18430
  self,
18271
18431
  /,
18272
18432
  base_url: None | bool | str | Callable[[], str] = None,
18433
+ method: str = "GET",
18434
+ type: Literal[None, "", "web", "ssp"] = None,
18273
18435
  *,
18274
18436
  async_: Literal[True],
18275
18437
  **request_kwargs,
@@ -18279,22 +18441,32 @@ class P115Client(P115OpenClient):
18279
18441
  self,
18280
18442
  /,
18281
18443
  base_url: None | bool | str | Callable[[], str] = None,
18444
+ method: str = "GET",
18445
+ type: Literal[None, "", "web", "ssp"] = None,
18282
18446
  *,
18283
18447
  async_: Literal[False, True] = False,
18284
18448
  **request_kwargs,
18285
18449
  ) -> dict | Coroutine[Any, Any, dict]:
18286
18450
  """获取当前离线配额信息(详细)
18287
18451
 
18288
- GET https://lixian.115.com/lixian/?ct=lixian&ac=get_quota_package_array
18452
+ GET https://lixian.115.com/lixian/?ac=get_quota_package_array
18289
18453
  """
18290
- api = complete_lixian_api("?ct=lixian&ac=get_quota_package_array", base_url=base_url)
18291
- return self.request(url=api, async_=async_, **request_kwargs)
18454
+ return self._offline_request(
18455
+ ac="get_quota_package_array",
18456
+ method=method,
18457
+ type=type,
18458
+ base_url=base_url,
18459
+ async_=async_,
18460
+ **request_kwargs,
18461
+ )
18292
18462
 
18293
18463
  @overload
18294
18464
  def offline_quota_package_info(
18295
18465
  self,
18296
18466
  /,
18297
18467
  base_url: None | bool | str | Callable[[], str] = None,
18468
+ method: str = "GET",
18469
+ type: Literal[None, "", "web", "ssp"] = None,
18298
18470
  *,
18299
18471
  async_: Literal[False] = False,
18300
18472
  **request_kwargs,
@@ -18305,6 +18477,8 @@ class P115Client(P115OpenClient):
18305
18477
  self,
18306
18478
  /,
18307
18479
  base_url: None | bool | str | Callable[[], str] = None,
18480
+ method: str = "GET",
18481
+ type: Literal[None, "", "web", "ssp"] = None,
18308
18482
  *,
18309
18483
  async_: Literal[True],
18310
18484
  **request_kwargs,
@@ -18314,16 +18488,24 @@ class P115Client(P115OpenClient):
18314
18488
  self,
18315
18489
  /,
18316
18490
  base_url: None | bool | str | Callable[[], str] = None,
18491
+ method: str = "GET",
18492
+ type: Literal[None, "", "web", "ssp"] = None,
18317
18493
  *,
18318
18494
  async_: Literal[False, True] = False,
18319
18495
  **request_kwargs,
18320
18496
  ) -> dict | Coroutine[Any, Any, dict]:
18321
18497
  """获取当前离线配额信息(详细)
18322
18498
 
18323
- GET https://lixian.115.com/lixian/?ct=lixian&ac=get_quota_package_info
18499
+ GET https://lixian.115.com/lixian/?ac=get_quota_package_info
18324
18500
  """
18325
- api = complete_lixian_api("?ct=lixian&ac=get_quota_package_info", base_url=base_url)
18326
- return self.request(url=api, async_=async_, **request_kwargs)
18501
+ return self._offline_request(
18502
+ ac="get_quota_package_info",
18503
+ method=method,
18504
+ type=type,
18505
+ base_url=base_url,
18506
+ async_=async_,
18507
+ **request_kwargs,
18508
+ )
18327
18509
 
18328
18510
  @overload
18329
18511
  def offline_remove(
@@ -18331,6 +18513,8 @@ class P115Client(P115OpenClient):
18331
18513
  payload: str | Iterable[str] | dict,
18332
18514
  /,
18333
18515
  base_url: None | bool | str | Callable[[], str] = None,
18516
+ method: str = "POST",
18517
+ type: Literal[None, "", "web", "ssp"] = None,
18334
18518
  *,
18335
18519
  async_: Literal[False] = False,
18336
18520
  **request_kwargs,
@@ -18342,6 +18526,8 @@ class P115Client(P115OpenClient):
18342
18526
  payload: str | Iterable[str] | dict,
18343
18527
  /,
18344
18528
  base_url: None | bool | str | Callable[[], str] = None,
18529
+ method: str = "POST",
18530
+ type: Literal[None, "", "web", "ssp"] = None,
18345
18531
  *,
18346
18532
  async_: Literal[True],
18347
18533
  **request_kwargs,
@@ -18352,6 +18538,8 @@ class P115Client(P115OpenClient):
18352
18538
  payload: str | Iterable[str] | dict,
18353
18539
  /,
18354
18540
  base_url: None | bool | str | Callable[[], str] = None,
18541
+ method: str = "POST",
18542
+ type: Literal[None, "", "web", "ssp"] = None,
18355
18543
  *,
18356
18544
  async_: Literal[False, True] = False,
18357
18545
  **request_kwargs,
@@ -18366,14 +18554,21 @@ class P115Client(P115OpenClient):
18366
18554
  - ...
18367
18555
  - flag: 0 | 1 = <default> 💡 是否删除源文件
18368
18556
  """
18369
- api = complete_lixian_api("?ct=lixian&ac=task_del", base_url=base_url)
18370
18557
  if isinstance(payload, str):
18371
18558
  payload = {"hash[0]": payload}
18372
18559
  elif not isinstance(payload, dict):
18373
18560
  payload = {f"hash[{i}]": hash for i, hash in enumerate(payload)}
18374
18561
  if not payload:
18375
18562
  raise ValueError("no `hash` (info_hash) specified")
18376
- return self.request(api, method="POST", data=payload, async_=async_, **request_kwargs)
18563
+ return self._offline_request(
18564
+ payload,
18565
+ "task_del",
18566
+ method=method,
18567
+ type=type,
18568
+ base_url=base_url,
18569
+ async_=async_,
18570
+ **request_kwargs,
18571
+ )
18377
18572
 
18378
18573
  @overload
18379
18574
  def offline_restart(
@@ -18382,6 +18577,7 @@ class P115Client(P115OpenClient):
18382
18577
  /,
18383
18578
  base_url: None | bool | str | Callable[[], str] = None,
18384
18579
  method: str = "POST",
18580
+ type: Literal[None, "", "web", "ssp"] = None,
18385
18581
  *,
18386
18582
  async_: Literal[False] = False,
18387
18583
  **request_kwargs,
@@ -18394,6 +18590,7 @@ class P115Client(P115OpenClient):
18394
18590
  /,
18395
18591
  base_url: None | bool | str | Callable[[], str] = None,
18396
18592
  method: str = "POST",
18593
+ type: Literal[None, "", "web", "ssp"] = None,
18397
18594
  *,
18398
18595
  async_: Literal[True],
18399
18596
  **request_kwargs,
@@ -18405,6 +18602,7 @@ class P115Client(P115OpenClient):
18405
18602
  /,
18406
18603
  base_url: None | bool | str | Callable[[], str] = None,
18407
18604
  method: str = "POST",
18605
+ type: Literal[None, "", "web", "ssp"] = None,
18408
18606
  *,
18409
18607
  async_: Literal[False, True] = False,
18410
18608
  **request_kwargs,
@@ -18416,20 +18614,26 @@ class P115Client(P115OpenClient):
18416
18614
  :payload:
18417
18615
  - info_hash: str 💡 待重试任务的 info_hash
18418
18616
  """
18419
- api = complete_lixian_api("?ct=lixian&ac=restart", base_url=base_url)
18420
18617
  if isinstance(payload, str):
18421
18618
  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)
18619
+ return self._offline_request(
18620
+ payload,
18621
+ "restart",
18622
+ method=method,
18623
+ type=type,
18624
+ base_url=base_url,
18625
+ async_=async_,
18626
+ **request_kwargs,
18627
+ )
18427
18628
 
18428
18629
  @overload
18429
18630
  def offline_task_count(
18430
18631
  self,
18632
+ payload: dict | int = 0,
18431
18633
  /,
18432
18634
  base_url: None | bool | str | Callable[[], str] = None,
18635
+ method: str = "GET",
18636
+ type: Literal[None, "", "web", "ssp"] = None,
18433
18637
  *,
18434
18638
  async_: Literal[False] = False,
18435
18639
  **request_kwargs,
@@ -18438,8 +18642,11 @@ class P115Client(P115OpenClient):
18438
18642
  @overload
18439
18643
  def offline_task_count(
18440
18644
  self,
18645
+ payload: dict | int = 0,
18441
18646
  /,
18442
18647
  base_url: None | bool | str | Callable[[], str] = None,
18648
+ method: str = "GET",
18649
+ type: Literal[None, "", "web", "ssp"] = None,
18443
18650
  *,
18444
18651
  async_: Literal[True],
18445
18652
  **request_kwargs,
@@ -18447,18 +18654,33 @@ class P115Client(P115OpenClient):
18447
18654
  ...
18448
18655
  def offline_task_count(
18449
18656
  self,
18657
+ payload: dict | int = 0,
18450
18658
  /,
18451
18659
  base_url: None | bool | str | Callable[[], str] = None,
18660
+ method: str = "GET",
18661
+ type: Literal[None, "", "web", "ssp"] = None,
18452
18662
  *,
18453
18663
  async_: Literal[False, True] = False,
18454
18664
  **request_kwargs,
18455
18665
  ) -> dict | Coroutine[Any, Any, dict]:
18456
18666
  """获取当前正在运行的离线任务数
18457
18667
 
18458
- GET https://lixian.115.com/lixian/?ct=lixian&ac=get_task_cnt&flag=0
18668
+ GET https://lixian.115.com/lixian/?ac=get_task_cnt
18669
+
18670
+ :payload:
18671
+ flag: int = 0
18459
18672
  """
18460
- api = complete_lixian_api("?ct=lixian&ac=get_task_cnt&flag=0", base_url=base_url)
18461
- return self.request(url=api, async_=async_, **request_kwargs)
18673
+ if isinstance(payload, int):
18674
+ payload = {"flag": 0}
18675
+ return self._offline_request(
18676
+ payload,
18677
+ "get_task_cnt",
18678
+ method=method,
18679
+ type=type,
18680
+ base_url=base_url,
18681
+ async_=async_,
18682
+ **request_kwargs,
18683
+ )
18462
18684
 
18463
18685
  @overload
18464
18686
  def offline_torrent_info(
@@ -18466,6 +18688,8 @@ class P115Client(P115OpenClient):
18466
18688
  payload: str | dict,
18467
18689
  /,
18468
18690
  base_url: None | bool | str | Callable[[], str] = None,
18691
+ method: str = "GET",
18692
+ type: Literal[None, "", "web", "ssp"] = None,
18469
18693
  *,
18470
18694
  async_: Literal[False] = False,
18471
18695
  **request_kwargs,
@@ -18477,6 +18701,8 @@ class P115Client(P115OpenClient):
18477
18701
  payload: str | dict,
18478
18702
  /,
18479
18703
  base_url: None | bool | str | Callable[[], str] = None,
18704
+ method: str = "GET",
18705
+ type: Literal[None, "", "web", "ssp"] = None,
18480
18706
  *,
18481
18707
  async_: Literal[True],
18482
18708
  **request_kwargs,
@@ -18487,27 +18713,39 @@ class P115Client(P115OpenClient):
18487
18713
  payload: str | dict,
18488
18714
  /,
18489
18715
  base_url: None | bool | str | Callable[[], str] = None,
18716
+ method: str = "GET",
18717
+ type: Literal[None, "", "web", "ssp"] = None,
18490
18718
  *,
18491
18719
  async_: Literal[False, True] = False,
18492
18720
  **request_kwargs,
18493
18721
  ) -> dict | Coroutine[Any, Any, dict]:
18494
18722
  """查看种子的文件列表等信息
18495
18723
 
18496
- POST https://lixian.115.com/lixian/?ct=lixian&ac=torrent
18724
+ GET https://lixian.115.com/lixian/?ac=torrent
18497
18725
 
18498
18726
  :payload:
18499
18727
  - sha1: str
18500
18728
  """
18501
- api = complete_lixian_api("?ct=lixian&ac=torrent", base_url=base_url)
18502
18729
  if isinstance(payload, str):
18503
18730
  payload = {"sha1": payload}
18504
- return self.request(url=api, method="POST", data=payload, async_=async_, **request_kwargs)
18731
+ return self._offline_request(
18732
+ payload,
18733
+ "torrent",
18734
+ method=method,
18735
+ type=type,
18736
+ base_url=base_url,
18737
+ async_=async_,
18738
+ **request_kwargs,
18739
+ )
18505
18740
 
18506
18741
  @overload
18507
18742
  def offline_upload_torrent_path(
18508
18743
  self,
18744
+ payload: dict | int = 1,
18509
18745
  /,
18510
- base_url: bool | str | Callable[[], str] = False,
18746
+ base_url: None | bool | str | Callable[[], str] = None,
18747
+ method: str = "GET",
18748
+ type: Literal[None, "", "web", "ssp"] = None,
18511
18749
  *,
18512
18750
  async_: Literal[False] = False,
18513
18751
  **request_kwargs,
@@ -18516,8 +18754,11 @@ class P115Client(P115OpenClient):
18516
18754
  @overload
18517
18755
  def offline_upload_torrent_path(
18518
18756
  self,
18757
+ payload: dict | int = 1,
18519
18758
  /,
18520
- base_url: bool | str | Callable[[], str] = False,
18759
+ base_url: None | bool | str | Callable[[], str] = None,
18760
+ method: str = "GET",
18761
+ type: Literal[None, "", "web", "ssp"] = None,
18521
18762
  *,
18522
18763
  async_: Literal[True],
18523
18764
  **request_kwargs,
@@ -18525,18 +18766,33 @@ class P115Client(P115OpenClient):
18525
18766
  ...
18526
18767
  def offline_upload_torrent_path(
18527
18768
  self,
18769
+ payload: dict | int = 1,
18528
18770
  /,
18529
- base_url: bool | str | Callable[[], str] = False,
18771
+ base_url: None | bool | str | Callable[[], str] = None,
18772
+ method: str = "GET",
18773
+ type: Literal[None, "", "web", "ssp"] = None,
18530
18774
  *,
18531
18775
  async_: Literal[False, True] = False,
18532
18776
  **request_kwargs,
18533
18777
  ) -> dict | Coroutine[Any, Any, dict]:
18534
18778
  """获取当前的种子上传到的目录,当你添加种子任务后,这个种子会在此目录中保存
18535
18779
 
18536
- GET https://115.com/?ct=lixian&ac=get_id&torrent=1
18780
+ GET https://lixian.115.com/lixian/?ac=get_id
18781
+
18782
+ :payload:
18783
+ - torrent: int = 1
18537
18784
  """
18538
- api = complete_api("/?ct=lixian&ac=get_id&torrent=1", base_url=base_url)
18539
- return self.request(url=api, async_=async_, **request_kwargs)
18785
+ if isinstance(payload, int):
18786
+ payload = {"torrent": payload}
18787
+ return self._offline_request(
18788
+ payload,
18789
+ "get_id",
18790
+ method=method,
18791
+ type=type,
18792
+ base_url=base_url,
18793
+ async_=async_,
18794
+ **request_kwargs,
18795
+ )
18540
18796
 
18541
18797
  ########## Recyclebin API ##########
18542
18798
 
@@ -21021,7 +21277,7 @@ class P115Client(P115OpenClient):
21021
21277
  request_kwargs.update(make_upload_payload(data))
21022
21278
  request_kwargs["headers"] = {
21023
21279
  **(request_kwargs.get("headers") or {}),
21024
- "Content-Type": "application/x-www-form-urlencoded",
21280
+ "content-type": "application/x-www-form-urlencoded",
21025
21281
  "user-agent": "Mozilla/5.0 115disk/99.99.99.99 115Browser/99.99.99.99 115wangpan_android/99.99.99.99",
21026
21282
  }
21027
21283
  request_kwargs.setdefault("parse", parse_upload_init_response)
@@ -12,6 +12,7 @@ from .fs_files import *
12
12
  from .history import *
13
13
  from .iterdir import *
14
14
  from .life import *
15
+ from .offline import *
15
16
  from .pool import *
16
17
  from .request import *
17
18
  from .upload import *
@@ -0,0 +1,164 @@
1
+ #!/usr/bin/env python3
2
+ # encoding: utf-8
3
+
4
+ __author__ = "ChenyangGao <https://chenyanggao.github.io>"
5
+ __all__ = ["offline_iter", "offline_restart_iter"]
6
+ __doc__ = "这个模块提供了一些和离线下载有关的函数"
7
+
8
+ from asyncio import sleep as async_sleep
9
+ from collections.abc import AsyncIterator, Callable, Iterable, Iterator
10
+ from itertools import count
11
+ from time import sleep, time
12
+ from typing import overload, Literal
13
+
14
+ from iterutils import run_gen_step_iter, with_iter_next, Yield, YieldFrom
15
+ from p115client import check_response, P115Client, P115OpenClient
16
+
17
+
18
+ @overload
19
+ def offline_iter(
20
+ client: str | P115Client | P115OpenClient,
21
+ /,
22
+ page_start: int = 1,
23
+ page_stop: int = -1,
24
+ cooldown: float = 0,
25
+ use_open_api: bool = False,
26
+ *,
27
+ async_: Literal[False] = False,
28
+ **request_kwargs,
29
+ ) -> Iterator[dict]:
30
+ ...
31
+ @overload
32
+ def offline_iter(
33
+ client: str | P115Client | P115OpenClient,
34
+ /,
35
+ page_start: int = 1,
36
+ page_stop: int = -1,
37
+ cooldown: float = 0,
38
+ use_open_api: bool = False,
39
+ *,
40
+ async_: Literal[True],
41
+ **request_kwargs,
42
+ ) -> AsyncIterator[dict]:
43
+ ...
44
+ def offline_iter(
45
+ client: str | P115Client | P115OpenClient,
46
+ /,
47
+ page_start: int = 1,
48
+ page_stop: int = -1,
49
+ cooldown: float = 0,
50
+ use_open_api: bool = False,
51
+ *,
52
+ async_: Literal[False, True] = False,
53
+ **request_kwargs,
54
+ ) -> Iterator[dict] | AsyncIterator[dict]:
55
+ """遍历任务列表,获取任务信息
56
+
57
+ :param client: 115 客户端或 cookies
58
+ :param page_start: 开始页数
59
+ :param page_stop: 结束页数(不含),如果 <= 0,则不限
60
+ :param cooldown: 接口调用冷却时间,单位:秒
61
+ :param use_open_api: 是否使用 open api
62
+ :param async_: 是否异步
63
+ :param request_kwargs: 其它请求参数
64
+
65
+ :return: 迭代器,返回任务信息
66
+ """
67
+ if isinstance(client, str):
68
+ client = P115Client(client, check_for_relogin=True)
69
+ if page_start < 1:
70
+ page_start = 1
71
+ if page_stop > 0:
72
+ pages: Iterable[int] = range(page_start, page_stop)
73
+ else:
74
+ pages = count(page_start)
75
+ if not isinstance(client, P115Client):
76
+ use_open_api = True
77
+ def gen_step():
78
+ if use_open_api:
79
+ offline_list = client.offline_list_open
80
+ else:
81
+ offline_list = client.offline_list
82
+ if cooldown > 0:
83
+ do_sleep = async_sleep if async_ else sleep
84
+ last_t: float = 0
85
+ for page in pages:
86
+ if last_t and (diff := last_t + cooldown - time()) > 0:
87
+ yield do_sleep(diff)
88
+ last_t = time()
89
+ resp = yield offline_list(page, async_=async_, **request_kwargs)
90
+ check_response(resp)
91
+ if use_open_api:
92
+ resp = resp["data"]
93
+ tasks = resp["tasks"]
94
+ if not tasks:
95
+ break
96
+ yield YieldFrom(resp["tasks"])
97
+ if len(tasks) < 30 or page >= resp["page_count"]:
98
+ break
99
+ return run_gen_step_iter(gen_step, async_=async_)
100
+
101
+
102
+ @overload
103
+ def offline_restart_iter(
104
+ client: str | P115Client,
105
+ /,
106
+ predicate: None | Callable[[dict], bool] = None,
107
+ *,
108
+ async_: Literal[False] = False,
109
+ **request_kwargs,
110
+ ) -> Iterator[dict]:
111
+ ...
112
+ @overload
113
+ def offline_restart_iter(
114
+ client: str | P115Client,
115
+ /,
116
+ predicate: None | Callable[[dict], bool] = None,
117
+ *,
118
+ async_: Literal[True],
119
+ **request_kwargs,
120
+ ) -> AsyncIterator[dict]:
121
+ ...
122
+ def offline_restart_iter(
123
+ client: str | P115Client,
124
+ /,
125
+ predicate: None | Callable[[dict], bool] = None,
126
+ *,
127
+ async_: Literal[False, True] = False,
128
+ **request_kwargs,
129
+ ) -> Iterator[dict] | AsyncIterator[dict]:
130
+ """重试任务:重试那些因为空间不足而转存失败的任务
131
+
132
+ :param client: 115 客户端或 cookies
133
+ :param predicate: 断言,用于筛选
134
+ :param async_: 是否异步
135
+ :param request_kwargs: 其它请求参数
136
+
137
+ :return: 迭代器,逐个任务返回执行重试后的响应
138
+ """
139
+ if isinstance(client, str):
140
+ client = P115Client(client, check_for_relogin=True)
141
+ def gen_step():
142
+ left_no_space: list[dict] = []
143
+ add_task = left_no_space.append
144
+ with with_iter_next(offline_iter(
145
+ client,
146
+ async_=async_,
147
+ **request_kwargs,
148
+ )) as do_next:
149
+ while True:
150
+ task = yield do_next()
151
+ if task["move"] == -1:
152
+ add_task(task)
153
+ elif task["status"] == 2:
154
+ break
155
+ for task in filter(predicate, left_no_space):
156
+ resp = yield client.offline_restart(
157
+ task["info_hash"],
158
+ async_=async_,
159
+ **request_kwargs,
160
+ )
161
+ resp["task"] = task
162
+ yield Yield(resp)
163
+ return run_gen_step_iter(gen_step, async_=async_)
164
+
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "p115client"
3
- version = "0.0.5.11.10.2"
3
+ version = "0.0.5.12"
4
4
  description = "Python 115 webdisk client."
5
5
  authors = ["ChenyangGao <wosiwujm@gmail.com>"]
6
6
  license = "MIT"