import tempfile 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 (educational-project)" } translator = Translator() # -------------------- FETCH SUMMARY (SAFE + FALLBACK) -------------------- @st.cache_data(ttl=3600) def fetch_summary(query, lang): try: title = urllib.parse.quote(query.strip()) url = f"https://{lang}.wikipedia.org/api/rest_v1/page/summary/{title}" r = requests.get(url, headers=HEADERS, timeout=REQUEST_TIMEOUT) # Handle missing pages (404 etc.) if r.status_code != 200: return None, None data = r.json() return ( data.get("extract"), data.get("content_urls", {}).get("desktop", {}).get("page") ) except Exception: return None, None # -------------------- FETCH IMAGES (WIKIMEDIA COMMONS – SAFE) -------------------- @st.cache_data(ttl=3600) def fetch_images(query, max_images=4): api = "https://commons.wikimedia.org/w/api.php" params = { "action": "query", "format": "json", "generator": "search", "gsrsearch": query, "gsrlimit": max_images, "gsrnamespace": 6, # File namespace "prop": "imageinfo", "iiprop": "url" } try: r = requests.get(api, params=params, headers=HEADERS, timeout=REQUEST_TIMEOUT) if r.status_code != 200: return [] if "application/json" not in r.headers.get("Content-Type", ""): return [] data = r.json() pages = data.get("query", {}).get("pages", {}) images = [] for page in pages.values(): if "imageinfo" in page: images.append(page["imageinfo"][0]["url"]) return images except Exception: return [] # -------------------- NARRATION -------------------- def narrate(text, lang): try: tts = gTTS(text=text, lang=lang) with tempfile.NamedTemporaryFile(delete=False, suffix=".mp3") as f: tts.save(f.name) st.audio(f.name) except Exception as e: st.error(f"Audio error: {e}") # -------------------- SESSION STATE INIT -------------------- for key in ["summary", "images", "url", "lang"]: if key not in st.session_state: st.session_state[key] = None # -------------------- UI -------------------- st.set_page_config(page_title="WikiHealth Navigator", layout="centered") st.title("🩺 WikiHealth Navigator") st.markdown( "Health topic search using **Wikipedia** text and " "**** images" ) 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 -------------------- if st.button("🔍 Search") and query: # 1️⃣ Try selected language summary, url = fetch_summary(query, lang_code) # 2️⃣ Fallback to English if page not found if not summary: summary, url = fetch_summary(query, "en") # 3️⃣ Translate English → selected language if summary and lang_code != "en": summary = translator.translate(summary, lang_code).result st.session_state.summary = summary st.session_state.images = fetch_images(query) st.session_state.url = url st.session_state.lang = lang_code # -------------------- DISPLAY -------------------- if st.session_state.summary: st.subheader("📝 Summary") st.write(st.session_state.summary) st.subheader("🖼️ Related Images") if st.session_state.images: cols = st.columns(len(st.session_state.images)) for col, img in zip(cols, st.session_state.images): col.image(img, use_container_width=True) else: st.info("Images temporarily unavailable. Please try again.") if st.button("🔊 Narrate Summary"): narrate(st.session_state.summary, st.session_state.lang) if st.session_state.url: st.markdown(f"[Read full article on Wikipedia]({st.session_state.url})")