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