Skip to content

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')

Decorator for registering provider classes.

Registers a provider class with metadata in the global registry. Sets class attributes (name, lang, region) 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'

Returns:

Type Description

Decorator function that registers the class.

Example

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

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

    Registers a provider class with metadata in the global registry.
    Sets class attributes (name, lang, region) 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').

    Returns:
        Decorator function that registers the class.

    Example:
        >>> @register_provider("myprovider", lang="en", region="US")
        ... class MyProvider(BaseProvider):
        ...     pass
    """
    def decorator(cls: Type[BaseProvider]) -> Type[BaseProvider]:
        cls.name = name
        cls.lang = lang
        cls.region = region

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

        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.

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.

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.

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

    Returns:
        Provider instance, or None if not found.

    Example:
        >>> provider = get_provider("animecix")
        >>> if provider:
        ...     results = provider.search("anime")
    """
    _discover_providers()
    if name in _providers:
        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

Overview

The registry module provides dynamic provider discovery and management using a registry pattern.

Functions

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.

Usage Examples

Registering Provider

from weeb_cli.providers.registry import register_provider

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

Getting Provider

from weeb_cli.providers import get_provider

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

Listing Providers

from weeb_cli.providers import list_providers

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

API Reference

register_provider

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

Decorator for registering provider classes.

Registers a provider class with metadata in the global registry. Sets class attributes (name, lang, region) 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'

Returns:

Type Description

Decorator function that registers the class.

Example

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

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

    Registers a provider class with metadata in the global registry.
    Sets class attributes (name, lang, region) 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').

    Returns:
        Decorator function that registers the class.

    Example:
        >>> @register_provider("myprovider", lang="en", region="US")
        ... class MyProvider(BaseProvider):
        ...     pass
    """
    def decorator(cls: Type[BaseProvider]) -> Type[BaseProvider]:
        cls.name = name
        cls.lang = lang
        cls.region = region

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

        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.

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.

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.

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

    Returns:
        Provider instance, or None if not found.

    Example:
        >>> provider = get_provider("animecix")
        >>> if provider:
        ...     results = provider.search("anime")
    """
    _discover_providers()
    if name in _providers:
        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