Improved progress bar detection for curl. Experimental flood protection for updates.
This commit is contained in:
		@@ -144,13 +144,43 @@ class command:
 | 
			
		||||
                        ] = current_time
 | 
			
		||||
                    return
 | 
			
		||||
 | 
			
		||||
        # Pattern 1a2: Curl classic progress format (percentage without % symbol)
 | 
			
		||||
        # Extract percentage from curl's classic format
 | 
			
		||||
        curl_classic_match = re.search(
 | 
			
		||||
            r"^\s*(\d+)\s+\d+[kMGT]?\s+(\d+)\s+\d+[kMGT]?\s+\d+\s+\d+\s+\d+[kMGT]?\s+\d+\s+\d+:\d+:\d+\s+\d+:\d+:\d+\s+\d+:\d+:\d+\s+\d+[kMGT]?\s*$", text
 | 
			
		||||
        )
 | 
			
		||||
        if curl_classic_match:
 | 
			
		||||
            # Use the first percentage (total progress)
 | 
			
		||||
            percentage = float(curl_classic_match.group(1))
 | 
			
		||||
            if 0 <= percentage <= 100:
 | 
			
		||||
                self.env["runtime"]["DebugManager"].write_debug_out(
 | 
			
		||||
                    "found curl classic percentage: " + str(percentage),
 | 
			
		||||
                    debug.DebugLevel.INFO,
 | 
			
		||||
                )
 | 
			
		||||
                if (
 | 
			
		||||
                    percentage
 | 
			
		||||
                    != self.env["commandBuffer"]["lastProgressValue"]
 | 
			
		||||
                ):
 | 
			
		||||
                    self.env["runtime"]["DebugManager"].write_debug_out(
 | 
			
		||||
                        "Playing tone for curl: " + str(percentage),
 | 
			
		||||
                        debug.DebugLevel.INFO,
 | 
			
		||||
                    )
 | 
			
		||||
                    self.play_progress_tone(percentage)
 | 
			
		||||
                    self.env["commandBuffer"][
 | 
			
		||||
                        "lastProgressValue"
 | 
			
		||||
                    ] = percentage
 | 
			
		||||
                    self.env["commandBuffer"][
 | 
			
		||||
                        "lastProgressTime"
 | 
			
		||||
                    ] = current_time
 | 
			
		||||
                return
 | 
			
		||||
 | 
			
		||||
        # Pattern 1b: Time/token activity (not percentage-based, so use single
 | 
			
		||||
        # beep)
 | 
			
		||||
        time_match = re.search(r"(?:(?:remaining|elapsed|left|ETA|eta)[:;\s]*(\d+)s|(\d+)s\s+(?:remaining|elapsed|left))", text, re.IGNORECASE)
 | 
			
		||||
        token_match = re.search(r"(?:processing|generating|used|consumed)\s+(\d+)\s+tokens", text, re.IGNORECASE)
 | 
			
		||||
        # Pattern 1c: dd command output (bytes copied with transfer rate)
 | 
			
		||||
        dd_match = re.search(r"\d+\s+bytes.*copied.*\d+\s+s.*[kMGT]?B/s", text)
 | 
			
		||||
        # Pattern 1d: Curl-style transfer data (bytes, speed indicators)
 | 
			
		||||
        # Pattern 1d: Curl-style transfer data (bytes, speed indicators - legacy)
 | 
			
		||||
        curl_match = re.search(
 | 
			
		||||
            r"(\d+\s+\d+\s+\d+\s+\d+.*?(?:k|M|G)?.*?--:--:--|Speed)", text
 | 
			
		||||
        )
 | 
			
		||||
@@ -285,9 +315,21 @@ class command:
 | 
			
		||||
        self.play_quiet_tone(800, 0.08)
 | 
			
		||||
 | 
			
		||||
    def play_quiet_tone(self, frequency, duration):
 | 
			
		||||
        """Play a quiet tone using Sox directly"""
 | 
			
		||||
        """Play a quiet tone using Sox directly with flood protection"""
 | 
			
		||||
        import shlex
 | 
			
		||||
        import subprocess
 | 
			
		||||
        import time
 | 
			
		||||
 | 
			
		||||
        # Flood protection: prevent beeps closer than 0.1 seconds apart
 | 
			
		||||
        current_time = time.time()
 | 
			
		||||
        if not hasattr(self, '_last_beep_time'):
 | 
			
		||||
            self._last_beep_time = 0
 | 
			
		||||
        
 | 
			
		||||
        if current_time - self._last_beep_time < 0.1:
 | 
			
		||||
            # Skip this beep to prevent audio crackling on low-resource systems
 | 
			
		||||
            return
 | 
			
		||||
        
 | 
			
		||||
        self._last_beep_time = current_time
 | 
			
		||||
 | 
			
		||||
        # Build the Sox command: play -qn synth <duration> tri <frequency> gain
 | 
			
		||||
        # -8
 | 
			
		||||
 
 | 
			
		||||
@@ -4,6 +4,6 @@
 | 
			
		||||
# Fenrir TTY screen reader
 | 
			
		||||
# By Chrys, Storm Dragon, and contributors.
 | 
			
		||||
 | 
			
		||||
version = "2025.08.20"
 | 
			
		||||
version = "2025.08.21"
 | 
			
		||||
codeName = "testing"
 | 
			
		||||
code_name = "testing"
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user