Zum Inhalt

Provider Registry

registry

Provider registry system for dynamic provider discovery and management.

This module implements a registry pattern for anime providers, allowing automatic discovery and registration of providers from the filesystem.

The registry scans language directories (tr/, en/, de/, pl/) and imports all provider modules, registering them with metadata for easy lookup.

Functions:

Name Description
register_provider

Decorator for registering provider classes

get_provider

Get provider instance by name

get_providers_for_lang

Get all providers for a language

list_providers

List all registered providers

get_default_provider

Get default provider for a language

Example

Registering a provider::

from weeb_cli.providers.registry import register_provider
from weeb_cli.providers.base import BaseProvider

@register_provider("myprovider", lang="en", region="US")
class MyProvider(BaseProvider):
    # Implementation
    pass

Using providers::

from weeb_cli.providers import get_provider, list_providers

# Get specific provider
provider = get_provider("animecix")
results = provider.search("One Piece")

# List all providers
all_providers = list_providers()
for p in all_providers:
    print(f"{p['name']} ({p['lang']})")

register_provider

register_provider(name: str, lang: str = 'tr', region: str = 'TR', disabled: bool = False)

Decorator for registering provider classes.

Registers a provider class with metadata in the global registry. Sets class attributes (name, lang, region, disabled) for easy access.

Parameters:

Name Type Description Default
name str

Unique provider identifier (e.g., 'animecix', 'hianime').

required
lang str

Language code (e.g., 'en', 'tr', 'de', 'pl').

'tr'
region str

Region code (e.g., 'US', 'TR', 'DE', 'PL').

'TR'
disabled bool

If True, provider is registered but not available for use.

False

Returns:

Type Description

Decorator function that registers the class.

Example

@register_provider("myprovider", lang="en", region="US") ... class MyProvider(BaseProvider): ... pass

@register_provider("oldprovider", lang="en", region="US", disabled=True) ... class OldProvider(BaseProvider): ... pass # Registered but not usable

Source code in weeb_cli/providers/registry.py
def register_provider(name: str, lang: str = "tr", region: str = "TR", disabled: bool = False):
    """Decorator for registering provider classes.

    Registers a provider class with metadata in the global registry.
    Sets class attributes (name, lang, region, disabled) for easy access.

    Args:
        name: Unique provider identifier (e.g., 'animecix', 'hianime').
        lang: Language code (e.g., 'en', 'tr', 'de', 'pl').
        region: Region code (e.g., 'US', 'TR', 'DE', 'PL').
        disabled: If True, provider is registered but not available for use.

    Returns:
        Decorator function that registers the class.

    Example:
        >>> @register_provider("myprovider", lang="en", region="US")
        ... class MyProvider(BaseProvider):
        ...     pass

        >>> @register_provider("oldprovider", lang="en", region="US", disabled=True)
        ... class OldProvider(BaseProvider):
        ...     pass  # Registered but not usable
    """
    def decorator(cls: Type[BaseProvider]) -> Type[BaseProvider]:
        cls.name = name
        cls.lang = lang
        cls.region = region
        cls.disabled = disabled

        _providers[name] = cls
        _provider_meta[name] = {
            "name": name,
            "lang": lang,
            "region": region,
            "class": cls.__name__,
            "disabled": disabled
        }

        return cls
    return decorator

get_provider

get_provider(name: str) -> Optional[BaseProvider]

Get provider instance by name.

Triggers provider discovery if not already done, then returns a new instance of the requested provider. Returns None if provider is disabled or not found.

Parameters:

Name Type Description Default
name str

Provider identifier (e.g., 'animecix', 'hianime').

required

Returns:

Type Description
Optional[BaseProvider]

Provider instance, or None if not found or disabled.

Example

provider = get_provider("animecix") if provider: ... results = provider.search("anime")

Source code in weeb_cli/providers/registry.py
def get_provider(name: str) -> Optional[BaseProvider]:
    """Get provider instance by name.

    Triggers provider discovery if not already done, then returns
    a new instance of the requested provider. Returns None if provider
    is disabled or not found.

    Args:
        name: Provider identifier (e.g., 'animecix', 'hianime').

    Returns:
        Provider instance, or None if not found or disabled.

    Example:
        >>> provider = get_provider("animecix")
        >>> if provider:
        ...     results = provider.search("anime")
    """
    _discover_providers()
    if name in _providers:
        # Check if provider is disabled
        if _provider_meta.get(name, {}).get("disabled", False):
            debug(f"[Registry] Provider '{name}' is disabled")
            return None
        return _providers[name]()
    return None

get_providers_for_lang

get_providers_for_lang(lang: str) -> List[str]

Get all provider names for a specific language.

Parameters:

Name Type Description Default
lang str

Language code (e.g., 'en', 'tr', 'de', 'pl').

required

Returns:

Type Description
List[str]

List of provider names for the language.

Example

turkish_providers = get_providers_for_lang("tr") print(turkish_providers) ['animecix', 'turkanime', 'anizle', 'weeb']

Source code in weeb_cli/providers/registry.py
def get_providers_for_lang(lang: str) -> List[str]:
    """Get all provider names for a specific language.

    Args:
        lang: Language code (e.g., 'en', 'tr', 'de', 'pl').

    Returns:
        List of provider names for the language.

    Example:
        >>> turkish_providers = get_providers_for_lang("tr")
        >>> print(turkish_providers)
        ['animecix', 'turkanime', 'anizle', 'weeb']
    """
    _discover_providers()
    return [
        name for name, meta in _provider_meta.items()
        if meta["lang"] == lang
    ]

list_providers

list_providers() -> List[dict]

List all registered providers with metadata.

Returns:

Type Description
List[dict]

List of provider metadata dictionaries containing: - name: Provider identifier - lang: Language code - region: Region code - class: Provider class name

Example

providers = list_providers() for p in providers: ... print(f"{p['name']}: {p['lang']} ({p['region']})") animecix: tr (TR) hianime: en (US) aniworld: de (DE)

Source code in weeb_cli/providers/registry.py
def list_providers() -> List[dict]:
    """List all registered providers with metadata.

    Returns:
        List of provider metadata dictionaries containing:
            - name: Provider identifier
            - lang: Language code
            - region: Region code
            - class: Provider class name

    Example:
        >>> providers = list_providers()
        >>> for p in providers:
        ...     print(f"{p['name']}: {p['lang']} ({p['region']})")
        animecix: tr (TR)
        hianime: en (US)
        aniworld: de (DE)
    """
    _discover_providers()
    return list(_provider_meta.values())

get_default_provider

get_default_provider(lang: str) -> Optional[str]

Get default provider name for a language.

Returns the first registered provider for the given language. Useful for setting initial defaults.

Parameters:

Name Type Description Default
lang str

Language code (e.g., 'en', 'tr', 'de', 'pl').

required

Returns:

Type Description
Optional[str]

Provider name, or None if no providers for language.

Example

default = get_default_provider("tr") print(default) 'animecix'

Source code in weeb_cli/providers/registry.py
def get_default_provider(lang: str) -> Optional[str]:
    """Get default provider name for a language.

    Returns the first registered provider for the given language.
    Useful for setting initial defaults.

    Args:
        lang: Language code (e.g., 'en', 'tr', 'de', 'pl').

    Returns:
        Provider name, or None if no providers for language.

    Example:
        >>> default = get_default_provider("tr")
        >>> print(default)
        'animecix'
    """
    providers = get_providers_for_lang(lang)
    return providers[0] if providers else None

Übersicht

Das Registry-Modul bietet dynamische Provider-Erkennung und -Verwaltung unter Verwendung eines Registry-Musters.

Funktionen

register_provider

Dekorator zum Registrieren von Provider-Klassen.

get_provider

Provider-Instanz nach Namen abrufen.

get_providers_for_lang

Alle Provider für eine Sprache abrufen.

list_providers

Alle registrierten Provider auflisten.

get_default_provider

Standard-Provider für eine Sprache abrufen.

Verwendungsbeispiele

Provider registrieren

from weeb_cli.providers.registry import register_provider

@register_provider("myprovider", lang="en", region="US")
class MyProvider(BaseProvider):
    pass

Provider abrufen

from weeb_cli.providers import get_provider

provider = get_provider("animecix")
results = provider.search("anime")

Provider auflisten

from weeb_cli.providers import list_providers

providers = list_providers()
for p in providers:
    print(f"{p['name']}: {p['lang']}")

API-Referenz

register_provider

register_provider(name: str, lang: str = 'tr', region: str = 'TR', disabled: bool = False)

Decorator for registering provider classes.

Registers a provider class with metadata in the global registry. Sets class attributes (name, lang, region, disabled) for easy access.

Parameters:

Name Type Description Default
name str

Unique provider identifier (e.g., 'animecix', 'hianime').

required
lang str

Language code (e.g., 'en', 'tr', 'de', 'pl').

'tr'
region str

Region code (e.g., 'US', 'TR', 'DE', 'PL').

'TR'
disabled bool

If True, provider is registered but not available for use.

False

Returns:

Type Description

Decorator function that registers the class.

Example

@register_provider("myprovider", lang="en", region="US") ... class MyProvider(BaseProvider): ... pass

@register_provider("oldprovider", lang="en", region="US", disabled=True) ... class OldProvider(BaseProvider): ... pass # Registered but not usable

Source code in weeb_cli/providers/registry.py
def register_provider(name: str, lang: str = "tr", region: str = "TR", disabled: bool = False):
    """Decorator for registering provider classes.

    Registers a provider class with metadata in the global registry.
    Sets class attributes (name, lang, region, disabled) for easy access.

    Args:
        name: Unique provider identifier (e.g., 'animecix', 'hianime').
        lang: Language code (e.g., 'en', 'tr', 'de', 'pl').
        region: Region code (e.g., 'US', 'TR', 'DE', 'PL').
        disabled: If True, provider is registered but not available for use.

    Returns:
        Decorator function that registers the class.

    Example:
        >>> @register_provider("myprovider", lang="en", region="US")
        ... class MyProvider(BaseProvider):
        ...     pass

        >>> @register_provider("oldprovider", lang="en", region="US", disabled=True)
        ... class OldProvider(BaseProvider):
        ...     pass  # Registered but not usable
    """
    def decorator(cls: Type[BaseProvider]) -> Type[BaseProvider]:
        cls.name = name
        cls.lang = lang
        cls.region = region
        cls.disabled = disabled

        _providers[name] = cls
        _provider_meta[name] = {
            "name": name,
            "lang": lang,
            "region": region,
            "class": cls.__name__,
            "disabled": disabled
        }

        return cls
    return decorator

get_provider

get_provider(name: str) -> Optional[BaseProvider]

Get provider instance by name.

Triggers provider discovery if not already done, then returns a new instance of the requested provider. Returns None if provider is disabled or not found.

Parameters:

Name Type Description Default
name str

Provider identifier (e.g., 'animecix', 'hianime').

required

Returns:

Type Description
Optional[BaseProvider]

Provider instance, or None if not found or disabled.

Example

provider = get_provider("animecix") if provider: ... results = provider.search("anime")

Source code in weeb_cli/providers/registry.py
def get_provider(name: str) -> Optional[BaseProvider]:
    """Get provider instance by name.

    Triggers provider discovery if not already done, then returns
    a new instance of the requested provider. Returns None if provider
    is disabled or not found.

    Args:
        name: Provider identifier (e.g., 'animecix', 'hianime').

    Returns:
        Provider instance, or None if not found or disabled.

    Example:
        >>> provider = get_provider("animecix")
        >>> if provider:
        ...     results = provider.search("anime")
    """
    _discover_providers()
    if name in _providers:
        # Check if provider is disabled
        if _provider_meta.get(name, {}).get("disabled", False):
            debug(f"[Registry] Provider '{name}' is disabled")
            return None
        return _providers[name]()
    return None

get_providers_for_lang

get_providers_for_lang(lang: str) -> List[str]

Get all provider names for a specific language.

Parameters:

Name Type Description Default
lang str

Language code (e.g., 'en', 'tr', 'de', 'pl').

required

Returns:

Type Description
List[str]

List of provider names for the language.

Example

turkish_providers = get_providers_for_lang("tr") print(turkish_providers) ['animecix', 'turkanime', 'anizle', 'weeb']

Source code in weeb_cli/providers/registry.py
def get_providers_for_lang(lang: str) -> List[str]:
    """Get all provider names for a specific language.

    Args:
        lang: Language code (e.g., 'en', 'tr', 'de', 'pl').

    Returns:
        List of provider names for the language.

    Example:
        >>> turkish_providers = get_providers_for_lang("tr")
        >>> print(turkish_providers)
        ['animecix', 'turkanime', 'anizle', 'weeb']
    """
    _discover_providers()
    return [
        name for name, meta in _provider_meta.items()
        if meta["lang"] == lang
    ]

list_providers

list_providers() -> List[dict]

List all registered providers with metadata.

Returns:

Type Description
List[dict]

List of provider metadata dictionaries containing: - name: Provider identifier - lang: Language code - region: Region code - class: Provider class name

Example

providers = list_providers() for p in providers: ... print(f"{p['name']}: {p['lang']} ({p['region']})") animecix: tr (TR) hianime: en (US) aniworld: de (DE)

Source code in weeb_cli/providers/registry.py
def list_providers() -> List[dict]:
    """List all registered providers with metadata.

    Returns:
        List of provider metadata dictionaries containing:
            - name: Provider identifier
            - lang: Language code
            - region: Region code
            - class: Provider class name

    Example:
        >>> providers = list_providers()
        >>> for p in providers:
        ...     print(f"{p['name']}: {p['lang']} ({p['region']})")
        animecix: tr (TR)
        hianime: en (US)
        aniworld: de (DE)
    """
    _discover_providers()
    return list(_provider_meta.values())

get_default_provider

get_default_provider(lang: str) -> Optional[str]

Get default provider name for a language.

Returns the first registered provider for the given language. Useful for setting initial defaults.

Parameters:

Name Type Description Default
lang str

Language code (e.g., 'en', 'tr', 'de', 'pl').

required

Returns:

Type Description
Optional[str]

Provider name, or None if no providers for language.

Example

default = get_default_provider("tr") print(default) 'animecix'

Source code in weeb_cli/providers/registry.py
def get_default_provider(lang: str) -> Optional[str]:
    """Get default provider name for a language.

    Returns the first registered provider for the given language.
    Useful for setting initial defaults.

    Args:
        lang: Language code (e.g., 'en', 'tr', 'de', 'pl').

    Returns:
        Provider name, or None if no providers for language.

    Example:
        >>> default = get_default_provider("tr")
        >>> print(default)
        'animecix'
    """
    providers = get_providers_for_lang(lang)
    return providers[0] if providers else None