StreamingCommunity 3.0.7__py3-none-any.whl → 3.0.9__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/Site/animeworld/util/ScrapeSerie.py +2 -1
- StreamingCommunity/Api/Site/raiplay/__init__.py +1 -1
- StreamingCommunity/Api/Site/raiplay/site.py +26 -94
- StreamingCommunity/Api/Site/raiplay/util/ScrapeSerie.py +37 -17
- StreamingCommunity/Api/Site/streamingcommunity/__init__.py +6 -4
- StreamingCommunity/Upload/version.py +1 -1
- StreamingCommunity/Util/config_json.py +16 -21
- StreamingCommunity/Util/os.py +49 -31
- StreamingCommunity/run.py +14 -3
- {streamingcommunity-3.0.7.dist-info → streamingcommunity-3.0.9.dist-info}/METADATA +2 -2
- {streamingcommunity-3.0.7.dist-info → streamingcommunity-3.0.9.dist-info}/RECORD +15 -15
- {streamingcommunity-3.0.7.dist-info → streamingcommunity-3.0.9.dist-info}/WHEEL +1 -1
- {streamingcommunity-3.0.7.dist-info → streamingcommunity-3.0.9.dist-info}/entry_points.txt +0 -0
- {streamingcommunity-3.0.7.dist-info → streamingcommunity-3.0.9.dist-info}/licenses/LICENSE +0 -0
- {streamingcommunity-3.0.7.dist-info → streamingcommunity-3.0.9.dist-info}/top_level.txt +0 -0
|
@@ -1,9 +1,5 @@
|
|
|
1
1
|
# 21.05.24
|
|
2
2
|
|
|
3
|
-
import threading
|
|
4
|
-
import queue
|
|
5
|
-
|
|
6
|
-
|
|
7
3
|
# External libraries
|
|
8
4
|
import httpx
|
|
9
5
|
from rich.console import Console
|
|
@@ -13,12 +9,9 @@ from rich.console import Console
|
|
|
13
9
|
from StreamingCommunity.Util.config_json import config_manager
|
|
14
10
|
from StreamingCommunity.Util.headers import get_userAgent
|
|
15
11
|
from StreamingCommunity.Util.table import TVShowManager
|
|
16
|
-
from StreamingCommunity.Lib.TMBD.tmdb import tmdb
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
# Logic class
|
|
20
12
|
from StreamingCommunity.Api.Template.config_loader import site_constant
|
|
21
13
|
from StreamingCommunity.Api.Template.Class.SearchType import MediaManager
|
|
14
|
+
from .util.ScrapeSerie import GetSerieInfo
|
|
22
15
|
|
|
23
16
|
|
|
24
17
|
# Variable
|
|
@@ -26,76 +19,33 @@ console = Console()
|
|
|
26
19
|
media_search_manager = MediaManager()
|
|
27
20
|
table_show_manager = TVShowManager()
|
|
28
21
|
max_timeout = config_manager.get_int("REQUESTS", "timeout")
|
|
29
|
-
MAX_THREADS = 12
|
|
30
22
|
|
|
31
23
|
|
|
32
|
-
def determine_media_type(
|
|
24
|
+
def determine_media_type(item):
|
|
33
25
|
"""
|
|
34
|
-
|
|
26
|
+
Determine if the item is a film or TV series by checking actual seasons count
|
|
27
|
+
using GetSerieInfo.
|
|
35
28
|
"""
|
|
36
29
|
try:
|
|
37
|
-
#
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
# If results found in only one category, use that
|
|
46
|
-
if movie_count > 0 and tv_count == 0:
|
|
30
|
+
# Extract program name from path_id
|
|
31
|
+
program_name = None
|
|
32
|
+
if item.get('path_id'):
|
|
33
|
+
parts = item['path_id'].strip('/').split('/')
|
|
34
|
+
if len(parts) >= 2:
|
|
35
|
+
program_name = parts[-1].split('.')[0]
|
|
36
|
+
|
|
37
|
+
if not program_name:
|
|
47
38
|
return "film"
|
|
48
|
-
elif tv_count > 0 and movie_count == 0:
|
|
49
|
-
return "tv"
|
|
50
|
-
|
|
51
|
-
# If both have results, compare popularity
|
|
52
|
-
if movie_count > 0 and tv_count > 0:
|
|
53
|
-
top_movie = movie_results["results"][0]
|
|
54
|
-
top_tv = tv_results["results"][0]
|
|
55
|
-
|
|
56
|
-
return "film" if top_movie.get("popularity", 0) > top_tv.get("popularity", 0) else "tv"
|
|
57
39
|
|
|
58
|
-
|
|
40
|
+
scraper = GetSerieInfo(program_name)
|
|
41
|
+
scraper.collect_info_title()
|
|
42
|
+
return "tv" if scraper.getNumberSeason() > 0 else "film"
|
|
59
43
|
|
|
60
44
|
except Exception as e:
|
|
61
|
-
console.
|
|
45
|
+
console.print(f"[red]Error determining media type: {e}[/red]")
|
|
62
46
|
return "film"
|
|
63
47
|
|
|
64
48
|
|
|
65
|
-
def worker_determine_type(work_queue, result_dict, worker_id):
|
|
66
|
-
"""
|
|
67
|
-
Worker function to process items from queue and determine media types.
|
|
68
|
-
|
|
69
|
-
Parameters:
|
|
70
|
-
- work_queue: Queue containing items to process
|
|
71
|
-
- result_dict: Dictionary to store results
|
|
72
|
-
- worker_id: ID of the worker thread
|
|
73
|
-
"""
|
|
74
|
-
while not work_queue.empty():
|
|
75
|
-
try:
|
|
76
|
-
index, item = work_queue.get(block=False)
|
|
77
|
-
title = item.get('titolo', '')
|
|
78
|
-
media_type = determine_media_type(title)
|
|
79
|
-
|
|
80
|
-
result_dict[index] = {
|
|
81
|
-
'id': item.get('id', ''),
|
|
82
|
-
'name': title,
|
|
83
|
-
'type': media_type,
|
|
84
|
-
'path_id': item.get('path_id', ''),
|
|
85
|
-
'url': f"https://www.raiplay.it{item.get('url', '')}",
|
|
86
|
-
'image': f"https://www.raiplay.it{item.get('immagine', '')}",
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
work_queue.task_done()
|
|
90
|
-
|
|
91
|
-
except queue.Empty:
|
|
92
|
-
break
|
|
93
|
-
|
|
94
|
-
except Exception as e:
|
|
95
|
-
console.log(f"Worker {worker_id} error: {e}")
|
|
96
|
-
work_queue.task_done()
|
|
97
|
-
|
|
98
|
-
|
|
99
49
|
def title_search(query: str) -> int:
|
|
100
50
|
"""
|
|
101
51
|
Search for titles based on a search query.
|
|
@@ -141,33 +91,15 @@ def title_search(query: str) -> int:
|
|
|
141
91
|
data = response.json().get('agg').get('titoli').get('cards')
|
|
142
92
|
data = data[:15] if len(data) > 15 else data
|
|
143
93
|
|
|
144
|
-
#
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
for i in range(min(MAX_THREADS, len(data))):
|
|
155
|
-
thread = threading.Thread(
|
|
156
|
-
target=worker_determine_type,
|
|
157
|
-
args=(work_queue, result_dict, i),
|
|
158
|
-
daemon=True
|
|
159
|
-
)
|
|
160
|
-
threads.append(thread)
|
|
161
|
-
thread.start()
|
|
162
|
-
|
|
163
|
-
# Wait for all threads to complete
|
|
164
|
-
for thread in threads:
|
|
165
|
-
thread.join()
|
|
166
|
-
|
|
167
|
-
# Add all results to media manager in correct order
|
|
168
|
-
for i in range(len(data)):
|
|
169
|
-
if i in result_dict:
|
|
170
|
-
media_search_manager.add_media(result_dict[i])
|
|
94
|
+
# Process each item and add to media manager
|
|
95
|
+
for item in data:
|
|
96
|
+
media_search_manager.add_media({
|
|
97
|
+
'id': item.get('id', ''),
|
|
98
|
+
'name': item.get('titolo', ''),
|
|
99
|
+
'type': determine_media_type(item),
|
|
100
|
+
'path_id': item.get('path_id', ''),
|
|
101
|
+
'url': f"https://www.raiplay.it{item.get('url', '')}",
|
|
102
|
+
'image': f"https://www.raiplay.it{item.get('immagine', '')}",
|
|
103
|
+
})
|
|
171
104
|
|
|
172
|
-
# Return the number of titles found
|
|
173
105
|
return media_search_manager.get_length()
|
|
@@ -30,28 +30,48 @@ class GetSerieInfo:
|
|
|
30
30
|
try:
|
|
31
31
|
program_url = f"{self.base_url}/programmi/{self.program_name}.json"
|
|
32
32
|
response = httpx.get(url=program_url, headers=get_headers(), timeout=max_timeout)
|
|
33
|
+
|
|
34
|
+
# If 404, content is not yet available
|
|
35
|
+
if response.status_code == 404:
|
|
36
|
+
logging.info(f"Content not yet available: {self.program_name}")
|
|
37
|
+
return
|
|
38
|
+
|
|
33
39
|
response.raise_for_status()
|
|
34
|
-
|
|
35
40
|
json_data = response.json()
|
|
36
41
|
|
|
37
42
|
# Look for seasons in the 'blocks' property
|
|
38
|
-
for block in json_data.get('blocks'):
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
43
|
+
for block in json_data.get('blocks', []):
|
|
44
|
+
|
|
45
|
+
# Check if block is a season block or episodi block
|
|
46
|
+
if block.get('type') == 'RaiPlay Multimedia Block':
|
|
47
|
+
if block.get('name', '').lower() == 'episodi':
|
|
48
|
+
self.publishing_block_id = block.get('id')
|
|
49
|
+
|
|
50
|
+
# Extract seasons from sets array
|
|
51
|
+
for season_set in block.get('sets', []):
|
|
52
|
+
if 'stagione' in season_set.get('name', '').lower():
|
|
53
|
+
self._add_season(season_set, block.get('id'))
|
|
54
|
+
|
|
55
|
+
elif 'stagione' in block.get('name', '').lower():
|
|
56
|
+
self.publishing_block_id = block.get('id')
|
|
57
|
+
|
|
58
|
+
# Extract season directly from block's sets
|
|
59
|
+
for season_set in block.get('sets', []):
|
|
60
|
+
self._add_season(season_set, block.get('id'))
|
|
61
|
+
|
|
62
|
+
except httpx.HTTPError as e:
|
|
54
63
|
logging.error(f"Error collecting series info: {e}")
|
|
64
|
+
except Exception as e:
|
|
65
|
+
logging.error(f"Unexpected error collecting series info: {e}")
|
|
66
|
+
|
|
67
|
+
def _add_season(self, season_set: dict, block_id: str):
|
|
68
|
+
self.seasons_manager.add_season({
|
|
69
|
+
'id': season_set.get('id', ''),
|
|
70
|
+
'number': len(self.seasons_manager.seasons) + 1,
|
|
71
|
+
'name': season_set.get('name', ''),
|
|
72
|
+
'path': season_set.get('path_id', ''),
|
|
73
|
+
'episodes_count': season_set.get('episode_size', {}).get('number', 0)
|
|
74
|
+
})
|
|
55
75
|
|
|
56
76
|
def collect_info_season(self, number_season: int) -> None:
|
|
57
77
|
"""Get episodes for a specific season."""
|
|
@@ -121,14 +121,16 @@ def search(string_to_search: str = None, get_onlyDatabase: bool = False, direct_
|
|
|
121
121
|
if site_constant.TELEGRAM_BOT:
|
|
122
122
|
bot = get_bot_instance()
|
|
123
123
|
|
|
124
|
+
# Check proxy if not already set
|
|
125
|
+
finder = ProxyFinder(site_constant.FULL_URL)
|
|
126
|
+
proxy = finder.find_fast_proxy()
|
|
127
|
+
|
|
124
128
|
if direct_item:
|
|
125
129
|
select_title_obj = MediaItem(**direct_item)
|
|
126
130
|
process_search_result(select_title_obj, selections, proxy)
|
|
127
131
|
return
|
|
128
132
|
|
|
129
|
-
|
|
130
|
-
finder = ProxyFinder(site_constant.FULL_URL)
|
|
131
|
-
proxy = finder.find_fast_proxy()
|
|
133
|
+
|
|
132
134
|
|
|
133
135
|
actual_search_query = get_user_input(string_to_search)
|
|
134
136
|
|
|
@@ -142,7 +144,7 @@ def search(string_to_search: str = None, get_onlyDatabase: bool = False, direct_
|
|
|
142
144
|
# Perform search on the database using the obtained query
|
|
143
145
|
finder = ProxyFinder(site_constant.FULL_URL)
|
|
144
146
|
proxy = finder.find_fast_proxy()
|
|
145
|
-
len_database = title_search(
|
|
147
|
+
len_database = title_search(actual_search_query, proxy)
|
|
146
148
|
|
|
147
149
|
# If only the database object (media_search_manager populated by title_search) is needed
|
|
148
150
|
if get_onlyDatabase:
|
|
@@ -39,9 +39,6 @@ class ConfigManager:
|
|
|
39
39
|
|
|
40
40
|
# Get the actual path of the module file
|
|
41
41
|
current_file_path = os.path.abspath(__file__)
|
|
42
|
-
# Navigate upwards to find the project root
|
|
43
|
-
# Assuming this file is in a package structure like StreamingCommunity/Util/config_json.py
|
|
44
|
-
# We need to go up 2 levels to reach the project root
|
|
45
42
|
base_path = os.path.dirname(os.path.dirname(os.path.dirname(current_file_path)))
|
|
46
43
|
|
|
47
44
|
# Initialize file paths
|
|
@@ -271,33 +268,32 @@ class ConfigManager:
|
|
|
271
268
|
self._load_site_data_from_file()
|
|
272
269
|
|
|
273
270
|
def _load_site_data_from_api(self) -> None:
|
|
274
|
-
"""Load site data from
|
|
271
|
+
"""Load site data from GitHub."""
|
|
272
|
+
domains_github_url = "https://raw.githubusercontent.com/Arrowar/StreamingCommunity/refs/heads/main/.github/.domain/domains.json"
|
|
275
273
|
headers = {
|
|
276
|
-
"
|
|
277
|
-
"Authorization": f"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6Inp2Zm5ncG94d3Jnc3duenl0YWRoIiwicm9sZSI6ImFub24iLCJpYXQiOjE3NDAxNTIxNjMsImV4cCI6MjA1NTcyODE2M30.FNTCCMwi0QaKjOu8gtZsT5yQttUW8QiDDGXmzkn89QE",
|
|
278
|
-
"Content-Type": "application/json",
|
|
279
|
-
"User-Agent": get_userAgent()
|
|
274
|
+
"User-Agent": get_userAgent()
|
|
280
275
|
}
|
|
281
276
|
|
|
282
277
|
try:
|
|
283
|
-
console.print("[bold cyan]Retrieving site data from
|
|
284
|
-
response = requests.get(
|
|
278
|
+
console.print(f"[bold cyan]Retrieving site data from GitHub:[/bold cyan] [green]{domains_github_url}[/green]")
|
|
279
|
+
response = requests.get(domains_github_url, timeout=8, headers=headers)
|
|
285
280
|
|
|
286
281
|
if response.ok:
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
else:
|
|
294
|
-
console.print("[bold yellow]API returned an empty data set[/bold yellow]")
|
|
282
|
+
self.configSite = response.json()
|
|
283
|
+
|
|
284
|
+
site_count = len(self.configSite) if isinstance(self.configSite, dict) else 0
|
|
285
|
+
console.print(f"[bold green]Site data loaded from GitHub:[/bold green] {site_count} streaming services found.")
|
|
286
|
+
|
|
295
287
|
else:
|
|
296
|
-
console.print(f"[bold red]
|
|
288
|
+
console.print(f"[bold red]GitHub request failed:[/bold red] HTTP {response.status_code}, {response.text[:100]}")
|
|
297
289
|
self._handle_site_data_fallback()
|
|
298
290
|
|
|
291
|
+
except json.JSONDecodeError as e:
|
|
292
|
+
console.print(f"[bold red]Error parsing JSON from GitHub:[/bold red] {str(e)}")
|
|
293
|
+
self._handle_site_data_fallback()
|
|
294
|
+
|
|
299
295
|
except Exception as e:
|
|
300
|
-
console.print(f"[bold red]
|
|
296
|
+
console.print(f"[bold red]GitHub connection error:[/bold red] {str(e)}")
|
|
301
297
|
self._handle_site_data_fallback()
|
|
302
298
|
|
|
303
299
|
def _load_site_data_from_file(self) -> None:
|
|
@@ -562,7 +558,6 @@ class ConfigManager:
|
|
|
562
558
|
return section in config_source
|
|
563
559
|
|
|
564
560
|
|
|
565
|
-
# Helper function to check the platform
|
|
566
561
|
def get_use_large_bar():
|
|
567
562
|
"""
|
|
568
563
|
Determine if the large bar feature should be enabled.
|
StreamingCommunity/Util/os.py
CHANGED
|
@@ -12,7 +12,7 @@ import inspect
|
|
|
12
12
|
import subprocess
|
|
13
13
|
import contextlib
|
|
14
14
|
import importlib.metadata
|
|
15
|
-
|
|
15
|
+
import socket
|
|
16
16
|
|
|
17
17
|
# External library
|
|
18
18
|
from unidecode import unidecode
|
|
@@ -283,44 +283,62 @@ class InternManager():
|
|
|
283
283
|
else:
|
|
284
284
|
return f"{bytes / (1024 * 1024):.2f} MB/s"
|
|
285
285
|
|
|
286
|
-
def check_dns_provider(self):
|
|
286
|
+
# def check_dns_provider(self):
|
|
287
|
+
# """
|
|
288
|
+
# Check if the system's current DNS server matches any known DNS providers.
|
|
289
|
+
|
|
290
|
+
# Returns:
|
|
291
|
+
# bool: True if the current DNS server matches a known provider,
|
|
292
|
+
# False if no match is found or in case of errors
|
|
293
|
+
# """
|
|
294
|
+
# dns_providers = {
|
|
295
|
+
# "Cloudflare": ["1.1.1.1", "1.0.0.1"],
|
|
296
|
+
# "Google": ["8.8.8.8", "8.8.4.4"],
|
|
297
|
+
# "OpenDNS": ["208.67.222.222", "208.67.220.220"],
|
|
298
|
+
# "Quad9": ["9.9.9.9", "149.112.112.112"],
|
|
299
|
+
# "AdGuard": ["94.140.14.14", "94.140.15.15"],
|
|
300
|
+
# "Comodo": ["8.26.56.26", "8.20.247.20"],
|
|
301
|
+
# "Level3": ["209.244.0.3", "209.244.0.4"],
|
|
302
|
+
# "Norton": ["199.85.126.10", "199.85.127.10"],
|
|
303
|
+
# "CleanBrowsing": ["185.228.168.9", "185.228.169.9"],
|
|
304
|
+
# "Yandex": ["77.88.8.8", "77.88.8.1"]
|
|
305
|
+
# }
|
|
306
|
+
|
|
307
|
+
# try:
|
|
308
|
+
# resolver = dns.resolver.Resolver()
|
|
309
|
+
# nameservers = resolver.nameservers
|
|
310
|
+
|
|
311
|
+
# if not nameservers:
|
|
312
|
+
# return False
|
|
313
|
+
|
|
314
|
+
# for server in nameservers:
|
|
315
|
+
# for provider, ips in dns_providers.items():
|
|
316
|
+
# if server in ips:
|
|
317
|
+
# return True
|
|
318
|
+
# return False
|
|
319
|
+
|
|
320
|
+
# except Exception:
|
|
321
|
+
# return False
|
|
322
|
+
|
|
323
|
+
def check_dns_resolve(self):
|
|
287
324
|
"""
|
|
288
|
-
Check if the system's current DNS server
|
|
325
|
+
Check if the system's current DNS server can resolve a domain name.
|
|
326
|
+
Works on both Windows and Unix-like systems.
|
|
289
327
|
|
|
290
328
|
Returns:
|
|
291
|
-
bool: True if the current DNS server
|
|
292
|
-
|
|
329
|
+
bool: True if the current DNS server can resolve a domain name,
|
|
330
|
+
False if can't resolve or in case of errors
|
|
293
331
|
"""
|
|
294
|
-
|
|
295
|
-
"Cloudflare": ["1.1.1.1", "1.0.0.1"],
|
|
296
|
-
"Google": ["8.8.8.8", "8.8.4.4"],
|
|
297
|
-
"OpenDNS": ["208.67.222.222", "208.67.220.220"],
|
|
298
|
-
"Quad9": ["9.9.9.9", "149.112.112.112"],
|
|
299
|
-
"AdGuard": ["94.140.14.14", "94.140.15.15"],
|
|
300
|
-
"Comodo": ["8.26.56.26", "8.20.247.20"],
|
|
301
|
-
"Level3": ["209.244.0.3", "209.244.0.4"],
|
|
302
|
-
"Norton": ["199.85.126.10", "199.85.127.10"],
|
|
303
|
-
"CleanBrowsing": ["185.228.168.9", "185.228.169.9"],
|
|
304
|
-
"Yandex": ["77.88.8.8", "77.88.8.1"]
|
|
305
|
-
}
|
|
332
|
+
test_domains = ["github.com", "google.com", "microsoft.com", "amazon.com"]
|
|
306
333
|
|
|
307
334
|
try:
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
for server in nameservers:
|
|
315
|
-
for provider, ips in dns_providers.items():
|
|
316
|
-
if server in ips:
|
|
317
|
-
return True
|
|
318
|
-
return False
|
|
319
|
-
|
|
320
|
-
except Exception:
|
|
335
|
+
for domain in test_domains:
|
|
336
|
+
# socket.gethostbyname() works consistently across all platforms
|
|
337
|
+
socket.gethostbyname(domain)
|
|
338
|
+
return True
|
|
339
|
+
except (socket.gaierror, socket.error):
|
|
321
340
|
return False
|
|
322
341
|
|
|
323
|
-
|
|
324
342
|
class OsSummary:
|
|
325
343
|
def __init__(self):
|
|
326
344
|
self.ffmpeg_path = None
|
StreamingCommunity/run.py
CHANGED
|
@@ -210,7 +210,19 @@ def main(script_id = 0):
|
|
|
210
210
|
log_not = Logger()
|
|
211
211
|
initialize()
|
|
212
212
|
|
|
213
|
-
if not internet_manager.check_dns_provider():
|
|
213
|
+
# if not internet_manager.check_dns_provider():
|
|
214
|
+
# print()
|
|
215
|
+
# console.print("[red]❌ ERROR: DNS configuration is required!")
|
|
216
|
+
# console.print("[red]The program cannot function correctly without proper DNS settings.")
|
|
217
|
+
# console.print("[yellow]Please configure one of these DNS servers:")
|
|
218
|
+
# console.print("[blue]• Cloudflare (1.1.1.1) 'https://developers.cloudflare.com/1.1.1.1/setup/windows/'")
|
|
219
|
+
# console.print("[blue]• Quad9 (9.9.9.9) 'https://docs.quad9.net/Setup_Guides/Windows/Windows_10/'")
|
|
220
|
+
# console.print("\n[yellow]⚠️ The program will not work until you configure your DNS settings.")
|
|
221
|
+
|
|
222
|
+
# time.sleep(2)
|
|
223
|
+
# msg.ask("[yellow]Press Enter to continue ...")
|
|
224
|
+
|
|
225
|
+
if not internet_manager.check_dns_resolve():
|
|
214
226
|
print()
|
|
215
227
|
console.print("[red]❌ ERROR: DNS configuration is required!")
|
|
216
228
|
console.print("[red]The program cannot function correctly without proper DNS settings.")
|
|
@@ -219,8 +231,7 @@ def main(script_id = 0):
|
|
|
219
231
|
console.print("[blue]• Quad9 (9.9.9.9) 'https://docs.quad9.net/Setup_Guides/Windows/Windows_10/'")
|
|
220
232
|
console.print("\n[yellow]⚠️ The program will not work until you configure your DNS settings.")
|
|
221
233
|
|
|
222
|
-
|
|
223
|
-
msg.ask("[yellow]Press Enter to continue ...")
|
|
234
|
+
os._exit(0)
|
|
224
235
|
|
|
225
236
|
# Load search functions
|
|
226
237
|
search_functions = load_search_functions()
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: StreamingCommunity
|
|
3
|
-
Version: 3.0.
|
|
3
|
+
Version: 3.0.9
|
|
4
4
|
Home-page: https://github.com/Lovi-0/StreamingCommunity
|
|
5
5
|
Author: Lovi-0
|
|
6
6
|
Project-URL: Bug Reports, https://github.com/Lovi-0/StreamingCommunity/issues
|
|
@@ -35,7 +35,7 @@ Dynamic: requires-dist
|
|
|
35
35
|
Dynamic: requires-python
|
|
36
36
|
|
|
37
37
|
<p align="center">
|
|
38
|
-
<img src="https://i.ibb.co/v6RnT0wY/s2.jpg" alt="Project Logo" width="
|
|
38
|
+
<img src="https://i.ibb.co/v6RnT0wY/s2.jpg" alt="Project Logo" width="450"/>
|
|
39
39
|
</p>
|
|
40
40
|
|
|
41
41
|
<p align="center">
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
StreamingCommunity/__init__.py,sha256=Cw-N0VCg7sef1WqdtvVwrhs1zc4LoUhs5C8k7vpM1lQ,207
|
|
2
2
|
StreamingCommunity/global_search.py,sha256=fAl_tRCP8SeQoBifXs7hGX9-7Bd9FlJw69NjsWNUUL0,12396
|
|
3
|
-
StreamingCommunity/run.py,sha256=
|
|
3
|
+
StreamingCommunity/run.py,sha256=IOMEMkfn4p5hoYbDO2JNt8kIxz3GvgXOn8puzkXjS4I,13067
|
|
4
4
|
StreamingCommunity/Api/Player/ddl.py,sha256=S3UZFonJl3d3xU1fQrosRFXFhwAm8hGVQ8Ff8g-6xSI,2071
|
|
5
5
|
StreamingCommunity/Api/Player/hdplayer.py,sha256=zfPcmtt8f-NfH9yapwwWpVSts-7s47vJ4_XHKJFg0i8,1875
|
|
6
6
|
StreamingCommunity/Api/Player/maxstream.py,sha256=6y2h7cMSA_kmaeiOWqqyMVBMrtX6HTt2WT0QXxirCxg,4839
|
|
@@ -28,7 +28,7 @@ StreamingCommunity/Api/Site/animeworld/__init__.py,sha256=fjStJyOl6VBVDgoi6wr2yA
|
|
|
28
28
|
StreamingCommunity/Api/Site/animeworld/film.py,sha256=W9KOS9Wvx3Mlqx5WojR-NgnF9WX8mI79JZPS7UwG-dc,1763
|
|
29
29
|
StreamingCommunity/Api/Site/animeworld/serie.py,sha256=MXyV1fK05jPW4iV9NWrRKW-R4ect-TSN78-2APayniU,3516
|
|
30
30
|
StreamingCommunity/Api/Site/animeworld/site.py,sha256=HBUAYiOa-UPGAO4lyTL1qIqqpDNVhWRHZ-nyLFltl7I,3702
|
|
31
|
-
StreamingCommunity/Api/Site/animeworld/util/ScrapeSerie.py,sha256=
|
|
31
|
+
StreamingCommunity/Api/Site/animeworld/util/ScrapeSerie.py,sha256=EDTouftxigb4ojTEGWC0sOgOLCNjE1-1GFEMrK-qzRQ,3615
|
|
32
32
|
StreamingCommunity/Api/Site/cb01new/__init__.py,sha256=95M3DiNbLbZ6v1oFkPuAPEVJWf12W2JzJvxZKjZs_V8,2071
|
|
33
33
|
StreamingCommunity/Api/Site/cb01new/film.py,sha256=vjd1ftm4LhxxG0TTKEwlOXtx0AYgxBbV5ZlQH8aSxGU,1695
|
|
34
34
|
StreamingCommunity/Api/Site/cb01new/site.py,sha256=82GPxjOyY7Dlj1WbA0YNovgbKhuF3Vmca07IVXGh6lE,2139
|
|
@@ -36,12 +36,12 @@ StreamingCommunity/Api/Site/guardaserie/__init__.py,sha256=vnbt1DVG6nmHaLSUOO_2N
|
|
|
36
36
|
StreamingCommunity/Api/Site/guardaserie/series.py,sha256=U9rMZCjRqHLFjo468vikxl-2RqO6DCJjebB-G8Y6LDg,6492
|
|
37
37
|
StreamingCommunity/Api/Site/guardaserie/site.py,sha256=6PPp6qykuKZ3Sa2uY7E1xTwh1-8vHINsEpokGnathmw,2326
|
|
38
38
|
StreamingCommunity/Api/Site/guardaserie/util/ScrapeSerie.py,sha256=_aXU-YcUtSwbC2b6QpNnWDZR8m6vp9xzBEx_zdu5tgI,4196
|
|
39
|
-
StreamingCommunity/Api/Site/raiplay/__init__.py,sha256=
|
|
39
|
+
StreamingCommunity/Api/Site/raiplay/__init__.py,sha256=6Hjkc_C0du_stc9cOKJIyWjW-YQPMmJLoLXZpiwX1S8,3106
|
|
40
40
|
StreamingCommunity/Api/Site/raiplay/film.py,sha256=wBv5kQXx7-aCKhAZ5LABZ8zUzu_jPGdXOl9OM2p8dpY,1982
|
|
41
41
|
StreamingCommunity/Api/Site/raiplay/series.py,sha256=uQVbeA_g3Z1Ciqeq99gsY2F8mC5DssH3ueGbCW8gd9Q,6161
|
|
42
|
-
StreamingCommunity/Api/Site/raiplay/site.py,sha256=
|
|
43
|
-
StreamingCommunity/Api/Site/raiplay/util/ScrapeSerie.py,sha256=
|
|
44
|
-
StreamingCommunity/Api/Site/streamingcommunity/__init__.py,sha256=
|
|
42
|
+
StreamingCommunity/Api/Site/raiplay/site.py,sha256=kWo2YPcUOPgsThJU_RahnDwJP4QpkmgzdzRqtoubR5U,3166
|
|
43
|
+
StreamingCommunity/Api/Site/raiplay/util/ScrapeSerie.py,sha256=V7fFP9KLuMXitRsHtInxUJBcGClfSk_tOUNWFC8pG5A,5807
|
|
44
|
+
StreamingCommunity/Api/Site/streamingcommunity/__init__.py,sha256=Qgy8nNtC05uwpSF6e0EE0WvsZkLKSKuqjWD1kligaPg,5977
|
|
45
45
|
StreamingCommunity/Api/Site/streamingcommunity/film.py,sha256=HMfDve_4xuxeYbenDt9H5MEf1FwQBZNAkpcJEbiMRqA,2609
|
|
46
46
|
StreamingCommunity/Api/Site/streamingcommunity/series.py,sha256=W1KHSrF_rVl757dtLugvqVm7HCjovCHaHZXoGSRjOoI,8903
|
|
47
47
|
StreamingCommunity/Api/Site/streamingcommunity/site.py,sha256=cqaVM4cNXVqN_5ImeS_c7FI6go3TZPKkDi3XbD93MSQ,4019
|
|
@@ -79,18 +79,18 @@ StreamingCommunity/TelegramHelp/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm
|
|
|
79
79
|
StreamingCommunity/TelegramHelp/config.json,sha256=x1rtclDIrlnFcmiAmCQnV3WpnlTl5ds1LRRqECIF7xk,1581
|
|
80
80
|
StreamingCommunity/TelegramHelp/telegram_bot.py,sha256=zCqj7xBofh9FYfEYl55mgT945jqtKo7qJhn-SMLvAvA,26455
|
|
81
81
|
StreamingCommunity/Upload/update.py,sha256=Tp7PdU49rk1bga76_DiaghrbE7Fb3p4iq5S4CqZZy2A,3462
|
|
82
|
-
StreamingCommunity/Upload/version.py,sha256=
|
|
82
|
+
StreamingCommunity/Upload/version.py,sha256=aTDk5HZGG-MlYRi76ZutQ0dPdPG1Lsm1cLMGSfgy38A,171
|
|
83
83
|
StreamingCommunity/Util/color.py,sha256=NvD0Eni-25oOOkY-szCEoc0lGvzQxyL7xhM0RE4EvUM,458
|
|
84
|
-
StreamingCommunity/Util/config_json.py,sha256=
|
|
84
|
+
StreamingCommunity/Util/config_json.py,sha256=bC55i7nJuBQSsdnqQo9QtW4l-Ho2BaF0pJhIVr0nJjA,24321
|
|
85
85
|
StreamingCommunity/Util/ffmpeg_installer.py,sha256=yRVIPwbh05tZ-duZmXkH0qasLNxaQCAT_E4cTP79Z3c,14890
|
|
86
86
|
StreamingCommunity/Util/headers.py,sha256=TItkaFMx1GqsVNEIS3Tr0BGU5EHyF-HkZVliHORT3P8,308
|
|
87
87
|
StreamingCommunity/Util/logger.py,sha256=9kGD6GmWj2pM8ADpJc85o7jm8DD0c5Aguqnq-9kmxos,3314
|
|
88
88
|
StreamingCommunity/Util/message.py,sha256=SJaIPLvWeQqsIODVUKw3TgYRmBChovmlbcF6OUxqMI8,1425
|
|
89
|
-
StreamingCommunity/Util/os.py,sha256=
|
|
89
|
+
StreamingCommunity/Util/os.py,sha256=zCPlV9hb8hbBJglwnrJU0XGhBu538x3zgdNO5sLQ73c,17176
|
|
90
90
|
StreamingCommunity/Util/table.py,sha256=Nw5PlsvfEIOQZWy5VhsU5OK3heuBXGwsqmLl0k8yQzc,9813
|
|
91
|
-
streamingcommunity-3.0.
|
|
92
|
-
streamingcommunity-3.0.
|
|
93
|
-
streamingcommunity-3.0.
|
|
94
|
-
streamingcommunity-3.0.
|
|
95
|
-
streamingcommunity-3.0.
|
|
96
|
-
streamingcommunity-3.0.
|
|
91
|
+
streamingcommunity-3.0.9.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
|
|
92
|
+
streamingcommunity-3.0.9.dist-info/METADATA,sha256=6QMVwuzxoNs3c1xmUXEe_XjNHDBK1_Wb2a70rJQOHqc,24958
|
|
93
|
+
streamingcommunity-3.0.9.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
94
|
+
streamingcommunity-3.0.9.dist-info/entry_points.txt,sha256=Qph9XYfDC8n4LfDLOSl6gJGlkb9eFb5f-JOr_Wb_5rk,67
|
|
95
|
+
streamingcommunity-3.0.9.dist-info/top_level.txt,sha256=YsOcxKP-WOhWpIWgBlh0coll9XUx7aqmRPT7kmt3fH0,19
|
|
96
|
+
streamingcommunity-3.0.9.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|