feat: update volume widget and visual

This commit is contained in:
2026-04-07 22:04:55 +04:00
parent 54f98286a6
commit c2ae3d05be
3 changed files with 48 additions and 37 deletions
+22 -27
View File
@@ -1,42 +1,37 @@
import subprocess
import sys
import os
import signal
import json
import re
class VolumeMonitor:
def __init__(self):
# отдаём текущую громкость при старте
self.push_update()
def get_vol(self):
# достаём цифры из pactl
def get_vol_info(self):
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"
# Получаем громкость + состояние
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):
# отдаём данные в stdout для eww
vol = self.get_vol()
sys.stdout.write(f"{vol}\n")
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)
try:
for line in proc.stdout:
# если изменился основной выход
if "sink" in line:
self.push_update()
except KeyboardInterrupt:
proc.terminate()
sys.exit(0)
for line in proc.stdout:
if "sink" in line or "server" in line:
self.push_update()
if __name__ == "__main__":
VolumeMonitor().run()