j
This commit is contained in:
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user