diff --git a/scripts/redact-cast.py b/scripts/redact-cast.py index ffd5d2e49..008b1bec0 100755 --- a/scripts/redact-cast.py +++ b/scripts/redact-cast.py @@ -1,7 +1,6 @@ #!/usr/bin/env python3 import json import os -import re import sys import pyte @@ -15,45 +14,48 @@ def main(): input_file = sys.argv[1] output_file = sys.argv[2] + + # Count total lines for progress bar + total_lines = sum(1 for _ in open(input_file, 'r')) - # Read and parse the cast file - with open(input_file, "r") as f: - # First line is header - header = f.readline().strip() - - # Parse header to extract terminal dimensions + with open(input_file, "r") as fin, open(output_file, "w") as fout: + # Process header + header = fin.readline().strip() + fout.write(header + "\n") + + # Parse header for terminal dimensions header_data = json.loads(header) width = header_data.get("width", 80) height = header_data.get("height", 24) - print(f"Terminal dimensions: {width}x{height}") - - # Initialize pyte screen and stream with dimensions from header + + # Initialize terminal emulator screen = pyte.Screen(width, height) stream = pyte.Stream(screen) - - # Read the events - events = [json.loads(line) for line in f if line.strip()] - - # Write the header to the output file - with open(output_file, "w") as f: - f.write(header + "\n") - - # Process each event through the terminal emulator and stream to file - for event in tqdm(events, desc="Processing events"): - # Process the event in the terminal - if len(event) >= 3 and event[1] == "o": # Output event + + # Process events line by line + for line in tqdm(fin, desc="Processing events", total=total_lines-1): + if not line.strip(): + continue + + event = json.loads(line) + + # Only run terminal emulation for output events + if len(event) >= 3 and event[1] == "o": stream.feed(event[2]) - - # Check if "Atuin" is visible on screen - if any( - ("Atuin" in line) - for line in screen.display - ): + + # Check if "Atuin" is visible on screen - exit early if found + atuin_visible = False + for display_line in screen.display: + if "Atuin" in display_line: + atuin_visible = True + break + + if atuin_visible: continue # Skip this event - - # Write this event directly to the output file - f.write(json.dumps(event) + "\n") + + # Write event to output file + fout.write(json.dumps(event) + "\n") if __name__ == "__main__":