This commit is contained in:
2026-01-01 20:37:27 -08:00
parent f3c79609d8
commit deb05c0d44
35 changed files with 5030 additions and 4879 deletions

View File

@@ -3,7 +3,7 @@ from __future__ import annotations
from abc import ABC, abstractmethod
from dataclasses import dataclass, field
from pathlib import Path
from typing import Any, Dict, List, Optional, Tuple
from typing import Any, Dict, List, Optional, Sequence, Tuple
@dataclass
@@ -53,6 +53,8 @@ class Provider(ABC):
- validate()
"""
URL: Sequence[str] = ()
def __init__(self, config: Optional[Dict[str, Any]] = None):
self.config = config or {}
self.name = self.__class__.__name__.lower()
@@ -107,6 +109,30 @@ class Provider(ABC):
_ = stage_is_last
return False
@classmethod
def url_patterns(cls) -> Tuple[str, ...]:
"""Return normalized URL patterns that this provider handles."""
patterns: List[str] = []
maybe_urls = getattr(cls, "URL", None)
if isinstance(maybe_urls, (list, tuple)):
for entry in maybe_urls:
try:
candidate = str(entry or "").strip().lower()
except Exception:
continue
if candidate:
patterns.append(candidate)
maybe_domains = getattr(cls, "URL_DOMAINS", None)
if isinstance(maybe_domains, (list, tuple)):
for entry in maybe_domains:
try:
candidate = str(entry or "").strip().lower()
except Exception:
continue
if candidate and candidate not in patterns:
patterns.append(candidate)
return tuple(patterns)
class SearchProvider(Provider):
"""Compatibility alias for older code.