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