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.
- StreamingCommunity/Api/Player/maxstream.py +141 -0
- StreamingCommunity/Api/Player/vixcloud.py +5 -3
- StreamingCommunity/Api/Site/1337xx/__init__.py +4 -4
- StreamingCommunity/Api/Site/altadefinizione/__init__.py +3 -3
- StreamingCommunity/Api/Site/altadefinizione/film.py +15 -35
- StreamingCommunity/Api/Site/animeunity/__init__.py +2 -2
- StreamingCommunity/Api/Site/animeunity/util/ScrapeSerie.py +21 -23
- StreamingCommunity/Api/Site/animeworld/__init__.py +3 -3
- StreamingCommunity/Api/Site/cb01new/__init__.py +72 -0
- StreamingCommunity/Api/Site/cb01new/film.py +62 -0
- StreamingCommunity/Api/Site/cb01new/site.py +78 -0
- StreamingCommunity/Api/Site/guardaserie/__init__.py +3 -3
- StreamingCommunity/Api/Site/raiplay/__init__.py +3 -3
- StreamingCommunity/Api/Site/streamingcommunity/__init__.py +87 -39
- StreamingCommunity/Api/Site/streamingcommunity/film.py +2 -2
- StreamingCommunity/Api/Site/streamingcommunity/series.py +4 -4
- StreamingCommunity/Api/Site/streamingcommunity/site.py +9 -6
- StreamingCommunity/Api/Site/streamingcommunity/util/ScrapeSerie.py +6 -3
- StreamingCommunity/Api/Site/streamingwatch/__init__.py +12 -6
- StreamingCommunity/Api/Site/streamingwatch/site.py +12 -5
- StreamingCommunity/Api/Template/site.py +103 -58
- StreamingCommunity/Lib/Proxies/proxy.py +14 -174
- StreamingCommunity/TelegramHelp/config.json +62 -0
- StreamingCommunity/TelegramHelp/telegram_bot.py +4 -0
- StreamingCommunity/Upload/version.py +1 -1
- StreamingCommunity/Util/config_json.py +7 -2
- StreamingCommunity/run.py +25 -40
- {streamingcommunity-3.0.5.dist-info → streamingcommunity-3.0.7.dist-info}/METADATA +31 -13
- {streamingcommunity-3.0.5.dist-info → streamingcommunity-3.0.7.dist-info}/RECORD +33 -28
- {streamingcommunity-3.0.5.dist-info → streamingcommunity-3.0.7.dist-info}/WHEEL +1 -1
- {streamingcommunity-3.0.5.dist-info → streamingcommunity-3.0.7.dist-info}/entry_points.txt +0 -0
- {streamingcommunity-3.0.5.dist-info → streamingcommunity-3.0.7.dist-info}/licenses/LICENSE +0 -0
- {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
|
|
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[
|
|
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) ->
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
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)
|
|
@@ -36,8 +36,13 @@ class ConfigManager:
|
|
|
36
36
|
base_path = os.path.dirname(sys.executable)
|
|
37
37
|
|
|
38
38
|
else:
|
|
39
|
-
|
|
40
|
-
|
|
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(
|
|
216
|
-
msg.ask("[yellow]Press Enter to
|
|
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
|
-
#
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
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
|
|
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
|
|
318
|
+
# Construct prompt with proper color mapping
|
|
324
319
|
prompt_message = "[green]Insert category [white](" + ", ".join(
|
|
325
|
-
[f"
|
|
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.
|
|
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/
|
|
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
|
-
|
|
778
|
-
|
|
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
|
-
|
|
784
|
-
|
|
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
|
-
|
|
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=
|
|
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=
|
|
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
|
|
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=
|
|
17
|
-
StreamingCommunity/Api/Site/altadefinizione/film.py,sha256=
|
|
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=
|
|
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=
|
|
26
|
-
StreamingCommunity/Api/Site/animeworld/__init__.py,sha256=
|
|
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/
|
|
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=
|
|
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=
|
|
41
|
-
StreamingCommunity/Api/Site/streamingcommunity/film.py,sha256=
|
|
42
|
-
StreamingCommunity/Api/Site/streamingcommunity/series.py,sha256=
|
|
43
|
-
StreamingCommunity/Api/Site/streamingcommunity/site.py,sha256=
|
|
44
|
-
StreamingCommunity/Api/Site/streamingcommunity/util/ScrapeSerie.py,sha256=
|
|
45
|
-
StreamingCommunity/Api/Site/streamingwatch/__init__.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
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/
|
|
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=
|
|
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=
|
|
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.
|
|
87
|
-
streamingcommunity-3.0.
|
|
88
|
-
streamingcommunity-3.0.
|
|
89
|
-
streamingcommunity-3.0.
|
|
90
|
-
streamingcommunity-3.0.
|
|
91
|
-
streamingcommunity-3.0.
|
|
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,,
|