from fastapi import FastAPI from fastapi.responses import FileResponse, StreamingResponse from ddgs import DDGS import json from utils import findImages, findVideos, findNews, findBooks, findSearchResults from fastapi.middleware.cors import CORSMiddleware import os from io import BytesIO from playwright.sync_api import sync_playwright app = FastAPI() app.add_middleware( CORSMiddleware, allow_origins=["*"], # Allow all origins allow_credentials=True, allow_methods=["*"], # Allow all HTTP methods (GET, POST, etc.) allow_headers=["*"], # Allow all headers ) @app.get("/") def read_root(): return {"message": "Hello, World!"} @app.get("/search") def search( query: str, region: str = "us-en", safesearch: str = "moderate", timelimit: str | None = None, max_results: int | None = 10, page: int = 1, backend: str = "auto" ): results = findSearchResults(query, region, safesearch, timelimit, max_results, page, backend) return results @app.get("/images") def images( query: str, region: str = "us-en", safesearch: str = "moderate", timelimit: str | None = None, max_results: int | None = 10, page: int = 1, backend: str = "auto", size: str | None = None, color: str | None = None, type_image: str | None = None, layout: str | None = None, license_image: str | None = None, ): results = findImages(query, region, safesearch, timelimit, max_results, page, backend, size, color, type_image, layout, license_image) return results @app.get("/videos") def videos( query: str, region: str = "us-en", safesearch: str = "moderate", timelimit: str | None = None, max_results: int | None = 10, page: int = 1, backend: str = "auto", resolution: str | None = None, duration: str | None = None, license_videos: str | None = None, ): results = findVideos(query, region, safesearch, timelimit, max_results, page, backend, resolution, duration, license_videos) return results @app.get("/news") def news( query: str, region: str = "us-en", safesearch: str = "moderate", timelimit: str | None = None, max_results: int | None = 10, page: int = 1, backend: str = "auto", ): results = findNews(query, region, safesearch, timelimit, max_results, page, backend) return results @app.get("/books") def books( query: str, max_results: int | None = 10, page: int = 1, backend: str = "auto", ): results = findBooks(query, max_results, page, backend) return results @app.get("/screenshot") def screenshot(url: str): with sync_playwright() as p: browser = p.chromium.launch(channel="chromium", headless=True) # uses system Chrome page = browser.new_page() page.goto(url) img_bytes = page.screenshot() browser.close() img_data = BytesIO(img_bytes) img_data.seek(0) return StreamingResponse(img_data, media_type="image/png", headers={"Content-Disposition": "inline; filename=screenshot.png"})