import subprocess import sys import json import re class VolumeMonitor: def get_vol_info(self): try: # Получаем громкость + состояние raw = subprocess.check_output(["wpctl", "get-volume", "@DEFAULT_AUDIO_SINK@"]).decode().strip() # Получаем громкость match = re.search(r"(\d\.\d+)", raw) vol_val = float(match.group(1)) if match else 0.0 percent = int(vol_val * 100) # Проверяем наличие метки muted is_muted = "[MUTED]" in raw return json.dumps({"volume": percent, "muted": is_muted}) except Exception: return json.dumps({"volume": 0, "muted": False}) def push_update(self): sys.stdout.write(f"{self.get_vol_info()}\n") sys.stdout.flush() def run(self): self.push_update() proc = subprocess.Popen(["pactl", "subscribe"], stdout=subprocess.PIPE, text=True) for line in proc.stdout: if "sink" in line or "server" in line: self.push_update() if __name__ == "__main__": VolumeMonitor().run()