Initial commit of BGMusic
This commit is contained in:
@@ -0,0 +1,96 @@
|
|||||||
|
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.")
|
||||||
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user