| 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()) |
|
|