StreamingCommunity 3.2.1__py3-none-any.whl → 3.2.7__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/util.py +4 -0
- StreamingCommunity/Api/Player/hdplayer.py +2 -2
- StreamingCommunity/Api/Player/mixdrop.py +1 -1
- StreamingCommunity/Api/Player/vixcloud.py +4 -5
- StreamingCommunity/Api/Site/altadefinizione/film.py +2 -2
- StreamingCommunity/Api/Site/altadefinizione/series.py +1 -1
- StreamingCommunity/Api/Site/animeunity/serie.py +1 -1
- StreamingCommunity/Api/Site/animeworld/film.py +1 -1
- StreamingCommunity/Api/Site/animeworld/serie.py +1 -2
- StreamingCommunity/Api/Site/cb01new/film.py +1 -1
- StreamingCommunity/Api/Site/crunchyroll/__init__.py +103 -0
- StreamingCommunity/Api/Site/crunchyroll/film.py +82 -0
- StreamingCommunity/Api/Site/crunchyroll/series.py +186 -0
- StreamingCommunity/Api/Site/crunchyroll/site.py +113 -0
- StreamingCommunity/Api/Site/crunchyroll/util/ScrapeSerie.py +238 -0
- StreamingCommunity/Api/Site/crunchyroll/util/get_license.py +227 -0
- StreamingCommunity/Api/Site/guardaserie/series.py +1 -2
- StreamingCommunity/Api/Site/guardaserie/site.py +1 -2
- StreamingCommunity/Api/Site/guardaserie/util/ScrapeSerie.py +9 -8
- StreamingCommunity/Api/Site/mediasetinfinity/__init__.py +96 -0
- StreamingCommunity/Api/Site/mediasetinfinity/film.py +85 -0
- StreamingCommunity/Api/Site/mediasetinfinity/series.py +185 -0
- StreamingCommunity/Api/Site/mediasetinfinity/site.py +112 -0
- StreamingCommunity/Api/Site/mediasetinfinity/util/ScrapeSerie.py +259 -0
- StreamingCommunity/Api/Site/mediasetinfinity/util/fix_mpd.py +64 -0
- StreamingCommunity/Api/Site/mediasetinfinity/util/get_license.py +214 -0
- StreamingCommunity/Api/Site/raiplay/film.py +2 -2
- StreamingCommunity/Api/Site/raiplay/series.py +2 -1
- StreamingCommunity/Api/Site/streamingcommunity/__init__.py +6 -17
- StreamingCommunity/Api/Site/streamingcommunity/film.py +3 -3
- StreamingCommunity/Api/Site/streamingcommunity/series.py +11 -11
- StreamingCommunity/Api/Site/streamingcommunity/site.py +2 -4
- StreamingCommunity/Api/Site/streamingcommunity/util/ScrapeSerie.py +3 -6
- StreamingCommunity/Api/Site/streamingwatch/__init__.py +6 -14
- StreamingCommunity/Api/Site/streamingwatch/film.py +3 -3
- StreamingCommunity/Api/Site/streamingwatch/series.py +9 -9
- StreamingCommunity/Api/Site/streamingwatch/site.py +5 -7
- StreamingCommunity/Api/Site/streamingwatch/util/ScrapeSerie.py +2 -2
- StreamingCommunity/Lib/Downloader/DASH/cdm_helpher.py +131 -0
- StreamingCommunity/Lib/Downloader/DASH/decrypt.py +79 -0
- StreamingCommunity/Lib/Downloader/DASH/downloader.py +218 -0
- StreamingCommunity/Lib/Downloader/DASH/parser.py +249 -0
- StreamingCommunity/Lib/Downloader/DASH/segments.py +332 -0
- StreamingCommunity/Lib/Downloader/HLS/downloader.py +10 -30
- StreamingCommunity/Lib/Downloader/HLS/segments.py +146 -263
- StreamingCommunity/Lib/Downloader/MP4/downloader.py +0 -5
- StreamingCommunity/Lib/FFmpeg/capture.py +3 -3
- StreamingCommunity/Lib/FFmpeg/command.py +1 -1
- StreamingCommunity/TelegramHelp/config.json +3 -7
- StreamingCommunity/Upload/version.py +1 -1
- StreamingCommunity/Util/bento4_installer.py +191 -0
- StreamingCommunity/Util/config_json.py +1 -1
- StreamingCommunity/Util/headers.py +0 -3
- StreamingCommunity/Util/os.py +36 -46
- StreamingCommunity/__init__.py +2 -1
- StreamingCommunity/run.py +11 -10
- {streamingcommunity-3.2.1.dist-info → streamingcommunity-3.2.7.dist-info}/METADATA +7 -9
- streamingcommunity-3.2.7.dist-info/RECORD +111 -0
- StreamingCommunity/Api/Site/1337xx/__init__.py +0 -72
- StreamingCommunity/Api/Site/1337xx/site.py +0 -82
- StreamingCommunity/Api/Site/1337xx/title.py +0 -61
- StreamingCommunity/Lib/Proxies/proxy.py +0 -72
- streamingcommunity-3.2.1.dist-info/RECORD +0 -96
- {streamingcommunity-3.2.1.dist-info → streamingcommunity-3.2.7.dist-info}/WHEEL +0 -0
- {streamingcommunity-3.2.1.dist-info → streamingcommunity-3.2.7.dist-info}/entry_points.txt +0 -0
- {streamingcommunity-3.2.1.dist-info → streamingcommunity-3.2.7.dist-info}/licenses/LICENSE +0 -0
- {streamingcommunity-3.2.1.dist-info → streamingcommunity-3.2.7.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
# 18.07.25
|
|
2
|
+
|
|
3
|
+
import os
|
|
4
|
+
import platform
|
|
5
|
+
import logging
|
|
6
|
+
import shutil
|
|
7
|
+
import zipfile
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
# External library
|
|
11
|
+
import requests
|
|
12
|
+
from rich.console import Console
|
|
13
|
+
from rich.progress import Progress, SpinnerColumn, BarColumn, TextColumn, TimeRemainingColumn
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
# Variable
|
|
17
|
+
console = Console()
|
|
18
|
+
|
|
19
|
+
BENTO4_CONFIGURATION = {
|
|
20
|
+
'windows': {
|
|
21
|
+
'base_dir': lambda home: os.path.join(os.path.splitdrive(home)[0] + os.sep, 'binary'),
|
|
22
|
+
'download_url': 'https://www.bok.net/Bento4/binaries/Bento4-SDK-{version}.{platform}.zip',
|
|
23
|
+
'versions': {
|
|
24
|
+
'x64': 'x86_64-microsoft-win32',
|
|
25
|
+
'x86': 'x86-microsoft-win32-vs2010',
|
|
26
|
+
},
|
|
27
|
+
'executables': ['mp4decrypt.exe']
|
|
28
|
+
},
|
|
29
|
+
'darwin': {
|
|
30
|
+
'base_dir': lambda home: os.path.join(home, 'Applications', 'binary'),
|
|
31
|
+
'download_url': 'https://www.bok.net/Bento4/binaries/Bento4-SDK-{version}.{platform}.zip',
|
|
32
|
+
'versions': {
|
|
33
|
+
'x64': 'universal-apple-macosx',
|
|
34
|
+
'arm64': 'universal-apple-macosx'
|
|
35
|
+
},
|
|
36
|
+
'executables': ['mp4decrypt']
|
|
37
|
+
},
|
|
38
|
+
'linux': {
|
|
39
|
+
'base_dir': lambda home: os.path.join(home, '.local', 'bin', 'binary'),
|
|
40
|
+
'download_url': 'https://www.bok.net/Bento4/binaries/Bento4-SDK-{version}.{platform}.zip',
|
|
41
|
+
'versions': {
|
|
42
|
+
'x64': 'x86_64-unknown-linux',
|
|
43
|
+
'x86': 'x86-unknown-linux',
|
|
44
|
+
'arm64': 'x86_64-unknown-linux'
|
|
45
|
+
},
|
|
46
|
+
'executables': ['mp4decrypt']
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
class Bento4Downloader:
|
|
52
|
+
def __init__(self):
|
|
53
|
+
self.os_name = platform.system().lower()
|
|
54
|
+
self.arch = self._detect_arch()
|
|
55
|
+
self.home_dir = os.path.expanduser('~')
|
|
56
|
+
self.base_dir = BENTO4_CONFIGURATION[self.os_name]['base_dir'](self.home_dir)
|
|
57
|
+
self.version = "1-6-0-641" # Latest stable version as of Nov 2023
|
|
58
|
+
os.makedirs(self.base_dir, exist_ok=True)
|
|
59
|
+
|
|
60
|
+
def _detect_arch(self) -> str:
|
|
61
|
+
machine = platform.machine().lower()
|
|
62
|
+
arch_map = {
|
|
63
|
+
'amd64': 'x64',
|
|
64
|
+
'x86_64': 'x64',
|
|
65
|
+
'x64': 'x64',
|
|
66
|
+
'arm64': 'arm64',
|
|
67
|
+
'aarch64': 'arm64',
|
|
68
|
+
'x86': 'x86',
|
|
69
|
+
'i386': 'x86',
|
|
70
|
+
'i686': 'x86'
|
|
71
|
+
}
|
|
72
|
+
return arch_map.get(machine, machine)
|
|
73
|
+
|
|
74
|
+
def _download_file(self, url: str, destination: str) -> bool:
|
|
75
|
+
try:
|
|
76
|
+
response = requests.get(url, stream=True)
|
|
77
|
+
response.raise_for_status()
|
|
78
|
+
total_size = int(response.headers.get('content-length', 0))
|
|
79
|
+
|
|
80
|
+
with open(destination, 'wb') as file, \
|
|
81
|
+
Progress(
|
|
82
|
+
SpinnerColumn(),
|
|
83
|
+
TextColumn("[progress.description]{task.description}"),
|
|
84
|
+
BarColumn(),
|
|
85
|
+
TextColumn("[progress.percentage]{task.percentage:>3.0f}%"),
|
|
86
|
+
TimeRemainingColumn()
|
|
87
|
+
) as progress:
|
|
88
|
+
|
|
89
|
+
download_task = progress.add_task("[green]Downloading Bento4", total=total_size)
|
|
90
|
+
for chunk in response.iter_content(chunk_size=8192):
|
|
91
|
+
size = file.write(chunk)
|
|
92
|
+
progress.update(download_task, advance=size)
|
|
93
|
+
|
|
94
|
+
return True
|
|
95
|
+
|
|
96
|
+
except Exception as e:
|
|
97
|
+
logging.error(f"Download error: {e}")
|
|
98
|
+
return False
|
|
99
|
+
|
|
100
|
+
def _extract_executables(self, zip_path: str) -> list:
|
|
101
|
+
try:
|
|
102
|
+
extracted_files = []
|
|
103
|
+
config = BENTO4_CONFIGURATION[self.os_name]
|
|
104
|
+
executables = config['executables']
|
|
105
|
+
|
|
106
|
+
with zipfile.ZipFile(zip_path, 'r') as zip_ref:
|
|
107
|
+
for zip_info in zip_ref.filelist:
|
|
108
|
+
for executable in executables:
|
|
109
|
+
if zip_info.filename.endswith(executable):
|
|
110
|
+
|
|
111
|
+
# Extract to base directory
|
|
112
|
+
zip_ref.extract(zip_info, self.base_dir)
|
|
113
|
+
src_path = os.path.join(self.base_dir, zip_info.filename)
|
|
114
|
+
dst_path = os.path.join(self.base_dir, executable)
|
|
115
|
+
|
|
116
|
+
# Move to final location
|
|
117
|
+
shutil.move(src_path, dst_path)
|
|
118
|
+
os.chmod(dst_path, 0o755)
|
|
119
|
+
extracted_files.append(dst_path)
|
|
120
|
+
|
|
121
|
+
# Clean up intermediate directories
|
|
122
|
+
parts = zip_info.filename.split('/')
|
|
123
|
+
if len(parts) > 1:
|
|
124
|
+
shutil.rmtree(os.path.join(self.base_dir, parts[0]))
|
|
125
|
+
|
|
126
|
+
return extracted_files
|
|
127
|
+
|
|
128
|
+
except Exception as e:
|
|
129
|
+
logging.error(f"Extraction error: {e}")
|
|
130
|
+
return []
|
|
131
|
+
|
|
132
|
+
def download(self) -> list:
|
|
133
|
+
try:
|
|
134
|
+
config = BENTO4_CONFIGURATION[self.os_name]
|
|
135
|
+
platform_str = config['versions'].get(self.arch)
|
|
136
|
+
|
|
137
|
+
if not platform_str:
|
|
138
|
+
raise ValueError(f"Unsupported architecture: {self.arch}")
|
|
139
|
+
|
|
140
|
+
download_url = config['download_url'].format(
|
|
141
|
+
version=self.version,
|
|
142
|
+
platform=platform_str
|
|
143
|
+
)
|
|
144
|
+
|
|
145
|
+
zip_path = os.path.join(self.base_dir, "bento4.zip")
|
|
146
|
+
console.print(f"[bold blue]Downloading Bento4 from {download_url}[/]")
|
|
147
|
+
|
|
148
|
+
if self._download_file(download_url, zip_path):
|
|
149
|
+
extracted_files = self._extract_executables(zip_path)
|
|
150
|
+
os.remove(zip_path)
|
|
151
|
+
|
|
152
|
+
if extracted_files:
|
|
153
|
+
console.print("[bold green]Bento4 successfully installed[/]")
|
|
154
|
+
return extracted_files
|
|
155
|
+
|
|
156
|
+
raise Exception("Failed to install Bento4")
|
|
157
|
+
|
|
158
|
+
except Exception as e:
|
|
159
|
+
logging.error(f"Error downloading Bento4: {e}")
|
|
160
|
+
console.print(f"[bold red]Error downloading Bento4: {str(e)}[/]")
|
|
161
|
+
return []
|
|
162
|
+
|
|
163
|
+
def check_mp4decrypt() -> str:
|
|
164
|
+
"""Check for mp4decrypt in the system and download if not found."""
|
|
165
|
+
try:
|
|
166
|
+
# First check if mp4decrypt is in PATH
|
|
167
|
+
mp4decrypt = "mp4decrypt.exe" if platform.system().lower() == "windows" else "mp4decrypt"
|
|
168
|
+
mp4decrypt_path = shutil.which(mp4decrypt)
|
|
169
|
+
|
|
170
|
+
if mp4decrypt_path:
|
|
171
|
+
return mp4decrypt_path
|
|
172
|
+
|
|
173
|
+
# If not found, check in binary directory
|
|
174
|
+
downloader = Bento4Downloader()
|
|
175
|
+
base_dir = downloader.base_dir
|
|
176
|
+
local_path = os.path.join(base_dir, mp4decrypt)
|
|
177
|
+
|
|
178
|
+
if os.path.exists(local_path):
|
|
179
|
+
return local_path
|
|
180
|
+
|
|
181
|
+
# Download if not found
|
|
182
|
+
extracted_files = downloader.download()
|
|
183
|
+
return extracted_files[0] if extracted_files else None
|
|
184
|
+
|
|
185
|
+
except Exception as e:
|
|
186
|
+
logging.error(f"Error checking or downloading mp4decrypt: {e}")
|
|
187
|
+
return None
|
|
188
|
+
|
|
189
|
+
except Exception as e:
|
|
190
|
+
logging.error(f"Error checking or downloading mp4decrypt: {e}")
|
|
191
|
+
return None
|
StreamingCommunity/Util/os.py
CHANGED
|
@@ -14,16 +14,17 @@ import contextlib
|
|
|
14
14
|
import importlib.metadata
|
|
15
15
|
import socket
|
|
16
16
|
|
|
17
|
+
|
|
17
18
|
# External library
|
|
18
19
|
from unidecode import unidecode
|
|
19
20
|
from rich.console import Console
|
|
20
21
|
from rich.prompt import Prompt
|
|
21
22
|
from pathvalidate import sanitize_filename, sanitize_filepath
|
|
22
|
-
from dns.resolver import dns
|
|
23
23
|
|
|
24
24
|
|
|
25
25
|
# Internal utilities
|
|
26
26
|
from .ffmpeg_installer import check_ffmpeg
|
|
27
|
+
from .bento4_installer import check_mp4decrypt
|
|
27
28
|
|
|
28
29
|
|
|
29
30
|
# Variable
|
|
@@ -283,43 +284,6 @@ class InternManager():
|
|
|
283
284
|
else:
|
|
284
285
|
return f"{bytes / (1024 * 1024):.2f} MB/s"
|
|
285
286
|
|
|
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
287
|
def check_dns_resolve(self, domains_list: list = None):
|
|
324
288
|
"""
|
|
325
289
|
Check if the system's current DNS server can resolve a domain name.
|
|
@@ -347,6 +311,7 @@ class OsSummary:
|
|
|
347
311
|
self.ffmpeg_path = None
|
|
348
312
|
self.ffprobe_path = None
|
|
349
313
|
self.ffplay_path = None
|
|
314
|
+
self.mp4decrypt_path = None
|
|
350
315
|
|
|
351
316
|
def get_binary_directory(self):
|
|
352
317
|
"""Get the binary directory based on OS."""
|
|
@@ -441,10 +406,8 @@ class OsSummary:
|
|
|
441
406
|
}
|
|
442
407
|
arch = arch_map.get(arch, arch)
|
|
443
408
|
|
|
444
|
-
# Check
|
|
409
|
+
# Check FFmpeg binaries
|
|
445
410
|
if os.path.exists(binary_dir):
|
|
446
|
-
|
|
447
|
-
# Search for any file containing 'ffmpeg' and the architecture
|
|
448
411
|
ffmpeg_files = glob.glob(os.path.join(binary_dir, f'*ffmpeg*{arch}*'))
|
|
449
412
|
ffprobe_files = glob.glob(os.path.join(binary_dir, f'*ffprobe*{arch}*'))
|
|
450
413
|
|
|
@@ -452,7 +415,6 @@ class OsSummary:
|
|
|
452
415
|
self.ffmpeg_path = ffmpeg_files[0]
|
|
453
416
|
self.ffprobe_path = ffprobe_files[0]
|
|
454
417
|
|
|
455
|
-
# Set executable permissions if needed
|
|
456
418
|
if system != 'windows':
|
|
457
419
|
os.chmod(self.ffmpeg_path, 0o755)
|
|
458
420
|
os.chmod(self.ffprobe_path, 0o755)
|
|
@@ -461,11 +423,19 @@ class OsSummary:
|
|
|
461
423
|
else:
|
|
462
424
|
self.ffmpeg_path, self.ffprobe_path, self.ffplay_path = check_ffmpeg()
|
|
463
425
|
|
|
426
|
+
# Check mp4decrypt
|
|
427
|
+
self.mp4decrypt_path = check_mp4decrypt()
|
|
428
|
+
|
|
464
429
|
if not self.ffmpeg_path or not self.ffprobe_path:
|
|
465
430
|
console.log("[red]Can't locate ffmpeg or ffprobe")
|
|
466
431
|
sys.exit(0)
|
|
467
432
|
|
|
433
|
+
if not self.mp4decrypt_path:
|
|
434
|
+
console.log("[yellow]Warning: mp4decrypt not found")
|
|
435
|
+
|
|
468
436
|
console.print(f"[cyan]Path: [red]ffmpeg [bold yellow]'{self.ffmpeg_path}'[/bold yellow][white], [red]ffprobe '[bold yellow]{self.ffprobe_path}'[/bold yellow]")
|
|
437
|
+
if self.mp4decrypt_path:
|
|
438
|
+
console.print(f"[cyan]Path: [red]mp4decrypt [bold yellow]'{self.mp4decrypt_path}'[/bold yellow]")
|
|
469
439
|
|
|
470
440
|
|
|
471
441
|
os_manager = OsManager()
|
|
@@ -478,10 +448,6 @@ def suppress_output():
|
|
|
478
448
|
with contextlib.redirect_stdout(io.StringIO()):
|
|
479
449
|
yield
|
|
480
450
|
|
|
481
|
-
def compute_sha1_hash(input_string: str) -> str:
|
|
482
|
-
"""Computes the SHA-1 hash of the input string."""
|
|
483
|
-
return hashlib.sha1(input_string.encode()).hexdigest()
|
|
484
|
-
|
|
485
451
|
def get_call_stack():
|
|
486
452
|
"""Retrieves the current call stack with details about each call."""
|
|
487
453
|
stack = inspect.stack()
|
|
@@ -512,3 +478,27 @@ def get_ffmpeg_path():
|
|
|
512
478
|
def get_ffprobe_path():
|
|
513
479
|
"""Returns the path of FFprobe."""
|
|
514
480
|
return os_summary.ffprobe_path
|
|
481
|
+
|
|
482
|
+
def get_mp4decrypt_path():
|
|
483
|
+
"""Returns the path of mp4decrypt."""
|
|
484
|
+
return os_summary.mp4decrypt_path
|
|
485
|
+
|
|
486
|
+
def get_wvd_path():
|
|
487
|
+
"""
|
|
488
|
+
Searches the system's binary folder and returns the path of the first file ending with 'wvd'.
|
|
489
|
+
Returns None if not found.
|
|
490
|
+
"""
|
|
491
|
+
system = platform.system().lower()
|
|
492
|
+
home = os.path.expanduser('~')
|
|
493
|
+
if system == 'windows':
|
|
494
|
+
binary_dir = os.path.join(os.path.splitdrive(home)[0] + os.path.sep, 'binary')
|
|
495
|
+
elif system == 'darwin':
|
|
496
|
+
binary_dir = os.path.join(home, 'Applications', 'binary')
|
|
497
|
+
else:
|
|
498
|
+
binary_dir = os.path.join(home, '.local', 'bin', 'binary')
|
|
499
|
+
if not os.path.exists(binary_dir):
|
|
500
|
+
return None
|
|
501
|
+
for file in os.listdir(binary_dir):
|
|
502
|
+
if file.lower().endswith('wvd'):
|
|
503
|
+
return os.path.join(binary_dir, file)
|
|
504
|
+
return None
|
StreamingCommunity/__init__.py
CHANGED
|
@@ -3,4 +3,5 @@
|
|
|
3
3
|
from .run import main
|
|
4
4
|
from .Lib.Downloader.HLS.downloader import HLS_Downloader
|
|
5
5
|
from .Lib.Downloader.MP4.downloader import MP4_downloader
|
|
6
|
-
from .Lib.Downloader.TOR.downloader import TOR_downloader
|
|
6
|
+
from .Lib.Downloader.TOR.downloader import TOR_downloader
|
|
7
|
+
from .Lib.Downloader.DASH.downloader import DASH_Downloader
|
StreamingCommunity/run.py
CHANGED
|
@@ -33,6 +33,7 @@ from StreamingCommunity.TelegramHelp.telegram_bot import get_bot_instance, Teleg
|
|
|
33
33
|
SHOW_TRENDING = config_manager.get_bool('DEFAULT', 'show_trending')
|
|
34
34
|
NOT_CLOSE_CONSOLE = config_manager.get_bool('DEFAULT', 'not_close')
|
|
35
35
|
TELEGRAM_BOT = config_manager.get_bool('DEFAULT', 'telegram_bot')
|
|
36
|
+
BYPASS_DNS = config_manager.get_bool('DEFAULT', 'bypass_dns')
|
|
36
37
|
|
|
37
38
|
|
|
38
39
|
# Variable
|
|
@@ -227,16 +228,16 @@ def main(script_id = 0):
|
|
|
227
228
|
# Get all site hostname
|
|
228
229
|
hostname_list = [hostname for site_info in config_manager.configSite.values() if (hostname := _extract_hostname(site_info.get('full_url')))]
|
|
229
230
|
|
|
230
|
-
if not
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
231
|
+
if not BYPASS_DNS:
|
|
232
|
+
if not internet_manager.check_dns_resolve(hostname_list):
|
|
233
|
+
console.print("[red] ERROR: DNS configuration is required!")
|
|
234
|
+
console.print("[red]The program cannot function correctly without proper DNS settings.")
|
|
235
|
+
console.print("[yellow]Please configure one of these DNS servers:")
|
|
236
|
+
console.print("[red]• Cloudflare (1.1.1.1) 'https://developers.cloudflare.com/1.1.1.1/setup/windows/'")
|
|
237
|
+
console.print("[red]• Quad9 (9.9.9.9) 'https://docs.quad9.net/Setup_Guides/Windows/Windows_10/'")
|
|
238
|
+
console.print("\n[yellow]⚠️ The program will not work until you configure your DNS settings.")
|
|
239
|
+
|
|
240
|
+
os._exit(0)
|
|
240
241
|
|
|
241
242
|
# Load search functions
|
|
242
243
|
search_functions = load_search_functions()
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: StreamingCommunity
|
|
3
|
-
Version: 3.2.
|
|
3
|
+
Version: 3.2.7
|
|
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
|
|
@@ -18,14 +18,13 @@ Requires-Dist: certifi
|
|
|
18
18
|
Requires-Dist: psutil
|
|
19
19
|
Requires-Dist: unidecode
|
|
20
20
|
Requires-Dist: curl_cffi
|
|
21
|
-
Requires-Dist: dnspython
|
|
22
21
|
Requires-Dist: jsbeautifier
|
|
23
22
|
Requires-Dist: pathvalidate
|
|
24
23
|
Requires-Dist: pycryptodomex
|
|
25
24
|
Requires-Dist: ua-generator
|
|
26
25
|
Requires-Dist: qbittorrent-api
|
|
27
26
|
Requires-Dist: pyTelegramBotAPI
|
|
28
|
-
Requires-Dist:
|
|
27
|
+
Requires-Dist: pywidevine
|
|
29
28
|
Dynamic: author
|
|
30
29
|
Dynamic: description
|
|
31
30
|
Dynamic: description-content-type
|
|
@@ -149,7 +148,7 @@ python run_streaming.py
|
|
|
149
148
|
Download HTTP Live Streaming (HLS) content from m3u8 URLs.
|
|
150
149
|
|
|
151
150
|
```python
|
|
152
|
-
from StreamingCommunity
|
|
151
|
+
from StreamingCommunity import HLS_Downloader
|
|
153
152
|
|
|
154
153
|
# Initialize with m3u8 URL and optional output path
|
|
155
154
|
downloader = HLS_Downloader(
|
|
@@ -170,7 +169,7 @@ See [HLS example](./Test/Download/HLS.py) for complete usage.
|
|
|
170
169
|
Direct MP4 file downloader with support for custom headers and referrer.
|
|
171
170
|
|
|
172
171
|
```python
|
|
173
|
-
from StreamingCommunity
|
|
172
|
+
from StreamingCommunity import MP4_downloader
|
|
174
173
|
|
|
175
174
|
# Basic usage
|
|
176
175
|
downloader = MP4_downloader(
|
|
@@ -202,7 +201,7 @@ See [MP4 example](./Test/Download/MP4.py) for complete usage.
|
|
|
202
201
|
Download content via torrent magnet links.
|
|
203
202
|
|
|
204
203
|
```python
|
|
205
|
-
from StreamingCommunity
|
|
204
|
+
from StreamingCommunity import TOR_downloader
|
|
206
205
|
|
|
207
206
|
# Initialize torrent client
|
|
208
207
|
client = TOR_downloader()
|
|
@@ -526,8 +525,6 @@ To enable qBittorrent integration, follow the setup guide [here](https://github.
|
|
|
526
525
|
"default_video_workser": 12,
|
|
527
526
|
"default_audio_workser": 12,
|
|
528
527
|
"segment_timeout": 8,
|
|
529
|
-
"download_audio": true,
|
|
530
|
-
"merge_audio": true,
|
|
531
528
|
"specific_list_audio": [
|
|
532
529
|
"ita"
|
|
533
530
|
],
|
|
@@ -552,7 +549,6 @@ To enable qBittorrent integration, follow the setup guide [here](https://github.
|
|
|
552
549
|
|
|
553
550
|
#### Audio Settings
|
|
554
551
|
- `download_audio`: Whether to download audio tracks
|
|
555
|
-
- `merge_audio`: Whether to merge audio with video
|
|
556
552
|
- `specific_list_audio`: List of audio languages to download
|
|
557
553
|
* Can be changed with `--specific_list_audio ita,eng`
|
|
558
554
|
|
|
@@ -839,3 +835,5 @@ API non ufficiale per accedere ai contenuti del sito italiano StreamingCommunity
|
|
|
839
835
|
# Disclaimer
|
|
840
836
|
|
|
841
837
|
This software is provided "as is", without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose, and noninfringement. In no event shall the authors or copyright holders be liable for any claim, damages, or other liability, whether in an action of contract, tort, or otherwise, arising from, out of, or in connection with the software or the use or other dealings in the software.
|
|
838
|
+
|
|
839
|
+
> **Note:** DASH downloads require a valid L3 CDM (Content Decryption Module) to proceed. This project does not provide, include, or facilitate obtaining any CDM. Users are responsible for ensuring compliance with all applicable laws and requirements regarding DRM and decryption modules.
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
StreamingCommunity/__init__.py,sha256=NPxefEfOANbfmXVfYMlofaZfzcMMcrUUpjWx81X_cQQ,267
|
|
2
|
+
StreamingCommunity/global_search.py,sha256=ip3D0OKNRTXHpe_Wy7v2KM-yNZdnnbG5FOBYSSk6wB8,12401
|
|
3
|
+
StreamingCommunity/run.py,sha256=_7e8BEGFCCHdKSv64q6M3IenxT0-TQ629VJaAZMPhhY,14242
|
|
4
|
+
StreamingCommunity/Api/Player/ddl.py,sha256=cPinK99iX4ThvAHLlzcACcnFvM-M_NK0f4imh9PQY1I,2174
|
|
5
|
+
StreamingCommunity/Api/Player/hdplayer.py,sha256=TTI_DNR9swFlUayJPfZBwqcH2pmw-oLk9PHu725wxnY,1936
|
|
6
|
+
StreamingCommunity/Api/Player/maxstream.py,sha256=JlVTCAo9ze0wF2h0eNPYqdorhwK7DPXpmLAyHMnT7-Y,5017
|
|
7
|
+
StreamingCommunity/Api/Player/mediapolisvod.py,sha256=Npm3HHUO5Wav8c2QX9E2c3SSW6d1STJw-kK8kHRF-zo,2403
|
|
8
|
+
StreamingCommunity/Api/Player/mixdrop.py,sha256=rZOE14yFdQM0l7ZNRMzFtOpaedgXUo6gdvoBu24y7IE,5127
|
|
9
|
+
StreamingCommunity/Api/Player/supervideo.py,sha256=AuAA6eXYODJN-ytdvKjqlzZLOHpwx3kwgy1CSiogs-o,5388
|
|
10
|
+
StreamingCommunity/Api/Player/sweetpixel.py,sha256=Qi4dcEDXbFjFPH9CHl0T0DfIJUfUXL0vyFdIUnIHkMI,1741
|
|
11
|
+
StreamingCommunity/Api/Player/vixcloud.py,sha256=0DnukAIBqGqTmL9I6JkpAkHLMf1UG1D_J8c7zt6KDmU,6609
|
|
12
|
+
StreamingCommunity/Api/Player/Helper/Vixcloud/js_parser.py,sha256=U-8QlD5kGzIk3-4t4D6QyYmiDe8UBrSuVi1YHRQb7AU,4295
|
|
13
|
+
StreamingCommunity/Api/Player/Helper/Vixcloud/util.py,sha256=mTEAND-KepqRHRYlAorJ1mc6ICB-f0Whhp5OZ8R4MJ8,5306
|
|
14
|
+
StreamingCommunity/Api/Site/altadefinizione/__init__.py,sha256=6CF9MCh3AstetNlTqG_uzRUQEmMR4iix2vPzGbl3EWM,4180
|
|
15
|
+
StreamingCommunity/Api/Site/altadefinizione/film.py,sha256=fMrDew-M9S4ZTXNTYir4GJexQjG5aSlIYL_k-92iWKc,3701
|
|
16
|
+
StreamingCommunity/Api/Site/altadefinizione/series.py,sha256=I_Fol3grdTZmLwLFskkU7v9fcddzQUENtWmgeNXoC4s,8177
|
|
17
|
+
StreamingCommunity/Api/Site/altadefinizione/site.py,sha256=2kUNQ8ebYlX5dkSql-CvEhU01TOTNtuyEMIAD6SC3lg,2865
|
|
18
|
+
StreamingCommunity/Api/Site/altadefinizione/util/ScrapeSerie.py,sha256=9iulNlnNAhTfI5iKNW3I6pZqYeYwovAswa13L3LPGDM,4251
|
|
19
|
+
StreamingCommunity/Api/Site/animeunity/__init__.py,sha256=cLuZOgtQ-1vKIKf3iJjznBu3ET1Q3WZtO0UoK9U0YPU,4034
|
|
20
|
+
StreamingCommunity/Api/Site/animeunity/film.py,sha256=Vqg6yag2siR-Y3ougBsV8mzdQXChxg6ghz_KVXFQ3pE,998
|
|
21
|
+
StreamingCommunity/Api/Site/animeunity/serie.py,sha256=wqpbry4wkkwc5M2sf3k6icQRRZ7Jw9hv4BE8BlMHec0,5696
|
|
22
|
+
StreamingCommunity/Api/Site/animeunity/site.py,sha256=GLULPQATMHcXiH99d772v1ICH-PnnZgSM3q5__eN-gs,4977
|
|
23
|
+
StreamingCommunity/Api/Site/animeunity/util/ScrapeSerie.py,sha256=UladSvOlTEVLiV0-rAz45zrET5qRHMuTGuKEpeQoumU,3872
|
|
24
|
+
StreamingCommunity/Api/Site/animeworld/__init__.py,sha256=fjStJyOl6VBVDgoi6wr2yA0CQ_UQ4atTBzal0gOBgRM,2822
|
|
25
|
+
StreamingCommunity/Api/Site/animeworld/film.py,sha256=Ysp0k5AlrOsl19S9LV4nwVg8cjFf5w0FZRO9CiO6NxA,1748
|
|
26
|
+
StreamingCommunity/Api/Site/animeworld/serie.py,sha256=b1yuBnLNqJ-IWEVqLnQuYv6VbUQ60a5YFpZbJrS3lnI,3486
|
|
27
|
+
StreamingCommunity/Api/Site/animeworld/site.py,sha256=HBUAYiOa-UPGAO4lyTL1qIqqpDNVhWRHZ-nyLFltl7I,3702
|
|
28
|
+
StreamingCommunity/Api/Site/animeworld/util/ScrapeSerie.py,sha256=EDTouftxigb4ojTEGWC0sOgOLCNjE1-1GFEMrK-qzRQ,3615
|
|
29
|
+
StreamingCommunity/Api/Site/cb01new/__init__.py,sha256=95M3DiNbLbZ6v1oFkPuAPEVJWf12W2JzJvxZKjZs_V8,2071
|
|
30
|
+
StreamingCommunity/Api/Site/cb01new/film.py,sha256=mjJQFoh8aTp7ydmr6_WLT0G0_HfEDGeVXp3QfSalVRw,1680
|
|
31
|
+
StreamingCommunity/Api/Site/cb01new/site.py,sha256=82GPxjOyY7Dlj1WbA0YNovgbKhuF3Vmca07IVXGh6lE,2139
|
|
32
|
+
StreamingCommunity/Api/Site/crunchyroll/__init__.py,sha256=hBb29hfYD_rGMkhhAknnkBOB-oG_yE2rfUtbPw0wPLQ,3456
|
|
33
|
+
StreamingCommunity/Api/Site/crunchyroll/film.py,sha256=AkDWcvDe43zSJH_Pxig4JmagDJuUw2PkB_q6dChL7MQ,2559
|
|
34
|
+
StreamingCommunity/Api/Site/crunchyroll/series.py,sha256=VCBnVrOj_Cmu4pAWGSfAgf-7GP8GsmSINLfHBwZ7f6U,7209
|
|
35
|
+
StreamingCommunity/Api/Site/crunchyroll/site.py,sha256=BmOQw060M7KvH_wL-V_x1s6918rxM_Pp54tuNgG5ju0,3210
|
|
36
|
+
StreamingCommunity/Api/Site/crunchyroll/util/ScrapeSerie.py,sha256=ZY6z4pT5q7igiNZnJAvE9x0WiORTvFSH-U_CpqOzusA,7855
|
|
37
|
+
StreamingCommunity/Api/Site/crunchyroll/util/get_license.py,sha256=KpVvJbGUTLeVD-tt8r7ajBPWVT7Tm6GrKwzpW8CS-tg,6881
|
|
38
|
+
StreamingCommunity/Api/Site/guardaserie/__init__.py,sha256=vnbt1DVG6nmHaLSUOO_2NQYi9iTiOPLrwtvUd_DZDZg,2800
|
|
39
|
+
StreamingCommunity/Api/Site/guardaserie/series.py,sha256=o7jjf64E95A2rGzYSEARTsZgOlQHeuXtfp4IlD4GtTU,6462
|
|
40
|
+
StreamingCommunity/Api/Site/guardaserie/site.py,sha256=z9PKJesarOFlIrCeaed5095poJWYroVoWRV1LYTR4E4,2252
|
|
41
|
+
StreamingCommunity/Api/Site/guardaserie/util/ScrapeSerie.py,sha256=hPul0-9sgi0IZplHn9UywtpAa3xhVKDC0lefb5l81-g,4413
|
|
42
|
+
StreamingCommunity/Api/Site/mediasetinfinity/__init__.py,sha256=dBKs42xEuIjHZ8mnqmjpdySjFYYuwDi6drWbBvzMzR8,3257
|
|
43
|
+
StreamingCommunity/Api/Site/mediasetinfinity/film.py,sha256=mOKktBmlW90mRDZfENWNpp5l2svRGXeo6MG0S7X2nlM,2582
|
|
44
|
+
StreamingCommunity/Api/Site/mediasetinfinity/series.py,sha256=JLcXcq5OKqBCYwcuworzHl2DNXO2ivxV-cqF8HaqKD8,7131
|
|
45
|
+
StreamingCommunity/Api/Site/mediasetinfinity/site.py,sha256=SVNcqcQAOxAKw0mcUzeQqDbfcnRFEPtxKNjl2Xe7FlY,3240
|
|
46
|
+
StreamingCommunity/Api/Site/mediasetinfinity/util/ScrapeSerie.py,sha256=-PUhtJ1Umb1SjLh6Ujs0cOmOi-uC0WrSkIecv6XDhgQ,9382
|
|
47
|
+
StreamingCommunity/Api/Site/mediasetinfinity/util/fix_mpd.py,sha256=B7uZfQ8X4p8KsiPVangFSs5rKKKpA3tavjPCdNrqyCc,1712
|
|
48
|
+
StreamingCommunity/Api/Site/mediasetinfinity/util/get_license.py,sha256=-uM5G2M-9MwJq-TyXEV6PcpsWBoGdJ8KcuNQwgn5cos,6330
|
|
49
|
+
StreamingCommunity/Api/Site/raiplay/__init__.py,sha256=6Hjkc_C0du_stc9cOKJIyWjW-YQPMmJLoLXZpiwX1S8,3106
|
|
50
|
+
StreamingCommunity/Api/Site/raiplay/film.py,sha256=uGN4sMMSkUJHjOUZbI-8yjpy5oGTcw1sNTPxct_PKvc,1967
|
|
51
|
+
StreamingCommunity/Api/Site/raiplay/series.py,sha256=Lfxe0cvsipcDZbX6W2bYLbnuXb-pcEEgBT-Tq8CXwaM,6147
|
|
52
|
+
StreamingCommunity/Api/Site/raiplay/site.py,sha256=kWo2YPcUOPgsThJU_RahnDwJP4QpkmgzdzRqtoubR5U,3166
|
|
53
|
+
StreamingCommunity/Api/Site/raiplay/util/ScrapeSerie.py,sha256=V7fFP9KLuMXitRsHtInxUJBcGClfSk_tOUNWFC8pG5A,5807
|
|
54
|
+
StreamingCommunity/Api/Site/streamingcommunity/__init__.py,sha256=q5F3e2h7fuYKGLMfXOzK71sGfPW38CYP-dfGjwFe3mQ,5577
|
|
55
|
+
StreamingCommunity/Api/Site/streamingcommunity/film.py,sha256=ma9cLfU4w_e-qoN2JMLZdB4_LZoYa38W79y_MYstwTg,2723
|
|
56
|
+
StreamingCommunity/Api/Site/streamingcommunity/series.py,sha256=TlqvvOdB1FCHwsGCfvcBE6bzcJbOEfPC9lGiMrDm5vU,8952
|
|
57
|
+
StreamingCommunity/Api/Site/streamingcommunity/site.py,sha256=MMi4mcKu0iPhud685IVW4xc7hFkJe09OjT6L90tsRHk,3985
|
|
58
|
+
StreamingCommunity/Api/Site/streamingcommunity/util/ScrapeSerie.py,sha256=vnqVwDb4sxEXzMcr9B4ZZHFuADwcHSMCa3VMguKIe_U,5555
|
|
59
|
+
StreamingCommunity/Api/Site/streamingwatch/__init__.py,sha256=Swp2KHYBH96W8yBbjGF5x-xjnoal7hNj1JE05CWMsz4,3337
|
|
60
|
+
StreamingCommunity/Api/Site/streamingwatch/film.py,sha256=bLV3KjF7KFhpp8BvfQrpSFP9R__YmTlB-ypJBSivT5o,1637
|
|
61
|
+
StreamingCommunity/Api/Site/streamingwatch/series.py,sha256=ak4RdpR2-IuAimP3x5ZqEv9CH2_RcTZGN1hXlpoixJo,6141
|
|
62
|
+
StreamingCommunity/Api/Site/streamingwatch/site.py,sha256=dHEL5_3nSBynlXz82IUbCHkxIpuvhmE2aRpdE1b6wq8,3448
|
|
63
|
+
StreamingCommunity/Api/Site/streamingwatch/util/ScrapeSerie.py,sha256=Ui_2Vccf6C_ZLLMxLbUL0r5n8mWQiQTl4YZQAhXRf0g,4268
|
|
64
|
+
StreamingCommunity/Api/Template/__init__.py,sha256=oyfd_4_g5p5q6mxb_rKwSsudZnTM3W3kg1tLwxg-v-Q,46
|
|
65
|
+
StreamingCommunity/Api/Template/config_loader.py,sha256=2RT_0mqQmWzXM4rYaqss-yhXztYAcfNkTalFPjzv270,2056
|
|
66
|
+
StreamingCommunity/Api/Template/site.py,sha256=vUcHK4fuoBtDtO_Kgb4bQqfQDtVH5Jg9_-mVhZA3NTU,4919
|
|
67
|
+
StreamingCommunity/Api/Template/Class/SearchType.py,sha256=LOlE8UgraEM0UAVeNCThDGi8bleei31p7KpryuZm3VE,2530
|
|
68
|
+
StreamingCommunity/Api/Template/Util/__init__.py,sha256=ZWQQd6iymNFDol9HaKPhVBoRX1W-xHJZgU_mZvLVdsM,196
|
|
69
|
+
StreamingCommunity/Api/Template/Util/manage_ep.py,sha256=FYe2DC9SXIXzlRYI7fW4ieBpfrxYzsUgt2C47tYRk7U,9252
|
|
70
|
+
StreamingCommunity/Lib/Downloader/__init__.py,sha256=JhbBh5hOnSM7VmtkxJ7zZ_FtWEC1JdnKThsSBjLV5FY,140
|
|
71
|
+
StreamingCommunity/Lib/Downloader/DASH/cdm_helpher.py,sha256=at7_pYAbb_391PrQXWIxPZYT9gaS7qrVgKMdbQSMSyw,4714
|
|
72
|
+
StreamingCommunity/Lib/Downloader/DASH/decrypt.py,sha256=RuzxsXjJKKzdbbUESfujCXqg_t1brOJLAvVNFWej48o,2353
|
|
73
|
+
StreamingCommunity/Lib/Downloader/DASH/downloader.py,sha256=nuYZLM_Np0TKZ7wc7hYL5hivrEzqQ7sdvfx40LnVP_Q,8093
|
|
74
|
+
StreamingCommunity/Lib/Downloader/DASH/parser.py,sha256=ZW6oErH9i8Nrp6yPc8usiRBv9ftkfVYh46wEg8MOl6o,9835
|
|
75
|
+
StreamingCommunity/Lib/Downloader/DASH/segments.py,sha256=ZV9FYibbS8E722MHVxl16N6rN1tPioZTNqO4jWBpGGo,12672
|
|
76
|
+
StreamingCommunity/Lib/Downloader/HLS/downloader.py,sha256=yzusDF32uSR_MZqdrNoJ27nR2VXRvflckTxiw04JoNk,21189
|
|
77
|
+
StreamingCommunity/Lib/Downloader/HLS/segments.py,sha256=0uEjyG8vZLKSEkZGmkheeZXqWCyF8-UbuFI1tEil5JM,12257
|
|
78
|
+
StreamingCommunity/Lib/Downloader/MP4/downloader.py,sha256=OBObY930wrOG0IUlDRROOfgU_u6uYHvckED4nnPjXzs,7367
|
|
79
|
+
StreamingCommunity/Lib/Downloader/TOR/downloader.py,sha256=CrRGdLGI_45AnhtTZm8r7KO7uGmU9k6pywy-qO18LG8,19242
|
|
80
|
+
StreamingCommunity/Lib/FFmpeg/__init__.py,sha256=6PBsZdE1jrD2EKOVyx3JEHnyDZzVeKlPkH5T0zyfOgU,130
|
|
81
|
+
StreamingCommunity/Lib/FFmpeg/capture.py,sha256=UUBaFK8WLkvqxsElqyEj-JvDvd9zUFZ2bRwRoUcGjVk,5039
|
|
82
|
+
StreamingCommunity/Lib/FFmpeg/command.py,sha256=Fy_vs1tqIeG8Mgtj5aZaUp7oLDAceBPN72pqqKViD8s,10716
|
|
83
|
+
StreamingCommunity/Lib/FFmpeg/util.py,sha256=byM5DzAA-8Ts0FtviEPfbFJKN_PuxVFGjELgD_FEhsk,9287
|
|
84
|
+
StreamingCommunity/Lib/M3U8/__init__.py,sha256=H_KS2eDd3kVXMziFJnD0FCPvPHEizaqfoA36ElTv_r8,170
|
|
85
|
+
StreamingCommunity/Lib/M3U8/decryptor.py,sha256=kuxxsd3eN0VGRrMJWXzHo8gCpT0u3fSZs_lwxlE5Fqs,2948
|
|
86
|
+
StreamingCommunity/Lib/M3U8/estimator.py,sha256=8gwTxJ3poRqZdHUTD9_oqXegiPWSXFuqLmqCZBnXS8A,5893
|
|
87
|
+
StreamingCommunity/Lib/M3U8/parser.py,sha256=cSjXPOSgTewrfLgREyQ47wzoOeoYo3L4lOfEWZKxad8,22485
|
|
88
|
+
StreamingCommunity/Lib/M3U8/url_fixer.py,sha256=zldE4yOuNBV6AAvL1KI6p7XdRI_R5YZRscbDgT1564M,1735
|
|
89
|
+
StreamingCommunity/Lib/TMBD/__init__.py,sha256=XzE42tw3Ws59DD1PF8WmGtZ0D4D7Hk3Af8QthNE-22U,66
|
|
90
|
+
StreamingCommunity/Lib/TMBD/obj_tmbd.py,sha256=dRSvJFS5yqmsBZcw2wqbStcBtXNjU_3n5czMyremAtU,1187
|
|
91
|
+
StreamingCommunity/Lib/TMBD/tmdb.py,sha256=byg0EFnlmd9JeLvn1N9K3QkB1KEfeMuFa7OVfGqks1Y,10685
|
|
92
|
+
StreamingCommunity/TelegramHelp/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
93
|
+
StreamingCommunity/TelegramHelp/config.json,sha256=4Tnram-K5wNK0QjWY9R4VpiHfGnMbahvDEdJ2VBWOoc,1460
|
|
94
|
+
StreamingCommunity/TelegramHelp/telegram_bot.py,sha256=zCqj7xBofh9FYfEYl55mgT945jqtKo7qJhn-SMLvAvA,26455
|
|
95
|
+
StreamingCommunity/Upload/update.py,sha256=ZGQHcnTLAfXla_PqvykDeg2-WKOYfX9zX2I3KrdKHpc,3814
|
|
96
|
+
StreamingCommunity/Upload/version.py,sha256=xHCI5wpbmfATQoDKu6smmB7Jq_R3elpw8qGq48nmaA8,171
|
|
97
|
+
StreamingCommunity/Util/bento4_installer.py,sha256=P5ipziMCvezxan8GUh9vm8B1LXGyHusFVDf842LSwis,6966
|
|
98
|
+
StreamingCommunity/Util/color.py,sha256=NvD0Eni-25oOOkY-szCEoc0lGvzQxyL7xhM0RE4EvUM,458
|
|
99
|
+
StreamingCommunity/Util/config_json.py,sha256=4sn-vvrYybZMOlT-blx3bM9njxQRQS_HwSPfqQ0qZ94,24226
|
|
100
|
+
StreamingCommunity/Util/ffmpeg_installer.py,sha256=yRVIPwbh05tZ-duZmXkH0qasLNxaQCAT_E4cTP79Z3c,14890
|
|
101
|
+
StreamingCommunity/Util/headers.py,sha256=RP3A6Gr8UB8VU6uzw_yDOjEKkIFKpi7Gi6_w2ACxE30,292
|
|
102
|
+
StreamingCommunity/Util/logger.py,sha256=9kGD6GmWj2pM8ADpJc85o7jm8DD0c5Aguqnq-9kmxos,3314
|
|
103
|
+
StreamingCommunity/Util/message.py,sha256=81vPmsGBusovIhheIO4Ec6p7BYvMj1wE_CthtRyp6OM,1333
|
|
104
|
+
StreamingCommunity/Util/os.py,sha256=vLNRGWsQYTSUGdpj19fR_n0i-6bhZYeJh5IZpahdyKM,16832
|
|
105
|
+
StreamingCommunity/Util/table.py,sha256=Nw5PlsvfEIOQZWy5VhsU5OK3heuBXGwsqmLl0k8yQzc,9813
|
|
106
|
+
streamingcommunity-3.2.7.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
|
|
107
|
+
streamingcommunity-3.2.7.dist-info/METADATA,sha256=pCGVpbT5rIjdWH1qxZcIUxdNWvIAWd78bA0KIJ0hk4U,25312
|
|
108
|
+
streamingcommunity-3.2.7.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
109
|
+
streamingcommunity-3.2.7.dist-info/entry_points.txt,sha256=Qph9XYfDC8n4LfDLOSl6gJGlkb9eFb5f-JOr_Wb_5rk,67
|
|
110
|
+
streamingcommunity-3.2.7.dist-info/top_level.txt,sha256=YsOcxKP-WOhWpIWgBlh0coll9XUx7aqmRPT7kmt3fH0,19
|
|
111
|
+
streamingcommunity-3.2.7.dist-info/RECORD,,
|
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
# 02.07.24
|
|
2
|
-
|
|
3
|
-
from urllib.parse import quote_plus
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
# External library
|
|
7
|
-
from rich.console import Console
|
|
8
|
-
from rich.prompt import Prompt
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
# Internal utilities
|
|
12
|
-
from StreamingCommunity.Api.Template import get_select_title
|
|
13
|
-
from StreamingCommunity.Api.Template.config_loader import site_constant
|
|
14
|
-
from StreamingCommunity.Api.Template.Class.SearchType import MediaItem
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
# Logic class
|
|
18
|
-
from .site import title_search, media_search_manager, table_show_manager
|
|
19
|
-
from .title import download_title
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
# Variable
|
|
23
|
-
indice = 3
|
|
24
|
-
_useFor = "Torrent"
|
|
25
|
-
_priority = 0
|
|
26
|
-
_engineDownload = "Torrent"
|
|
27
|
-
_deprecate = True
|
|
28
|
-
|
|
29
|
-
console = Console()
|
|
30
|
-
msg = Prompt()
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
def process_search_result(select_title):
|
|
35
|
-
"""
|
|
36
|
-
Handles the search result and initiates the download for either a film or series.
|
|
37
|
-
"""
|
|
38
|
-
download_title(select_title)
|
|
39
|
-
|
|
40
|
-
def search(string_to_search: str = None, get_onlyDatabase: bool = False, direct_item: dict = None):
|
|
41
|
-
"""
|
|
42
|
-
Main function of the application for search.
|
|
43
|
-
|
|
44
|
-
Parameters:
|
|
45
|
-
string_to_search (str, optional): String to search for
|
|
46
|
-
get_onylDatabase (bool, optional): If True, return only the database object
|
|
47
|
-
direct_item (dict, optional): Direct item to process (bypass search)
|
|
48
|
-
"""
|
|
49
|
-
if direct_item:
|
|
50
|
-
select_title = MediaItem(**direct_item)
|
|
51
|
-
process_search_result(select_title)
|
|
52
|
-
return
|
|
53
|
-
|
|
54
|
-
if string_to_search is None:
|
|
55
|
-
string_to_search = msg.ask(f"\n[purple]Insert word to search in [green]{site_constant.SITE_NAME}").strip()
|
|
56
|
-
|
|
57
|
-
# Perform the database search
|
|
58
|
-
len_database = title_search(quote_plus(string_to_search))
|
|
59
|
-
|
|
60
|
-
# If only the database is needed, return the manager
|
|
61
|
-
if get_onlyDatabase:
|
|
62
|
-
return media_search_manager
|
|
63
|
-
|
|
64
|
-
if len_database > 0:
|
|
65
|
-
select_title = get_select_title(table_show_manager, media_search_manager, len_database)
|
|
66
|
-
download_title(select_title)
|
|
67
|
-
|
|
68
|
-
else:
|
|
69
|
-
|
|
70
|
-
# If no results are found, ask again
|
|
71
|
-
console.print(f"\n[red]Nothing matching was found for[white]: [purple]{string_to_search}")
|
|
72
|
-
search()
|