import tempfile import logging import urllib.parse import requests import streamlit as st from gtts import gTTS from translatepy import Translator # -------------------- CONFIG -------------------- REQUEST_TIMEOUT = 20 HEADERS = {'User-Agent': 'WikiHealthNavigator/1.0'} translator = Translator() logging.basicConfig(level=logging.INFO) # -------------------- FETCH SUMMARY -------------------- @st.cache_data(ttl=3600) def fetch_summary(query, lang): if not query: return None, None title = urllib.parse.quote(query.strip()) url = f"https://{lang}.wikipedia.org/api/rest_v1/page/summary/{title}" try: r = requests.get(url, headers=HEADERS, timeout=REQUEST_TIMEOUT) r.raise_for_status() data = r.json() return data.get("extract"), data.get("content_urls", {}).get("desktop", {}).get("page") except Exception: return None, None # -------------------- FETCH IMAGES (EN ONLY – STABLE) -------------------- @st.cache_data(ttl=3600) def fetch_images(query, max_images=3): api = "https://en.wikipedia.org/w/api.php" params = { "action": "query", "format": "json", "prop": "pageimages", "piprop": "original", "titles": query, "redirects": 1 } try: r = requests.get(api, params=params, headers=HEADERS, timeout=REQUEST_TIMEOUT) r.raise_for_status() pages = r.json()["query"]["pages"] images = [] for p in pages.values(): if "original" in p: images.append(p["original"]["source"]) return images[:max_images] except Exception: return [] # -------------------- NARRATION -------------------- def narrate(text, lang): tts = gTTS(text=text, lang=lang) with tempfile.NamedTemporaryFile(delete=False, suffix=".mp3") as f: tts.save(f.name) st.audio(f.name) # -------------------- UI -------------------- st.set_page_config("WikiHealth Navigator", layout="centered") st.title("🩺 WikiHealth Navigator") languages = { "English": "en", "Hindi": "hi", "Telugu": "te", "Tamil": "ta" } lang_name = st.selectbox("Select Language", list(languages.keys())) lang_code = languages[lang_name] query = st.text_input("Enter health topic") search = st.button("🔍 Search") if search and query: with st.spinner("Searching Wikipedia..."): summary, url = fetch_summary(query, lang_code) if not summary and lang_code != "en": summary, url = fetch_summary(query, "en") if summary: if lang_code != "en": summary = translator.translate(summary, lang_code).result st.subheader("📝 Summary") st.write(summary) st.subheader("🖼️ Images") images = fetch_images(query) if images: cols = st.columns(len(images)) for c, img in zip(cols, images): c.image(img, use_container_width=True) else: st.info("No images found.") if st.button("🔊 Narrate"): narrate(summary, lang_code) if url: st.markdown(f"[Read full article]({url})") else: st.error("No data found.")