Spaces:
Runtime error
Runtime error
import streamlit as st | |
from PIL import Image | |
import os | |
import wikipedia | |
import requests | |
# ===== Session State Initialization ===== | |
if "logged_in" not in st.session_state: | |
st.session_state.logged_in = False | |
if "email" not in st.session_state: | |
st.session_state.email = "" | |
# ===== Static Data ===== | |
USERS = {} | |
UPLOAD_FOLDER = "uploads" | |
if not os.path.exists(UPLOAD_FOLDER): | |
os.makedirs(UPLOAD_FOLDER) | |
STATES = { | |
"Telangana": ["Hyderabad", "Warangal", "Nizamabad", "Karimnagar", "Khammam"], | |
"Maharashtra": ["Mumbai", "Pune", "Nagpur", "Nashik", "Aurangabad"], | |
"Tamil Nadu": ["Chennai", "Coimbatore", "Madurai", "Tiruchirappalli", "Salem"], | |
"Karnataka": ["Bangalore", "Mysore", "Mangalore", "Hubli", "Belgaum"], | |
"Uttar Pradesh": ["Lucknow", "Varanasi", "Agra", "Kanpur", "Allahabad"], | |
"West Bengal": ["Kolkata", "Darjeeling", "Durgapur", "Siliguri", "Asansol"], | |
"Rajasthan": ["Jaipur", "Udaipur", "Jodhpur", "Bikaner", "Ajmer"], | |
"Gujarat": ["Ahmedabad", "Surat", "Vadodara", "Rajkot", "Bhavnagar"], | |
"Andhra Pradesh": ["Visakhapatnam", "Vijayawada", "Guntur", "Tirupati", "Kurnool"], | |
} | |
# ===== Helper Functions ===== | |
def save_uploaded_file(uploaded_file): | |
path = os.path.join(UPLOAD_FOLDER, uploaded_file.name) | |
with open(path, "wb") as f: | |
f.write(uploaded_file.getbuffer()) | |
return path | |
def recognize_place(image_file): | |
name = image_file.name.lower() | |
keywords_map = { | |
"charminar": "Charminar", | |
"taj": "Taj Mahal", | |
"gateway": "Gateway of India", | |
"qutub": "Qutub Minar", | |
"mysore": "Mysore Palace", | |
"hampi": "Hampi", | |
"konark": "Konark Sun Temple", | |
"varanasi": "Varanasi", | |
"madurai": "Meenakshi Temple", | |
"ajanta": "Ajanta Caves", | |
"ellora": "Ellora Caves", | |
} | |
for kw, place in keywords_map.items(): | |
if kw in name: | |
return place | |
return None | |
def fetch_wikipedia_summary(title, lang="en"): | |
try: | |
wikipedia.set_lang(lang) | |
summary = wikipedia.summary(title, sentences=4) | |
return summary | |
except wikipedia.exceptions.DisambiguationError as e: | |
return f"Multiple results found for '{title}': {e.options}" | |
except wikipedia.exceptions.PageError: | |
return f"No Wikipedia page found for '{title}' in selected language." | |
except Exception as e: | |
return f"Error fetching summary: {str(e)}" | |
# ===== Auth Pages ===== | |
def signup(): | |
st.header("π Signup") | |
name = st.text_input("Name") | |
email = st.text_input("Email (Gmail)") | |
contact = st.text_input("Contact Number") | |
if st.button("Sign Up"): | |
if email in USERS: | |
st.error("User already exists, please login.") | |
return | |
USERS[email] = {"name": name, "email": email, "contact": contact} | |
st.success(f"User {name} registered! Please verify OTP sent to your email (simulated).") | |
st.session_state["otp_sent_to"] = email | |
st.session_state["otp_verified"] = False | |
def login(): | |
st.header("π Login") | |
email = st.text_input("Email") | |
if st.button("Send OTP"): | |
if email in USERS: | |
st.session_state["otp_sent_to"] = email | |
st.session_state["otp_verified"] = False | |
st.info("OTP sent (simulated). Please enter OTP below.") | |
else: | |
st.error("Email not found. Please sign up first.") | |
def verify_otp(): | |
st.header("π OTP Verification") | |
otp = st.text_input("Enter OTP (use 1234 for demo)", type="password") | |
if st.button("Verify OTP"): | |
if otp == "1234" and st.session_state.get("otp_sent_to"): | |
st.session_state.logged_in = True | |
st.session_state.email = st.session_state["otp_sent_to"] | |
st.success("OTP verified! Logged in successfully.") | |
else: | |
st.error("Incorrect OTP or no OTP sent.") | |
def logout(): | |
st.session_state.logged_in = False | |
st.session_state.email = "" | |
st.success("Logged out successfully.") | |
# ===== UI Styling ===== | |
st.set_page_config(page_title="Gyana Vedika v2", layout="wide") | |
st.markdown(""" | |
<style> | |
.stButton>button {background-color: #008080; color: white; font-weight: bold; border-radius:10px;} | |
.stTextInput>div>input, .stSelectbox>div>div>select, .stTextArea>div>textarea { | |
border: 2px solid #008080 !important; border-radius: 8px !important; | |
} | |
h1, h2, h3, h4, h5, h6 { | |
color: #004d4d; | |
} | |
</style> | |
""", unsafe_allow_html=True) | |
# ===== Main App Logic ===== | |
if not st.session_state.logged_in: | |
page = st.sidebar.selectbox("Choose", ["Login", "Signup", "Verify OTP"]) | |
if page == "Login": | |
login() | |
elif page == "Signup": | |
signup() | |
else: | |
verify_otp() | |
else: | |
st.sidebar.success(f"Logged in as {st.session_state.email}") | |
if st.sidebar.button("Logout"): | |
logout() | |
st.title("π Gyana Vedika - Cultural Explorer v2") | |
state = st.selectbox("Select State", list(STATES.keys())) | |
district = st.selectbox("Select District", STATES[state]) | |
st.subheader(f"Explore {district}, {state}") | |
uploaded_image = st.file_uploader("Upload an image of a cultural/historical place", type=["png", "jpg", "jpeg"]) | |
recognized_place = None | |
if uploaded_image: | |
st.image(uploaded_image, caption="Uploaded Image", use_column_width=True) | |
recognized_place = recognize_place(uploaded_image) | |
if recognized_place: | |
st.success(f"Recognized Place: {recognized_place}") | |
else: | |
st.warning("Could not recognize place. Try renaming the image file with landmark name, e.g., charminar.jpg") | |
st.markdown("### Or manually enter place name to search info") | |
manual_place = st.text_input("Enter place name") | |
place_to_search = recognized_place or manual_place.strip() | |
if place_to_search: | |
language = st.selectbox("Select Wikipedia summary language", ["English", "Hindi", "Telugu", "Tamil", "Marathi", "Bengali"], key="lang2") | |
lang_codes = {"English": "en", "Hindi": "hi", "Telugu": "te", "Tamil": "ta", "Marathi": "mr", "Bengali": "bn"} | |
lang_code = lang_codes.get(language, "en") | |
with st.spinner(f"Fetching Wikipedia summary for {place_to_search} in {language}..."): | |
summary = fetch_wikipedia_summary(place_to_search, lang=lang_code) | |
st.markdown(f"### Summary of {place_to_search}") | |
st.write(summary) | |
st.markdown("---") | |
st.subheader("Feedback about this place") | |
feedback_text = st.text_area("Share your experience or info about this place") | |
uploaded_images = st.file_uploader("Upload Images", type=["png", "jpg", "jpeg"], accept_multiple_files=True, key="fb_images") | |
uploaded_audio = st.file_uploader("Upload Audio", type=["mp3", "wav"], accept_multiple_files=True, key="fb_audio") | |
uploaded_videos = st.file_uploader("Upload Videos", type=["mp4", "mov", "avi"], accept_multiple_files=True, key="fb_videos") | |
if st.button("Submit Feedback"): | |
feedback_folder = os.path.join(UPLOAD_FOLDER, "feedback") | |
if not os.path.exists(feedback_folder): | |
os.makedirs(feedback_folder) | |
saved_files = [] | |
for file_list in [uploaded_images, uploaded_audio, uploaded_videos]: | |
if file_list: | |
for f in file_list: | |
path = save_uploaded_file(f) | |
saved_files.append(path) | |
st.success("Thank you for your feedback and uploads!") | |