Files
script.service.ultimate/lib/streaming_providers/__init__.py
T
2025-10-29 20:23:50 +01:00

126 lines
4.6 KiB
Python

# lib/streaming_providers/__init__.py
import importlib
from typing import Dict, Type
import os
import sys
# Import the centralized logger
from .base.utils.logger import logger
AVAILABLE_PROVIDERS: Dict[str, Type] = {}
def _discover_providers():
"""Kodi-compatible provider discovery"""
try:
# Import the base provider class first
from .base.provider import StreamingProvider
# Get the current package path
current_dir = os.path.dirname(__file__)
providers_dir = os.path.join(current_dir, 'providers')
logger.info(f"Looking for providers in: {providers_dir}")
# Check if providers directory exists
if not os.path.exists(providers_dir):
logger.error(f"Providers directory does not exist: {providers_dir}")
return
# Add the lib directory to Python path if not already there
lib_dir = os.path.dirname(current_dir)
if lib_dir not in sys.path:
sys.path.insert(0, lib_dir)
logger.debug(f"Added lib directory to Python path: {lib_dir}")
# Iterate through subdirectories in providers folder
for item in os.listdir(providers_dir):
provider_path = os.path.join(providers_dir, item)
# Skip if not a directory or if it starts with __
if not os.path.isdir(provider_path) or item.startswith('__'):
continue
# Check if __init__.py exists in the provider directory
init_file = os.path.join(provider_path, '__init__.py')
if not os.path.exists(init_file):
logger.debug(f"No __init__.py found in {item}, skipping")
continue
try:
logger.debug(f"Attempting to import provider: {item}")
# Import the provider module using absolute import
module_name = f'streaming_providers.providers.{item}'
module = importlib.import_module(module_name)
# Find provider classes in the module
provider_found = False
for attr_name in dir(module):
attr = getattr(module, attr_name)
if (isinstance(attr, type) and
issubclass(attr, StreamingProvider) and
attr != StreamingProvider):
AVAILABLE_PROVIDERS[item] = attr
logger.info(f"Discovered provider: {item} -> {attr_name}")
provider_found = True
break
if not provider_found:
logger.warning(f"No valid provider class found in {item}")
except ImportError as e:
logger.error(f"Could not import provider {item}: {e}")
logger.debug(f"Python path: {sys.path}")
except Exception as e:
logger.error(f"Error processing provider {item}: {e}")
except Exception as e:
logger.error(f"Error during provider discovery: {e}")
logger.debug(f"Current working directory: {os.getcwd()}")
logger.debug(f"Python path: {sys.path}")
def get_configured_manager(country: str = 'de') -> 'ProviderManager':
"""
Get manager with settings-aware providers
Args:
country: Default country code for providers without country detection (default: 'de')
Returns:
Configured ProviderManager instance with all detected providers
"""
from .base.manager import ProviderManager
from .base.settings.settings_manager import SettingsManager
# Create manager
manager = ProviderManager()
# Initialize settings manager to detect providers
settings_manager = SettingsManager(enable_kodi_integration=True)
# Detect providers from Kodi (if available) or use all available providers
detected_providers = None
if settings_manager.kodi_bridge and settings_manager.kodi_bridge.is_kodi_environment():
detected_providers = settings_manager.kodi_bridge.detect_all_providers_from_kodi()
logger.info(f"Detected providers from Kodi: {detected_providers}")
else:
logger.info(f"Not in Kodi environment, will register all available providers with default country '{country}'")
# Use the new discover_providers method with detected providers
registered = manager.discover_providers(
country=country,
detected_providers=detected_providers
)
logger.info(f"Registered {len(registered)} providers: {registered}")
return manager
# Initial discovery
_discover_providers()
__all__ = ['AVAILABLE_PROVIDERS', 'get_configured_manager']