harsh-dev commited on
Commit
83fe205
·
1 Parent(s): fd70500

initial push

Browse files
Dockerfile ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Use HuggingFace Playwright-enabled image
2
+ FROM ghcr.io/huggingface/playwright-python:latest
3
+
4
+ # Set working directory
5
+ WORKDIR /app
6
+
7
+ # Copy all project files
8
+ COPY . /app
9
+
10
+ # Install dependencies
11
+ RUN pip install --no-cache-dir -r requirements.txt
12
+
13
+ # HuggingFace requires port 7860
14
+ EXPOSE 7860
15
+
16
+ # Start FastAPI
17
+ CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "7860"]
main.py ADDED
@@ -0,0 +1,107 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from fastapi import FastAPI
2
+ from fastapi.responses import FileResponse, StreamingResponse
3
+ from ddgs import DDGS
4
+ import json
5
+ from utils import findImages, findVideos, findNews, findBooks, findSearchResults
6
+ from fastapi.middleware.cors import CORSMiddleware
7
+ import os
8
+ from io import BytesIO
9
+ from playwright.sync_api import sync_playwright
10
+
11
+ app = FastAPI()
12
+
13
+ app.add_middleware(
14
+ CORSMiddleware,
15
+ allow_origins=["*"], # Allow all origins
16
+ allow_credentials=True,
17
+ allow_methods=["*"], # Allow all HTTP methods (GET, POST, etc.)
18
+ allow_headers=["*"], # Allow all headers
19
+ )
20
+
21
+ @app.get("/")
22
+ def read_root():
23
+ return {"message": "Hello, World!"}
24
+
25
+ @app.get("/search")
26
+ def search(
27
+ query: str,
28
+ region: str = "us-en",
29
+ safesearch: str = "moderate",
30
+ timelimit: str | None = None,
31
+ max_results: int | None = 10,
32
+ page: int = 1,
33
+ backend: str = "auto"
34
+ ):
35
+ results = findSearchResults(query, region, safesearch, timelimit, max_results, page, backend)
36
+ return results
37
+
38
+ @app.get("/images")
39
+ def images(
40
+ query: str,
41
+ region: str = "us-en",
42
+ safesearch: str = "moderate",
43
+ timelimit: str | None = None,
44
+ max_results: int | None = 10,
45
+ page: int = 1,
46
+ backend: str = "auto",
47
+ size: str | None = None,
48
+ color: str | None = None,
49
+ type_image: str | None = None,
50
+ layout: str | None = None,
51
+ license_image: str | None = None,
52
+ ):
53
+ results = findImages(query, region, safesearch, timelimit, max_results, page, backend, size, color, type_image, layout, license_image)
54
+ return results
55
+
56
+ @app.get("/videos")
57
+ def videos(
58
+ query: str,
59
+ region: str = "us-en",
60
+ safesearch: str = "moderate",
61
+ timelimit: str | None = None,
62
+ max_results: int | None = 10,
63
+ page: int = 1,
64
+ backend: str = "auto",
65
+ resolution: str | None = None,
66
+ duration: str | None = None,
67
+ license_videos: str | None = None,
68
+ ):
69
+ results = findVideos(query, region, safesearch, timelimit, max_results, page, backend, resolution, duration, license_videos)
70
+ return results
71
+
72
+ @app.get("/news")
73
+ def news(
74
+ query: str,
75
+ region: str = "us-en",
76
+ safesearch: str = "moderate",
77
+ timelimit: str | None = None,
78
+ max_results: int | None = 10,
79
+ page: int = 1,
80
+ backend: str = "auto",
81
+ ):
82
+ results = findNews(query, region, safesearch, timelimit, max_results, page, backend)
83
+ return results
84
+
85
+ @app.get("/books")
86
+ def books(
87
+ query: str,
88
+ max_results: int | None = 10,
89
+ page: int = 1,
90
+ backend: str = "auto",
91
+ ):
92
+ results = findBooks(query, max_results, page, backend)
93
+ return results
94
+
95
+ @app.get("/screenshot")
96
+ def screenshot(url: str):
97
+ with sync_playwright() as p:
98
+ browser = p.chromium.launch(channel="chromium", headless=True) # uses system Chrome
99
+ page = browser.new_page()
100
+ page.goto(url)
101
+ img_bytes = page.screenshot()
102
+ browser.close()
103
+
104
+
105
+ img_data = BytesIO(img_bytes)
106
+ img_data.seek(0)
107
+ return StreamingResponse(img_data, media_type="image/png", headers={"Content-Disposition": "inline; filename=screenshot.png"})
requirements.txt ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ annotated-types==0.7.0
2
+ anyio==4.11.0
3
+ Brotli==1.1.0
4
+ certifi==2025.8.3
5
+ click==8.3.0
6
+ ddgs==9.6.0
7
+ exceptiongroup==1.3.0
8
+ fastapi==0.118.0
9
+ greenlet==3.2.4
10
+ h11==0.16.0
11
+ h2==4.3.0
12
+ hpack==4.1.0
13
+ httpcore==1.0.9
14
+ httpx==0.28.1
15
+ hyperframe==6.1.0
16
+ idna==3.10
17
+ lxml==6.0.2
18
+ playwright==1.55.0
19
+ primp==0.15.0
20
+ pydantic==2.11.9
21
+ pydantic_core==2.33.2
22
+ pyee==13.0.0
23
+ sniffio==1.3.1
24
+ socksio==1.0.0
25
+ starlette==0.48.0
26
+ typing-inspection==0.4.2
27
+ typing_extensions==4.15.0
28
+ uvicorn==0.37.0
utils/__init__.py ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ from .main import findBooks, findImages, findNews, findVideos, findSearchResults
2
+
3
+ __all__ = ["findBooks", "findImages", "findNews", "findVideos", "findSearchResults"]
utils/__pycache__/__init__.cpython-313.pyc ADDED
Binary file (313 Bytes). View file
 
utils/__pycache__/main.cpython-313.pyc ADDED
Binary file (4.2 kB). View file
 
utils/main.py ADDED
@@ -0,0 +1,117 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ from ddgs import DDGS
3
+
4
+ def findSearchResults(
5
+ query: str,
6
+ region: str = "us-en",
7
+ safesearch: str = "moderate",
8
+ timelimit: str | None = None,
9
+ max_results: int | None = 10,
10
+ page: int = 1,
11
+ backend: str = "auto"
12
+ ) -> list[dict[str, str]]:
13
+ # results = DDGS(query, max_results=max_results)
14
+ results = DDGS().text(query, max_results=max_results, region=region, safesearch=safesearch, timelimit=timelimit, page=page, backend=backend)
15
+ for i, result in enumerate(results):
16
+ print(f"{i+1}: {result['title']} - {result['href']}")
17
+ return results
18
+
19
+ def findImages(
20
+ query: str,
21
+ region: str = "us-en",
22
+ safesearch: str = "moderate",
23
+ timelimit: str | None = None,
24
+ max_results: int | None = 10,
25
+ page: int = 1,
26
+ backend: str = "auto",
27
+ size: str | None = None,
28
+ color: str | None = None,
29
+ type_image: str | None = None,
30
+ layout: str | None = None,
31
+ license_image: str | None = None,
32
+ ) -> list[dict[str, str]]:
33
+
34
+ results = DDGS().images(
35
+ query,
36
+ region=region,
37
+ safesearch=safesearch,
38
+ timelimit=timelimit,
39
+ max_results=max_results,
40
+ page=page,
41
+ backend=backend,
42
+ size=size,
43
+ color=color,
44
+ type_image=type_image,
45
+ layout=layout,
46
+ license_image=license_image,
47
+ )
48
+ print(safesearch)
49
+ for i, result in enumerate(results):
50
+ print(f"{i+1}: {result['title']} - {result['image']}")
51
+ return results
52
+
53
+ def findVideos(
54
+ query: str,
55
+ region: str = "us-en",
56
+ safesearch: str = "moderate",
57
+ timelimit: str | None = None,
58
+ max_results: int | None = 10,
59
+ page: int = 1,
60
+ backend: str = "auto",
61
+ resolution: str | None = None,
62
+ duration: str | None = None,
63
+ license_videos: str | None = None,
64
+ ) -> list[dict[str, str]]:
65
+ results = DDGS().videos(
66
+ query,
67
+ region=region,
68
+ safesearch=safesearch,
69
+ timelimit=timelimit,
70
+ max_results=max_results,
71
+ page=page,
72
+ backend=backend,
73
+ resolution=resolution,
74
+ duration=duration,
75
+ license_videos=license_videos,
76
+ )
77
+ for i, result in enumerate(results):
78
+ print(f"{i+1}: {result['title']} - {result['embed_url']}")
79
+ return results
80
+
81
+ def findNews(
82
+ query: str,
83
+ region: str = "us-en",
84
+ safesearch: str = "moderate",
85
+ timelimit: str | None = None,
86
+ max_results: int | None = 10,
87
+ page: int = 1,
88
+ backend: str = "auto",
89
+ ) -> list[dict[str, str]]:
90
+ results = DDGS().news(
91
+ query,
92
+ region=region,
93
+ safesearch=safesearch,
94
+ timelimit=timelimit,
95
+ max_results=max_results,
96
+ page=page,
97
+ backend=backend,
98
+ )
99
+ for i, result in enumerate(results):
100
+ print(f"{i+1}: {result['title']} - {result['url']}")
101
+ return results
102
+
103
+ def findBooks(
104
+ query: str,
105
+ max_results: int | None = 10,
106
+ page: int = 1,
107
+ backend: str = "auto",
108
+ ) -> list[dict[str, str]]:
109
+ results = DDGS().books(
110
+ query,
111
+ max_results=max_results,
112
+ page=page,
113
+ backend=backend,
114
+ )
115
+ for i, result in enumerate(results):
116
+ print(f"{i+1}: {result['title']} - {result['url']}")
117
+ return results