mirror-yt: Handle returncode 1
We switch from `subprocess.run` to manually handling a `Popen` object so we can decide whether a returncode of 1 is fine or now depending on the output we see. Since we want live output during the download, we cannot just capture all the output. Instead, we have to regularly print whatever we captured. Therefore, we need a `Popen` object and need to call `communicate()` with a timeout on it.
This commit is contained in:
parent
16de972f7b
commit
c2f5732351
23
mirror-yt.py
23
mirror-yt.py
|
@ -60,7 +60,28 @@ def download(allow_unknown, base_dir, channel_file):
|
||||||
'--write-thumbnail',
|
'--write-thumbnail',
|
||||||
url
|
url
|
||||||
]
|
]
|
||||||
subprocess.run(cmd, check=True, cwd=target_dir)
|
p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, cwd=target_dir)
|
||||||
|
prev_output = ''
|
||||||
|
while p.poll() is None:
|
||||||
|
try:
|
||||||
|
stdout_data, stderr_data = p.communicate(timeout=0.5)
|
||||||
|
except subprocess.TimeoutExpired as e:
|
||||||
|
if e.output:
|
||||||
|
print(e.output[len(prev_output):].decode('utf-8'), end='')
|
||||||
|
prev_output = e.output or ''
|
||||||
|
else:
|
||||||
|
print(stdout_data[len(prev_output):].decode('utf-8'))
|
||||||
|
|
||||||
|
stdout_lines = stdout_data.decode('utf-8').splitlines()
|
||||||
|
if p.returncode == 0:
|
||||||
|
return
|
||||||
|
if p.returncode == 101:
|
||||||
|
pass
|
||||||
|
elif p.returncode == 1 and stdout_lines[-1] and 'Finished downloading playlist' in stdout_lines[-1]:
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
breakpoint()
|
||||||
|
raise subprocess.CalledProcessError(returncode=p.returncode, cmd=cmd)
|
||||||
|
|
||||||
sleep_seconds = 5
|
sleep_seconds = 5
|
||||||
print(f"Sleeping {sleep_seconds}s")
|
print(f"Sleeping {sleep_seconds}s")
|
||||||
|
|
Loading…
Reference in New Issue