Skip to content

Commit

Permalink
Merge server_2_watched_filtered into server_1_watched cache
Browse files Browse the repository at this point in the history
Merge in all the new watched items that are going from server 2 into the
server 1 watched cache that way it carries forward for the next server

Signed-off-by: Luis Garcia <[email protected]>
  • Loading branch information
luigi311 committed Feb 22, 2025
1 parent 3ef6625 commit e45510f
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 0 deletions.
4 changes: 4 additions & 0 deletions src/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
from src.users import setup_users
from src.watched import (
cleanup_watched,
merge_server_watched,
)
from src.black_white import setup_black_white_lists
from src.connection import generate_server_connections
Expand Down Expand Up @@ -209,6 +210,9 @@ def main_loop():
logger.info(f"Syncing {server_2.info()} -> {server_1.info()}")

# Add server_2_watched_filtered to server_1_watched that way the stored version isn't stale for the next server
server_1_watched = merge_server_watched(
server_1_watched, server_2_watched_filtered
)

server_1.update_watched(
server_2_watched_filtered,
Expand Down
46 changes: 46 additions & 0 deletions src/watched.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,52 @@ class UserData(BaseModel):
libraries: dict[str, LibraryData] = {}


def merge_library_data(lib1: LibraryData, lib2: LibraryData) -> LibraryData:
"""
Merge two LibraryData objects by extending the movies and series lists.
Assumes both libraries have the same title.
"""
# Work on a copy to avoid modifying the original object
merged = copy.deepcopy(lib1)
merged.movies.extend(lib2.movies)
merged.series.extend(lib2.series)
return merged


def merge_user_data(user1: UserData, user2: UserData) -> UserData:
"""
Merge two UserData objects by merging their libraries.
If a library exists in both, merge its content;
otherwise, add the new library from user2.
"""
merged_libraries = copy.deepcopy(user1.libraries)
for lib_key, lib_data in user2.libraries.items():
if lib_key in merged_libraries:
merged_libraries[lib_key] = merge_library_data(
merged_libraries[lib_key], lib_data
)
else:
merged_libraries[lib_key] = copy.deepcopy(lib_data)
return UserData(libraries=merged_libraries)


def merge_server_watched(
server1: dict[str, UserData], server2: dict[str, UserData]
) -> dict[str, UserData]:
"""
Merge two dictionaries of UserData.
For overlapping user keys, merge their data.
For new users from server2, add them directly.
"""
merged = copy.deepcopy(server1)
for user, user_data in server2.items():
if user in merged:
merged[user] = merge_user_data(merged[user], user_data)
else:
merged[user] = copy.deepcopy(user_data)
return merged


def check_same_identifiers(item1: MediaIdentifiers, item2: MediaIdentifiers) -> bool:
# Check for duplicate based on file locations:
if item1.locations and item2.locations:
Expand Down

0 comments on commit e45510f

Please sign in to comment.