| import tempfile |
| import urllib.parse |
| import requests |
| import streamlit as st |
| from gtts import gTTS |
| from translatepy import Translator |
|
|
| |
| REQUEST_TIMEOUT = 20 |
| HEADERS = { |
| "User-Agent": "WikiHealthNavigator/1.0 (educational-project)" |
| } |
| translator = Translator() |
|
|
| |
| @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) |
|
|
| |
| 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 |
|
|
| |
| @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, |
| "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 [] |
|
|
| |
| 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}") |
|
|
| |
| for key in ["summary", "images", "url", "lang"]: |
| if key not in st.session_state: |
| st.session_state[key] = None |
|
|
| |
| 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") |
|
|
| |
| if st.button("🔍 Search") and query: |
| |
| summary, url = fetch_summary(query, lang_code) |
|
|
| |
| if not summary: |
| summary, url = fetch_summary(query, "en") |
|
|
| |
| 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 |
|
|
| |
| 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})") |
|
|