VedicAstroBot / app.py
Bhavibond's picture
Create app.py
113e62f verified
Raw
History Blame Contribute Delete
3.9 kB
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()