import gradio as gr import requests from datetime import datetime, timedelta import random # ========================= # 🔑 API Keys # ========================= WEATHER_API_KEY = "3a97c8c63350b72e8439c42e8d371b07" # ========================= # 🇧🇩 Bangladesh Divisions & Districts # ========================= BANGLADESH_LOCATIONS = { "Dhaka Division": [ "Dhaka", "Faridpur", "Gazipur", "Gopalganj", "Kishoreganj", "Madaripur", "Manikganj", "Munshiganj", "Narayanganj", "Narsingdi", "Rajbari", "Shariatpur", "Tangail" ], "Chattogram Division": [ "Chattogram", "Bandarban", "Brahmanbaria", "Chandpur", "Cumilla", "Cox's Bazar", "Feni", "Khagrachhari", "Lakshmipur", "Noakhali", "Rangamati" ], "Rajshahi Division": [ "Rajshahi", "Bogura", "Joypurhat", "Naogaon", "Natore", "Chapainawabganj", "Pabna", "Sirajganj" ], "Khulna Division": [ "Khulna", "Bagerhat", "Chuadanga", "Jessore", "Jhenaidah", "Kushtia", "Magura", "Meherpur", "Narail", "Satkhira" ], "Barishal Division": [ "Barishal", "Barguna", "Bhola", "Jhalokathi", "Patuakhali", "Pirojpur" ], "Sylhet Division": [ "Sylhet", "Habiganj", "Moulvibazar", "Sunamganj" ], "Rangpur Division": [ "Rangpur", "Dinajpur", "Gaibandha", "Kurigram", "Lalmonirhat", "Nilphamari", "Panchagarh", "Thakurgaon" ], "Mymensingh Division": [ "Mymensingh", "Jamalpur", "Netrokona", "Sherpur" ] } # ========================= # đŸ“ŋ 50 Moral Hadiths (English + Bengali) # ========================= HADITHS = [ { "english": "The best among you are those who have the best manners and character.", "bengali": "āϤ⧋āĻŽāĻžāĻĻ⧇āϰ āĻŽāĻ§ā§āϝ⧇ āϏāĻ°ā§āĻŦā§‹āĻ¤ā§āϤāĻŽ āϏ⧇āχ āĻŦā§āϝāĻ•ā§āϤāĻŋ āϝāĻžāϰ āϚāϰāĻŋāĻ¤ā§āϰ āĻ“ āφāϚāϰāĻŖ āϏāĻŦāĻšā§‡āϝāĻŧ⧇ āϏ⧁āĻ¨ā§āĻĻāϰāĨ¤", "reference": "Sahih Bukhari", "happy_message": "Let your beautiful character shine today and spread joy to everyone you meet! 😊", "salam": "As-Salamu Alaikum Wa Rahmatullahi Wa Barakatuh! 🌙" }, { "english": "Kindness is a mark of faith, and whoever is not kind has no faith.", "bengali": "āĻĻāϝāĻŧāĻž āψāĻŽāĻžāύ⧇āϰ āύāĻŋāĻĻāĻ°ā§āĻļāύ, āĻāĻŦāĻ‚ āϝ⧇ āĻĻāϝāĻŧāĻžāϞ⧁ āύāϝāĻŧ āϤāĻžāϰ āψāĻŽāĻžāύ āύ⧇āχāĨ¤", "reference": "Sahih Muslim", "happy_message": "Your kindness can change someone's entire day - be that light! ✨", "salam": "As-Salamu Alaikum! May Allah bless your day! 🤲" }, { "english": "None of you truly believes until he loves for his brother what he loves for himself.", "bengali": "āϤ⧋āĻŽāĻžāĻĻ⧇āϰ āϕ⧇āω āĻĒā§āϰāĻ•ā§ƒāϤ āĻŽā§āĻŽāĻŋāύ āĻšāϤ⧇ āĻĒāĻžāϰāĻŦ⧇ āύāĻž āϝāϤāĻ•ā§āώāĻŖ āύāĻž āϏ⧇ āϤāĻžāϰ āĻ­āĻžāχāϝāĻŧ⧇āϰ āϜāĻ¨ā§āϝ āϤāĻžāχ āĻĒāĻ›āĻ¨ā§āĻĻ āĻ•āϰ⧇ āϝāĻž āύāĻŋāĻœā§‡āϰ āϜāĻ¨ā§āϝ āĻĒāĻ›āĻ¨ā§āĻĻ āĻ•āϰ⧇āĨ¤", "reference": "Sahih Bukhari & Muslim", "happy_message": "Wishing good for others brings blessings to your own life! 🌟", "salam": "As-Salamu Alaikum Wa Rahmatullah! Peace be upon you! đŸ•Šī¸" }, { "english": "A smile for your brother is charity.", "bengali": "āϤ⧋āĻŽāĻžāϰ āĻ­āĻžāχāϝāĻŧ⧇āϰ āϜāĻ¨ā§āϝ āĻšāĻžāϏāĻŋ āĻĻ⧇āĻ–āĻžāύ⧋ āϏāĻĻāĻ•āĻžāĨ¤", "reference": "Tirmidhi", "happy_message": "Your beautiful smile is a gift - share it generously today! 😄", "salam": "As-Salamu Alaikum! Keep smiling and spreading joy! 🌈" }, { "english": "The most beloved to Allah is he who is most beneficial to people.", "bengali": "āφāĻ˛ā§āϞāĻžāĻšāϰ āĻ•āĻžāϛ⧇ āϏāĻŦāĻšā§‡āϝāĻŧ⧇ āĻĒā§āϰāĻŋāϝāĻŧ āϏ⧇āχ āĻŦā§āϝāĻ•ā§āϤāĻŋ āϝ⧇ āĻŽāĻžāύ⧁āώ⧇āϰ āϜāĻ¨ā§āϝ āϏāĻŦāĻšā§‡āϝāĻŧ⧇ āĻŦ⧇āĻļāĻŋ āωāĻĒāĻ•āĻžāϰ⧀āĨ¤", "reference": "Al-Mu'jam Al-Awsat", "happy_message": "Help someone today and feel the joy of making a difference! đŸ’Ģ", "salam": "As-Salamu Alaikum Wa Rahmatullahi Wa Barakatuh! 🌙✨" }, { "english": "Do not belittle any good deed, even meeting your brother with a cheerful face.", "bengali": "āϕ⧋āύ⧋ āĻ­āĻžāϞ⧋ āĻ•āĻžāϜāϕ⧇ āϛ⧋āϟ āĻŽāύ⧇ āĻ•āϰ⧋ āύāĻž, āĻāĻŽāύāĻ•āĻŋ āϤ⧋āĻŽāĻžāϰ āĻ­āĻžāχāϝāĻŧ⧇āϰ āϏāĻžāĻĨ⧇ āĻšāĻžāϏāĻŋāĻŽā§āϖ⧇ āĻĻ⧇āĻ–āĻž āĻ•āϰāĻžāĻ“āĨ¤", "reference": "Sahih Muslim", "happy_message": "Every small act of goodness counts - start with a smile! 😊", "salam": "As-Salamu Alaikum! May your day be filled with goodness! 🌸" }, { "english": "The strong person is not the one who overpowers others, but the one who controls his anger.", "bengali": "āĻļāĻ•ā§āϤāĻŋāĻļāĻžāϞ⧀ āĻŦā§āϝāĻ•ā§āϤāĻŋ āϏ⧇āχ āύāϝāĻŧ āϝ⧇ āĻ…āĻ¨ā§āϝāϕ⧇ āĻĒāϰāĻžāϜāĻŋāϤ āĻ•āϰ⧇, āĻŦāϰāĻ‚ āϏ⧇āχ āϝ⧇ āύāĻŋāĻœā§‡āϰ āĻ•ā§āϰ⧋āϧ āύāĻŋāϝāĻŧāĻ¨ā§āĻ¤ā§āϰāĻŖ āĻ•āϰ⧇āĨ¤", "reference": "Sahih Bukhari & Muslim", "happy_message": "True strength lies in patience and self-control! đŸ’Ē", "salam": "As-Salamu Alaikum Wa Rahmatullah! Stay strong and peaceful! đŸ•Šī¸" }, { "english": "Feed the hungry, visit the sick, and free the captive.", "bengali": "āĻ•ā§āώ⧁āϧāĻžāĻ°ā§āϤāϕ⧇ āĻ–āĻžāĻ“āϝāĻŧāĻžāĻ“, āĻ…āϏ⧁āĻ¸ā§āĻĨāϕ⧇ āĻĻ⧇āĻ–āϤ⧇ āϝāĻžāĻ“ āĻāĻŦāĻ‚ āĻŦāĻ¨ā§āĻĻā§€āϕ⧇ āĻŽā§āĻ•ā§āϤ āĻ•āϰ⧋āĨ¤", "reference": "Sahih Bukhari", "happy_message": "Reach out to those in need - your care matters! 🤲", "salam": "As-Salamu Alaikum! May Allah reward your compassion! 🌟" }, { "english": "Show mercy to those on earth, and He who is in the heavens will show mercy to you.", "bengali": "āĻĒ⧃āĻĨāĻŋāĻŦā§€āϤ⧇ āϝāĻžāϰāĻž āφāϛ⧇ āϤāĻžāĻĻ⧇āϰ āĻĒā§āϰāϤāĻŋ āĻĻāϝāĻŧāĻž āĻ•āϰ⧋, āϤāĻžāĻšāϞ⧇ āφāϏāĻŽāĻžāύ⧇ āϝāĻŋāύāĻŋ āφāϛ⧇āύ āϤāĻŋāύāĻŋ āϤ⧋āĻŽāĻžāϰ āĻĒā§āϰāϤāĻŋ āĻĻāϝāĻŧāĻž āĻ•āϰāĻŦ⧇āύāĨ¤", "reference": "Tirmidhi", "happy_message": "Your mercy today brings divine mercy tomorrow! 🌙", "salam": "As-Salamu Alaikum Wa Rahmatullahi Wa Barakatuh! 💝" }, { "english": "He who does not show mercy to others, will not be shown mercy.", "bengali": "āϝ⧇ āĻ…āĻ¨ā§āϝāĻĻ⧇āϰ āĻĒā§āϰāϤāĻŋ āĻĻāϝāĻŧāĻž āĻ•āϰ⧇ āύāĻž, āϤāĻžāϕ⧇āĻ“ āĻĻāϝāĻŧāĻž āĻ•āϰāĻž āĻšāĻŦ⧇ āύāĻžāĨ¤", "reference": "Sahih Muslim", "happy_message": "Be kind, be merciful - it comes back to you! 🔄", "salam": "As-Salamu Alaikum! Spread mercy and love! â¤ī¸" }, { "english": "Make things easy and do not make them difficult.", "bengali": "āϜāĻŋāύāĻŋāϏāϗ⧁āϞ⧋ āϏāĻšāϜ āĻ•āϰ⧋ āĻāĻŦāĻ‚ āĻ•āĻ āĻŋāύ āĻ•āϰ⧋ āύāĻžāĨ¤", "reference": "Sahih Bukhari", "happy_message": "Life is easier when we help each other! 🤝", "salam": "As-Salamu Alaikum! May Allah make things easy for you! 🌈" }, { "english": "Speak good or remain silent.", "bengali": "āĻ­āĻžāϞ⧋ āĻ•āĻĨāĻž āĻŦāϞ⧋ āĻ…āĻĨāĻŦāĻž āϚ⧁āĻĒ āĻĨāĻžāϕ⧋āĨ¤", "reference": "Sahih Bukhari & Muslim", "happy_message": "Your words have power - use them wisely and kindly! đŸ’Ŧ", "salam": "As-Salamu Alaikum Wa Rahmatullah! Speak with wisdom! đŸ“ŋ" }, { "english": "The believer is not a slanderer, nor obscene, nor harsh.", "bengali": "āĻŽā§āĻŽāĻŋāύ āĻŦā§āϝāĻ•ā§āϤāĻŋ āύāĻŋāĻ¨ā§āĻĻ⧁āĻ• āύāϝāĻŧ, āĻ…āĻļā§āϞ⧀āϞ āύāϝāĻŧ, āĻ•āĻ ā§‹āϰāĻ“ āύāϝāĻŧāĨ¤", "reference": "Sahih Muslim", "happy_message": "Be gentle in your words and actions - it's beautiful! đŸŒē", "salam": "As-Salamu Alaikum! May your character be noble! 👑" }, { "english": "Remove harmful things from the path; this is charity.", "bengali": "āĻĒāĻĨ āĻĨ⧇āϕ⧇ āĻ•ā§āώāϤāĻŋāĻ•āϰ āϜāĻŋāύāĻŋāϏ āϏāϰāĻŋāϝāĻŧ⧇ āĻĻāĻžāĻ“; āĻāϟāĻŋ āϏāĻĻāĻ•āĻžāĨ¤", "reference": "Sahih Bukhari & Muslim", "happy_message": "Small acts of cleanliness bring great rewards! 🧹✨", "salam": "As-Salamu Alaikum! Keep your surroundings clean! đŸŒŋ" }, { "english": "Do not envy one another, do not hate one another, do not turn away from one another.", "bengali": "āĻāϕ⧇ āĻ…āĻĒāϰāϕ⧇ āĻšāĻŋāĻ‚āϏāĻž āĻ•āϰ⧋ āύāĻž, āϘ⧃āĻŖāĻž āĻ•āϰ⧋ āύāĻž, āĻāϕ⧇ āĻ…āĻĒāϰ āĻĨ⧇āϕ⧇ āĻŽā§āĻ– āĻĢāĻŋāϰāĻŋāϝāĻŧ⧇ āύāĻŋāĻ“ āύāĻžāĨ¤", "reference": "Sahih Muslim", "happy_message": "Celebrate others' success - there's enough blessings for everyone! 🎉", "salam": "As-Salamu Alaikum Wa Rahmatullahi Wa Barakatuh! 💖" }, ] # ========================= # 🕌 Get Real Prayer Times from Aladhan API # ========================= def get_prayer_times(city): """Get real-time prayer times using Aladhan API for Bangladesh""" try: # Get current date today = datetime.now() date_str = today.strftime("%d-%m-%Y") # Aladhan API endpoint for city-based timings url = f"http://api.aladhan.com/v1/timingsByCity/{date_str}" params = { "city": city, "country": "Bangladesh", "method": 2 # ISNA (Islamic Society of North America) } response = requests.get(url, params=params, timeout=10) data = response.json() if data.get("code") == 200 and data.get("data"): timings = data["data"]["timings"] # Extract prayer times fajr = timings.get("Fajr", "N/A") dhuhr = timings.get("Dhuhr", "N/A") asr = timings.get("Asr", "N/A") maghrib = timings.get("Maghrib", "N/A") isha = timings.get("Isha", "N/A") sunrise = timings.get("Sunrise", "N/A") sunset = timings.get("Sunset", "N/A") # For Ramadan: Sehri ends at Fajr, Iftar starts at Maghrib return { "fajr": fajr, "sehri_end": fajr, # Sehri ends at Fajr "sunrise": sunrise, "dhuhr": dhuhr, "asr": asr, "maghrib": maghrib, "iftar_start": maghrib, # Iftar starts at Maghrib "sunset": sunset, "isha": isha, "success": True } else: return {"success": False} except Exception as e: print(f"Prayer times API error: {e}") return {"success": False} # ========================= # đŸŒĄī¸ Temperature-Based Advice # ========================= def get_temperature_advice(temp, weather_main): """Generate personalized advice based on temperature and weather""" advice = [] if temp > 35: advice.append("đŸ”Ĩ āĻ…āĻ¤ā§āϝāĻ¨ā§āϤ āĻ—āϰāĻŽ āϏāϤāĻ°ā§āĻ•āϤāĻž!") advice.append("â€ĸ āĻĻ⧁āĻĒ⧁āϰ ⧧⧍āϟāĻž āĻĨ⧇āϕ⧇ āĻŦāĻŋāϕ⧇āϞ ā§ĒāϟāĻž āĻĒāĻ°ā§āϝāĻ¨ā§āϤ āϘāϰ⧇āϰ āĻ­āĻŋāϤāϰ⧇ āĻĨāĻžāϕ⧁āύ") advice.append("â€ĸ āϕ⧇āύāĻžāĻ•āĻžāϟāĻž: āĻ­ā§‹āϰ ā§Ŧ-⧝āϟāĻž āĻ…āĻĨāĻŦāĻž āϏāĻ¨ā§āĻ§ā§āϝāĻž ā§­-ā§§ā§ĻāϟāĻžāϝāĻŧ āϝāĻžāύ") advice.append("â€ĸ āχāĻĢāϤāĻžāϰ⧇āϰ āĻĒāϰ āĻĒā§āϰāϤāĻŋ ā§§ā§Ģ-⧍ā§Ļ āĻŽāĻŋāύāĻŋāĻŸā§‡ āĻĒāĻžāύāĻŋ āĻĒāĻžāύ āĻ•āϰ⧁āύ") advice.append("â€ĸ āĻ­āĻžāϰ⧀ āĻļāĻžāϰ⧀āϰāĻŋāĻ• āĻĒāϰāĻŋāĻļā§āϰāĻŽ āĻāĻĄāĻŧāĻŋāϝāĻŧ⧇ āϚāϞ⧁āύ - āĻŦāĻŋāĻļā§āϰāĻžāĻŽ āύāĻŋāύ!") advice.append("â€ĸ āϘāϰ⧇ āĻĨ⧇āϕ⧇ āϕ⧁āϰāφāύ āϤāĻŋāϞāĻžāĻ“āϝāĻŧāĻžāϤ āĻ“ āĻĒāϰāĻŋāĻŦāĻžāϰ⧇āϰ āϏāĻžāĻĨ⧇ āϏāĻŽāϝāĻŧ āĻ•āĻžāϟāĻžāύ") elif temp > 30: advice.append("đŸŒĄī¸ āĻ—āϰāĻŽ āφāĻŦāĻšāĻžāĻ“āϝāĻŧāĻž") advice.append("â€ĸ āϏāĻ•āĻžāϞ⧇āϰ āĻšāĻžāρāϟāĻž: āϏāĻ•āĻžāϞ ⧝āϟāĻžāϰ āφāϗ⧇ āϏāĻŦāĻšā§‡āϝāĻŧ⧇ āĻ­āĻžāϞ⧋") advice.append("â€ĸ āϕ⧇āύāĻžāĻ•āĻžāϟāĻž: āϏāĻ¨ā§āĻ§ā§āϝāĻž ā§ŦāϟāĻžāϰ āĻĒāϰ āφāϰāĻžāĻŽāĻĻāĻžāϝāĻŧāĻ•") advice.append("â€ĸ āĻšāĻžāχāĻĄā§āϰ⧇āĻļāύ: āϏ⧇āĻšāϰāĻŋ āĻĨ⧇āϕ⧇ āχāĻĢāϤāĻžāϰ āĻĒāĻ°ā§āϝāĻ¨ā§āϤ ā§Ž-ā§§ā§Ļ āĻ—ā§āϞāĻžāϏ āĻĒāĻžāύāĻŋ") advice.append("â€ĸ āϏāĻ¨ā§āĻ§ā§āϝāĻžāϝāĻŧ āĻšāĻžāϞāĻ•āĻž āĻŦāĻžāχāϰ⧇āϰ āĻ•āĻžāϜāĻ•āĻ°ā§āĻŽ āĻ•āϰāĻž āϝāĻžāϝāĻŧ") advice.append("â€ĸ āĻĻāĻŋāύ⧇ āĻŦāĻžāχāϰ⧇ āϗ⧇āϞ⧇ āĻ›āĻžāϤāĻž āĻ“ āϏāĻžāύāĻ¸ā§āĻ•ā§āϰāĻŋāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧁āύ") elif temp > 25: advice.append("â˜€ī¸ āĻŽāύ⧋āϰāĻŽ āωāĻˇā§āĻŖ āφāĻŦāĻšāĻžāĻ“āϝāĻŧāĻž") advice.append("â€ĸ āχāĻĢāϤāĻžāϰ⧇āϰ āĻĒāϰ āϏāĻ¨ā§āĻ§ā§āϝāĻžāϰ āĻšāĻžāρāϟāĻžāϰ āϜāĻ¨ā§āϝ āϚāĻŽā§ŽāĻ•āĻžāϰ (ā§Šā§Ļ-ā§Ēā§Ģ āĻŽāĻŋāύāĻŋāϟ)") advice.append("â€ĸ āϕ⧇āύāĻžāĻ•āĻžāϟāĻž: āϝ⧇āϕ⧋āύ⧋ āϏāĻŽāϝāĻŧ āφāϰāĻžāĻŽāĻĻāĻžāϝāĻŧāĻ•, āĻŦāĻŋāϕ⧇āϞ ā§Ē-ā§ŽāϟāĻž āϏāĻŦāĻšā§‡āϝāĻŧ⧇ āĻ­āĻžāϞ⧋") advice.append("â€ĸ āĻŽāĻžāĻāĻžāϰāĻŋ āĻŦāĻžāχāϰ⧇āϰ āĻ•āĻžāϜāĻ•āĻ°ā§āĻŽ āĻ āĻŋāĻ• āφāϛ⧇") advice.append("â€ĸ āĻĒāĻžāĻ°ā§āĻ•/āĻŽāϏāϜāĻŋāĻĻ⧇ āĻĒāϰāĻŋāĻŦāĻžāϰ⧇āϰ āϏāĻžāĻĨ⧇ āĻŦ⧇āĻĄāĻŧāĻžāύ⧋āϰ āϜāĻ¨ā§āϝ āĻĻāĻžāϰ⧁āĻŖ āφāĻŦāĻšāĻžāĻ“āϝāĻŧāĻž") advice.append("â€ĸ āύāĻŋāϝāĻŧāĻŽāĻŋāϤ āĻĒāĻžāύāĻŋ āĻĒāĻžāύ āϭ⧁āϞāĻŦ⧇āύ āύāĻž!") elif temp > 20: advice.append("đŸŒ¤ī¸ āφāϰāĻžāĻŽāĻĻāĻžāϝāĻŧāĻ• āφāĻŦāĻšāĻžāĻ“āϝāĻŧāĻž") advice.append("â€ĸ āϏāĻžāϰāĻžāĻĻāĻŋāύ āĻŦāĻžāχāϰ⧇āϰ āĻ•āĻžāĻœā§‡āϰ āϜāĻ¨ā§āϝ āφāĻĻāĻ°ā§āĻļ") advice.append("â€ĸ āϕ⧇āύāĻžāĻ•āĻžāϟāĻž, āĻšāĻžāρāϟāĻž, āĻšāĻžāϞāĻ•āĻž āĻŦā§āϝāĻžāϝāĻŧāĻžāĻŽā§‡āϰ āϜāĻ¨ā§āϝ āωāĻĒāϝ⧁āĻ•ā§āϤ") advice.append("â€ĸ āφāϰāĻžāĻŽāĻĻāĻžāϝāĻŧāĻ• āĻĒā§‹āĻļāĻžāĻ• āĻĒāϰāĻŋāϧāĻžāύ āĻ•āϰ⧁āύ") advice.append("â€ĸ āĻ•āĻŽāĻŋāωāύāĻŋāϟāĻŋ āχāĻĢāϤāĻžāϰ āĻ“ āϏāĻŽāĻžāĻŦ⧇āĻļ⧇āϰ āϜāĻ¨ā§āϝ āĻĻāĻžāϰ⧁āĻŖ") advice.append("â€ĸ āϏ⧁āĻ¨ā§āĻĻāϰ āφāĻŦāĻšāĻžāĻ“āϝāĻŧāĻž āωāĻĒāĻ­ā§‹āĻ— āĻ•āϰ⧁āύ - āφāĻ˛ā§āϞāĻžāĻšāϰ āϰāĻšāĻŽāϤ!") elif temp > 15: advice.append("🍃 āĻļā§€āϤāϞ āφāĻŦāĻšāĻžāĻ“āϝāĻŧāĻž") advice.append("â€ĸ āϏāĻ¨ā§āĻ§ā§āϝāĻžāϰ āύāĻžāĻŽāĻžāĻœā§‡āϰ āϜāĻ¨ā§āϝ āĻšāĻžāϞāĻ•āĻž āĻœā§āϝāĻžāϕ⧇āϟ āĻĒāϰ⧁āύ") advice.append("â€ĸ āϤāĻžāϰāĻžāĻŦā§€āĻš'āϰ āĻĒāϰ āĻšāĻžāρāϟāĻžāϰ āϜāĻ¨ā§āϝ āϚāĻŽā§ŽāĻ•āĻžāϰ āφāĻŦāĻšāĻžāĻ“āϝāĻŧāĻž") advice.append("â€ĸ āφāĻ¤ā§āĻŽā§€āϝāĻŧ-āĻ¸ā§āĻŦāϜāύ āĻĻ⧇āĻ–āϤ⧇ āϝāĻžāĻ“āϝāĻŧāĻžāϰ āϜāĻ¨ā§āϝ āĻ­āĻžāϞ⧋") advice.append("â€ĸ āĻļā§€āϤāϞ, āϏāϤ⧇āϜ āĻŦāĻžāϤāĻžāϏ āωāĻĒāĻ­ā§‹āĻ— āĻ•āϰ⧁āύ!") advice.append("â€ĸ āχāĻĢāϤāĻžāϰ⧇ āĻ—āϰāĻŽ āϖ⧇āϜ⧁āϰ āĻ“ āϚāĻž āωāĻĒāϝ⧁āĻ•ā§āϤ") else: advice.append("â„ī¸ āĻ āĻžāĻ¨ā§āĻĄāĻž āφāĻŦāĻšāĻžāĻ“āϝāĻŧāĻž") advice.append("â€ĸ āĻŽāϏāϜāĻŋāĻĻ⧇ āϝāĻžāĻ“āϝāĻŧāĻžāϰ āϏāĻŽāϝāĻŧ āĻ—āϰāĻŽ āĻ•āĻžāĻĒāĻĄāĻŧ āĻĒāϰ⧁āύ") advice.append("â€ĸ āϘāϰ⧇āϰ āĻ­āĻŋāϤāϰ⧇āϰ āĻ•āĻžāϜāĻ•āĻ°ā§āĻŽ āĻ•āϰ⧁āύ") advice.append("â€ĸ āϏ⧇āĻšāϰāĻŋ āĻ“ āχāĻĢāϤāĻžāϰ⧇ āĻ—āϰāĻŽ āĻ¸ā§āϝ⧁āĻĒ āĻ“ āĻĒāĻžāύ⧀āϝāĻŧ") advice.append("â€ĸ āĻŦāϝāĻŧāĻ¸ā§āĻ• āĻ“ āĻļāĻŋāĻļ⧁āĻĻ⧇āϰ āĻŦāĻŋāĻļ⧇āώ āϝāĻ¤ā§āύ āύāĻŋāύ") advice.append("â€ĸ āϤāĻžāĻšāĻžāĻœā§āϜ⧁āĻĻ āύāĻžāĻŽāĻžāĻœā§‡āϰ āϜāĻ¨ā§āϝ āωāĻˇā§āĻŖ āĻ•āĻŽā§āĻŦāϞ 🤲") # Weather-specific advice if weather_main == "rain": advice.append("\n☔ āĻŦ⧃āĻˇā§āϟāĻŋāϰ āĻĻāĻŋāύ⧇āϰ āĻŦāĻŋāĻļ⧇āώ:") advice.append("â€ĸ āϤāĻžāϰāĻžāĻŦā§€āĻš āύāĻžāĻŽāĻžāĻœā§‡āϰ āϜāĻ¨ā§āϝ āĻ›āĻžāϤāĻž āύāĻŋāύ") advice.append("â€ĸ āϘāϰ⧇ āĻĨ⧇āϕ⧇ āχāĻŦāĻžāĻĻāϤ āĻ“ āϜāĻŋāĻ•āĻŋāϰ⧇āϰ āϜāĻ¨ā§āϝ āωāĻĒāϝ⧁āĻ•ā§āϤ") advice.append("â€ĸ āĻĒā§āϰāϚ⧁āϰ āĻĻā§‹āϝāĻŧāĻž āĻ•āϰ⧁āύ - āĻŦ⧃āĻˇā§āϟāĻŋ āĻŦāϰāĻ•āϤāĻŽāϝāĻŧ āϏāĻŽāϝāĻŧ! 🤲") advice.append("â€ĸ āϏāĻŽā§āĻ­āĻŦ āĻšāϞ⧇ āϘāϰ⧇ āĻĨāĻžāϕ⧁āύ, āĻĒāϰāĻŋāĻŦāĻžāϰ⧇āϰ āϏāĻžāĻĨ⧇ āϕ⧁āϰāφāύ āĻĒāĻĄāĻŧ⧁āύ") elif weather_main == "thunderstorm": advice.append("\nâ›ˆī¸ āĻāĻĄāĻŧ⧇āϰ āϏāϤāĻ°ā§āĻ•āϤāĻž:") advice.append("â€ĸ āĻāĻ•āĻžāĻ¨ā§āϤ āĻĒā§āϰāϝāĻŧā§‹āϜāύ āĻ›āĻžāĻĄāĻŧāĻž āĻŦāĻžāχāϰ⧇ āϝāĻžāĻŦ⧇āύ āύāĻž") advice.append("â€ĸ āĻĒāĻĄāĻŧ⧁āύ: āϏ⧁āĻŦāĻšāĻžāύāĻžāĻ˛ā§āϞāĻžāĻšāĻŋ āĻ“āϝāĻŧāĻž āĻŦāĻŋāĻšāĻžāĻŽāĻĻāĻŋāĻšāĻŋ") advice.append("â€ĸ āĻĒāϰāĻŋāĻŦāĻžāϰ⧇āϰ āϏāĻžāĻĨ⧇ āύāĻŋāϰāĻžāĻĒāĻĻ⧇ āϘāϰ⧇ āĻĨāĻžāϕ⧁āύ") advice.append("â€ĸ āφāĻ˛ā§āϞāĻžāĻšāϰ āφāĻļā§āϰāϝāĻŧ āĻĒā§āϰāĻžāĻ°ā§āĻĨāύāĻžāϰ āϜāĻ¨ā§āϝ āωāĻĒāϝ⧁āĻ•ā§āϤ āϏāĻŽāϝāĻŧ") elif weather_main == "clouds": advice.append("\nâ˜ī¸ āĻŽā§‡āϘāϞāĻž āĻ“ āĻŽāύ⧋āϰāĻŽ:") advice.append("â€ĸ āĻ•āĻĄāĻŧāĻž āϰ⧋āĻĻ āύ⧇āχ - āϕ⧇āύāĻžāĻ•āĻžāϟāĻžāϰ āϜāĻ¨ā§āϝ āϚāĻŽā§ŽāĻ•āĻžāϰ!") advice.append("â€ĸ āĻŦāĻžāχāϰ⧇āϰ āĻ•āĻžāĻœā§‡āϰ āϜāĻ¨ā§āϝ āφāϰāĻžāĻŽāĻĻāĻžāϝāĻŧāĻ•") advice.append("â€ĸ āφāĻ¤ā§āĻŽā§€āϝāĻŧāĻ¸ā§āĻŦāϜāύ āĻĻ⧇āĻ–āϤ⧇ āϝāĻžāĻ“āϝāĻŧāĻžāϰ āϜāĻ¨ā§āϝ āĻĻāĻžāϰ⧁āĻŖ āĻĻāĻŋāύ") return "\n".join(advice) # ========================= # 🌙 Main Ramadan Dashboard # ========================= def get_ramadan_dashboard(division, district): if not division or not district: return """

âš ī¸ āĻĻāϝāĻŧāĻž āĻ•āϰ⧇ āĻŦāĻŋāĻ­āĻžāĻ— āĻāĻŦāĻ‚ āĻœā§‡āϞāĻž āύāĻŋāĻ°ā§āĻŦāĻžāϚāύ āĻ•āϰ⧁āύ

Please select Division and District

🕌 🌙 ⭐
""" # Get random daily Hadith daily_hadith = random.choice(HADITHS) # Get real prayer times prayer_times = get_prayer_times(district) # Get weather data for Bangladesh weather_url = f"http://api.openweathermap.org/data/2.5/weather?q={district},Bangladesh&appid={WEATHER_API_KEY}&units=metric" try: weather_response = requests.get(weather_url, timeout=10) weather_data = weather_response.json() except: return """

❌ āφāĻŦāĻšāĻžāĻ“āϝāĻŧāĻž āϏ⧇āĻŦāĻžāϰ āϏāĻžāĻĨ⧇ āϏāĻ‚āϝ⧋āĻ— āĻ¤ā§āϰ⧁āϟāĻŋ

Error connecting to weather service

""" if weather_response.status_code != 200: return f"""

🔍 '{district}' āĻœā§‡āϞāĻž āϖ⧁āρāĻœā§‡ āĻĒāĻžāĻ“āϝāĻŧāĻž āϝāĻžāϝāĻŧāύāĻŋ!

District not found! Please check selection

""" # Extract weather data temp = weather_data["main"]["temp"] feels_like = weather_data["main"]["feels_like"] humidity = weather_data["main"]["humidity"] description = weather_data["weather"][0]["description"].title() weather_main = weather_data["weather"][0]["main"].lower() wind_speed = weather_data["wind"]["speed"] # Temperature advice temp_advice = get_temperature_advice(temp, weather_main) # Weather gradients with vibrant colors weather_gradients = { "clear": "linear-gradient(135deg, #f093fb 0%, #f5576c 100%)", "clouds": "linear-gradient(135deg, #4facfe 0%, #00f2fe 100%)", "rain": "linear-gradient(135deg, #43e97b 0%, #38f9d7 100%)", "drizzle": "linear-gradient(135deg, #fa709a 0%, #fee140 100%)", "thunderstorm": "linear-gradient(135deg, #30cfd0 0%, #330867 100%)", "snow": "linear-gradient(135deg, #a8edea 0%, #fed6e3 100%)", "mist": "linear-gradient(135deg, #ffecd2 0%, #fcb69f 100%)", } gradient = weather_gradients.get(weather_main, "linear-gradient(135deg, #667eea 0%, #764ba2 100%)") # Weather icons weather_icons = { "clear": "â˜€ī¸", "clouds": "â˜ī¸", "rain": "đŸŒ§ī¸", "thunderstorm": "â›ˆī¸", "snow": "â„ī¸", "mist": "đŸŒĢī¸", } icon = weather_icons.get(weather_main, "đŸŒ¤ī¸") # Build HTML with enhanced animations and professional design html = f"""
🌸 đŸŒē đŸŒŧ đŸŒģ
🌸 đŸŒē đŸŒŧ đŸŒģ
đŸ›ī¸ 🌙 đŸ›ī¸

Ramadan Mubarak 2025

āϰāĻŽāϜāĻžāύ āĻŽā§āĻŦāĻžāϰāĻ• ā§§ā§Ēā§Ēā§Ŧ

🐱 🐈 đŸ˜ē 😸

🇧🇩 {district}, {division}

{district}, {division}

{datetime.now().strftime("%A, %B %d, %Y")} | {datetime.now().strftime("%I:%M %p")}

🌸 đŸŒē đŸŒŧ đŸŒģ

🕌 āύāĻžāĻŽāĻžāĻœā§‡āϰ āϏāĻŽāϝāĻŧāϏ⧂āĻšā§€ (Prayer Times)

āϰāĻŋāϝāĻŧ⧇āϞ-āϟāĻžāχāĻŽ āϏāĻŽāϝāĻŧ â€ĸ Real-time for {district}, Bangladesh

""" if prayer_times["success"]: html += f"""
🌅

āϏ⧇āĻšāϰāĻŋ āĻļ⧇āώ (Sehri Ends)

āĻĢāϜāϰ (Fajr)

{prayer_times['sehri_end']}

āĻāχ āϏāĻŽāϝāĻŧ⧇āϰ āφāϗ⧇ āĻ–āĻžāĻ“āϝāĻŧāĻž āĻŦāĻ¨ā§āϧ āĻ•āϰ⧁āύ

Stop eating before this time

🌇

āχāĻĢāϤāĻžāϰ āĻļ⧁āϰ⧁ (Iftar Starts)

āĻŽāĻžāĻ—āϰāĻŋāĻŦ (Maghrib)

{prayer_times['iftar_start']}

āĻāχ āϏāĻŽāϝāĻŧ⧇ āϰ⧋āϜāĻž āĻ­āĻžāĻ™ā§āϗ⧁āύ

Break your fast at this time

đŸ“ŋ āĻĻ⧈āύāĻŋāĻ• āύāĻžāĻŽāĻžāĻœā§‡āϰ āϏāĻŽāϝāĻŧāϏ⧂āĻšā§€ (Daily Prayer Schedule)

āϏ⧂āĻ°ā§āϝ⧋āĻĻāϝāĻŧ (Sunrise)

{prayer_times['sunrise']}

āϝ⧋āĻšāϰ (Dhuhr)

{prayer_times['dhuhr']}

āφāϏāϰ (Asr)

{prayer_times['asr']}

āϏ⧂āĻ°ā§āϝāĻžāĻ¸ā§āϤ (Sunset)

{prayer_times['sunset']}

āĻāĻļāĻž (Isha)

{prayer_times['isha']}

""" else: html += """

âš ī¸ āύāĻžāĻŽāĻžāĻœā§‡āϰ āϏāĻŽāϝāĻŧ āĻĒāĻžāĻ“āϝāĻŧāĻž āϝāĻžāϝāĻŧāύāĻŋ

Could not fetch prayer times

āĻĻāϝāĻŧāĻž āĻ•āϰ⧇ āφāĻĒāύāĻžāϰ āĻœā§‡āϞāĻžāϰ āύāĻžāĻŽ āĻšā§‡āĻ• āĻ•āϰ⧁āύ

""" html += f"""

đŸŒĄī¸ āϞāĻžāχāĻ­ āφāĻŦāĻšāĻžāĻ“āϝāĻŧāĻž (Live Weather)

{icon}

{temp:.1f}°C

{description}

āĻ…āύ⧁āĻ­ā§‚āϤāĻŋ (Feels like) {feels_like:.1f}°C

💧 āφāĻ°ā§āĻĻā§āϰāϤāĻž: {humidity}%
đŸŒŦī¸ āĻŦāĻžāϤāĻžāϏ: {wind_speed} m/s

💡 āφāĻĒāύāĻžāϰ āĻŦā§āϝāĻ•ā§āϤāĻŋāĻ—āϤ āϰāĻŽāϜāĻžāύ āĻ—āĻžāχāĻĄ

Your Personalized Ramadan Guide

{temp_advice}

💙 āĻŽāύ⧇ āϰāĻžāĻ–āĻŦ⧇āύ: āϰ⧋āϜāĻžāϰ āϏāĻŽāϝāĻŧ āφāĻĒāύāĻžāϰ āĻ¸ā§āĻŦāĻžāĻ¸ā§āĻĨā§āϝ āϗ⧁āϰ⧁āĻ¤ā§āĻŦāĻĒā§‚āĻ°ā§āĻŖāĨ¤ āφāĻĒāύāĻžāϰ āĻļāϰ⧀āϰ⧇āϰ āĻ•āĻĨāĻž āĻļ⧁āύ⧁āύ!

Remember: Your health is important during fasting. Listen to your body!

đŸ“ŋ āφāϜāϕ⧇āϰ āĻšāĻžāĻĻāĻŋāϏ (Today's Hadith)

🌸 đŸŒē đŸŒŧ đŸŒģ

"{daily_hadith['english']}"

"{daily_hadith['bengali']}"

— {daily_hadith['reference']}

😊 💖 🌸 🐱

{daily_hadith['happy_message']}

{daily_hadith['salam']}

đŸ›ī¸ 🌙 đŸ›ī¸

May Allah Accept Your Fasting & Prayers

āφāĻ˛ā§āϞāĻžāĻš āφāĻĒāύāĻžāϰ āϰ⧋āϜāĻž āĻ“ āύāĻžāĻŽāĻžāϜ āĻ•āĻŦ⧁āϞ āĻ•āϰ⧁āύ

🐱 🐈 đŸ˜ē 😸

Ramadan Kareem 2025! 🌙

āϰāĻŽāϜāĻžāύ āĻ•āϰ⧀āĻŽ ā§§ā§Ēā§Ēā§Ŧ! 🌸

🌸 đŸŒē đŸŒŧ đŸŒģ 🌸
""" return html # ========================= # 🎨 Gradio Interface with Bangladesh Divisions & Districts # ========================= custom_css = """ .gradio-container { background: linear-gradient(135deg, #E8F5E9 0%, #F3E5F5 40%, #FFF9C4 70%, #FFEBEE 100%) !important; } footer { display: none !important; } .contain { max-width: 1200px !important; } .gr-button { background: linear-gradient(135deg, #667eea 0%, #764ba2 100%) !important; border: none !important; color: white !important; font-weight: 600 !important; font-size: 16px !important; padding: 12px 30px !important; border-radius: 15px !important; transition: all 0.3s ease !important; } .gr-button:hover { transform: translateY(-2px) !important; box-shadow: 0 10px 25px rgba(102, 126, 234, 0.4) !important; } """ def update_districts(division): """Update district dropdown based on selected division""" if division in BANGLADESH_LOCATIONS: return gr.Dropdown( choices=BANGLADESH_LOCATIONS[division], value=BANGLADESH_LOCATIONS[division][0], label=f"đŸ˜ī¸ āĻœā§‡āϞāĻž āύāĻŋāĻ°ā§āĻŦāĻžāϚāύ āĻ•āϰ⧁āύ (Select District) - {division}", interactive=True ) return gr.Dropdown(choices=[], label="đŸ˜ī¸ āĻœā§‡āϞāĻž āύāĻŋāĻ°ā§āĻŦāĻžāϚāύ āĻ•āϰ⧁āύ (Select District)", interactive=True) with gr.Blocks(css=custom_css) as demo: gr.HTML("""

đŸ›ī¸ āϰāĻŽāϜāĻžāύ āĻĄā§āϝāĻžāĻļāĻŦā§‹āĻ°ā§āĻĄ ⧍ā§Ļ⧍ā§Ģ 🌙

Ultimate Ramadan Dashboard 2025

🌸 āϰāĻŋāϝāĻŧ⧇āϞ-āϟāĻžāχāĻŽ āύāĻžāĻŽāĻžāĻœā§‡āϰ āϏāĻŽāϝāĻŧ â€ĸ āϞāĻžāχāĻ­ āφāĻŦāĻšāĻžāĻ“āϝāĻŧāĻž â€ĸ āĻĻ⧈āύāĻŋāĻ• āĻšāĻžāĻĻāĻŋāϏ â€ĸ āĻ¸ā§āĻŽāĻžāĻ°ā§āϟ āĻĒāϰāĻžāĻŽāĻ°ā§āĻļ 🌸

Real Prayer Times â€ĸ Live Weather â€ĸ Daily Hadith â€ĸ Smart Advice

🇧🇩 āϏāĻŽāĻ¸ā§āϤ āĻŦāĻžāĻ‚āϞāĻžāĻĻ⧇āĻļ āĻŦāĻŋāĻ­āĻžāĻ— āĻ“ āĻœā§‡āϞāĻž āϏāĻŽāĻ°ā§āĻĨāĻŋāϤ â€ĸ All Bangladesh Divisions & Districts Supported

đŸ›ī¸ 🌙 🐱 🌸 🐈 đŸŒē
""") with gr.Row(): division_dropdown = gr.Dropdown( choices=list(BANGLADESH_LOCATIONS.keys()), value="Dhaka Division", label="đŸ—ēī¸ āĻŦāĻŋāĻ­āĻžāĻ— āύāĻŋāĻ°ā§āĻŦāĻžāϚāύ āĻ•āϰ⧁āύ (Select Division)", interactive=True ) district_dropdown = gr.Dropdown( choices=BANGLADESH_LOCATIONS["Dhaka Division"], value="Dhaka", label="đŸ˜ī¸ āĻœā§‡āϞāĻž āύāĻŋāĻ°ā§āĻŦāĻžāϚāύ āĻ•āϰ⧁āύ (Select District)", interactive=True ) submit_btn = gr.Button("🌙 āϰāĻŽāϜāĻžāύ āĻĄā§āϝāĻžāĻļāĻŦā§‹āĻ°ā§āĻĄ āĻĻ⧇āϖ⧁āύ (View Ramadan Dashboard)", size="lg") output = gr.HTML(label="🌙 Your Complete Ramadan Companion") # Update districts when division changes division_dropdown.change( fn=update_districts, inputs=[division_dropdown], outputs=[district_dropdown] ) # Submit button click submit_btn.click( fn=get_ramadan_dashboard, inputs=[division_dropdown, district_dropdown], outputs=[output] ) # Auto-load on page load demo.load( fn=get_ramadan_dashboard, inputs=[division_dropdown, district_dropdown], outputs=[output] ) if __name__ == "__main__": demo.launch( share=False, server_name="0.0.0.0", server_port=7860, theme=gr.themes.Soft( primary_hue="purple", secondary_hue="blue", ), )