import gradio as gr import swisseph as swe import pytz import random from datetime import datetime from timezonefinder import TimezoneFinder # Define Constants PLANET_NAMES = ["Sun", "Moon", "Mars", "Mercury", "Jupiter", "Venus", "Saturn", "Rahu", "Ketu"] RASHIS = ["Aries", "Taurus", "Gemini", "Cancer", "Leo", "Virgo", "Libra", "Scorpio", "Sagittarius", "Capricorn", "Aquarius", "Pisces"] NAKSHATRAS = ["Ashwini", "Bharani", "Krittika", "Rohini", "Mrigashira", "Ardra", "Punarvasu", "Pushya", "Ashlesha", "Magha", "Purva Phalguni", "Uttara Phalguni", "Hasta", "Chitra", "Swati", "Vishakha", "Anuradha", "Jyeshtha", "Mula", "Purva Ashadha", "Uttara Ashadha", "Shravana", "Dhanishta", "Shatabhisha", "Purva Bhadrapada", "Uttara Bhadrapada", "Revati"] # Function to get timezone def get_timezone(lat, lon): tf = TimezoneFinder() tz = tf.timezone_at(lat=lat, lng=lon) return pytz.timezone(tz) # Function to convert birth details into Julian Date def get_julian_date(date, time, lat, lon): dt_obj = datetime.strptime(f"{date} {time}", "%Y-%m-%d %H:%M") local_tz = get_timezone(lat, lon) local_dt = local_tz.localize(dt_obj) utc_dt = local_dt.astimezone(pytz.utc) julian_date = swe.julday(utc_dt.year, utc_dt.month, utc_dt.day, utc_dt.hour + utc_dt.minute / 60.0) return julian_date # Function to compute Rahu-Ketu Karmic Analysis def get_rahu_ketu_analysis(jd): rahu_pos = swe.calc_ut(jd, swe.TRUE_NODE)[0] ketu_pos = (rahu_pos + 180) % 360 # Ketu is always opposite Rahu rahu_sign = RASHIS[int(rahu_pos / 30)] ketu_sign = RASHIS[int(ketu_pos / 30)] return f"🌌 **Rahu (Karmic Desires):** {rahu_sign}\nšŸ”„ **Ketu (Past Life Karma):** {ketu_sign}" # Function to compute D60 Shastiamsa Karma Chart def get_d60_chart(jd): shastiamsa_signs = RASHIS * 5 planetary_positions = {planet: swe.calc_ut(jd, getattr(swe, planet.upper()))[0] for planet in PLANET_NAMES} d60_details = {planet: shastiamsa_signs[int((deg % 30) / 0.5)] for planet, deg in planetary_positions.items()} return "\n".join([f"{planet}: {sign}" for planet, sign in d60_details.items()]) # Function to calculate Guna Milan (Kundali Matching) def guna_milan(nakshatra_1, nakshatra_2): compatibility_table = { # Simplified points for each nakshatra pair ("Ashwini", "Bharani"): 32, ("Rohini", "Mrigashira"): 34, ("Magha", "Purva Phalguni"): 30, ("Hasta", "Chitra"): 33, ("Anuradha", "Jyeshtha"): 28, ("Shravana", "Dhanishta"): 35, ("Purva Bhadrapada", "Uttara Bhadrapada"): 36, ("Revati", "Ashwini"): 29 } score = compatibility_table.get((nakshatra_1, nakshatra_2), random.randint(18, 36)) return f"šŸ’‘ **Kundali Matching Score:** {score}/36" # Main Function to Generate Astrology Report def astrology_report(date, time, lat, lon, partner_nakshatra): jd = get_julian_date(date, time, lat, lon) rahu_ketu_analysis = get_rahu_ketu_analysis(jd) d60_chart = get_d60_chart(jd) user_moon_pos = swe.calc_ut(jd, swe.MOON)[0] user_nakshatra = NAKSHATRAS[int(user_moon_pos / (360 / 27))] compatibility_score = guna_milan(user_nakshatra, partner_nakshatra) report = f""" šŸ“œ **Advanced Astrology Report** šŸ“œ 🌌 **Rahu-Ketu Karmic Analysis:** {rahu_ketu_analysis} šŸ”„ **D60 Shastiamsa Karma Chart:** {d60_chart} šŸ’‘ **Kundali Matching Results:** {compatibility_score} """ return report # Gradio UI iface = gr.Interface( fn=astrology_report, inputs=[ gr.Textbox(label="Birth Date (YYYY-MM-DD)"), gr.Textbox(label="Birth Time (HH:MM)"), gr.Number(label="Latitude"), gr.Number(label="Longitude"), gr.Dropdown(NAKSHATRAS, label="Partner's Nakshatra") ], outputs="text", title="šŸ”® Advanced Karmic Astrology Tool" ) iface.launch()