wcrawler / main.py
harsh-dev's picture
initial push
83fe205
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"})