2026-04-03 12:31:56 +04:00
|
|
|
import subprocess
|
|
|
|
|
import sys
|
2026-04-07 22:04:55 +04:00
|
|
|
import json
|
|
|
|
|
import re
|
2026-04-03 12:31:56 +04:00
|
|
|
|
|
|
|
|
class VolumeMonitor:
|
2026-04-07 22:04:55 +04:00
|
|
|
def get_vol_info(self):
|
2026-04-03 12:31:56 +04:00
|
|
|
try:
|
2026-04-07 22:04:55 +04:00
|
|
|
# Получаем громкость + состояние
|
|
|
|
|
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})
|
2026-04-03 12:31:56 +04:00
|
|
|
|
|
|
|
|
def push_update(self):
|
2026-04-07 22:04:55 +04:00
|
|
|
sys.stdout.write(f"{self.get_vol_info()}\n")
|
2026-04-03 12:31:56 +04:00
|
|
|
sys.stdout.flush()
|
|
|
|
|
|
|
|
|
|
def run(self):
|
2026-04-07 22:04:55 +04:00
|
|
|
self.push_update()
|
2026-04-21 13:42:59 +04:00
|
|
|
proc = subprocess.Popen(["pw-mon"], stdout=subprocess.PIPE, text=True, stderr=subprocess.DEVNULL)
|
2026-04-03 12:31:56 +04:00
|
|
|
|
2026-04-07 22:04:55 +04:00
|
|
|
for line in proc.stdout:
|
2026-04-21 13:42:59 +04:00
|
|
|
if "changed" in line:
|
2026-04-07 22:04:55 +04:00
|
|
|
self.push_update()
|
2026-04-03 12:31:56 +04:00
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
2026-04-21 13:42:59 +04:00
|
|
|
VolumeMonitor().run()
|