File size: 4,368 Bytes
734cef4 f3a40eb 734cef4 f61cc32 30bf4b5 b3d4408 30bf4b5 734cef4 b3d4408 734cef4 f61cc32 30bf4b5 b3d4408 30bf4b5 b3d4408 30bf4b5 b3d4408 1ce10f8 cef0164 1ce10f8 cef0164 30bf4b5 cef0164 1ce10f8 30bf4b5 b3d4408 30bf4b5 1ce10f8 f61cc32 30bf4b5 b3d4408 cef0164 f61cc32 b3d4408 21941a3 30bf4b5 b3d4408 30bf4b5 1ce10f8 30bf4b5 1ce10f8 734cef4 f61cc32 1ce10f8 f61cc32 30bf4b5 cef0164 b3d4408 cef0164 f61cc32 b3d4408 cef0164 1ce10f8 b3d4408 1ce10f8 cef0164 1ce10f8 30bf4b5 cef0164 1ce10f8 cef0164 b3d4408 cef0164 30bf4b5 1ce10f8 cef0164 1ce10f8 cef0164 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 | 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})")
|