mNo edit summary |
No edit summary |
||
Line 19: | Line 19: | ||
<pre><nowiki> | <pre><nowiki> | ||
GNU nano 2.7.4 File: theme_songs.py | |||
# | |||
# Melan, 2020 | |||
import paho.mqtt.client as | |||
import paho.mqtt.client as mqtt | |||
import os | |||
import coloredlogs | |||
import logging | |||
import json | import json | ||
import | import re | ||
import threading | |||
import math | |||
import traceback | |||
import pydub | |||
import math | |||
from mpd import MPDClient | from mpd import MPDClient | ||
from queue import Queue | |||
from threading import Thread | |||
from pydub import AudioSegment | |||
from pydub.playback import play | |||
class themesongs(): | |||
config = { | |||
"path": "/mnt/mp3/themes", | |||
"mqtt": { | |||
"host": "arbiter.vm.nurd.space", | |||
"port": 1883 | |||
}, | |||
"mpd": { | |||
"host": "localhost", | |||
"port": 6600, | |||
} | |||
} | |||
log = logging.getLogger("ThemeSongs") | |||
play_queue = Queue() | |||
def __init__(self): | |||
self.log.info("Theme song server is starting") | |||
self.mqtt = mqtt.Client() | |||
self.mqtt.connect(self.config['mqtt']['host'], self.config['mqtt']['port'], 60) | |||
self.mqtt.on_connect = self.on_mqtt_connect | |||
self.mqtt.on_message = self.on_mqtt_message | |||
threading.Thread(target=self.threaded_play).start() | |||
print(round((math.log(math.sqrt(int("60")/100)) / 2.30258509299405) * 60) ) | |||
self.mqtt.loop_forever() | |||
def threaded_play(self): | |||
self.log.info("Play Thread started.") | |||
while True: | |||
file = self.play_queue.get() | |||
if file and os.path.exists(file): | |||
try: | |||
mclient = MPDClient() # create client object | |||
mclient.timeout = 10 # network timeout in seconds (floats allowed), default: None | |||
mclient.idletimeout = None # timeout for fetching the result of the idle command is handled seperately, default: None | |||
mclient.connect("slabpi.dhcp.nurd.space", 6600) # connect to localhost:6600 | |||
mpd_status = mclient.status() | |||
# Only pause MPD if it was actually playing | |||
if mpd_status['state'] == "play": | |||
mclient.pause(1) | |||
volume_change = round((math.log(math.sqrt(int(mpd_status['volume'])/100)) / 2.30258509299405) * 40) | |||
self.log.info("Playing file %s" % (file)) | |||
sound = pydub.AudioSegment.from_file(file, format=os.path.splitext(os.path.basename(file))[-1][1:]) # Load the audio file | |||
self.log.info("Volume: " + str(volume_change)) | |||
pydub.playback.play(sound - int(str(volume_change)[1:])) # Play | |||
# Only resume MPD if it was previously playing | |||
if mpd_status['state'] == "play": | |||
mclient.pause(0) | |||
mclient.disconnect() | |||
except Exception as e: | |||
self.log.info('Something failed: %s' % e) | |||
traceback.print_exc() | |||
def on_mqtt_connect(self, client, userdata, flags, rc): | |||
self.log.info("Connected to MQTT") | |||
self.mqtt.subscribe("space/door/front") | |||
def on_mqtt_message(self, client, userdata, msg): | |||
try: | |||
message_json = json.loads(msg.payload.decode("utf-8")) | |||
except Exception as e: | |||
self.log.error("Failed to decode %s (%s)" % (msg, e)) | |||
message_json = None | |||
if message_json and "name" in message_json: | |||
self.log.info("%s has opened the door." % (message_json['name'])) | |||
for file in os.listdir(self.config['path']): | |||
if re.search(message_json['name'], file, re.IGNORECASE): | |||
self.log.info("%s's theme song: %s" % (message_json['name'], file)) | |||
self.play_queue.put(os.path.join(self.config['path'], file)) | |||
== | if __name__ == "__main__": | ||
logging.basicConfig(level=logging.INFO) | |||
coloredlogs.install(level='INFO', fmt="%(asctime)s %(name)s %(levelname)s %(message)s") | |||
tsong = themesongs() |
Revision as of 20:28, 18 February 2020
Entrance themes | |
---|---|
Participants | Dennis |
Skills | Programming |
Status | Finished |
Niche | |
Purpose | Fun |
Tool | No |
Location | SlabPi |
Cost | |
Tool category |
WWEEntrance.jpg {{#if:No | [[Tool Owner::{{{ProjectParticipants}}} | }} {{#if:No | [[Tool Cost::{{{Cost}}} | }}
What
We have a script running on SlabPi that plays entrance theme audio when a member enters the space.
It checks if a member is entering on MQTT, it pauses MPD, plays a song from the folder "themes" that was mounted from Egg with mpg123 and resumes MPD. It needs paho installed. More info about installing paho here: Shutdown Script
The script
<nowiki> GNU nano 2.7.4 File: theme_songs.py # Melan, 2020 import paho.mqtt.client as mqtt import os import coloredlogs import logging import json import re import threading import math import traceback import pydub import math from mpd import MPDClient from queue import Queue from threading import Thread from pydub import AudioSegment from pydub.playback import play class themesongs(): config = { "path": "/mnt/mp3/themes", "mqtt": { "host": "arbiter.vm.nurd.space", "port": 1883 }, "mpd": { "host": "localhost", "port": 6600, } } log = logging.getLogger("ThemeSongs") play_queue = Queue() def __init__(self): self.log.info("Theme song server is starting") self.mqtt = mqtt.Client() self.mqtt.connect(self.config['mqtt']['host'], self.config['mqtt']['port'], 60) self.mqtt.on_connect = self.on_mqtt_connect self.mqtt.on_message = self.on_mqtt_message threading.Thread(target=self.threaded_play).start() print(round((math.log(math.sqrt(int("60")/100)) / 2.30258509299405) * 60) ) self.mqtt.loop_forever() def threaded_play(self): self.log.info("Play Thread started.") while True: file = self.play_queue.get() if file and os.path.exists(file): try: mclient = MPDClient() # create client object mclient.timeout = 10 # network timeout in seconds (floats allowed), default: None mclient.idletimeout = None # timeout for fetching the result of the idle command is handled seperately, default: None mclient.connect("slabpi.dhcp.nurd.space", 6600) # connect to localhost:6600 mpd_status = mclient.status() # Only pause MPD if it was actually playing if mpd_status['state'] == "play": mclient.pause(1) volume_change = round((math.log(math.sqrt(int(mpd_status['volume'])/100)) / 2.30258509299405) * 40) self.log.info("Playing file %s" % (file)) sound = pydub.AudioSegment.from_file(file, format=os.path.splitext(os.path.basename(file))[-1][1:]) # Load the audio file self.log.info("Volume: " + str(volume_change)) pydub.playback.play(sound - int(str(volume_change)[1:])) # Play # Only resume MPD if it was previously playing if mpd_status['state'] == "play": mclient.pause(0) mclient.disconnect() except Exception as e: self.log.info('Something failed: %s' % e) traceback.print_exc() def on_mqtt_connect(self, client, userdata, flags, rc): self.log.info("Connected to MQTT") self.mqtt.subscribe("space/door/front") def on_mqtt_message(self, client, userdata, msg): try: message_json = json.loads(msg.payload.decode("utf-8")) except Exception as e: self.log.error("Failed to decode %s (%s)" % (msg, e)) message_json = None if message_json and "name" in message_json: self.log.info("%s has opened the door." % (message_json['name'])) for file in os.listdir(self.config['path']): if re.search(message_json['name'], file, re.IGNORECASE): self.log.info("%s's theme song: %s" % (message_json['name'], file)) self.play_queue.put(os.path.join(self.config['path'], file)) if __name__ == "__main__": logging.basicConfig(level=logging.INFO) coloredlogs.install(level='INFO', fmt="%(asctime)s %(name)s %(levelname)s %(message)s") tsong = themesongs()