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"
{verse_data['arabic']}
", unsafe_allow_html=True) col1, col2 = st.columns(2) if language in ["Bilingual", "English"]: with col1: st.markdown("
**English Translation**
", unsafe_allow_html=True) st.markdown(f"
{verse_data['english_translation']}
", unsafe_allow_html=True) st.markdown("
**English Tafseer**
", unsafe_allow_html=True) st.markdown(f"
{verse_data['english_tafseer']}
", unsafe_allow_html=True) if language in ["Bilingual", "Urdu"]: with col2: st.markdown("
**اردو ترجمہ**
", unsafe_allow_html=True) st.markdown(f"
{verse_data['urdu_translation']}
", unsafe_allow_html=True) st.markdown("
**اردو تفسیر**
", unsafe_allow_html=True) st.markdown(f"
{verse_data['urdu_tafseer']}
", unsafe_allow_html=True) # Audio playback if verse_data["audio"]: st.audio(verse_data["audio"], format="audio/mp3") # Save verse button if "saved_verses" not in st.session_state: st.session_state.saved_verses = [] if st.button("Save this Verse"): if len(st.session_state.saved_verses) < 10 and verse_data not in st.session_state.saved_verses: st.session_state.saved_verses.append(verse_data) elif len(st.session_state.saved_verses) >= 10: st.warning("You can save up to 10 verses only.") # Display saved verses in expander with st.expander("Saved Verses"): for i, saved in enumerate(st.session_state.saved_verses): st.markdown(f"**Saved {i+1}: {saved['reference']}**") if st.button(f"View {saved['reference']}", key=f"view_{i}"): st.markdown(f"
{saved['arabic']}
", unsafe_allow_html=True) st.write(saved["english_translation"]) st.write(saved["urdu_translation"]) st.write(saved["english_tafseer"]) st.write(saved["urdu_tafseer"]) # Footer st.markdown("---") st.markdown("Data sourced from Al-Quran API and Quran-API on GitHub. Built with Streamlit.") if __name__ == "__main__": main()