Three new engine profiles for competitor direct-rate monitoring: - eviivo: HTML scrape via httpx (no JSON API); presence = available, no room count - qbook: QBook/Hotels UK JSON API; availableroom count, skip roomprice=0 (unconfigured rate) - mews: Mews Booking Engine v1 API (unauthenticated); getAvailability + getPricing; proper net/gross split; timezone-aware per property Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
34 lines
1,016 B
Python
34 lines
1,016 B
Python
from .guestline import GuestlineProfile
|
|
from .newbook_scrape import NewbookScrapeProfile
|
|
from .travelclick import TravelClickProfile
|
|
from .directbook import DirectBookProfile
|
|
from .eviivo import EviivoProfile
|
|
from .qbook import QBookProfile
|
|
from .mews import MewsProfile
|
|
from .base import BaseProfile
|
|
|
|
PROFILES = {
|
|
"guestline": GuestlineProfile,
|
|
"newbook_scrape": NewbookScrapeProfile,
|
|
"travelclick": TravelClickProfile,
|
|
"directbook": DirectBookProfile,
|
|
"eviivo": EviivoProfile,
|
|
"qbook": QBookProfile,
|
|
"mews": MewsProfile,
|
|
}
|
|
|
|
|
|
def get_profile(name: str) -> BaseProfile:
|
|
cls = PROFILES.get(name)
|
|
if not cls:
|
|
raise ValueError(f"Unknown engine profile: {name}")
|
|
return cls()
|
|
|
|
|
|
def detect_profile(url: str) -> dict | None:
|
|
"""Given a booking URL, return suggested profile name and extracted params."""
|
|
for name, cls in PROFILES.items():
|
|
result = cls.detect(url)
|
|
if result is not None:
|
|
return {"profile": name, **result}
|
|
return None
|