Skip to content
Snippets Groups Projects
playerclient.py 13.5 KiB
Newer Older
  • Learn to ignore specific revisions
  • #
    #  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')
    
    Gottfried Gaisbauer's avatar
    Gottfried Gaisbauer committed
            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()