guru.py 7.62 KB
Newer Older
1
#!/usr/bin/python3.5
2

3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#
#  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/>.
#

27
import time
28
import sys
29
import redis
30
31
32

from argparse import ArgumentParser

Gottfried Gaisbauer's avatar
Gottfried Gaisbauer committed
33
# own libs
34
from modules.cli_tool.padavan import Padavan
35
from libraries.exceptions.auraexceptions import PlaylistException
36
from libraries.base.config import AuraConfig
37

Gottfried Gaisbauer's avatar
Gottfried Gaisbauer committed
38

39
class Guru(AuraConfig):
40
41
    parser = None
    args = None
42

43
    # ------------------------------------------------------------------------------------------ #
44
    def __init__(self):
45
        super(Guru, self).__init__()
Gottfried Gaisbauer's avatar
Gottfried Gaisbauer committed
46

47
48
        self.init_argument_parser()
        self.handle_arguments()
49

50
51
    def handle_arguments(self):
        if self.args.stoptime:
Gottfried Gaisbauer's avatar
Gottfried Gaisbauer committed
52
53
            start = time.time()

54
        if not self.args.quiet:
55
            print("Guru thinking...")
56

57
        try:
58
            p = Padavan(self.args, self.config)
59
            p.meditate()
60
61
        except PlaylistException as pe:
            # typically there is no next file found
62
            if not self.args.quiet:
63
64
65
                print(pe)
            else:
                print("")
66
            exit(4)
67
68
69
70
        except redis.exceptions.TimeoutError as te:
            print("Timeout when waiting for redis message. Is AURA daemon running? Exiting...")
            exit(3)

71
        if not self.args.quiet:
72
            print("...result: ")
73

74
75
76
77
78
        if p.stringreply != "":
            if p.stringreply[len(p.stringreply)-1] == "\n":
                print(p.stringreply[0:len(p.stringreply) - 1])
            else:
                print(p.stringreply[0:len(p.stringreply)])
79

80
        if self.args.stoptime:
Gottfried Gaisbauer's avatar
Gottfried Gaisbauer committed
81
82
83
84
            end = time.time()
            exectime = end-start
            print("execution time: "+str(exectime)+"s")

Gottfried Gaisbauer's avatar
Gottfried Gaisbauer committed
85
    def init_argument_parser(self):
86

Gottfried Gaisbauer's avatar
Gottfried Gaisbauer committed
87
        try:
88
89
            self.create_parser()
            self.args = self.parser.parse_args()
Gottfried Gaisbauer's avatar
Gottfried Gaisbauer committed
90

91
92
93
        except (ValueError, TypeError) as e:
            if self.parser is not None:
                self.parser.print_help()
Gottfried Gaisbauer's avatar
Gottfried Gaisbauer committed
94
95
96
97
            print()
            print(e)
            exit(1)

98
    def create_parser(self):
99
        self.parser = ArgumentParser()
100
101

        # options
102
103
104
        self.parser.add_argument("-sep", "--stop-execution-time", action="store_true", dest="stoptime",   default=False, help="Prints the execution time at the end of the skript")
        self.parser.add_argument("-q",   "--quiet",               action="store_true", dest="quiet",      default=False, help="Just the result will outputed to stout")
        self.parser.add_argument("-rd",  "--recreate-database",   action="store_true", dest="recreatedb", default=False, help="Do you want to recreate the database?")
105
106

        # getter
107
108
109
110
        self.parser.add_argument("-pcs", "--print-connection-status", action="store_true", dest="get_connection_status",  default=False, help="Prints the status of the connection to liquidsoap, pv and tank")
        self.parser.add_argument("-gam", "--get-active-mixer",        action="store_true", dest="get_active_mixer",       default=False, help="Which mixer is activated?")
        self.parser.add_argument("-pms", "--print-mixer-status",      action="store_true", dest="get_mixer_status",       default=False, help="Prints all mixer sources and their states")
        self.parser.add_argument("-pap", "--print-act-programme",     action="store_true", dest="get_act_programme",      default=False, help="Prints the actual Programme, the controller holds")
111
112

        # liquid manipulation
113
114
115
        self.parser.add_argument("-am", "--select-mixer",    action="store", dest="select_mixer",   default=-1, metavar="MIXERNAME",                     help="Which mixer should be activated?")
        self.parser.add_argument("-dm", "--de-select-mixer", action="store", dest="deselect_mixer", default=-1, metavar="MIXERNAME",                     help="Which mixer should be activated?")
        self.parser.add_argument("-vm", "--volume",          action="store", dest="set_volume",     default=0,  metavar=("MIXERNUM", "VOLUME"), nargs=2, help="Set volume of a mixer source", type=int)
116

117
118
        # shutdown server
        self.parser.add_argument("-sd", "--shutdown", action="store_true", dest="shutdown", default=False, help="Shutting down aura server")
119

120
121
122
123
        # playlist in/output
        self.parser.add_argument("-fnp", "--fetch-new-programmes",  action="store_true", dest="fetch_new_programme",   default=False, help="Fetch new programmes from calendarurl in comba.ini")
        self.parser.add_argument("-pmq", "--print-message-queue",   action="store_true", dest="print_message_queue",   default=False, help="Prints message queue")

124
        # playlist manipulation
125
126
127
        self.parser.add_argument("-spe", "--swap-playlist-entries", action="store", dest="swap_playlist_entries", default=0, metavar=("FROM", "TO"),         nargs=2, help="Swaps the sources of two Playlistentries")
        self.parser.add_argument("-dpe", "--delete-playlist-entry", action="store", dest="delete_playlist_entry", default=0, metavar="INDEX",                nargs=1, help="Delete Playlistentry at INDEX")
        self.parser.add_argument("-ipe", "--insert-playlist-entry", action="store", dest="insert_playlist_entry", default=0, metavar=("FROMTIME", "SOURCE"), nargs=2, help="Add a new Playlistentry at a given index. Set fromtime with this format: 2017-12-31T13:30:00")  # , type=valid_playlist_entry)
128
129

        # send a redis message
130
        self.parser.add_argument("-rm", "--redis-message", action="store", dest="redis_message", default=False, metavar=("CHANNEL", "MESSAGE"), nargs=2, help="Send a redis message to the Listeners")
131
132

        # calls from liquidsoap
133
134
135
136
        self.parser.add_argument("-gnf", "--get-next-file-for", action="store",      dest="get_file_for", default=False, metavar="PLAYLISTTYPE",                    help="For which type you wanna GET a next audio file?")
        self.parser.add_argument("-snf", "--set-next-file-for", action="store",      dest="set_file_for", default=False, metavar=("PLAYLISTTYPE", "FILE"), nargs=2, help="For which type you wanna SET a next audio file?")
        self.parser.add_argument("-np",  "--now-playing",       action="store_true", dest="now_playing",  default=False,                                            help="Which source is now playing")
        self.parser.add_argument("-ip",  "--init-player",       action="store_true", dest="init_player",  default=False,                                            help="Reset liquidsoap volume and mixer activations?")
137
138
139
140

        if len(sys.argv) == 1:
            raise ValueError("No Argument passed!")

141

142
def valid_playlist_entry(argument):
143
    from datetime import datetime
144
145

    try:
146

147
148
149
150
151
152
        index = int(argument[0])
        fromtime = datetime.strptime(argument[1], "%Y-%m-%d")
        source = argument[2]
        return index, fromtime, source
    except:
        msg = "Not a valid date: '{0}'.".format(argument[0])
153
        raise
154
155


156
157
158
159
# # ## ## ## ## ## # #
# # ENTRY FUNCTION # #
# # ## ## ## ## ## # #
def main():
Gottfried Gaisbauer's avatar
Gottfried Gaisbauer committed
160
    Guru()
161
162
163
164
# # ## ## ## ## ## ## # #
# # End ENTRY FUNCTION # #
# # ## ## ## ## ## ## # #

165

166
167
if __name__ == "__main__":
    main()