diff --git a/lib/streaming_providers/providers/magenta2/provider.py b/lib/streaming_providers/providers/magenta2/provider.py index 6691a26..7285940 100644 --- a/lib/streaming_providers/providers/magenta2/provider.py +++ b/lib/streaming_providers/providers/magenta2/provider.py @@ -472,36 +472,45 @@ class Magenta2Provider(StreamingProvider): return False def get_persona_token(self, force_refresh: bool = False) -> str: - """Get persona token with simple provider-level caching""" + """ + Get persona token - PRIMARY authentication entry point + """ + logger.debug(f"🟢 get_persona_token START (force_refresh: {force_refresh})") + if not self.authenticator.token_flow_manager: + logger.error("🔴 TokenFlowManager not initialized") raise Exception("TokenFlowManager not initialized") - # Optional: Add simple time-based caching at provider level - if not force_refresh and hasattr(self, '_persona_cache'): - cache_time, cached_token = self._persona_cache - # Cache for 5 minutes at provider level (TokenFlowManager has proper JWT expiry) - if time.time() - cache_time < 300: - return cached_token + try: + persona_result = self.authenticator.token_flow_manager.get_persona_token( + force_refresh=force_refresh + ) - # Get from TokenFlowManager (which has proper JWT expiry caching) - persona_result = self.authenticator.token_flow_manager.get_persona_token( - force_refresh=force_refresh - ) + if not persona_result.success: + logger.error(f"🔴 get_persona_token FAILED: {persona_result.error}") + raise Exception(f"Failed to get persona token: {persona_result.error}") - if not persona_result.success: - raise Exception(f"Failed to get persona token: {persona_result.error}") + logger.debug(f"🟢 get_persona_token SUCCESS, token length: {len(persona_result.persona_token)}") + return persona_result.persona_token - # Optional: Cache in provider (simple time-based) - if not hasattr(self, '_persona_cache'): - self._persona_cache = (time.time(), persona_result.persona_token) - else: - self._persona_cache = (time.time(), persona_result.persona_token) - - return persona_result.persona_token + except Exception as e: + logger.error(f"🔴 get_persona_token EXCEPTION: {type(e).__name__}: {e}") + import traceback + logger.error(f"🔴 FULL TRACEBACK: {traceback.format_exc()}") + raise def _ensure_authenticated(self) -> str: """Ensure we have a valid persona token""" - return self.get_persona_token(force_refresh=False) + logger.debug("🟢 _ensure_authenticated START") + try: + token = self.get_persona_token(force_refresh=False) + logger.debug(f"🟢 _ensure_authenticated SUCCESS, token length: {len(token)}") + return token + except Exception as e: + logger.error(f"🔴 _ensure_authenticated FAILED: {type(e).__name__}: {e}") + import traceback + logger.error(f"🔴 FULL TRACEBACK: {traceback.format_exc()}") + raise def get_dynamic_manifest_params(self, channel: StreamingChannel, **kwargs) -> Optional[str]: return None diff --git a/lib/streaming_providers/providers/magenta2/token_flow_manager.py b/lib/streaming_providers/providers/magenta2/token_flow_manager.py index ed3dc29..f10db18 100644 --- a/lib/streaming_providers/providers/magenta2/token_flow_manager.py +++ b/lib/streaming_providers/providers/magenta2/token_flow_manager.py @@ -98,7 +98,7 @@ class TokenFlowManager: return cached_result # Get the yo_digital token - token_result = self.get_yo_digital_token(force_refresh) + token_result = self.get_yo_digital_token(force_refresh) # 🚨 This might return None! if not token_result.success or not token_result.access_token: logger.debug("=== GET_PERSONA_TOKEN FAILED (token_result failed) ===") @@ -109,7 +109,7 @@ class TokenFlowManager: # Compose persona token with expiry information using existing method from .token_utils import PersonaTokenComposer - composition_result = PersonaTokenComposer.compose_from_jwt( + composition_result = PersonaTokenComposer.compose_from_jwt( # 🚨 This might return None! token_result.access_token, MAGENTA2_FALLBACK_ACCOUNT_URI ) diff --git a/lib/streaming_providers/providers/magenta2/token_utils.py b/lib/streaming_providers/providers/magenta2/token_utils.py index 760eacc..00922a9 100644 --- a/lib/streaming_providers/providers/magenta2/token_utils.py +++ b/lib/streaming_providers/providers/magenta2/token_utils.py @@ -199,34 +199,40 @@ class PersonaTokenComposer: @staticmethod def compose_from_jwt(jwt_token: str, fallback_account_uri: str = None) -> Optional[PersonaCompositionResult]: """Compose persona token and return with expiry information""" + logger.debug(f"🟢 PersonaTokenComposer.compose_from_jwt START") try: + logger.debug(f"🟢 Input JWT token length: {len(jwt_token) if jwt_token else 0}") + claims = JWTParser.parse(jwt_token) if not claims: + logger.error("🔴 JWTParser.parse returned None") return None # Extract the dc_cts_personaToken (this is the actual persona JWT) persona_jwt = claims.dc_cts_persona_token if not persona_jwt: - logger.warning("JWT missing dc_cts_personaToken") + logger.warning("🔴 JWT missing dc_cts_personaToken") return None # Get account_uri from claims or use fallback account_uri = claims.account_uri or fallback_account_uri if not account_uri: - logger.warning("JWT missing account_uri and no fallback provided") + logger.warning("🔴 JWT missing account_uri and no fallback provided") return None # Compose the persona token composed_token = PersonaTokenComposer._compose_token(account_uri, persona_jwt) if not composed_token: + logger.error("🔴 _compose_token returned None") return None # Extract expiry from the PERSONA JWT (dc_cts_personaToken), not the original JWT persona_expiry = PersonaTokenComposer._get_jwt_expiry(persona_jwt) if not persona_expiry: - logger.warning("Could not extract expiry from persona JWT") + logger.warning("🔴 Could not extract expiry from persona JWT") return None + logger.debug(f"🟢 PersonaTokenComposer.compose_from_jwt SUCCESS") return PersonaCompositionResult( persona_token=composed_token, persona_jwt=persona_jwt, @@ -234,7 +240,9 @@ class PersonaTokenComposer: ) except Exception as e: - logger.error(f"Error composing persona token: {e}") + logger.error(f"🔴 Error in PersonaTokenComposer.compose_from_jwt: {e}") + import traceback + logger.error(f"🔴 FULL TRACEBACK: {traceback.format_exc()}") return None @staticmethod