123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 |
- #!/usr/bin/python3
- from subprocess import Popen, PIPE, call
- from threading import Thread
- import time
- # Declarations
- # ============
- # Default configuration for mplayer control thread
- default_config = {
- "streaming_url" : "http://localhost:9092",
- "per_artist_path" : "/artist",
- "default_url" : "",
- }
- # Queue for player commands
- cmd_queue = []
- # Command object
- class Cmd(object):
- def __init__(self, name, param={}):
- self.name = name
- self.param = param
- # Command names for the queue
- # Stream per artist
- # Expected parameter: name - Name of the artist
- CMD_NEW_ARTIST_STREAM = "New Artist Stream"
- # Stop current stream
- CMD_STOP_STREAM = "Stop Stream"
- # Internal
- # ========
- # Internal reference to mplayer process
- _player_instance = None
- # Internal mplayer control table
- _mplayer_control = {
- "step-backward" : "\x1B[B",
- "backward" : "\x1B[D",
- "forward" : "\x1B[C",
- "step-forward" : "\x1B[A",
- "volume-down" : "9",
- "volume-off" : "m",
- "volume-up" : "0",
- "stop" : "q",
- "pause" : " ",
- "play" : " ",
- }
- # Internal config
- _config = None
- def run():
- global _player_instance, _config, _mplayer_control
- while True:
- try:
- # Read the next command
- cmd = cmd_queue.pop()
- except IndexError:
- # If nothing is in the queue wait for a second and try again
- time.sleep(1)
- else:
- if cmd.name == CMD_STOP_STREAM:
- # Stop the current stream
- _stopPlayer()
- if cmd.name == CMD_NEW_ARTIST_STREAM:
- # Stop any current stream
- _stopPlayer()
- # Start a new player with the given artist playlist
- _player_instance = Popen(["mplayer", "-slave", _config["streaming_url"] +
- _config["per_artist_path"] + "/" + cmd.param["name"]], stdin=PIPE)
- def _stopPlayer():
- '''
- Stop A running player instance.
- '''
- global _player_instance, _mplayer_control
- if _player_instance is not None:
- _player_instance.stdin.write(bytes(_mplayer_control["stop"], "UTF-8"))
- _player_instance.stdin.flush()
- _player_instance.terminate()
- _player_instance = None
- # Main API
- # ========
- def start(config=None):
- '''
- Start the new mplayer control thread.
- '''
- global _config, _player_instance
- c = default_config.copy()
- if config is not None:
- c.update(config)
- _config = c
- playerThread = Thread(target=run, args=())
- playerThread.daemon = True
- playerThread.start()
- # Start default playlist if defined
- d = config["default_url"]
- if d != "":
- _player_instance = Popen(["mplayer", "-slave", d], stdin=PIPE)
|