feat: update volume widget and visual
This commit is contained in:
+22
-27
@@ -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()
|
||||
Reference in New Issue
Block a user