From 4b2488ef42f81d88a828626ed8da5317226b3210 Mon Sep 17 00:00:00 2001
From: David Trattnig <david@subsquare.at>
Date: Fri, 15 Mar 2024 15:20:11 +0100
Subject: [PATCH] refactor: extend merge strategy

---
 src/aura_engine/scheduling/timetable.py | 35 ++++++++++++++++---------
 1 file changed, 23 insertions(+), 12 deletions(-)

diff --git a/src/aura_engine/scheduling/timetable.py b/src/aura_engine/scheduling/timetable.py
index fe8a5140..20285846 100644
--- a/src/aura_engine/scheduling/timetable.py
+++ b/src/aura_engine/scheduling/timetable.py
@@ -37,6 +37,7 @@ import jsonpickle
 import aura_engine.engine as engine
 import aura_engine.scheduling.api as api
 from aura_engine.base.config import AuraConfig
+from aura_engine.base.lang import synchronized
 from aura_engine.base.utils import SimpleUtil as SU
 from aura_engine.scheduling.domain import Playlist, PlaylistItem, Timeslot
 
@@ -76,6 +77,7 @@ class TimetableService:
         self.timetable_file = self.cache_location + "/timetable.json"
         self.load_timetable()
 
+    @synchronized
     def refresh(self):
         """
         Update the timetable.
@@ -208,7 +210,7 @@ class TimetableService:
 
         return current_timeslot
 
-    def get_next_timeslots(self, max_count: int = 0, window_aware=False) -> [Timeslot]:
+    def get_next_timeslots(self, max_count: int = 0, window_aware=False) -> list[Timeslot]:
         """
         Retrieve the timeslots to be played after the current one.
 
@@ -356,6 +358,7 @@ class TimetableMerger:
                     idx["local"] = None
         return timeslot_map
 
+    @synchronized
     def merge(
         self, local_timeslots: list[Timeslot], remote_timeslots: list[Timeslot]
     ) -> list[Timeslot]:
@@ -380,8 +383,8 @@ class TimetableMerger:
         merge_info = SU.cyan("\nMap for timetable merge:")
 
         for timestamp, ts_relation in timeslot_map.items():
-            local = ts_relation.get("local")
-            remote = ts_relation.get("remote")
+            local: Timeslot = ts_relation.get("local")
+            remote: Timeslot = ts_relation.get("remote")
 
             if (float(timestamp) - scheduling_window_start) < now:
                 # It's past the scheduling window, so keep the local one as is
@@ -396,21 +399,29 @@ class TimetableMerger:
                 if local and not remote:
                     # Timeslot was deleted remotely, remove any local one
                     resolution = "remove"
-                    continue
                 elif not local and remote:
                     # Timeslot was added remotely
                     resolution = "add"
                     merged_ts.append(remote)
-                elif not local and not remote:
+                elif local and remote:
+                    # Timeslot existing locally, was updated or did not change remotely
+                    # Update the local timeslot with possibly changed data
+                    local.show = remote.show
+                    local.episode = remote.episode
+                    local.id = remote.id
+                    local.repetition_id = remote.repetition_id
+                    if local.playlist.timeslot:
+                        local.playlist.timeslot.update_playlist(remote.playlist.timeslot)
+                    if local.playlist.schedule:
+                        local.playlist.schedule.update_playlist(remote.playlist.schedule)
+                    if local.playlist.show:
+                        local.playlist.show.update_playlist(remote.playlist.show)
+                    merged_ts.append(local)
+                    resolution = "update"
+                else:
                     # Relations w/o local and remote timeslots should not happen
-                    self.logger(SU.red("Skipping invalid merge case!"))
+                    self.logger.critical(SU.red("Skipping invalid merge case!"))
                     resolution = "skip"
-                    merged_ts.append(remote)
-                else:
-                    # Timeslot was updated or did not change
-                    # Use the potentially newer, remote version
-                    resolution = "update"
-                    merged_ts.append(remote)
 
             local = "local:" + str(local).ljust(25)
             remote = "remote: " + str(remote).ljust(25)
-- 
GitLab