Webscout-API / app.py
KingNish's picture
Update app.py
e6162d3 verified
from fastapi import FastAPI, HTTPException
from fastapi.responses import JSONResponse
from webscout import WEBS, transcriber
from typing import Optional
from fastapi.encoders import jsonable_encoder
app = FastAPI()
@app.get("/")
async def root():
return {"message": "API documentation can be found at /docs"}
@app.get("/health")
async def health_check():
return {"status": "OK"}
@app.get("/api/search")
async def search(
q: str,
max_results: int = 10,
timelimit: Optional[str] = None,
safesearch: str = "moderate",
region: str = "wt-wt",
backend: str = "api"
):
"""Perform a text search."""
try:
with WEBS() as webs:
results = webs.text(keywords=q, region=region, safesearch=safesearch, timelimit=timelimit, backend=backend, max_results=max_results)
return JSONResponse(content=jsonable_encoder(results))
except Exception as e:
raise HTTPException(status_code=500, detail=f"Error during search: {e}")
@app.get("/api/images")
async def images(
q: str,
max_results: int = 10,
safesearch: str = "moderate",
region: str = "wt-wt",
timelimit: Optional[str] = None,
size: Optional[str] = None,
color: Optional[str] = None,
type_image: Optional[str] = None,
layout: Optional[str] = None,
license_image: Optional[str] = None
):
"""Perform an image search."""
try:
with WEBS() as webs:
results = webs.images(keywords=q, region=region, safesearch=safesearch, timelimit=timelimit, size=size, color=color, type_image=type_image, layout=layout, license_image=license_image, max_results=max_results)
return JSONResponse(content=jsonable_encoder(results))
except Exception as e:
raise HTTPException(status_code=500, detail=f"Error during image search: {e}")
@app.get("/api/videos")
async def videos(
q: str,
max_results: int = 10,
safesearch: str = "moderate",
region: str = "wt-wt",
timelimit: Optional[str] = None,
resolution: Optional[str] = None,
duration: Optional[str] = None,
license_videos: Optional[str] = None
):
"""Perform a video search."""
try:
with WEBS() as webs:
results = webs.videos(keywords=q, region=region, safesearch=safesearch, timelimit=timelimit, resolution=resolution, duration=duration, license_videos=license_videos, max_results=max_results)
return JSONResponse(content=jsonable_encoder(results))
except Exception as e:
raise HTTPException(status_code=500, detail=f"Error during video search: {e}")
@app.get("/api/news")
async def news(
q: str,
max_results: int = 10,
safesearch: str = "moderate",
region: str = "wt-wt",
timelimit: Optional[str] = None
):
"""Perform a news search."""
try:
with WEBS() as webs:
results = webs.news(keywords=q, region=region, safesearch=safesearch, timelimit=timelimit, max_results=max_results)
return JSONResponse(content=jsonable_encoder(results))
except Exception as e:
raise HTTPException(status_code=500, detail=f"Error during news search: {e}")
@app.get("/api/answers")
async def answers(q: str):
"""Get instant answers for a query."""
try:
with WEBS() as webs:
results = webs.answers(keywords=q)
return JSONResponse(content=jsonable_encoder(results))
except Exception as e:
raise HTTPException(status_code=500, detail=f"Error getting instant answers: {e}")
@app.get("/api/suggestions")
async def suggestions(q: str, region: str = "wt-wt"):
"""Get search suggestions for a query."""
try:
with WEBS() as webs:
results = webs.suggestions(keywords=q, region=region)
return JSONResponse(content=jsonable_encoder(results))
except Exception as e:
raise HTTPException(status_code=500, detail=f"Error getting search suggestions: {e}")
@app.get("/api/chat")
async def chat(
q: str,
model: str = "gpt-3.5"
):
"""Perform a text search."""
try:
with WEBS() as webs:
results = webs.chat(keywords=q, model=model)
return JSONResponse(content=jsonable_encoder(results))
except Exception as e:
raise HTTPException(status_code=500, detail=f"Error getting chat results: {e}")
@app.get("/api/maps")
async def maps(
q: str,
place: Optional[str] = None,
street: Optional[str] = None,
city: Optional[str] = None,
county: Optional[str] = None,
state: Optional[str] = None,
country: Optional[str] = None,
postalcode: Optional[str] = None,
latitude: Optional[str] = None,
longitude: Optional[str] = None,
radius: int = 0,
max_results: int = 10
):
"""Perform a maps search."""
try:
with WEBS() as webs:
results = webs.maps(keywords=q, place=place, street=street, city=city, county=county, state=state, country=country, postalcode=postalcode, latitude=latitude, longitude=longitude, radius=radius, max_results=max_results)
return JSONResponse(content=jsonable_encoder(results))
except Exception as e:
raise HTTPException(status_code=500, detail=f"Error during maps search: {e}")
@app.get("/api/translate")
async def translate(
q: str,
from_: Optional[str] = None,
to: str = "en"
):
"""Translate text."""
try:
with WEBS() as webs:
results = webs.translate(keywords=q, from_=from_, to=to)
return JSONResponse(content=jsonable_encoder(results))
except Exception as e:
raise HTTPException(status_code=500, detail=f"Error during translation: {e}")
@app.get("/api/youtube/transcript")
async def youtube_transcript(
video_id: str,
languages: str = "en",
preserve_formatting: bool = False
):
"""Get the transcript of a YouTube video."""
try:
languages_list = languages.split(",")
transcript = transcriber.get_transcript(video_id, languages=languages_list, preserve_formatting=preserve_formatting)
return JSONResponse(content=jsonable_encoder(transcript))
except Exception as e:
raise HTTPException(status_code=500, detail=f"Error getting YouTube transcript: {e}")
import requests
@app.get("/weather/json/{location}")
def get_weather_json(location: str):
url = f"https://wttr.in/{location}?format=j1"
response = requests.get(url)
if response.status_code == 200:
return response.json()
else:
return {"error": f"Unable to fetch weather data. Status code: {response.status_code}"}
@app.get("/weather/ascii/{location}")
def get_ascii_weather(location: str):
url = f"https://wttr.in/{location}"
response = requests.get(url, headers={'User-Agent': 'curl'})
if response.status_code == 200:
return response.text
else:
return {"error": f"Unable to fetch weather data. Status code: {response.status_code}"}
# Run the API server if this script is executed
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8080)