90 lines
2.7 KiB
Python
90 lines
2.7 KiB
Python
import gi # type: ignore
|
|
gi.require_version('Gst','1.0')
|
|
from gi.repository import Gst # type: ignore
|
|
import sys
|
|
import select
|
|
import time
|
|
import os
|
|
import paho.mqtt.client as mqtt # type: ignore
|
|
import re
|
|
|
|
Gst.init(None)
|
|
|
|
mqtt = mqtt.Client()
|
|
mqtt.connect("10.40.0.2", 1883)
|
|
|
|
def play_song(Song_path):
|
|
#GStreamer Player
|
|
pipeline = Gst.parse_launch(
|
|
f'filesrc location="{Song_path}" ! \
|
|
mpegaudioparse ! avdec_mp3 ! \
|
|
queue ! audioconvert ! \
|
|
queue ! audioresample ! \
|
|
audio/x-raw,rate=44100,channels=2 ! \
|
|
rtpL16pay ! \
|
|
udpsink host=10.40.0.100 port=5004 '
|
|
)
|
|
|
|
pipeline.set_state(Gst.State.PLAYING)
|
|
|
|
title = os.path.basename(Song_path)
|
|
title = os.path.splitext(title)[0]
|
|
title = re.sub(r'\s*\[[^\]]+\]$', '', title)
|
|
print("🎵 Now Playing:", title)
|
|
mqtt.publish("player/current", title)
|
|
|
|
bus = pipeline.get_bus()
|
|
print("Press 'q' then Enter to stop early.")
|
|
|
|
user_input = ""
|
|
status = "unknown"
|
|
|
|
while True:
|
|
# Check for messages from GStreamer
|
|
msg = bus.timed_pop_filtered(0, Gst.MessageType.ERROR | Gst.MessageType.EOS)
|
|
if msg:
|
|
if msg.type == Gst.MessageType.EOS:
|
|
print("✅ Song finished.")
|
|
break
|
|
elif msg.type == Gst.MessageType.ERROR:
|
|
err, debug = msg.parse_error()
|
|
print("❌ Error:", err)
|
|
status = "error"
|
|
break
|
|
|
|
# Check if user typed "q"
|
|
user_input = None
|
|
|
|
if sys.stdin in select.select([sys.stdin], [], [], 0)[0]:
|
|
user_input = sys.stdin.readline().strip()
|
|
if user_input:
|
|
command = user_input.lower()
|
|
|
|
if command == "q":
|
|
print("🛑 Quitting early.")
|
|
status = "quit"
|
|
break
|
|
|
|
elif command == "skip":
|
|
print("⏩ Skipping song from controller.")
|
|
status = "skip"
|
|
break
|
|
|
|
#elif command == "pause":
|
|
#print("⏸ Pausing playback.") NOTE: Left in for the "Just in case" scenario.
|
|
#pipeline.set_state(Gst.State.PAUSED) NOTE: Audio "pausing" is handled by AHM fading to 0%
|
|
|
|
#elif command == "play":
|
|
#print("▶️ Resuming playback.") NOTE: Left in for the "Just in case" scenario.
|
|
#pipeline.set_state(Gst.State.PLAYING) NOTE: Audio "pausing" is handled by AHM fading to 0%
|
|
|
|
time.sleep(0.1)
|
|
|
|
if not status or status == "unknown":
|
|
status = "Finished"
|
|
|
|
pipeline.set_state(Gst.State.NULL)
|
|
pipeline.get_state(Gst.CLOCK_TIME_NONE)
|
|
del pipeline
|
|
return status
|