import streamlit as st import requests import json import random import os from bs4 import BeautifulSoup from urllib.parse import quote # Set page config for wide layout and title st.set_page_config(page_title="MoodVerse", layout="wide") # Load custom CSS def load_css(): with open("style.css") as f: st.markdown(f"", unsafe_allow_html=True) load_css() # Load mood-to-verse mapping from JSON @st.cache_data def load_mood_verses(): with open("mood_verses.json", "r", encoding="utf-8") as f: return json.load(f) # Fetch verse data from APIs @st.cache_data(ttl=3600) # Cache for 1 hour def fetch_verse_data(reference): try: surah, ayat = reference.split(":") # Fetch from Al-Quran API for Arabic, English, Urdu translations, and audio url = f"http://api.alquran.cloud/v1/ayah/{quote(reference)}" response = requests.get(url, timeout=5) response.raise_for_status() data = response.json()["data"] english_url = f"http://api.alquran.cloud/v1/ayah/{quote(reference)}/en.sahih" urdu_url = f"http://api.alquran.cloud/v1/ayah/{quote(reference)}/ur.jalandhry" english_data = requests.get(english_url, timeout=5).json()["data"] urdu_data = requests.get(urdu_url, timeout=5).json()["data"] audio_url = f"http://api.alquran.cloud/v1/ayah/{quote(reference)}/ar.alafasy" audio_data = requests.get(audio_url, timeout=5).json()["data"] # Fetch English Tafseer from quran-api (Maududi) eng_tafseer_url = f"https://cdn.jsdelivr.net/gh/fawazahmed0/quran-api@1/editions/eng-maududi/{surah}/{ayat}.json" eng_tafseer_response = requests.get(eng_tafseer_url, timeout=5) eng_tafseer_data = eng_tafseer_response.json() tafseer_english = eng_tafseer_data["text"] # Fetch Urdu Tafseer from quran-api (Maududi) urd_tafseer_url = f"https://cdn.jsdelivr.net/gh/fawazahmed0/quran-api@1/editions/urd-maududi/{surah}/{ayat}.json" urd_tafseer_response = requests.get(urd_tafseer_url, timeout=5) urd_tafseer_data = urd_tafseer_response.json() tafseer_urdu = urd_tafseer_data["text"] return { "reference": data["surah"]["englishName"] + " (" + data["surah"]["name"] + "), Ayat " + str(data["numberInSurah"]), "arabic": data["text"], "english_translation": english_data["text"], "urdu_translation": urdu_data["text"], "english_tafseer": tafseer_english, "urdu_tafseer": tafseer_urdu, "audio": audio_data["audio"] } except Exception as e: st.error(f"Failed to fetch verse data: {str(e)}") return None # Main app def main(): # Display logo and title st.image("https://cdn.pixabay.com/photo/2017/03/27/13/59/quran-2178816_1280.png", width=200) st.title("MoodVerse") st.markdown("Discover peace and guidance from the Holy Quran. Select a mood to receive a random uplifting verse or dua, complete with Arabic text, translations in English and Urdu, and explanations (tafseer).") # Sidebar for mood selection and language toggle st.sidebar.header("Select a Mood") moods = [ "Angry", "Happy", "Depressed", "Sick", "Tired", "Frustrated", "Evil Eye", "Indecisive", "Proud", "Aggressive", "Lonely", "Guilty", "Hopeful" ] selected_mood = st.sidebar.radio("Choose a mood", moods) language = st.sidebar.selectbox("Language", ["Bilingual", "English", "Urdu"]) # Random mood button if st.sidebar.button("Random Mood"): selected_mood = random.choice(moods) # Load mood-to-verse mapping mood_verses = load_mood_verses() verses = mood_verses.get(selected_mood.lower(), []) if not verses: st.warning("No verses found for this mood.") return # Generate random verse on mood selection or button press if "selected_mood" not in st.session_state: st.session_state.selected_mood = selected_mood if "current_verse" not in st.session_state or st.session_state.selected_mood != selected_mood or st.button("Generate Another"): st.session_state.current_verse = random.choice(verses) st.session_state.selected_mood = selected_mood verse_ref = st.session_state.current_verse with st.spinner("Fetching verse data..."): verse_data = fetch_verse_data(verse_ref) if verse_data: # Display verse st.markdown(f"### {verse_data['reference']}") st.markdown(f"