MoodVerse / app.py
Subayyal's picture
Upload 3 files
e05fb58 verified
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"<style>{f.read()}</style>", 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"<div class='arabic-text'>{verse_data['arabic']}</div>", unsafe_allow_html=True)
col1, col2 = st.columns(2)
if language in ["Bilingual", "English"]:
with col1:
st.markdown("<div class='english-translation'>**English Translation**</div>", unsafe_allow_html=True)
st.markdown(f"<div class='english-translation'>{verse_data['english_translation']}</div>", unsafe_allow_html=True)
st.markdown("<div class='english-tafseer'>**English Tafseer**</div>", unsafe_allow_html=True)
st.markdown(f"<div class='english-tafseer'>{verse_data['english_tafseer']}</div>", unsafe_allow_html=True)
if language in ["Bilingual", "Urdu"]:
with col2:
st.markdown("<div class='urdu-translation'>**اردو ترجمہ**</div>", unsafe_allow_html=True)
st.markdown(f"<div class='urdu-translation'>{verse_data['urdu_translation']}</div>", unsafe_allow_html=True)
st.markdown("<div class='urdu-tafseer'>**اردو تفسیر**</div>", unsafe_allow_html=True)
st.markdown(f"<div class='urdu-tafseer'>{verse_data['urdu_tafseer']}</div>", 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"<div class='arabic-text'>{saved['arabic']}</div>", 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()