diff --git a/src/functions.py b/src/functions.py index efdf8bf..8abb3cd 100644 --- a/src/functions.py +++ b/src/functions.py @@ -37,12 +37,18 @@ def logger(message: str, log_type=0): def log_marked( - username: str, library: str, movie_show: str, episode: str = None, duration=None + server_type: str, + server_name: str, + username: str, + library: str, + movie_show: str, + episode: str = None, + duration=None, ): if mark_file is None: return - output = f"{username}/{library}/{movie_show}" + output = f"{server_type}/{server_name}/{username}/{library}/{movie_show}" if episode: output += f"/{episode}" @@ -92,6 +98,7 @@ def search_mapping(dictionary: dict, key_value: str): else: return None + # Return list of objects that exist in both lists including mappings def match_list(list1, list2, list_mapping=None): output = [] @@ -105,6 +112,7 @@ def match_list(list1, list2, list_mapping=None): return output + def future_thread_executor( args: list, threads: int = None, override_threads: bool = False ): diff --git a/src/jellyfin_emby.py b/src/jellyfin_emby.py index 62977d7..4a778c8 100644 --- a/src/jellyfin_emby.py +++ b/src/jellyfin_emby.py @@ -109,7 +109,6 @@ class JellyfinEmby: def __init__(self, server_type, baseurl, token, headers): if server_type not in ["Jellyfin", "Emby"]: raise Exception(f"Server type {server_type} not supported") - self.server_type = server_type self.baseurl = baseurl self.token = token @@ -124,6 +123,7 @@ class JellyfinEmby: self.session = requests.Session() self.users = self.get_users() + self.server_name = self.info(name_only=True) def query(self, query, query_type, identifiers=None, json=None): try: @@ -175,13 +175,15 @@ class JellyfinEmby: ) raise Exception(e) - def info(self) -> str: + def info(self, name_only: bool = False) -> str: try: query_string = "/System/Info/Public" response = self.query(query_string, "get") if response: + if name_only: + return f"{response['ServerName']}" return f"{self.server_type} {response['ServerName']}: {response['Version']}" else: return None @@ -223,7 +225,7 @@ class JellyfinEmby: def get_libraries(self): try: libraries = {} - + # Theres no way to get all libraries so individually get list of libraries from all users users = self.get_users() @@ -256,12 +258,12 @@ class JellyfinEmby: ) else: libraries[library_title] = str(types) - + return libraries except Exception as e: logger(f"{self.server_type}: Get libraries failed {e}", 2) raise Exception(e) - + def get_user_library_watched( self, user_name, user_id, library_type, library_id, library_title ): @@ -393,9 +395,7 @@ class JellyfinEmby: if show_guids not in user_watched[library_title]: user_watched[library_title][show_guids] = [] - user_watched[library_title][ - show_guids - ] = mark_episodes_list + user_watched[library_title][show_guids] = mark_episodes_list for episode in mark_episodes_list: logger( f"{self.server_type}: Added {episode} to {user_name} {show_display_name} watched list", @@ -407,9 +407,7 @@ class JellyfinEmby: 1, ) if library_title in user_watched: - logger( - f"{self.server_type}: {user_watched[library_title]}", 3 - ) + logger(f"{self.server_type}: {user_watched[library_title]}", 3) return user_watched except Exception as e: @@ -421,11 +419,7 @@ class JellyfinEmby: logger(traceback.format_exc(), 2) return {} - def get_watched( - self, - users, - sync_libraries - ): + def get_watched(self, users, sync_libraries): try: users_watched = {} watched = [] @@ -479,7 +473,6 @@ class JellyfinEmby: library_title, ) - if user_name.lower() not in users_watched: users_watched[user_name.lower()] = {} users_watched[user_name.lower()].update(watched) @@ -546,6 +539,8 @@ class JellyfinEmby: logger(msg, 6) log_marked( + self.server_type, + self.server_name, user_name, library, jellyfin_video.get("Name"), @@ -568,6 +563,8 @@ class JellyfinEmby: logger(msg, 6) log_marked( + self.server_type, + self.server_name, user_name, library, jellyfin_video.get("Name"), @@ -674,6 +671,8 @@ class JellyfinEmby: logger(msg, 6) log_marked( + self.server_type, + self.server_name, user_name, library, jellyfin_episode.get("SeriesName"), @@ -702,6 +701,8 @@ class JellyfinEmby: logger(msg, 6) log_marked( + self.server_type, + self.server_name, user_name, library, jellyfin_episode.get("SeriesName"), diff --git a/src/library.py b/src/library.py index 6e8ee9c..dfcc005 100644 --- a/src/library.py +++ b/src/library.py @@ -129,8 +129,14 @@ def check_whitelist_logic( return skip_reason + def filter_libaries( - server_libraries, blacklist_library, blacklist_library_type, whitelist_library, whitelist_library_type, library_mapping=None + server_libraries, + blacklist_library, + blacklist_library_type, + whitelist_library, + whitelist_library_type, + library_mapping=None, ): filtered_libaries = [] for library in server_libraries: @@ -145,9 +151,7 @@ def filter_libaries( ) if skip_reason: - logger( - f"Skipping library {library}: {skip_reason}", 1 - ) + logger(f"Skipping library {library}: {skip_reason}", 1) continue filtered_libaries.append(library) @@ -156,7 +160,13 @@ def filter_libaries( def setup_libraries( - server_1, server_2, blacklist_library, blacklist_library_type, whitelist_library, whitelist_library_type, library_mapping=None + server_1, + server_2, + blacklist_library, + blacklist_library_type, + whitelist_library, + whitelist_library_type, + library_mapping=None, ): server_1_libraries = server_1.get_libraries() server_2_libraries = server_2.get_libraries() @@ -164,11 +174,29 @@ def setup_libraries( logger(f"Server 2 libraries: {server_2_libraries}", 1) # Filter out all blacklist, whitelist libaries - filtered_server_1_libraries = filter_libaries(server_1_libraries, blacklist_library, blacklist_library_type, whitelist_library, whitelist_library_type, library_mapping) - filtered_server_2_libraries = filter_libaries(server_2_libraries, blacklist_library, blacklist_library_type, whitelist_library, whitelist_library_type, library_mapping) + filtered_server_1_libraries = filter_libaries( + server_1_libraries, + blacklist_library, + blacklist_library_type, + whitelist_library, + whitelist_library_type, + library_mapping, + ) + filtered_server_2_libraries = filter_libaries( + server_2_libraries, + blacklist_library, + blacklist_library_type, + whitelist_library, + whitelist_library_type, + library_mapping, + ) - output_server_1_libaries = match_list(filtered_server_1_libraries, filtered_server_2_libraries, library_mapping) - output_server_2_libaries = match_list(filtered_server_2_libraries, filtered_server_1_libraries, library_mapping) + output_server_1_libaries = match_list( + filtered_server_1_libraries, filtered_server_2_libraries, library_mapping + ) + output_server_2_libaries = match_list( + filtered_server_2_libraries, filtered_server_1_libraries, library_mapping + ) return output_server_1_libaries, output_server_2_libaries diff --git a/src/main.py b/src/main.py index d6f72a1..07b56a1 100644 --- a/src/main.py +++ b/src/main.py @@ -155,19 +155,23 @@ def main_loop(): ) server_1_libraries, server_2_libraries = setup_libraries( - server_1[1], server_2[1], blacklist_library, blacklist_library_type, whitelist_library, whitelist_library_type, library_mapping + server_1[1], + server_2[1], + blacklist_library, + blacklist_library_type, + whitelist_library, + whitelist_library_type, + library_mapping, ) logger("Creating watched lists", 1) server_1_watched = server_1[1].get_watched( - server_1_users, - server_1_libraries + server_1_users, server_1_libraries ) logger("Finished creating watched list server 1", 1) server_2_watched = server_2[1].get_watched( - server_2_users, - server_2_libraries + server_2_users, server_2_libraries ) logger("Finished creating watched list server 2", 1) diff --git a/src/plex.py b/src/plex.py index 0019874..490a4e4 100644 --- a/src/plex.py +++ b/src/plex.py @@ -317,7 +317,15 @@ def update_user_watched(user, user_plex, library, videos, dryrun): else: logger(msg, 6) - log_marked(user.title, library, movies_search.title, None, None) + log_marked( + "Plex", + user_plex.friendlyName, + user.title, + library, + movies_search.title, + None, + None, + ) elif video_status["time"] > 60_000: msg = f"Plex: {movies_search.title} as partially watched for {floor(video_status['time'] / 60_000)} minutes for {user.title} in {library}" if not dryrun: @@ -327,6 +335,8 @@ def update_user_watched(user, user_plex, library, videos, dryrun): logger(msg, 6) log_marked( + "Plex", + user_plex.friendlyName, user.title, library, movies_search.title, @@ -358,6 +368,8 @@ def update_user_watched(user, user_plex, library, videos, dryrun): logger(msg, 6) log_marked( + "Plex", + user_plex.friendlyName, user.title, library, show_search.title, @@ -372,6 +384,8 @@ def update_user_watched(user, user_plex, library, videos, dryrun): logger(msg, 6) log_marked( + "Plex", + user_plex.friendlyName, user.title, library, show_search.title, @@ -477,18 +491,13 @@ class Plex: library_type = library.type output[library_title] = library_type - + return output except Exception as e: logger(f"Plex: Failed to get libraries, Error: {e}", 2) raise Exception(e) - - def get_watched( - self, - users, - sync_libraries - ): + def get_watched(self, users, sync_libraries): try: # Get all libraries users_watched = {}