TLC-Search/config.py
knight 14d37f23e4 Add clickable reference badges and improve UI layout
- Add clickable badges for backlinks and references that trigger query string searches
- Improve toggle checkbox layout with better styling
- Add description block styling with scrollable container
- Update results styling with bordered cards and shadows
- Add favicon support across pages
- Enhance .env loading with logging for debugging

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-05 14:56:43 -05:00

96 lines
2.8 KiB
Python

"""
Centralised configuration helpers for the Python search toolkit.
Environment Variables:
ELASTIC_URL: Base URL to the Elasticsearch node (default: http://localhost:9200).
ELASTIC_USERNAME / ELASTIC_PASSWORD: Optional basic auth credentials.
ELASTIC_INDEX: Target index name (default: this_little_corner_py).
LOCAL_DATA_DIR: Root folder containing JSON metadata (default: ../data/video_metadata).
YOUTUBE_API_KEY: Optional API key for pulling metadata directly from YouTube.
"""
from __future__ import annotations
import os
from dataclasses import dataclass
from pathlib import Path
from typing import Optional
# Load .env file if it exists
try:
from dotenv import load_dotenv
import logging
_logger = logging.getLogger(__name__)
_env_path = Path(__file__).parent / ".env"
if _env_path.exists():
_logger.info(f"Loading .env from: {_env_path}")
result = load_dotenv(_env_path, override=True)
_logger.info(f"load_dotenv result: {result}")
except ImportError:
pass # python-dotenv not installed
@dataclass(frozen=True)
class ElasticSettings:
url: str
username: Optional[str]
password: Optional[str]
index: str
ca_cert: Optional[Path]
verify_certs: bool
api_key: Optional[str]
debug: bool
@dataclass(frozen=True)
class DataSettings:
root: Path
@dataclass(frozen=True)
class YoutubeSettings:
api_key: Optional[str]
@dataclass(frozen=True)
class AppConfig:
elastic: ElasticSettings
data: DataSettings
youtube: YoutubeSettings
def _env(name: str, default: Optional[str] = None) -> Optional[str]:
"""Return an environment variable value with optional default."""
value = os.environ.get(name)
if value is None:
return default
stripped = value.strip()
return stripped or default
def load_config() -> AppConfig:
"""Collect configuration from environment variables."""
elastic = ElasticSettings(
url=_env("ELASTIC_URL", "http://localhost:9200"),
username=_env("ELASTIC_USERNAME"),
password=_env("ELASTIC_PASSWORD"),
index=_env("ELASTIC_INDEX", "this_little_corner_py"),
ca_cert=Path(_env("ELASTIC_CA_CERT")).expanduser() if _env("ELASTIC_CA_CERT") else None,
verify_certs=_env("ELASTIC_VERIFY_CERTS", "1") not in {"0", "false", "False"},
api_key=_env("ELASTIC_API_KEY"),
debug=_env("ELASTIC_DEBUG", "0") in {"1", "true", "True"},
)
data_root = Path(
_env(
"LOCAL_DATA_DIR",
Path(__file__).resolve().parents[1] / "data" / "video_metadata",
)
)
data = DataSettings(root=data_root)
youtube = YoutubeSettings(api_key=_env("YOUTUBE_API_KEY"))
return AppConfig(elastic=elastic, data=data, youtube=youtube)
CONFIG = load_config()