{
"event": "PreToolUse",
"tool_name": "Read",
"tool_input": {
"file_path": "\/var\/www\/dev.campus.systemische-tools.de\/crawler\/src\/infrastructure\/fetchers\/playwright_fetcher.py",
"offset": 28,
"limit": 50
}
}
{
"tool_response": {
"type": "text",
"file": {
"filePath": "\/var\/www\/dev.campus.systemische-tools.de\/crawler\/src\/infrastructure\/fetchers\/playwright_fetcher.py",
"content": "class PlaywrightFetcher(BrowserFetcherPort):\n def __init__(self, browser: Browser) -> None:\n self._browser = browser\n\n async def fetch(\n self,\n url: NormalizedUrl,\n *,\n screenshot: bool = False,\n ) -> BrowserFetchResult:\n context = await self._browser.new_context(user_agent=USER_AGENT)\n page = await context.new_page()\n telemetry = _FetchTelemetry()\n _attach_listeners(page, telemetry)\n start = time.perf_counter()\n try:\n response = await page.goto(url.url, timeout=PLAYWRIGHT_TIMEOUT_SEC * _MS_PER_SECOND)\n html = await page.content()\n status = response.status if response else 0\n final_url = response.url if response else url.url\n headers = _headers_of(response)\n shot = await page.screenshot(full_page=True) if screenshot else None\n dom_size = await page.evaluate(\"document.getElementsByTagName('*').length\")\n finally:\n render_ms = int((time.perf_counter() - start) * _MS_PER_SECOND)\n await context.close()\n return BrowserFetchResult(\n final_url=final_url,\n status_code=status,\n html=html,\n headers=headers,\n js_errors=tuple(telemetry.js_errors + telemetry.console_warnings),\n resources=tuple(telemetry.resources),\n performance=PerformanceMetrics(\n dom_node_count=dom_size,\n render_time_ms=render_ms,\n lcp_ms=None,\n cls=None,\n tbt_ms=None,\n ),\n render_time_ms=render_ms,\n screenshot_png=shot,\n )\n\n @classmethod\n async def create(cls) -> Self:\n playwright = await async_playwright().start()\n browser = await playwright.chromium.launch(headless=True)\n instance = cls(browser)\n instance._playwright = playwright # type: ignore[attr-defined]",
"numLines": 50,
"startLine": 28,
"totalLines": 146
}
}
}