import subprocess import sys import asyncio from .async_logger import AsyncLogger, LogLevel # Initialize logger 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", "chrome"]) 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.error(f"Error during Playwright installation: {e}", tag="ERROR") logger.warning(f"Please run '{sys.executable} -m playwright install --with-deps' manually after the installation.") except Exception as e: # logger.error(f"Unexpected error during Playwright installation: {e}", tag="ERROR") 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())