Skip to content

Commit

Permalink
Reuse server_1_watched history to avoid duplication
Browse files Browse the repository at this point in the history
Keeps the server_1_watched history that way it does not need to fetch
the same results again each time it needs to sync to another server

Signed-off-by: Luis Garcia <git@luigi311.com>
  • Loading branch information
luigi311 committed Feb 22, 2025
1 parent 87c678c commit 3ef6625
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 14 deletions.
20 changes: 15 additions & 5 deletions src/jellyfin_emby.py
Original file line number Diff line number Diff line change
Expand Up @@ -349,12 +349,19 @@ def get_user_library_watched(
return {}

def get_watched(
self, users: dict[str, str], sync_libraries: list[str]
self,
users: dict[str, str],
sync_libraries: list[str],
users_watched: dict[str, UserData] = None,
) -> dict[str, UserData]:
try:
users_watched: dict[str, UserData] = {}
if not users_watched:
users_watched: dict[str, UserData] = {}

for user_name, user_id in users.items():
if user_name.lower() not in users_watched:
users_watched[user_name.lower()] = UserData()

libraries = []

all_libraries = self.query(f"/Users/{user_id}/Views", "get")
Expand All @@ -365,6 +372,12 @@ def get_watched(
if library_title not in sync_libraries:
continue

if library_title in users_watched:
logger.debug(
f"{self.server_type}: {user_name} {library_title} watched history has already been gathered, skipping"
)
continue

identifiers: dict[str, str] = {
"library_id": library_id,
"library_title": library_title,
Expand Down Expand Up @@ -404,9 +417,6 @@ def get_watched(
library_title,
)

if user_name.lower() not in users_watched:
users_watched[user_name.lower()] = UserData()

users_watched[user_name.lower()].libraries[library_title] = (
library_data
)
Expand Down
14 changes: 11 additions & 3 deletions src/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,9 @@ def main_loop():
if server_1 == servers[-1]:
break

# Store a copy of server_1_watched that way it can be used multiple times without having to regather everyones watch history every single time
server_1_watched = None

# Start server_2 at the next server in the list
for server_2 in servers[servers.index(server_1) + 1 :]:
# Check if server 1 and server 2 are going to be synced in either direction, skip if not
Expand Down Expand Up @@ -174,14 +177,16 @@ def main_loop():
logger.info(f"Server 2 syncing libraries: {server_2_libraries}")

logger.info("Creating watched lists", 1)
server_1_watched = server_1.get_watched(server_1_users, server_1_libraries)
server_1_watched = server_1.get_watched(
server_1_users, server_1_libraries, server_1_watched
)
logger.info("Finished creating watched list server 1")

server_2_watched = server_2.get_watched(server_2_users, server_2_libraries)
logger.info("Finished creating watched list server 2")

logger.debug(f"Server 1 watched: {server_1_watched}")
logger.debug(f"Server 2 watched: {server_2_watched}")
logger.trace(f"Server 1 watched: {server_1_watched}")
logger.trace(f"Server 2 watched: {server_2_watched}")

logger.info("Cleaning Server 1 Watched", 1)
server_1_watched_filtered = cleanup_watched(
Expand All @@ -202,6 +207,9 @@ def main_loop():

if should_sync_server(server_2, server_1):
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.update_watched(
server_2_watched_filtered,
user_mapping,
Expand Down
24 changes: 18 additions & 6 deletions src/plex.py
Original file line number Diff line number Diff line change
Expand Up @@ -366,9 +366,15 @@ def get_user_library_watched(self, user, user_plex, library) -> LibraryData:
)
return LibraryData(title=library.title)

def get_watched(self, users, sync_libraries) -> dict[str, UserData]:
def get_watched(
self,
users: list[MyPlexAccount],
sync_libraries: list[str],
users_watched: dict[str, UserData] = None,
) -> dict[str, UserData]:
try:
users_watched: dict[str, UserData] = {}
if not users_watched:
users_watched: dict[str, UserData] = {}

for user in users:
if self.admin_user == user:
Expand All @@ -386,26 +392,32 @@ def get_watched(self, users, sync_libraries) -> dict[str, UserData]:
)
continue

if user.title.lower() not in users_watched:
users_watched[user.title.lower()] = UserData()

libraries = user_plex.library.sections()

for library in libraries:
if library.title not in sync_libraries:
continue

if library.title in users_watched[user.title.lower()].libraries:
logger.debug(
f"Plex: {user.title} {library.title} watched history has already been gathered, skipping"
)
continue

library_data = self.get_user_library_watched(
user, user_plex, library
)

if user.title.lower() not in users_watched:
users_watched[user.title.lower()] = UserData()

users_watched[user.title.lower()].libraries[library.title] = (
library_data
)

return users_watched
except Exception as e:
logger.error(f"Plex: Failed to get watched, Error: {e}")
logger.error(f"Plex: Failed to get users watched, Error: {e}")
raise Exception(e)

def update_watched(
Expand Down

0 comments on commit 3ef6625

Please sign in to comment.