Commit 7dd71046 authored by Gottfried Gaisbauer's avatar Gottfried Gaisbauer
Browse files

got too many data from pv. data is now filtered => easier debugging. now it is...

got too many data from pv. data is now filtered => easier debugging. now it is only possible to comment this to disable this function
parent 2f41ef7a
......@@ -55,9 +55,10 @@ class Aura(AuraLogger):
signal.signal(signal.SIGUSR1, receive_signal)
# wait for redis message
self.join_comm()
# dafuq? when starting web service, logging messages appear twice
# start the web service
self.start_web_service()
def join_comm(self):
......
......@@ -15,7 +15,7 @@ socketdir="/home/gg/PycharmProjects/engine/modules/liquidsoap"
# if you change this settings, you have to restart liquidsoap
logdir="/var/log/aura"
# possible values: debug, info, warning, error, critical
loglevel="debug"
loglevel="info"
[mail]
mail_server="mail.servus.at"
......@@ -171,7 +171,7 @@ stream_0_channels="2"
# to where we are streaming..?
stream_0_host="localhost"
# and which port?
stream_0_port="8000"
stream_0_port="8888"
# the name of the mountpoint
stream_0_mountpoint="aura-test-0.aac"
# username
......@@ -193,7 +193,7 @@ stream_1_bitrate="128"
stream_1_channels="2"
stream_1_host="localhost"
stream_1_port="8000"
stream_1_port="8888"
stream_1_mountpoint="aura-test-1.flac"
stream_1_user="source"
stream_1_password="source"
......@@ -209,7 +209,7 @@ stream_2_bitrate="64"
stream_2_channels="2"
stream_2_host="localhost"
stream_2_port="8000"
stream_2_port="8888"
stream_2_mountpoint="aura-test-2.mp3"
stream_2_user="source"
stream_2_password="source"
......@@ -225,7 +225,7 @@ stream_3_bitrate="64"
stream_3_channels="2"
stream_3_host="localhost"
stream_3_port="8000"
stream_3_port="8888"
stream_3_mountpoint="aura-test-3.ogg"
stream_3_user="source"
stream_3_password="source"
......@@ -241,7 +241,7 @@ stream_4_bitrate="64"
stream_4_channels="2"
stream_4_host="localhost"
stream_4_port="8000"
stream_4_port="8888"
stream_4_mountpoint="aura-test-4.opus"
stream_4_user="source"
stream_4_password="source"
......
......@@ -36,21 +36,22 @@ class AuraDatabaseModel:
def _asdict(self):
return self.__dict__
def recreate_db(self, systemexit = False):
@staticmethod
def recreate_db(systemexit = False):
manualschedule = Schedule()
manualschedule.schedule_id = 0
manualschedule.show_name = "Manual Show"
self.logger.debug("Recreating Database...")
# self.logger.debug("Recreating Database...")
DB.drop_all()
self.logger.debug("all dropped. creating...")
# self.logger.debug("all dropped. creating...")
DB.create_all()
self.logger.debug("inserting manual scheduling possibility and fallback trackservice schedule")
# self.logger.debug("inserting manual scheduling possibility and fallback trackservice schedule")
DB.session.add(manualschedule)
# db.session.add(fallback_trackservice_schedule)
self.logger.debug("all created. commiting...")
# self.logger.debug("all created. commiting...")
DB.session.commit()
self.logger.debug("Database recreated!")
# self.logger.debug("Database recreated!")
if systemexit:
sys.exit(0)
......@@ -65,13 +66,13 @@ class Schedule(DB.Model, AuraDatabaseModel):
# primary and foreign keys
schedule_id = Column(Integer, primary_key=True, autoincrement=False)
show_id = Column(Integer) # well, not needed..
show_id = Column(Integer) # well, in fact not needed..
schedule_start = Column(DateTime) # can be null due to manual entries
schedule_end = Column(DateTime) # can be null due to manual entries
show_name = Column(String(256))
show_hosts = Column(String(256))
rtr_category = Column(String(256))
funding_category = Column(String(256))
comment = Column(String(512))
languages = Column(String(256))
type = Column(String(256))
......@@ -295,4 +296,4 @@ class TrackService(DB.Model, AuraDatabaseModel):
# def select_all():
# return db.session.query(TrackServiceScheduleEntry).filter().all()
#AuraDatabaseModel.recreate_db(True)
#AuraDatabaseModel.recreate_db(systemexit=True)
......@@ -117,8 +117,11 @@ class Padavan:
def fetch_new_programme(self):
json_reply = self.send_and_wait_redis("aura", "fetch_new_programme", RedisChannel.FNP_REPLY)
actprogramme = simplejson.loads(json_reply)
self.print_programme(actprogramme)
if json_reply != "":
actprogramme = simplejson.loads(json_reply)
self.print_programme(actprogramme)
else:
print("No programme fetched")
def get_act_programme(self):
json_reply = self.send_and_wait_redis("aura", "get_act_programme", RedisChannel.GAP_REPLY)
......
......@@ -18,8 +18,8 @@ class LiquidSoapInitThread(threading.Thread):
def run(self):
try:
# sleep needed, because the socket is created to slow by liquidsoap
time.sleep(2)
self.logger.info("Waited 2s for liquidsoap. Jez soit a si gspian")
time.sleep(1)
self.logger.info("Waited 1s for liquidsoap. Jez soit a si gspian")
# enable lqs transaction
self.liquidsoapcommunicator.enable_transaction()
......@@ -32,18 +32,18 @@ class LiquidSoapInitThread(threading.Thread):
for c in channels:
self.liquidsoapcommunicator.channel_volume(c, "0")
# select all channels
for c in channels:
self.liquidsoapcommunicator.channel_activate(c, True)
# for c in channels:
# self.liquidsoapcommunicator.channel_activate(c, True)
# setting init params
self.liquidsoapcommunicator.playlist_push(self.liquidsoapcommunicator.config.get("install_dir") + "/configuration/blank.flac")
self.liquidsoapcommunicator.set_http_url("http://stream.fro.at/fro-128.ogg")
# wait another second. lqs really starts slow..
time.sleep(1)
# set active
if self.active_entry is not None:
self.logger.info("LiquidSoapInitThread sets activechannel: "+str(self.active_entry))
......
......@@ -87,6 +87,7 @@ server.register(namespace="auraengine",
end
)
# enable the seek function for the input from the filesystem
server.register(namespace = source.id(input_fs),
description="seek to relative position in #{source.id(input_fs)}",
usage = "seek <duration in seconds>",
......
......@@ -100,24 +100,25 @@ class AuraCalendarService(threading.Thread):
"""
try:
# fetch upcoming schedules from ENGINE
# fetch upcoming schedules from STEERING
self.logger.debug("Fetching schedules from STEERING")
self.__fetch_schedule_data__()
# fetch playlist and fallbacks to the schedules from TANK
self.logger.debug("Fetching playlists from TANK")
self.__fetch_schedule_entry_data__()
for schedule in self.fetched_schedule_data:
if "start" not in schedule:
self.logger.warning("No start of schedule given. skipping the schedule "+str(schedule))
self.logger.warning("No start of schedule given. skipping the schedule: "+str(schedule))
continue
if "end" not in schedule:
self.logger.warning("No end of schedule given. skipping the schedule "+str(schedule))
self.logger.warning("No end of schedule given. skipping the schedule: "+str(schedule))
continue
# store the schedule
schedule_db = self.store_schedule(schedule)
# store playlists to play
self.store_schedule_playlist(schedule_db, schedule, "playlist")
self.store_schedule_playlist(schedule_db, schedule, "schedule_fallback", True)
self.store_schedule_playlist(schedule_db, schedule, "show_fallback", True)
......@@ -125,8 +126,8 @@ class AuraCalendarService(threading.Thread):
# release the mutex
self.queue.put(schedule) #"fetching_finished")
except:
self.queue.put("fetching_aborted")
except Exception as e:
self.queue.put("fetching_aborted " + str(e))
# terminate the thread
return
......@@ -151,7 +152,7 @@ class AuraCalendarService(threading.Thread):
schedule_db.show_name = schedule["show_name"]
schedule_db.show_hosts = schedule["show_hosts"]
schedule_db.is_repetition = schedule["is_repetition"]
schedule_db.rtr_category = schedule["show_rtrcategory"]
schedule_db.funding_category = schedule["show_fundingcategory"]
schedule_db.languages = schedule["show_languages"]
schedule_db.type = schedule["show_type"]
schedule_db.category = schedule["show_categories"]
......@@ -320,23 +321,59 @@ class AuraCalendarService(threading.Thread):
use_testdata = False
html_response = self.__fetch_data__(servicetype)
if not html_response:
if not html_response or html_response == b"[]":
self.logger.debug("Got no response: Using testdata")
use_testdata = True
# if an error occours => use testdata
if use_testdata:
html_response = '[{"schedule_id":1,"schedule_start":"' + (datetime.now() + timedelta(hours=0)).strftime('%Y-%m-%d %H:00:00') + '","schedule_end":"' + (datetime.now() + timedelta(hours=1)).strftime('%Y-%m-%d %H:00:00') + '","show_id":9,"show_name":"FROzine","show_hosts":"Sandra Hochholzer, Martina Schweiger","is_repetition":false,"playlist_id":2,"schedule_fallback_id":12,"show_fallback_id":92,"station_fallback_id":1,"rtr_category":"string","comment":"Kommentar","languages":"Sprachen","type":"Typ","category":"Kategorie","topic":"Topic","musicfocus":"Fokus"},{"schedule_id":2,"schedule_start":"' + (datetime.now()+timedelta(hours=1)).strftime('%Y-%m-%d %H:00:00') + '","schedule_end":"' + (datetime.now()+timedelta(hours=2)).strftime('%Y-%m-%d %H:00:00') + '","show_id":10,"show_name":"FROMat","show_hosts":"Sandra Hochholzer, Martina Schweiger","is_repetition":false,"playlist_id":4,"schedule_fallback_id":22,"show_fallback_id":102,"station_fallback_id":1,"rtr_category":"string","comment":"Kommentar","languages":"Sprachen","type":"Typ","category":"Kategorie","topic":"Topic","musicfocus":"Fokus"},{"schedule_id":3,"schedule_start":"' + (datetime.now()+timedelta(hours=2)).strftime('%Y-%m-%d %H:00:00') + '","schedule_end":"' + (datetime.now() + timedelta(hours=3)).strftime('%Y-%m-%d %H:00:00') + '","show_id":11,"show_name":"Radio für Senioren","show_hosts":"Sandra Hochholzer, Martina Schweiger","is_repetition":false,"playlist_id":6,"schedule_fallback_id":32,"show_fallback_id":112,"station_fallback_id":1,"rtr_category":"string","comment":"Kommentar","languages":"Sprachen","type":"Typ","category":"Kategorie","topic":"Topic","musicfocus":"Fokus"}]'
html_response = '[{"schedule_id":1,"start":"' + (datetime.now() + timedelta(hours=0)).strftime('%Y-%m-%d %H:00:00') + '","end":"' + (datetime.now() + timedelta(hours=1)).strftime('%Y-%m-%d %H:00:00') + '","show_id":9,"show_name":"FROzine","show_hosts":"Sandra Hochholzer, Martina Schweiger","is_repetition":false,"playlist_id":2,"schedule_fallback_id":12,"show_fallback_id":92,"station_fallback_id":1,"rtr_category":"string","comment":"Kommentar","languages":"Sprachen","type":"Typ","category":"Kategorie","topic":"Topic","musicfocus":"Fokus"},{"schedule_id":2,"schedule_start":"' + (datetime.now()+timedelta(hours=1)).strftime('%Y-%m-%d %H:00:00') + '","schedule_end":"' + (datetime.now()+timedelta(hours=2)).strftime('%Y-%m-%d %H:00:00') + '","show_id":10,"show_name":"FROMat","show_hosts":"Sandra Hochholzer, Martina Schweiger","is_repetition":false,"playlist_id":4,"schedule_fallback_id":22,"show_fallback_id":102,"station_fallback_id":1,"rtr_category":"string","comment":"Kommentar","languages":"Sprachen","type":"Typ","category":"Kategorie","topic":"Topic","musicfocus":"Fokus"},{"schedule_id":3,"schedule_start":"' + (datetime.now()+timedelta(hours=2)).strftime('%Y-%m-%d %H:00:00') + '","schedule_end":"' + (datetime.now() + timedelta(hours=3)).strftime('%Y-%m-%d %H:00:00') + '","show_id":11,"show_name":"Radio für Senioren","show_hosts":"Sandra Hochholzer, Martina Schweiger","is_repetition":false,"playlist_id":6,"schedule_fallback_id":32,"show_fallback_id":112,"station_fallback_id":1,"rtr_category":"string","comment":"Kommentar","languages":"Sprachen","type":"Typ","category":"Kategorie","topic":"Topic","musicfocus":"Fokus"}]'
try:
self.fetched_schedule_data = simplejson.loads(html_response)
schedule_from_pv = simplejson.loads(html_response)
except Exception as e:
self.logger.critical("Cannot fetch schedule entries from PV")
sys.exit()
# check data
self.logger.critical("Hardcoded Response && no JSON data checks. I believe what i get here")
d = self.remove_data_more_than_24h_in_the_future(schedule_from_pv)
self.fetched_schedule_data = self.remove_data_in_the_past(d)
return self.fetched_schedule_data
# ------------------------------------------------------------------------------------------ #
def remove_data_more_than_24h_in_the_future(self, schedule_from_pv):
act_list = []
now = datetime.now()
now_plus_24hours = now + timedelta(hours=24)
for s in schedule_from_pv:
date_start = datetime.strptime(s["start"], "%Y-%m-%dT%H:%M:%S")
# append only elements which are close enough to now
if date_start <= now_plus_24hours and date_start >= now - timedelta(hours=1):
act_list.append(s)
return act_list
# ------------------------------------------------------------------------------------------ #
def remove_data_in_the_past(self, schedule_from_pv):
act_list = []
now = datetime.now()
for i,curr in enumerate(schedule_from_pv[:-1]):
date_start = datetime.strptime(curr["start"], "%Y-%m-%dT%H:%M:%S")
date_next_start = datetime.strptime(schedule_from_pv[i+1]["start"], "%Y-%m-%dT%H:%M:%S")
if date_start >= now:
act_list.append(curr)
if date_start <= now and date_next_start >= now:
act_list.append(curr)
return act_list
# ------------------------------------------------------------------------------------------ #
def __fetch_data__(self, type):
# init html_response
......
......@@ -79,7 +79,7 @@ class AuraScheduler(ExceptionLogger, threading.Thread):
config = None
tried_fetching = 0
fetch_max = 2
fetch_max = 3
def __init__(self, config):
"""
......@@ -358,10 +358,12 @@ class AuraScheduler(ExceptionLogger, threading.Thread):
# ------------------------------------------------------------------------------------------ #
def fetch_new_programme(self):
self.logger.info("trying to fetch new programme")
if self.tried_fetching == self.fetch_max:
self.logger.error("Cannot connect to PV or Tank! No Programme loaded!")
msg = "Cannot connect to PV or Tank! No Programme loaded!"
self.logger.error(msg)
self.tried_fetching = 0
return ""
return msg
self.tried_fetching += 1
......@@ -383,8 +385,8 @@ class AuraScheduler(ExceptionLogger, threading.Thread):
self.logger.critical("Programme loaded from database has no entries!")
return self.get_act_programme_as_string()
elif response == "fetching_aborted":
self.logger.warning("Fetching was being aborted from AuraCalendarService! Are you connected?")
elif response.startswith("fetching_aborted"):
self.logger.warning("Fetching was being aborted from AuraCalendarService! Are you connected? Reason: " + response)
else:
self.logger.warning("Got an unknown response from AuraCalendarService: " + response)
......
......@@ -14,9 +14,6 @@ from libraries.database.broadcasts import TrackService, Schedule
def alchemyencoder(obj):
logger = logging.getLogger("AuraEngine")
logger.warning(str(type(obj)))
"""JSON encoder function for SQLAlchemy special classes."""
if isinstance(obj, datetime.date):
return obj.isoformat()
......@@ -36,19 +33,17 @@ class Routes:
lqs_communicator = None
def __init__(self, scheduler, lqs_communicator, messenger):
#self.logger = logging.getLogger("AuraEngine")
self.scheduler = scheduler
self.messenger = messenger
self.lqs_communicator = lqs_communicator
APP.run(debug=True)
# when debug is enabled => logging messages appear twice
APP.run() #debug=True)
@staticmethod
@APP.route('/')
@APP.route('/index')
def index():
return ""
return render_template("index.html")
@staticmethod
......@@ -132,6 +127,8 @@ class Routes:
return lqs.auraengine_state()
except Exception as e:
error = "Unable to fetch state from Liquidsoap. Is Soundserver running? Reason: " + str(e)
logger = logging.getLogger("AuraEngine")
logger.error(error)
return simplejson.dumps({"Error": error})
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment