plex-api-client 0.6.1__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.
- plex_api/__init__.py +4 -0
- plex_api/_hooks/__init__.py +5 -0
- plex_api/_hooks/registration.py +13 -0
- plex_api/_hooks/sdkhooks.py +57 -0
- plex_api/_hooks/types.py +74 -0
- plex_api/activities.py +151 -0
- plex_api/authentication.py +146 -0
- plex_api/butler.py +333 -0
- plex_api/hubs.py +158 -0
- plex_api/library.py +808 -0
- plex_api/log.py +225 -0
- plex_api/media.py +210 -0
- plex_api/models/__init__.py +4 -0
- plex_api/models/components/__init__.py +5 -0
- plex_api/models/components/security.py +11 -0
- plex_api/models/errors/__init__.py +63 -0
- plex_api/models/errors/addplaylistcontents.py +32 -0
- plex_api/models/errors/applyupdates.py +32 -0
- plex_api/models/errors/cancelserveractivities.py +32 -0
- plex_api/models/errors/checkforupdates.py +32 -0
- plex_api/models/errors/clearplaylistcontents.py +32 -0
- plex_api/models/errors/createplaylist.py +32 -0
- plex_api/models/errors/deletelibrary.py +32 -0
- plex_api/models/errors/deleteplaylist.py +32 -0
- plex_api/models/errors/enablepapertrail.py +32 -0
- plex_api/models/errors/getavailableclients.py +32 -0
- plex_api/models/errors/getbutlertasks.py +32 -0
- plex_api/models/errors/getdevices.py +32 -0
- plex_api/models/errors/getfilehash.py +32 -0
- plex_api/models/errors/getglobalhubs.py +32 -0
- plex_api/models/errors/getlibraries.py +32 -0
- plex_api/models/errors/getlibrary.py +32 -0
- plex_api/models/errors/getlibraryhubs.py +32 -0
- plex_api/models/errors/getmetadata.py +32 -0
- plex_api/models/errors/getmetadatachildren.py +32 -0
- plex_api/models/errors/getmyplexaccount.py +32 -0
- plex_api/models/errors/getondeck.py +32 -0
- plex_api/models/errors/getpin.py +32 -0
- plex_api/models/errors/getplaylist.py +32 -0
- plex_api/models/errors/getplaylistcontents.py +32 -0
- plex_api/models/errors/getplaylists.py +32 -0
- plex_api/models/errors/getrecentlyadded.py +32 -0
- plex_api/models/errors/getresizedphoto.py +32 -0
- plex_api/models/errors/getsearchresults.py +32 -0
- plex_api/models/errors/getserveractivities.py +32 -0
- plex_api/models/errors/getservercapabilities.py +32 -0
- plex_api/models/errors/getserveridentity.py +32 -0
- plex_api/models/errors/getserverlist.py +32 -0
- plex_api/models/errors/getserverpreferences.py +32 -0
- plex_api/models/errors/getsessionhistory.py +32 -0
- plex_api/models/errors/getsessions.py +32 -0
- plex_api/models/errors/getsourceconnectioninformation.py +32 -0
- plex_api/models/errors/getstatistics.py +32 -0
- plex_api/models/errors/gettimeline.py +32 -0
- plex_api/models/errors/gettoken.py +32 -0
- plex_api/models/errors/gettranscodesessions.py +32 -0
- plex_api/models/errors/gettransienttoken.py +32 -0
- plex_api/models/errors/getupdatestatus.py +32 -0
- plex_api/models/errors/logline.py +32 -0
- plex_api/models/errors/logmultiline.py +32 -0
- plex_api/models/errors/markplayed.py +32 -0
- plex_api/models/errors/markunplayed.py +32 -0
- plex_api/models/errors/performsearch.py +32 -0
- plex_api/models/errors/performvoicesearch.py +32 -0
- plex_api/models/errors/refreshlibrary.py +32 -0
- plex_api/models/errors/sdkerror.py +24 -0
- plex_api/models/errors/startalltasks.py +32 -0
- plex_api/models/errors/starttask.py +32 -0
- plex_api/models/errors/startuniversaltranscode.py +32 -0
- plex_api/models/errors/stopalltasks.py +32 -0
- plex_api/models/errors/stoptask.py +32 -0
- plex_api/models/errors/stoptranscodesession.py +32 -0
- plex_api/models/errors/updateplaylist.py +32 -0
- plex_api/models/errors/updateplayprogress.py +32 -0
- plex_api/models/errors/uploadplaylist.py +32 -0
- plex_api/models/operations/__init__.py +64 -0
- plex_api/models/operations/addplaylistcontents.py +74 -0
- plex_api/models/operations/applyupdates.py +39 -0
- plex_api/models/operations/cancelserveractivities.py +25 -0
- plex_api/models/operations/checkforupdates.py +32 -0
- plex_api/models/operations/clearplaylistcontents.py +25 -0
- plex_api/models/operations/createplaylist.py +91 -0
- plex_api/models/operations/deletelibrary.py +25 -0
- plex_api/models/operations/deleteplaylist.py +25 -0
- plex_api/models/operations/enablepapertrail.py +17 -0
- plex_api/models/operations/getavailableclients.py +58 -0
- plex_api/models/operations/getbutlertasks.py +52 -0
- plex_api/models/operations/getdevices.py +53 -0
- plex_api/models/operations/getfilehash.py +28 -0
- plex_api/models/operations/getglobalhubs.py +100 -0
- plex_api/models/operations/getlibraries.py +79 -0
- plex_api/models/operations/getlibrary.py +153 -0
- plex_api/models/operations/getlibraryhubs.py +205 -0
- plex_api/models/operations/getlibraryitems.py +227 -0
- plex_api/models/operations/getmetadata.py +264 -0
- plex_api/models/operations/getmetadatachildren.py +115 -0
- plex_api/models/operations/getmyplexaccount.py +50 -0
- plex_api/models/operations/getondeck.py +166 -0
- plex_api/models/operations/getpin.py +86 -0
- plex_api/models/operations/getplaylist.py +70 -0
- plex_api/models/operations/getplaylistcontents.py +178 -0
- plex_api/models/operations/getplaylists.py +85 -0
- plex_api/models/operations/getrecentlyadded.py +166 -0
- plex_api/models/operations/getresizedphoto.py +48 -0
- plex_api/models/operations/getsearchresults.py +182 -0
- plex_api/models/operations/getserveractivities.py +63 -0
- plex_api/models/operations/getservercapabilities.py +99 -0
- plex_api/models/operations/getserveridentity.py +42 -0
- plex_api/models/operations/getserverlist.py +53 -0
- plex_api/models/operations/getserverpreferences.py +57 -0
- plex_api/models/operations/getsessionhistory.py +67 -0
- plex_api/models/operations/getsessions.py +185 -0
- plex_api/models/operations/getsourceconnectioninformation.py +25 -0
- plex_api/models/operations/getstatistics.py +93 -0
- plex_api/models/operations/gettimeline.py +50 -0
- plex_api/models/operations/gettoken.py +35 -0
- plex_api/models/operations/gettranscodesessions.py +71 -0
- plex_api/models/operations/gettransienttoken.py +36 -0
- plex_api/models/operations/getupdatestatus.py +57 -0
- plex_api/models/operations/logline.py +50 -0
- plex_api/models/operations/logmultiline.py +17 -0
- plex_api/models/operations/markplayed.py +25 -0
- plex_api/models/operations/markunplayed.py +25 -0
- plex_api/models/operations/performsearch.py +30 -0
- plex_api/models/operations/performvoicesearch.py +30 -0
- plex_api/models/operations/refreshlibrary.py +25 -0
- plex_api/models/operations/searchlibrary.py +96 -0
- plex_api/models/operations/startalltasks.py +17 -0
- plex_api/models/operations/starttask.py +43 -0
- plex_api/models/operations/startuniversaltranscode.py +56 -0
- plex_api/models/operations/stopalltasks.py +17 -0
- plex_api/models/operations/stoptask.py +43 -0
- plex_api/models/operations/stoptranscodesession.py +25 -0
- plex_api/models/operations/updateplaylist.py +30 -0
- plex_api/models/operations/updateplayprogress.py +29 -0
- plex_api/models/operations/uploadplaylist.py +47 -0
- plex_api/playlists.py +629 -0
- plex_api/plex.py +154 -0
- plex_api/sdk.py +180 -0
- plex_api/sdkconfiguration.py +52 -0
- plex_api/search.py +232 -0
- plex_api/server.py +525 -0
- plex_api/sessions.py +272 -0
- plex_api/statistics.py +86 -0
- plex_api/updater.py +212 -0
- plex_api/utils/__init__.py +4 -0
- plex_api/utils/retries.py +120 -0
- plex_api/utils/utils.py +898 -0
- plex_api/video.py +136 -0
- plex_api_client-0.6.1.dist-info/LICENSE.md +21 -0
- plex_api_client-0.6.1.dist-info/METADATA +397 -0
- plex_api_client-0.6.1.dist-info/RECORD +154 -0
- plex_api_client-0.6.1.dist-info/WHEEL +5 -0
- plex_api_client-0.6.1.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
"""Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT."""
|
|
2
|
+
|
|
3
|
+
import random
|
|
4
|
+
import time
|
|
5
|
+
from typing import List
|
|
6
|
+
|
|
7
|
+
import requests
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class BackoffStrategy:
|
|
11
|
+
initial_interval: int
|
|
12
|
+
max_interval: int
|
|
13
|
+
exponent: float
|
|
14
|
+
max_elapsed_time: int
|
|
15
|
+
|
|
16
|
+
def __init__(self, initial_interval: int, max_interval: int, exponent: float, max_elapsed_time: int):
|
|
17
|
+
self.initial_interval = initial_interval
|
|
18
|
+
self.max_interval = max_interval
|
|
19
|
+
self.exponent = exponent
|
|
20
|
+
self.max_elapsed_time = max_elapsed_time
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class RetryConfig:
|
|
24
|
+
strategy: str
|
|
25
|
+
backoff: BackoffStrategy
|
|
26
|
+
retry_connection_errors: bool
|
|
27
|
+
|
|
28
|
+
def __init__(self, strategy: str, backoff: BackoffStrategy, retry_connection_errors: bool):
|
|
29
|
+
self.strategy = strategy
|
|
30
|
+
self.backoff = backoff
|
|
31
|
+
self.retry_connection_errors = retry_connection_errors
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class Retries:
|
|
35
|
+
config: RetryConfig
|
|
36
|
+
status_codes: List[str]
|
|
37
|
+
|
|
38
|
+
def __init__(self, config: RetryConfig, status_codes: List[str]):
|
|
39
|
+
self.config = config
|
|
40
|
+
self.status_codes = status_codes
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
class TemporaryError(Exception):
|
|
44
|
+
response: requests.Response
|
|
45
|
+
|
|
46
|
+
def __init__(self, response: requests.Response):
|
|
47
|
+
self.response = response
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
class PermanentError(Exception):
|
|
51
|
+
inner: Exception
|
|
52
|
+
|
|
53
|
+
def __init__(self, inner: Exception):
|
|
54
|
+
self.inner = inner
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def retry(func, retries: Retries):
|
|
58
|
+
if retries.config.strategy == 'backoff':
|
|
59
|
+
def do_request():
|
|
60
|
+
res: requests.Response
|
|
61
|
+
try:
|
|
62
|
+
res = func()
|
|
63
|
+
|
|
64
|
+
for code in retries.status_codes:
|
|
65
|
+
if "X" in code.upper():
|
|
66
|
+
code_range = int(code[0])
|
|
67
|
+
|
|
68
|
+
status_major = res.status_code / 100
|
|
69
|
+
|
|
70
|
+
if status_major >= code_range and status_major < code_range + 1:
|
|
71
|
+
raise TemporaryError(res)
|
|
72
|
+
else:
|
|
73
|
+
parsed_code = int(code)
|
|
74
|
+
|
|
75
|
+
if res.status_code == parsed_code:
|
|
76
|
+
raise TemporaryError(res)
|
|
77
|
+
except requests.exceptions.ConnectionError as exception:
|
|
78
|
+
if retries.config.retry_connection_errors:
|
|
79
|
+
raise
|
|
80
|
+
|
|
81
|
+
raise PermanentError(exception) from exception
|
|
82
|
+
except requests.exceptions.Timeout as exception:
|
|
83
|
+
if retries.config.retry_connection_errors:
|
|
84
|
+
raise
|
|
85
|
+
|
|
86
|
+
raise PermanentError(exception) from exception
|
|
87
|
+
except TemporaryError:
|
|
88
|
+
raise
|
|
89
|
+
except Exception as exception:
|
|
90
|
+
raise PermanentError(exception) from exception
|
|
91
|
+
|
|
92
|
+
return res
|
|
93
|
+
|
|
94
|
+
return retry_with_backoff(do_request, retries.config.backoff.initial_interval, retries.config.backoff.max_interval, retries.config.backoff.exponent, retries.config.backoff.max_elapsed_time)
|
|
95
|
+
|
|
96
|
+
return func()
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
def retry_with_backoff(func, initial_interval=500, max_interval=60000, exponent=1.5, max_elapsed_time=3600000):
|
|
100
|
+
start = round(time.time()*1000)
|
|
101
|
+
retries = 0
|
|
102
|
+
|
|
103
|
+
while True:
|
|
104
|
+
try:
|
|
105
|
+
return func()
|
|
106
|
+
except PermanentError as exception:
|
|
107
|
+
raise exception.inner
|
|
108
|
+
except Exception as exception: # pylint: disable=broad-exception-caught
|
|
109
|
+
now = round(time.time()*1000)
|
|
110
|
+
if now - start > max_elapsed_time:
|
|
111
|
+
if isinstance(exception, TemporaryError):
|
|
112
|
+
return exception.response
|
|
113
|
+
|
|
114
|
+
raise
|
|
115
|
+
sleep = ((initial_interval/1000) *
|
|
116
|
+
exponent**retries + random.uniform(0, 1))
|
|
117
|
+
if sleep > max_interval/1000:
|
|
118
|
+
sleep = max_interval/1000
|
|
119
|
+
time.sleep(sleep)
|
|
120
|
+
retries += 1
|