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})")