import os import subprocess import paho.mqtt.client as mqtt # type: ignore import time import threading current_process = None def on_message(client, userdata, message): global current_process global playlists topic = message.topic payload = message.payload.decode().strip() print(f"šŸ“” MQTT: {topic} → {payload}") if topic == "playlist/set": playlist_name = payload playlist_path = playlists.get(playlist_name) if not playlist_path or not os.path.exists(playlist_path): print(f"āŒ Playlist '{playlist_name}' not found.") return if current_process and current_process.poll() is None: print("šŸ›‘ Stopping current playlist...") current_process.terminate() current_process.wait() print(f"šŸŽ§ Starting playlist: {playlist_name}") current_process = subprocess.Popen(["python3", "Playlist.py", playlist_path],stdin=subprocess.PIPE) #elif topic == "player/toggle": NOTE: Left in for the "Just in case" scenario. #if current_process and current_process.poll() is None: NOTE: Audio "pausing" is handled by AHM fading to 0% #print(f"āÆ Sending toggle: {payload}") #current_process.stdin.write((payload + "\n").encode()) #current_process.stdin.flush() #return elif topic == "player/skip": if current_process and current_process.poll() is None: print("ā© Skipping current song...") current_process.stdin.write(b"skip\n") current_process.stdin.flush() return client = mqtt.Client() client.on_message = on_message client.connect("localhost", 1883) client.subscribe("playlist/set") #client.subscribe("player/toggle") NOTE: Play/pause toggle client.subscribe("player/skip") client.loop_start() playlist_dir = "/home/media/Scripts/BGMusic/Playlists" playlists = { "Worship": os.path.join(playlist_dir, "Worship.txt"), "Praise": os.path.join(playlist_dir, "Praise.txt"), "Instrumental": os.path.join(playlist_dir, "Instrumental.txt") } selected = "Worship" #default playlist playlist_path = playlists.get(selected) if not playlist_path or not os.path.exists(playlist_path): print("Playlist not found!") exit(1) current_process = subprocess.Popen(["python3","Playlist.py",playlist_path], stdin=subprocess.PIPE) def listen_for_local_q(): while True: key = input().strip() if key.lower() == "q": if current_process and current_process.poll() is None: print("šŸ›‘ Sending 'q' to playlist subprocess") current_process.stdin.write(b"q\n") current_process.stdin.flush() threading.Thread(target=listen_for_local_q, daemon=True).start() try: while True: if current_process and current_process.poll() is not None: print("šŸ›‘ Playlist process ended. Exiting controller.") break time.sleep(0.1) except KeyboardInterrupt: print("\nšŸ‘‹ Exiting on Ctrl+C.")