|
7 | 7 | from typing import List |
8 | 8 |
|
9 | 9 | # Local imports |
| 10 | +from .paths import get_root |
10 | 11 | from .validation import ConfigValidator, PathRequirement, PathRule |
11 | 12 |
|
12 | 13 |
|
13 | 14 | @dataclass |
14 | 15 | class BaseConfig: |
15 | 16 | """Base configuration class.""" |
16 | 17 |
|
17 | | - output_dir: Path = field(default=Path(".tracklistify/output")) |
18 | | - cache_dir: Path = field(default=Path(".tracklistify/cache")) |
19 | | - temp_dir: Path = field(default=Path(".tracklistify/temp")) |
20 | | - log_dir: Path = field(default=Path(".tracklistify/log")) |
| 18 | + project_root = get_root() |
| 19 | + |
| 20 | + # Directories |
| 21 | + log_dir: Path = field(default=project_root / ".tracklistify/log") |
| 22 | + temp_dir: Path = field(default=project_root / ".tracklistify/temp") |
| 23 | + cache_dir: Path = field(default=project_root / ".tracklistify/cache") |
| 24 | + output_dir: Path = field(default=project_root / ".tracklistify/output") |
| 25 | + |
| 26 | + # Log settings |
21 | 27 | verbose: bool = field(default=False) |
22 | 28 | debug: bool = field(default=False) |
23 | 29 |
|
@@ -61,8 +67,12 @@ def _load_from_env(self) -> None: |
61 | 67 | # Handle boolean values |
62 | 68 | value = env_value.lower() in ("true", "1", "yes", "on") |
63 | 69 | elif field_type == Path: |
64 | | - # Handle paths |
65 | | - value = Path(os.path.expanduser(env_value)) |
| 70 | + # Handle paths - resolve relative paths relative to project root |
| 71 | + path = Path(os.path.expanduser(env_value)) |
| 72 | + if not path.is_absolute(): |
| 73 | + # Relative path - resolve relative to project root |
| 74 | + path = get_root() / path |
| 75 | + value = path |
66 | 76 | elif field_type == List[str]: |
67 | 77 | # Handle string lists (comma-separated) |
68 | 78 | value = [s.strip() for s in env_value.split(",") if s.strip()] |
@@ -101,36 +111,52 @@ class TrackIdentificationConfig(BaseConfig): |
101 | 111 | # Base config fields are inherited |
102 | 112 |
|
103 | 113 | # Track identification specific fields |
104 | | - segment_length: int = field(default=30) |
105 | | - overlap_duration: int = field(default=10) |
| 114 | + segment_length: int = field(default=60) |
106 | 115 | min_confidence: float = field(default=0.5) |
107 | | - time_threshold: float = field(default=60.0) |
| 116 | + time_threshold: float = field(default=30.0) |
108 | 117 | max_duplicates: int = field(default=2) |
| 118 | + overlap_duration: int = field(default=10) |
| 119 | + overlap_strategy: str = field(default="weighted") |
| 120 | + min_segment_length: int = field(default=10) |
| 121 | + |
| 122 | + # Provider settings |
109 | 123 | primary_provider: str = field(default="shazam") |
110 | | - fallback_enabled: bool = field(default=True) |
| 124 | + fallback_enabled: bool = field(default=False) |
111 | 125 | fallback_providers: List[str] = field(default_factory=list) |
112 | 126 |
|
113 | | - # Global rate limiting settings |
114 | | - max_requests_per_minute: int = field(default=25) |
115 | | - max_concurrent_requests: int = field(default=2) |
116 | | - |
| 127 | + # Caching settings |
117 | 128 | cache_enabled: bool = field(default=True) |
118 | | - cache_ttl: int = field(default=86400) |
119 | | - cache_max_size: int = field(default=1000000) |
| 129 | + cache_ttl: int = field(default=3600) |
| 130 | + cache_max_size: int = field(default=1000) |
120 | 131 | cache_storage_format: str = field(default="json") |
121 | 132 | cache_compression_enabled: bool = field(default=True) |
122 | 133 | cache_compression_level: int = field(default=6) |
123 | 134 | cache_cleanup_enabled: bool = field(default=True) |
124 | 135 | cache_cleanup_interval: int = field(default=3600) |
125 | | - cache_max_age: int = field(default=604800) |
| 136 | + cache_max_age: int = field(default=86400) |
126 | 137 | cache_min_free_space: int = field(default=104857600) |
| 138 | + |
| 139 | + # Rate limiting settings |
| 140 | + max_requests_per_minute: int = field(default=25) |
| 141 | + max_concurrent_requests: int = field(default=2) |
| 142 | + |
| 143 | + # ACRCloud settings |
127 | 144 | acrcloud_max_rpm: int = field(default=300) |
128 | 145 | acrcloud_max_concurrent: int = field(default=10) |
| 146 | + |
| 147 | + # Shazam settings |
129 | 148 | shazam_max_rpm: int = field(default=25) |
130 | 149 | shazam_max_concurrent: int = field(default=1) |
131 | 150 | shazam_cooldown_seconds: float = field(default=2.25) |
| 151 | + |
| 152 | + # Output formats |
132 | 153 | output_format: str = field(default="json") |
133 | 154 |
|
| 155 | + # Downloader settings |
| 156 | + download_quality: str = field(default="192") |
| 157 | + download_format: str = field(default="mp3") |
| 158 | + download_max_retries: int = field(default=3) |
| 159 | + |
134 | 160 | def __post_init__(self): |
135 | 161 | """Initialize configuration after dataclass creation.""" |
136 | 162 | # Load environment variables first |
|
0 commit comments