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.
Files changed (154) hide show
  1. plex_api/__init__.py +4 -0
  2. plex_api/_hooks/__init__.py +5 -0
  3. plex_api/_hooks/registration.py +13 -0
  4. plex_api/_hooks/sdkhooks.py +57 -0
  5. plex_api/_hooks/types.py +74 -0
  6. plex_api/activities.py +151 -0
  7. plex_api/authentication.py +146 -0
  8. plex_api/butler.py +333 -0
  9. plex_api/hubs.py +158 -0
  10. plex_api/library.py +808 -0
  11. plex_api/log.py +225 -0
  12. plex_api/media.py +210 -0
  13. plex_api/models/__init__.py +4 -0
  14. plex_api/models/components/__init__.py +5 -0
  15. plex_api/models/components/security.py +11 -0
  16. plex_api/models/errors/__init__.py +63 -0
  17. plex_api/models/errors/addplaylistcontents.py +32 -0
  18. plex_api/models/errors/applyupdates.py +32 -0
  19. plex_api/models/errors/cancelserveractivities.py +32 -0
  20. plex_api/models/errors/checkforupdates.py +32 -0
  21. plex_api/models/errors/clearplaylistcontents.py +32 -0
  22. plex_api/models/errors/createplaylist.py +32 -0
  23. plex_api/models/errors/deletelibrary.py +32 -0
  24. plex_api/models/errors/deleteplaylist.py +32 -0
  25. plex_api/models/errors/enablepapertrail.py +32 -0
  26. plex_api/models/errors/getavailableclients.py +32 -0
  27. plex_api/models/errors/getbutlertasks.py +32 -0
  28. plex_api/models/errors/getdevices.py +32 -0
  29. plex_api/models/errors/getfilehash.py +32 -0
  30. plex_api/models/errors/getglobalhubs.py +32 -0
  31. plex_api/models/errors/getlibraries.py +32 -0
  32. plex_api/models/errors/getlibrary.py +32 -0
  33. plex_api/models/errors/getlibraryhubs.py +32 -0
  34. plex_api/models/errors/getmetadata.py +32 -0
  35. plex_api/models/errors/getmetadatachildren.py +32 -0
  36. plex_api/models/errors/getmyplexaccount.py +32 -0
  37. plex_api/models/errors/getondeck.py +32 -0
  38. plex_api/models/errors/getpin.py +32 -0
  39. plex_api/models/errors/getplaylist.py +32 -0
  40. plex_api/models/errors/getplaylistcontents.py +32 -0
  41. plex_api/models/errors/getplaylists.py +32 -0
  42. plex_api/models/errors/getrecentlyadded.py +32 -0
  43. plex_api/models/errors/getresizedphoto.py +32 -0
  44. plex_api/models/errors/getsearchresults.py +32 -0
  45. plex_api/models/errors/getserveractivities.py +32 -0
  46. plex_api/models/errors/getservercapabilities.py +32 -0
  47. plex_api/models/errors/getserveridentity.py +32 -0
  48. plex_api/models/errors/getserverlist.py +32 -0
  49. plex_api/models/errors/getserverpreferences.py +32 -0
  50. plex_api/models/errors/getsessionhistory.py +32 -0
  51. plex_api/models/errors/getsessions.py +32 -0
  52. plex_api/models/errors/getsourceconnectioninformation.py +32 -0
  53. plex_api/models/errors/getstatistics.py +32 -0
  54. plex_api/models/errors/gettimeline.py +32 -0
  55. plex_api/models/errors/gettoken.py +32 -0
  56. plex_api/models/errors/gettranscodesessions.py +32 -0
  57. plex_api/models/errors/gettransienttoken.py +32 -0
  58. plex_api/models/errors/getupdatestatus.py +32 -0
  59. plex_api/models/errors/logline.py +32 -0
  60. plex_api/models/errors/logmultiline.py +32 -0
  61. plex_api/models/errors/markplayed.py +32 -0
  62. plex_api/models/errors/markunplayed.py +32 -0
  63. plex_api/models/errors/performsearch.py +32 -0
  64. plex_api/models/errors/performvoicesearch.py +32 -0
  65. plex_api/models/errors/refreshlibrary.py +32 -0
  66. plex_api/models/errors/sdkerror.py +24 -0
  67. plex_api/models/errors/startalltasks.py +32 -0
  68. plex_api/models/errors/starttask.py +32 -0
  69. plex_api/models/errors/startuniversaltranscode.py +32 -0
  70. plex_api/models/errors/stopalltasks.py +32 -0
  71. plex_api/models/errors/stoptask.py +32 -0
  72. plex_api/models/errors/stoptranscodesession.py +32 -0
  73. plex_api/models/errors/updateplaylist.py +32 -0
  74. plex_api/models/errors/updateplayprogress.py +32 -0
  75. plex_api/models/errors/uploadplaylist.py +32 -0
  76. plex_api/models/operations/__init__.py +64 -0
  77. plex_api/models/operations/addplaylistcontents.py +74 -0
  78. plex_api/models/operations/applyupdates.py +39 -0
  79. plex_api/models/operations/cancelserveractivities.py +25 -0
  80. plex_api/models/operations/checkforupdates.py +32 -0
  81. plex_api/models/operations/clearplaylistcontents.py +25 -0
  82. plex_api/models/operations/createplaylist.py +91 -0
  83. plex_api/models/operations/deletelibrary.py +25 -0
  84. plex_api/models/operations/deleteplaylist.py +25 -0
  85. plex_api/models/operations/enablepapertrail.py +17 -0
  86. plex_api/models/operations/getavailableclients.py +58 -0
  87. plex_api/models/operations/getbutlertasks.py +52 -0
  88. plex_api/models/operations/getdevices.py +53 -0
  89. plex_api/models/operations/getfilehash.py +28 -0
  90. plex_api/models/operations/getglobalhubs.py +100 -0
  91. plex_api/models/operations/getlibraries.py +79 -0
  92. plex_api/models/operations/getlibrary.py +153 -0
  93. plex_api/models/operations/getlibraryhubs.py +205 -0
  94. plex_api/models/operations/getlibraryitems.py +227 -0
  95. plex_api/models/operations/getmetadata.py +264 -0
  96. plex_api/models/operations/getmetadatachildren.py +115 -0
  97. plex_api/models/operations/getmyplexaccount.py +50 -0
  98. plex_api/models/operations/getondeck.py +166 -0
  99. plex_api/models/operations/getpin.py +86 -0
  100. plex_api/models/operations/getplaylist.py +70 -0
  101. plex_api/models/operations/getplaylistcontents.py +178 -0
  102. plex_api/models/operations/getplaylists.py +85 -0
  103. plex_api/models/operations/getrecentlyadded.py +166 -0
  104. plex_api/models/operations/getresizedphoto.py +48 -0
  105. plex_api/models/operations/getsearchresults.py +182 -0
  106. plex_api/models/operations/getserveractivities.py +63 -0
  107. plex_api/models/operations/getservercapabilities.py +99 -0
  108. plex_api/models/operations/getserveridentity.py +42 -0
  109. plex_api/models/operations/getserverlist.py +53 -0
  110. plex_api/models/operations/getserverpreferences.py +57 -0
  111. plex_api/models/operations/getsessionhistory.py +67 -0
  112. plex_api/models/operations/getsessions.py +185 -0
  113. plex_api/models/operations/getsourceconnectioninformation.py +25 -0
  114. plex_api/models/operations/getstatistics.py +93 -0
  115. plex_api/models/operations/gettimeline.py +50 -0
  116. plex_api/models/operations/gettoken.py +35 -0
  117. plex_api/models/operations/gettranscodesessions.py +71 -0
  118. plex_api/models/operations/gettransienttoken.py +36 -0
  119. plex_api/models/operations/getupdatestatus.py +57 -0
  120. plex_api/models/operations/logline.py +50 -0
  121. plex_api/models/operations/logmultiline.py +17 -0
  122. plex_api/models/operations/markplayed.py +25 -0
  123. plex_api/models/operations/markunplayed.py +25 -0
  124. plex_api/models/operations/performsearch.py +30 -0
  125. plex_api/models/operations/performvoicesearch.py +30 -0
  126. plex_api/models/operations/refreshlibrary.py +25 -0
  127. plex_api/models/operations/searchlibrary.py +96 -0
  128. plex_api/models/operations/startalltasks.py +17 -0
  129. plex_api/models/operations/starttask.py +43 -0
  130. plex_api/models/operations/startuniversaltranscode.py +56 -0
  131. plex_api/models/operations/stopalltasks.py +17 -0
  132. plex_api/models/operations/stoptask.py +43 -0
  133. plex_api/models/operations/stoptranscodesession.py +25 -0
  134. plex_api/models/operations/updateplaylist.py +30 -0
  135. plex_api/models/operations/updateplayprogress.py +29 -0
  136. plex_api/models/operations/uploadplaylist.py +47 -0
  137. plex_api/playlists.py +629 -0
  138. plex_api/plex.py +154 -0
  139. plex_api/sdk.py +180 -0
  140. plex_api/sdkconfiguration.py +52 -0
  141. plex_api/search.py +232 -0
  142. plex_api/server.py +525 -0
  143. plex_api/sessions.py +272 -0
  144. plex_api/statistics.py +86 -0
  145. plex_api/updater.py +212 -0
  146. plex_api/utils/__init__.py +4 -0
  147. plex_api/utils/retries.py +120 -0
  148. plex_api/utils/utils.py +898 -0
  149. plex_api/video.py +136 -0
  150. plex_api_client-0.6.1.dist-info/LICENSE.md +21 -0
  151. plex_api_client-0.6.1.dist-info/METADATA +397 -0
  152. plex_api_client-0.6.1.dist-info/RECORD +154 -0
  153. plex_api_client-0.6.1.dist-info/WHEEL +5 -0
  154. plex_api_client-0.6.1.dist-info/top_level.txt +1 -0
@@ -0,0 +1,74 @@
1
+ """Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT."""
2
+
3
+ from __future__ import annotations
4
+ import dataclasses
5
+ import requests as requests_http
6
+ from dataclasses_json import Undefined, dataclass_json
7
+ from plex_api import utils
8
+ from typing import List, Optional
9
+
10
+
11
+ @dataclasses.dataclass
12
+ class AddPlaylistContentsRequest:
13
+ playlist_id: float = dataclasses.field(metadata={'path_param': { 'field_name': 'playlistID', 'style': 'simple', 'explode': False }})
14
+ r"""the ID of the playlist"""
15
+ uri: str = dataclasses.field(metadata={'query_param': { 'field_name': 'uri', 'style': 'form', 'explode': True }})
16
+ r"""the content URI for the playlist"""
17
+ play_queue_id: Optional[float] = dataclasses.field(default=None, metadata={'query_param': { 'field_name': 'playQueueID', 'style': 'form', 'explode': True }})
18
+ r"""the play queue to add to a playlist"""
19
+
20
+
21
+
22
+
23
+ @dataclass_json(undefined=Undefined.EXCLUDE)
24
+ @dataclasses.dataclass
25
+ class AddPlaylistContentsMetadata:
26
+ rating_key: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('ratingKey'), 'exclude': lambda f: f is None }})
27
+ key: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('key'), 'exclude': lambda f: f is None }})
28
+ guid: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('guid'), 'exclude': lambda f: f is None }})
29
+ type: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('type'), 'exclude': lambda f: f is None }})
30
+ title: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('title'), 'exclude': lambda f: f is None }})
31
+ summary: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('summary'), 'exclude': lambda f: f is None }})
32
+ smart: Optional[bool] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('smart'), 'exclude': lambda f: f is None }})
33
+ playlist_type: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('playlistType'), 'exclude': lambda f: f is None }})
34
+ composite: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('composite'), 'exclude': lambda f: f is None }})
35
+ duration: Optional[int] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('duration'), 'exclude': lambda f: f is None }})
36
+ leaf_count: Optional[int] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('leafCount'), 'exclude': lambda f: f is None }})
37
+ added_at: Optional[int] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('addedAt'), 'exclude': lambda f: f is None }})
38
+ updated_at: Optional[int] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('updatedAt'), 'exclude': lambda f: f is None }})
39
+
40
+
41
+
42
+
43
+ @dataclass_json(undefined=Undefined.EXCLUDE)
44
+ @dataclasses.dataclass
45
+ class AddPlaylistContentsMediaContainer:
46
+ size: Optional[int] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('size'), 'exclude': lambda f: f is None }})
47
+ leaf_count_added: Optional[int] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('leafCountAdded'), 'exclude': lambda f: f is None }})
48
+ leaf_count_requested: Optional[int] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('leafCountRequested'), 'exclude': lambda f: f is None }})
49
+ metadata: Optional[List[AddPlaylistContentsMetadata]] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('Metadata'), 'exclude': lambda f: f is None }})
50
+
51
+
52
+
53
+
54
+ @dataclass_json(undefined=Undefined.EXCLUDE)
55
+ @dataclasses.dataclass
56
+ class AddPlaylistContentsResponseBody:
57
+ r"""Playlist Updated"""
58
+ media_container: Optional[AddPlaylistContentsMediaContainer] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('MediaContainer'), 'exclude': lambda f: f is None }})
59
+
60
+
61
+
62
+
63
+ @dataclasses.dataclass
64
+ class AddPlaylistContentsResponse:
65
+ content_type: str = dataclasses.field()
66
+ r"""HTTP response content type for this operation"""
67
+ status_code: int = dataclasses.field()
68
+ r"""HTTP response status code for this operation"""
69
+ raw_response: requests_http.Response = dataclasses.field()
70
+ r"""Raw HTTP response; suitable for custom response parsing"""
71
+ object: Optional[AddPlaylistContentsResponseBody] = dataclasses.field(default=None)
72
+ r"""Playlist Updated"""
73
+
74
+
@@ -0,0 +1,39 @@
1
+ """Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT."""
2
+
3
+ from __future__ import annotations
4
+ import dataclasses
5
+ import requests as requests_http
6
+ from enum import Enum
7
+ from typing import Optional
8
+
9
+ class Tonight(int, Enum):
10
+ r"""Indicate that you want the update to run during the next Butler execution. Omitting this or setting it to false indicates that the update should install"""
11
+ ZERO = 0
12
+ ONE = 1
13
+
14
+ class Skip(int, Enum):
15
+ r"""Indicate that the latest version should be marked as skipped. The <Release> entry for this version will have the `state` set to `skipped`."""
16
+ ZERO = 0
17
+ ONE = 1
18
+
19
+
20
+ @dataclasses.dataclass
21
+ class ApplyUpdatesRequest:
22
+ tonight: Optional[Tonight] = dataclasses.field(default=None, metadata={'query_param': { 'field_name': 'tonight', 'style': 'form', 'explode': True }})
23
+ r"""Indicate that you want the update to run during the next Butler execution. Omitting this or setting it to false indicates that the update should install"""
24
+ skip: Optional[Skip] = dataclasses.field(default=None, metadata={'query_param': { 'field_name': 'skip', 'style': 'form', 'explode': True }})
25
+ r"""Indicate that the latest version should be marked as skipped. The <Release> entry for this version will have the `state` set to `skipped`."""
26
+
27
+
28
+
29
+
30
+ @dataclasses.dataclass
31
+ class ApplyUpdatesResponse:
32
+ content_type: str = dataclasses.field()
33
+ r"""HTTP response content type for this operation"""
34
+ status_code: int = dataclasses.field()
35
+ r"""HTTP response status code for this operation"""
36
+ raw_response: requests_http.Response = dataclasses.field()
37
+ r"""Raw HTTP response; suitable for custom response parsing"""
38
+
39
+
@@ -0,0 +1,25 @@
1
+ """Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT."""
2
+
3
+ from __future__ import annotations
4
+ import dataclasses
5
+ import requests as requests_http
6
+
7
+
8
+ @dataclasses.dataclass
9
+ class CancelServerActivitiesRequest:
10
+ activity_uuid: str = dataclasses.field(metadata={'path_param': { 'field_name': 'activityUUID', 'style': 'simple', 'explode': False }})
11
+ r"""The UUID of the activity to cancel."""
12
+
13
+
14
+
15
+
16
+ @dataclasses.dataclass
17
+ class CancelServerActivitiesResponse:
18
+ content_type: str = dataclasses.field()
19
+ r"""HTTP response content type for this operation"""
20
+ status_code: int = dataclasses.field()
21
+ r"""HTTP response status code for this operation"""
22
+ raw_response: requests_http.Response = dataclasses.field()
23
+ r"""Raw HTTP response; suitable for custom response parsing"""
24
+
25
+
@@ -0,0 +1,32 @@
1
+ """Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT."""
2
+
3
+ from __future__ import annotations
4
+ import dataclasses
5
+ import requests as requests_http
6
+ from enum import Enum
7
+ from typing import Optional
8
+
9
+ class Download(int, Enum):
10
+ r"""Indicate that you want to start download any updates found."""
11
+ ZERO = 0
12
+ ONE = 1
13
+
14
+
15
+ @dataclasses.dataclass
16
+ class CheckForUpdatesRequest:
17
+ download: Optional[Download] = dataclasses.field(default=None, metadata={'query_param': { 'field_name': 'download', 'style': 'form', 'explode': True }})
18
+ r"""Indicate that you want to start download any updates found."""
19
+
20
+
21
+
22
+
23
+ @dataclasses.dataclass
24
+ class CheckForUpdatesResponse:
25
+ content_type: str = dataclasses.field()
26
+ r"""HTTP response content type for this operation"""
27
+ status_code: int = dataclasses.field()
28
+ r"""HTTP response status code for this operation"""
29
+ raw_response: requests_http.Response = dataclasses.field()
30
+ r"""Raw HTTP response; suitable for custom response parsing"""
31
+
32
+
@@ -0,0 +1,25 @@
1
+ """Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT."""
2
+
3
+ from __future__ import annotations
4
+ import dataclasses
5
+ import requests as requests_http
6
+
7
+
8
+ @dataclasses.dataclass
9
+ class ClearPlaylistContentsRequest:
10
+ playlist_id: float = dataclasses.field(metadata={'path_param': { 'field_name': 'playlistID', 'style': 'simple', 'explode': False }})
11
+ r"""the ID of the playlist"""
12
+
13
+
14
+
15
+
16
+ @dataclasses.dataclass
17
+ class ClearPlaylistContentsResponse:
18
+ content_type: str = dataclasses.field()
19
+ r"""HTTP response content type for this operation"""
20
+ status_code: int = dataclasses.field()
21
+ r"""HTTP response status code for this operation"""
22
+ raw_response: requests_http.Response = dataclasses.field()
23
+ r"""Raw HTTP response; suitable for custom response parsing"""
24
+
25
+
@@ -0,0 +1,91 @@
1
+ """Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT."""
2
+
3
+ from __future__ import annotations
4
+ import dataclasses
5
+ import requests as requests_http
6
+ from dataclasses_json import Undefined, dataclass_json
7
+ from enum import Enum
8
+ from plex_api import utils
9
+ from typing import List, Optional
10
+
11
+ class QueryParamType(str, Enum):
12
+ r"""type of playlist to create"""
13
+ AUDIO = 'audio'
14
+ VIDEO = 'video'
15
+ PHOTO = 'photo'
16
+
17
+ class Smart(int, Enum):
18
+ r"""whether the playlist is smart or not"""
19
+ ZERO = 0
20
+ ONE = 1
21
+
22
+
23
+ @dataclasses.dataclass
24
+ class CreatePlaylistRequest:
25
+ title: str = dataclasses.field(metadata={'query_param': { 'field_name': 'title', 'style': 'form', 'explode': True }})
26
+ r"""name of the playlist"""
27
+ type: QueryParamType = dataclasses.field(metadata={'query_param': { 'field_name': 'type', 'style': 'form', 'explode': True }})
28
+ r"""type of playlist to create"""
29
+ smart: Smart = dataclasses.field(metadata={'query_param': { 'field_name': 'smart', 'style': 'form', 'explode': True }})
30
+ r"""whether the playlist is smart or not"""
31
+ uri: str = dataclasses.field(metadata={'query_param': { 'field_name': 'uri', 'style': 'form', 'explode': True }})
32
+ r"""the content URI for the playlist"""
33
+ play_queue_id: Optional[float] = dataclasses.field(default=None, metadata={'query_param': { 'field_name': 'playQueueID', 'style': 'form', 'explode': True }})
34
+ r"""the play queue to copy to a playlist"""
35
+
36
+
37
+
38
+
39
+ @dataclass_json(undefined=Undefined.EXCLUDE)
40
+ @dataclasses.dataclass
41
+ class CreatePlaylistMetadata:
42
+ rating_key: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('ratingKey'), 'exclude': lambda f: f is None }})
43
+ key: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('key'), 'exclude': lambda f: f is None }})
44
+ guid: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('guid'), 'exclude': lambda f: f is None }})
45
+ type: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('type'), 'exclude': lambda f: f is None }})
46
+ title: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('title'), 'exclude': lambda f: f is None }})
47
+ summary: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('summary'), 'exclude': lambda f: f is None }})
48
+ smart: Optional[bool] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('smart'), 'exclude': lambda f: f is None }})
49
+ playlist_type: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('playlistType'), 'exclude': lambda f: f is None }})
50
+ icon: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('icon'), 'exclude': lambda f: f is None }})
51
+ view_count: Optional[int] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('viewCount'), 'exclude': lambda f: f is None }})
52
+ last_viewed_at: Optional[int] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('lastViewedAt'), 'exclude': lambda f: f is None }})
53
+ leaf_count: Optional[int] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('leafCount'), 'exclude': lambda f: f is None }})
54
+ added_at: Optional[int] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('addedAt'), 'exclude': lambda f: f is None }})
55
+ updated_at: Optional[int] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('updatedAt'), 'exclude': lambda f: f is None }})
56
+ composite: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('composite'), 'exclude': lambda f: f is None }})
57
+ duration: Optional[int] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('duration'), 'exclude': lambda f: f is None }})
58
+
59
+
60
+
61
+
62
+ @dataclass_json(undefined=Undefined.EXCLUDE)
63
+ @dataclasses.dataclass
64
+ class CreatePlaylistMediaContainer:
65
+ size: Optional[int] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('size'), 'exclude': lambda f: f is None }})
66
+ metadata: Optional[List[CreatePlaylistMetadata]] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('Metadata'), 'exclude': lambda f: f is None }})
67
+
68
+
69
+
70
+
71
+ @dataclass_json(undefined=Undefined.EXCLUDE)
72
+ @dataclasses.dataclass
73
+ class CreatePlaylistResponseBody:
74
+ r"""returns all playlists"""
75
+ media_container: Optional[CreatePlaylistMediaContainer] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('MediaContainer'), 'exclude': lambda f: f is None }})
76
+
77
+
78
+
79
+
80
+ @dataclasses.dataclass
81
+ class CreatePlaylistResponse:
82
+ content_type: str = dataclasses.field()
83
+ r"""HTTP response content type for this operation"""
84
+ status_code: int = dataclasses.field()
85
+ r"""HTTP response status code for this operation"""
86
+ raw_response: requests_http.Response = dataclasses.field()
87
+ r"""Raw HTTP response; suitable for custom response parsing"""
88
+ object: Optional[CreatePlaylistResponseBody] = dataclasses.field(default=None)
89
+ r"""returns all playlists"""
90
+
91
+
@@ -0,0 +1,25 @@
1
+ """Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT."""
2
+
3
+ from __future__ import annotations
4
+ import dataclasses
5
+ import requests as requests_http
6
+
7
+
8
+ @dataclasses.dataclass
9
+ class DeleteLibraryRequest:
10
+ section_id: float = dataclasses.field(metadata={'path_param': { 'field_name': 'sectionId', 'style': 'simple', 'explode': False }})
11
+ r"""the Id of the library to query"""
12
+
13
+
14
+
15
+
16
+ @dataclasses.dataclass
17
+ class DeleteLibraryResponse:
18
+ content_type: str = dataclasses.field()
19
+ r"""HTTP response content type for this operation"""
20
+ status_code: int = dataclasses.field()
21
+ r"""HTTP response status code for this operation"""
22
+ raw_response: requests_http.Response = dataclasses.field()
23
+ r"""Raw HTTP response; suitable for custom response parsing"""
24
+
25
+
@@ -0,0 +1,25 @@
1
+ """Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT."""
2
+
3
+ from __future__ import annotations
4
+ import dataclasses
5
+ import requests as requests_http
6
+
7
+
8
+ @dataclasses.dataclass
9
+ class DeletePlaylistRequest:
10
+ playlist_id: float = dataclasses.field(metadata={'path_param': { 'field_name': 'playlistID', 'style': 'simple', 'explode': False }})
11
+ r"""the ID of the playlist"""
12
+
13
+
14
+
15
+
16
+ @dataclasses.dataclass
17
+ class DeletePlaylistResponse:
18
+ content_type: str = dataclasses.field()
19
+ r"""HTTP response content type for this operation"""
20
+ status_code: int = dataclasses.field()
21
+ r"""HTTP response status code for this operation"""
22
+ raw_response: requests_http.Response = dataclasses.field()
23
+ r"""Raw HTTP response; suitable for custom response parsing"""
24
+
25
+
@@ -0,0 +1,17 @@
1
+ """Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT."""
2
+
3
+ from __future__ import annotations
4
+ import dataclasses
5
+ import requests as requests_http
6
+
7
+
8
+ @dataclasses.dataclass
9
+ class EnablePaperTrailResponse:
10
+ content_type: str = dataclasses.field()
11
+ r"""HTTP response content type for this operation"""
12
+ status_code: int = dataclasses.field()
13
+ r"""HTTP response status code for this operation"""
14
+ raw_response: requests_http.Response = dataclasses.field()
15
+ r"""Raw HTTP response; suitable for custom response parsing"""
16
+
17
+
@@ -0,0 +1,58 @@
1
+ """Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT."""
2
+
3
+ from __future__ import annotations
4
+ import dataclasses
5
+ import requests as requests_http
6
+ from dataclasses_json import Undefined, dataclass_json
7
+ from plex_api import utils
8
+ from typing import List, Optional
9
+
10
+
11
+ @dataclass_json(undefined=Undefined.EXCLUDE)
12
+ @dataclasses.dataclass
13
+ class Server:
14
+ name: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('name'), 'exclude': lambda f: f is None }})
15
+ host: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('host'), 'exclude': lambda f: f is None }})
16
+ address: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('address'), 'exclude': lambda f: f is None }})
17
+ port: Optional[float] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('port'), 'exclude': lambda f: f is None }})
18
+ machine_identifier: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('machineIdentifier'), 'exclude': lambda f: f is None }})
19
+ version: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('version'), 'exclude': lambda f: f is None }})
20
+ protocol: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('protocol'), 'exclude': lambda f: f is None }})
21
+ product: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('product'), 'exclude': lambda f: f is None }})
22
+ device_class: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('deviceClass'), 'exclude': lambda f: f is None }})
23
+ protocol_version: Optional[float] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('protocolVersion'), 'exclude': lambda f: f is None }})
24
+ protocol_capabilities: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('protocolCapabilities'), 'exclude': lambda f: f is None }})
25
+
26
+
27
+
28
+
29
+ @dataclass_json(undefined=Undefined.EXCLUDE)
30
+ @dataclasses.dataclass
31
+ class GetAvailableClientsMediaContainer:
32
+ size: Optional[float] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('size'), 'exclude': lambda f: f is None }})
33
+ server: Optional[List[Server]] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('Server'), 'exclude': lambda f: f is None }})
34
+
35
+
36
+
37
+
38
+ @dataclass_json(undefined=Undefined.EXCLUDE)
39
+ @dataclasses.dataclass
40
+ class GetAvailableClientsResponseBody:
41
+ r"""Available Clients"""
42
+ media_container: Optional[GetAvailableClientsMediaContainer] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('MediaContainer'), 'exclude': lambda f: f is None }})
43
+
44
+
45
+
46
+
47
+ @dataclasses.dataclass
48
+ class GetAvailableClientsResponse:
49
+ content_type: str = dataclasses.field()
50
+ r"""HTTP response content type for this operation"""
51
+ status_code: int = dataclasses.field()
52
+ r"""HTTP response status code for this operation"""
53
+ raw_response: requests_http.Response = dataclasses.field()
54
+ r"""Raw HTTP response; suitable for custom response parsing"""
55
+ object: Optional[GetAvailableClientsResponseBody] = dataclasses.field(default=None)
56
+ r"""Available Clients"""
57
+
58
+
@@ -0,0 +1,52 @@
1
+ """Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT."""
2
+
3
+ from __future__ import annotations
4
+ import dataclasses
5
+ import requests as requests_http
6
+ from dataclasses_json import Undefined, dataclass_json
7
+ from plex_api import utils
8
+ from typing import List, Optional
9
+
10
+
11
+ @dataclass_json(undefined=Undefined.EXCLUDE)
12
+ @dataclasses.dataclass
13
+ class ButlerTask:
14
+ name: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('name'), 'exclude': lambda f: f is None }})
15
+ interval: Optional[float] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('interval'), 'exclude': lambda f: f is None }})
16
+ schedule_randomized: Optional[bool] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('scheduleRandomized'), 'exclude': lambda f: f is None }})
17
+ enabled: Optional[bool] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('enabled'), 'exclude': lambda f: f is None }})
18
+ title: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('title'), 'exclude': lambda f: f is None }})
19
+ description: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('description'), 'exclude': lambda f: f is None }})
20
+
21
+
22
+
23
+
24
+ @dataclass_json(undefined=Undefined.EXCLUDE)
25
+ @dataclasses.dataclass
26
+ class ButlerTasks:
27
+ butler_task: Optional[List[ButlerTask]] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('ButlerTask'), 'exclude': lambda f: f is None }})
28
+
29
+
30
+
31
+
32
+ @dataclass_json(undefined=Undefined.EXCLUDE)
33
+ @dataclasses.dataclass
34
+ class GetButlerTasksResponseBody:
35
+ r"""All butler tasks"""
36
+ butler_tasks: Optional[ButlerTasks] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('ButlerTasks'), 'exclude': lambda f: f is None }})
37
+
38
+
39
+
40
+
41
+ @dataclasses.dataclass
42
+ class GetButlerTasksResponse:
43
+ content_type: str = dataclasses.field()
44
+ r"""HTTP response content type for this operation"""
45
+ status_code: int = dataclasses.field()
46
+ r"""HTTP response status code for this operation"""
47
+ raw_response: requests_http.Response = dataclasses.field()
48
+ r"""Raw HTTP response; suitable for custom response parsing"""
49
+ object: Optional[GetButlerTasksResponseBody] = dataclasses.field(default=None)
50
+ r"""All butler tasks"""
51
+
52
+
@@ -0,0 +1,53 @@
1
+ """Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT."""
2
+
3
+ from __future__ import annotations
4
+ import dataclasses
5
+ import requests as requests_http
6
+ from dataclasses_json import Undefined, dataclass_json
7
+ from plex_api import utils
8
+ from typing import List, Optional
9
+
10
+
11
+ @dataclass_json(undefined=Undefined.EXCLUDE)
12
+ @dataclasses.dataclass
13
+ class Device:
14
+ id: Optional[float] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('id'), 'exclude': lambda f: f is None }})
15
+ name: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('name'), 'exclude': lambda f: f is None }})
16
+ platform: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('platform'), 'exclude': lambda f: f is None }})
17
+ client_identifier: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('clientIdentifier'), 'exclude': lambda f: f is None }})
18
+ created_at: Optional[float] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('createdAt'), 'exclude': lambda f: f is None }})
19
+
20
+
21
+
22
+
23
+ @dataclass_json(undefined=Undefined.EXCLUDE)
24
+ @dataclasses.dataclass
25
+ class GetDevicesMediaContainer:
26
+ size: Optional[float] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('size'), 'exclude': lambda f: f is None }})
27
+ identifier: Optional[str] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('identifier'), 'exclude': lambda f: f is None }})
28
+ device: Optional[List[Device]] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('Device'), 'exclude': lambda f: f is None }})
29
+
30
+
31
+
32
+
33
+ @dataclass_json(undefined=Undefined.EXCLUDE)
34
+ @dataclasses.dataclass
35
+ class GetDevicesResponseBody:
36
+ r"""Devices"""
37
+ media_container: Optional[GetDevicesMediaContainer] = dataclasses.field(default=None, metadata={'dataclasses_json': { 'letter_case': utils.get_field_name('MediaContainer'), 'exclude': lambda f: f is None }})
38
+
39
+
40
+
41
+
42
+ @dataclasses.dataclass
43
+ class GetDevicesResponse:
44
+ content_type: str = dataclasses.field()
45
+ r"""HTTP response content type for this operation"""
46
+ status_code: int = dataclasses.field()
47
+ r"""HTTP response status code for this operation"""
48
+ raw_response: requests_http.Response = dataclasses.field()
49
+ r"""Raw HTTP response; suitable for custom response parsing"""
50
+ object: Optional[GetDevicesResponseBody] = dataclasses.field(default=None)
51
+ r"""Devices"""
52
+
53
+
@@ -0,0 +1,28 @@
1
+ """Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT."""
2
+
3
+ from __future__ import annotations
4
+ import dataclasses
5
+ import requests as requests_http
6
+ from typing import Optional
7
+
8
+
9
+ @dataclasses.dataclass
10
+ class GetFileHashRequest:
11
+ url: str = dataclasses.field(metadata={'query_param': { 'field_name': 'url', 'style': 'form', 'explode': True }})
12
+ r"""This is the path to the local file, must be prefixed by `file://`"""
13
+ type: Optional[float] = dataclasses.field(default=None, metadata={'query_param': { 'field_name': 'type', 'style': 'form', 'explode': True }})
14
+ r"""Item type"""
15
+
16
+
17
+
18
+
19
+ @dataclasses.dataclass
20
+ class GetFileHashResponse:
21
+ content_type: str = dataclasses.field()
22
+ r"""HTTP response content type for this operation"""
23
+ status_code: int = dataclasses.field()
24
+ r"""HTTP response status code for this operation"""
25
+ raw_response: requests_http.Response = dataclasses.field()
26
+ r"""Raw HTTP response; suitable for custom response parsing"""
27
+
28
+