From 534c87289e5d665d92431181b4dd0f140122d05e Mon Sep 17 00:00:00 2001 From: Nirvana Date: Thu, 13 Nov 2025 21:05:31 +0100 Subject: [PATCH] Add Magenta 2.0 (DE) --- .../providers/magenta2/auth.py | 26 ++++++++++++++++++- .../providers/magenta2/provider.py | 16 +++++++++--- .../providers/magenta2/sam3_client.py | 23 ++++++++++++++++ 3 files changed, 61 insertions(+), 4 deletions(-) diff --git a/lib/streaming_providers/providers/magenta2/auth.py b/lib/streaming_providers/providers/magenta2/auth.py index be83211..73c0b01 100644 --- a/lib/streaming_providers/providers/magenta2/auth.py +++ b/lib/streaming_providers/providers/magenta2/auth.py @@ -463,7 +463,31 @@ class Magenta2Authenticator(BaseOAuth2Authenticator): except Exception as e: logger.warning(f"Failed to initialize SAM3/SSO clients: {e}") - + + def update_sam3_qr_code_url(self, qr_code_url: str) -> bool: + """ + Public method to update SAM3 client with QR code URL + Returns True if successful, False otherwise + """ + if not self._sam3_client: + logger.warning("Cannot update QR code URL - SAM3 client not initialized") + return False + + # Use public method instead of direct assignment + self._sam3_client.set_qr_code_url(qr_code_url) + logger.info(f"✓ Updated SAM3 client with QR code URL: {qr_code_url}") + return True + + def get_sam3_client_status(self) -> Dict[str, Any]: + """ + Public method to get SAM3 client status for debugging + """ + if not self._sam3_client: + return {'initialized': False} + + # Use public method instead of accessing protected members + return self._sam3_client.get_client_status() + def can_use_line_auth(self) -> bool: """Check if line auth components are available""" return ( diff --git a/lib/streaming_providers/providers/magenta2/provider.py b/lib/streaming_providers/providers/magenta2/provider.py index b66b742..efed1df 100644 --- a/lib/streaming_providers/providers/magenta2/provider.py +++ b/lib/streaming_providers/providers/magenta2/provider.py @@ -211,11 +211,21 @@ class Magenta2Provider(StreamingProvider): qr_url = self.endpoint_manager.get_endpoint('login_qr_code') if qr_url: logger.info(f"✓ QR code endpoint discovered in endpoint manager: {qr_url}") + + # PROPER FIX: Use public method to update SAM3 client + if hasattr(self.authenticator, 'update_sam3_qr_code_url'): + success = self.authenticator.update_sam3_qr_code_url(qr_url) + if success: + logger.info("✓ Successfully updated SAM3 client with QR code URL") + else: + logger.warning("✗ Failed to update SAM3 client with QR code URL") + + # Also debug the current status + if hasattr(self.authenticator, 'get_sam3_client_status'): + status = self.authenticator.get_sam3_client_status() + logger.debug(f"SAM3 client status after update: {status}") else: logger.warning("✗ QR code endpoint NOT found in endpoint manager") - # Show all available endpoints for debugging - all_endpoints = self.endpoint_manager.get_all_endpoints() - logger.debug(f"Available endpoints: {list(all_endpoints.keys())}") if self.provider_config and self.provider_config.manifest: device_token = self.provider_config.get_device_token() diff --git a/lib/streaming_providers/providers/magenta2/sam3_client.py b/lib/streaming_providers/providers/magenta2/sam3_client.py index de202dd..50acf80 100644 --- a/lib/streaming_providers/providers/magenta2/sam3_client.py +++ b/lib/streaming_providers/providers/magenta2/sam3_client.py @@ -485,6 +485,29 @@ class Sam3Client: logger.warning(f"No access token available for scope {scope} - line auth may be needed") return "" + def get_token_endpoint(self) -> str: + """Public method to get token endpoint""" + return self._get_token_endpoint() + + def get_client_status(self) -> Dict[str, Any]: + """ + Public method to get SAM3 client status for debugging + """ + return { + 'initialized': True, + 'has_backchannel_url': bool(self.backchannel_start_url), + 'has_token_endpoint': bool(self._get_token_endpoint()), + 'has_qr_code_url': bool(self.qr_code_url_template), + 'backchannel_url': self.backchannel_start_url, + 'token_endpoint': self._get_token_endpoint(), + 'qr_code_url': self.qr_code_url_template + } + + def set_qr_code_url(self, qr_code_url: str) -> None: + """Public method to set QR code URL""" + self.qr_code_url_template = qr_code_url + logger.debug(f"QR code URL set: {qr_code_url}") + # ======================================================================== # HTML Form Parsing Helpers # ========================================================================