1 # Web search functionality for NovaChat 2 from duckduckgo_search import DDGS 3 4 from duckduckgo_search import DDGS 5 from googlesearch import search 6 from typing import List 7 8 9 def fetch_ddg(query, max_results=5): 10 """Perform DuckDuckGo search returning titles and URLs""" 11 try: 12 with DDGS() as ddgs: 13 return [{"title": r['title'], "url": r['href']} 14 for r in ddgs.text(query, max_results=max_results)] 15 except Exception as e: 16 return [{"error": str(e)}] 17 18 19 def fetch_google(query, num_results=5): 20 """Perform Google search returning titles and URLs""" 21 try: 22 return [{"title": result, "url": result} 23 for result in search(query, num=num_results, stop=num_results)] 24 except Exception as e: 25 return [{"error": str(e)}] 26 27 def fetch_torrents(query: str, max_results: int = 5) -> List[str]: 28 items = list(google_search(f"{query} torrent", num_results=max_results)) 29 results = [] 30 for item in items[:max_results]: 31 url = item.get("href") 32 title, snippet = scrape_page(url) 33 results.append(f"{title}\n{snippet}\n{url}") 34 return results 35 36 # Example usage (can be removed or moved) 37 if __name__ == '__main__': 38 search_query = "python web frameworks" 39 ddg_results = fetch_ddg(search_query) 40 print(f"DuckDuckGo results for '{search_query}':") 41 for i, result in enumerate(ddg_results): 42 if 'error' in result: 43 print(f"Error: {result['error']}") 44 break 45 if 'message' in result: 46 print(result['message']) 47 break 48 print(f"{i+1}. {result['title']}") 49 print(f" Link: {result['link']}") 50 print(f" Snippet: {result['snippet'][:100]}...") 51 print("---")