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.
- StreamingCommunity/Api/Player/Helper/Vixcloud/js_parser.py +143 -143
- StreamingCommunity/Api/Player/Helper/Vixcloud/util.py +136 -136
- StreamingCommunity/Api/Player/ddl.py +89 -89
- StreamingCommunity/Api/Player/maxstream.py +151 -151
- StreamingCommunity/Api/Player/supervideo.py +193 -193
- StreamingCommunity/Api/Player/vixcloud.py +272 -272
- StreamingCommunity/Api/Site/1337xx/__init__.py +51 -50
- StreamingCommunity/Api/Site/1337xx/costant.py +14 -14
- StreamingCommunity/Api/Site/1337xx/site.py +87 -89
- StreamingCommunity/Api/Site/1337xx/title.py +63 -64
- StreamingCommunity/Api/Site/altadefinizionegratis/__init__.py +74 -50
- StreamingCommunity/Api/Site/altadefinizionegratis/costant.py +21 -19
- StreamingCommunity/Api/Site/altadefinizionegratis/film.py +81 -72
- StreamingCommunity/Api/Site/altadefinizionegratis/site.py +116 -94
- StreamingCommunity/Api/Site/animeunity/__init__.py +75 -50
- StreamingCommunity/Api/Site/animeunity/costant.py +21 -19
- StreamingCommunity/Api/Site/animeunity/film_serie.py +172 -134
- StreamingCommunity/Api/Site/animeunity/site.py +191 -174
- StreamingCommunity/Api/Site/animeunity/util/ScrapeSerie.py +97 -97
- StreamingCommunity/Api/Site/cb01new/__init__.py +51 -51
- StreamingCommunity/Api/Site/cb01new/costant.py +19 -19
- StreamingCommunity/Api/Site/cb01new/film.py +61 -71
- StreamingCommunity/Api/Site/cb01new/site.py +82 -82
- StreamingCommunity/Api/Site/ddlstreamitaly/__init__.py +55 -55
- StreamingCommunity/Api/Site/ddlstreamitaly/costant.py +20 -20
- StreamingCommunity/Api/Site/ddlstreamitaly/series.py +150 -145
- StreamingCommunity/Api/Site/ddlstreamitaly/site.py +98 -98
- StreamingCommunity/Api/Site/ddlstreamitaly/util/ScrapeSerie.py +84 -84
- StreamingCommunity/Api/Site/guardaserie/__init__.py +50 -50
- StreamingCommunity/Api/Site/guardaserie/costant.py +19 -19
- StreamingCommunity/Api/Site/guardaserie/series.py +200 -198
- StreamingCommunity/Api/Site/guardaserie/site.py +89 -89
- StreamingCommunity/Api/Site/guardaserie/util/ScrapeSerie.py +110 -110
- StreamingCommunity/Api/Site/ilcorsaronero/__init__.py +51 -51
- StreamingCommunity/Api/Site/ilcorsaronero/costant.py +18 -18
- StreamingCommunity/Api/Site/ilcorsaronero/site.py +71 -71
- StreamingCommunity/Api/Site/ilcorsaronero/title.py +44 -44
- StreamingCommunity/Api/Site/ilcorsaronero/util/ilCorsarScraper.py +149 -149
- StreamingCommunity/Api/Site/mostraguarda/__init__.py +48 -48
- StreamingCommunity/Api/Site/mostraguarda/costant.py +18 -18
- StreamingCommunity/Api/Site/mostraguarda/film.py +90 -101
- StreamingCommunity/Api/Site/streamingcommunity/__init__.py +79 -55
- StreamingCommunity/Api/Site/streamingcommunity/costant.py +21 -19
- StreamingCommunity/Api/Site/streamingcommunity/film.py +86 -75
- StreamingCommunity/Api/Site/streamingcommunity/series.py +260 -207
- StreamingCommunity/Api/Site/streamingcommunity/site.py +156 -142
- StreamingCommunity/Api/Site/streamingcommunity/util/ScrapeSerie.py +124 -124
- StreamingCommunity/Api/Template/Class/SearchType.py +101 -101
- StreamingCommunity/Api/Template/Util/__init__.py +4 -4
- StreamingCommunity/Api/Template/Util/get_domain.py +201 -201
- StreamingCommunity/Api/Template/Util/manage_ep.py +178 -178
- StreamingCommunity/Api/Template/Util/recall_search.py +37 -37
- StreamingCommunity/Api/Template/__init__.py +2 -2
- StreamingCommunity/Api/Template/site.py +87 -87
- StreamingCommunity/Lib/Downloader/HLS/downloader.py +529 -1008
- StreamingCommunity/Lib/Downloader/HLS/proxyes.py +110 -110
- StreamingCommunity/Lib/Downloader/HLS/segments.py +446 -573
- StreamingCommunity/Lib/Downloader/MP4/downloader.py +181 -155
- StreamingCommunity/Lib/Downloader/TOR/downloader.py +297 -295
- StreamingCommunity/Lib/Downloader/__init__.py +4 -4
- StreamingCommunity/Lib/FFmpeg/__init__.py +4 -4
- StreamingCommunity/Lib/FFmpeg/capture.py +170 -170
- StreamingCommunity/Lib/FFmpeg/command.py +264 -296
- StreamingCommunity/Lib/FFmpeg/util.py +248 -248
- StreamingCommunity/Lib/M3U8/__init__.py +5 -5
- StreamingCommunity/Lib/M3U8/decryptor.py +164 -164
- StreamingCommunity/Lib/M3U8/estimator.py +146 -228
- StreamingCommunity/Lib/M3U8/parser.py +666 -666
- StreamingCommunity/Lib/M3U8/url_fixer.py +57 -57
- StreamingCommunity/Lib/TMBD/__init__.py +1 -1
- StreamingCommunity/Lib/TMBD/obj_tmbd.py +39 -39
- StreamingCommunity/Lib/TMBD/tmdb.py +345 -345
- StreamingCommunity/TelegramHelp/__init__.py +0 -0
- StreamingCommunity/TelegramHelp/request_manager.py +82 -0
- StreamingCommunity/TelegramHelp/session.py +56 -0
- StreamingCommunity/TelegramHelp/telegram_bot.py +561 -0
- StreamingCommunity/Upload/update.py +75 -67
- StreamingCommunity/Upload/version.py +5 -5
- StreamingCommunity/Util/_jsonConfig.py +227 -228
- StreamingCommunity/Util/call_stack.py +42 -42
- StreamingCommunity/Util/color.py +20 -20
- StreamingCommunity/Util/console.py +12 -12
- StreamingCommunity/Util/ffmpeg_installer.py +342 -370
- StreamingCommunity/Util/headers.py +159 -159
- StreamingCommunity/Util/logger.py +61 -61
- StreamingCommunity/Util/message.py +36 -64
- StreamingCommunity/Util/os.py +500 -507
- StreamingCommunity/Util/table.py +271 -228
- StreamingCommunity/run.py +352 -245
- {StreamingCommunity-2.5.2.dist-info → StreamingCommunity-2.5.6.dist-info}/LICENSE +674 -674
- {StreamingCommunity-2.5.2.dist-info → StreamingCommunity-2.5.6.dist-info}/METADATA +601 -543
- StreamingCommunity-2.5.6.dist-info/RECORD +96 -0
- {StreamingCommunity-2.5.2.dist-info → StreamingCommunity-2.5.6.dist-info}/entry_points.txt +0 -1
- StreamingCommunity/Api/Player/Helper/Vixcloud/__pycache__/js_parser.cpython-313.pyc +0 -0
- StreamingCommunity/Api/Player/Helper/Vixcloud/__pycache__/js_parser.cpython-39.pyc +0 -0
- StreamingCommunity/Api/Player/Helper/Vixcloud/__pycache__/util.cpython-313.pyc +0 -0
- StreamingCommunity/Api/Player/Helper/Vixcloud/__pycache__/util.cpython-39.pyc +0 -0
- StreamingCommunity/Api/Player/__pycache__/ddl.cpython-313.pyc +0 -0
- StreamingCommunity/Api/Player/__pycache__/ddl.cpython-39.pyc +0 -0
- StreamingCommunity/Api/Player/__pycache__/maxstream.cpython-313.pyc +0 -0
- StreamingCommunity/Api/Player/__pycache__/maxstream.cpython-39.pyc +0 -0
- StreamingCommunity/Api/Player/__pycache__/supervideo.cpython-313.pyc +0 -0
- StreamingCommunity/Api/Player/__pycache__/supervideo.cpython-39.pyc +0 -0
- StreamingCommunity/Api/Player/__pycache__/vixcloud.cpython-313.pyc +0 -0
- StreamingCommunity/Api/Player/__pycache__/vixcloud.cpython-39.pyc +0 -0
- StreamingCommunity/Api/Site/1337xx/__pycache__/__init__.cpython-313.pyc +0 -0
- StreamingCommunity/Api/Site/1337xx/__pycache__/__init__.cpython-39.pyc +0 -0
- StreamingCommunity/Api/Site/1337xx/__pycache__/costant.cpython-313.pyc +0 -0
- StreamingCommunity/Api/Site/1337xx/__pycache__/costant.cpython-39.pyc +0 -0
- StreamingCommunity/Api/Site/1337xx/__pycache__/site.cpython-313.pyc +0 -0
- StreamingCommunity/Api/Site/1337xx/__pycache__/site.cpython-39.pyc +0 -0
- StreamingCommunity/Api/Site/1337xx/__pycache__/title.cpython-313.pyc +0 -0
- StreamingCommunity/Api/Site/1337xx/__pycache__/title.cpython-39.pyc +0 -0
- StreamingCommunity/Api/Site/altadefinizionegratis/__pycache__/__init__.cpython-313.pyc +0 -0
- StreamingCommunity/Api/Site/altadefinizionegratis/__pycache__/__init__.cpython-39.pyc +0 -0
- StreamingCommunity/Api/Site/altadefinizionegratis/__pycache__/costant.cpython-313.pyc +0 -0
- StreamingCommunity/Api/Site/altadefinizionegratis/__pycache__/costant.cpython-39.pyc +0 -0
- StreamingCommunity/Api/Site/altadefinizionegratis/__pycache__/film.cpython-313.pyc +0 -0
- StreamingCommunity/Api/Site/altadefinizionegratis/__pycache__/film.cpython-39.pyc +0 -0
- StreamingCommunity/Api/Site/altadefinizionegratis/__pycache__/site.cpython-313.pyc +0 -0
- StreamingCommunity/Api/Site/altadefinizionegratis/__pycache__/site.cpython-39.pyc +0 -0
- StreamingCommunity/Api/Site/animeunity/__pycache__/__init__.cpython-313.pyc +0 -0
- StreamingCommunity/Api/Site/animeunity/__pycache__/__init__.cpython-39.pyc +0 -0
- StreamingCommunity/Api/Site/animeunity/__pycache__/costant.cpython-313.pyc +0 -0
- StreamingCommunity/Api/Site/animeunity/__pycache__/costant.cpython-39.pyc +0 -0
- StreamingCommunity/Api/Site/animeunity/__pycache__/film_serie.cpython-313.pyc +0 -0
- StreamingCommunity/Api/Site/animeunity/__pycache__/film_serie.cpython-39.pyc +0 -0
- StreamingCommunity/Api/Site/animeunity/__pycache__/site.cpython-313.pyc +0 -0
- StreamingCommunity/Api/Site/animeunity/__pycache__/site.cpython-39.pyc +0 -0
- StreamingCommunity/Api/Site/animeunity/util/__pycache__/ScrapeSerie.cpython-313.pyc +0 -0
- StreamingCommunity/Api/Site/animeunity/util/__pycache__/ScrapeSerie.cpython-39.pyc +0 -0
- StreamingCommunity/Api/Site/cb01new/__pycache__/__init__.cpython-313.pyc +0 -0
- StreamingCommunity/Api/Site/cb01new/__pycache__/__init__.cpython-39.pyc +0 -0
- StreamingCommunity/Api/Site/cb01new/__pycache__/costant.cpython-313.pyc +0 -0
- StreamingCommunity/Api/Site/cb01new/__pycache__/costant.cpython-39.pyc +0 -0
- StreamingCommunity/Api/Site/cb01new/__pycache__/film.cpython-313.pyc +0 -0
- StreamingCommunity/Api/Site/cb01new/__pycache__/film.cpython-39.pyc +0 -0
- StreamingCommunity/Api/Site/cb01new/__pycache__/site.cpython-313.pyc +0 -0
- StreamingCommunity/Api/Site/cb01new/__pycache__/site.cpython-39.pyc +0 -0
- StreamingCommunity/Api/Site/ddlstreamitaly/__pycache__/__init__.cpython-313.pyc +0 -0
- StreamingCommunity/Api/Site/ddlstreamitaly/__pycache__/__init__.cpython-39.pyc +0 -0
- StreamingCommunity/Api/Site/ddlstreamitaly/__pycache__/costant.cpython-313.pyc +0 -0
- StreamingCommunity/Api/Site/ddlstreamitaly/__pycache__/costant.cpython-39.pyc +0 -0
- StreamingCommunity/Api/Site/ddlstreamitaly/__pycache__/series.cpython-313.pyc +0 -0
- StreamingCommunity/Api/Site/ddlstreamitaly/__pycache__/series.cpython-39.pyc +0 -0
- StreamingCommunity/Api/Site/ddlstreamitaly/__pycache__/site.cpython-313.pyc +0 -0
- StreamingCommunity/Api/Site/ddlstreamitaly/__pycache__/site.cpython-39.pyc +0 -0
- StreamingCommunity/Api/Site/ddlstreamitaly/util/__pycache__/ScrapeSerie.cpython-313.pyc +0 -0
- StreamingCommunity/Api/Site/ddlstreamitaly/util/__pycache__/ScrapeSerie.cpython-39.pyc +0 -0
- StreamingCommunity/Api/Site/guardaserie/__pycache__/__init__.cpython-313.pyc +0 -0
- StreamingCommunity/Api/Site/guardaserie/__pycache__/__init__.cpython-39.pyc +0 -0
- StreamingCommunity/Api/Site/guardaserie/__pycache__/costant.cpython-313.pyc +0 -0
- StreamingCommunity/Api/Site/guardaserie/__pycache__/costant.cpython-39.pyc +0 -0
- StreamingCommunity/Api/Site/guardaserie/__pycache__/series.cpython-313.pyc +0 -0
- StreamingCommunity/Api/Site/guardaserie/__pycache__/series.cpython-39.pyc +0 -0
- StreamingCommunity/Api/Site/guardaserie/__pycache__/site.cpython-313.pyc +0 -0
- StreamingCommunity/Api/Site/guardaserie/__pycache__/site.cpython-39.pyc +0 -0
- StreamingCommunity/Api/Site/guardaserie/util/__pycache__/ScrapeSerie.cpython-313.pyc +0 -0
- StreamingCommunity/Api/Site/guardaserie/util/__pycache__/ScrapeSerie.cpython-39.pyc +0 -0
- StreamingCommunity/Api/Site/ilcorsaronero/__pycache__/__init__.cpython-313.pyc +0 -0
- StreamingCommunity/Api/Site/ilcorsaronero/__pycache__/__init__.cpython-39.pyc +0 -0
- StreamingCommunity/Api/Site/ilcorsaronero/__pycache__/costant.cpython-313.pyc +0 -0
- StreamingCommunity/Api/Site/ilcorsaronero/__pycache__/costant.cpython-39.pyc +0 -0
- StreamingCommunity/Api/Site/ilcorsaronero/__pycache__/site.cpython-313.pyc +0 -0
- StreamingCommunity/Api/Site/ilcorsaronero/__pycache__/site.cpython-39.pyc +0 -0
- StreamingCommunity/Api/Site/ilcorsaronero/__pycache__/title.cpython-313.pyc +0 -0
- StreamingCommunity/Api/Site/ilcorsaronero/__pycache__/title.cpython-39.pyc +0 -0
- StreamingCommunity/Api/Site/ilcorsaronero/util/__pycache__/ilCorsarScraper.cpython-313.pyc +0 -0
- StreamingCommunity/Api/Site/ilcorsaronero/util/__pycache__/ilCorsarScraper.cpython-39.pyc +0 -0
- StreamingCommunity/Api/Site/mostraguarda/__pycache__/__init__.cpython-313.pyc +0 -0
- StreamingCommunity/Api/Site/mostraguarda/__pycache__/__init__.cpython-39.pyc +0 -0
- StreamingCommunity/Api/Site/mostraguarda/__pycache__/costant.cpython-313.pyc +0 -0
- StreamingCommunity/Api/Site/mostraguarda/__pycache__/costant.cpython-39.pyc +0 -0
- StreamingCommunity/Api/Site/mostraguarda/__pycache__/film.cpython-313.pyc +0 -0
- StreamingCommunity/Api/Site/mostraguarda/__pycache__/film.cpython-39.pyc +0 -0
- StreamingCommunity/Api/Site/streamingcommunity/__pycache__/__init__.cpython-313.pyc +0 -0
- StreamingCommunity/Api/Site/streamingcommunity/__pycache__/__init__.cpython-39.pyc +0 -0
- StreamingCommunity/Api/Site/streamingcommunity/__pycache__/costant.cpython-313.pyc +0 -0
- StreamingCommunity/Api/Site/streamingcommunity/__pycache__/costant.cpython-39.pyc +0 -0
- StreamingCommunity/Api/Site/streamingcommunity/__pycache__/film.cpython-313.pyc +0 -0
- StreamingCommunity/Api/Site/streamingcommunity/__pycache__/film.cpython-39.pyc +0 -0
- StreamingCommunity/Api/Site/streamingcommunity/__pycache__/series.cpython-313.pyc +0 -0
- StreamingCommunity/Api/Site/streamingcommunity/__pycache__/series.cpython-39.pyc +0 -0
- StreamingCommunity/Api/Site/streamingcommunity/__pycache__/site.cpython-313.pyc +0 -0
- StreamingCommunity/Api/Site/streamingcommunity/__pycache__/site.cpython-39.pyc +0 -0
- StreamingCommunity/Api/Site/streamingcommunity/util/__pycache__/ScrapeSerie.cpython-313.pyc +0 -0
- StreamingCommunity/Api/Site/streamingcommunity/util/__pycache__/ScrapeSerie.cpython-39.pyc +0 -0
- StreamingCommunity/Api/Template/Class/__pycache__/SearchType.cpython-313.pyc +0 -0
- StreamingCommunity/Api/Template/Class/__pycache__/SearchType.cpython-39.pyc +0 -0
- StreamingCommunity/Api/Template/Util/__pycache__/__init__.cpython-313.pyc +0 -0
- StreamingCommunity/Api/Template/Util/__pycache__/__init__.cpython-39.pyc +0 -0
- StreamingCommunity/Api/Template/Util/__pycache__/get_domain.cpython-313.pyc +0 -0
- StreamingCommunity/Api/Template/Util/__pycache__/get_domain.cpython-39.pyc +0 -0
- StreamingCommunity/Api/Template/Util/__pycache__/manage_ep.cpython-313.pyc +0 -0
- StreamingCommunity/Api/Template/Util/__pycache__/manage_ep.cpython-39.pyc +0 -0
- StreamingCommunity/Api/Template/Util/__pycache__/recall_search.cpython-313.pyc +0 -0
- StreamingCommunity/Api/Template/Util/__pycache__/recall_search.cpython-39.pyc +0 -0
- StreamingCommunity/Api/Template/__pycache__/__init__.cpython-313.pyc +0 -0
- StreamingCommunity/Api/Template/__pycache__/__init__.cpython-39.pyc +0 -0
- StreamingCommunity/Api/Template/__pycache__/site.cpython-313.pyc +0 -0
- StreamingCommunity/Api/Template/__pycache__/site.cpython-39.pyc +0 -0
- StreamingCommunity/Lib/Downloader/HLS/__pycache__/downloader.cpython-313.pyc +0 -0
- StreamingCommunity/Lib/Downloader/HLS/__pycache__/downloader.cpython-39.pyc +0 -0
- StreamingCommunity/Lib/Downloader/HLS/__pycache__/proxyes.cpython-313.pyc +0 -0
- StreamingCommunity/Lib/Downloader/HLS/__pycache__/proxyes.cpython-39.pyc +0 -0
- StreamingCommunity/Lib/Downloader/HLS/__pycache__/segments.cpython-313.pyc +0 -0
- StreamingCommunity/Lib/Downloader/HLS/__pycache__/segments.cpython-39.pyc +0 -0
- StreamingCommunity/Lib/Downloader/MP4/__pycache__/downloader.cpython-313.pyc +0 -0
- StreamingCommunity/Lib/Downloader/MP4/__pycache__/downloader.cpython-39.pyc +0 -0
- StreamingCommunity/Lib/Downloader/TOR/__pycache__/downloader.cpython-313.pyc +0 -0
- StreamingCommunity/Lib/Downloader/TOR/__pycache__/downloader.cpython-39.pyc +0 -0
- StreamingCommunity/Lib/Downloader/__pycache__/__init__.cpython-313.pyc +0 -0
- StreamingCommunity/Lib/Downloader/__pycache__/__init__.cpython-39.pyc +0 -0
- StreamingCommunity/Lib/FFmpeg/__pycache__/__init__.cpython-313.pyc +0 -0
- StreamingCommunity/Lib/FFmpeg/__pycache__/__init__.cpython-39.pyc +0 -0
- StreamingCommunity/Lib/FFmpeg/__pycache__/capture.cpython-313.pyc +0 -0
- StreamingCommunity/Lib/FFmpeg/__pycache__/capture.cpython-39.pyc +0 -0
- StreamingCommunity/Lib/FFmpeg/__pycache__/command.cpython-313.pyc +0 -0
- StreamingCommunity/Lib/FFmpeg/__pycache__/command.cpython-39.pyc +0 -0
- StreamingCommunity/Lib/FFmpeg/__pycache__/util.cpython-313.pyc +0 -0
- StreamingCommunity/Lib/FFmpeg/__pycache__/util.cpython-39.pyc +0 -0
- StreamingCommunity/Lib/M3U8/__pycache__/__init__.cpython-313.pyc +0 -0
- StreamingCommunity/Lib/M3U8/__pycache__/__init__.cpython-39.pyc +0 -0
- StreamingCommunity/Lib/M3U8/__pycache__/decryptor.cpython-313.pyc +0 -0
- StreamingCommunity/Lib/M3U8/__pycache__/decryptor.cpython-39.pyc +0 -0
- StreamingCommunity/Lib/M3U8/__pycache__/estimator.cpython-313.pyc +0 -0
- StreamingCommunity/Lib/M3U8/__pycache__/estimator.cpython-39.pyc +0 -0
- StreamingCommunity/Lib/M3U8/__pycache__/parser.cpython-313.pyc +0 -0
- StreamingCommunity/Lib/M3U8/__pycache__/parser.cpython-39.pyc +0 -0
- StreamingCommunity/Lib/M3U8/__pycache__/url_fixer.cpython-313.pyc +0 -0
- StreamingCommunity/Lib/M3U8/__pycache__/url_fixer.cpython-39.pyc +0 -0
- StreamingCommunity/Lib/TMBD/__pycache__/__init__.cpython-313.pyc +0 -0
- StreamingCommunity/Lib/TMBD/__pycache__/__init__.cpython-39.pyc +0 -0
- StreamingCommunity/Lib/TMBD/__pycache__/obj_tmbd.cpython-313.pyc +0 -0
- StreamingCommunity/Lib/TMBD/__pycache__/obj_tmbd.cpython-39.pyc +0 -0
- StreamingCommunity/Lib/TMBD/__pycache__/tmdb.cpython-313.pyc +0 -0
- StreamingCommunity/Lib/TMBD/__pycache__/tmdb.cpython-39.pyc +0 -0
- StreamingCommunity/Upload/__pycache__/update.cpython-313.pyc +0 -0
- StreamingCommunity/Upload/__pycache__/update.cpython-39.pyc +0 -0
- StreamingCommunity/Upload/__pycache__/version.cpython-313.pyc +0 -0
- StreamingCommunity/Upload/__pycache__/version.cpython-39.pyc +0 -0
- StreamingCommunity/Util/__pycache__/_jsonConfig.cpython-313.pyc +0 -0
- StreamingCommunity/Util/__pycache__/_jsonConfig.cpython-39.pyc +0 -0
- StreamingCommunity/Util/__pycache__/call_stack.cpython-313.pyc +0 -0
- StreamingCommunity/Util/__pycache__/call_stack.cpython-39.pyc +0 -0
- StreamingCommunity/Util/__pycache__/color.cpython-313.pyc +0 -0
- StreamingCommunity/Util/__pycache__/color.cpython-39.pyc +0 -0
- StreamingCommunity/Util/__pycache__/console.cpython-313.pyc +0 -0
- StreamingCommunity/Util/__pycache__/console.cpython-39.pyc +0 -0
- StreamingCommunity/Util/__pycache__/ffmpeg_installer.cpython-313.pyc +0 -0
- StreamingCommunity/Util/__pycache__/ffmpeg_installer.cpython-39.pyc +0 -0
- StreamingCommunity/Util/__pycache__/headers.cpython-313.pyc +0 -0
- StreamingCommunity/Util/__pycache__/headers.cpython-39.pyc +0 -0
- StreamingCommunity/Util/__pycache__/logger.cpython-313.pyc +0 -0
- StreamingCommunity/Util/__pycache__/logger.cpython-39.pyc +0 -0
- StreamingCommunity/Util/__pycache__/message.cpython-313.pyc +0 -0
- StreamingCommunity/Util/__pycache__/message.cpython-39.pyc +0 -0
- StreamingCommunity/Util/__pycache__/os.cpython-313.pyc +0 -0
- StreamingCommunity/Util/__pycache__/os.cpython-39.pyc +0 -0
- StreamingCommunity/Util/__pycache__/table.cpython-313.pyc +0 -0
- StreamingCommunity/Util/__pycache__/table.cpython-39.pyc +0 -0
- StreamingCommunity/__pycache__/__init__.cpython-313.pyc +0 -0
- StreamingCommunity/__pycache__/__init__.cpython-39.pyc +0 -0
- StreamingCommunity/__pycache__/run.cpython-313.pyc +0 -0
- StreamingCommunity/__pycache__/run.cpython-39.pyc +0 -0
- StreamingCommunity-2.5.2.dist-info/RECORD +0 -264
- {StreamingCommunity-2.5.2.dist-info → StreamingCommunity-2.5.6.dist-info}/WHEEL +0 -0
- {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
|
"""
|