Add progress display for S3 upload and transcription polling

- Add real-time progress bar with percentage for S3 upload (file size/MB)
- Replace repetitive polling output with single-line refreshing status
- Show elapsed time and poll count during transcription polling
- Add .claude/ to .gitignore

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Misaka_Company
2026-06-15 14:11:33 +08:00
parent e4c6f793e1
commit 8a56450b79
2 changed files with 30 additions and 6 deletions

4
.gitignore vendored
View File

@@ -37,4 +37,6 @@ output/
Archive/
# Tools
tools/
tools/
.claude/

View File

@@ -100,8 +100,23 @@ audio_ext = os.path.splitext(audio_file)[1].lstrip(".")
audio_name = os.path.splitext(os.path.basename(audio_file))[0]
obj_name = f"audio/{uuid.uuid4().hex[:8]}_{os.path.basename(audio_file)}"
print(f"Uploading {audio_file} ...")
s3.upload_file(audio_file, S3_BUCKET, obj_name)
file_size = os.path.getsize(audio_file)
uploaded = [0] # Use list to allow modification in callback
def upload_callback(bytes_transferred):
uploaded[0] += bytes_transferred
percent = min(100, int(uploaded[0] * 100 / file_size))
uploaded_mb = uploaded[0] / (1024 * 1024)
total_mb = file_size / (1024 * 1024)
bar_width = 30
filled = int(bar_width * percent / 100)
bar = "" * filled + "" * (bar_width - filled)
print(f"\rUploading [{bar}] {percent}% ({uploaded_mb:.1f}MB / {total_mb:.1f}MB)", end="", flush=True)
print(f"Uploading {audio_file} ({file_size / (1024 * 1024):.1f}MB) ...")
s3.upload_file(audio_file, S3_BUCKET, obj_name, Callback=upload_callback)
print() # New line after upload completes
url = s3.generate_presigned_url(
"get_object",
Params={"Bucket": S3_BUCKET, "Key": obj_name},
@@ -131,6 +146,9 @@ print(f"Submit: {status}")
if status != "20000000":
print(f"FAILED: {resp.headers.get('X-Api-Message', '')}")
else:
start_time = time.time()
poll_count = 0
while True:
resp = session.post(
QUERY_URL,
@@ -156,14 +174,18 @@ else:
with open(md_path, "w", encoding="utf-8") as f:
f.write(build_markdown(data, audio_file))
print(f"Done ({len(text)} chars, {len(utterances)} utterances)")
elapsed = int(time.time() - start_time)
print(f"\rDone ({len(text)} chars, {len(utterances)} utterances, elapsed {elapsed}s)")
print(f"Saved: {json_path}, {md_path}")
break
elif code in ("20000001", "20000002"):
print(f" Processing... ({code})")
poll_count += 1
elapsed = int(time.time() - start_time)
status_msg = "Processing" if code == "20000001" else "Queued"
print(f"\r {status_msg}... (poll {poll_count}, elapsed {elapsed}s) ", end="", flush=True)
time.sleep(5)
else:
print(f"FAILED: {code} {resp.headers.get('X-Api-Message', '')}")
print(f"\rFAILED: {code} {resp.headers.get('X-Api-Message', '')}")
break
print("\nAll done.")