charantejapolavarapu commited on
Commit
1ce10f8
·
verified ·
1 Parent(s): 66dccb4

Update src/streamlit_app.py

Browse files
Files changed (1) hide show
  1. src/streamlit_app.py +80 -69
src/streamlit_app.py CHANGED
@@ -1,4 +1,3 @@
1
- # app.py
2
  import os
3
  import tempfile
4
  import logging
@@ -25,34 +24,27 @@ translator = Translator()
25
  logger = logging.getLogger(__name__)
26
  logger.setLevel(logging.DEBUG)
27
 
28
- # -------------------- Helper Functions --------------------
29
  @st.cache_data(ttl=3600)
30
  def fetch_wikipedia_content(query, lang="en", is_fallback=False):
31
- """
32
- Fetch summary + page URL using the REST summary endpoint first,
33
- then fallback to action=query if needed.
34
- Returns: (summary_text or None, full_url_or_None, actual_lang)
35
- """
36
  if not query:
37
  return None, None, lang
38
 
39
  title = query.strip()
40
  encoded_title = urllib.parse.quote(title, safe="")
41
 
42
- # REST summary endpoint (preferred)
43
  rest_url = f"https://{lang}.wikipedia.org/api/rest_v1/page/summary/{encoded_title}"
44
  try:
45
  resp = requests.get(rest_url, headers=WIKIMEDIA_HEADERS, timeout=REQUEST_TIMEOUT)
46
  resp.raise_for_status()
47
  j = resp.json()
48
- summary = j.get("extract") or j.get("description") or None
49
  full_url = j.get("content_urls", {}).get("desktop", {}).get("page")
50
  if summary:
51
  return summary, full_url, lang
52
  except Exception as e:
53
- logger.debug("REST summary failed: %s", e)
54
 
55
- # Fallback to action=query API if REST didn't yield a summary
56
  try:
57
  api = f"https://{lang}{WIKIPEDIA_API_BASE_URL_PREFIX}"
58
  params = {
@@ -68,23 +60,49 @@ def fetch_wikipedia_content(query, lang="en", is_fallback=False):
68
  }
69
  res = requests.get(api, params=params, headers=WIKIMEDIA_HEADERS, timeout=REQUEST_TIMEOUT)
70
  res.raise_for_status()
71
- data = res.json().get("query", {}).get("pages", [])
72
- if data:
73
- page = data[0] if isinstance(data, list) else next(iter(data.values()))
74
- if not page.get("missing", False):
75
- summary = page.get("extract")
76
- full_url = page.get("fullurl")
77
- if summary:
78
- return summary, full_url, lang
79
  except Exception as e:
80
- logger.debug("Query API fallback failed: %s", e)
81
 
82
  if not is_fallback and lang != "en":
83
  return fetch_wikipedia_content(query, lang="en", is_fallback=True)
84
 
85
  return None, None, lang
86
 
87
- # -------------------- Narration Function --------------------
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
88
  def narrate_text(text, lang_code):
89
  try:
90
  clean = text.strip().replace("\n", " ")
@@ -97,68 +115,61 @@ def narrate_text(text, lang_code):
97
  tts.save(fp.name)
98
  audio_path = fp.name
99
 
100
- st.success("📣 Narration ready! Click Play below:")
101
  st.audio(audio_path, format="audio/mp3")
102
  except Exception as e:
103
- st.error(f"🔇 Narration error: {e}")
104
 
105
- # -------------------- Translation Function --------------------
106
  def translate_summary(text, target_lang):
107
  try:
108
- result = translator.translate(text, target_lang)
109
- return result.result
110
- except Exception as e:
111
- st.warning(f"⚠️ Translation failed. Showing original English summary.\n\nError: {e}")
112
  return text
113
 
114
  # -------------------- Streamlit UI --------------------
115
  st.set_page_config(page_title="WikiHealth Navigator", layout="centered")
116
  st.title("🩺 WikiHealth Navigator")
117
- st.markdown("Search health topics using Wikipedia across Indian languages. (No images)")
 
 
 
 
 
 
 
118
 
119
- languages = {"English (English)": "en", "हिन्दी (Hindi)": "hi", "తెలుగు (Telugu)": "te", "தமிழ் (Tamil)": "ta"}
120
  col1, col2 = st.columns([2, 3])
121
  with col1:
122
  selected = st.selectbox("Select Language:", list(languages.keys()))
123
  lang_code = languages[selected]
124
  with col2:
125
- query = st.text_input("Enter a health-related topic:")
126
-
127
- for key in ["summary", "article_url", "actual_lang", "translated_summary"]:
128
- if key not in st.session_state:
129
- st.session_state[key] = None
130
-
131
- if st.button("🔍 Search"):
132
- if query:
133
- with st.spinner(f"Searching '{query}' in {selected}..."):
134
- summary, full_url, actual_lang = fetch_wikipedia_content(query, lang=lang_code)
135
- if summary:
136
- st.session_state.summary = summary
137
- st.session_state.article_url = full_url
138
- st.session_state.actual_lang = actual_lang
139
- if actual_lang != lang_code:
140
- translated = translate_summary(summary, lang_code)
141
- st.session_state.translated_summary = translated
142
- else:
143
- st.session_state.translated_summary = summary
 
144
  else:
145
- st.session_state.summary = None
146
- st.session_state.translated_summary = None
147
- st.warning(f"No summary found for '{query}'.")
148
-
149
- if st.session_state.summary:
150
- st.subheader("📝 Summary")
151
- st.write(st.session_state.translated_summary or st.session_state.summary)
152
-
153
- button_label = {
154
- "en": "🔊 Narrate Summary",
155
- "hi": "सारांश सुनाइए",
156
- "te": "సారాంశాన్ని వివరించండి",
157
- "ta": "சுருக்கமாக விவரிக்கவும்"
158
- }.get(lang_code, "🔊 Narrate Summary")
159
-
160
- if st.button(button_label):
161
- narrate_text(st.session_state.translated_summary or st.session_state.summary, lang_code)
162
-
163
- if st.session_state.article_url:
164
- st.markdown(f"[Read full article on Wikipedia]({st.session_state.article_url})")
 
 
1
  import os
2
  import tempfile
3
  import logging
 
24
  logger = logging.getLogger(__name__)
25
  logger.setLevel(logging.DEBUG)
26
 
27
+ # -------------------- Wikipedia Summary Fetch --------------------
28
  @st.cache_data(ttl=3600)
29
  def fetch_wikipedia_content(query, lang="en", is_fallback=False):
 
 
 
 
 
30
  if not query:
31
  return None, None, lang
32
 
33
  title = query.strip()
34
  encoded_title = urllib.parse.quote(title, safe="")
35
 
 
36
  rest_url = f"https://{lang}.wikipedia.org/api/rest_v1/page/summary/{encoded_title}"
37
  try:
38
  resp = requests.get(rest_url, headers=WIKIMEDIA_HEADERS, timeout=REQUEST_TIMEOUT)
39
  resp.raise_for_status()
40
  j = resp.json()
41
+ summary = j.get("extract") or j.get("description")
42
  full_url = j.get("content_urls", {}).get("desktop", {}).get("page")
43
  if summary:
44
  return summary, full_url, lang
45
  except Exception as e:
46
+ logger.debug("REST failed: %s", e)
47
 
 
48
  try:
49
  api = f"https://{lang}{WIKIPEDIA_API_BASE_URL_PREFIX}"
50
  params = {
 
60
  }
61
  res = requests.get(api, params=params, headers=WIKIMEDIA_HEADERS, timeout=REQUEST_TIMEOUT)
62
  res.raise_for_status()
63
+ pages = res.json().get("query", {}).get("pages", [])
64
+ if pages and not pages[0].get("missing"):
65
+ return pages[0].get("extract"), pages[0].get("fullurl"), lang
 
 
 
 
 
66
  except Exception as e:
67
+ logger.debug("Query API failed: %s", e)
68
 
69
  if not is_fallback and lang != "en":
70
  return fetch_wikipedia_content(query, lang="en", is_fallback=True)
71
 
72
  return None, None, lang
73
 
74
+ # -------------------- Wikipedia Image Fetch --------------------
75
+ @st.cache_data(ttl=3600)
76
+ def fetch_wikipedia_images(query, lang="en", max_images=3):
77
+ if not query:
78
+ return []
79
+
80
+ api = f"https://{lang}.wikipedia.org/w/api.php"
81
+ params = {
82
+ "action": "query",
83
+ "format": "json",
84
+ "prop": "pageimages",
85
+ "piprop": "original",
86
+ "titles": query,
87
+ "redirects": 1
88
+ }
89
+
90
+ try:
91
+ res = requests.get(api, params=params, headers=WIKIMEDIA_HEADERS, timeout=REQUEST_TIMEOUT)
92
+ res.raise_for_status()
93
+ pages = res.json().get("query", {}).get("pages", {})
94
+ images = []
95
+
96
+ for page in pages.values():
97
+ if "original" in page:
98
+ images.append(page["original"]["source"])
99
+
100
+ return images[:max_images]
101
+ except Exception as e:
102
+ logger.debug("Image fetch failed: %s", e)
103
+ return []
104
+
105
+ # -------------------- Narration --------------------
106
  def narrate_text(text, lang_code):
107
  try:
108
  clean = text.strip().replace("\n", " ")
 
115
  tts.save(fp.name)
116
  audio_path = fp.name
117
 
 
118
  st.audio(audio_path, format="audio/mp3")
119
  except Exception as e:
120
+ st.error(f"Narration error: {e}")
121
 
122
+ # -------------------- Translation --------------------
123
  def translate_summary(text, target_lang):
124
  try:
125
+ return translator.translate(text, target_lang).result
126
+ except Exception:
 
 
127
  return text
128
 
129
  # -------------------- Streamlit UI --------------------
130
  st.set_page_config(page_title="WikiHealth Navigator", layout="centered")
131
  st.title("🩺 WikiHealth Navigator")
132
+ st.markdown("Search health topics using Wikipedia (with images & audio)")
133
+
134
+ languages = {
135
+ "English": "en",
136
+ "हिन्दी": "hi",
137
+ "తె��ుగు": "te",
138
+ "தமிழ்": "ta"
139
+ }
140
 
 
141
  col1, col2 = st.columns([2, 3])
142
  with col1:
143
  selected = st.selectbox("Select Language:", list(languages.keys()))
144
  lang_code = languages[selected]
145
  with col2:
146
+ query = st.text_input("Enter a health topic:")
147
+
148
+ if st.button("🔍 Search") and query:
149
+ with st.spinner("Searching Wikipedia..."):
150
+ summary, url, actual_lang = fetch_wikipedia_content(query, lang_code)
151
+
152
+ if summary:
153
+ if actual_lang != lang_code:
154
+ summary = translate_summary(summary, lang_code)
155
+
156
+ st.subheader("📝 Summary")
157
+ st.write(summary)
158
+
159
+ st.subheader("🖼️ Related Images")
160
+ images = fetch_wikipedia_images(query, lang_code)
161
+
162
+ if images:
163
+ cols = st.columns(len(images))
164
+ for col, img in zip(cols, images):
165
+ col.image(img, use_container_width=True)
166
  else:
167
+ st.info("No images found.")
168
+
169
+ if st.button("🔊 Narrate Summary"):
170
+ narrate_text(summary, lang_code)
171
+
172
+ if url:
173
+ st.markdown(f"[Read full article on Wikipedia]({url})")
174
+ else:
175
+ st.warning("No information found.")