Desi_clans_booking_alert/monitor/snapshot.py
2026-09-30 15:48:03 +05:30

65 lines
1.7 KiB
Python

"""Page snapshot capture logic."""
from __future__ import annotations
from datetime import datetime
from playwright.sync_api import Error as PlaywrightError, Page
from monitor.models import PageSnapshot, WebsiteConfig
from storage.snapshots import SnapshotStore
def capture_page_snapshot(
page: Page,
website: WebsiteConfig,
load_duration: float,
snapshot_store: SnapshotStore,
timestamp: float,
) -> PageSnapshot:
"""Capture page metadata, HTML, text, and screenshot."""
captured_at = datetime.fromtimestamp(timestamp)
screenshot_path = None
title = ""
visible_text = ""
html = ""
error_parts: list[str] = []
try:
title = page.title()
except PlaywrightError as exc:
error_parts.append(f"title: {exc}")
try:
visible_text = page.inner_text("body")
except PlaywrightError as exc:
error_parts.append(f"visible_text: {exc}")
try:
html = page.content()
except PlaywrightError as exc:
error_parts.append(f"html: {exc}")
try:
screenshot_path = snapshot_store.save_screenshot(
website_id=website.id,
timestamp=captured_at,
image_bytes=page.screenshot(full_page=True),
)
except PlaywrightError as exc:
error_parts.append(f"screenshot: {exc}")
return PageSnapshot(
website_id=website.id,
website_name=website.name,
requested_url=website.url,
final_url=page.url,
timestamp=captured_at,
title=title,
visible_text=visible_text,
html=html,
screenshot_path=screenshot_path,
load_duration=load_duration,
success=len(error_parts) == 0,
error="; ".join(error_parts) if error_parts else None,
)