forked from DRMTalks/devine
Calculate DASH and HLS download speed in an alternate way
Also fixes getting download sizes for Subtitle tracks
This commit is contained in:
parent
f4122f1ae6
commit
dc55f6ffeb
|
@ -477,7 +477,7 @@ class DASH:
|
||||||
silent=True
|
silent=True
|
||||||
))
|
))
|
||||||
|
|
||||||
data_size = len(init_data or b"")
|
data_size = segment_save_path.stat().st_size
|
||||||
|
|
||||||
if isinstance(track, Audio) or init_data:
|
if isinstance(track, Audio) or init_data:
|
||||||
with open(segment_save_path, "rb+") as f:
|
with open(segment_save_path, "rb+") as f:
|
||||||
|
@ -495,7 +495,6 @@ class DASH:
|
||||||
f.seek(0)
|
f.seek(0)
|
||||||
f.write(init_data)
|
f.write(init_data)
|
||||||
f.write(segment_data)
|
f.write(segment_data)
|
||||||
data_size += len(segment_data)
|
|
||||||
|
|
||||||
if drm:
|
if drm:
|
||||||
# TODO: What if the manifest does not mention DRM, but has DRM
|
# TODO: What if the manifest does not mention DRM, but has DRM
|
||||||
|
@ -508,11 +507,12 @@ class DASH:
|
||||||
|
|
||||||
progress(total=len(segments))
|
progress(total=len(segments))
|
||||||
|
|
||||||
download_start_time = time.time()
|
|
||||||
download_sizes = []
|
download_sizes = []
|
||||||
|
last_speed_refresh = time.time()
|
||||||
|
|
||||||
with ThreadPoolExecutor(max_workers=16) as pool:
|
with ThreadPoolExecutor(max_workers=16) as pool:
|
||||||
try:
|
try:
|
||||||
|
finished_threads = 0
|
||||||
for download in futures.as_completed((
|
for download in futures.as_completed((
|
||||||
pool.submit(
|
pool.submit(
|
||||||
download_segment,
|
download_segment,
|
||||||
|
@ -521,6 +521,7 @@ class DASH:
|
||||||
)
|
)
|
||||||
for i, segment in enumerate(segments)
|
for i, segment in enumerate(segments)
|
||||||
)):
|
)):
|
||||||
|
finished_threads += 1
|
||||||
if download.cancelled():
|
if download.cancelled():
|
||||||
continue
|
continue
|
||||||
e = download.exception()
|
e = download.exception()
|
||||||
|
@ -531,16 +532,21 @@ class DASH:
|
||||||
log.error(f"Segment Download worker threw an unhandled exception: {e!r}")
|
log.error(f"Segment Download worker threw an unhandled exception: {e!r}")
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
else:
|
else:
|
||||||
|
progress(advance=1)
|
||||||
|
|
||||||
|
now = time.time()
|
||||||
|
time_since = now - last_speed_refresh
|
||||||
|
|
||||||
download_size = download.result()
|
download_size = download.result()
|
||||||
elapsed_time = time.time() - download_start_time
|
if download_size: # no size == skipped dl
|
||||||
download_sizes.append(download_size)
|
download_sizes.append(download_size)
|
||||||
while elapsed_time - len(download_sizes) > 10:
|
|
||||||
download_sizes.pop(0)
|
if time_since > 5 or finished_threads == len(segments):
|
||||||
download_speed = sum(download_sizes) / len(download_sizes)
|
data_size = sum(download_sizes)
|
||||||
progress(
|
download_speed = data_size / time_since
|
||||||
advance=1,
|
progress(downloaded=f"DASH {filesize.decimal(download_speed)}/s")
|
||||||
downloaded=f"DASH {filesize.decimal(download_speed)}/s"
|
last_speed_refresh = now
|
||||||
)
|
download_sizes.clear()
|
||||||
except KeyboardInterrupt:
|
except KeyboardInterrupt:
|
||||||
state_event.set()
|
state_event.set()
|
||||||
pool.shutdown(wait=False, cancel_futures=True)
|
pool.shutdown(wait=False, cancel_futures=True)
|
||||||
|
|
|
@ -297,7 +297,7 @@ class HLS:
|
||||||
silent=True
|
silent=True
|
||||||
))
|
))
|
||||||
|
|
||||||
data_size = len(newest_init_data or b"")
|
data_size = segment_save_path.stat().st_size
|
||||||
|
|
||||||
if isinstance(track, Audio) or newest_init_data:
|
if isinstance(track, Audio) or newest_init_data:
|
||||||
with open(segment_save_path, "rb+") as f:
|
with open(segment_save_path, "rb+") as f:
|
||||||
|
@ -315,7 +315,6 @@ class HLS:
|
||||||
f.seek(0)
|
f.seek(0)
|
||||||
f.write(newest_init_data)
|
f.write(newest_init_data)
|
||||||
f.write(segment_data)
|
f.write(segment_data)
|
||||||
data_size += len(segment_data)
|
|
||||||
|
|
||||||
if newest_segment_key[0]:
|
if newest_segment_key[0]:
|
||||||
newest_segment_key[0].decrypt(segment_save_path)
|
newest_segment_key[0].decrypt(segment_save_path)
|
||||||
|
@ -346,11 +345,12 @@ class HLS:
|
||||||
|
|
||||||
progress(total=len(master.segments))
|
progress(total=len(master.segments))
|
||||||
|
|
||||||
download_start_time = time.time()
|
|
||||||
download_sizes = []
|
download_sizes = []
|
||||||
|
last_speed_refresh = time.time()
|
||||||
|
|
||||||
with ThreadPoolExecutor(max_workers=16) as pool:
|
with ThreadPoolExecutor(max_workers=16) as pool:
|
||||||
try:
|
try:
|
||||||
|
finished_threads = 0
|
||||||
for download in futures.as_completed((
|
for download in futures.as_completed((
|
||||||
pool.submit(
|
pool.submit(
|
||||||
download_segment,
|
download_segment,
|
||||||
|
@ -361,6 +361,7 @@ class HLS:
|
||||||
)
|
)
|
||||||
for i, segment in enumerate(master.segments)
|
for i, segment in enumerate(master.segments)
|
||||||
)):
|
)):
|
||||||
|
finished_threads += 1
|
||||||
if download.cancelled():
|
if download.cancelled():
|
||||||
continue
|
continue
|
||||||
e = download.exception()
|
e = download.exception()
|
||||||
|
@ -371,16 +372,21 @@ class HLS:
|
||||||
log.error(f"Segment Download worker threw an unhandled exception: {e!r}")
|
log.error(f"Segment Download worker threw an unhandled exception: {e!r}")
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
else:
|
else:
|
||||||
|
progress(advance=1)
|
||||||
|
|
||||||
|
now = time.time()
|
||||||
|
time_since = now - last_speed_refresh
|
||||||
|
|
||||||
download_size = download.result()
|
download_size = download.result()
|
||||||
elapsed_time = time.time() - download_start_time
|
if download_size: # no size == skipped dl
|
||||||
download_sizes.append(download_size)
|
download_sizes.append(download_size)
|
||||||
while elapsed_time - len(download_sizes) > 10:
|
|
||||||
download_sizes.pop(0)
|
if time_since > 5 or finished_threads == len(master.segments):
|
||||||
download_speed = sum(download_sizes) / len(download_sizes)
|
data_size = sum(download_sizes)
|
||||||
progress(
|
download_speed = data_size / time_since
|
||||||
advance=1,
|
progress(downloaded=f"HLS {filesize.decimal(download_speed)}/s")
|
||||||
downloaded=f"HLS {filesize.decimal(download_speed)}/s"
|
last_speed_refresh = now
|
||||||
)
|
download_sizes.clear()
|
||||||
except KeyboardInterrupt:
|
except KeyboardInterrupt:
|
||||||
state_event.set()
|
state_event.set()
|
||||||
pool.shutdown(wait=False, cancel_futures=True)
|
pool.shutdown(wait=False, cancel_futures=True)
|
||||||
|
|
Loading…
Reference in New Issue