| import os |
| import asyncio |
| import aiohttp |
| import random |
| from PIL import Image |
| from io import BytesIO |
| from duckduckgo_search import DDGS |
| import time |
|
|
| |
| IMAGE_DIR = "/tmp/images" |
| os.makedirs(IMAGE_DIR, exist_ok=True) |
| image_nlst=[] |
|
|
| |
| def get_headers(): |
| user_agents = [ |
| "Mozilla/5.0 (Windows NT 10.0; Win64; x64)", |
| "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)", |
| "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:90.0)" |
| ] |
| return {"User-Agent": random.choice(user_agents)} |
|
|
| |
| def is_valid_image(image): |
| width, height = image.size |
| aspect_ratio = round(width / height, 2) |
| return width >= 854 and height >= 480 and abs(aspect_ratio - (16 / 9)) <= 0.2 |
|
|
| |
| async def fetch_image(session, url, name): |
| try: |
| async with session.get(url, timeout=10) as response: |
| content = await response.read() |
| image = Image.open(BytesIO(content)).convert("RGB") |
|
|
| if not is_valid_image(image): |
| return f"Skipped (invalid): {name}" |
|
|
| unique_name = f"{name}_{int(time.time() * 1000)}.jpg" |
| path = os.path.join(IMAGE_DIR, unique_name) |
| image.save(path) |
| return f"Saved: {unique_name}" |
|
|
| except Exception as e: |
| return f"Error: {name} | {e}" |
|
|
| |
| async def search_and_download(session, prompt, sem): |
| async with sem: |
| name = prompt.replace(" ", "_").lower() |
| try: |
| loop = asyncio.get_event_loop() |
| results = await loop.run_in_executor(None, lambda: list(DDGS().images(prompt, max_results=15))) |
| for item in results: |
| url = item.get("image") |
| result = await fetch_image(session, url, name) |
| if "Saved" in result: |
| image_nlst.append(result.lstrip("Saved:")) |
| return result |
| return f"No valid image for: {prompt}" |
| except Exception as e: |
| return f"Search failed for {prompt}: {e}" |
|
|
| |
| async def main(prompts): |
| sem = asyncio.Semaphore(5) |
| async with aiohttp.ClientSession(headers=get_headers()) as session: |
| tasks = [search_and_download(session, prompt, sem) for prompt in prompts] |
| results = await asyncio.gather(*tasks) |
| for res in results: |
| print(res) |
| return image_nlst |
|
|
|
|