|
import subprocess |
|
import sys |
|
import asyncio |
|
from .async_logger import AsyncLogger, LogLevel |
|
|
|
|
|
logger = AsyncLogger(log_level=LogLevel.DEBUG, verbose=True) |
|
|
|
def post_install(): |
|
"""Run all post-installation tasks""" |
|
logger.info("Running post-installation setup...", tag="INIT") |
|
install_playwright() |
|
run_migration() |
|
logger.success("Post-installation setup completed!", tag="COMPLETE") |
|
|
|
def install_playwright(): |
|
logger.info("Installing Playwright browsers...", tag="INIT") |
|
try: |
|
|
|
subprocess.check_call([sys.executable, "-m", "playwright", "install", "--with-deps", "--force", "chromium"]) |
|
logger.success("Playwright installation completed successfully.", tag="COMPLETE") |
|
except subprocess.CalledProcessError as e: |
|
|
|
logger.warning(f"Please run '{sys.executable} -m playwright install --with-deps' manually after the installation.") |
|
except Exception as e: |
|
|
|
logger.warning(f"Please run '{sys.executable} -m playwright install --with-deps' manually after the installation.") |
|
|
|
def run_migration(): |
|
"""Initialize database during installation""" |
|
try: |
|
logger.info("Starting database initialization...", tag="INIT") |
|
from crawl4ai.async_database import async_db_manager |
|
|
|
asyncio.run(async_db_manager.initialize()) |
|
logger.success("Database initialization completed successfully.", tag="COMPLETE") |
|
except ImportError: |
|
logger.warning("Database module not found. Will initialize on first use.") |
|
except Exception as e: |
|
logger.warning(f"Database initialization failed: {e}") |
|
logger.warning("Database will be initialized on first use") |
|
|
|
async def run_doctor(): |
|
"""Test if Crawl4AI is working properly""" |
|
logger.info("Running Crawl4AI health check...", tag="INIT") |
|
try: |
|
from .async_webcrawler import AsyncWebCrawler, BrowserConfig, CrawlerRunConfig, CacheMode |
|
|
|
browser_config = BrowserConfig( |
|
headless=True, |
|
browser_type="chromium", |
|
ignore_https_errors=True, |
|
light_mode=True, |
|
viewport_width=1280, |
|
viewport_height=720 |
|
) |
|
|
|
run_config = CrawlerRunConfig( |
|
cache_mode=CacheMode.BYPASS, |
|
screenshot=True, |
|
) |
|
|
|
async with AsyncWebCrawler(config=browser_config) as crawler: |
|
logger.info("Testing crawling capabilities...", tag="TEST") |
|
result = await crawler.arun( |
|
url="https://crawl4ai.com", |
|
config=run_config |
|
) |
|
|
|
if result and result.markdown: |
|
logger.success("β
Crawling test passed!", tag="COMPLETE") |
|
return True |
|
else: |
|
raise Exception("Failed to get content") |
|
|
|
except Exception as e: |
|
logger.error(f"β Test failed: {e}", tag="ERROR") |
|
return False |
|
|
|
def doctor(): |
|
"""Entry point for the doctor command""" |
|
import asyncio |
|
return asyncio.run(run_doctor()) |
|
|