StreamingCommunity 1.9.8__py3-none-any.whl → 1.9.90__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 -0
- StreamingCommunity/Api/Player/Helper/Vixcloud/util.py +145 -0
- StreamingCommunity/Api/Player/ddl.py +89 -0
- StreamingCommunity/Api/Player/maxstream.py +151 -0
- StreamingCommunity/Api/Player/supervideo.py +194 -0
- StreamingCommunity/Api/Player/vixcloud.py +273 -0
- StreamingCommunity/Api/Site/1337xx/__init__.py +51 -0
- StreamingCommunity/Api/Site/1337xx/costant.py +15 -0
- StreamingCommunity/Api/Site/1337xx/site.py +86 -0
- StreamingCommunity/Api/Site/1337xx/title.py +66 -0
- StreamingCommunity/Api/Site/altadefinizione/__init__.py +51 -0
- StreamingCommunity/Api/Site/altadefinizione/costant.py +15 -0
- StreamingCommunity/Api/Site/altadefinizione/film.py +74 -0
- StreamingCommunity/Api/Site/altadefinizione/site.py +89 -0
- StreamingCommunity/Api/Site/animeunity/__init__.py +51 -0
- StreamingCommunity/Api/Site/animeunity/costant.py +15 -0
- StreamingCommunity/Api/Site/animeunity/film_serie.py +135 -0
- StreamingCommunity/Api/Site/animeunity/site.py +167 -0
- StreamingCommunity/Api/Site/animeunity/util/ScrapeSerie.py +97 -0
- StreamingCommunity/Api/Site/cb01new/__init__.py +52 -0
- StreamingCommunity/Api/Site/cb01new/costant.py +15 -0
- StreamingCommunity/Api/Site/cb01new/film.py +73 -0
- StreamingCommunity/Api/Site/cb01new/site.py +76 -0
- StreamingCommunity/Api/Site/ddlstreamitaly/__init__.py +58 -0
- StreamingCommunity/Api/Site/ddlstreamitaly/costant.py +16 -0
- StreamingCommunity/Api/Site/ddlstreamitaly/series.py +146 -0
- StreamingCommunity/Api/Site/ddlstreamitaly/site.py +95 -0
- StreamingCommunity/Api/Site/ddlstreamitaly/util/ScrapeSerie.py +85 -0
- StreamingCommunity/Api/Site/guardaserie/__init__.py +53 -0
- StreamingCommunity/Api/Site/guardaserie/costant.py +15 -0
- StreamingCommunity/Api/Site/guardaserie/series.py +199 -0
- StreamingCommunity/Api/Site/guardaserie/site.py +86 -0
- StreamingCommunity/Api/Site/guardaserie/util/ScrapeSerie.py +110 -0
- StreamingCommunity/Api/Site/ilcorsaronero/__init__.py +52 -0
- StreamingCommunity/Api/Site/ilcorsaronero/costant.py +15 -0
- StreamingCommunity/Api/Site/ilcorsaronero/site.py +63 -0
- StreamingCommunity/Api/Site/ilcorsaronero/title.py +46 -0
- StreamingCommunity/Api/Site/ilcorsaronero/util/ilCorsarScraper.py +141 -0
- StreamingCommunity/Api/Site/mostraguarda/__init__.py +49 -0
- StreamingCommunity/Api/Site/mostraguarda/costant.py +15 -0
- StreamingCommunity/Api/Site/mostraguarda/film.py +99 -0
- StreamingCommunity/Api/Site/streamingcommunity/__init__.py +56 -0
- StreamingCommunity/Api/Site/streamingcommunity/costant.py +15 -0
- StreamingCommunity/Api/Site/streamingcommunity/film.py +75 -0
- StreamingCommunity/Api/Site/streamingcommunity/series.py +206 -0
- StreamingCommunity/Api/Site/streamingcommunity/site.py +137 -0
- StreamingCommunity/Api/Site/streamingcommunity/util/ScrapeSerie.py +123 -0
- StreamingCommunity/Api/Template/Class/SearchType.py +101 -0
- StreamingCommunity/Api/Template/Util/__init__.py +5 -0
- StreamingCommunity/Api/Template/Util/get_domain.py +173 -0
- StreamingCommunity/Api/Template/Util/manage_ep.py +179 -0
- StreamingCommunity/Api/Template/Util/recall_search.py +37 -0
- StreamingCommunity/Api/Template/__init__.py +3 -0
- StreamingCommunity/Api/Template/site.py +87 -0
- StreamingCommunity/Lib/Downloader/HLS/downloader.py +946 -0
- StreamingCommunity/Lib/Downloader/HLS/proxyes.py +110 -0
- StreamingCommunity/Lib/Downloader/HLS/segments.py +561 -0
- StreamingCommunity/Lib/Downloader/MP4/downloader.py +155 -0
- StreamingCommunity/Lib/Downloader/TOR/downloader.py +296 -0
- StreamingCommunity/Lib/Downloader/__init__.py +5 -0
- StreamingCommunity/Lib/FFmpeg/__init__.py +4 -0
- StreamingCommunity/Lib/FFmpeg/capture.py +170 -0
- StreamingCommunity/Lib/FFmpeg/command.py +296 -0
- StreamingCommunity/Lib/FFmpeg/util.py +249 -0
- StreamingCommunity/Lib/M3U8/__init__.py +6 -0
- StreamingCommunity/Lib/M3U8/decryptor.py +164 -0
- StreamingCommunity/Lib/M3U8/estimator.py +176 -0
- StreamingCommunity/Lib/M3U8/parser.py +666 -0
- StreamingCommunity/Lib/M3U8/url_fixer.py +52 -0
- StreamingCommunity/Lib/TMBD/__init__.py +2 -0
- StreamingCommunity/Lib/TMBD/obj_tmbd.py +39 -0
- StreamingCommunity/Lib/TMBD/tmdb.py +346 -0
- StreamingCommunity/Upload/update.py +68 -0
- StreamingCommunity/Upload/version.py +5 -0
- StreamingCommunity/Util/_jsonConfig.py +204 -0
- StreamingCommunity/Util/call_stack.py +42 -0
- StreamingCommunity/Util/color.py +20 -0
- StreamingCommunity/Util/console.py +12 -0
- StreamingCommunity/Util/ffmpeg_installer.py +311 -0
- StreamingCommunity/Util/headers.py +147 -0
- StreamingCommunity/Util/logger.py +53 -0
- StreamingCommunity/Util/message.py +64 -0
- StreamingCommunity/Util/os.py +554 -0
- StreamingCommunity/Util/table.py +229 -0
- StreamingCommunity/__init__.py +0 -0
- StreamingCommunity/run.py +2 -2
- {StreamingCommunity-1.9.8.dist-info → StreamingCommunity-1.9.90.dist-info}/METADATA +7 -10
- StreamingCommunity-1.9.90.dist-info/RECORD +92 -0
- {StreamingCommunity-1.9.8.dist-info → StreamingCommunity-1.9.90.dist-info}/WHEEL +1 -1
- {StreamingCommunity-1.9.8.dist-info → StreamingCommunity-1.9.90.dist-info}/entry_points.txt +0 -1
- StreamingCommunity-1.9.8.dist-info/RECORD +0 -7
- {StreamingCommunity-1.9.8.dist-info → StreamingCommunity-1.9.90.dist-info}/LICENSE +0 -0
- {StreamingCommunity-1.9.8.dist-info → StreamingCommunity-1.9.90.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# 20.03.24
|
|
2
|
+
|
|
3
|
+
import logging
|
|
4
|
+
from urllib.parse import urlparse, urljoin
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class M3U8_UrlFix:
|
|
8
|
+
def __init__(self, url: str = None) -> None:
|
|
9
|
+
"""
|
|
10
|
+
Initializes an M3U8_UrlFix object with the provided playlist URL.
|
|
11
|
+
|
|
12
|
+
Parameters:
|
|
13
|
+
- url (str, optional): The URL of the playlist. Defaults to None.
|
|
14
|
+
"""
|
|
15
|
+
self.url_playlist: str = url
|
|
16
|
+
|
|
17
|
+
def set_playlist(self, url: str) -> None:
|
|
18
|
+
"""
|
|
19
|
+
Set the M3U8 playlist URL.
|
|
20
|
+
|
|
21
|
+
Parameters:
|
|
22
|
+
- url (str): The M3U8 playlist URL.
|
|
23
|
+
"""
|
|
24
|
+
self.url_playlist = url
|
|
25
|
+
|
|
26
|
+
def generate_full_url(self, url_resource: str) -> str:
|
|
27
|
+
"""
|
|
28
|
+
Generate a full URL for a given resource using the base URL from the playlist.
|
|
29
|
+
|
|
30
|
+
Parameters:
|
|
31
|
+
- url_resource (str): The relative URL of the resource within the playlist.
|
|
32
|
+
|
|
33
|
+
Returns:
|
|
34
|
+
str: The full URL for the specified resource.
|
|
35
|
+
"""
|
|
36
|
+
|
|
37
|
+
# Check if m3u8 url playlist is present
|
|
38
|
+
if self.url_playlist == None:
|
|
39
|
+
logging.error("[M3U8_UrlFix] Cant generate full url, playlist not present")
|
|
40
|
+
raise
|
|
41
|
+
|
|
42
|
+
# Parse the playlist URL to extract the base URL components
|
|
43
|
+
parsed_playlist_url = urlparse(self.url_playlist)
|
|
44
|
+
|
|
45
|
+
# Construct the base URL using the scheme, netloc, and path from the playlist URL
|
|
46
|
+
base_url = f"{parsed_playlist_url.scheme}://{parsed_playlist_url.netloc}{parsed_playlist_url.path}"
|
|
47
|
+
|
|
48
|
+
# Join the base URL with the relative resource URL to get the full URL
|
|
49
|
+
full_url = urljoin(base_url, url_resource)
|
|
50
|
+
|
|
51
|
+
return full_url
|
|
52
|
+
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# 17.09.24
|
|
2
|
+
|
|
3
|
+
from typing import Dict
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class Json_film:
|
|
7
|
+
def __init__(self, data: Dict):
|
|
8
|
+
self.adult = data.get('adult', False)
|
|
9
|
+
self.backdrop_path = data.get('backdrop_path')
|
|
10
|
+
self.budget = data.get('budget', 0)
|
|
11
|
+
self.homepage = data.get('homepage')
|
|
12
|
+
self.id = data.get('id', 0)
|
|
13
|
+
self.imdb_id = data.get('imdb_id')
|
|
14
|
+
self.origin_country = data.get('origin_country', [])
|
|
15
|
+
self.original_language = data.get('original_language')
|
|
16
|
+
self.original_title = data.get('original_title')
|
|
17
|
+
self.overview = data.get('overview')
|
|
18
|
+
self.popularity = data.get('popularity', 0.0)
|
|
19
|
+
self.poster_path = data.get('poster_path')
|
|
20
|
+
self.release_date = data.get('release_date')
|
|
21
|
+
self.revenue = data.get('revenue', 0)
|
|
22
|
+
self.runtime = data.get('runtime', 0)
|
|
23
|
+
self.status = data.get('status')
|
|
24
|
+
self.tagline = data.get('tagline')
|
|
25
|
+
self.title = data.get('title')
|
|
26
|
+
self.video = data.get('video', False)
|
|
27
|
+
self.vote_average = data.get('vote_average', 0.0)
|
|
28
|
+
self.vote_count = data.get('vote_count', 0)
|
|
29
|
+
|
|
30
|
+
def __repr__(self):
|
|
31
|
+
return (f"Film(adult={self.adult}, backdrop_path='{self.backdrop_path}', "
|
|
32
|
+
f"budget={self.budget}, "
|
|
33
|
+
f"homepage='{self.homepage}', id={self.id}, "
|
|
34
|
+
f"imdb_id='{self.imdb_id}', origin_country={self.origin_country}, "
|
|
35
|
+
f"original_language='{self.original_language}', original_title='{self.original_title}', "
|
|
36
|
+
f"overview='{self.overview}', popularity={self.popularity}, poster_path='{self.poster_path}', "
|
|
37
|
+
f"release_date='{self.release_date}', revenue={self.revenue}, runtime={self.runtime}, "
|
|
38
|
+
f"status='{self.status}', tagline='{self.tagline}', "
|
|
39
|
+
f"title='{self.title}', video={self.video}, vote_average={self.vote_average}, vote_count={self.vote_count})")
|
|
@@ -0,0 +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":
|
|
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
|
+
"""
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# 01.03.2023
|
|
2
|
+
|
|
3
|
+
import os
|
|
4
|
+
import sys
|
|
5
|
+
import time
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
# Internal utilities
|
|
9
|
+
from .version import __version__, __author__, __title__
|
|
10
|
+
from StreamingCommunity.Util.console import console
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
# External library
|
|
14
|
+
import httpx
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
# Variable
|
|
18
|
+
if getattr(sys, 'frozen', False): # Modalità PyInstaller
|
|
19
|
+
base_path = os.path.join(sys._MEIPASS, "StreamingCommunity")
|
|
20
|
+
else:
|
|
21
|
+
base_path = os.path.dirname(__file__)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def update():
|
|
25
|
+
"""
|
|
26
|
+
Check for updates on GitHub and display relevant information.
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
console.print("[green]Checking GitHub version [white]...")
|
|
30
|
+
|
|
31
|
+
# Make the GitHub API requests and handle potential errors
|
|
32
|
+
try:
|
|
33
|
+
response_reposity = httpx.get(f"https://api.github.com/repos/{__author__}/{__title__}").json()
|
|
34
|
+
response_releases = httpx.get(f"https://api.github.com/repos/{__author__}/{__title__}/releases").json()
|
|
35
|
+
|
|
36
|
+
except Exception as e:
|
|
37
|
+
console.print(f"[red]Error accessing GitHub API: {e}")
|
|
38
|
+
return
|
|
39
|
+
|
|
40
|
+
# Get stargazers count from the repository
|
|
41
|
+
stargazers_count = response_reposity.get('stargazers_count', 0)
|
|
42
|
+
|
|
43
|
+
# Calculate total download count from all releases
|
|
44
|
+
total_download_count = sum(asset['download_count'] for release in response_releases for asset in release.get('assets', []))
|
|
45
|
+
|
|
46
|
+
# Get latest version name
|
|
47
|
+
if response_releases:
|
|
48
|
+
last_version = response_releases[0].get('name', 'Unknown')
|
|
49
|
+
else:
|
|
50
|
+
last_version = 'Unknown'
|
|
51
|
+
|
|
52
|
+
# Calculate percentual of stars based on download count
|
|
53
|
+
if total_download_count > 0 and stargazers_count > 0:
|
|
54
|
+
percentual_stars = round(stargazers_count / total_download_count * 100, 2)
|
|
55
|
+
else:
|
|
56
|
+
percentual_stars = 0
|
|
57
|
+
|
|
58
|
+
# Check installed version
|
|
59
|
+
if str(__version__).replace('v', '') != str(last_version).replace('v', '') :
|
|
60
|
+
console.print(f"[red]New version available: [yellow]{last_version}")
|
|
61
|
+
else:
|
|
62
|
+
console.print(f"[red]Everything is up to date")
|
|
63
|
+
|
|
64
|
+
console.print("\n")
|
|
65
|
+
console.print(f"[red]{__title__} has been downloaded [yellow]{total_download_count} [red]times, but only [yellow]{percentual_stars}% [red]of users have starred it.\n\
|
|
66
|
+
[cyan]Help the repository grow today by leaving a [yellow]star [cyan]and [yellow]sharing [cyan]it with others online!")
|
|
67
|
+
|
|
68
|
+
time.sleep(3)
|