Draw the waterfall for everything that never spoke

Every capture that is not voice, or whose voice yields five characters
or fewer of transcript, now gets a PNG of the waterfall it would have
painted on screen: spectrogram from the IQ where it was kept, from the
demodulated audio otherwise, captioned and labelled either way.

The browser shows it in the picture panel, but only when there is no
transcript, Morse or decoded data to show instead.

  bandsaunter waterfall [PATH...] [--all] [--redraw] [--min-chars N]

draws them after the fact for recordings already on disk.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016PsWPTweCT6pwxKngvVxcg
This commit is contained in:
The Dust Council 2026-09-03 18:36:00 -07:00
parent 7e8b9b268d
commit dee262e130
17 changed files with 1383 additions and 35 deletions

View file

@ -488,6 +488,10 @@ def test_a_simulated_transmission_becomes_a_file_on_disk(tmp_path):
assert hit.image_kind == "SSTV" and hit.image_mode == "Martin M1"
assert hit.category == "image"
assert hit.kept, "a picture was decoded and then discarded"
written = list(tmp_path.glob("*.png"))
# Named, not merely globbed: every capture that produced no words has a
# waterfall drawn beside it, and an SSTV transmission produced a picture
# rather than words. Both are PNGs; only one of them is 320 across.
written = [p for p in tmp_path.glob("*.png")
if not p.name.endswith("_waterfall.png")]
assert written
assert _read_png(written[0]).shape[1] == 320