travelling-agent / image_searcher.py
MUHAMMAD YOUSAF RANA
initial files uploaded
1626f55
# image_searcher.py
import requests
import random
from typing import List, Dict, Optional
class ImageSearcher:
def __init__(self, pexels_api_key: str):
self.pexels_api_key = pexels_api_key
self.headers = {
'Authorization': self.pexels_api_key,
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
}
def search_pexels(self, query: str, num_images: int = 10) -> List[Dict]:
try:
url = "https://api.pexels.com/v1/search"
params = {
'query': query,
'per_page': min(num_images, 80),
'page': 1
}
response = requests.get(url, params=params, headers=self.headers, timeout=10)
response.raise_for_status()
data = response.json()
images = []
for item in data.get('photos', []):
images.append({
'url': item['src']['medium'],
'thumbnail': item['src']['small'],
'title': item.get('alt', query),
'author': item['photographer'],
'source': 'pexels'
})
print(f"Found {len(images)} images from Pexels for query: {query}")
return images
except Exception as e:
print(f"Pexels search failed for query {query}: {e}")
return []
def search_lorem_picsum(self, query: str, width: int = 400, height: int = 300, num_images: int = 10) -> List[Dict]:
images = []
title_base = f"Pakistan {query}" if query else "Pakistan Travel"
for i in range(num_images):
seed = random.randint(1, 1000)
images.append({
'url': f"https://picsum.photos/{width}/{height}?random={seed}",
'thumbnail': f"https://picsum.photos/200/150?random={seed}",
'title': f"{title_base} View {i+1}",
'author': 'Lorem Picsum',
'source': 'lorem_picsum'
})
print(f"Generated {len(images)} placeholder images for query: {query}")
return images
def search_all_sources(self, queries: List[str], num_images: int = 6) -> List[Dict]:
all_images = []
for query in queries:
if query:
full_query = f"{query} Pakistan"
pexels_images = self.search_pexels(full_query, num_images)
all_images.extend(pexels_images)
if len(all_images) >= num_images: break
if len(all_images) < num_images:
for query in queries:
if query and not any(f"{query} Pakistan" in q for q in [img['title'] for img in all_images]):
pexels_images = self.search_pexels(query, num_images - len(all_images))
all_images.extend(pexels_images)
if len(all_images) >= num_images: break
if len(all_images) < num_images:
print(f"Insufficient results, generating placeholders.")
placeholder_images = self.search_lorem_picsum(queries[0] if queries else '', num_images=num_images - len(all_images))
all_images.extend(placeholder_images)
return all_images[:num_images]
def create_image_queries(travel_data: Dict, destination: Optional[str]) -> List[str]:
queries = []
location_type = travel_data.get("location_type", "").lower() if travel_data.get("location_type") != "Other" else ""
province = travel_data.get("province", "").lower().replace("-", " ") if travel_data.get("province") else ""
preferences = travel_data.get("preferences", [])
preference_map = {
"Cultural Experience": "culture", "Food and Dining": "food",
"Shopping": "market", "Nature": "nature", "History": "historical"
}
pref_terms = [preference_map.get(pref, pref.lower()) for pref in preferences if pref in preference_map]
if destination and destination != "Suggested Destination": queries.append(destination)
if destination and destination != "Suggested Destination" and location_type: queries.append(f"{destination} {location_type}")
if destination and destination != "Suggested Destination" and pref_terms: queries.append(f"{destination} {' '.join(pref_terms)}")
if destination and destination != "Suggested Destination" and location_type and pref_terms: queries.append(f"{destination} {location_type} {' '.join(pref_terms)}")
if province and location_type: queries.append(f"{province} {location_type}")
if province and pref_terms: queries.append(f"{province} {' '.join(pref_terms)}")
if province: queries.append(province)
if location_type and pref_terms: queries.append(f"{location_type} {' '.join(pref_terms)}")
if location_type: queries.append(location_type)
queries = list(dict.fromkeys([q for q in queries if q]))
if not queries: queries.append("Pakistan travel")
print(f"Created image search queries: {queries}")
return queries
def extract_destination(plan_text: str, travel_data: Dict) -> Optional[str]:
lines = plan_text.split('\n')
for line in lines:
if line.strip().startswith('- Destination:'):
parts = line.split(':', 1)
if len(parts) > 1:
destination = parts[1].strip()
print(f"Extracted destination from plan: {destination}")
return destination
if travel_data.get("destination"): return travel_data["destination"]
if travel_data.get("additional_preferences"): return " ".join(travel_data["additional_preferences"].split()[:3])
if travel_data.get("province"): return travel_data["province"]
return None