StreamingCommunity 2.8.0__tar.gz → 2.9.1__tar.gz
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-2.8.0/StreamingCommunity.egg-info → StreamingCommunity-2.9.1}/PKG-INFO +1 -1
- {StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity/Api/Player/supervideo.py +5 -14
- {StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity/Api/Site/1337xx/site.py +1 -1
- {StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity/Api/Site/animeunity/site.py +1 -1
- {StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity/Api/Site/cb01new/film.py +3 -5
- {StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity/Api/Site/cb01new/site.py +1 -1
- {StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity/Api/Site/ddlstreamitaly/site.py +1 -1
- {StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity/Api/Site/guardaserie/series.py +4 -7
- {StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity/Api/Site/guardaserie/site.py +1 -1
- {StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity/Api/Site/mostraguarda/film.py +3 -5
- {StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity/Api/Site/streamingcommunity/film.py +3 -5
- {StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity/Api/Site/streamingcommunity/series.py +3 -5
- {StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity/Api/Site/streamingcommunity/site.py +1 -1
- {StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity/Api/Template/Util/get_domain.py +3 -2
- {StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity/Lib/Downloader/HLS/downloader.py +5 -1
- {StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity/Lib/Downloader/MP4/downloader.py +13 -17
- {StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity/Lib/M3U8/parser.py +24 -10
- {StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity/Upload/version.py +1 -1
- {StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1/StreamingCommunity.egg-info}/PKG-INFO +1 -1
- {StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/setup.py +1 -1
- {StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/LICENSE +0 -0
- {StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/MANIFEST.in +0 -0
- {StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/README.md +0 -0
- {StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity/Api/Player/Helper/Vixcloud/js_parser.py +0 -0
- {StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity/Api/Player/Helper/Vixcloud/util.py +0 -0
- {StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity/Api/Player/ddl.py +0 -0
- {StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity/Api/Player/maxstream.py +0 -0
- {StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity/Api/Player/vixcloud.py +0 -0
- {StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity/Api/Site/1337xx/__init__.py +0 -0
- {StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity/Api/Site/1337xx/title.py +0 -0
- {StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity/Api/Site/animeunity/__init__.py +0 -0
- {StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity/Api/Site/animeunity/film_serie.py +0 -0
- {StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity/Api/Site/animeunity/util/ScrapeSerie.py +0 -0
- {StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity/Api/Site/cb01new/__init__.py +0 -0
- {StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity/Api/Site/ddlstreamitaly/__init__.py +0 -0
- {StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity/Api/Site/ddlstreamitaly/series.py +0 -0
- {StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity/Api/Site/ddlstreamitaly/util/ScrapeSerie.py +0 -0
- {StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity/Api/Site/guardaserie/__init__.py +0 -0
- {StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity/Api/Site/guardaserie/util/ScrapeSerie.py +0 -0
- {StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity/Api/Site/mostraguarda/__init__.py +0 -0
- {StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity/Api/Site/streamingcommunity/__init__.py +0 -0
- {StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity/Api/Site/streamingcommunity/util/ScrapeSerie.py +0 -0
- {StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity/Api/Template/Class/SearchType.py +0 -0
- {StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity/Api/Template/Util/__init__.py +0 -0
- {StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity/Api/Template/Util/manage_ep.py +0 -0
- {StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity/Api/Template/__init__.py +0 -0
- {StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity/Api/Template/config_loader.py +0 -0
- {StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity/Api/Template/site.py +0 -0
- {StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity/Lib/Downloader/HLS/segments.py +0 -0
- {StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity/Lib/Downloader/TOR/downloader.py +0 -0
- {StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity/Lib/Downloader/__init__.py +0 -0
- {StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity/Lib/FFmpeg/__init__.py +0 -0
- {StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity/Lib/FFmpeg/capture.py +0 -0
- {StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity/Lib/FFmpeg/command.py +0 -0
- {StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity/Lib/FFmpeg/util.py +0 -0
- {StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity/Lib/M3U8/__init__.py +0 -0
- {StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity/Lib/M3U8/decryptor.py +0 -0
- {StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity/Lib/M3U8/estimator.py +0 -0
- {StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity/Lib/M3U8/url_fixer.py +0 -0
- {StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity/Lib/TMBD/__init__.py +0 -0
- {StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity/Lib/TMBD/obj_tmbd.py +0 -0
- {StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity/Lib/TMBD/tmdb.py +0 -0
- {StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity/TelegramHelp/__init__.py +0 -0
- {StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity/TelegramHelp/telegram_bot.py +0 -0
- {StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity/Upload/update.py +0 -0
- {StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity/Util/color.py +0 -0
- {StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity/Util/config_json.py +0 -0
- {StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity/Util/ffmpeg_installer.py +0 -0
- {StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity/Util/headers.py +0 -0
- {StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity/Util/logger.py +0 -0
- {StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity/Util/message.py +0 -0
- {StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity/Util/os.py +0 -0
- {StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity/Util/table.py +0 -0
- {StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity/__init__.py +0 -0
- {StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity/run.py +0 -0
- {StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity.egg-info/SOURCES.txt +0 -0
- {StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity.egg-info/dependency_links.txt +0 -0
- {StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity.egg-info/entry_points.txt +0 -0
- {StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity.egg-info/requires.txt +0 -0
- {StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity.egg-info/top_level.txt +0 -0
- {StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/setup.cfg +0 -0
{StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity/Api/Player/supervideo.py
RENAMED
|
@@ -12,7 +12,7 @@ from bs4 import BeautifulSoup
|
|
|
12
12
|
|
|
13
13
|
# Internal utilities
|
|
14
14
|
from StreamingCommunity.Util.config_json import config_manager
|
|
15
|
-
from StreamingCommunity.Util.headers import
|
|
15
|
+
from StreamingCommunity.Util.headers import get_headers
|
|
16
16
|
|
|
17
17
|
|
|
18
18
|
# Variable
|
|
@@ -27,11 +27,7 @@ class VideoSource:
|
|
|
27
27
|
Attributes:
|
|
28
28
|
- url (str): The URL of the video source.
|
|
29
29
|
"""
|
|
30
|
-
self.headers =
|
|
31
|
-
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
|
|
32
|
-
'accept-language': 'it-IT,it;q=0.9,en-US;q=0.8,en;q=0.7',
|
|
33
|
-
'User-Agent': get_userAgent()
|
|
34
|
-
}
|
|
30
|
+
self.headers = get_headers()
|
|
35
31
|
self.client = httpx.Client()
|
|
36
32
|
self.url = url
|
|
37
33
|
|
|
@@ -66,7 +62,7 @@ class VideoSource:
|
|
|
66
62
|
"""
|
|
67
63
|
iframes = soup.find_all("iframe")
|
|
68
64
|
if iframes and len(iframes) > 1:
|
|
69
|
-
return iframes[
|
|
65
|
+
return iframes[0].get("src") or iframes[0].get("data-src")
|
|
70
66
|
|
|
71
67
|
return None
|
|
72
68
|
|
|
@@ -115,13 +111,8 @@ class VideoSource:
|
|
|
115
111
|
logging.error("Failed to fetch HTML content.")
|
|
116
112
|
return None
|
|
117
113
|
|
|
118
|
-
soup = BeautifulSoup(html_content, "html.parser")
|
|
119
|
-
if not soup:
|
|
120
|
-
logging.error("Failed to parse HTML content.")
|
|
121
|
-
return None
|
|
122
|
-
|
|
123
114
|
# Find master playlist
|
|
124
|
-
data_js = self.get_result_node_js(
|
|
115
|
+
data_js = self.get_result_node_js(BeautifulSoup(html_content, "html.parser"))
|
|
125
116
|
|
|
126
117
|
if data_js is not None:
|
|
127
118
|
match = re.search(r'sources:\s*\[\{\s*file:\s*"([^"]+)"', data_js)
|
|
@@ -131,7 +122,7 @@ class VideoSource:
|
|
|
131
122
|
|
|
132
123
|
else:
|
|
133
124
|
|
|
134
|
-
iframe_src = self.get_iframe(
|
|
125
|
+
iframe_src = self.get_iframe(BeautifulSoup(html_content, "html.parser"))
|
|
135
126
|
if not iframe_src:
|
|
136
127
|
logging.error("No iframe found.")
|
|
137
128
|
return None
|
{StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity/Api/Site/1337xx/site.py
RENAMED
|
@@ -41,7 +41,7 @@ def title_search(word_to_search: str) -> int:
|
|
|
41
41
|
table_show_manager.clear()
|
|
42
42
|
|
|
43
43
|
# Check if domain is working
|
|
44
|
-
domain_to_use, base_url = search_domain(site_constant.
|
|
44
|
+
domain_to_use, base_url = search_domain(site_constant.FULL_URL)
|
|
45
45
|
|
|
46
46
|
if domain_to_use is None or base_url is None:
|
|
47
47
|
console.log("[bold red]Error: Unable to determine valid domain or base URL.[/bold red]")
|
{StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity/Api/Site/animeunity/site.py
RENAMED
|
@@ -111,7 +111,7 @@ def title_search(title: str) -> int:
|
|
|
111
111
|
table_show_manager.clear()
|
|
112
112
|
|
|
113
113
|
# Check if domain is working
|
|
114
|
-
domain_to_use, base_url = search_domain(site_constant.
|
|
114
|
+
domain_to_use, base_url = search_domain(site_constant.FULL_URL)
|
|
115
115
|
|
|
116
116
|
if domain_to_use is None or base_url is None:
|
|
117
117
|
console.print("[bold red]Error: Unable to determine valid domain or base URL.[/bold red]")
|
{StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity/Api/Site/cb01new/film.py
RENAMED
|
@@ -55,10 +55,8 @@ def download_film(select_title: MediaItem) -> str:
|
|
|
55
55
|
output_path=os.path.join(mp4_path, title_name)
|
|
56
56
|
).start()
|
|
57
57
|
|
|
58
|
-
if
|
|
59
|
-
try:
|
|
60
|
-
|
|
61
|
-
except:
|
|
62
|
-
pass
|
|
58
|
+
if r_proc['error'] is not None:
|
|
59
|
+
try: os.remove(r_proc['path'])
|
|
60
|
+
except: pass
|
|
63
61
|
|
|
64
62
|
return r_proc['path']
|
{StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity/Api/Site/cb01new/site.py
RENAMED
|
@@ -42,7 +42,7 @@ def title_search(word_to_search: str) -> int:
|
|
|
42
42
|
table_show_manager.clear()
|
|
43
43
|
|
|
44
44
|
# Check if domain is working
|
|
45
|
-
domain_to_use, base_url = search_domain(site_constant.
|
|
45
|
+
domain_to_use, base_url = search_domain(site_constant.FULL_URL)
|
|
46
46
|
|
|
47
47
|
if domain_to_use is None or base_url is None:
|
|
48
48
|
console.print("[bold red]Error: Unable to determine valid domain or base URL.[/bold red]")
|
|
@@ -43,7 +43,7 @@ def title_search(word_to_search: str) -> int:
|
|
|
43
43
|
table_show_manager.clear()
|
|
44
44
|
|
|
45
45
|
# Check if domain is working
|
|
46
|
-
domain_to_use, base_url = search_domain(site_constant.
|
|
46
|
+
domain_to_use, base_url = search_domain(site_constant.FULL_URL)
|
|
47
47
|
|
|
48
48
|
if domain_to_use is None or base_url is None:
|
|
49
49
|
console.print("[bold red]Error: Unable to determine valid domain or base URL.[/bold red]")
|
|
@@ -72,13 +72,10 @@ def download_video(index_season_selected: int, index_episode_selected: int, scap
|
|
|
72
72
|
m3u8_url=master_playlist,
|
|
73
73
|
output_path=os.path.join(mp4_path, mp4_name)
|
|
74
74
|
).start()
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
os.remove(r_proc['path'])
|
|
80
|
-
except:
|
|
81
|
-
pass
|
|
75
|
+
|
|
76
|
+
if r_proc['error'] is not None:
|
|
77
|
+
try: os.remove(r_proc['path'])
|
|
78
|
+
except: pass
|
|
82
79
|
|
|
83
80
|
return r_proc['path'], r_proc['stopped']
|
|
84
81
|
|
|
@@ -42,7 +42,7 @@ def title_search(word_to_search: str) -> int:
|
|
|
42
42
|
table_show_manager.clear()
|
|
43
43
|
|
|
44
44
|
# Check if domain is working
|
|
45
|
-
domain_to_use, base_url = search_domain(site_constant.
|
|
45
|
+
domain_to_use, base_url = search_domain(site_constant.FULL_URL)
|
|
46
46
|
|
|
47
47
|
if domain_to_use is None or base_url is None:
|
|
48
48
|
console.print("[bold red]Error: Unable to determine valid domain or base URL.[/bold red]")
|
|
@@ -86,10 +86,8 @@ def download_film(movie_details: Json_film) -> str:
|
|
|
86
86
|
output_path=os.path.join(mp4_path, title_name)
|
|
87
87
|
).start()
|
|
88
88
|
|
|
89
|
-
if
|
|
90
|
-
try:
|
|
91
|
-
|
|
92
|
-
except:
|
|
93
|
-
pass
|
|
89
|
+
if r_proc['error'] is not None:
|
|
90
|
+
try: os.remove(r_proc['path'])
|
|
91
|
+
except: pass
|
|
94
92
|
|
|
95
93
|
return r_proc['path']
|
|
@@ -80,10 +80,8 @@ def download_film(select_title: MediaItem) -> str:
|
|
|
80
80
|
if script_id != "unknown":
|
|
81
81
|
TelegramSession.deleteScriptId(script_id)
|
|
82
82
|
|
|
83
|
-
if
|
|
84
|
-
try:
|
|
85
|
-
|
|
86
|
-
except:
|
|
87
|
-
pass
|
|
83
|
+
if r_proc['error'] is not None:
|
|
84
|
+
try: os.remove(r_proc['path'])
|
|
85
|
+
except: pass
|
|
88
86
|
|
|
89
87
|
return r_proc['path']
|
|
@@ -86,11 +86,9 @@ def download_video(index_season_selected: int, index_episode_selected: int, scra
|
|
|
86
86
|
output_path=os.path.join(mp4_path, mp4_name)
|
|
87
87
|
).start()
|
|
88
88
|
|
|
89
|
-
if
|
|
90
|
-
try:
|
|
91
|
-
|
|
92
|
-
except:
|
|
93
|
-
pass
|
|
89
|
+
if r_proc['error'] is not None:
|
|
90
|
+
try: os.remove(r_proc['path'])
|
|
91
|
+
except: pass
|
|
94
92
|
|
|
95
93
|
return r_proc['path'], r_proc['stopped']
|
|
96
94
|
|
|
@@ -38,7 +38,7 @@ def title_search(title_search: str) -> int:
|
|
|
38
38
|
Returns:
|
|
39
39
|
int: The number of titles found.
|
|
40
40
|
"""
|
|
41
|
-
domain_to_use, base_url = search_domain(site_constant.
|
|
41
|
+
domain_to_use, base_url = search_domain(site_constant.FULL_URL)
|
|
42
42
|
|
|
43
43
|
if domain_to_use is None or base_url is None:
|
|
44
44
|
console.print("[bold red]Error: Unable to determine valid domain or base URL.[/bold red]")
|
|
@@ -67,7 +67,8 @@ def validate_url(url, base_url):
|
|
|
67
67
|
return False, None
|
|
68
68
|
|
|
69
69
|
client = httpx.Client(
|
|
70
|
-
|
|
70
|
+
http1=True,
|
|
71
|
+
verify=certifi.where(),
|
|
71
72
|
headers=get_headers(),
|
|
72
73
|
timeout=MAX_TIMEOUT
|
|
73
74
|
)
|
|
@@ -82,7 +83,7 @@ def validate_url(url, base_url):
|
|
|
82
83
|
|
|
83
84
|
return True, base_domain
|
|
84
85
|
|
|
85
|
-
def search_domain(
|
|
86
|
+
def search_domain(base_url: str):
|
|
86
87
|
"""Search for valid domain matching site name and base URL."""
|
|
87
88
|
try:
|
|
88
89
|
is_correct, redirect_tld = validate_url(base_url, base_url)
|
|
@@ -429,7 +429,8 @@ class HLS_Downloader:
|
|
|
429
429
|
'path': self.path_manager.output_path,
|
|
430
430
|
'url': self.m3u8_url,
|
|
431
431
|
'is_master': False,
|
|
432
|
-
'
|
|
432
|
+
'msg': 'File already exists',
|
|
433
|
+
'error': None,
|
|
433
434
|
'stopped': False
|
|
434
435
|
}
|
|
435
436
|
if TELEGRAM_BOT:
|
|
@@ -473,6 +474,8 @@ class HLS_Downloader:
|
|
|
473
474
|
'path': self.path_manager.output_path,
|
|
474
475
|
'url': self.m3u8_url,
|
|
475
476
|
'is_master': self.m3u8_manager.is_master,
|
|
477
|
+
'msg': None,
|
|
478
|
+
'error': None,
|
|
476
479
|
'stopped': download_stopped
|
|
477
480
|
}
|
|
478
481
|
|
|
@@ -485,6 +488,7 @@ class HLS_Downloader:
|
|
|
485
488
|
'path': None,
|
|
486
489
|
'url': self.m3u8_url,
|
|
487
490
|
'is_master': getattr(self.m3u8_manager, 'is_master', None),
|
|
491
|
+
'msg': None,
|
|
488
492
|
'error': error_msg,
|
|
489
493
|
'stopped': False
|
|
490
494
|
}
|
|
@@ -84,7 +84,7 @@ def MP4_downloader(url: str, path: str, referer: str = None, headers_: dict = No
|
|
|
84
84
|
console.log("[red]Output file already exists.")
|
|
85
85
|
if TELEGRAM_BOT:
|
|
86
86
|
bot.send_message(f"Contenuto già scaricato!", None)
|
|
87
|
-
return
|
|
87
|
+
return None, False
|
|
88
88
|
|
|
89
89
|
if GET_ONLY_LINK:
|
|
90
90
|
return {'path': path, 'url': url}
|
|
@@ -92,23 +92,19 @@ def MP4_downloader(url: str, path: str, referer: str = None, headers_: dict = No
|
|
|
92
92
|
if not (url.lower().startswith('http://') or url.lower().startswith('https://')):
|
|
93
93
|
logging.error(f"Invalid URL: {url}")
|
|
94
94
|
console.print(f"[bold red]Invalid URL: {url}[/bold red]")
|
|
95
|
-
return None
|
|
95
|
+
return None, False
|
|
96
96
|
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
if headers_:
|
|
103
|
-
headers.update(headers_)
|
|
104
|
-
else:
|
|
105
|
-
headers['User-Agent'] = get_userAgent()
|
|
106
|
-
|
|
107
|
-
except Exception as header_err:
|
|
108
|
-
logging.error(f"Error preparing headers: {header_err}")
|
|
109
|
-
console.print(f"[bold red]Error preparing headers: {header_err}[/bold red]")
|
|
110
|
-
return None
|
|
97
|
+
# Set headers
|
|
98
|
+
headers = {}
|
|
99
|
+
if referer:
|
|
100
|
+
headers['Referer'] = referer
|
|
111
101
|
|
|
102
|
+
if headers_:
|
|
103
|
+
headers.update(headers_)
|
|
104
|
+
else:
|
|
105
|
+
headers['User-Agent'] = get_userAgent()
|
|
106
|
+
|
|
107
|
+
# Set interrupt handler
|
|
112
108
|
temp_path = f"{path}.temp"
|
|
113
109
|
interrupt_handler = InterruptHandler()
|
|
114
110
|
original_handler = signal.signal(signal.SIGINT, partial(signal_handler, interrupt_handler=interrupt_handler, original_handler=signal.getsignal(signal.SIGINT)))
|
|
@@ -123,7 +119,7 @@ def MP4_downloader(url: str, path: str, referer: str = None, headers_: dict = No
|
|
|
123
119
|
|
|
124
120
|
if total == 0:
|
|
125
121
|
console.print("[bold red]No video stream found.[/bold red]")
|
|
126
|
-
return None
|
|
122
|
+
return None, False
|
|
127
123
|
|
|
128
124
|
progress_bar = tqdm(
|
|
129
125
|
total=total,
|
|
@@ -503,25 +503,35 @@ class M3U8_Parser:
|
|
|
503
503
|
except Exception as e:
|
|
504
504
|
logging.error(f"Error parsing video info: {e}")
|
|
505
505
|
|
|
506
|
-
def __parse_encryption_keys__(self,
|
|
506
|
+
def __parse_encryption_keys__(self, obj) -> None:
|
|
507
507
|
"""
|
|
508
|
-
Extracts encryption keys from the M3U8 object.
|
|
508
|
+
Extracts encryption keys either from the M3U8 object or from individual segments.
|
|
509
509
|
|
|
510
510
|
Parameters:
|
|
511
|
-
-
|
|
511
|
+
- obj: Either the main M3U8 object or an individual segment.
|
|
512
512
|
"""
|
|
513
513
|
try:
|
|
514
|
-
if
|
|
514
|
+
if hasattr(obj, 'key') and obj.key is not None:
|
|
515
|
+
key_info = {
|
|
516
|
+
'method': obj.key.method,
|
|
517
|
+
'iv': obj.key.iv,
|
|
518
|
+
'uri': obj.key.uri
|
|
519
|
+
}
|
|
520
|
+
|
|
515
521
|
if self.keys is None:
|
|
516
|
-
self.keys =
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
522
|
+
self.keys = key_info
|
|
523
|
+
|
|
524
|
+
"""
|
|
525
|
+
elif obj.key.uri not in self.keys:
|
|
526
|
+
if isinstance(self.keys, dict):
|
|
527
|
+
self.keys[obj.key.uri] = key_info
|
|
528
|
+
else:
|
|
529
|
+
old_key = self.keys
|
|
530
|
+
self.keys = {'default': old_key, obj.key.uri: key_info}
|
|
531
|
+
"""
|
|
521
532
|
|
|
522
533
|
except Exception as e:
|
|
523
534
|
logging.error(f"Error parsing encryption keys: {e}")
|
|
524
|
-
sys.exit(0)
|
|
525
535
|
pass
|
|
526
536
|
|
|
527
537
|
def __parse_subtitles_and_audio__(self, m3u8_obj) -> None:
|
|
@@ -574,6 +584,10 @@ class M3U8_Parser:
|
|
|
574
584
|
self.segments.append(segment.uri)
|
|
575
585
|
else:
|
|
576
586
|
self.subtitle.append(segment.uri)
|
|
587
|
+
|
|
588
|
+
# Second check if there is key in main m3u8 obj
|
|
589
|
+
if self.keys is None:
|
|
590
|
+
self.__parse_encryption_keys__(m3u8_obj)
|
|
577
591
|
|
|
578
592
|
except Exception as e:
|
|
579
593
|
logging.error(f"Error parsing segments: {e}")
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity/Api/Player/maxstream.py
RENAMED
|
File without changes
|
{StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity/Api/Player/vixcloud.py
RENAMED
|
File without changes
|
{StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity/Api/Site/1337xx/__init__.py
RENAMED
|
File without changes
|
{StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity/Api/Site/1337xx/title.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity/Api/Template/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity/Api/Template/site.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity/Lib/Downloader/__init__.py
RENAMED
|
File without changes
|
{StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity/Lib/FFmpeg/__init__.py
RENAMED
|
File without changes
|
{StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity/Lib/FFmpeg/capture.py
RENAMED
|
File without changes
|
{StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity/Lib/FFmpeg/command.py
RENAMED
|
File without changes
|
|
File without changes
|
{StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity/Lib/M3U8/__init__.py
RENAMED
|
File without changes
|
{StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity/Lib/M3U8/decryptor.py
RENAMED
|
File without changes
|
{StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity/Lib/M3U8/estimator.py
RENAMED
|
File without changes
|
{StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity/Lib/M3U8/url_fixer.py
RENAMED
|
File without changes
|
{StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity/Lib/TMBD/__init__.py
RENAMED
|
File without changes
|
{StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity/Lib/TMBD/obj_tmbd.py
RENAMED
|
File without changes
|
|
File without changes
|
{StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity/TelegramHelp/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity/Util/config_json.py
RENAMED
|
File without changes
|
{StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity/Util/ffmpeg_installer.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity.egg-info/SOURCES.txt
RENAMED
|
File without changes
|
|
File without changes
|
{StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity.egg-info/entry_points.txt
RENAMED
|
File without changes
|
{StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity.egg-info/requires.txt
RENAMED
|
File without changes
|
{StreamingCommunity-2.8.0 → StreamingCommunity-2.9.1}/StreamingCommunity.egg-info/top_level.txt
RENAMED
|
File without changes
|
|
File without changes
|