From a2df01617db7a32c4d9f5bcfbbe7039a6e9e2b2c Mon Sep 17 00:00:00 2001 From: Nirvana Date: Wed, 25 Mar 2026 16:31:38 +0100 Subject: [PATCH] Add movetv --- .../providers/movetv/auth.py | 118 +++++++++++------- 1 file changed, 74 insertions(+), 44 deletions(-) diff --git a/lib/streaming_providers/providers/movetv/auth.py b/lib/streaming_providers/providers/movetv/auth.py index 5479ad8..7e73a57 100644 --- a/lib/streaming_providers/providers/movetv/auth.py +++ b/lib/streaming_providers/providers/movetv/auth.py @@ -126,12 +126,54 @@ class MoveTVAuthenticator(BaseAuthenticator): self._uid = None # Will be loaded from stored token or generated # Try to load existing token from storage - self._load_token_from_storage() + self._load_and_restore_token() - # If token was loaded, extract UID from it - if self._current_token and hasattr(self._current_token, 'uid') and self._current_token.uid: - self._uid = self._current_token.uid - logger.debug(f"move.tv: Loaded UID from stored token: {self._uid}") + # ------------------------------------------------------------------ + # Token loading and restoration + # ------------------------------------------------------------------ + + def _load_and_restore_token(self) -> bool: + """ + Load token from storage and restore state. + Returns True if token was loaded and valid. + """ + if not self.settings_manager: + logger.debug("move.tv: No settings manager available for loading token") + return False + + try: + # Try to load the token using the base class method + token_data = self.settings_manager.get_auth_token(self.provider_name) + if token_data: + logger.debug(f"move.tv: Found stored token data with keys: {list(token_data.keys())}") + + # Create token from stored data + self._current_token = self._create_token_from_response(token_data) + + # Restore UID from token + if hasattr(self._current_token, 'uid') and self._current_token.uid: + self._uid = self._current_token.uid + logger.info(f"move.tv: Restored UID from storage: {self._uid}") + else: + logger.debug("move.tv: No UID found in stored token") + + # Check if token is expired + if self._current_token.is_expired: + logger.debug( + f"move.tv: Stored token is expired (issued at {self._current_token.issued_at}, expires in {self._current_token.expires_in}s)") + self._current_token = None + self._uid = None + return False + else: + logger.info( + f"move.tv: Successfully loaded token from storage (expires in {self._current_token.expires_in}s)") + return True + else: + logger.debug("move.tv: No stored token found") + return False + except Exception as e: + logger.warning(f"move.tv: Failed to load token from storage: {e}") + return False # ------------------------------------------------------------------ # UID management @@ -146,51 +188,17 @@ class MoveTVAuthenticator(BaseAuthenticator): logger.debug(f"move.tv: Using existing UID: {self._uid}") return self._uid - # Try to load from current token if available - if self._current_token and hasattr(self._current_token, 'uid'): + # Try to load from current token if available (should have been restored already) + if self._current_token and hasattr(self._current_token, 'uid') and self._current_token.uid: self._uid = self._current_token.uid - if self._uid: - logger.debug(f"move.tv: Loaded UID from current token: {self._uid}") - return self._uid + logger.debug(f"move.tv: Loaded UID from current token: {self._uid}") + return self._uid - # Generate new UUID + # Generate new UUID as last resort self._uid = str(uuid.uuid4()) logger.debug(f"move.tv: Generated new UID: {self._uid}") return self._uid - def _load_token_from_storage(self) -> bool: - """ - Load token from storage if available. - Returns True if token was loaded and valid. - """ - if not self.settings_manager: - logger.debug("move.tv: No settings manager available for loading token") - return False - - try: - # Try to load the token using the base class method - token_data = self.settings_manager.get_auth_token(self.provider_name) - if token_data: - logger.debug(f"move.tv: Found stored token data with keys: {list(token_data.keys())}") - self._current_token = self._create_token_from_response(token_data) - - # Check if token is expired - if self._current_token.is_expired: - logger.debug( - f"move.tv: Stored token is expired (issued at {self._current_token.issued_at}, expires in {self._current_token.expires_in}s)") - self._current_token = None - return False - else: - logger.info( - f"move.tv: Successfully loaded token from storage (expires in {self._current_token.expires_in}s)") - return True - else: - logger.debug("move.tv: No stored token found") - return False - except Exception as e: - logger.warning(f"move.tv: Failed to load token from storage: {e}") - return False - # ------------------------------------------------------------------ # BaseAuthenticator abstract contract # ------------------------------------------------------------------ @@ -259,6 +267,28 @@ class MoveTVAuthenticator(BaseAuthenticator): # Authentication # ------------------------------------------------------------------ + def authenticate(self, force_refresh: bool = False) -> MoveTVAuthToken: + """ + Override authenticate to ensure we check for existing valid token first. + """ + # If we have a valid token and not forcing refresh, return it + if not force_refresh and self._current_token and not self._current_token.is_expired: + logger.debug("move.tv: Using existing valid token") + return self._current_token + + # If we have a token but it's expired, try to refresh + if self._current_token and self._current_token.is_expired: + logger.debug("move.tv: Token expired, attempting refresh") + refreshed = self._refresh_token() + if refreshed: + return refreshed + + # Otherwise perform full authentication + logger.info("move.tv: Performing new authentication") + token = self._perform_authentication() + self._current_token = token + return token + def _perform_authentication(self) -> MoveTVAuthToken: """ Full username / password login against /api/v2/login.