78 lines
2.1 KiB
Python
Executable File
78 lines
2.1 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
from pydbus import SessionBus
|
|
from gi.repository import GLib
|
|
import subprocess
|
|
|
|
bus = SessionBus()
|
|
loop = GLib.MainLoop()
|
|
|
|
connected_players = {}
|
|
inhibit_proc = None
|
|
inhibited = False
|
|
|
|
def handle_properties_changed(player_name):
|
|
def handler(interface, changed, invalidated):
|
|
global inhibited, inhibit_proc
|
|
|
|
if "PlaybackStatus" in changed:
|
|
status = changed["PlaybackStatus"]
|
|
print(f"[{player_name}] PlaybackStatus changed: {status}")
|
|
|
|
if status == "Playing" and not inhibited:
|
|
print(f"[{player_name}] ▶️ Inhibiting idle")
|
|
inhibit_proc = subprocess.Popen(["hypridle-inhibit", "sleep"])
|
|
inhibited = True
|
|
elif status != "Playing" and inhibited:
|
|
print(f"[{player_name}] ⏸️ Stopping inhibit")
|
|
if inhibit_proc:
|
|
inhibit_proc.terminate()
|
|
inhibited = False
|
|
|
|
return handler
|
|
|
|
def connect_player(name):
|
|
if name in connected_players:
|
|
return
|
|
try:
|
|
player = bus.get(name, "/org/mpris/MediaPlayer2")
|
|
player.onPropertiesChanged = handle_properties_changed(name)
|
|
connected_players[name] = player
|
|
print(f" Connected to MPRIS player: {name}")
|
|
except Exception as e:
|
|
print(f" Failed to connect to {name}: {e}")
|
|
|
|
def connect_all_players():
|
|
dbus = bus.get(".DBus")
|
|
names = dbus.ListNames()
|
|
for name in names:
|
|
if name.startswith("org.mpris.MediaPlayer2."):
|
|
connect_player(name)
|
|
|
|
|
|
def on_name_owner_changed(conn, sender, object, interface, signal, params):
|
|
name, old_owner, new_owner = params
|
|
if name.startswith("org.mpris.MediaPlayer2.") and new_owner:
|
|
print(f" New player appeared: {name}")
|
|
connect_player(name)
|
|
|
|
|
|
# Subscribir a nuevos reproductores que se conecten al bus
|
|
bus.con.signal_subscribe(
|
|
None,
|
|
"org.freedesktop.DBus",
|
|
"NameOwnerChanged",
|
|
None,
|
|
None,
|
|
0,
|
|
on_name_owner_changed
|
|
)
|
|
|
|
|
|
# Conectar a los reproductores activos en el momento
|
|
connect_all_players()
|
|
|
|
# Iniciar loop principal
|
|
print(" MPRIS idle inhibitor started.")
|
|
loop.run()
|
|
|