StreamingCommunity 2.5.2__py3-none-any.whl → 2.5.6__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.

Potentially problematic release.


This version of StreamingCommunity might be problematic. Click here for more details.

Files changed (268) hide show
  1. StreamingCommunity/Api/Player/Helper/Vixcloud/js_parser.py +143 -143
  2. StreamingCommunity/Api/Player/Helper/Vixcloud/util.py +136 -136
  3. StreamingCommunity/Api/Player/ddl.py +89 -89
  4. StreamingCommunity/Api/Player/maxstream.py +151 -151
  5. StreamingCommunity/Api/Player/supervideo.py +193 -193
  6. StreamingCommunity/Api/Player/vixcloud.py +272 -272
  7. StreamingCommunity/Api/Site/1337xx/__init__.py +51 -50
  8. StreamingCommunity/Api/Site/1337xx/costant.py +14 -14
  9. StreamingCommunity/Api/Site/1337xx/site.py +87 -89
  10. StreamingCommunity/Api/Site/1337xx/title.py +63 -64
  11. StreamingCommunity/Api/Site/altadefinizionegratis/__init__.py +74 -50
  12. StreamingCommunity/Api/Site/altadefinizionegratis/costant.py +21 -19
  13. StreamingCommunity/Api/Site/altadefinizionegratis/film.py +81 -72
  14. StreamingCommunity/Api/Site/altadefinizionegratis/site.py +116 -94
  15. StreamingCommunity/Api/Site/animeunity/__init__.py +75 -50
  16. StreamingCommunity/Api/Site/animeunity/costant.py +21 -19
  17. StreamingCommunity/Api/Site/animeunity/film_serie.py +172 -134
  18. StreamingCommunity/Api/Site/animeunity/site.py +191 -174
  19. StreamingCommunity/Api/Site/animeunity/util/ScrapeSerie.py +97 -97
  20. StreamingCommunity/Api/Site/cb01new/__init__.py +51 -51
  21. StreamingCommunity/Api/Site/cb01new/costant.py +19 -19
  22. StreamingCommunity/Api/Site/cb01new/film.py +61 -71
  23. StreamingCommunity/Api/Site/cb01new/site.py +82 -82
  24. StreamingCommunity/Api/Site/ddlstreamitaly/__init__.py +55 -55
  25. StreamingCommunity/Api/Site/ddlstreamitaly/costant.py +20 -20
  26. StreamingCommunity/Api/Site/ddlstreamitaly/series.py +150 -145
  27. StreamingCommunity/Api/Site/ddlstreamitaly/site.py +98 -98
  28. StreamingCommunity/Api/Site/ddlstreamitaly/util/ScrapeSerie.py +84 -84
  29. StreamingCommunity/Api/Site/guardaserie/__init__.py +50 -50
  30. StreamingCommunity/Api/Site/guardaserie/costant.py +19 -19
  31. StreamingCommunity/Api/Site/guardaserie/series.py +200 -198
  32. StreamingCommunity/Api/Site/guardaserie/site.py +89 -89
  33. StreamingCommunity/Api/Site/guardaserie/util/ScrapeSerie.py +110 -110
  34. StreamingCommunity/Api/Site/ilcorsaronero/__init__.py +51 -51
  35. StreamingCommunity/Api/Site/ilcorsaronero/costant.py +18 -18
  36. StreamingCommunity/Api/Site/ilcorsaronero/site.py +71 -71
  37. StreamingCommunity/Api/Site/ilcorsaronero/title.py +44 -44
  38. StreamingCommunity/Api/Site/ilcorsaronero/util/ilCorsarScraper.py +149 -149
  39. StreamingCommunity/Api/Site/mostraguarda/__init__.py +48 -48
  40. StreamingCommunity/Api/Site/mostraguarda/costant.py +18 -18
  41. StreamingCommunity/Api/Site/mostraguarda/film.py +90 -101
  42. StreamingCommunity/Api/Site/streamingcommunity/__init__.py +79 -55
  43. StreamingCommunity/Api/Site/streamingcommunity/costant.py +21 -19
  44. StreamingCommunity/Api/Site/streamingcommunity/film.py +86 -75
  45. StreamingCommunity/Api/Site/streamingcommunity/series.py +260 -207
  46. StreamingCommunity/Api/Site/streamingcommunity/site.py +156 -142
  47. StreamingCommunity/Api/Site/streamingcommunity/util/ScrapeSerie.py +124 -124
  48. StreamingCommunity/Api/Template/Class/SearchType.py +101 -101
  49. StreamingCommunity/Api/Template/Util/__init__.py +4 -4
  50. StreamingCommunity/Api/Template/Util/get_domain.py +201 -201
  51. StreamingCommunity/Api/Template/Util/manage_ep.py +178 -178
  52. StreamingCommunity/Api/Template/Util/recall_search.py +37 -37
  53. StreamingCommunity/Api/Template/__init__.py +2 -2
  54. StreamingCommunity/Api/Template/site.py +87 -87
  55. StreamingCommunity/Lib/Downloader/HLS/downloader.py +529 -1008
  56. StreamingCommunity/Lib/Downloader/HLS/proxyes.py +110 -110
  57. StreamingCommunity/Lib/Downloader/HLS/segments.py +446 -573
  58. StreamingCommunity/Lib/Downloader/MP4/downloader.py +181 -155
  59. StreamingCommunity/Lib/Downloader/TOR/downloader.py +297 -295
  60. StreamingCommunity/Lib/Downloader/__init__.py +4 -4
  61. StreamingCommunity/Lib/FFmpeg/__init__.py +4 -4
  62. StreamingCommunity/Lib/FFmpeg/capture.py +170 -170
  63. StreamingCommunity/Lib/FFmpeg/command.py +264 -296
  64. StreamingCommunity/Lib/FFmpeg/util.py +248 -248
  65. StreamingCommunity/Lib/M3U8/__init__.py +5 -5
  66. StreamingCommunity/Lib/M3U8/decryptor.py +164 -164
  67. StreamingCommunity/Lib/M3U8/estimator.py +146 -228
  68. StreamingCommunity/Lib/M3U8/parser.py +666 -666
  69. StreamingCommunity/Lib/M3U8/url_fixer.py +57 -57
  70. StreamingCommunity/Lib/TMBD/__init__.py +1 -1
  71. StreamingCommunity/Lib/TMBD/obj_tmbd.py +39 -39
  72. StreamingCommunity/Lib/TMBD/tmdb.py +345 -345
  73. StreamingCommunity/TelegramHelp/__init__.py +0 -0
  74. StreamingCommunity/TelegramHelp/request_manager.py +82 -0
  75. StreamingCommunity/TelegramHelp/session.py +56 -0
  76. StreamingCommunity/TelegramHelp/telegram_bot.py +561 -0
  77. StreamingCommunity/Upload/update.py +75 -67
  78. StreamingCommunity/Upload/version.py +5 -5
  79. StreamingCommunity/Util/_jsonConfig.py +227 -228
  80. StreamingCommunity/Util/call_stack.py +42 -42
  81. StreamingCommunity/Util/color.py +20 -20
  82. StreamingCommunity/Util/console.py +12 -12
  83. StreamingCommunity/Util/ffmpeg_installer.py +342 -370
  84. StreamingCommunity/Util/headers.py +159 -159
  85. StreamingCommunity/Util/logger.py +61 -61
  86. StreamingCommunity/Util/message.py +36 -64
  87. StreamingCommunity/Util/os.py +500 -507
  88. StreamingCommunity/Util/table.py +271 -228
  89. StreamingCommunity/run.py +352 -245
  90. {StreamingCommunity-2.5.2.dist-info → StreamingCommunity-2.5.6.dist-info}/LICENSE +674 -674
  91. {StreamingCommunity-2.5.2.dist-info → StreamingCommunity-2.5.6.dist-info}/METADATA +601 -543
  92. StreamingCommunity-2.5.6.dist-info/RECORD +96 -0
  93. {StreamingCommunity-2.5.2.dist-info → StreamingCommunity-2.5.6.dist-info}/entry_points.txt +0 -1
  94. StreamingCommunity/Api/Player/Helper/Vixcloud/__pycache__/js_parser.cpython-313.pyc +0 -0
  95. StreamingCommunity/Api/Player/Helper/Vixcloud/__pycache__/js_parser.cpython-39.pyc +0 -0
  96. StreamingCommunity/Api/Player/Helper/Vixcloud/__pycache__/util.cpython-313.pyc +0 -0
  97. StreamingCommunity/Api/Player/Helper/Vixcloud/__pycache__/util.cpython-39.pyc +0 -0
  98. StreamingCommunity/Api/Player/__pycache__/ddl.cpython-313.pyc +0 -0
  99. StreamingCommunity/Api/Player/__pycache__/ddl.cpython-39.pyc +0 -0
  100. StreamingCommunity/Api/Player/__pycache__/maxstream.cpython-313.pyc +0 -0
  101. StreamingCommunity/Api/Player/__pycache__/maxstream.cpython-39.pyc +0 -0
  102. StreamingCommunity/Api/Player/__pycache__/supervideo.cpython-313.pyc +0 -0
  103. StreamingCommunity/Api/Player/__pycache__/supervideo.cpython-39.pyc +0 -0
  104. StreamingCommunity/Api/Player/__pycache__/vixcloud.cpython-313.pyc +0 -0
  105. StreamingCommunity/Api/Player/__pycache__/vixcloud.cpython-39.pyc +0 -0
  106. StreamingCommunity/Api/Site/1337xx/__pycache__/__init__.cpython-313.pyc +0 -0
  107. StreamingCommunity/Api/Site/1337xx/__pycache__/__init__.cpython-39.pyc +0 -0
  108. StreamingCommunity/Api/Site/1337xx/__pycache__/costant.cpython-313.pyc +0 -0
  109. StreamingCommunity/Api/Site/1337xx/__pycache__/costant.cpython-39.pyc +0 -0
  110. StreamingCommunity/Api/Site/1337xx/__pycache__/site.cpython-313.pyc +0 -0
  111. StreamingCommunity/Api/Site/1337xx/__pycache__/site.cpython-39.pyc +0 -0
  112. StreamingCommunity/Api/Site/1337xx/__pycache__/title.cpython-313.pyc +0 -0
  113. StreamingCommunity/Api/Site/1337xx/__pycache__/title.cpython-39.pyc +0 -0
  114. StreamingCommunity/Api/Site/altadefinizionegratis/__pycache__/__init__.cpython-313.pyc +0 -0
  115. StreamingCommunity/Api/Site/altadefinizionegratis/__pycache__/__init__.cpython-39.pyc +0 -0
  116. StreamingCommunity/Api/Site/altadefinizionegratis/__pycache__/costant.cpython-313.pyc +0 -0
  117. StreamingCommunity/Api/Site/altadefinizionegratis/__pycache__/costant.cpython-39.pyc +0 -0
  118. StreamingCommunity/Api/Site/altadefinizionegratis/__pycache__/film.cpython-313.pyc +0 -0
  119. StreamingCommunity/Api/Site/altadefinizionegratis/__pycache__/film.cpython-39.pyc +0 -0
  120. StreamingCommunity/Api/Site/altadefinizionegratis/__pycache__/site.cpython-313.pyc +0 -0
  121. StreamingCommunity/Api/Site/altadefinizionegratis/__pycache__/site.cpython-39.pyc +0 -0
  122. StreamingCommunity/Api/Site/animeunity/__pycache__/__init__.cpython-313.pyc +0 -0
  123. StreamingCommunity/Api/Site/animeunity/__pycache__/__init__.cpython-39.pyc +0 -0
  124. StreamingCommunity/Api/Site/animeunity/__pycache__/costant.cpython-313.pyc +0 -0
  125. StreamingCommunity/Api/Site/animeunity/__pycache__/costant.cpython-39.pyc +0 -0
  126. StreamingCommunity/Api/Site/animeunity/__pycache__/film_serie.cpython-313.pyc +0 -0
  127. StreamingCommunity/Api/Site/animeunity/__pycache__/film_serie.cpython-39.pyc +0 -0
  128. StreamingCommunity/Api/Site/animeunity/__pycache__/site.cpython-313.pyc +0 -0
  129. StreamingCommunity/Api/Site/animeunity/__pycache__/site.cpython-39.pyc +0 -0
  130. StreamingCommunity/Api/Site/animeunity/util/__pycache__/ScrapeSerie.cpython-313.pyc +0 -0
  131. StreamingCommunity/Api/Site/animeunity/util/__pycache__/ScrapeSerie.cpython-39.pyc +0 -0
  132. StreamingCommunity/Api/Site/cb01new/__pycache__/__init__.cpython-313.pyc +0 -0
  133. StreamingCommunity/Api/Site/cb01new/__pycache__/__init__.cpython-39.pyc +0 -0
  134. StreamingCommunity/Api/Site/cb01new/__pycache__/costant.cpython-313.pyc +0 -0
  135. StreamingCommunity/Api/Site/cb01new/__pycache__/costant.cpython-39.pyc +0 -0
  136. StreamingCommunity/Api/Site/cb01new/__pycache__/film.cpython-313.pyc +0 -0
  137. StreamingCommunity/Api/Site/cb01new/__pycache__/film.cpython-39.pyc +0 -0
  138. StreamingCommunity/Api/Site/cb01new/__pycache__/site.cpython-313.pyc +0 -0
  139. StreamingCommunity/Api/Site/cb01new/__pycache__/site.cpython-39.pyc +0 -0
  140. StreamingCommunity/Api/Site/ddlstreamitaly/__pycache__/__init__.cpython-313.pyc +0 -0
  141. StreamingCommunity/Api/Site/ddlstreamitaly/__pycache__/__init__.cpython-39.pyc +0 -0
  142. StreamingCommunity/Api/Site/ddlstreamitaly/__pycache__/costant.cpython-313.pyc +0 -0
  143. StreamingCommunity/Api/Site/ddlstreamitaly/__pycache__/costant.cpython-39.pyc +0 -0
  144. StreamingCommunity/Api/Site/ddlstreamitaly/__pycache__/series.cpython-313.pyc +0 -0
  145. StreamingCommunity/Api/Site/ddlstreamitaly/__pycache__/series.cpython-39.pyc +0 -0
  146. StreamingCommunity/Api/Site/ddlstreamitaly/__pycache__/site.cpython-313.pyc +0 -0
  147. StreamingCommunity/Api/Site/ddlstreamitaly/__pycache__/site.cpython-39.pyc +0 -0
  148. StreamingCommunity/Api/Site/ddlstreamitaly/util/__pycache__/ScrapeSerie.cpython-313.pyc +0 -0
  149. StreamingCommunity/Api/Site/ddlstreamitaly/util/__pycache__/ScrapeSerie.cpython-39.pyc +0 -0
  150. StreamingCommunity/Api/Site/guardaserie/__pycache__/__init__.cpython-313.pyc +0 -0
  151. StreamingCommunity/Api/Site/guardaserie/__pycache__/__init__.cpython-39.pyc +0 -0
  152. StreamingCommunity/Api/Site/guardaserie/__pycache__/costant.cpython-313.pyc +0 -0
  153. StreamingCommunity/Api/Site/guardaserie/__pycache__/costant.cpython-39.pyc +0 -0
  154. StreamingCommunity/Api/Site/guardaserie/__pycache__/series.cpython-313.pyc +0 -0
  155. StreamingCommunity/Api/Site/guardaserie/__pycache__/series.cpython-39.pyc +0 -0
  156. StreamingCommunity/Api/Site/guardaserie/__pycache__/site.cpython-313.pyc +0 -0
  157. StreamingCommunity/Api/Site/guardaserie/__pycache__/site.cpython-39.pyc +0 -0
  158. StreamingCommunity/Api/Site/guardaserie/util/__pycache__/ScrapeSerie.cpython-313.pyc +0 -0
  159. StreamingCommunity/Api/Site/guardaserie/util/__pycache__/ScrapeSerie.cpython-39.pyc +0 -0
  160. StreamingCommunity/Api/Site/ilcorsaronero/__pycache__/__init__.cpython-313.pyc +0 -0
  161. StreamingCommunity/Api/Site/ilcorsaronero/__pycache__/__init__.cpython-39.pyc +0 -0
  162. StreamingCommunity/Api/Site/ilcorsaronero/__pycache__/costant.cpython-313.pyc +0 -0
  163. StreamingCommunity/Api/Site/ilcorsaronero/__pycache__/costant.cpython-39.pyc +0 -0
  164. StreamingCommunity/Api/Site/ilcorsaronero/__pycache__/site.cpython-313.pyc +0 -0
  165. StreamingCommunity/Api/Site/ilcorsaronero/__pycache__/site.cpython-39.pyc +0 -0
  166. StreamingCommunity/Api/Site/ilcorsaronero/__pycache__/title.cpython-313.pyc +0 -0
  167. StreamingCommunity/Api/Site/ilcorsaronero/__pycache__/title.cpython-39.pyc +0 -0
  168. StreamingCommunity/Api/Site/ilcorsaronero/util/__pycache__/ilCorsarScraper.cpython-313.pyc +0 -0
  169. StreamingCommunity/Api/Site/ilcorsaronero/util/__pycache__/ilCorsarScraper.cpython-39.pyc +0 -0
  170. StreamingCommunity/Api/Site/mostraguarda/__pycache__/__init__.cpython-313.pyc +0 -0
  171. StreamingCommunity/Api/Site/mostraguarda/__pycache__/__init__.cpython-39.pyc +0 -0
  172. StreamingCommunity/Api/Site/mostraguarda/__pycache__/costant.cpython-313.pyc +0 -0
  173. StreamingCommunity/Api/Site/mostraguarda/__pycache__/costant.cpython-39.pyc +0 -0
  174. StreamingCommunity/Api/Site/mostraguarda/__pycache__/film.cpython-313.pyc +0 -0
  175. StreamingCommunity/Api/Site/mostraguarda/__pycache__/film.cpython-39.pyc +0 -0
  176. StreamingCommunity/Api/Site/streamingcommunity/__pycache__/__init__.cpython-313.pyc +0 -0
  177. StreamingCommunity/Api/Site/streamingcommunity/__pycache__/__init__.cpython-39.pyc +0 -0
  178. StreamingCommunity/Api/Site/streamingcommunity/__pycache__/costant.cpython-313.pyc +0 -0
  179. StreamingCommunity/Api/Site/streamingcommunity/__pycache__/costant.cpython-39.pyc +0 -0
  180. StreamingCommunity/Api/Site/streamingcommunity/__pycache__/film.cpython-313.pyc +0 -0
  181. StreamingCommunity/Api/Site/streamingcommunity/__pycache__/film.cpython-39.pyc +0 -0
  182. StreamingCommunity/Api/Site/streamingcommunity/__pycache__/series.cpython-313.pyc +0 -0
  183. StreamingCommunity/Api/Site/streamingcommunity/__pycache__/series.cpython-39.pyc +0 -0
  184. StreamingCommunity/Api/Site/streamingcommunity/__pycache__/site.cpython-313.pyc +0 -0
  185. StreamingCommunity/Api/Site/streamingcommunity/__pycache__/site.cpython-39.pyc +0 -0
  186. StreamingCommunity/Api/Site/streamingcommunity/util/__pycache__/ScrapeSerie.cpython-313.pyc +0 -0
  187. StreamingCommunity/Api/Site/streamingcommunity/util/__pycache__/ScrapeSerie.cpython-39.pyc +0 -0
  188. StreamingCommunity/Api/Template/Class/__pycache__/SearchType.cpython-313.pyc +0 -0
  189. StreamingCommunity/Api/Template/Class/__pycache__/SearchType.cpython-39.pyc +0 -0
  190. StreamingCommunity/Api/Template/Util/__pycache__/__init__.cpython-313.pyc +0 -0
  191. StreamingCommunity/Api/Template/Util/__pycache__/__init__.cpython-39.pyc +0 -0
  192. StreamingCommunity/Api/Template/Util/__pycache__/get_domain.cpython-313.pyc +0 -0
  193. StreamingCommunity/Api/Template/Util/__pycache__/get_domain.cpython-39.pyc +0 -0
  194. StreamingCommunity/Api/Template/Util/__pycache__/manage_ep.cpython-313.pyc +0 -0
  195. StreamingCommunity/Api/Template/Util/__pycache__/manage_ep.cpython-39.pyc +0 -0
  196. StreamingCommunity/Api/Template/Util/__pycache__/recall_search.cpython-313.pyc +0 -0
  197. StreamingCommunity/Api/Template/Util/__pycache__/recall_search.cpython-39.pyc +0 -0
  198. StreamingCommunity/Api/Template/__pycache__/__init__.cpython-313.pyc +0 -0
  199. StreamingCommunity/Api/Template/__pycache__/__init__.cpython-39.pyc +0 -0
  200. StreamingCommunity/Api/Template/__pycache__/site.cpython-313.pyc +0 -0
  201. StreamingCommunity/Api/Template/__pycache__/site.cpython-39.pyc +0 -0
  202. StreamingCommunity/Lib/Downloader/HLS/__pycache__/downloader.cpython-313.pyc +0 -0
  203. StreamingCommunity/Lib/Downloader/HLS/__pycache__/downloader.cpython-39.pyc +0 -0
  204. StreamingCommunity/Lib/Downloader/HLS/__pycache__/proxyes.cpython-313.pyc +0 -0
  205. StreamingCommunity/Lib/Downloader/HLS/__pycache__/proxyes.cpython-39.pyc +0 -0
  206. StreamingCommunity/Lib/Downloader/HLS/__pycache__/segments.cpython-313.pyc +0 -0
  207. StreamingCommunity/Lib/Downloader/HLS/__pycache__/segments.cpython-39.pyc +0 -0
  208. StreamingCommunity/Lib/Downloader/MP4/__pycache__/downloader.cpython-313.pyc +0 -0
  209. StreamingCommunity/Lib/Downloader/MP4/__pycache__/downloader.cpython-39.pyc +0 -0
  210. StreamingCommunity/Lib/Downloader/TOR/__pycache__/downloader.cpython-313.pyc +0 -0
  211. StreamingCommunity/Lib/Downloader/TOR/__pycache__/downloader.cpython-39.pyc +0 -0
  212. StreamingCommunity/Lib/Downloader/__pycache__/__init__.cpython-313.pyc +0 -0
  213. StreamingCommunity/Lib/Downloader/__pycache__/__init__.cpython-39.pyc +0 -0
  214. StreamingCommunity/Lib/FFmpeg/__pycache__/__init__.cpython-313.pyc +0 -0
  215. StreamingCommunity/Lib/FFmpeg/__pycache__/__init__.cpython-39.pyc +0 -0
  216. StreamingCommunity/Lib/FFmpeg/__pycache__/capture.cpython-313.pyc +0 -0
  217. StreamingCommunity/Lib/FFmpeg/__pycache__/capture.cpython-39.pyc +0 -0
  218. StreamingCommunity/Lib/FFmpeg/__pycache__/command.cpython-313.pyc +0 -0
  219. StreamingCommunity/Lib/FFmpeg/__pycache__/command.cpython-39.pyc +0 -0
  220. StreamingCommunity/Lib/FFmpeg/__pycache__/util.cpython-313.pyc +0 -0
  221. StreamingCommunity/Lib/FFmpeg/__pycache__/util.cpython-39.pyc +0 -0
  222. StreamingCommunity/Lib/M3U8/__pycache__/__init__.cpython-313.pyc +0 -0
  223. StreamingCommunity/Lib/M3U8/__pycache__/__init__.cpython-39.pyc +0 -0
  224. StreamingCommunity/Lib/M3U8/__pycache__/decryptor.cpython-313.pyc +0 -0
  225. StreamingCommunity/Lib/M3U8/__pycache__/decryptor.cpython-39.pyc +0 -0
  226. StreamingCommunity/Lib/M3U8/__pycache__/estimator.cpython-313.pyc +0 -0
  227. StreamingCommunity/Lib/M3U8/__pycache__/estimator.cpython-39.pyc +0 -0
  228. StreamingCommunity/Lib/M3U8/__pycache__/parser.cpython-313.pyc +0 -0
  229. StreamingCommunity/Lib/M3U8/__pycache__/parser.cpython-39.pyc +0 -0
  230. StreamingCommunity/Lib/M3U8/__pycache__/url_fixer.cpython-313.pyc +0 -0
  231. StreamingCommunity/Lib/M3U8/__pycache__/url_fixer.cpython-39.pyc +0 -0
  232. StreamingCommunity/Lib/TMBD/__pycache__/__init__.cpython-313.pyc +0 -0
  233. StreamingCommunity/Lib/TMBD/__pycache__/__init__.cpython-39.pyc +0 -0
  234. StreamingCommunity/Lib/TMBD/__pycache__/obj_tmbd.cpython-313.pyc +0 -0
  235. StreamingCommunity/Lib/TMBD/__pycache__/obj_tmbd.cpython-39.pyc +0 -0
  236. StreamingCommunity/Lib/TMBD/__pycache__/tmdb.cpython-313.pyc +0 -0
  237. StreamingCommunity/Lib/TMBD/__pycache__/tmdb.cpython-39.pyc +0 -0
  238. StreamingCommunity/Upload/__pycache__/update.cpython-313.pyc +0 -0
  239. StreamingCommunity/Upload/__pycache__/update.cpython-39.pyc +0 -0
  240. StreamingCommunity/Upload/__pycache__/version.cpython-313.pyc +0 -0
  241. StreamingCommunity/Upload/__pycache__/version.cpython-39.pyc +0 -0
  242. StreamingCommunity/Util/__pycache__/_jsonConfig.cpython-313.pyc +0 -0
  243. StreamingCommunity/Util/__pycache__/_jsonConfig.cpython-39.pyc +0 -0
  244. StreamingCommunity/Util/__pycache__/call_stack.cpython-313.pyc +0 -0
  245. StreamingCommunity/Util/__pycache__/call_stack.cpython-39.pyc +0 -0
  246. StreamingCommunity/Util/__pycache__/color.cpython-313.pyc +0 -0
  247. StreamingCommunity/Util/__pycache__/color.cpython-39.pyc +0 -0
  248. StreamingCommunity/Util/__pycache__/console.cpython-313.pyc +0 -0
  249. StreamingCommunity/Util/__pycache__/console.cpython-39.pyc +0 -0
  250. StreamingCommunity/Util/__pycache__/ffmpeg_installer.cpython-313.pyc +0 -0
  251. StreamingCommunity/Util/__pycache__/ffmpeg_installer.cpython-39.pyc +0 -0
  252. StreamingCommunity/Util/__pycache__/headers.cpython-313.pyc +0 -0
  253. StreamingCommunity/Util/__pycache__/headers.cpython-39.pyc +0 -0
  254. StreamingCommunity/Util/__pycache__/logger.cpython-313.pyc +0 -0
  255. StreamingCommunity/Util/__pycache__/logger.cpython-39.pyc +0 -0
  256. StreamingCommunity/Util/__pycache__/message.cpython-313.pyc +0 -0
  257. StreamingCommunity/Util/__pycache__/message.cpython-39.pyc +0 -0
  258. StreamingCommunity/Util/__pycache__/os.cpython-313.pyc +0 -0
  259. StreamingCommunity/Util/__pycache__/os.cpython-39.pyc +0 -0
  260. StreamingCommunity/Util/__pycache__/table.cpython-313.pyc +0 -0
  261. StreamingCommunity/Util/__pycache__/table.cpython-39.pyc +0 -0
  262. StreamingCommunity/__pycache__/__init__.cpython-313.pyc +0 -0
  263. StreamingCommunity/__pycache__/__init__.cpython-39.pyc +0 -0
  264. StreamingCommunity/__pycache__/run.cpython-313.pyc +0 -0
  265. StreamingCommunity/__pycache__/run.cpython-39.pyc +0 -0
  266. StreamingCommunity-2.5.2.dist-info/RECORD +0 -264
  267. {StreamingCommunity-2.5.2.dist-info → StreamingCommunity-2.5.6.dist-info}/WHEEL +0 -0
  268. {StreamingCommunity-2.5.2.dist-info → StreamingCommunity-2.5.6.dist-info}/top_level.txt +0 -0
@@ -1,346 +1,346 @@
1
- # 24.08.24
2
-
3
- import sys
4
- from typing import Dict
5
-
6
-
7
- # External libraries
8
- import httpx
9
- from rich.console import Console
10
-
11
-
12
- # Internal utilities
13
- from .obj_tmbd import Json_film
14
- from StreamingCommunity.Util.table import TVShowManager
15
-
16
-
17
- # Variable
18
- table_show_manager = TVShowManager()
19
- api_key = "a800ed6c93274fb857ea61bd9e7256c5"
20
-
21
-
22
-
23
- def get_select_title(table_show_manager, generic_obj):
24
- """
25
- Display a selection of titles and prompt the user to choose one.
26
-
27
- Returns:
28
- dict: The selected media item.
29
- """
30
-
31
- # Set up table for displaying titles
32
- table_show_manager.set_slice_end(10)
33
-
34
- # Check if the generic_obj list is empty
35
- if not generic_obj:
36
- Console.print("\n[red]No media items available.")
37
- return None
38
-
39
- # Example of available colors for columns
40
- available_colors = ['red', 'magenta', 'yellow', 'cyan', 'green', 'blue', 'white']
41
-
42
- # Retrieve the keys of the first item as column headers
43
- first_item = generic_obj[0]
44
- column_info = {"Index": {'color': available_colors[0]}} # Always include Index with a fixed color
45
-
46
- # Assign colors to the remaining keys dynamically
47
- color_index = 1
48
- for key in first_item.keys():
49
- if key in ('name', 'date', 'number'): # Custom prioritization of colors
50
- if key == 'name':
51
- column_info["Name"] = {'color': 'magenta'}
52
- elif key == 'date':
53
- column_info["Date"] = {'color': 'cyan'}
54
- elif key == 'number':
55
- column_info["Number"] = {'color': 'yellow'}
56
-
57
- else:
58
- column_info[key.capitalize()] = {'color': available_colors[color_index % len(available_colors)]}
59
- color_index += 1
60
-
61
- table_show_manager.add_column(column_info)
62
-
63
- # Populate the table with title information
64
- for i, item in enumerate(generic_obj):
65
- item_dict = {'Index': str(i)}
66
-
67
- for key in item.keys():
68
- # Ensure all values are strings for rich add table
69
- item_dict[key.capitalize()] = str(item[key])
70
-
71
- table_show_manager.add_tv_show(item_dict)
72
-
73
- # Run the table and handle user input
74
- last_command = table_show_manager.run(force_int_input=True, max_int_input=len(generic_obj))
75
- table_show_manager.clear()
76
-
77
- # Handle user's quit command
78
- if last_command == "q" or last_command == "quit":
79
- Console.print("\n[red]Quit [white]...")
80
- sys.exit(0)
81
-
82
- # Check if the selected index is within range
83
- if 0 <= int(last_command) < len(generic_obj):
84
- return generic_obj[int(last_command)]
85
-
86
- else:
87
- Console.print("\n[red]Wrong index")
88
- sys.exit(0)
89
-
90
-
91
- class TheMovieDB:
92
- def __init__(self, api_key):
93
- """
94
- Initialize the class with the API key.
95
-
96
- Parameters:
97
- - api_key (str): The API key for authenticating requests to TheMovieDB.
98
- """
99
- self.api_key = api_key
100
- self.base_url = "https://api.themoviedb.org/3"
101
- self.console = Console()
102
- #self.genres = self._fetch_genres()
103
-
104
- def _make_request(self, endpoint, params=None):
105
- """
106
- Make a request to the given API endpoint with optional parameters.
107
-
108
- Parameters:
109
- - endpoint (str): The API endpoint to hit.
110
- - params (dict): Additional parameters for the request.
111
-
112
- Returns:
113
- dict: JSON response as a dictionary.
114
- """
115
- if params is None:
116
- params = {}
117
-
118
- params['api_key'] = self.api_key
119
- url = f"{self.base_url}/{endpoint}"
120
- response = httpx.get(url, params=params)
121
- response.raise_for_status()
122
-
123
- return response.json()
124
-
125
- def _fetch_genres(self) -> Dict[int, str]:
126
- """
127
- Fetch and return the genre names from TheMovieDB.
128
-
129
- Returns:
130
- Dict[int, str]: A dictionary mapping genre IDs to genre names.
131
- """
132
- genres = self._make_request("genre/movie/list")
133
- return {genre['id']: genre['name'] for genre in genres.get('genres', [])}
134
-
135
- def _process_and_add_tv_shows(self, data, columns):
136
- """
137
- Process TV show data and add it to the TV show manager.
138
-
139
- Parameters:
140
- - data (list): List of dictionaries containing the data to process.
141
- - columns (list): A list of tuples, where each tuple contains the column name and the key to fetch the data from the dictionary.
142
- """
143
- # Define column styles with colors
144
- tv_show_manager = TVShowManager()
145
- column_info = {
146
- col[0]: {'color': col[2] if len(col) > 2 else 'white'}
147
- for col in columns
148
- }
149
- tv_show_manager.add_column(column_info)
150
-
151
- # Add each item to the TV show manager, including rank
152
- for index, item in enumerate(data):
153
-
154
- # Convert genre IDs to genre names
155
- genre_names = [self.genres.get(genre_id, 'Unknown') for genre_id in item.get('genre_ids', [])]
156
- tv_show = {
157
- col[0]: str(item.get(col[1], 'N/A')) if col[1] != 'genre_ids' else ', '.join(genre_names)
158
- for col in columns
159
- }
160
-
161
- tv_show_manager.add_tv_show(tv_show)
162
-
163
- # Display the processed TV show data
164
- tv_show_manager.display_data(tv_show_manager.tv_shows[tv_show_manager.slice_start:tv_show_manager.slice_end])
165
-
166
- def _display_with_title(self, title: str, data, columns):
167
- """
168
- Display data with a title.
169
-
170
- Parameters:
171
- - title (str): The title to display.
172
- - data (list): List of dictionaries containing the data to process.
173
- - columns (list): A list of tuples, where each tuple contains the column name and the key to fetch the data from the dictionary.
174
- """
175
- self.console.print(f"\n{title}", style="bold underline")
176
- self._process_and_add_tv_shows(data, columns)
177
-
178
- def display_trending_tv_shows(self):
179
- """
180
- Fetch and display the trending TV shows of the week.
181
- """
182
- data = self._make_request("trending/tv/week").get("results", [])
183
- columns = [
184
- ("Title", "name", 'cyan'),
185
- ("First Air Date", "first_air_date", 'green'),
186
- ("Popularity", "popularity", 'magenta'),
187
- ("Genres", "genre_ids", 'blue'),
188
- ("Origin Country", "origin_country", 'red'),
189
- ("Vote Average", "vote_average", 'yellow')
190
- ]
191
- self._display_with_title("Trending TV Shows of the Week", data, columns)
192
-
193
- def display_trending_films(self):
194
- """
195
- Fetch and display the trending films of the week.
196
- """
197
- data = self._make_request("trending/movie/week").get("results", [])
198
- columns = [
199
- ("Title", "title", 'cyan'),
200
- ("Release Date", "release_date", 'green'),
201
- ("Popularity", "popularity", 'magenta'),
202
- ("Genres", "genre_ids", 'blue'),
203
- ("Vote Average", "vote_average", 'yellow')
204
- ]
205
- self._display_with_title("Trending Films of the Week", data, columns)
206
-
207
- def search_movie(self, movie_name: str):
208
- """
209
- Search for a movie by name and return its TMDB ID.
210
-
211
- Parameters:
212
- - movie_name (str): The name of the movie to search for.
213
-
214
- Returns:
215
- int: The TMDB ID of the selected movie.
216
- """
217
- generic_obj = []
218
- data = self._make_request("search/movie", {"query": movie_name}).get("results", [])
219
- if not data:
220
- self.console.print("No movies found with that name.", style="red")
221
- return None
222
-
223
- self.console.print("\nSelect a Movie:")
224
- for i, movie in enumerate(data, start=1):
225
- generic_obj.append({
226
- 'name': movie['title'],
227
- 'date': movie.get('release_date', 'N/A'),
228
- 'id': movie['id']
229
- })
230
-
231
- choice = get_select_title(table_show_manager, generic_obj)
232
- return choice["id"]
233
-
234
- def get_movie_details(self, tmdb_id: int) -> Json_film:
235
- """
236
- Fetch and display details for a specific movie using its TMDB ID.
237
-
238
- Parameters:
239
- - tmdb_id (int): The TMDB ID of the movie.
240
-
241
- Returns:
242
- - Json_film: The movie details as a class.
243
- """
244
- movie = self._make_request(f"movie/{tmdb_id}")
245
- if not movie:
246
- self.console.print("Movie not found.", style="red")
247
- return None
248
-
249
- return Json_film(movie)
250
-
251
- def search_tv_show(self, tv_name: str):
252
- """
253
- Search for a TV show by name and return its TMDB ID.
254
-
255
- Parameters:
256
- - tv_name (str): The name of the TV show to search for.
257
-
258
- Returns:
259
- int: The TMDB ID of the selected TV show.
260
- """
261
- data = self._make_request("search/tv", {"query": tv_name}).get("results", [])
262
- if not data:
263
- self.console.print("No TV shows found with that name.", style="red")
264
- return None
265
-
266
- self.console.print("\nSelect a TV Show:")
267
- for i, show in enumerate(data, start=1):
268
- self.console.print(f"{i}. {show['name']} (First Air Date: {show.get('first_air_date', 'N/A')})")
269
-
270
- choice = int(input("Enter the number of the show you want: ")) - 1
271
- selected_show = data[choice]
272
- return selected_show["id"] # Return the TMDB ID of the selected TV show
273
-
274
- def get_seasons(self, tv_show_id: int):
275
- """
276
- Get seasons for a given TV show.
277
-
278
- Parameters:
279
- - tv_show_id (int): The TMDB ID of the TV show.
280
-
281
- Returns:
282
- int: The season number selected by the user.
283
- """
284
- data = self._make_request(f"tv/{tv_show_id}").get("seasons", [])
285
- if not data:
286
- self.console.print("No seasons found for this TV show.", style="red")
287
- return None
288
-
289
- self.console.print("\nSelect a Season:")
290
- for i, season in enumerate(data, start=1):
291
- self.console.print(f"{i}. {season['name']} (Episodes: {season['episode_count']})")
292
-
293
- choice = int(input("Enter the number of the season you want: ")) - 1
294
- return data[choice]["season_number"]
295
-
296
- def get_episodes(self, tv_show_id: int, season_number: int):
297
- """
298
- Get episodes for a given season of a TV show.
299
-
300
- Parameters:
301
- - tv_show_id (int): The TMDB ID of the TV show.
302
- - season_number (int): The season number.
303
-
304
- Returns:
305
- dict: The details of the selected episode.
306
- """
307
- data = self._make_request(f"tv/{tv_show_id}/season/{season_number}").get("episodes", [])
308
- if not data:
309
- self.console.print("No episodes found for this season.", style="red")
310
- return None
311
-
312
- self.console.print("\nSelect an Episode:")
313
- for i, episode in enumerate(data, start=1):
314
- self.console.print(f"{i}. {episode['name']} (Air Date: {episode.get('air_date', 'N/A')})")
315
-
316
- choice = int(input("Enter the number of the episode you want: ")) - 1
317
- return data[choice]
318
-
319
-
320
-
321
- # Output
322
- tmdb = TheMovieDB(api_key)
323
-
324
-
325
- """
326
- Example:
327
-
328
-
329
- @ movie
330
- movie_name = "Interstellar"
331
- movie_id = tmdb.search_movie(movie_name)
332
-
333
- if movie_id:
334
- movie_details = tmdb.get_movie_details(tmdb_id=movie_id)
335
- print(movie_details)
336
-
337
-
338
- @ series
339
- tv_name = "Game of Thrones"
340
- tv_show_id = tmdb.search_tv_show(tv_name)
341
- if tv_show_id:
342
- season_number = tmdb.get_seasons(tv_show_id=tv_show_id)
343
- if season_number:
344
- episode = tmdb.get_episodes(tv_show_id=tv_show_id, season_number=season_number)
345
- print(episode)
1
+ # 24.08.24
2
+
3
+ import sys
4
+ from typing import Dict
5
+
6
+
7
+ # External libraries
8
+ import httpx
9
+ from rich.console import Console
10
+
11
+
12
+ # Internal utilities
13
+ from .obj_tmbd import Json_film
14
+ from StreamingCommunity.Util.table import TVShowManager
15
+
16
+
17
+ # Variable
18
+ table_show_manager = TVShowManager()
19
+ api_key = "a800ed6c93274fb857ea61bd9e7256c5"
20
+
21
+
22
+
23
+ def get_select_title(table_show_manager, generic_obj):
24
+ """
25
+ Display a selection of titles and prompt the user to choose one.
26
+
27
+ Returns:
28
+ dict: The selected media item.
29
+ """
30
+
31
+ # Set up table for displaying titles
32
+ table_show_manager.set_slice_end(10)
33
+
34
+ # Check if the generic_obj list is empty
35
+ if not generic_obj:
36
+ Console.print("\n[red]No media items available.")
37
+ return None
38
+
39
+ # Example of available colors for columns
40
+ available_colors = ['red', 'magenta', 'yellow', 'cyan', 'green', 'blue', 'white']
41
+
42
+ # Retrieve the keys of the first item as column headers
43
+ first_item = generic_obj[0]
44
+ column_info = {"Index": {'color': available_colors[0]}} # Always include Index with a fixed color
45
+
46
+ # Assign colors to the remaining keys dynamically
47
+ color_index = 1
48
+ for key in first_item.keys():
49
+ if key in ('name', 'date', 'number'): # Custom prioritization of colors
50
+ if key == 'name':
51
+ column_info["Name"] = {'color': 'magenta'}
52
+ elif key == 'date':
53
+ column_info["Date"] = {'color': 'cyan'}
54
+ elif key == 'number':
55
+ column_info["Number"] = {'color': 'yellow'}
56
+
57
+ else:
58
+ column_info[key.capitalize()] = {'color': available_colors[color_index % len(available_colors)]}
59
+ color_index += 1
60
+
61
+ table_show_manager.add_column(column_info)
62
+
63
+ # Populate the table with title information
64
+ for i, item in enumerate(generic_obj):
65
+ item_dict = {'Index': str(i)}
66
+
67
+ for key in item.keys():
68
+ # Ensure all values are strings for rich add table
69
+ item_dict[key.capitalize()] = str(item[key])
70
+
71
+ table_show_manager.add_tv_show(item_dict)
72
+
73
+ # Run the table and handle user input
74
+ last_command = table_show_manager.run(force_int_input=True, max_int_input=len(generic_obj))
75
+ table_show_manager.clear()
76
+
77
+ # Handle user's quit command
78
+ if last_command == "q" or last_command == "quit":
79
+ Console.print("\n[red]Quit [white]...")
80
+ sys.exit(0)
81
+
82
+ # Check if the selected index is within range
83
+ if 0 <= int(last_command) < len(generic_obj):
84
+ return generic_obj[int(last_command)]
85
+
86
+ else:
87
+ Console.print("\n[red]Wrong index")
88
+ sys.exit(0)
89
+
90
+
91
+ class TheMovieDB:
92
+ def __init__(self, api_key):
93
+ """
94
+ Initialize the class with the API key.
95
+
96
+ Parameters:
97
+ - api_key (str): The API key for authenticating requests to TheMovieDB.
98
+ """
99
+ self.api_key = api_key
100
+ self.base_url = "https://api.themoviedb.org/3"
101
+ self.console = Console()
102
+ #self.genres = self._fetch_genres()
103
+
104
+ def _make_request(self, endpoint, params=None):
105
+ """
106
+ Make a request to the given API endpoint with optional parameters.
107
+
108
+ Parameters:
109
+ - endpoint (str): The API endpoint to hit.
110
+ - params (dict): Additional parameters for the request.
111
+
112
+ Returns:
113
+ dict: JSON response as a dictionary.
114
+ """
115
+ if params is None:
116
+ params = {}
117
+
118
+ params['api_key'] = self.api_key
119
+ url = f"{self.base_url}/{endpoint}"
120
+ response = httpx.get(url, params=params)
121
+ response.raise_for_status()
122
+
123
+ return response.json()
124
+
125
+ def _fetch_genres(self) -> Dict[int, str]:
126
+ """
127
+ Fetch and return the genre names from TheMovieDB.
128
+
129
+ Returns:
130
+ Dict[int, str]: A dictionary mapping genre IDs to genre names.
131
+ """
132
+ genres = self._make_request("genre/movie/list")
133
+ return {genre['id']: genre['name'] for genre in genres.get('genres', [])}
134
+
135
+ def _process_and_add_tv_shows(self, data, columns):
136
+ """
137
+ Process TV show data and add it to the TV show manager.
138
+
139
+ Parameters:
140
+ - data (list): List of dictionaries containing the data to process.
141
+ - columns (list): A list of tuples, where each tuple contains the column name and the key to fetch the data from the dictionary.
142
+ """
143
+ # Define column styles with colors
144
+ tv_show_manager = TVShowManager()
145
+ column_info = {
146
+ col[0]: {'color': col[2] if len(col) > 2 else 'white'}
147
+ for col in columns
148
+ }
149
+ tv_show_manager.add_column(column_info)
150
+
151
+ # Add each item to the TV show manager, including rank
152
+ for index, item in enumerate(data):
153
+
154
+ # Convert genre IDs to genre names
155
+ genre_names = [self.genres.get(genre_id, 'Unknown') for genre_id in item.get('genre_ids', [])]
156
+ tv_show = {
157
+ col[0]: str(item.get(col[1], 'N/A')) if col[1] != 'genre_ids' else ', '.join(genre_names)
158
+ for col in columns
159
+ }
160
+
161
+ tv_show_manager.add_tv_show(tv_show)
162
+
163
+ # Display the processed TV show data
164
+ tv_show_manager.display_data(tv_show_manager.tv_shows[tv_show_manager.slice_start:tv_show_manager.slice_end])
165
+
166
+ def _display_with_title(self, title: str, data, columns):
167
+ """
168
+ Display data with a title.
169
+
170
+ Parameters:
171
+ - title (str): The title to display.
172
+ - data (list): List of dictionaries containing the data to process.
173
+ - columns (list): A list of tuples, where each tuple contains the column name and the key to fetch the data from the dictionary.
174
+ """
175
+ self.console.print(f"\n{title}", style="bold underline")
176
+ self._process_and_add_tv_shows(data, columns)
177
+
178
+ def display_trending_tv_shows(self):
179
+ """
180
+ Fetch and display the trending TV shows of the week.
181
+ """
182
+ data = self._make_request("trending/tv/week").get("results", [])
183
+ columns = [
184
+ ("Title", "name", 'cyan'),
185
+ ("First Air Date", "first_air_date", 'green'),
186
+ ("Popularity", "popularity", 'magenta'),
187
+ ("Genres", "genre_ids", 'blue'),
188
+ ("Origin Country", "origin_country", 'red'),
189
+ ("Vote Average", "vote_average", 'yellow')
190
+ ]
191
+ self._display_with_title("Trending TV Shows of the Week", data, columns)
192
+
193
+ def display_trending_films(self):
194
+ """
195
+ Fetch and display the trending films of the week.
196
+ """
197
+ data = self._make_request("trending/movie/week").get("results", [])
198
+ columns = [
199
+ ("Title", "title", 'cyan'),
200
+ ("Release Date", "release_date", 'green'),
201
+ ("Popularity", "popularity", 'magenta'),
202
+ ("Genres", "genre_ids", 'blue'),
203
+ ("Vote Average", "vote_average", 'yellow')
204
+ ]
205
+ self._display_with_title("Trending Films of the Week", data, columns)
206
+
207
+ def search_movie(self, movie_name: str):
208
+ """
209
+ Search for a movie by name and return its TMDB ID.
210
+
211
+ Parameters:
212
+ - movie_name (str): The name of the movie to search for.
213
+
214
+ Returns:
215
+ int: The TMDB ID of the selected movie.
216
+ """
217
+ generic_obj = []
218
+ data = self._make_request("search/movie", {"query": movie_name}).get("results", [])
219
+ if not data:
220
+ self.console.print("No movies found with that name.", style="red")
221
+ return None
222
+
223
+ self.console.print("\nSelect a Movie:")
224
+ for i, movie in enumerate(data, start=1):
225
+ generic_obj.append({
226
+ 'name': movie['title'],
227
+ 'date': movie.get('release_date', 'N/A'),
228
+ 'id': movie['id']
229
+ })
230
+
231
+ choice = get_select_title(table_show_manager, generic_obj)
232
+ return choice["id"]
233
+
234
+ def get_movie_details(self, tmdb_id: int) -> Json_film:
235
+ """
236
+ Fetch and display details for a specific movie using its TMDB ID.
237
+
238
+ Parameters:
239
+ - tmdb_id (int): The TMDB ID of the movie.
240
+
241
+ Returns:
242
+ - Json_film: The movie details as a class.
243
+ """
244
+ movie = self._make_request(f"movie/{tmdb_id}")
245
+ if not movie:
246
+ self.console.print("Movie not found.", style="red")
247
+ return None
248
+
249
+ return Json_film(movie)
250
+
251
+ def search_tv_show(self, tv_name: str):
252
+ """
253
+ Search for a TV show by name and return its TMDB ID.
254
+
255
+ Parameters:
256
+ - tv_name (str): The name of the TV show to search for.
257
+
258
+ Returns:
259
+ int: The TMDB ID of the selected TV show.
260
+ """
261
+ data = self._make_request("search/tv", {"query": tv_name}).get("results", [])
262
+ if not data:
263
+ self.console.print("No TV shows found with that name.", style="red")
264
+ return None
265
+
266
+ self.console.print("\nSelect a TV Show:")
267
+ for i, show in enumerate(data, start=1):
268
+ self.console.print(f"{i}. {show['name']} (First Air Date: {show.get('first_air_date', 'N/A')})")
269
+
270
+ choice = int(input("Enter the number of the show you want: ")) - 1
271
+ selected_show = data[choice]
272
+ return selected_show["id"] # Return the TMDB ID of the selected TV show
273
+
274
+ def get_seasons(self, tv_show_id: int):
275
+ """
276
+ Get seasons for a given TV show.
277
+
278
+ Parameters:
279
+ - tv_show_id (int): The TMDB ID of the TV show.
280
+
281
+ Returns:
282
+ int: The season number selected by the user.
283
+ """
284
+ data = self._make_request(f"tv/{tv_show_id}").get("seasons", [])
285
+ if not data:
286
+ self.console.print("No seasons found for this TV show.", style="red")
287
+ return None
288
+
289
+ self.console.print("\nSelect a Season:")
290
+ for i, season in enumerate(data, start=1):
291
+ self.console.print(f"{i}. {season['name']} (Episodes: {season['episode_count']})")
292
+
293
+ choice = int(input("Enter the number of the season you want: ")) - 1
294
+ return data[choice]["season_number"]
295
+
296
+ def get_episodes(self, tv_show_id: int, season_number: int):
297
+ """
298
+ Get episodes for a given season of a TV show.
299
+
300
+ Parameters:
301
+ - tv_show_id (int): The TMDB ID of the TV show.
302
+ - season_number (int): The season number.
303
+
304
+ Returns:
305
+ dict: The details of the selected episode.
306
+ """
307
+ data = self._make_request(f"tv/{tv_show_id}/season/{season_number}").get("episodes", [])
308
+ if not data:
309
+ self.console.print("No episodes found for this season.", style="red")
310
+ return None
311
+
312
+ self.console.print("\nSelect an Episode:")
313
+ for i, episode in enumerate(data, start=1):
314
+ self.console.print(f"{i}. {episode['name']} (Air Date: {episode.get('air_date', 'N/A')})")
315
+
316
+ choice = int(input("Enter the number of the episode you want: ")) - 1
317
+ return data[choice]
318
+
319
+
320
+
321
+ # Output
322
+ tmdb = TheMovieDB(api_key)
323
+
324
+
325
+ """
326
+ Example:
327
+
328
+
329
+ @ movie
330
+ movie_name = "Interstellar"
331
+ movie_id = tmdb.search_movie(movie_name)
332
+
333
+ if movie_id:
334
+ movie_details = tmdb.get_movie_details(tmdb_id=movie_id)
335
+ print(movie_details)
336
+
337
+
338
+ @ series
339
+ tv_name = "Game of Thrones"
340
+ tv_show_id = tmdb.search_tv_show(tv_name)
341
+ if tv_show_id:
342
+ season_number = tmdb.get_seasons(tv_show_id=tv_show_id)
343
+ if season_number:
344
+ episode = tmdb.get_episodes(tv_show_id=tv_show_id, season_number=season_number)
345
+ print(episode)
346
346
  """