# # engine # # Playout Daemon for autoradio project # # # Copyright (C) 2017-2018 Gottfried Gaisbauer <gottfried.gaisbauer@servus.at> # # This file is part of engine. # # engine is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # any later version. # # engine is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with engine. If not, see <http://www.gnu.org/licenses/>. # from modules.communication.liquidsoap.client import LiquidSoapClient class LiquidSoapPlayerClient(LiquidSoapClient): # ------------------------------------------------------------------------------------------ # def mixer(self, command, *args): if command == "status": return self.mixerstatus(*args) if command == "inputs": return self.mixerinputs() if command == "volume": return self.mixervolume(*args) if command == "select": if len(args) == 2: return self.mixerselect(args[0], args[1]) return "LiquidSoapPlayerClient does not understand mixer."+command+str(args) # ------------------------------------------------------------------------------------------ # def recorder(self, num, command, *args): if command == "status": return self.recorderstatus(num) if command == "start": return self.recorderstart(num) if command == "stop": return self.recorderstop(num) return "LiquidSoapPlayerClient does not understand mixer." + command + str(args) # ------------------------------------------------------------------------------------------ # def http(self, command, *args): if command == "url": return self.set_http_url(*args) return "LiquidSoapPlayerClient does not understand http." + command + str(args) # ------------------------------------------------------------------------------------------ # def fs(self, command, *args): if command == "push": return self.fs_push(*args) return "LiquidSoapPlayerClient does not understand fs." + command + str(args) # ------------------------------------------------------------------------------------------ # def auraengine(self, command, *args): if command == "state": return self.auraengine_state() return "LiquidSoapPlayerClient does not understand auraengine." + command + str(args) # ------------------------------------------------------------------------------------------ # def auraengine_state(self): self.command('auraengine', 'state') return self.message # ------------------------------------------------------------------------------------------ # def fs_push(self, uri): self.command('fs', 'push', uri) return self.message # ------------------------------------------------------------------------------------------ # def set_http_url(self, uri): self.command('http', 'url', uri) return self.message # ------------------------------------------------------------------------------------------ # def mixerinputs(self): # send command self.command("mixer", "inputs") # convert to list and return it return self.message.strip().split(' ') # ------------------------------------------------------------------------------------------ # def mixerstatus(self, pos=""): """ Get state of a source in the mixer @type pos: string @param pos: Mixerposition @rtype: string @return: Response from LiquidSoap """ self.command("mixer", "status", str(pos)) return self.message # ------------------------------------------------------------------------------------------ # def mixerselect(self, pos, activate): """ Kanal/Source aktivieren @type pos: string @param pos: Die Position @type namespace: string @param namespace: Namespace der Source @rtype: string @return: Die Antwort des Liquidsoap-Servers """ self.command("mixer", "select", str(pos) + " " + str(activate).lower()) return self.message # ------------------------------------------------------------------------------------------ # def mixervolume(self, pos, volume): """ set channel volume :param pos: :param volume: :return: """ self.command("mixer", "volume", str(pos) + " " + str(volume)) return self.message # ------------------------------------------------------------------------------------------ # def recorderstatus(self, num): """ get status of a recorder :return: """ self.command("recorder_" + str(num), "status") return self.message # ------------------------------------------------------------------------------------------ # def recorderstart(self, num): """ get status of a recorder :return: """ self.command("recorder_" + str(num), "start") return self.message # ------------------------------------------------------------------------------------------ # def recorderstop(self, num): """ get status of a recorder :return: """ self.command("recorder_" + str(num), "stop") return self.message # ------------------------------------------------------------------------------------------ # def skip(self, namespace="playlist", pos=""): """ Source skippen @type namespace: string @param namespace: Namespace der Source @type pos: string @param pos: Die Position - optional - Position des Channels vom Mixer benötigt @rtype: string @return: Die Antwort des Liquidsoap-Servers """ self.command('skip', namespace, pos) return self.message # ------------------------------------------------------------------------------------------ # def remove(self, pos, namespace="playlist"): """ Track aus der secondary_queue oder der Playlist entfernen @type pos: string @param pos: Die Position @type namespace: string @param namespace: Namespace der Source @rtype: string @return: Die Antwort des Liquidsoap-Servers """ self.command('remove', namespace, str(pos)) return self.message # ------------------------------------------------------------------------------------------ # def insert(self, uri, pos='0', namespace="playlist"): """ Track einfügen @type uri: string @param uri: Uri einer Audiodatei @type pos: string @param pos: Die Position @type namespace: string @param namespace: Namespace der Source @rtype: string @return: Die Antwort des Liquidsoap-Servers """ self.command('insert', namespace, str(pos) + ' ' + uri) return self.message # ------------------------------------------------------------------------------------------ # def move(self, fromPos, toPos, namespace="playlist"): """ Track von Position fromPos nach Position toPos verschieben @type fromPos: string/int @param fromPos: Position des zu verschiebenden Tracks @type toPos: string @param toPos: Die Position zu der verschoben werden soll @type namespace: string @param namespace: Namespace der Source @rtype: string @return: Die Antwort des Liquidsoap-Servers """ self.command('move', namespace, str(fromPos) + ' ' + str(toPos)) return self.message # ------------------------------------------------------------------------------------------ # def play(self, namespace="playlist"): """ Source abspielen - funktioniert nur bei Playlist @type namespace: string @param namespace: Namespace der Source @rtype: string @return: Die Antwort des Liquidsoap-Servers """ self.command('play', namespace) return self.message # ------------------------------------------------------------------------------------------ # def pause(self, namespace="playlist"): """ Source pausieren/stoppen - funktioniert nur bei Playlist @type namespace: string @param namespace: Namespace der Source @rtype: string @return: Die Antwort des Liquidsoap-Servers """ self.command('pause', namespace) return self.message # ------------------------------------------------------------------------------------------ # def flush(self, namespace="playlist"): """ Playlist leeren @type namespace: string @param namespace: Namespace der Source @rtype: string @return: Die Antwort des Liquidsoap-Servers """ self.command('flush', namespace) return self.message # ------------------------------------------------------------------------------------------ # def playlistData(self): """ Metadaten der Playlist ausgeben @rtype: string @return: Ein Json-String """ self.command('data', 'playlist') return self.message # ------------------------------------------------------------------------------------------ # def seek(self, duration, namespace="playlist"): """ Aktuell laufenen Track des Kanals vorspulen @type duration: string/int @param duration: Dauer in Sekunden @type namespace: string @param namespace: Namespace der Source @rtype: string @return: Die Antwort des Liquidsoap-Servers """ self.command('seek', namespace, str(duration)) return self.message # ------------------------------------------------------------------------------------------ # def get_queue(self, namespace="ch1", queue='queue'): """ Queue eines Kanals ausgeben @type namespace: string @param namespace: Namespace der Source @type queue: string @param queue: Name des queues (queue, primary_queue, secondary_queue) @rtype: string @return: Die Antwort des Liquidsoap-Servers """ self.command(queue, namespace) return self.message # ------------------------------------------------------------------------------------------ # def loadPlaylist(self, uri, params="", namespace="playlist"): """ Playlist laden @type uri: string @param uri: Uri einer Playlist im XSPF-Format @type params: string @param params: obsolete @type namespace: string @param namespace: Namespace der Source - hier nur playlist @rtype: string @return: Die Antwort des Liquidsoap-Servers """ self.command('load', namespace, uri + params) return self.message # ------------------------------------------------------------------------------------------ # def currentTrack(self, namespace="request"): """ Das oder die ID(s) der gerade abgespielten requests erhalten @type namespace: string @param namespace: Namespace der Source @rtype: string @return: Die Antwort des Liquidsoap-Servers (als String) """ self.command('on_air', namespace) return self.message # ------------------------------------------------------------------------------------------ # def volume(self, pos, volume, namespace="mixer"): """ Lautstärke eines Kanals setzen @type pos: int/string @param pos: Die Position/ Nummer des Kanals (playlist=0) @type volume: int/string @param volume: Zahl von 1 -100 @type namespace: string @param namespace: Namespace der Source (immer mixer) @rtype: string @return: Die Antwort des Liquidsoap-Servers """ self.command('volume', namespace, str(pos) + ' ' + str(volume)) return self.message # ------------------------------------------------------------------------------------------ # def playlist_remaining(self): """ Wie lange läuft der aktuelle Track der Playlist noch @rtype: string @return: Die Antwort des Liquidsoap-Servers """ self.command('remaining', 'playlist') return self.message # ------------------------------------------------------------------------------------------ # def list_channels(self): """ Channels auflisten (Simple JSON) """ # Liquidsoap Kommando channels = self.sendLqcCommand(self.lqc, 'mixer', 'inputs') if not isinstance(channels, list): self.error('02') elif len(channels) < 1: self.warning('01') else: self.success('00', channels) self.notifyClient()