StreamingCommunity 3.0.5__py3-none-any.whl → 3.0.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.

Files changed (33) hide show
  1. StreamingCommunity/Api/Player/maxstream.py +141 -0
  2. StreamingCommunity/Api/Player/vixcloud.py +5 -3
  3. StreamingCommunity/Api/Site/1337xx/__init__.py +4 -4
  4. StreamingCommunity/Api/Site/altadefinizione/__init__.py +3 -3
  5. StreamingCommunity/Api/Site/altadefinizione/film.py +15 -35
  6. StreamingCommunity/Api/Site/animeunity/__init__.py +2 -2
  7. StreamingCommunity/Api/Site/animeunity/util/ScrapeSerie.py +21 -23
  8. StreamingCommunity/Api/Site/animeworld/__init__.py +3 -3
  9. StreamingCommunity/Api/Site/cb01new/__init__.py +72 -0
  10. StreamingCommunity/Api/Site/cb01new/film.py +62 -0
  11. StreamingCommunity/Api/Site/cb01new/site.py +78 -0
  12. StreamingCommunity/Api/Site/guardaserie/__init__.py +3 -3
  13. StreamingCommunity/Api/Site/raiplay/__init__.py +3 -3
  14. StreamingCommunity/Api/Site/streamingcommunity/__init__.py +87 -39
  15. StreamingCommunity/Api/Site/streamingcommunity/film.py +2 -2
  16. StreamingCommunity/Api/Site/streamingcommunity/series.py +4 -4
  17. StreamingCommunity/Api/Site/streamingcommunity/site.py +9 -6
  18. StreamingCommunity/Api/Site/streamingcommunity/util/ScrapeSerie.py +6 -3
  19. StreamingCommunity/Api/Site/streamingwatch/__init__.py +12 -6
  20. StreamingCommunity/Api/Site/streamingwatch/site.py +12 -5
  21. StreamingCommunity/Api/Template/site.py +103 -58
  22. StreamingCommunity/Lib/Proxies/proxy.py +14 -174
  23. StreamingCommunity/TelegramHelp/config.json +62 -0
  24. StreamingCommunity/TelegramHelp/telegram_bot.py +4 -0
  25. StreamingCommunity/Upload/version.py +1 -1
  26. StreamingCommunity/Util/config_json.py +7 -2
  27. StreamingCommunity/run.py +25 -40
  28. {streamingcommunity-3.0.5.dist-info → streamingcommunity-3.0.7.dist-info}/METADATA +31 -13
  29. {streamingcommunity-3.0.5.dist-info → streamingcommunity-3.0.7.dist-info}/RECORD +33 -28
  30. {streamingcommunity-3.0.5.dist-info → streamingcommunity-3.0.7.dist-info}/WHEEL +1 -1
  31. {streamingcommunity-3.0.5.dist-info → streamingcommunity-3.0.7.dist-info}/entry_points.txt +0 -0
  32. {streamingcommunity-3.0.5.dist-info → streamingcommunity-3.0.7.dist-info}/licenses/LICENSE +0 -0
  33. {streamingcommunity-3.0.5.dist-info → streamingcommunity-3.0.7.dist-info}/top_level.txt +0 -0
@@ -1,20 +1,15 @@
1
1
  # 29.04.25
2
2
 
3
- import os
4
3
  import sys
5
4
  import time
6
- import json
7
5
  import signal
8
6
  import warnings
9
7
  warnings.filterwarnings("ignore", category=UserWarning)
10
- from datetime import datetime, timedelta
11
- from concurrent.futures import ThreadPoolExecutor, as_completed
12
8
 
13
9
 
14
10
  # External library
15
11
  import httpx
16
12
  from rich import print
17
- from rich.progress import Progress, SpinnerColumn, BarColumn, TextColumn, TimeRemainingColumn
18
13
 
19
14
 
20
15
  # Internal utilities
@@ -27,118 +22,18 @@ MAX_TIMEOUT = config_manager.get_int("REQUESTS", "timeout")
27
22
 
28
23
 
29
24
  class ProxyFinder:
30
- def __init__(self, url, timeout_threshold: float = 7.0, max_proxies: int = 150, max_workers: int = 12):
25
+ def __init__(self, url, timeout_threshold: float = 7.0):
31
26
  self.url = url
32
27
  self.timeout_threshold = timeout_threshold
33
- self.max_proxies = max_proxies
34
- self.max_workers = max_workers
35
- self.found_proxy = None
36
28
  self.shutdown_flag = False
37
- self.json_file = os.path.join(os.path.dirname(__file__), 'working_proxies.json')
38
29
  signal.signal(signal.SIGINT, self._handle_interrupt)
39
30
 
40
- def load_saved_proxies(self) -> tuple:
41
- """Load saved proxies if they're not expired (2 hours old)"""
42
- try:
43
- if not os.path.exists(self.json_file):
44
- return None, None
45
-
46
- with open(self.json_file, 'r') as f:
47
- data = json.load(f)
48
-
49
- if not data.get('proxies') or not data.get('last_update'):
50
- return None, None
51
-
52
- last_update = datetime.fromisoformat(data['last_update'])
53
- if datetime.now() - last_update > timedelta(hours=2):
54
- return None, None
55
-
56
- return data['proxies'], last_update
57
- except Exception:
58
- return None, None
59
-
60
- def save_working_proxy(self, proxy: str, response_time: float):
61
- """Save working proxy to JSON file"""
62
- data = {
63
- 'proxies': [{'proxy': proxy, 'response_time': response_time}],
64
- 'last_update': datetime.now().isoformat()
65
- }
66
- try:
67
- with open(self.json_file, 'w') as f:
68
- json.dump(data, f, indent=4)
69
- except Exception as e:
70
- print(f"[bold red]Error saving proxy:[/bold red] {str(e)}")
71
-
72
- def fetch_geonode(self) -> list:
73
- proxies = []
74
- try:
75
- response = httpx.get(
76
- "https://proxylist.geonode.com/api/proxy-list?protocols=http%2Chttps&limit=100&page=1&sort_by=speed&sort_type=asc",
77
- headers=get_headers(),
78
- timeout=MAX_TIMEOUT
79
- )
80
- data = response.json()
81
- proxies = [(f"http://{p['ip']}:{p['port']}", "Geonode") for p in data.get('data', [])]
82
-
83
- except Exception as e:
84
- print(f"[bold red]Error in Geonode:[/bold red] {str(e)[:100]}")
85
-
86
- return proxies
87
-
88
- def fetch_proxyscrape(self) -> list:
89
- proxies = []
90
- try:
91
- response = httpx.get(
92
- "https://api.proxyscrape.com/v4/free-proxy-list/get?request=get_proxies&protocol=http&skip=0&proxy_format=protocolipport&format=json&limit=100&timeout=1000",
93
- headers=get_headers(),
94
- timeout=MAX_TIMEOUT
95
- )
96
- data = response.json()
97
- if 'proxies' in data and isinstance(data['proxies'], list):
98
- proxies = [(proxy_data['proxy'], "ProxyScrape") for proxy_data in data['proxies'] if 'proxy' in proxy_data]
99
-
100
- except Exception as e:
101
- print(f"[bold red]Error in ProxyScrape:[/bold red] {str(e)[:100]}")
102
-
103
- return proxies
104
-
105
- def fetch_proxies_from_sources(self) -> list:
106
- #print("[cyan]Fetching proxies from sources...[/cyan]")
107
- with ThreadPoolExecutor(max_workers=3) as executor:
108
- proxyscrape_future = executor.submit(self.fetch_proxyscrape)
109
- geonode_future = executor.submit(self.fetch_geonode)
110
-
111
- sources_proxies = {}
112
-
113
- try:
114
- proxyscrape_result = proxyscrape_future.result()
115
- sources_proxies["proxyscrape"] = proxyscrape_result[:int(self.max_proxies/2)]
116
- except Exception as e:
117
- print(f"[bold red]Error fetching from proxyscrape:[/bold red] {str(e)[:100]}")
118
- sources_proxies["proxyscrape"] = []
119
-
120
- try:
121
- geonode_result = geonode_future.result()
122
- sources_proxies["geonode"] = geonode_result[:int(self.max_proxies/2)]
123
- except Exception as e:
124
- print(f"[bold red]Error fetching from geonode:[/bold red] {str(e)[:100]}")
125
- sources_proxies["geonode"] = []
126
-
127
- merged_proxies = []
128
-
129
- if "proxyscrape" in sources_proxies:
130
- merged_proxies.extend(sources_proxies["proxyscrape"])
131
-
132
- if "geonode" in sources_proxies:
133
- merged_proxies.extend(sources_proxies["geonode"])
134
-
135
- proxy_list = merged_proxies[:self.max_proxies]
136
- return proxy_list
137
-
138
31
  def _test_single_request(self, proxy_info: tuple) -> tuple:
139
32
  proxy, source = proxy_info
140
33
  try:
141
34
  start = time.time()
35
+ print(f"[yellow]Testing proxy for URL: {self.url}...")
36
+
142
37
  with httpx.Client(proxy=proxy, timeout=self.timeout_threshold) as client:
143
38
  response = client.get(self.url, headers=get_headers())
144
39
  if response.status_code == 200:
@@ -161,72 +56,17 @@ class ProxyFinder:
161
56
  return (proxy, success2 and time2 <= self.timeout_threshold, avg_time, text1, source)
162
57
 
163
58
  def _handle_interrupt(self, sig, frame):
164
- print("\n[bold yellow]Received keyboard interrupt. Terminating...[/bold yellow]")
59
+ print("\n[red]Received keyboard interrupt. Terminating...")
165
60
  self.shutdown_flag = True
166
61
  sys.exit(0)
167
62
 
168
- def find_fast_proxy(self) -> tuple:
169
- saved_proxies, last_update = self.load_saved_proxies()
170
- if saved_proxies:
171
- print("[cyan]Testing saved proxy...[/cyan]")
172
- for proxy_data in saved_proxies:
173
- result = self.test_proxy((proxy_data['proxy'], 'cached'))
174
- if result[1]:
175
- return proxy_data['proxy'], result[3], result[2]
176
- else:
177
- print(f"[red]Saved proxy {proxy_data['proxy']} failed - response time: {result[2]:.2f}s[/red]")
178
-
179
- proxies = self.fetch_proxies_from_sources()
180
- if not proxies:
181
- print("[bold red]No proxies fetched to test.[/bold red]")
182
- return (None, None, None)
183
-
184
- found_proxy = None
185
- response_text = None
186
- source = None
187
- failed_count = 0
188
- success_count = 0
189
-
190
- #print(f"[cyan]Testing {len(proxies)} proxies...[/cyan]")
191
- with ThreadPoolExecutor(max_workers=self.max_workers) as executor:
192
- futures = {executor.submit(self.test_proxy, p): p for p in proxies}
193
- with Progress(
194
- SpinnerColumn(),
195
- TextColumn("[progress.description]{task.description}"),
196
- BarColumn(),
197
- TextColumn("[progress.percentage]{task.percentage:>3.0f}%"),
198
- TextColumn("[cyan]{task.fields[success]}[/cyan]/[red]{task.fields[failed]}[/red]"),
199
- TimeRemainingColumn(),
200
- ) as progress:
201
- task = progress.add_task(
202
- "[cyan]Testing Proxies",
203
- total=len(futures),
204
- success=success_count,
205
- failed=failed_count
206
- )
207
-
208
- for future in as_completed(futures):
209
- if self.shutdown_flag:
210
- break
211
-
212
- try:
213
- proxy, success, elapsed, response, proxy_source = future.result()
214
- if success:
215
- success_count += 1
216
- print(f"[bold green]Found valid proxy:[/bold green] {proxy} ({elapsed:.2f}s)")
217
- found_proxy = proxy
218
- response_text = response
219
- self.save_working_proxy(proxy, elapsed)
220
- self.shutdown_flag = True
221
- break
222
- else:
223
- failed_count += 1
224
- except Exception:
225
- failed_count += 1
226
-
227
- progress.update(task, advance=1, success=success_count, failed=failed_count)
228
-
229
- if not found_proxy:
230
- print("[bold red]No working proxies found[/bold red]")
231
-
232
- return (found_proxy, response_text, source)
63
+ def find_fast_proxy(self) -> str:
64
+ try:
65
+ proxy_config = config_manager.get("REQUESTS", "proxy")
66
+ if proxy_config and isinstance(proxy_config, dict) and 'http' in proxy_config:
67
+ print("[cyan]Using configured proxy from config.json...[/cyan]")
68
+ return proxy_config['http']
69
+ except Exception as e:
70
+ print(f"[red]Error getting configured proxy: {str(e)}[/red]")
71
+
72
+ return None
@@ -0,0 +1,62 @@
1
+ {
2
+ "DEFAULT": {
3
+ "debug": false,
4
+ "show_message": true,
5
+ "clean_console": true,
6
+ "show_trending": true,
7
+ "use_api": true,
8
+ "not_close": false,
9
+ "telegram_bot": true,
10
+ "download_site_data": true,
11
+ "validate_github_config": true
12
+ },
13
+ "OUT_FOLDER": {
14
+ "root_path": "/mnt/data/media/",
15
+ "movie_folder_name": "films",
16
+ "serie_folder_name": "serie_tv",
17
+ "anime_folder_name": "Anime",
18
+ "map_episode_name": "E%(episode)_%(episode_name)",
19
+ "add_siteName": false
20
+ },
21
+ "QBIT_CONFIG": {
22
+ "host": "192.168.1.51",
23
+ "port": "6666",
24
+ "user": "admin",
25
+ "pass": "adminadmin"
26
+ },
27
+ "M3U8_DOWNLOAD": {
28
+ "tqdm_delay": 0.01,
29
+ "default_video_workser": 12,
30
+ "default_audio_workser": 12,
31
+ "segment_timeout": 8,
32
+ "download_audio": true,
33
+ "merge_audio": true,
34
+ "specific_list_audio": [
35
+ "ita"
36
+ ],
37
+ "download_subtitle": true,
38
+ "merge_subs": true,
39
+ "specific_list_subtitles": [
40
+ "ita",
41
+ "eng"
42
+ ],
43
+ "cleanup_tmp_folder": true
44
+ },
45
+ "M3U8_CONVERSION": {
46
+ "use_codec": false,
47
+ "use_vcodec": true,
48
+ "use_acodec": true,
49
+ "use_bitrate": true,
50
+ "use_gpu": false,
51
+ "default_preset": "ultrafast"
52
+ },
53
+ "M3U8_PARSER": {
54
+ "force_resolution": "Best",
55
+ "get_only_link": false
56
+ },
57
+ "REQUESTS": {
58
+ "verify": false,
59
+ "timeout": 20,
60
+ "max_retry": 8
61
+ }
62
+ }
@@ -575,6 +575,10 @@ class TelegramBot:
575
575
  cleaned_output = cleaned_output.replace(
576
576
  "\n\n", "\n"
577
577
  ) # Rimuovi newline multipli
578
+
579
+ # Inizializza le variabili
580
+ cleaned_output_0 = None # o ""
581
+ cleaned_output_1 = None # o ""
578
582
 
579
583
  # Dentro cleaned_output c'è una stringa recupero quello che si trova tra ## ##
580
584
  download_section = re.search(r"##(.*?)##", cleaned_output, re.DOTALL)
@@ -1,5 +1,5 @@
1
1
  __title__ = 'StreamingCommunity'
2
- __version__ = '3.0.5'
2
+ __version__ = '3.0.7'
3
3
  __author__ = 'Arrowar'
4
4
  __description__ = 'A command-line program to download film'
5
5
  __copyright__ = 'Copyright 2024'
@@ -36,8 +36,13 @@ class ConfigManager:
36
36
  base_path = os.path.dirname(sys.executable)
37
37
 
38
38
  else:
39
- # Use the current directory where the script is executed
40
- base_path = os.getcwd()
39
+
40
+ # Get the actual path of the module file
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
+ base_path = os.path.dirname(os.path.dirname(os.path.dirname(current_file_path)))
41
46
 
42
47
  # Initialize file paths
43
48
  self.file_path = os.path.join(base_path, file_name)
StreamingCommunity/run.py CHANGED
@@ -193,6 +193,13 @@ def force_exit():
193
193
 
194
194
  def main(script_id = 0):
195
195
 
196
+ color_map = {
197
+ "anime": "red",
198
+ "film_&_serie": "yellow",
199
+ "serie": "blue",
200
+ "torrent": "white"
201
+ }
202
+
196
203
  if TELEGRAM_BOT:
197
204
  bot = get_bot_instance()
198
205
  bot.send_message(f"Avviato script {script_id}", None)
@@ -212,8 +219,8 @@ def main(script_id = 0):
212
219
  console.print("[blue]• Quad9 (9.9.9.9) 'https://docs.quad9.net/Setup_Guides/Windows/Windows_10/'")
213
220
  console.print("\n[yellow]⚠️ The program will not work until you configure your DNS settings.")
214
221
 
215
- time.sleep(1)
216
- msg.ask("[yellow]Press Enter to exit...")
222
+ time.sleep(2)
223
+ msg.ask("[yellow]Press Enter to continue ...")
217
224
 
218
225
  # Load search functions
219
226
  search_functions = load_search_functions()
@@ -256,18 +263,6 @@ def main(script_id = 0):
256
263
  )
257
264
 
258
265
  # Add arguments for search functions
259
- color_map = {
260
- "anime": "red",
261
- "film_serie": "yellow",
262
- "film": "blue",
263
- "serie": "green",
264
- "other": "white"
265
- }
266
-
267
- # Add numeric arguments for each search module
268
- for idx, (alias, (_, use_for)) in enumerate(search_functions.items()):
269
- parser.add_argument(f'--{idx}', action='store_true', help=f'Search using {alias.split("_")[0]} ({use_for})')
270
-
271
266
  parser.add_argument('-s', '--search', default=None, help='Search terms')
272
267
 
273
268
  # Parse command-line arguments
@@ -302,44 +297,41 @@ def main(script_id = 0):
302
297
  global_search(search_terms)
303
298
  return
304
299
 
305
- # Check for numeric arguments
306
- search_functions_list = list(search_functions.items())
307
- for i in range(len(search_functions_list)):
308
- if getattr(args, str(i)):
309
- alias, (func, _) = search_functions_list[i]
310
- run_function(func, search_terms=search_terms)
311
- return
312
-
313
- # Mapping user input to functions
314
- input_to_function = {str(i): func for i, (alias, (func, _)) in enumerate(search_functions.items())}
315
-
316
- # Create dynamic prompt message and choices
317
- choice_labels = {str(i): (alias.split("_")[0].capitalize(), use_for) for i, (alias, (_, use_for)) in enumerate(search_functions.items())}
300
+ # Create mappings using module indice
301
+ input_to_function = {}
302
+ choice_labels = {}
303
+
304
+ for alias, (func, use_for) in search_functions.items():
305
+ module_name = alias.split("_")[0]
306
+ try:
307
+ mod = importlib.import_module(f'StreamingCommunity.Api.Site.{module_name}')
308
+ site_index = str(getattr(mod, 'indice'))
309
+ input_to_function[site_index] = func
310
+ choice_labels[site_index] = (module_name.capitalize(), use_for.lower())
311
+ except Exception as e:
312
+ console.print(f"[red]Error mapping module {module_name}: {str(e)}")
318
313
 
319
- # Display the category legend in a single line
314
+ # Display the category legend
320
315
  legend_text = " | ".join([f"[{color}]{category.capitalize()}[/{color}]" for category, color in color_map.items()])
321
316
  console.print(f"\n[bold green]Category Legend:[/bold green] {legend_text}")
322
317
 
323
- # Construct the prompt message with color-coded site names and aliases
318
+ # Construct prompt with proper color mapping
324
319
  prompt_message = "[green]Insert category [white](" + ", ".join(
325
- [f"{key}: [{color_map.get(label[1], 'white')}]{label[0]}"
320
+ [f"[{color_map.get(label[1], 'white')}]{key}: {label[0]}[/{color_map.get(label[1], 'white')}]"
326
321
  for key, label in choice_labels.items()]
327
322
  ) + "[white])"
328
323
 
329
324
  if TELEGRAM_BOT:
330
- # Display the category legend in a single line
331
325
  category_legend_str = "Categorie: \n" + " | ".join([
332
326
  f"{category.capitalize()}" for category in color_map.keys()
333
327
  ])
334
328
 
335
- # Build message with aliases
336
329
  prompt_message = "Inserisci il sito:\n" + "\n".join(
337
330
  [f"{key}: {label[0]}" for key, label in choice_labels.items()]
338
331
  )
339
332
 
340
333
  console.print(f"\n{prompt_message}")
341
334
 
342
- # Chiedi la scelta all'utente con il bot Telegram
343
335
  category = bot.ask(
344
336
  "select_provider",
345
337
  f"{category_legend_str}\n\n{prompt_message}",
@@ -351,13 +343,6 @@ def main(script_id = 0):
351
343
 
352
344
  # Run the corresponding function based on user input
353
345
  if category in input_to_function:
354
- """if category == global_search_key:
355
- # Run global search
356
- run_function(input_to_function[category], search_terms=search_terms)
357
-
358
- else:"""
359
-
360
- # Run normal site-specific search
361
346
  run_function(input_to_function[category], search_terms=search_terms)
362
347
 
363
348
  else:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: StreamingCommunity
3
- Version: 3.0.5
3
+ Version: 3.0.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
@@ -71,7 +71,7 @@ Dynamic: requires-python
71
71
  <summary>📦 Installation</summary>
72
72
 
73
73
  - 🔄 [Update Domains](#update-domains)
74
- - 🌐 [Available Sites](https://arrowar.github.io/StreamingDirectory/)
74
+ - 🌐 [Available Sites](https://arrowar.github.io/StreamingCommunity/)
75
75
  - 🛠️ [Installation](#installation)
76
76
  - 📦 [PyPI Installation](#1-pypi-installation)
77
77
  - 🔄 [Automatic Installation](#2-automatic-installation)
@@ -506,7 +506,11 @@ To enable qBittorrent integration, follow the setup guide [here](https://github.
506
506
  "REQUESTS": {
507
507
  "verify": false,
508
508
  "timeout": 20,
509
- "max_retry": 8
509
+ "max_retry": 8,
510
+ "proxy": {
511
+ "http": "http://username:password@host:port",
512
+ "https": "https://username:password@host:port"
513
+ }
510
514
  }
511
515
  }
512
516
  ```
@@ -514,6 +518,22 @@ To enable qBittorrent integration, follow the setup guide [here](https://github.
514
518
  - `verify`: Verifies SSL certificates
515
519
  - `timeout`: Maximum timeout (in seconds) for each request
516
520
  - `max_retry`: Number of retry attempts per segment during M3U8 index download
521
+ - `proxy`: Proxy configuration for HTTP/HTTPS requests
522
+ * Set to empty string `""` to disable proxies (default)
523
+ * Example with authentication:
524
+ ```json
525
+ "proxy": {
526
+ "http": "http://username:password@host:port",
527
+ "https": "https://username:password@host:port"
528
+ }
529
+ ```
530
+ * Example without authentication:
531
+ ```json
532
+ "proxy": {
533
+ "http": "http://host:port",
534
+ "https": "https://host:port"
535
+ }
536
+ ```
517
537
  </details>
518
538
 
519
539
  <details>
@@ -764,26 +784,24 @@ The `run-container` command mounts also the `config.json` file, so any change to
764
784
  The bot was created to replace terminal commands and allow interaction via Telegram. Each download runs within a screen session, enabling multiple downloads to run simultaneously.
765
785
 
766
786
  To run the bot in the background, simply start it inside a screen session and then press Ctrl + A, followed by D, to detach from the session without stopping the bot.
767
- </details>
768
-
769
- <details>
770
- <summary>🤖 Bot Commands</summary>
771
787
 
772
788
  Command Functions:
773
789
 
774
790
  🔹 /start – Starts a new search for a download. This command performs the same operations as manually running the script in the terminal with test_run.py.
775
791
 
776
792
  🔹 /list – Displays the status of active downloads, with options to:
777
- - Stop an incorrect download using /stop <ID>
778
- - View the real-time output of a download using /screen <ID>
793
+
794
+ Stop an incorrect download using /stop <ID>.
795
+
796
+ View the real-time output of a download using /screen <ID>.
779
797
 
780
798
  ⚠ Warning: If a download is interrupted, incomplete files may remain in the folder specified in config.json. These files must be deleted manually to avoid storage or management issues.
781
- </details>
782
799
 
783
- <details>
784
- <summary>🔧 Environment Setup</summary>
800
+ 🛠 Configuration: Currently, the bot's settings are stored in the config.json file, which is located in the same directory as the telegram_bot.py script.
801
+
802
+ ## .env Example:
785
803
 
786
- Create an `.env` file with:
804
+ You need to create an .env file and enter your Telegram token and user ID to authorize only one user to use it
787
805
 
788
806
  ```
789
807
  TOKEN_TELEGRAM=IlTuo2131TOKEN$12D3Telegram
@@ -1,55 +1,59 @@
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=Q7ptcRA32T0VnBLUZ70L8zv1m3WlKCxY5RO8jVsKGmo,13080
3
+ StreamingCommunity/run.py,sha256=Ad-_SUbfJblh6vtgSnA1ZIw8IXYl0AY3n4OhoTvEH5A,12384
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
+ StreamingCommunity/Api/Player/maxstream.py,sha256=6y2h7cMSA_kmaeiOWqqyMVBMrtX6HTt2WT0QXxirCxg,4839
6
7
  StreamingCommunity/Api/Player/mediapolisvod.py,sha256=OcdnE1BMSwPZM-nw74GXNJ44E9RYwGnc_kFEA-G8XyY,2294
7
8
  StreamingCommunity/Api/Player/mixdrop.py,sha256=B5KEv-S0xg8b8X2doSxPVcjgwDIlB5TP3m35zfn3v5w,4968
8
9
  StreamingCommunity/Api/Player/supervideo.py,sha256=hr9QViI-XD0Dqhcx90oaH8_j0d6cxpVaf-EuCjMs6hI,5199
9
10
  StreamingCommunity/Api/Player/sweetpixel.py,sha256=gJSe1fop5J216CB3u8vstxLPP5YbcyoGUH4y3X3-JaQ,1643
10
- StreamingCommunity/Api/Player/vixcloud.py,sha256=qI9ppYEMGaJ1B5y693BOMeRQri-F4-94SfRkS-9udfM,6287
11
+ StreamingCommunity/Api/Player/vixcloud.py,sha256=I929S-n7h0zBT_4J8ScVVUJsqEHQgz0pVP5Ct_opdTw,6402
11
12
  StreamingCommunity/Api/Player/Helper/Vixcloud/js_parser.py,sha256=U-8QlD5kGzIk3-4t4D6QyYmiDe8UBrSuVi1YHRQb7AU,4295
12
13
  StreamingCommunity/Api/Player/Helper/Vixcloud/util.py,sha256=QLUgbwQrpuPIVNzdBlAiEJXnd-eCj_JQFckZZEEL55w,5214
13
- StreamingCommunity/Api/Site/1337xx/__init__.py,sha256=a5nRyazzGk6v79uUjyE8Ok0sShX0CTpOEhRUUEWs7Dw,2018
14
+ StreamingCommunity/Api/Site/1337xx/__init__.py,sha256=-lZenAXIv69E38G1AssvRbdQ5ghZS-DjV-SifsLLpn8,2032
14
15
  StreamingCommunity/Api/Site/1337xx/site.py,sha256=5XVUMTQn1UqMYgo7tPAw7bGMA-tqhQnfeOGKkgGh9OA,2349
15
16
  StreamingCommunity/Api/Site/1337xx/title.py,sha256=8T3cVRb-Mt9QdOtKWVVFHz8iOHqspf7iw28E7bfTV78,1865
16
- StreamingCommunity/Api/Site/altadefinizione/__init__.py,sha256=bkHoV7HmmuqU4qXOi6eHPl-2HI9v6EMvT8exTxElku4,4163
17
- StreamingCommunity/Api/Site/altadefinizione/film.py,sha256=0XeqMrMHnk5nbFkVTFaNZWtlXI8pETl7dsORDtIMbjg,4395
17
+ StreamingCommunity/Api/Site/altadefinizione/__init__.py,sha256=6CF9MCh3AstetNlTqG_uzRUQEmMR4iix2vPzGbl3EWM,4180
18
+ StreamingCommunity/Api/Site/altadefinizione/film.py,sha256=nSAko9sWZWAdAZ_bSr0S3tEPJYyLmzNzUmUD8Zuq_eo,3493
18
19
  StreamingCommunity/Api/Site/altadefinizione/series.py,sha256=-rCYx-Fa7aZiYepcIne7OdH1aaUFZZAPX-ToBv6mxFs,8192
19
20
  StreamingCommunity/Api/Site/altadefinizione/site.py,sha256=2kUNQ8ebYlX5dkSql-CvEhU01TOTNtuyEMIAD6SC3lg,2865
20
21
  StreamingCommunity/Api/Site/altadefinizione/util/ScrapeSerie.py,sha256=bSApjfY9xd5dw0tZ1t7vB6ifAo5vAkeeEwX6IS7yH1o,3756
21
- StreamingCommunity/Api/Site/animeunity/__init__.py,sha256=hz6xU74tie4VX58mLZoUNZ-aANvcJueEDRFig46bgow,4050
22
+ StreamingCommunity/Api/Site/animeunity/__init__.py,sha256=3T-F9Hsq1wlELOAHqYWCxNYHfDeYsQLRYifmQATjh0A,4063
22
23
  StreamingCommunity/Api/Site/animeunity/film.py,sha256=Vqg6yag2siR-Y3ougBsV8mzdQXChxg6ghz_KVXFQ3pE,998
23
24
  StreamingCommunity/Api/Site/animeunity/serie.py,sha256=ib86sLXYsYbrvrFNbzKdhlwMUO3DT7JS5yTTrrSr2jk,5711
24
25
  StreamingCommunity/Api/Site/animeunity/site.py,sha256=iRFMUdtHricrc09gmVS1kUOQ-EqH_8zafh8ag4HHiUA,5672
25
- StreamingCommunity/Api/Site/animeunity/util/ScrapeSerie.py,sha256=Ze6a8D2MRhiOvSw3mTpL3ue2iVc6pA5aqoyUMCTnT7A,3809
26
- StreamingCommunity/Api/Site/animeworld/__init__.py,sha256=9XPowUaXC-baxn1XV6hAuXjMT3gsw6pR8hj-h4g2r_o,2809
26
+ StreamingCommunity/Api/Site/animeunity/util/ScrapeSerie.py,sha256=UladSvOlTEVLiV0-rAz45zrET5qRHMuTGuKEpeQoumU,3872
27
+ StreamingCommunity/Api/Site/animeworld/__init__.py,sha256=fjStJyOl6VBVDgoi6wr2yA0CQ_UQ4atTBzal0gOBgRM,2822
27
28
  StreamingCommunity/Api/Site/animeworld/film.py,sha256=W9KOS9Wvx3Mlqx5WojR-NgnF9WX8mI79JZPS7UwG-dc,1763
28
29
  StreamingCommunity/Api/Site/animeworld/serie.py,sha256=MXyV1fK05jPW4iV9NWrRKW-R4ect-TSN78-2APayniU,3516
29
30
  StreamingCommunity/Api/Site/animeworld/site.py,sha256=HBUAYiOa-UPGAO4lyTL1qIqqpDNVhWRHZ-nyLFltl7I,3702
30
31
  StreamingCommunity/Api/Site/animeworld/util/ScrapeSerie.py,sha256=CBTCH_wnTXUK_MKwq9a1k_XdvOlUrMpbUmpkD5fXVQ0,3589
31
- StreamingCommunity/Api/Site/guardaserie/__init__.py,sha256=kYzD16q-KKie6Zxw2rFeiSOQ4FAJzqNC1T8__yLuBUw,2787
32
+ StreamingCommunity/Api/Site/cb01new/__init__.py,sha256=95M3DiNbLbZ6v1oFkPuAPEVJWf12W2JzJvxZKjZs_V8,2071
33
+ StreamingCommunity/Api/Site/cb01new/film.py,sha256=vjd1ftm4LhxxG0TTKEwlOXtx0AYgxBbV5ZlQH8aSxGU,1695
34
+ StreamingCommunity/Api/Site/cb01new/site.py,sha256=82GPxjOyY7Dlj1WbA0YNovgbKhuF3Vmca07IVXGh6lE,2139
35
+ StreamingCommunity/Api/Site/guardaserie/__init__.py,sha256=vnbt1DVG6nmHaLSUOO_2NQYi9iTiOPLrwtvUd_DZDZg,2800
32
36
  StreamingCommunity/Api/Site/guardaserie/series.py,sha256=U9rMZCjRqHLFjo468vikxl-2RqO6DCJjebB-G8Y6LDg,6492
33
37
  StreamingCommunity/Api/Site/guardaserie/site.py,sha256=6PPp6qykuKZ3Sa2uY7E1xTwh1-8vHINsEpokGnathmw,2326
34
38
  StreamingCommunity/Api/Site/guardaserie/util/ScrapeSerie.py,sha256=_aXU-YcUtSwbC2b6QpNnWDZR8m6vp9xzBEx_zdu5tgI,4196
35
- StreamingCommunity/Api/Site/raiplay/__init__.py,sha256=cAWAt1hyUwiuENKjkgLWOV5T_Nw3dkKKBU7pUFEGiJE,3151
39
+ StreamingCommunity/Api/Site/raiplay/__init__.py,sha256=RItEFpC6_sMNJFRiZuVsQdzMuqW7VZifenTMT1I1p_o,3166
36
40
  StreamingCommunity/Api/Site/raiplay/film.py,sha256=wBv5kQXx7-aCKhAZ5LABZ8zUzu_jPGdXOl9OM2p8dpY,1982
37
41
  StreamingCommunity/Api/Site/raiplay/series.py,sha256=uQVbeA_g3Z1Ciqeq99gsY2F8mC5DssH3ueGbCW8gd9Q,6161
38
42
  StreamingCommunity/Api/Site/raiplay/site.py,sha256=0s1yHhEIA-JJVb2uVe_SZKILx7TIisadZmov7ZhG28s,5160
39
43
  StreamingCommunity/Api/Site/raiplay/util/ScrapeSerie.py,sha256=5F6abToCTtsvW8iIACbChZ0fPlymJiCSF_y8FRsDu7M,5002
40
- StreamingCommunity/Api/Site/streamingcommunity/__init__.py,sha256=yD2q6jfbmwKk10c2sTxR28Gg8H83OES5DvxExseGxvo,3815
41
- StreamingCommunity/Api/Site/streamingcommunity/film.py,sha256=TPt0yB1DKShDIz_1OEVG1IolMoAKBOaWIZ8lQF61dfM,2575
42
- StreamingCommunity/Api/Site/streamingcommunity/series.py,sha256=zDvmxGHvljpyX82CSE88Zf7EIYtuXAxLDkk0qUTBRdA,8860
43
- StreamingCommunity/Api/Site/streamingcommunity/site.py,sha256=Nk0Wnz9hLP4rSbeg9xozk2Qf_0wFB0wKxmZTmJpNKXY,3781
44
- StreamingCommunity/Api/Site/streamingcommunity/util/ScrapeSerie.py,sha256=vnqVwDb4sxEXzMcr9B4ZZHFuADwcHSMCa3VMguKIe_U,5555
45
- StreamingCommunity/Api/Site/streamingwatch/__init__.py,sha256=SH8Y9oM0_vcQ_-NXJ5GJK_GmHiiXaK6H0SEcrl-KBZ4,3564
44
+ StreamingCommunity/Api/Site/streamingcommunity/__init__.py,sha256=xH-rznnpJd-mNniYt1SAGBymhZRxT05S5UxdSGvRPW4,5968
45
+ StreamingCommunity/Api/Site/streamingcommunity/film.py,sha256=HMfDve_4xuxeYbenDt9H5MEf1FwQBZNAkpcJEbiMRqA,2609
46
+ StreamingCommunity/Api/Site/streamingcommunity/series.py,sha256=W1KHSrF_rVl757dtLugvqVm7HCjovCHaHZXoGSRjOoI,8903
47
+ StreamingCommunity/Api/Site/streamingcommunity/site.py,sha256=cqaVM4cNXVqN_5ImeS_c7FI6go3TZPKkDi3XbD93MSQ,4019
48
+ StreamingCommunity/Api/Site/streamingcommunity/util/ScrapeSerie.py,sha256=Q05e8k2xvWd66jv3jlBtvpTau2J1C0zXw5uHvcimzxY,5664
49
+ StreamingCommunity/Api/Site/streamingwatch/__init__.py,sha256=UCE61tSwyvC4Gg9XqcembOWulD8vKEQk__g7VXeVgcA,3723
46
50
  StreamingCommunity/Api/Site/streamingwatch/film.py,sha256=QWE4e7Z9c0oTidP76cZPWdOKFU77_RbMXOHOlLRtPFk,1664
47
51
  StreamingCommunity/Api/Site/streamingwatch/series.py,sha256=HF4SykhaOathLeCbYrRd1-BdCg30pDRQRCI43FnM2ck,6233
48
- StreamingCommunity/Api/Site/streamingwatch/site.py,sha256=tFPQTjT9AwZuAh3Z-cn110Xb1snEh4CCNv8Zuc1Vch8,3250
52
+ StreamingCommunity/Api/Site/streamingwatch/site.py,sha256=C7rpHhfiBZFb-BVvXHvc6BRVqT6mFIkuHLm06mok_BM,3516
49
53
  StreamingCommunity/Api/Site/streamingwatch/util/ScrapeSerie.py,sha256=tEiwL7R5wI8F9ZLOiI-E7pEh72UJaNtswCjhx_wRlBY,4300
50
54
  StreamingCommunity/Api/Template/__init__.py,sha256=oyfd_4_g5p5q6mxb_rKwSsudZnTM3W3kg1tLwxg-v-Q,46
51
55
  StreamingCommunity/Api/Template/config_loader.py,sha256=2RT_0mqQmWzXM4rYaqss-yhXztYAcfNkTalFPjzv270,2056
52
- StreamingCommunity/Api/Template/site.py,sha256=BJjQktdu2q2pkGflJv3UdrpSEmzJCJnaT-u-jD5zhgs,2861
56
+ StreamingCommunity/Api/Template/site.py,sha256=vUcHK4fuoBtDtO_Kgb4bQqfQDtVH5Jg9_-mVhZA3NTU,4919
53
57
  StreamingCommunity/Api/Template/Class/SearchType.py,sha256=LOlE8UgraEM0UAVeNCThDGi8bleei31p7KpryuZm3VE,2530
54
58
  StreamingCommunity/Api/Template/Util/__init__.py,sha256=ZWQQd6iymNFDol9HaKPhVBoRX1W-xHJZgU_mZvLVdsM,196
55
59
  StreamingCommunity/Api/Template/Util/manage_ep.py,sha256=FYe2DC9SXIXzlRYI7fW4ieBpfrxYzsUgt2C47tYRk7U,9252
@@ -67,25 +71,26 @@ StreamingCommunity/Lib/M3U8/decryptor.py,sha256=kuxxsd3eN0VGRrMJWXzHo8gCpT0u3fSZ
67
71
  StreamingCommunity/Lib/M3U8/estimator.py,sha256=8gwTxJ3poRqZdHUTD9_oqXegiPWSXFuqLmqCZBnXS8A,5893
68
72
  StreamingCommunity/Lib/M3U8/parser.py,sha256=cSjXPOSgTewrfLgREyQ47wzoOeoYo3L4lOfEWZKxad8,22485
69
73
  StreamingCommunity/Lib/M3U8/url_fixer.py,sha256=zldE4yOuNBV6AAvL1KI6p7XdRI_R5YZRscbDgT1564M,1735
70
- StreamingCommunity/Lib/Proxies/proxy.py,sha256=oHWT0a4kO3k8AyUVO_c0LfPmLcO5A8sGLhgJjBBwEnk,9350
74
+ StreamingCommunity/Lib/Proxies/proxy.py,sha256=KEaVWvstewt05x81AU7zQfOnMpI7tOdJfwAfMIpLiUE,2475
71
75
  StreamingCommunity/Lib/TMBD/__init__.py,sha256=XzE42tw3Ws59DD1PF8WmGtZ0D4D7Hk3Af8QthNE-22U,66
72
76
  StreamingCommunity/Lib/TMBD/obj_tmbd.py,sha256=dRSvJFS5yqmsBZcw2wqbStcBtXNjU_3n5czMyremAtU,1187
73
77
  StreamingCommunity/Lib/TMBD/tmdb.py,sha256=byg0EFnlmd9JeLvn1N9K3QkB1KEfeMuFa7OVfGqks1Y,10685
74
78
  StreamingCommunity/TelegramHelp/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
75
- StreamingCommunity/TelegramHelp/telegram_bot.py,sha256=Qe1__aoK4PpDuing8JtWgdHzLee8LuYYyfeLNA7yADU,26307
79
+ StreamingCommunity/TelegramHelp/config.json,sha256=x1rtclDIrlnFcmiAmCQnV3WpnlTl5ds1LRRqECIF7xk,1581
80
+ StreamingCommunity/TelegramHelp/telegram_bot.py,sha256=zCqj7xBofh9FYfEYl55mgT945jqtKo7qJhn-SMLvAvA,26455
76
81
  StreamingCommunity/Upload/update.py,sha256=Tp7PdU49rk1bga76_DiaghrbE7Fb3p4iq5S4CqZZy2A,3462
77
- StreamingCommunity/Upload/version.py,sha256=ZbC1PTHRJgubI-4LjpDd0E4P9_7VgawTegx9gG_SJ_8,171
82
+ StreamingCommunity/Upload/version.py,sha256=pQQWmD4WVRPFe3lUF2cLbFWjyLHAb-Lmrhe7-7h4omQ,171
78
83
  StreamingCommunity/Util/color.py,sha256=NvD0Eni-25oOOkY-szCEoc0lGvzQxyL7xhM0RE4EvUM,458
79
- StreamingCommunity/Util/config_json.py,sha256=oPSq7H4ajPWBbJM_gIK-u6hW3EF4OpIQNyVDHxVkrOY,24532
84
+ StreamingCommunity/Util/config_json.py,sha256=KTbOhFOyXqqgmGZcjQsIuHsh-aUGAMXoSeZgXQ25Vy8,24867
80
85
  StreamingCommunity/Util/ffmpeg_installer.py,sha256=yRVIPwbh05tZ-duZmXkH0qasLNxaQCAT_E4cTP79Z3c,14890
81
86
  StreamingCommunity/Util/headers.py,sha256=TItkaFMx1GqsVNEIS3Tr0BGU5EHyF-HkZVliHORT3P8,308
82
87
  StreamingCommunity/Util/logger.py,sha256=9kGD6GmWj2pM8ADpJc85o7jm8DD0c5Aguqnq-9kmxos,3314
83
88
  StreamingCommunity/Util/message.py,sha256=SJaIPLvWeQqsIODVUKw3TgYRmBChovmlbcF6OUxqMI8,1425
84
89
  StreamingCommunity/Util/os.py,sha256=Q1t8K7jUR27RGEZghfN1Xmvw8BGzK0npF1cFUf1OloQ,16381
85
90
  StreamingCommunity/Util/table.py,sha256=Nw5PlsvfEIOQZWy5VhsU5OK3heuBXGwsqmLl0k8yQzc,9813
86
- streamingcommunity-3.0.5.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
87
- streamingcommunity-3.0.5.dist-info/METADATA,sha256=Tt9RG5hxrYQtg4PPhSthruh3aJKZmNkdcyNw1pRi5cE,24230
88
- streamingcommunity-3.0.5.dist-info/WHEEL,sha256=DnLRTWE75wApRYVsjgc6wsVswC54sMSJhAEd4xhDpBk,91
89
- streamingcommunity-3.0.5.dist-info/entry_points.txt,sha256=Qph9XYfDC8n4LfDLOSl6gJGlkb9eFb5f-JOr_Wb_5rk,67
90
- streamingcommunity-3.0.5.dist-info/top_level.txt,sha256=YsOcxKP-WOhWpIWgBlh0coll9XUx7aqmRPT7kmt3fH0,19
91
- streamingcommunity-3.0.5.dist-info/RECORD,,
91
+ streamingcommunity-3.0.7.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
92
+ streamingcommunity-3.0.7.dist-info/METADATA,sha256=_2-Z-kYQsSoj2zp73prdTVcawMzQU0UMmx3nKTvJnyM,24958
93
+ streamingcommunity-3.0.7.dist-info/WHEEL,sha256=Nw36Djuh_5VDukK0H78QzOX-_FQEo6V37m3nkm96gtU,91
94
+ streamingcommunity-3.0.7.dist-info/entry_points.txt,sha256=Qph9XYfDC8n4LfDLOSl6gJGlkb9eFb5f-JOr_Wb_5rk,67
95
+ streamingcommunity-3.0.7.dist-info/top_level.txt,sha256=YsOcxKP-WOhWpIWgBlh0coll9XUx7aqmRPT7kmt3fH0,19
96
+ streamingcommunity-3.0.7.dist-info/RECORD,,