plexflow 0.0.64__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 (256) hide show
  1. plexflow/__init__.py +0 -0
  2. plexflow/__main__.py +15 -0
  3. plexflow/core/.DS_Store +0 -0
  4. plexflow/core/__init__.py +0 -0
  5. plexflow/core/context/__init__.py +0 -0
  6. plexflow/core/context/metadata/__init__.py +0 -0
  7. plexflow/core/context/metadata/context.py +32 -0
  8. plexflow/core/context/metadata/tmdb/__init__.py +0 -0
  9. plexflow/core/context/metadata/tmdb/context.py +45 -0
  10. plexflow/core/context/partial_context.py +46 -0
  11. plexflow/core/context/partials/__init__.py +8 -0
  12. plexflow/core/context/partials/cache.py +16 -0
  13. plexflow/core/context/partials/context.py +12 -0
  14. plexflow/core/context/partials/ids.py +37 -0
  15. plexflow/core/context/partials/movie.py +115 -0
  16. plexflow/core/context/partials/tgx_batch.py +33 -0
  17. plexflow/core/context/partials/tgx_context.py +34 -0
  18. plexflow/core/context/partials/torrents.py +23 -0
  19. plexflow/core/context/partials/watchlist.py +35 -0
  20. plexflow/core/context/plexflow_context.py +29 -0
  21. plexflow/core/context/plexflow_property.py +36 -0
  22. plexflow/core/context/root/__init__.py +0 -0
  23. plexflow/core/context/root/context.py +25 -0
  24. plexflow/core/context/select/__init__.py +0 -0
  25. plexflow/core/context/select/context.py +45 -0
  26. plexflow/core/context/torrent/__init__.py +0 -0
  27. plexflow/core/context/torrent/context.py +43 -0
  28. plexflow/core/context/torrent/tpb/__init__.py +0 -0
  29. plexflow/core/context/torrent/tpb/context.py +45 -0
  30. plexflow/core/context/torrent/yts/__init__.py +0 -0
  31. plexflow/core/context/torrent/yts/context.py +45 -0
  32. plexflow/core/context/watchlist/__init__.py +0 -0
  33. plexflow/core/context/watchlist/context.py +46 -0
  34. plexflow/core/downloads/__init__.py +0 -0
  35. plexflow/core/downloads/candidates/__init__.py +0 -0
  36. plexflow/core/downloads/candidates/download_candidate.py +210 -0
  37. plexflow/core/downloads/candidates/filtered.py +51 -0
  38. plexflow/core/downloads/candidates/utils.py +39 -0
  39. plexflow/core/env/__init__.py +0 -0
  40. plexflow/core/env/env.py +31 -0
  41. plexflow/core/genai/__init__.py +0 -0
  42. plexflow/core/genai/bot.py +9 -0
  43. plexflow/core/genai/plexa.py +54 -0
  44. plexflow/core/genai/torrent/imdb_verify.py +65 -0
  45. plexflow/core/genai/torrent/movie.py +25 -0
  46. plexflow/core/genai/utils/__init__.py +0 -0
  47. plexflow/core/genai/utils/loader.py +5 -0
  48. plexflow/core/metadata/__init__.py +0 -0
  49. plexflow/core/metadata/auto/__init__.py +0 -0
  50. plexflow/core/metadata/auto/auto_meta.py +40 -0
  51. plexflow/core/metadata/auto/auto_providers/__init__.py +0 -0
  52. plexflow/core/metadata/auto/auto_providers/auto/__init__.py +0 -0
  53. plexflow/core/metadata/auto/auto_providers/auto/episode.py +49 -0
  54. plexflow/core/metadata/auto/auto_providers/auto/item.py +55 -0
  55. plexflow/core/metadata/auto/auto_providers/auto/movie.py +13 -0
  56. plexflow/core/metadata/auto/auto_providers/auto/season.py +43 -0
  57. plexflow/core/metadata/auto/auto_providers/auto/show.py +26 -0
  58. plexflow/core/metadata/auto/auto_providers/imdb/__init__.py +0 -0
  59. plexflow/core/metadata/auto/auto_providers/imdb/movie.py +36 -0
  60. plexflow/core/metadata/auto/auto_providers/imdb/show.py +45 -0
  61. plexflow/core/metadata/auto/auto_providers/moviemeter/__init__.py +0 -0
  62. plexflow/core/metadata/auto/auto_providers/moviemeter/movie.py +40 -0
  63. plexflow/core/metadata/auto/auto_providers/plex/__init__.py +0 -0
  64. plexflow/core/metadata/auto/auto_providers/plex/movie.py +39 -0
  65. plexflow/core/metadata/auto/auto_providers/tmdb/__init__.py +0 -0
  66. plexflow/core/metadata/auto/auto_providers/tmdb/episode.py +30 -0
  67. plexflow/core/metadata/auto/auto_providers/tmdb/movie.py +36 -0
  68. plexflow/core/metadata/auto/auto_providers/tmdb/season.py +23 -0
  69. plexflow/core/metadata/auto/auto_providers/tmdb/show.py +41 -0
  70. plexflow/core/metadata/auto/auto_providers/tmdb.py +92 -0
  71. plexflow/core/metadata/auto/auto_providers/tvdb/__init__.py +0 -0
  72. plexflow/core/metadata/auto/auto_providers/tvdb/episode.py +28 -0
  73. plexflow/core/metadata/auto/auto_providers/tvdb/movie.py +36 -0
  74. plexflow/core/metadata/auto/auto_providers/tvdb/season.py +25 -0
  75. plexflow/core/metadata/auto/auto_providers/tvdb/show.py +41 -0
  76. plexflow/core/metadata/providers/__init__.py +0 -0
  77. plexflow/core/metadata/providers/imdb/__init__.py +0 -0
  78. plexflow/core/metadata/providers/imdb/datatypes.py +53 -0
  79. plexflow/core/metadata/providers/imdb/imdb.py +112 -0
  80. plexflow/core/metadata/providers/moviemeter/__init__.py +0 -0
  81. plexflow/core/metadata/providers/moviemeter/datatypes.py +111 -0
  82. plexflow/core/metadata/providers/moviemeter/moviemeter.py +42 -0
  83. plexflow/core/metadata/providers/plex/__init__.py +0 -0
  84. plexflow/core/metadata/providers/plex/datatypes.py +693 -0
  85. plexflow/core/metadata/providers/plex/plex.py +167 -0
  86. plexflow/core/metadata/providers/tmdb/__init__.py +0 -0
  87. plexflow/core/metadata/providers/tmdb/datatypes.py +460 -0
  88. plexflow/core/metadata/providers/tmdb/tmdb.py +85 -0
  89. plexflow/core/metadata/providers/tvdb/__init__.py +0 -0
  90. plexflow/core/metadata/providers/tvdb/datatypes.py +257 -0
  91. plexflow/core/metadata/providers/tvdb/tv_datatypes.py +554 -0
  92. plexflow/core/metadata/providers/tvdb/tvdb.py +65 -0
  93. plexflow/core/metadata/providers/universal/__init__.py +0 -0
  94. plexflow/core/metadata/providers/universal/movie.py +130 -0
  95. plexflow/core/metadata/providers/universal/old.py +192 -0
  96. plexflow/core/metadata/providers/universal/show.py +107 -0
  97. plexflow/core/plex/__init__.py +0 -0
  98. plexflow/core/plex/api/context/authorized.py +15 -0
  99. plexflow/core/plex/api/context/discover.py +14 -0
  100. plexflow/core/plex/api/context/library.py +14 -0
  101. plexflow/core/plex/discover/__init__.py +0 -0
  102. plexflow/core/plex/discover/activity.py +448 -0
  103. plexflow/core/plex/discover/comment.py +89 -0
  104. plexflow/core/plex/discover/feed.py +11 -0
  105. plexflow/core/plex/hooks/__init__.py +0 -0
  106. plexflow/core/plex/hooks/plex_authorized.py +60 -0
  107. plexflow/core/plex/hooks/plexflow_database.py +6 -0
  108. plexflow/core/plex/library/__init__.py +0 -0
  109. plexflow/core/plex/library/library.py +103 -0
  110. plexflow/core/plex/token/__init__.py +0 -0
  111. plexflow/core/plex/token/auto_token.py +91 -0
  112. plexflow/core/plex/utils/__init__.py +0 -0
  113. plexflow/core/plex/utils/paginated.py +39 -0
  114. plexflow/core/plex/watchlist/__init__.py +0 -0
  115. plexflow/core/plex/watchlist/datatypes.py +124 -0
  116. plexflow/core/plex/watchlist/watchlist.py +23 -0
  117. plexflow/core/storage/__init__.py +0 -0
  118. plexflow/core/storage/object/__init__.py +0 -0
  119. plexflow/core/storage/object/plexflow_storage.py +143 -0
  120. plexflow/core/storage/object/redis_storage.py +169 -0
  121. plexflow/core/subtitles/__init__.py +0 -0
  122. plexflow/core/subtitles/providers/__init__.py +0 -0
  123. plexflow/core/subtitles/providers/auto_subtitles.py +48 -0
  124. plexflow/core/subtitles/providers/oss/__init__.py +0 -0
  125. plexflow/core/subtitles/providers/oss/datatypes.py +104 -0
  126. plexflow/core/subtitles/providers/oss/download.py +48 -0
  127. plexflow/core/subtitles/providers/oss/old.py +144 -0
  128. plexflow/core/subtitles/providers/oss/oss.py +400 -0
  129. plexflow/core/subtitles/providers/oss/oss_subtitle.py +32 -0
  130. plexflow/core/subtitles/providers/oss/search.py +52 -0
  131. plexflow/core/subtitles/providers/oss/unlimited_oss.py +231 -0
  132. plexflow/core/subtitles/providers/oss/utils/__init__.py +0 -0
  133. plexflow/core/subtitles/providers/oss/utils/config.py +63 -0
  134. plexflow/core/subtitles/providers/oss/utils/download_client.py +22 -0
  135. plexflow/core/subtitles/providers/oss/utils/exceptions.py +35 -0
  136. plexflow/core/subtitles/providers/oss/utils/file_utils.py +83 -0
  137. plexflow/core/subtitles/providers/oss/utils/languages.py +78 -0
  138. plexflow/core/subtitles/providers/oss/utils/response_base.py +221 -0
  139. plexflow/core/subtitles/providers/oss/utils/responses.py +176 -0
  140. plexflow/core/subtitles/providers/oss/utils/srt.py +561 -0
  141. plexflow/core/subtitles/results/__init__.py +0 -0
  142. plexflow/core/subtitles/results/subtitle.py +170 -0
  143. plexflow/core/torrents/__init__.py +0 -0
  144. plexflow/core/torrents/analyzers/analyzed_torrent.py +143 -0
  145. plexflow/core/torrents/analyzers/analyzer.py +45 -0
  146. plexflow/core/torrents/analyzers/torrentquest/analyzer.py +47 -0
  147. plexflow/core/torrents/auto/auto_providers/auto/__init__.py +0 -0
  148. plexflow/core/torrents/auto/auto_providers/auto/torrent.py +64 -0
  149. plexflow/core/torrents/auto/auto_providers/tpb/torrent.py +62 -0
  150. plexflow/core/torrents/auto/auto_torrents.py +29 -0
  151. plexflow/core/torrents/providers/__init__.py +0 -0
  152. plexflow/core/torrents/providers/ext/__init__.py +0 -0
  153. plexflow/core/torrents/providers/ext/ext.py +18 -0
  154. plexflow/core/torrents/providers/ext/utils.py +64 -0
  155. plexflow/core/torrents/providers/extratorrent/__init__.py +0 -0
  156. plexflow/core/torrents/providers/extratorrent/extratorrent.py +21 -0
  157. plexflow/core/torrents/providers/extratorrent/utils.py +66 -0
  158. plexflow/core/torrents/providers/eztv/__init__.py +0 -0
  159. plexflow/core/torrents/providers/eztv/eztv.py +47 -0
  160. plexflow/core/torrents/providers/eztv/utils.py +83 -0
  161. plexflow/core/torrents/providers/rarbg2/__init__.py +0 -0
  162. plexflow/core/torrents/providers/rarbg2/rarbg2.py +19 -0
  163. plexflow/core/torrents/providers/rarbg2/utils.py +76 -0
  164. plexflow/core/torrents/providers/snowfl/__init__.py +0 -0
  165. plexflow/core/torrents/providers/snowfl/snowfl.py +36 -0
  166. plexflow/core/torrents/providers/snowfl/utils.py +59 -0
  167. plexflow/core/torrents/providers/tgx/__init__.py +0 -0
  168. plexflow/core/torrents/providers/tgx/context.py +50 -0
  169. plexflow/core/torrents/providers/tgx/dump.py +40 -0
  170. plexflow/core/torrents/providers/tgx/tgx.py +22 -0
  171. plexflow/core/torrents/providers/tgx/utils.py +61 -0
  172. plexflow/core/torrents/providers/therarbg/__init__.py +0 -0
  173. plexflow/core/torrents/providers/therarbg/therarbg.py +17 -0
  174. plexflow/core/torrents/providers/therarbg/utils.py +61 -0
  175. plexflow/core/torrents/providers/torrentquest/__init__.py +0 -0
  176. plexflow/core/torrents/providers/torrentquest/torrentquest.py +20 -0
  177. plexflow/core/torrents/providers/torrentquest/utils.py +70 -0
  178. plexflow/core/torrents/providers/tpb/__init__.py +0 -0
  179. plexflow/core/torrents/providers/tpb/tpb.py +17 -0
  180. plexflow/core/torrents/providers/tpb/utils.py +139 -0
  181. plexflow/core/torrents/providers/yts/__init__.py +0 -0
  182. plexflow/core/torrents/providers/yts/utils.py +57 -0
  183. plexflow/core/torrents/providers/yts/yts.py +31 -0
  184. plexflow/core/torrents/results/__init__.py +0 -0
  185. plexflow/core/torrents/results/torrent.py +165 -0
  186. plexflow/core/torrents/results/universal.py +220 -0
  187. plexflow/core/torrents/results/utils.py +15 -0
  188. plexflow/events/__init__.py +0 -0
  189. plexflow/events/download/__init__.py +0 -0
  190. plexflow/events/download/torrent_events.py +96 -0
  191. plexflow/events/publish/__init__.py +0 -0
  192. plexflow/events/publish/publish.py +34 -0
  193. plexflow/logging/__init__.py +0 -0
  194. plexflow/logging/log_setup.py +8 -0
  195. plexflow/spiders/quiet_logger.py +9 -0
  196. plexflow/spiders/tgx/pipelines/dump_json_pipeline.py +30 -0
  197. plexflow/spiders/tgx/pipelines/meta_pipeline.py +13 -0
  198. plexflow/spiders/tgx/pipelines/publish_pipeline.py +14 -0
  199. plexflow/spiders/tgx/pipelines/torrent_info_pipeline.py +12 -0
  200. plexflow/spiders/tgx/pipelines/validation_pipeline.py +17 -0
  201. plexflow/spiders/tgx/settings.py +36 -0
  202. plexflow/spiders/tgx/spider.py +72 -0
  203. plexflow/utils/__init__.py +0 -0
  204. plexflow/utils/antibot/human_like_requests.py +122 -0
  205. plexflow/utils/api/__init__.py +0 -0
  206. plexflow/utils/api/context/http.py +62 -0
  207. plexflow/utils/api/rest/__init__.py +0 -0
  208. plexflow/utils/api/rest/antibot_restful.py +68 -0
  209. plexflow/utils/api/rest/restful.py +49 -0
  210. plexflow/utils/captcha/__init__.py +0 -0
  211. plexflow/utils/captcha/bypass/__init__.py +0 -0
  212. plexflow/utils/captcha/bypass/decode_audio.py +34 -0
  213. plexflow/utils/download/__init__.py +0 -0
  214. plexflow/utils/download/gz.py +26 -0
  215. plexflow/utils/filesystem/__init__.py +0 -0
  216. plexflow/utils/filesystem/search.py +129 -0
  217. plexflow/utils/gmail/__init__.py +0 -0
  218. plexflow/utils/gmail/mails.py +116 -0
  219. plexflow/utils/hooks/__init__.py +0 -0
  220. plexflow/utils/hooks/http.py +84 -0
  221. plexflow/utils/hooks/postgresql.py +93 -0
  222. plexflow/utils/hooks/redis.py +112 -0
  223. plexflow/utils/image/storage.py +36 -0
  224. plexflow/utils/imdb/__init__.py +0 -0
  225. plexflow/utils/imdb/imdb_codes.py +107 -0
  226. plexflow/utils/pubsub/consume.py +82 -0
  227. plexflow/utils/pubsub/produce.py +25 -0
  228. plexflow/utils/retry/__init__.py +0 -0
  229. plexflow/utils/retry/utils.py +38 -0
  230. plexflow/utils/strings/__init__.py +0 -0
  231. plexflow/utils/strings/filesize.py +55 -0
  232. plexflow/utils/strings/language.py +14 -0
  233. plexflow/utils/subtitle/search.py +76 -0
  234. plexflow/utils/tasks/decorators.py +78 -0
  235. plexflow/utils/tasks/k8s/task.py +70 -0
  236. plexflow/utils/thread_safe/safe_list.py +54 -0
  237. plexflow/utils/thread_safe/safe_set.py +69 -0
  238. plexflow/utils/torrent/__init__.py +0 -0
  239. plexflow/utils/torrent/analyze.py +118 -0
  240. plexflow/utils/torrent/extract/common.py +37 -0
  241. plexflow/utils/torrent/extract/ext.py +2391 -0
  242. plexflow/utils/torrent/extract/extratorrent.py +56 -0
  243. plexflow/utils/torrent/extract/kat.py +1581 -0
  244. plexflow/utils/torrent/extract/tgx.py +96 -0
  245. plexflow/utils/torrent/extract/therarbg.py +170 -0
  246. plexflow/utils/torrent/extract/torrentquest.py +171 -0
  247. plexflow/utils/torrent/files.py +36 -0
  248. plexflow/utils/torrent/hash.py +90 -0
  249. plexflow/utils/transcribe/__init__.py +0 -0
  250. plexflow/utils/transcribe/speech2text.py +40 -0
  251. plexflow/utils/video/__init__.py +0 -0
  252. plexflow/utils/video/subtitle.py +73 -0
  253. plexflow-0.0.64.dist-info/METADATA +71 -0
  254. plexflow-0.0.64.dist-info/RECORD +256 -0
  255. plexflow-0.0.64.dist-info/WHEEL +4 -0
  256. plexflow-0.0.64.dist-info/entry_points.txt +24 -0
@@ -0,0 +1,85 @@
1
+ import os
2
+ import tmdbsimple
3
+ from tmdbsimple import Find, Movies, TV, TV_Seasons
4
+ from typing import Union, List
5
+ from plexflow.core.metadata.providers.tmdb.datatypes import TmdbMovie, TmdbShow, movie_from_json, show_from_json, TmdbSeason
6
+ import json
7
+
8
+ def search_movie_by_imdb(imdb_id: str) -> Union[TmdbMovie, None]:
9
+ """
10
+ Search for a movie using its IMDB ID.
11
+
12
+ Parameters:
13
+ imdb_id (str): The IMDB ID of the movie.
14
+
15
+ Returns:
16
+ Movie: A Movie object containing all the details of the movie.
17
+ None: If the movie is not found or an error occurs.
18
+
19
+ Example:
20
+ >>> search_movie_by_imdb('tt0111161')
21
+ Movie(id=278, title='The Shawshank Redemption', overview='Framed in the 1940s for the double murder of his wife and her lover, upstanding banker Andy Dufresne begins a new life at the Shawshank prison, where he puts his accounting skills to work for an amoral warden. During his long stretch in prison, Dufresne comes to be admired by the other inmates -- including an older prisoner named Red -- for his integrity and unquenchable sense of hope.', release_date='1994-09-23', ...)
22
+ """
23
+ tmdbsimple.API_KEY = os.getenv("TMDB_API_KEY")
24
+
25
+ try:
26
+ find = Find(imdb_id)
27
+ response = find.info(external_source='imdb_id')
28
+ if response['movie_results']:
29
+ movie_id = response['movie_results'][0]['id']
30
+ movie = Movies(movie_id)
31
+ info = movie.info(append_to_response="alternative_titles")
32
+ return movie_from_json(json.dumps(info))
33
+ else:
34
+ raise ValueError(f"No movie found with IMDB ID {imdb_id}")
35
+ except Exception as e:
36
+ raise e
37
+
38
+ def search_show_by_imdb(imdb_id: str) -> Union[TmdbShow, None]:
39
+ """
40
+ Search for a TV show using its IMDB ID.
41
+
42
+ Parameters:
43
+ imdb_id (str): The IMDB ID of the TV show.
44
+
45
+ Returns:
46
+ Show: A Show object containing all the details of the TV show.
47
+ None: If the TV show is not found or an error occurs.
48
+
49
+ Example:
50
+ >>> search_show_by_imdb('tt0944947')
51
+ Show(id=1399, name='Game of Thrones', overview='Seven noble families fight for control of the mythical land of Westeros. Friction between the houses leads to full-scale war. All while a very ancient evil awakens in the farthest north. Amidst the war, a neglected military order of misfits, the Night\'s Watch, is all that stands between the realms of men and icy horrors beyond.', first_air_date='2011-04-17', ...)
52
+ """
53
+ tmdbsimple.API_KEY = os.getenv("TMDB_API_KEY")
54
+
55
+ try:
56
+ find = Find(imdb_id)
57
+ response = find.info(external_source='imdb_id')
58
+ if response['tv_results']:
59
+ show_id = response['tv_results'][0]['id']
60
+ show = TV(show_id)
61
+ info = show.info(append_to_response="alternative_titles,external_ids")
62
+ return show_from_json(json.dumps(info))
63
+ else:
64
+ raise ValueError(f"No TV show found with IMDB ID {imdb_id}")
65
+ except Exception as e:
66
+ raise e
67
+
68
+
69
+ def get_season_by_show_id(tmdb_id: int, season: int) -> TmdbSeason:
70
+ tmdbsimple.API_KEY = os.getenv("TMDB_API_KEY")
71
+
72
+ try:
73
+ tv = TV_Seasons(tv_id=tmdb_id, season_number=season)
74
+ response = tv.info()
75
+ return TmdbSeason.from_dict(response)
76
+ except Exception as e:
77
+ raise e
78
+
79
+ def get_all_seasons_by_imdb_id(imdb_id: str) -> List[TmdbSeason]:
80
+ show = search_show_by_imdb(imdb_id=imdb_id)
81
+ results = []
82
+ for season in show.seasons:
83
+ season_info = get_season_by_show_id(tmdb_id=show.id, season=season.season_number)
84
+ results.append(season_info)
85
+ return results
File without changes
@@ -0,0 +1,257 @@
1
+ from dataclasses import dataclass, field
2
+ from typing import List, Optional, Dict
3
+ from dataclasses_json import dataclass_json, Undefined
4
+ import json
5
+
6
+ @dataclass_json(undefined=Undefined.EXCLUDE)
7
+ @dataclass
8
+ class Alias:
9
+ language: Optional[str] = None
10
+ name: Optional[str] = None
11
+ _catchall: Dict[str, str] = field(default_factory=dict)
12
+
13
+ @dataclass_json(undefined=Undefined.EXCLUDE)
14
+ @dataclass
15
+ class Artwork:
16
+ height: Optional[int] = None
17
+ id: Optional[int] = None
18
+ image: Optional[str] = None
19
+ includesText: Optional[bool] = None
20
+ language: Optional[str] = None
21
+ score: Optional[int] = None
22
+ thumbnail: Optional[str] = None
23
+ type: Optional[int] = None
24
+ width: Optional[int] = None
25
+ _catchall: Dict[str, str] = field(default_factory=dict)
26
+
27
+ @dataclass_json(undefined=Undefined.EXCLUDE)
28
+ @dataclass
29
+ class Award:
30
+ id: Optional[int] = None
31
+ name: Optional[str] = None
32
+ _catchall: Dict[str, str] = field(default_factory=dict)
33
+
34
+ @dataclass_json(undefined=Undefined.EXCLUDE)
35
+ @dataclass
36
+ class Character:
37
+ aliases: Optional[List[Alias]] = None
38
+ episode: Optional[dict] = None
39
+ episodeId: Optional[int] = None
40
+ id: Optional[int] = None
41
+ image: Optional[str] = None
42
+ isFeatured: Optional[bool] = None
43
+ movieId: Optional[int] = None
44
+ movie: Optional[dict] = None
45
+ name: Optional[str] = None
46
+ nameTranslations: Optional[List[str]] = None
47
+ overviewTranslations: Optional[List[str]] = None
48
+ peopleId: Optional[int] = None
49
+ personImgURL: Optional[str] = None
50
+ peopleType: Optional[str] = None
51
+ seriesId: Optional[int] = None
52
+ series: Optional[dict] = None
53
+ sort: Optional[int] = None
54
+ tagOptions: Optional[List[dict]] = None
55
+ type: Optional[int] = None
56
+ url: Optional[str] = None
57
+ personName: Optional[str] = None
58
+ _catchall: Dict[str, str] = field(default_factory=dict)
59
+
60
+ @dataclass_json(undefined=Undefined.EXCLUDE)
61
+ @dataclass
62
+ class Company:
63
+ activeDate: Optional[str] = None
64
+ aliases: Optional[List[Alias]] = None
65
+ country: Optional[str] = None
66
+ id: Optional[int] = None
67
+ inactiveDate: Optional[str] = None
68
+ name: Optional[str] = None
69
+ nameTranslations: Optional[List[str]] = None
70
+ overviewTranslations: Optional[List[str]] = None
71
+ primaryCompanyType: Optional[int] = None
72
+ slug: Optional[str] = None
73
+ parentCompany: Optional[dict] = None
74
+ tagOptions: Optional[List[dict]] = None
75
+ _catchall: Dict[str, str] = field(default_factory=dict)
76
+
77
+ @dataclass_json(undefined=Undefined.EXCLUDE)
78
+ @dataclass
79
+ class ContentRating:
80
+ id: Optional[int] = None
81
+ name: Optional[str] = None
82
+ description: Optional[str] = None
83
+ country: Optional[str] = None
84
+ contentType: Optional[str] = None
85
+ order: Optional[int] = None
86
+ fullName: Optional[str] = None
87
+ _catchall: Dict[str, str] = field(default_factory=dict)
88
+
89
+ @dataclass_json(undefined=Undefined.EXCLUDE)
90
+ @dataclass
91
+ class FirstRelease:
92
+ country: Optional[str] = None
93
+ date: Optional[str] = None
94
+ detail: Optional[str] = None
95
+ _catchall: Dict[str, str] = field(default_factory=dict)
96
+
97
+ @dataclass_json(undefined=Undefined.EXCLUDE)
98
+ @dataclass
99
+ class Genre:
100
+ id: Optional[int] = None
101
+ name: Optional[str] = None
102
+ slug: Optional[str] = None
103
+ _catchall: Dict[str, str] = field(default_factory=dict)
104
+
105
+ @dataclass_json(undefined=Undefined.EXCLUDE)
106
+ @dataclass
107
+ class Inspiration:
108
+ id: Optional[int] = None
109
+ type: Optional[str] = None
110
+ type_name: Optional[str] = None
111
+ url: Optional[str] = None
112
+ _catchall: Dict[str, str] = field(default_factory=dict)
113
+
114
+ @dataclass_json(undefined=Undefined.EXCLUDE)
115
+ @dataclass
116
+ class ListData:
117
+ aliases: Optional[List[Alias]] = None
118
+ id: Optional[int] = None
119
+ image: Optional[str] = None
120
+ imageIsFallback: Optional[bool] = None
121
+ isOfficial: Optional[bool] = None
122
+ name: Optional[str] = None
123
+ nameTranslations: Optional[List[str]] = None
124
+ overview: Optional[str] = None
125
+ overviewTranslations: Optional[List[str]] = None
126
+ remoteIds: Optional[List[dict]] = None
127
+ tags: Optional[List[dict]] = None
128
+ score: Optional[int] = None
129
+ url: Optional[str] = None
130
+ _catchall: Dict[str, str] = field(default_factory=dict)
131
+
132
+ @dataclass_json(undefined=Undefined.EXCLUDE)
133
+ @dataclass
134
+ class ProductionCountry:
135
+ id: Optional[int] = None
136
+ country: Optional[str] = None
137
+ name: Optional[str] = None
138
+ _catchall: Dict[str, str] = field(default_factory=dict)
139
+
140
+ @dataclass_json(undefined=Undefined.EXCLUDE)
141
+ @dataclass
142
+ class Release:
143
+ country: Optional[str] = None
144
+ date: Optional[str] = None
145
+ detail: Optional[str] = None
146
+ _catchall: Dict[str, str] = field(default_factory=dict)
147
+
148
+ @dataclass_json(undefined=Undefined.EXCLUDE)
149
+ @dataclass
150
+ class RemoteId:
151
+ id: Optional[str] = None
152
+ type: Optional[int] = None
153
+ sourceName: Optional[str] = None
154
+ _catchall: Dict[str, str] = field(default_factory=dict)
155
+
156
+ @dataclass_json(undefined=Undefined.EXCLUDE)
157
+ @dataclass
158
+ class Status:
159
+ id: Optional[int] = None
160
+ keepUpdated: Optional[bool] = None
161
+ name: Optional[str] = None
162
+ recordType: Optional[str] = None
163
+ _catchall: Dict[str, str] = field(default_factory=dict)
164
+
165
+ @dataclass_json(undefined=Undefined.EXCLUDE)
166
+ @dataclass
167
+ class Studio:
168
+ id: Optional[int] = None
169
+ name: Optional[str] = None
170
+ parentStudio: Optional[int] = None
171
+ _catchall: Dict[str, str] = field(default_factory=dict)
172
+
173
+ @dataclass_json(undefined=Undefined.EXCLUDE)
174
+ @dataclass
175
+ class TagOption:
176
+ helpText: Optional[str] = None
177
+ id: Optional[int] = None
178
+ name: Optional[str] = None
179
+ tag: Optional[int] = None
180
+ tagName: Optional[str] = None
181
+ _catchall: Dict[str, str] = field(default_factory=dict)
182
+
183
+ @dataclass_json(undefined=Undefined.EXCLUDE)
184
+ @dataclass
185
+ class Trailer:
186
+ id: Optional[int] = None
187
+ language: Optional[str] = None
188
+ name: Optional[str] = None
189
+ url: Optional[str] = None
190
+ runtime: Optional[int] = None
191
+ _catchall: Dict[str, str] = field(default_factory=dict)
192
+
193
+ @dataclass_json(undefined=Undefined.EXCLUDE)
194
+ @dataclass
195
+ class Translation:
196
+ aliases: Optional[List[str]] = None
197
+ isAlias: Optional[bool] = None
198
+ isPrimary: Optional[bool] = None
199
+ language: Optional[str] = None
200
+ name: Optional[str] = None
201
+ overview: Optional[str] = None
202
+ tagline: Optional[str] = None
203
+ _catchall: Dict[str, str] = field(default_factory=dict)
204
+
205
+ @dataclass_json(undefined=Undefined.EXCLUDE)
206
+ @dataclass
207
+ class SubtitleLanguage:
208
+ language: Optional[str] = None
209
+ _catchall: Dict[str, str] = field(default_factory=dict)
210
+
211
+ @dataclass_json(undefined=Undefined.EXCLUDE)
212
+ @dataclass
213
+ class TvdbMovie:
214
+ aliases: Optional[List[Alias]] = None
215
+ artworks: Optional[List[Artwork]] = None
216
+ audioLanguages: Optional[List[str]] = None
217
+ awards: Optional[List[Award]] = None
218
+ boxOffice: Optional[str] = None
219
+ boxOfficeUS: Optional[str] = None
220
+ budget: Optional[str] = None
221
+ characters: Optional[List[Character]] = None
222
+ companies: Optional[dict] = None
223
+ contentRatings: Optional[List[ContentRating]] = None
224
+ first_release: Optional[FirstRelease] = None
225
+ genres: Optional[List[Genre]] = None
226
+ id: Optional[int] = None
227
+ image: Optional[str] = None
228
+ inspirations: Optional[List[Inspiration]] = None
229
+ lastUpdated: Optional[str] = None
230
+ lists: Optional[List[ListData]] = None
231
+ name: Optional[str] = None
232
+ nameTranslations: Optional[List[str]] = None
233
+ originalCountry: Optional[str] = None
234
+ originalLanguage: Optional[str] = None
235
+ overviewTranslations: Optional[List[str]] = None
236
+ production_countries: Optional[List[ProductionCountry]] = None
237
+ releases: Optional[List[Release]] = None
238
+ remoteIds: Optional[List[RemoteId]] = None
239
+ runtime: Optional[int] = None
240
+ score: Optional[int] = None
241
+ slug: Optional[str] = None
242
+ spoken_languages: Optional[List[str]] = None
243
+ status: Optional[Status] = None
244
+ studios: Optional[List[Studio]] = None
245
+ subtitleLanguages: Optional[List[SubtitleLanguage]] = None
246
+ tagOptions: Optional[List[TagOption]] = None
247
+ trailers: Optional[List[Trailer]] = None
248
+ translations: Optional[dict] = None
249
+ year: Optional[str] = None
250
+ _catchall: Dict[str, str] = field(default_factory=dict)
251
+
252
+
253
+ def movie_from_json(json_str: str) -> TvdbMovie:
254
+ return TvdbMovie.from_json(json_str)
255
+
256
+ def show_from_json():
257
+ pass