38 lines
1.3 KiB
Python
38 lines
1.3 KiB
Python
"""The download stage's progress line."""
|
|
|
|
import os
|
|
|
|
from archipelago_tester.core.display.progress import Progress
|
|
|
|
|
|
class DownloadReporter:
|
|
"""One line per game, saying what its apworld did.
|
|
|
|
The download run calls back serialized, so this needs no lock of its
|
|
own. What each game's last asset did is remembered so the line can
|
|
still name it once the game itself finishes.
|
|
"""
|
|
|
|
#: What each download status means, in words.
|
|
STATUS_LABELS = {
|
|
"missing": "downloaded (new)",
|
|
"stale": "downloaded (updated)",
|
|
"verified": "already present (verified up to date)",
|
|
"assumed": "already present (not verified)",
|
|
}
|
|
|
|
def __init__(self, config, total):
|
|
self.bar = Progress(total, config=config,
|
|
labels={"ok": "ok", "none": "none"})
|
|
self.last_asset = {}
|
|
|
|
def on_asset(self, game_name, path, status):
|
|
label = self.STATUS_LABELS.get(status, status)
|
|
self.last_asset[game_name] = f"{label} {os.path.basename(path)}"
|
|
|
|
def on_game(self, index, total, game_name, downloaded):
|
|
detail = self.last_asset.pop(game_name, "no apworld")
|
|
self.bar.update(
|
|
index, "ok" if downloaded else "none", game_name,
|
|
fallback_line=f"[{index}/{total}] {game_name}: {detail}")
|