forum.unix.pl

Nasze zainteresowania => Programowanie => Python => Wątek zaczęty przez: rud0lf w 22 Lis 2024, 19:50

Tytuł: Program Python do pauzowania odtwarzaczy gdy odłączane są słuchawki bluetooth.
Wiadomość wysłana przez: rud0lf w 22 Lis 2024, 19:50
Wrzucam kod dla ciekawych, działa z systemami Linux w których działa menadżer MPRIS (do sterowania odtwarzaczami przez interfejs DBus).
Do działania wymagany jest pakiet python3-gi i zainstalowany program `playerctl`. Na waszą prośbę, jeśli ktoś jest zainteresowany, znajdę czas i ochotę na wyeliminowanie zależności od `playerctl`.
Program uruchamia się bez demona, więc polecam odpalić go przez 'nohup' lub 'setsid' (i znowu, na waszą prośbę, znajdę czas i ochotę żeby program się demonizował).
Uruchamiamy go z argumentem adresu MAC urządzenia bluetooth, które jest słuchawkami. Np. `setsid ./bluetooth-pause.py AC:21:23:00:FC:C8`.

#!/usr/bin/env python3


from pydbus import SystemBus
from gi.repository import GLib
import subprocess
import time
import re
import sys

ADDRESS = sys.argv[1].replace(':','_')

def pc_handler(sender=None, iface=None, signal=None, object=None, arg0=None):
    dev_api = dev['org.bluez.Device1']
    if dev_api.Connected:
        print(f"Device {ADDRESS} connected.")
    else:
        print(f"Device {ADDRESS} disconnected.")
        subprocess.call(['playerctl', '-a', 'pause'])

bus = SystemBus()

bluez_desc = bus.get('org.bluez').Introspect()
ifaces = re.findall("node name=\"(hci.)\"", bluez_desc)
if not ifaces:
    raise Exception("No bluetooth interfaces available, check your adapter")

dev = ""
dev_iface = ""
print(f"Running lookup for {ADDRESS}...")
for iface in ifaces:
    print(f"Checking {iface}...")
    try:
        dev = bus.get('org.bluez', f'/org/bluez/{iface}/dev_{ADDRESS}') 
        print(f"Device {ADDRESS} was found at {iface}.")
        dev_iface = iface
        break
    except KeyError:
        print(f"Device {ADDRESS} was not found at {iface}, continuing.")

if not dev:
    raise Exception(f"Device {ADDRESS} was not found in the system, please make sure to pair it first")

listener = bus.subscribe(iface='org.freedesktop.DBus.Properties', signal='PropertiesChanged',
                         object=f'/org/bluez/{dev_iface}/dev_{ADDRESS}',
                         arg0='org.bluez.Device1', signal_fired=pc_handler)

loop = GLib.MainLoop()
loop.run()