|
|
import streamlit as st |
|
|
import requests |
|
|
import json |
|
|
import random |
|
|
import os |
|
|
from bs4 import BeautifulSoup |
|
|
from urllib.parse import quote |
|
|
|
|
|
|
|
|
st.set_page_config(page_title="MoodVerse", layout="wide") |
|
|
|
|
|
|
|
|
def load_css(): |
|
|
with open("style.css") as f: |
|
|
st.markdown(f"<style>{f.read()}</style>", unsafe_allow_html=True) |
|
|
|
|
|
load_css() |
|
|
|
|
|
|
|
|
@st.cache_data |
|
|
def load_mood_verses(): |
|
|
with open("mood_verses.json", "r", encoding="utf-8") as f: |
|
|
return json.load(f) |
|
|
|
|
|
|
|
|
@st.cache_data(ttl=3600) |
|
|
def fetch_verse_data(reference): |
|
|
try: |
|
|
surah, ayat = reference.split(":") |
|
|
|
|
|
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"] |
|
|
|
|
|
|
|
|
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"] |
|
|
|
|
|
|
|
|
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 |
|
|
|
|
|
|
|
|
def main(): |
|
|
|
|
|
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).") |
|
|
|
|
|
|
|
|
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"]) |
|
|
|
|
|
|
|
|
if st.sidebar.button("Random Mood"): |
|
|
selected_mood = random.choice(moods) |
|
|
|
|
|
|
|
|
mood_verses = load_mood_verses() |
|
|
verses = mood_verses.get(selected_mood.lower(), []) |
|
|
|
|
|
if not verses: |
|
|
st.warning("No verses found for this mood.") |
|
|
return |
|
|
|
|
|
|
|
|
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: |
|
|
|
|
|
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) |
|
|
|
|
|
|
|
|
if verse_data["audio"]: |
|
|
st.audio(verse_data["audio"], format="audio/mp3") |
|
|
|
|
|
|
|
|
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.") |
|
|
|
|
|
|
|
|
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"]) |
|
|
|
|
|
|
|
|
st.markdown("---") |
|
|
st.markdown("Data sourced from Al-Quran API and Quran-API on GitHub. Built with Streamlit.") |
|
|
|
|
|
if __name__ == "__main__": |
|
|
main() |