Zum Inhalt

Configuration Module

config

Configuration management for Weeb CLI.

This module provides a centralized configuration system that stores settings in a SQLite database with fallback to default values. Supports both interactive and headless (API) modes.

Configuration is stored persistently in the database and can be accessed throughout the application using the global config instance.

Example

Basic usage::

from weeb_cli.config import config

# Get configuration value
download_dir = config.get("download_dir")
aria2_enabled = config.get("aria2_enabled", True)

# Set configuration value
config.set("language", "tr")

# Enable headless mode (no database access)
config.set_headless(True)

Attributes:

Name Type Description
APP_NAME str

Application name for directory naming.

CONFIG_DIR Path

User configuration directory (~/.weeb-cli).

DEFAULT_CONFIG dict

Default configuration values.

config Config

Global configuration instance.

Config

Configuration manager with database persistence.

Provides a simple key-value interface for application settings with automatic persistence to SQLite database. Supports headless mode for API usage without database access.

Attributes:

Name Type Description
_db Optional[Database]

Lazy-loaded database instance.

_headless bool

Whether running in headless mode (no database).

Source code in weeb_cli/config.py
class Config:
    """Configuration manager with database persistence.

    Provides a simple key-value interface for application settings with
    automatic persistence to SQLite database. Supports headless mode for
    API usage without database access.

    Attributes:
        _db (Optional[Database]): Lazy-loaded database instance.
        _headless (bool): Whether running in headless mode (no database).
    """

    def __init__(self) -> None:
        """Initialize configuration manager."""
        self._db: Optional['Database'] = None
        self._headless: bool = False

    @property
    def db(self) -> 'Database':
        """Get database instance with lazy loading.

        Returns:
            Database instance for configuration storage.
        """
        if self._db is None:
            from weeb_cli.services.database import db
            self._db = db
        return self._db

    def get(self, key: str, default: Optional[Any] = None) -> Any:
        """Get configuration value by key.

        Attempts to retrieve value from database first, then falls back to
        provided default or DEFAULT_CONFIG. Special handling for download_dir
        to generate localized default path.

        Args:
            key: Configuration key name.
            default: Default value if key not found in database.

        Returns:
            Configuration value, default, or None.

        Example:
            >>> config.get("language", "en")
            "tr"
            >>> config.get("aria2_max_connections")
            16
        """
        if not self._headless:
            try:
                val = self.db.get_config(key)
                if val is not None:
                    return val
            except Exception:
                pass

        # Special handling for download_dir
        if key == "download_dir":
            return default if default is not None else get_default_download_dir()

        # Use provided default, fallback to DEFAULT_CONFIG, then None
        if default is not None:
            return DEFAULT_CONFIG.get(key, default)
        return DEFAULT_CONFIG.get(key)

    def set(self, key: str, value: Any) -> None:
        """Set configuration value.

        Persists the value to database for future retrieval.

        Args:
            key: Configuration key name.
            value: Value to store (must be JSON-serializable).

        Example:
            >>> config.set("language", "tr")
            >>> config.set("aria2_max_connections", 32)
        """
        self.db.set_config(key, value)

    def set_headless(self, headless: bool = True) -> None:
        """Enable or disable headless mode.

        In headless mode, configuration is read from DEFAULT_CONFIG only,
        without database access. Useful for API commands and testing.

        Args:
            headless: Whether to enable headless mode.
        """
        self._headless = headless

db property

db: Database

Get database instance with lazy loading.

Returns:

Type Description
Database

Database instance for configuration storage.

__init__

__init__() -> None

Initialize configuration manager.

Source code in weeb_cli/config.py
def __init__(self) -> None:
    """Initialize configuration manager."""
    self._db: Optional['Database'] = None
    self._headless: bool = False

get

get(key: str, default: Optional[Any] = None) -> Any

Get configuration value by key.

Attempts to retrieve value from database first, then falls back to provided default or DEFAULT_CONFIG. Special handling for download_dir to generate localized default path.

Parameters:

Name Type Description Default
key str

Configuration key name.

required
default Optional[Any]

Default value if key not found in database.

None

Returns:

Type Description
Any

Configuration value, default, or None.

Example

config.get("language", "en") "tr" config.get("aria2_max_connections") 16

Source code in weeb_cli/config.py
def get(self, key: str, default: Optional[Any] = None) -> Any:
    """Get configuration value by key.

    Attempts to retrieve value from database first, then falls back to
    provided default or DEFAULT_CONFIG. Special handling for download_dir
    to generate localized default path.

    Args:
        key: Configuration key name.
        default: Default value if key not found in database.

    Returns:
        Configuration value, default, or None.

    Example:
        >>> config.get("language", "en")
        "tr"
        >>> config.get("aria2_max_connections")
        16
    """
    if not self._headless:
        try:
            val = self.db.get_config(key)
            if val is not None:
                return val
        except Exception:
            pass

    # Special handling for download_dir
    if key == "download_dir":
        return default if default is not None else get_default_download_dir()

    # Use provided default, fallback to DEFAULT_CONFIG, then None
    if default is not None:
        return DEFAULT_CONFIG.get(key, default)
    return DEFAULT_CONFIG.get(key)

set

set(key: str, value: Any) -> None

Set configuration value.

Persists the value to database for future retrieval.

Parameters:

Name Type Description Default
key str

Configuration key name.

required
value Any

Value to store (must be JSON-serializable).

required
Example

config.set("language", "tr") config.set("aria2_max_connections", 32)

Source code in weeb_cli/config.py
def set(self, key: str, value: Any) -> None:
    """Set configuration value.

    Persists the value to database for future retrieval.

    Args:
        key: Configuration key name.
        value: Value to store (must be JSON-serializable).

    Example:
        >>> config.set("language", "tr")
        >>> config.set("aria2_max_connections", 32)
    """
    self.db.set_config(key, value)

set_headless

set_headless(headless: bool = True) -> None

Enable or disable headless mode.

In headless mode, configuration is read from DEFAULT_CONFIG only, without database access. Useful for API commands and testing.

Parameters:

Name Type Description Default
headless bool

Whether to enable headless mode.

True
Source code in weeb_cli/config.py
def set_headless(self, headless: bool = True) -> None:
    """Enable or disable headless mode.

    In headless mode, configuration is read from DEFAULT_CONFIG only,
    without database access. Useful for API commands and testing.

    Args:
        headless: Whether to enable headless mode.
    """
    self._headless = headless

get_default_download_dir

get_default_download_dir() -> str

Get the default download directory path.

Uses localized folder name from i18n translations.

Returns:

Type Description
str

Absolute path to default download directory in current working directory.

Source code in weeb_cli/config.py
def get_default_download_dir() -> str:
    """Get the default download directory path.

    Uses localized folder name from i18n translations.

    Returns:
        Absolute path to default download directory in current working directory.
    """
    from weeb_cli.i18n import i18n

    folder_name = i18n.t("downloads.default_folder_name", "weeb-downloads")
    return os.path.join(os.getcwd(), folder_name)

Overview

The configuration module provides centralized settings management for Weeb CLI. All configuration is stored in a SQLite database with fallback to sensible defaults.

Usage Examples

Getting Configuration Values

from weeb_cli.config import config

# Get with default fallback
language = config.get("language", "en")
download_dir = config.get("download_dir")
aria2_enabled = config.get("aria2_enabled", True)

Setting Configuration Values

from weeb_cli.config import config

# Set language
config.set("language", "tr")

# Set download directory
config.set("download_dir", "/path/to/downloads")

# Enable/disable features
config.set("discord_rpc_enabled", False)

Headless Mode

For API usage without database access:

from weeb_cli.config import config

# Enable headless mode
config.set_headless(True)

# Now config.get() returns only DEFAULT_CONFIG values
language = config.get("language")  # Returns None (default)

Default Configuration

The following default values are used when no database value exists:

Key Default Value Description
language None UI language (tr, en, de, pl)
aria2_enabled True Enable Aria2 for downloads
ytdlp_enabled True Enable yt-dlp for downloads
aria2_max_connections 16 Max connections per download
max_concurrent_downloads 3 Max simultaneous downloads
download_dir None Download directory path
ytdlp_format "bestvideo+bestaudio/best" yt-dlp format string
scraping_source None Default provider
show_description True Show anime descriptions
debug_mode False Enable debug logging
download_max_retries 3 Download retry attempts
download_retry_delay 10 Delay between retries (seconds)
discord_rpc_enabled True Enable Discord Rich Presence
shortcuts_enabled False Enable keyboard shortcuts

Configuration Directory

Configuration and data are stored in:

~/.weeb-cli/
├── weeb.db          # SQLite database
├── cache/           # Cached data
├── bin/             # Downloaded dependencies
└── logs/            # Debug logs

API Reference

Configuration manager with database persistence.

Provides a simple key-value interface for application settings with automatic persistence to SQLite database. Supports headless mode for API usage without database access.

Attributes:

Name Type Description
_db Optional[Database]

Lazy-loaded database instance.

_headless bool

Whether running in headless mode (no database).

Source code in weeb_cli/config.py
class Config:
    """Configuration manager with database persistence.

    Provides a simple key-value interface for application settings with
    automatic persistence to SQLite database. Supports headless mode for
    API usage without database access.

    Attributes:
        _db (Optional[Database]): Lazy-loaded database instance.
        _headless (bool): Whether running in headless mode (no database).
    """

    def __init__(self) -> None:
        """Initialize configuration manager."""
        self._db: Optional['Database'] = None
        self._headless: bool = False

    @property
    def db(self) -> 'Database':
        """Get database instance with lazy loading.

        Returns:
            Database instance for configuration storage.
        """
        if self._db is None:
            from weeb_cli.services.database import db
            self._db = db
        return self._db

    def get(self, key: str, default: Optional[Any] = None) -> Any:
        """Get configuration value by key.

        Attempts to retrieve value from database first, then falls back to
        provided default or DEFAULT_CONFIG. Special handling for download_dir
        to generate localized default path.

        Args:
            key: Configuration key name.
            default: Default value if key not found in database.

        Returns:
            Configuration value, default, or None.

        Example:
            >>> config.get("language", "en")
            "tr"
            >>> config.get("aria2_max_connections")
            16
        """
        if not self._headless:
            try:
                val = self.db.get_config(key)
                if val is not None:
                    return val
            except Exception:
                pass

        # Special handling for download_dir
        if key == "download_dir":
            return default if default is not None else get_default_download_dir()

        # Use provided default, fallback to DEFAULT_CONFIG, then None
        if default is not None:
            return DEFAULT_CONFIG.get(key, default)
        return DEFAULT_CONFIG.get(key)

    def set(self, key: str, value: Any) -> None:
        """Set configuration value.

        Persists the value to database for future retrieval.

        Args:
            key: Configuration key name.
            value: Value to store (must be JSON-serializable).

        Example:
            >>> config.set("language", "tr")
            >>> config.set("aria2_max_connections", 32)
        """
        self.db.set_config(key, value)

    def set_headless(self, headless: bool = True) -> None:
        """Enable or disable headless mode.

        In headless mode, configuration is read from DEFAULT_CONFIG only,
        without database access. Useful for API commands and testing.

        Args:
            headless: Whether to enable headless mode.
        """
        self._headless = headless

get

get(key: str, default: Optional[Any] = None) -> Any

Get configuration value by key.

Attempts to retrieve value from database first, then falls back to provided default or DEFAULT_CONFIG. Special handling for download_dir to generate localized default path.

Parameters:

Name Type Description Default
key str

Configuration key name.

required
default Optional[Any]

Default value if key not found in database.

None

Returns:

Type Description
Any

Configuration value, default, or None.

Example

config.get("language", "en") "tr" config.get("aria2_max_connections") 16

Source code in weeb_cli/config.py
def get(self, key: str, default: Optional[Any] = None) -> Any:
    """Get configuration value by key.

    Attempts to retrieve value from database first, then falls back to
    provided default or DEFAULT_CONFIG. Special handling for download_dir
    to generate localized default path.

    Args:
        key: Configuration key name.
        default: Default value if key not found in database.

    Returns:
        Configuration value, default, or None.

    Example:
        >>> config.get("language", "en")
        "tr"
        >>> config.get("aria2_max_connections")
        16
    """
    if not self._headless:
        try:
            val = self.db.get_config(key)
            if val is not None:
                return val
        except Exception:
            pass

    # Special handling for download_dir
    if key == "download_dir":
        return default if default is not None else get_default_download_dir()

    # Use provided default, fallback to DEFAULT_CONFIG, then None
    if default is not None:
        return DEFAULT_CONFIG.get(key, default)
    return DEFAULT_CONFIG.get(key)

set

set(key: str, value: Any) -> None

Set configuration value.

Persists the value to database for future retrieval.

Parameters:

Name Type Description Default
key str

Configuration key name.

required
value Any

Value to store (must be JSON-serializable).

required
Example

config.set("language", "tr") config.set("aria2_max_connections", 32)

Source code in weeb_cli/config.py
def set(self, key: str, value: Any) -> None:
    """Set configuration value.

    Persists the value to database for future retrieval.

    Args:
        key: Configuration key name.
        value: Value to store (must be JSON-serializable).

    Example:
        >>> config.set("language", "tr")
        >>> config.set("aria2_max_connections", 32)
    """
    self.db.set_config(key, value)

set_headless

set_headless(headless: bool = True) -> None

Enable or disable headless mode.

In headless mode, configuration is read from DEFAULT_CONFIG only, without database access. Useful for API commands and testing.

Parameters:

Name Type Description Default
headless bool

Whether to enable headless mode.

True
Source code in weeb_cli/config.py
def set_headless(self, headless: bool = True) -> None:
    """Enable or disable headless mode.

    In headless mode, configuration is read from DEFAULT_CONFIG only,
    without database access. Useful for API commands and testing.

    Args:
        headless: Whether to enable headless mode.
    """
    self._headless = headless