From 96c5d89837e525943259c2660483fab6a0274219 Mon Sep 17 00:00:00 2001 From: David Trattnig <david.trattnig@o94.at> Date: Sun, 25 Oct 2020 15:29:28 +0100 Subject: [PATCH] Render fallback to clock info. engine#43 engine#44 --- meta.py | 4 ++-- src/models.py | 58 ++++++++++++++++++++++++++++++++++++++++++++------ src/service.py | 1 + 3 files changed, 55 insertions(+), 8 deletions(-) diff --git a/meta.py b/meta.py index 42101ba..51d45f9 100644 --- a/meta.py +++ b/meta.py @@ -3,8 +3,8 @@ __author__ = "David Trattnig" __copyright__ = "Copyright 2017-2020, Aura Engine Team" __credits__ = [] __license__ = "GNU Affero General Public License (AGPL) Version 3" -__version__ = "0.8.2" -__version_info__ = (0, 8, 2) +__version__ = "0.8.3" +__version_info__ = (0, 8, 3) __maintainer__ = "David Trattnig" __email__ = "david.trattnig@subsquare.at" __status__ = "Development" \ No newline at end of file diff --git a/src/models.py b/src/models.py index d7c13b6..16215d0 100644 --- a/src/models.py +++ b/src/models.py @@ -99,23 +99,53 @@ class PlayLog(db.Model): """ db.session.commit() now = datetime.datetime.now() + track = db.session.query(PlayLog).\ order_by(PlayLog.track_start.desc()).\ filter(PlayLog.track_start <= str(now)).first() if track: - if track.track_start + datetime.timedelta(0,track.track_duration) > now: + # Preferably only get playlogs which are known for still being on air + if track.track_start + datetime.timedelta(0, track.track_duration) > now: + return track + + # Station fallback may not provide a duration. Take this one, it's better than nothing. + if track.track_duration == 0: return track return None + @staticmethod + def select_for_timeslot(timeslot_id): + """ + Selects all playlogs which appear to be in the current timeslot. + Limited to 10 records in the last 24hours. + """ + db.session.commit() + now = datetime.datetime.now() + before24h = datetime.datetime.now() - datetime.timedelta(hours=24) + + tracks = db.session.query(PlayLog).\ + order_by(PlayLog.track_start.desc()).\ + filter(PlayLog.track_start >= str(before24h)).\ + filter(PlayLog.schedule_id == timeslot_id).\ + limit(10) + + return tracks.all() + + @staticmethod def paginate(page, page_size, from_time=None, to_time=None, skip_synced=False): """ Returns a list of entries for a given page and an start time (optional). """ - def q(page=0, page_size=None): + if not from_time: + from_time = datetime.datetime.utcnow().date() + if not to_time: + to_time = datetime.datetime.now() + + def q(page=0, page_size=None): query = db.session.query(PlayLog).order_by(PlayLog.track_start.desc()) if isinstance(from_time, datetime.datetime): query = query.filter(PlayLog.track_start >= from_time.isoformat(' ', 'seconds')) @@ -387,24 +417,40 @@ class ClockInfo(db.Model): """ Retrieves the clock info for the given source number. """ + track_schema = TrackSchema() info = dict() data = db.session.query(ClockInfo).filter(ClockInfo.log_source == source_number).first() current_track = PlayLog.select_current() - track_schema = TrackSchema() - + current_playlist_id = -1 + updated_playlist = None + + if current_track: + updated_playlist = PlayLog.select_for_timeslot(current_track.schedule_id) + updated_playlist.sort(key=lambda track: track.track_start, reverse=False) + if data: info["log_source"] = data.log_source info["log_time"] = data.log_time if current_track: - info["current_track"] = track_schema.dump(current_track) + info["current_track"] = track_schema.dump(current_track) if data.current_playlist: - info["current_playlist"] = json.loads(data.current_playlist) + info["planned_playlist"] = json.loads(data.current_playlist) + current_playlist_id = data.current_playlist.playlist_id + for next_entry in data.current_playlist.entries: + if next_entry.start_date > datetime.now(): + updated_playlist["entries"].append(next_entry) + if data.current_schedule: info["current_schedule"] = json.loads(data.current_schedule) if data.next_schedule: info["next_schedule"] = json.loads(data.next_schedule) + playlog_schema = PlayLogSchema(many=True) + info["current_playlist"] = { + "playlist_id": current_playlist_id, + "entries": playlog_schema.dump(updated_playlist) + } return info diff --git a/src/service.py b/src/service.py index e1028b1..87fa8ff 100644 --- a/src/service.py +++ b/src/service.py @@ -136,6 +136,7 @@ class ApiService(): Returns: (JSON) """ + if not page: page = 0 tracklist = PlayLog.paginate(page, size, from_time, to_time, skip_synced) tracklist_schema = PlayLogSchema(many=True) return tracklist_schema.dump(tracklist) -- GitLab