Wiki_Health_Navigator / src /streamlit_app.py
charantejapolavarapu's picture
Update src/streamlit_app.py
b3d4408 verified
Raw
History Blame Contribute Delete
4.37 kB
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})")