Fix printing of aria2c logs when capturing progress

This commit is contained in:
rlaphoenix 2023-03-03 01:59:29 +00:00
parent b2bcaf97a2
commit 432a1122c5
1 changed files with 37 additions and 34 deletions

View File

@ -1,4 +1,5 @@
import subprocess import subprocess
import textwrap
from functools import partial from functools import partial
from pathlib import Path from pathlib import Path
from typing import Optional, Union from typing import Optional, Union
@ -87,44 +88,46 @@ def aria2c(
p = subprocess.Popen( p = subprocess.Popen(
[executable, *arguments], [executable, *arguments],
stdin=subprocess.PIPE, stdin=subprocess.PIPE,
stderr=[None, subprocess.DEVNULL][silent], stdout=[subprocess.PIPE, subprocess.DEVNULL][silent],
stdout=(
subprocess.PIPE if progress else
subprocess.DEVNULL if silent else
None
),
universal_newlines=True universal_newlines=True
) )
p._stdin_write(uri) # noqa p._stdin_write(uri) # noqa
if progress: is_dl_summary = False
is_dl_summary = False aria_log_buffer = ""
for line in iter(p.stdout.readline, ""): for line in iter(p.stdout.readline, ""):
line = line.strip() line = line.strip()
if line: if line:
if line.startswith("[") and line.endswith("]"): if line.startswith("Download Results"):
if "%" in line: # we know it's 100% downloaded, but let's use the avg dl speed value
# id, dledMiB/totalMiB(x%), CN:xx, DL:xxMiB, ETA:Xs is_dl_summary = True
# eta may not always be available elif line.startswith("[") and line.endswith("]"):
data_parts = line[1:-1].split() if progress and "%" in line:
perc_parts = data_parts[1].split("(") # id, dledMiB/totalMiB(x%), CN:xx, DL:xxMiB, ETA:Xs
if len(perc_parts) == 2: # eta may not always be available
# might otherwise be e.g., 0B/0B, with no % symbol provided data_parts = line[1:-1].split()
progress( perc_parts = data_parts[1].split("(")
total=100, if len(perc_parts) == 2:
completed=int(perc_parts[1][:-2]), # might otherwise be e.g., 0B/0B, with no % symbol provided
downloaded=f"{data_parts[3].split(':')[1]}/s" progress(
) total=100,
elif line.startswith("Download Results"): completed=int(perc_parts[1][:-2]),
# we know it's 100% downloaded, but let's use the avg dl speed value downloaded=f"{data_parts[3].split(':')[1]}/s"
is_dl_summary = True )
elif is_dl_summary and "OK" in line and "|" in line: elif is_dl_summary and "OK" in line and "|" in line:
gid, status, avg_speed, path_or_uri = line.split("|") gid, status, avg_speed, path_or_uri = line.split("|")
progress(total=100, completed=100, downloaded=avg_speed.strip()) progress(total=100, completed=100, downloaded=avg_speed.strip())
elif not is_dl_summary: elif not is_dl_summary:
buffer_msg = line.split(" ", maxsplit=2) aria_log_buffer += f"{line.strip()}\n"
buffer_msg = f"[Aria2c]: {buffer_msg[-1].strip()}"
console.log(Text.from_ansi(buffer_msg)) if aria_log_buffer:
# wrap to console width - padding - '[Aria2c]: '
aria_log_buffer = "\n ".join(textwrap.wrap(
aria_log_buffer.rstrip(),
width=console.width - 20,
initial_indent=""
))
console.log(Text.from_ansi("\n[Aria2c]: " + aria_log_buffer))
p.wait() p.wait()