StreamingCommunity 2.9.9__py3-none-any.whl → 3.0.1__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/1337xx/__init__.py +1 -2
- StreamingCommunity/Api/Site/1337xx/site.py +10 -2
- StreamingCommunity/Api/Site/altadefinizione/__init__.py +1 -2
- StreamingCommunity/Api/Site/altadefinizione/site.py +6 -1
- StreamingCommunity/Api/Site/animeunity/__init__.py +1 -2
- StreamingCommunity/Api/Site/animeunity/site.py +63 -35
- StreamingCommunity/Api/Site/animeunity/util/ScrapeSerie.py +43 -29
- StreamingCommunity/Api/Site/animeworld/__init__.py +1 -2
- StreamingCommunity/Api/Site/animeworld/site.py +6 -1
- StreamingCommunity/Api/Site/ddlstreamitaly/__init__.py +1 -2
- StreamingCommunity/Api/Site/ddlstreamitaly/site.py +6 -1
- StreamingCommunity/Api/Site/guardaserie/__init__.py +1 -2
- StreamingCommunity/Api/Site/guardaserie/site.py +7 -1
- StreamingCommunity/Api/Site/raiplay/__init__.py +1 -2
- StreamingCommunity/Api/Site/raiplay/film.py +1 -1
- StreamingCommunity/Api/Site/raiplay/series.py +1 -1
- StreamingCommunity/Api/Site/raiplay/site.py +9 -2
- StreamingCommunity/Api/Site/raiplay/util/ScrapeSerie.py +1 -1
- StreamingCommunity/Api/Site/streamingcommunity/__init__.py +1 -2
- StreamingCommunity/Api/Site/streamingcommunity/site.py +7 -1
- StreamingCommunity/Lib/Downloader/HLS/segments.py +7 -15
- StreamingCommunity/Lib/Downloader/TOR/downloader.py +7 -14
- StreamingCommunity/Lib/FFmpeg/capture.py +1 -5
- StreamingCommunity/Lib/FFmpeg/util.py +48 -40
- StreamingCommunity/Lib/M3U8/estimator.py +20 -33
- StreamingCommunity/Upload/version.py +1 -1
- StreamingCommunity/Util/config_json.py +11 -13
- StreamingCommunity/Util/ffmpeg_installer.py +26 -1
- StreamingCommunity/Util/os.py +13 -15
- StreamingCommunity/global_search.py +1 -4
- StreamingCommunity/run.py +1 -4
- {streamingcommunity-2.9.9.dist-info → streamingcommunity-3.0.1.dist-info}/METADATA +1 -1
- {streamingcommunity-2.9.9.dist-info → streamingcommunity-3.0.1.dist-info}/RECORD +37 -40
- {streamingcommunity-2.9.9.dist-info → streamingcommunity-3.0.1.dist-info}/WHEEL +1 -1
- StreamingCommunity/Api/Site/cb01new/__init__.py +0 -72
- StreamingCommunity/Api/Site/cb01new/film.py +0 -62
- StreamingCommunity/Api/Site/cb01new/site.py +0 -75
- {streamingcommunity-2.9.9.dist-info → streamingcommunity-3.0.1.dist-info}/entry_points.txt +0 -0
- {streamingcommunity-2.9.9.dist-info → streamingcommunity-3.0.1.dist-info}/licenses/LICENSE +0 -0
- {streamingcommunity-2.9.9.dist-info → streamingcommunity-3.0.1.dist-info}/top_level.txt +0 -0
|
@@ -132,10 +132,8 @@ def print_duration_table(file_path: str, description: str = "Duration", return_s
|
|
|
132
132
|
def get_ffprobe_info(file_path):
|
|
133
133
|
"""
|
|
134
134
|
Get format and codec information for a media file using ffprobe.
|
|
135
|
-
|
|
136
135
|
Parameters:
|
|
137
136
|
- file_path (str): Path to the media file.
|
|
138
|
-
|
|
139
137
|
Returns:
|
|
140
138
|
dict: A dictionary containing the format name and a list of codec names.
|
|
141
139
|
Returns None if file does not exist or ffprobe crashes.
|
|
@@ -143,48 +141,58 @@ def get_ffprobe_info(file_path):
|
|
|
143
141
|
if not os.path.exists(file_path):
|
|
144
142
|
logging.error(f"File not found: {file_path}")
|
|
145
143
|
return None
|
|
146
|
-
|
|
144
|
+
|
|
145
|
+
# Get ffprobe path and verify it exists
|
|
146
|
+
ffprobe_path = get_ffprobe_path()
|
|
147
|
+
if not ffprobe_path or not os.path.exists(ffprobe_path):
|
|
148
|
+
logging.error(f"FFprobe not found at path: {ffprobe_path}")
|
|
149
|
+
return None
|
|
150
|
+
|
|
151
|
+
# Verify file permissions
|
|
152
|
+
try:
|
|
153
|
+
file_stat = os.stat(file_path)
|
|
154
|
+
logging.info(f"File permissions: {oct(file_stat.st_mode)}")
|
|
155
|
+
if not os.access(file_path, os.R_OK):
|
|
156
|
+
logging.error(f"No read permission for file: {file_path}")
|
|
157
|
+
return None
|
|
158
|
+
except OSError as e:
|
|
159
|
+
logging.error(f"Cannot access file {file_path}: {e}")
|
|
160
|
+
return None
|
|
161
|
+
|
|
147
162
|
try:
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
logging.info(f"FFmpeg command: {cmd}")
|
|
163
|
+
cmd = [ffprobe_path, '-v', 'error', '-show_format', '-show_streams', '-print_format', 'json', file_path]
|
|
164
|
+
logging.info(f"Running FFprobe command: {' '.join(cmd)}")
|
|
151
165
|
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
info = json.loads(stdout)
|
|
173
|
-
|
|
174
|
-
format_name = info['format']['format_name'] if 'format' in info else None
|
|
175
|
-
codec_names = [stream['codec_name'] for stream in info['streams']] if 'streams' in info else []
|
|
176
|
-
|
|
166
|
+
# Use subprocess.run instead of Popen for better error handling
|
|
167
|
+
result = subprocess.run(
|
|
168
|
+
cmd,
|
|
169
|
+
capture_output=True,
|
|
170
|
+
text=True,
|
|
171
|
+
check=False # Don't raise exception on non-zero exit
|
|
172
|
+
)
|
|
173
|
+
|
|
174
|
+
if result.returncode != 0:
|
|
175
|
+
logging.error(f"FFprobe failed with return code {result.returncode}")
|
|
176
|
+
logging.error(f"FFprobe stderr: {result.stderr}")
|
|
177
|
+
logging.error(f"FFprobe stdout: {result.stdout}")
|
|
178
|
+
logging.error(f"Command: {' '.join(cmd)}")
|
|
179
|
+
logging.error(f"FFprobe path permissions: {oct(os.stat(ffprobe_path).st_mode)}")
|
|
180
|
+
return None
|
|
181
|
+
|
|
182
|
+
# Parse JSON output
|
|
183
|
+
try:
|
|
184
|
+
info = json.loads(result.stdout)
|
|
177
185
|
return {
|
|
178
|
-
'format_name': format_name,
|
|
179
|
-
'codec_names':
|
|
186
|
+
'format_name': info.get('format', {}).get('format_name'),
|
|
187
|
+
'codec_names': [stream.get('codec_name') for stream in info.get('streams', [])]
|
|
180
188
|
}
|
|
181
|
-
|
|
189
|
+
except json.JSONDecodeError as e:
|
|
190
|
+
logging.error(f"Failed to parse FFprobe output: {e}")
|
|
191
|
+
return None
|
|
192
|
+
|
|
182
193
|
except Exception as e:
|
|
183
|
-
logging.error(f"
|
|
184
|
-
return
|
|
185
|
-
'format_name': None,
|
|
186
|
-
'codec_names': []
|
|
187
|
-
}
|
|
194
|
+
logging.error(f"FFprobe execution failed: {e}")
|
|
195
|
+
return None
|
|
188
196
|
|
|
189
197
|
|
|
190
198
|
def is_png_format_or_codec(file_info):
|
|
@@ -255,4 +263,4 @@ def check_duration_v_a(video_path, audio_path, tolerance=1.0):
|
|
|
255
263
|
if duration_difference <= tolerance:
|
|
256
264
|
return True, duration_difference
|
|
257
265
|
else:
|
|
258
|
-
return False, duration_difference
|
|
266
|
+
return False, duration_difference
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
# 21.04.25
|
|
2
2
|
|
|
3
|
-
import sys
|
|
4
3
|
import time
|
|
5
4
|
import logging
|
|
6
5
|
import threading
|
|
@@ -14,7 +13,6 @@ from tqdm import tqdm
|
|
|
14
13
|
|
|
15
14
|
# Internal utilities
|
|
16
15
|
from StreamingCommunity.Util.color import Colors
|
|
17
|
-
from StreamingCommunity.Util.config_json import get_use_large_bar
|
|
18
16
|
from StreamingCommunity.Util.os import internet_manager
|
|
19
17
|
|
|
20
18
|
|
|
@@ -32,14 +30,10 @@ class M3U8_Ts_Estimator:
|
|
|
32
30
|
self.lock = threading.Lock()
|
|
33
31
|
self.speed = {"upload": "N/A", "download": "N/A"}
|
|
34
32
|
self._running = True
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
self.speed_thread.daemon = True
|
|
40
|
-
self.speed_thread.start()
|
|
41
|
-
else:
|
|
42
|
-
logging.debug("USE_LARGE_BAR is False, speed capture thread not started")
|
|
33
|
+
|
|
34
|
+
self.speed_thread = threading.Thread(target=self.capture_speed)
|
|
35
|
+
self.speed_thread.daemon = True
|
|
36
|
+
self.speed_thread.start()
|
|
43
37
|
|
|
44
38
|
def __del__(self):
|
|
45
39
|
"""Ensure thread is properly stopped when the object is destroyed."""
|
|
@@ -133,29 +127,22 @@ class M3U8_Ts_Estimator:
|
|
|
133
127
|
with self.segments_instance.active_retries_lock:
|
|
134
128
|
retry_count = self.segments_instance.active_retries
|
|
135
129
|
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
)
|
|
153
|
-
|
|
154
|
-
else:
|
|
155
|
-
progress_str = (
|
|
156
|
-
f"{Colors.GREEN}{number_file_total_size} {Colors.RED}{units_file_total_size} "
|
|
157
|
-
#f"{Colors.WHITE}, {Colors.GREEN}CRR {Colors.RED}{retry_count} "
|
|
158
|
-
)
|
|
130
|
+
# Get speed data outside of any locks
|
|
131
|
+
speed_data = ["N/A", ""]
|
|
132
|
+
with self.lock:
|
|
133
|
+
download_speed = self.speed['download']
|
|
134
|
+
|
|
135
|
+
if download_speed != "N/A":
|
|
136
|
+
speed_data = download_speed.split(" ")
|
|
137
|
+
|
|
138
|
+
average_internet_speed = speed_data[0] if len(speed_data) >= 1 else "N/A"
|
|
139
|
+
average_internet_unit = speed_data[1] if len(speed_data) >= 2 else ""
|
|
140
|
+
|
|
141
|
+
progress_str = (
|
|
142
|
+
f"{Colors.GREEN}{number_file_total_size} {Colors.RED}{units_file_total_size}"
|
|
143
|
+
f"{Colors.WHITE}, {Colors.CYAN}{average_internet_speed} {Colors.RED}{average_internet_unit} "
|
|
144
|
+
#f"{Colors.WHITE}, {Colors.GREEN}CRR {Colors.RED}{retry_count} "
|
|
145
|
+
)
|
|
159
146
|
|
|
160
147
|
progress_counter.set_postfix_str(progress_str)
|
|
161
148
|
|
|
@@ -12,6 +12,10 @@ from typing import Any, List
|
|
|
12
12
|
from rich.console import Console
|
|
13
13
|
|
|
14
14
|
|
|
15
|
+
# Internal utilities
|
|
16
|
+
from StreamingCommunity.Util.headers import get_userAgent
|
|
17
|
+
|
|
18
|
+
|
|
15
19
|
# Variable
|
|
16
20
|
console = Console()
|
|
17
21
|
download_site_data = True
|
|
@@ -134,7 +138,7 @@ class ConfigManager:
|
|
|
134
138
|
console.print(f"[bold cyan]Downloading reference configuration:[/bold cyan] [green]{self.reference_config_url}[/green]")
|
|
135
139
|
|
|
136
140
|
try:
|
|
137
|
-
response = requests.get(self.reference_config_url, timeout=
|
|
141
|
+
response = requests.get(self.reference_config_url, timeout=8, headers={'User-Agent': get_userAgent()})
|
|
138
142
|
|
|
139
143
|
if response.status_code == 200:
|
|
140
144
|
with open(self.file_path, 'wb') as f:
|
|
@@ -156,7 +160,7 @@ class ConfigManager:
|
|
|
156
160
|
try:
|
|
157
161
|
# Download the reference configuration
|
|
158
162
|
console.print(f"[bold cyan]Validating configuration with GitHub...[/bold cyan]")
|
|
159
|
-
response = requests.get(self.reference_config_url, timeout=
|
|
163
|
+
response = requests.get(self.reference_config_url, timeout=8, headers={'User-Agent': get_userAgent()})
|
|
160
164
|
|
|
161
165
|
if not response.ok:
|
|
162
166
|
raise Exception(f"Error downloading reference configuration. Code: {response.status_code}")
|
|
@@ -267,13 +271,14 @@ class ConfigManager:
|
|
|
267
271
|
headers = {
|
|
268
272
|
"apikey": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6Inp2Zm5ncG94d3Jnc3duenl0YWRoIiwicm9sZSI6ImFub24iLCJpYXQiOjE3NDAxNTIxNjMsImV4cCI6MjA1NTcyODE2M30.FNTCCMwi0QaKjOu8gtZsT5yQttUW8QiDDGXmzkn89QE",
|
|
269
273
|
"Authorization": f"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6Inp2Zm5ncG94d3Jnc3duenl0YWRoIiwicm9sZSI6ImFub24iLCJpYXQiOjE3NDAxNTIxNjMsImV4cCI6MjA1NTcyODE2M30.FNTCCMwi0QaKjOu8gtZsT5yQttUW8QiDDGXmzkn89QE",
|
|
270
|
-
"Content-Type": "application/json"
|
|
274
|
+
"Content-Type": "application/json",
|
|
275
|
+
"User-Agent": get_userAgent()
|
|
271
276
|
}
|
|
272
277
|
|
|
273
278
|
try:
|
|
274
279
|
console.print("[bold cyan]Retrieving site data from API...[/bold cyan]")
|
|
275
|
-
response = requests.get("https://zvfngpoxwrgswnzytadh.supabase.co/rest/v1/public",
|
|
276
|
-
|
|
280
|
+
response = requests.get("https://zvfngpoxwrgswnzytadh.supabase.co/rest/v1/public", timeout=8, headers=headers)
|
|
281
|
+
|
|
277
282
|
if response.ok:
|
|
278
283
|
data = response.json()
|
|
279
284
|
if data and len(data) > 0:
|
|
@@ -282,13 +287,6 @@ class ConfigManager:
|
|
|
282
287
|
site_count = len(self.configSite) if isinstance(self.configSite, dict) else 0
|
|
283
288
|
console.print(f"[bold green]Site data retrieved:[/bold green] {site_count} streaming services available")
|
|
284
289
|
|
|
285
|
-
# Show some sites as examples
|
|
286
|
-
if site_count > 0:
|
|
287
|
-
examples = list(self.configSite.items())[:3]
|
|
288
|
-
sites_info = []
|
|
289
|
-
for site, info in examples:
|
|
290
|
-
url = info.get('full_url', 'N/A')
|
|
291
|
-
console.print(f" • [cyan]{site}[/cyan]: {url}")
|
|
292
290
|
else:
|
|
293
291
|
console.print("[bold yellow]API returned an empty data set[/bold yellow]")
|
|
294
292
|
else:
|
|
@@ -347,7 +345,7 @@ class ConfigManager:
|
|
|
347
345
|
try:
|
|
348
346
|
logging.info(f"Downloading {filename} from {url}...")
|
|
349
347
|
console.print(f"[bold cyan]File download:[/bold cyan] {os.path.basename(filename)}")
|
|
350
|
-
response = requests.get(url, timeout=
|
|
348
|
+
response = requests.get(url, timeout=8, headers={'User-Agent': get_userAgent()})
|
|
351
349
|
|
|
352
350
|
if response.status_code == 200:
|
|
353
351
|
with open(filename, 'wb') as f:
|
|
@@ -238,6 +238,31 @@ class FFMPEGDownloader:
|
|
|
238
238
|
Returns:
|
|
239
239
|
Tuple[Optional[str], Optional[str], Optional[str]]: Paths to ffmpeg, ffprobe, and ffplay executables.
|
|
240
240
|
"""
|
|
241
|
+
if self.os_name == 'linux':
|
|
242
|
+
try:
|
|
243
|
+
# Attempt to install FFmpeg using apt
|
|
244
|
+
console.print("[bold blue]Trying to install FFmpeg using 'sudo apt install ffmpeg'[/]")
|
|
245
|
+
result = subprocess.run(
|
|
246
|
+
['sudo', 'apt', 'install', '-y', 'ffmpeg'],
|
|
247
|
+
stdout=subprocess.PIPE,
|
|
248
|
+
stderr=subprocess.PIPE,
|
|
249
|
+
text=True
|
|
250
|
+
)
|
|
251
|
+
if result.returncode == 0:
|
|
252
|
+
ffmpeg_path = shutil.which('ffmpeg')
|
|
253
|
+
ffprobe_path = shutil.which('ffprobe')
|
|
254
|
+
|
|
255
|
+
if ffmpeg_path and ffprobe_path:
|
|
256
|
+
console.print("[bold green]FFmpeg successfully installed via apt[/]")
|
|
257
|
+
return ffmpeg_path, ffprobe_path, None
|
|
258
|
+
else:
|
|
259
|
+
console.print("[bold yellow]Failed to install FFmpeg via apt. Proceeding with static download.[/]")
|
|
260
|
+
|
|
261
|
+
except Exception as e:
|
|
262
|
+
logging.error(f"Error during 'sudo apt install ffmpeg': {e}")
|
|
263
|
+
console.print("[bold red]Error during 'sudo apt install ffmpeg'. Proceeding with static download.[/]")
|
|
264
|
+
|
|
265
|
+
# Proceed with static download if apt installation fails or is not applicable
|
|
241
266
|
config = FFMPEG_CONFIGURATION[self.os_name]
|
|
242
267
|
executables = [exe.format(arch=self.arch) for exe in config['executables']]
|
|
243
268
|
successful_extractions = []
|
|
@@ -346,4 +371,4 @@ def check_ffmpeg() -> Tuple[Optional[str], Optional[str], Optional[str]]:
|
|
|
346
371
|
|
|
347
372
|
except Exception as e:
|
|
348
373
|
logging.error(f"Error checking or downloading FFmpeg executables: {e}")
|
|
349
|
-
return None, None, None
|
|
374
|
+
return None, None, None
|
StreamingCommunity/Util/os.py
CHANGED
|
@@ -4,7 +4,6 @@ import io
|
|
|
4
4
|
import os
|
|
5
5
|
import glob
|
|
6
6
|
import sys
|
|
7
|
-
import time
|
|
8
7
|
import shutil
|
|
9
8
|
import hashlib
|
|
10
9
|
import logging
|
|
@@ -13,11 +12,9 @@ import inspect
|
|
|
13
12
|
import subprocess
|
|
14
13
|
import contextlib
|
|
15
14
|
import importlib.metadata
|
|
16
|
-
from pathlib import Path
|
|
17
15
|
|
|
18
16
|
|
|
19
17
|
# External library
|
|
20
|
-
import httpx
|
|
21
18
|
from unidecode import unidecode
|
|
22
19
|
from rich.console import Console
|
|
23
20
|
from rich.prompt import Prompt
|
|
@@ -107,16 +104,14 @@ class OsManager:
|
|
|
107
104
|
if not path:
|
|
108
105
|
return path
|
|
109
106
|
|
|
110
|
-
# Decode unicode characters
|
|
107
|
+
# Decode unicode characters and perform basic sanitization
|
|
111
108
|
decoded = unidecode(path)
|
|
112
|
-
|
|
113
|
-
# Basic path sanitization
|
|
114
109
|
sanitized = sanitize_filepath(decoded)
|
|
115
110
|
|
|
116
111
|
if self.system == 'windows':
|
|
117
112
|
# Handle network paths (UNC or IP-based)
|
|
118
|
-
if
|
|
119
|
-
parts =
|
|
113
|
+
if sanitized.startswith('\\\\') or sanitized.startswith('//'):
|
|
114
|
+
parts = sanitized.replace('/', '\\').split('\\')
|
|
120
115
|
# Keep server/IP and share name as is
|
|
121
116
|
sanitized_parts = parts[:4]
|
|
122
117
|
# Sanitize remaining parts
|
|
@@ -129,9 +124,9 @@ class OsManager:
|
|
|
129
124
|
return '\\'.join(sanitized_parts)
|
|
130
125
|
|
|
131
126
|
# Handle drive letters
|
|
132
|
-
elif len(
|
|
133
|
-
drive =
|
|
134
|
-
rest =
|
|
127
|
+
elif len(sanitized) >= 2 and sanitized[1] == ':':
|
|
128
|
+
drive = sanitized[:2]
|
|
129
|
+
rest = sanitized[2:].lstrip('\\').lstrip('/')
|
|
135
130
|
path_parts = [drive] + [
|
|
136
131
|
self.get_sanitize_file(part)
|
|
137
132
|
for part in rest.replace('/', '\\').split('\\')
|
|
@@ -141,12 +136,12 @@ class OsManager:
|
|
|
141
136
|
|
|
142
137
|
# Regular path
|
|
143
138
|
else:
|
|
144
|
-
parts =
|
|
139
|
+
parts = sanitized.replace('/', '\\').split('\\')
|
|
145
140
|
return '\\'.join(p for p in parts if p)
|
|
146
141
|
else:
|
|
147
142
|
# Handle Unix-like paths (Linux and macOS)
|
|
148
|
-
is_absolute =
|
|
149
|
-
parts =
|
|
143
|
+
is_absolute = sanitized.startswith('/')
|
|
144
|
+
parts = sanitized.replace('\\', '/').split('/')
|
|
150
145
|
sanitized_parts = [
|
|
151
146
|
self.get_sanitize_file(part)
|
|
152
147
|
for part in parts
|
|
@@ -357,12 +352,15 @@ class OsSummary:
|
|
|
357
352
|
Exits with a message if not the official version.
|
|
358
353
|
"""
|
|
359
354
|
python_implementation = platform.python_implementation()
|
|
355
|
+
python_version = platform.python_version()
|
|
360
356
|
|
|
361
357
|
if python_implementation != "CPython":
|
|
362
358
|
console.print(f"[bold red]Warning: You are using a non-official Python distribution: {python_implementation}.[/bold red]")
|
|
363
359
|
console.print("Please install the official Python from [bold blue]https://www.python.org[/bold blue] and try again.", style="bold yellow")
|
|
364
360
|
sys.exit(0)
|
|
365
361
|
|
|
362
|
+
console.print(f"[cyan]Python version: [bold red]{python_version}[/bold red]")
|
|
363
|
+
|
|
366
364
|
def get_system_summary(self):
|
|
367
365
|
self.check_python_version()
|
|
368
366
|
|
|
@@ -454,4 +452,4 @@ def get_ffmpeg_path():
|
|
|
454
452
|
|
|
455
453
|
def get_ffprobe_path():
|
|
456
454
|
"""Returns the path of FFprobe."""
|
|
457
|
-
return os_summary.ffprobe_path
|
|
455
|
+
return os_summary.ffprobe_path
|
|
@@ -57,11 +57,8 @@ def load_search_functions():
|
|
|
57
57
|
|
|
58
58
|
# Get 'indice' from the module
|
|
59
59
|
indice = getattr(mod, 'indice', 0)
|
|
60
|
-
is_deprecate = bool(getattr(mod, '_deprecate', True))
|
|
61
60
|
use_for = getattr(mod, '_useFor', 'other')
|
|
62
|
-
|
|
63
|
-
if not is_deprecate:
|
|
64
|
-
modules.append((module_name, indice, use_for))
|
|
61
|
+
modules.append((module_name, indice, use_for))
|
|
65
62
|
|
|
66
63
|
except Exception as e:
|
|
67
64
|
console.print(f"[red]Failed to import module {module_name}: {str(e)}")
|
StreamingCommunity/run.py
CHANGED
|
@@ -90,11 +90,8 @@ def load_search_functions():
|
|
|
90
90
|
|
|
91
91
|
# Get 'indice' from the module
|
|
92
92
|
indice = getattr(mod, 'indice', 0)
|
|
93
|
-
is_deprecate = bool(getattr(mod, '_deprecate', True))
|
|
94
93
|
use_for = getattr(mod, '_useFor', 'other')
|
|
95
|
-
|
|
96
|
-
if not is_deprecate:
|
|
97
|
-
modules.append((module_name, indice, use_for))
|
|
94
|
+
modules.append((module_name, indice, use_for))
|
|
98
95
|
|
|
99
96
|
except Exception as e:
|
|
100
97
|
console.print(f"[red]Failed to import module {module_name}: {str(e)}")
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
StreamingCommunity/__init__.py,sha256=Cw-N0VCg7sef1WqdtvVwrhs1zc4LoUhs5C8k7vpM1lQ,207
|
|
2
|
-
StreamingCommunity/global_search.py,sha256=
|
|
3
|
-
StreamingCommunity/run.py,sha256=
|
|
2
|
+
StreamingCommunity/global_search.py,sha256=LgRTjVBJYyLiKYa3EIb33vRnVQ-COoQT7gASfVW8-Dg,12022
|
|
3
|
+
StreamingCommunity/run.py,sha256=xBq2GS3JznLZBAF5DnJplNtJBzqOl_zHQXVmXxDMnBs,13108
|
|
4
4
|
StreamingCommunity/Api/Player/ddl.py,sha256=S3UZFonJl3d3xU1fQrosRFXFhwAm8hGVQ8Ff8g-6xSI,2071
|
|
5
5
|
StreamingCommunity/Api/Player/maxstream.py,sha256=WXg8xncFXFiaUmTVXxB3NyknQtbvd0sF1eRaoDO24bU,4822
|
|
6
6
|
StreamingCommunity/Api/Player/mediapolisvod.py,sha256=OcdnE1BMSwPZM-nw74GXNJ44E9RYwGnc_kFEA-G8XyY,2294
|
|
@@ -9,44 +9,41 @@ StreamingCommunity/Api/Player/sweetpixel.py,sha256=gJSe1fop5J216CB3u8vstxLPP5Ybc
|
|
|
9
9
|
StreamingCommunity/Api/Player/vixcloud.py,sha256=qI9ppYEMGaJ1B5y693BOMeRQri-F4-94SfRkS-9udfM,6287
|
|
10
10
|
StreamingCommunity/Api/Player/Helper/Vixcloud/js_parser.py,sha256=U-8QlD5kGzIk3-4t4D6QyYmiDe8UBrSuVi1YHRQb7AU,4295
|
|
11
11
|
StreamingCommunity/Api/Player/Helper/Vixcloud/util.py,sha256=QLUgbwQrpuPIVNzdBlAiEJXnd-eCj_JQFckZZEEL55w,5214
|
|
12
|
-
StreamingCommunity/Api/Site/1337xx/__init__.py,sha256=
|
|
13
|
-
StreamingCommunity/Api/Site/1337xx/site.py,sha256=
|
|
12
|
+
StreamingCommunity/Api/Site/1337xx/__init__.py,sha256=OdQxYoJ9UyGSAutZwqH1FgmOH-Z6vGVHb0CLKhwEZGM,1999
|
|
13
|
+
StreamingCommunity/Api/Site/1337xx/site.py,sha256=9W88ErYQjCUoNAPS7PBie4838Gh1UJBTqQ8uGgS_InI,2344
|
|
14
14
|
StreamingCommunity/Api/Site/1337xx/title.py,sha256=8T3cVRb-Mt9QdOtKWVVFHz8iOHqspf7iw28E7bfTV78,1865
|
|
15
|
-
StreamingCommunity/Api/Site/altadefinizione/__init__.py,sha256=
|
|
15
|
+
StreamingCommunity/Api/Site/altadefinizione/__init__.py,sha256=Oxjfyg6VolwV6n2VGgICLvdRVPPMzJXMSdz8oI2Xs0M,4145
|
|
16
16
|
StreamingCommunity/Api/Site/altadefinizione/film.py,sha256=0XeqMrMHnk5nbFkVTFaNZWtlXI8pETl7dsORDtIMbjg,4395
|
|
17
17
|
StreamingCommunity/Api/Site/altadefinizione/series.py,sha256=-rCYx-Fa7aZiYepcIne7OdH1aaUFZZAPX-ToBv6mxFs,8192
|
|
18
|
-
StreamingCommunity/Api/Site/altadefinizione/site.py,sha256=
|
|
18
|
+
StreamingCommunity/Api/Site/altadefinizione/site.py,sha256=S-ucgLNXUYZPjgSNjEYVxlkpMkJyjpr7mYf_jBcYwqM,2860
|
|
19
19
|
StreamingCommunity/Api/Site/altadefinizione/util/ScrapeSerie.py,sha256=bSApjfY9xd5dw0tZ1t7vB6ifAo5vAkeeEwX6IS7yH1o,3756
|
|
20
|
-
StreamingCommunity/Api/Site/animeunity/__init__.py,sha256=
|
|
20
|
+
StreamingCommunity/Api/Site/animeunity/__init__.py,sha256=EayZqxyWltgjRRDNfM32JRzgeyElK85o6s0_YJ0dpBk,4031
|
|
21
21
|
StreamingCommunity/Api/Site/animeunity/film.py,sha256=Vqg6yag2siR-Y3ougBsV8mzdQXChxg6ghz_KVXFQ3pE,998
|
|
22
22
|
StreamingCommunity/Api/Site/animeunity/serie.py,sha256=ib86sLXYsYbrvrFNbzKdhlwMUO3DT7JS5yTTrrSr2jk,5711
|
|
23
|
-
StreamingCommunity/Api/Site/animeunity/site.py,sha256=
|
|
24
|
-
StreamingCommunity/Api/Site/animeunity/util/ScrapeSerie.py,sha256=
|
|
25
|
-
StreamingCommunity/Api/Site/animeworld/__init__.py,sha256=
|
|
23
|
+
StreamingCommunity/Api/Site/animeunity/site.py,sha256=KLBQ08TAMyzsrZ3SAxw8hZefreCtZAuU1KwEbaJnUAE,5646
|
|
24
|
+
StreamingCommunity/Api/Site/animeunity/util/ScrapeSerie.py,sha256=Ze6a8D2MRhiOvSw3mTpL3ue2iVc6pA5aqoyUMCTnT7A,3809
|
|
25
|
+
StreamingCommunity/Api/Site/animeworld/__init__.py,sha256=UzHQbfxx_i6qzM586LL940CoiI3Y98IGIVP4-hXUxn4,2790
|
|
26
26
|
StreamingCommunity/Api/Site/animeworld/film.py,sha256=W9KOS9Wvx3Mlqx5WojR-NgnF9WX8mI79JZPS7UwG-dc,1763
|
|
27
27
|
StreamingCommunity/Api/Site/animeworld/serie.py,sha256=MXyV1fK05jPW4iV9NWrRKW-R4ect-TSN78-2APayniU,3516
|
|
28
|
-
StreamingCommunity/Api/Site/animeworld/site.py,sha256=
|
|
28
|
+
StreamingCommunity/Api/Site/animeworld/site.py,sha256=1Ah4CmKXdqsoCGTbyPRSVJRAxtcW449kpBnPKnzR1K8,3650
|
|
29
29
|
StreamingCommunity/Api/Site/animeworld/util/ScrapeSerie.py,sha256=CBTCH_wnTXUK_MKwq9a1k_XdvOlUrMpbUmpkD5fXVQ0,3589
|
|
30
|
-
StreamingCommunity/Api/Site/
|
|
31
|
-
StreamingCommunity/Api/Site/cb01new/film.py,sha256=vjd1ftm4LhxxG0TTKEwlOXtx0AYgxBbV5ZlQH8aSxGU,1695
|
|
32
|
-
StreamingCommunity/Api/Site/cb01new/site.py,sha256=_JPKP2BMK5SL_QZPtt7mbDdef_t0J7QO7QDKVw6xm-4,2068
|
|
33
|
-
StreamingCommunity/Api/Site/ddlstreamitaly/__init__.py,sha256=YRxyKamo566VyMQVGZV640xzn2D3oG3gTekJZvcIjYo,2160
|
|
30
|
+
StreamingCommunity/Api/Site/ddlstreamitaly/__init__.py,sha256=2FGeGNJ5SHPQzKEEmVMFWft4woGgJ-XLeNxjbSb6L9s,2141
|
|
34
31
|
StreamingCommunity/Api/Site/ddlstreamitaly/series.py,sha256=F_D_2lwHHWN5hgLs8oUDNCYe-4SEPtWzJoU4yT_Nzfg,3726
|
|
35
|
-
StreamingCommunity/Api/Site/ddlstreamitaly/site.py,sha256=
|
|
32
|
+
StreamingCommunity/Api/Site/ddlstreamitaly/site.py,sha256=hspimNOnIkLdJMrYLgXHmXepLz_mu8z257camnlGfaI,2596
|
|
36
33
|
StreamingCommunity/Api/Site/ddlstreamitaly/util/ScrapeSerie.py,sha256=tETaN-2GyFBeRsoLnGw3Kz4D4j2TMcnPzGjzlC62w_Y,3655
|
|
37
|
-
StreamingCommunity/Api/Site/guardaserie/__init__.py,sha256=
|
|
34
|
+
StreamingCommunity/Api/Site/guardaserie/__init__.py,sha256=p5hzqshw5hwDl9nJ8FBWbzfPe2j7c5eNYiaftDThGcU,2768
|
|
38
35
|
StreamingCommunity/Api/Site/guardaserie/series.py,sha256=U9rMZCjRqHLFjo468vikxl-2RqO6DCJjebB-G8Y6LDg,6492
|
|
39
|
-
StreamingCommunity/Api/Site/guardaserie/site.py,sha256=
|
|
36
|
+
StreamingCommunity/Api/Site/guardaserie/site.py,sha256=DrtHD365Ezh3GGcluvTIJxWYSjhaJpiY1w6pg4M1odw,2321
|
|
40
37
|
StreamingCommunity/Api/Site/guardaserie/util/ScrapeSerie.py,sha256=_aXU-YcUtSwbC2b6QpNnWDZR8m6vp9xzBEx_zdu5tgI,4196
|
|
41
|
-
StreamingCommunity/Api/Site/raiplay/__init__.py,sha256=
|
|
42
|
-
StreamingCommunity/Api/Site/raiplay/film.py,sha256=
|
|
43
|
-
StreamingCommunity/Api/Site/raiplay/series.py,sha256=
|
|
44
|
-
StreamingCommunity/Api/Site/raiplay/site.py,sha256=
|
|
45
|
-
StreamingCommunity/Api/Site/raiplay/util/ScrapeSerie.py,sha256=
|
|
46
|
-
StreamingCommunity/Api/Site/streamingcommunity/__init__.py,sha256=
|
|
38
|
+
StreamingCommunity/Api/Site/raiplay/__init__.py,sha256=xkxVkFsSxA6DHRqPuzQYXnCVNUBhfUG5xxlz6iwf1mw,3132
|
|
39
|
+
StreamingCommunity/Api/Site/raiplay/film.py,sha256=wBv5kQXx7-aCKhAZ5LABZ8zUzu_jPGdXOl9OM2p8dpY,1982
|
|
40
|
+
StreamingCommunity/Api/Site/raiplay/series.py,sha256=uQVbeA_g3Z1Ciqeq99gsY2F8mC5DssH3ueGbCW8gd9Q,6161
|
|
41
|
+
StreamingCommunity/Api/Site/raiplay/site.py,sha256=FtIR_oT-ag1sh5XnaOAhEOE8biHZmXtZnsFAjKszU8U,5154
|
|
42
|
+
StreamingCommunity/Api/Site/raiplay/util/ScrapeSerie.py,sha256=5F6abToCTtsvW8iIACbChZ0fPlymJiCSF_y8FRsDu7M,5002
|
|
43
|
+
StreamingCommunity/Api/Site/streamingcommunity/__init__.py,sha256=Ej-xZ6x99zeq3p5O7-e_Evi_529x3eq_VryBLejCBiA,3796
|
|
47
44
|
StreamingCommunity/Api/Site/streamingcommunity/film.py,sha256=TPt0yB1DKShDIz_1OEVG1IolMoAKBOaWIZ8lQF61dfM,2575
|
|
48
45
|
StreamingCommunity/Api/Site/streamingcommunity/series.py,sha256=jWwgawBovZkL7pafvd55L68AMAy7ZyvCPNZdh72bqq8,8859
|
|
49
|
-
StreamingCommunity/Api/Site/streamingcommunity/site.py,sha256=
|
|
46
|
+
StreamingCommunity/Api/Site/streamingcommunity/site.py,sha256=nKII_DjKN1ePeYdMn4titYgvPRMbm8PmEXIM6npGkeI,3129
|
|
50
47
|
StreamingCommunity/Api/Site/streamingcommunity/util/ScrapeSerie.py,sha256=3sNz9uD-o9xz0dKpSnQsLPC_45v5fnW9Mzas2rQ8-Uc,5579
|
|
51
48
|
StreamingCommunity/Api/Template/__init__.py,sha256=oyfd_4_g5p5q6mxb_rKwSsudZnTM3W3kg1tLwxg-v-Q,46
|
|
52
49
|
StreamingCommunity/Api/Template/config_loader.py,sha256=2RT_0mqQmWzXM4rYaqss-yhXztYAcfNkTalFPjzv270,2056
|
|
@@ -56,16 +53,16 @@ StreamingCommunity/Api/Template/Util/__init__.py,sha256=ZWQQd6iymNFDol9HaKPhVBoR
|
|
|
56
53
|
StreamingCommunity/Api/Template/Util/manage_ep.py,sha256=FYe2DC9SXIXzlRYI7fW4ieBpfrxYzsUgt2C47tYRk7U,9252
|
|
57
54
|
StreamingCommunity/Lib/Downloader/__init__.py,sha256=JhbBh5hOnSM7VmtkxJ7zZ_FtWEC1JdnKThsSBjLV5FY,140
|
|
58
55
|
StreamingCommunity/Lib/Downloader/HLS/downloader.py,sha256=wlujaWn5I5KtP0m61iYExtnEhwmsy_jdFqd9cM1A-2E,21588
|
|
59
|
-
StreamingCommunity/Lib/Downloader/HLS/segments.py,sha256=
|
|
56
|
+
StreamingCommunity/Lib/Downloader/HLS/segments.py,sha256=Q_YZxkWfUqd6TRkHoYt58Iy-xMWVLH6fCnBnQImQK2I,18059
|
|
60
57
|
StreamingCommunity/Lib/Downloader/MP4/downloader.py,sha256=L03fpjaJ2pvZ_McaOShv3iCsdbefCGW3WM1QIa2TGJo,7514
|
|
61
|
-
StreamingCommunity/Lib/Downloader/TOR/downloader.py,sha256=
|
|
58
|
+
StreamingCommunity/Lib/Downloader/TOR/downloader.py,sha256=CrRGdLGI_45AnhtTZm8r7KO7uGmU9k6pywy-qO18LG8,19242
|
|
62
59
|
StreamingCommunity/Lib/FFmpeg/__init__.py,sha256=6PBsZdE1jrD2EKOVyx3JEHnyDZzVeKlPkH5T0zyfOgU,130
|
|
63
|
-
StreamingCommunity/Lib/FFmpeg/capture.py,sha256=
|
|
60
|
+
StreamingCommunity/Lib/FFmpeg/capture.py,sha256=QZYtuUG3L5_BsHFdzBU-5pZrX1PYxfCTx8bXShGF_bs,5029
|
|
64
61
|
StreamingCommunity/Lib/FFmpeg/command.py,sha256=ubpffE02nsZM7xch5gbwGlEiUzecpxcFOd63n2cqM1k,10708
|
|
65
|
-
StreamingCommunity/Lib/FFmpeg/util.py,sha256=
|
|
62
|
+
StreamingCommunity/Lib/FFmpeg/util.py,sha256=byM5DzAA-8Ts0FtviEPfbFJKN_PuxVFGjELgD_FEhsk,9287
|
|
66
63
|
StreamingCommunity/Lib/M3U8/__init__.py,sha256=H_KS2eDd3kVXMziFJnD0FCPvPHEizaqfoA36ElTv_r8,170
|
|
67
64
|
StreamingCommunity/Lib/M3U8/decryptor.py,sha256=kuxxsd3eN0VGRrMJWXzHo8gCpT0u3fSZs_lwxlE5Fqs,2948
|
|
68
|
-
StreamingCommunity/Lib/M3U8/estimator.py,sha256=
|
|
65
|
+
StreamingCommunity/Lib/M3U8/estimator.py,sha256=8gwTxJ3poRqZdHUTD9_oqXegiPWSXFuqLmqCZBnXS8A,5893
|
|
69
66
|
StreamingCommunity/Lib/M3U8/parser.py,sha256=cSjXPOSgTewrfLgREyQ47wzoOeoYo3L4lOfEWZKxad8,22485
|
|
70
67
|
StreamingCommunity/Lib/M3U8/url_fixer.py,sha256=zldE4yOuNBV6AAvL1KI6p7XdRI_R5YZRscbDgT1564M,1735
|
|
71
68
|
StreamingCommunity/Lib/TMBD/__init__.py,sha256=XzE42tw3Ws59DD1PF8WmGtZ0D4D7Hk3Af8QthNE-22U,66
|
|
@@ -74,18 +71,18 @@ StreamingCommunity/Lib/TMBD/tmdb.py,sha256=byg0EFnlmd9JeLvn1N9K3QkB1KEfeMuFa7OVf
|
|
|
74
71
|
StreamingCommunity/TelegramHelp/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
75
72
|
StreamingCommunity/TelegramHelp/telegram_bot.py,sha256=Qe1__aoK4PpDuing8JtWgdHzLee8LuYYyfeLNA7yADU,26307
|
|
76
73
|
StreamingCommunity/Upload/update.py,sha256=mJTKUIOhC2j03sWXUK6oAZxHyObNP2r1fl3y0BC2jes,3351
|
|
77
|
-
StreamingCommunity/Upload/version.py,sha256=
|
|
74
|
+
StreamingCommunity/Upload/version.py,sha256=19qvo-oaTAFq9_mEO90hzV-55WLMgiz_AJymK2rqe1E,171
|
|
78
75
|
StreamingCommunity/Util/color.py,sha256=NvD0Eni-25oOOkY-szCEoc0lGvzQxyL7xhM0RE4EvUM,458
|
|
79
|
-
StreamingCommunity/Util/config_json.py,sha256=
|
|
80
|
-
StreamingCommunity/Util/ffmpeg_installer.py,sha256=
|
|
76
|
+
StreamingCommunity/Util/config_json.py,sha256=r31BJP67EItcI6GioEX7FJzmzM0mubmZ7M73mvZ9YWo,24801
|
|
77
|
+
StreamingCommunity/Util/ffmpeg_installer.py,sha256=yRVIPwbh05tZ-duZmXkH0qasLNxaQCAT_E4cTP79Z3c,14890
|
|
81
78
|
StreamingCommunity/Util/headers.py,sha256=TItkaFMx1GqsVNEIS3Tr0BGU5EHyF-HkZVliHORT3P8,308
|
|
82
79
|
StreamingCommunity/Util/logger.py,sha256=9kGD6GmWj2pM8ADpJc85o7jm8DD0c5Aguqnq-9kmxos,3314
|
|
83
80
|
StreamingCommunity/Util/message.py,sha256=SJaIPLvWeQqsIODVUKw3TgYRmBChovmlbcF6OUxqMI8,1425
|
|
84
|
-
StreamingCommunity/Util/os.py,sha256=
|
|
81
|
+
StreamingCommunity/Util/os.py,sha256=0AD2DYoan9dl1ZC1pjDoUM7D8sRa9p81cGdI-lP1OX4,14993
|
|
85
82
|
StreamingCommunity/Util/table.py,sha256=Nw5PlsvfEIOQZWy5VhsU5OK3heuBXGwsqmLl0k8yQzc,9813
|
|
86
|
-
streamingcommunity-
|
|
87
|
-
streamingcommunity-
|
|
88
|
-
streamingcommunity-
|
|
89
|
-
streamingcommunity-
|
|
90
|
-
streamingcommunity-
|
|
91
|
-
streamingcommunity-
|
|
83
|
+
streamingcommunity-3.0.1.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
|
|
84
|
+
streamingcommunity-3.0.1.dist-info/METADATA,sha256=1tW1Y50Qcjy5eYGbXcnln1HWIeIgwxbFhz_vJqRe7AA,25012
|
|
85
|
+
streamingcommunity-3.0.1.dist-info/WHEEL,sha256=ck4Vq1_RXyvS4Jt6SI0Vz6fyVs4GWg7AINwpsaGEgPE,91
|
|
86
|
+
streamingcommunity-3.0.1.dist-info/entry_points.txt,sha256=Qph9XYfDC8n4LfDLOSl6gJGlkb9eFb5f-JOr_Wb_5rk,67
|
|
87
|
+
streamingcommunity-3.0.1.dist-info/top_level.txt,sha256=YsOcxKP-WOhWpIWgBlh0coll9XUx7aqmRPT7kmt3fH0,19
|
|
88
|
+
streamingcommunity-3.0.1.dist-info/RECORD,,
|