import subprocess import sys import os import signal class VolumeMonitor: def __init__(self): # отдаём текущую громкость при старте self.push_update() def get_vol(self): # достаём цифры из pactl try: raw = subprocess.check_output(["pactl", "get-sink-volume", "@DEFAULT_SINK@"], stderr=subprocess.DEVNULL).decode() if "/" in raw: # забираем канал и чистим от процентов return raw.split("/")[1].strip().replace("%", "") except: return "0" return "0" def push_update(self): # отдаём данные в stdout для eww vol = self.get_vol() sys.stdout.write(f"{vol}\n") sys.stdout.flush() def run(self): # подписываемся на события аудио-сервера proc = subprocess.Popen(["pactl", "subscribe"], stdout=subprocess.PIPE, text=True) try: for line in proc.stdout: # если изменился основной выход if "sink" in line: self.push_update() except KeyboardInterrupt: proc.terminate() sys.exit(0) if __name__ == "__main__": VolumeMonitor().run()