nut / app.py
golemet's picture
Update app.py
51e5fe3 verified
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# ---------------------------
# 🔧 CONFIGURAR SWISSEPH
# ---------------------------
import os
import swisseph as swe
# Ruta donde están tus efemérides dentro del contenedor
# -----------------------------------------------------------
# CONFIGURAR RUTA DE EFEMÉRIDES PARA SWISSEPH
# -----------------------------------------------------------
# MUY IMPORTANTE: esta carpeta debe existir en el contenedor
# y debe contener archivos como:
# seas_18.se1
# seas_18.se2
# ...
EPHE_PATH = "/app/ephemeris"
# 1) Configurar ANTES que flatlib
swe.set_ephe_path(EPHE_PATH)
os.environ["SWEPH_PATH"] = EPHE_PATH
# ---------------------------
# 📦 IMPORTAR FLATLIB
# ---------------------------
from flatlib.chart import Chart
from flatlib.datetime import Datetime
from flatlib.geopos import GeoPos
from flatlib import const
# Algunos sistemas necesitan esto porque flatlib pisa la ruta:
swe.set_ephe_path(EPHE_PATH)
# ---------------------------
# 🌐 IMPORTAR FASTAPI
# ---------------------------
from fastapi import FastAPI, Query
from urllib.parse import quote
# -------------------------
# Función principal Nut
# -------------------------
def Nut(datos: str) -> str:
# Limpiar el comando y separar líneas
datos = datos.split(sep='|')
# Validar que haya 5 líneas
if len(datos) != 5:
return f"{len(datos)} => {datos[0]} = {datos[-1]} Error: se esperan 5 líneas de datos (fecha, hora, zona horaria, latitud, longitud)"
# Crear fecha y posición
date = Datetime(datos[0], datos[1], datos[2])
pos = GeoPos(datos[3], datos[4])
#--------------------------------------------------------
'''
pip uninstall pyswisspeh
Found existing installation: pyswisseph 2.8.0.post0
Uninstalling pyswisseph-2.8.
pip install pyswisseph==2
Pero Pyswisseph == 2.00.00-2 no se puede instalar en sistemas win10. Este error aparecerá:
Solo se puede instalar pyswisseph-2.8.0 en
Finalmente descubrí cómo hacer que el módulo funcione en Windows.
tenemos que usar un archivo de rueda binario de Windows no oficial de
' https://www.lfd.uci.edu/~gohlke/pythonlibs/ '.
hay diferentes ruedas para diferentes versiones de Python y actualizaciones
del módulo. Usé: pyswisseph ‑ 2.5.1.post0 ‑ cp37 ‑ cp37m ‑ win_amd64.whl.
use la rueda que se adapte a su versión de python / windows
Solución: todo lo que tiene que hacer es abrir la ventana de comandos, escribir
'pip install pyswisseph ‑ 2.5.1.post0 ‑ cp37 ‑ cp37m ‑ win_amd64.whl' y se instala.
'''
#------------------------------------------------
# Build a chart with Regiomontanus houses
chart = Chart(date, pos, hsys=const.HOUSES_EQUAL)
# Build a chart including modern planets
chart = Chart(date, pos, IDs=const.LIST_OBJECTS)
# Obtener casas
house1 = chart.get(const.HOUSE1) # Ascendente
house2 = chart.get(const.HOUSE2)
house3 = chart.get(const.HOUSE3)
house4 = chart.get(const.HOUSE4)
house5 = chart.get(const.HOUSE5)
house6 = chart.get(const.HOUSE6)
house10 = chart.get(const.HOUSE10) # Medio cielo
# Obtener planetas principales
Sun = chart.get(const.SUN)
Moon = chart.get(const.MOON)
Mercury = chart.get(const.MERCURY)
Venus = chart.get(const.VENUS)
Mars = chart.get(const.MARS)
Jupiter = chart.get(const.JUPITER)
Saturn = chart.get(const.SATURN)
Uranus = chart.get(const.URANUS)
Neptune = chart.get(const.NEPTUNE)
Pluto = chart.get(const.PLUTO)
North_Node = chart.get(const.NORTH_NODE)
South_Node = chart.get(const.SOUTH_NODE)
Syzygy = chart.get(const.SYZYGY)
Pars_Fortuna = chart.get(const.PARS_FORTUNA)
'''
Algenib = chart.getFixedStar(const.STAR_ALGENIB)
Alpheratz = chart.getFixedStar(const.STAR_ALPHERATZ)
Algol = chart.getFixedStar(const.STAR_ALGOL)
...
# Aquí estaban tus comentarios de estrellas fijas
'''
# Construir URL de forma segura
url = (
"https://horoscopes.astro-seek.com/horoscope-chart1-700__radix_ClanNot.png?"
# -------------------------------------------------
# Configuración de asteroides y nodos
"chiron_seda=1" # Mostrar Chiron en color
"&lilith_seda=1" # Mostrar Lilith en color
"&chiron_asp=1" # Mostrar aspectos de Chiron
"&lilith_asp=1" # Mostrar aspectos de Lilith
"&uzel_asp=1" # Mostrar aspectos de nodo norte
"&true_uzel=on" # Nodo norte verdadero
"&minor_45=on" # Aspectos menores 45°
"&minor_135=on" # Aspectos menores 135°
"&equal=1" # Casas iguales
# -------------------------------------------------
# Casas
f"&dum_1_new={quote(str(house1.lon))}" # Ascendente
f"&dum_2={quote(str(house2.lon))}"
f"&dum_3={quote(str(house3.lon))}"
f"&dum_4={quote(str(house4.lon))}"
f"&dum_5={quote(str(house5.lon))}"
f"&dum_6={quote(str(house6.lon))}"
f"&dum_10_new={quote(str(house10.lon))}" # Medio cielo
# -------------------------------------------------
# Planetas
f"&planeta_slunce={quote(str(Sun.lon))}" # Sol
f"&planeta_luna={quote(str(Moon.lon))}" # Luna
f"&planeta_merkur={quote(str(Mercury.lon))}" # Mercurio
f"&planeta_venuse={quote(str(Venus.lon))}" # Venus
f"&planeta_mars={quote(str(Mars.lon))}" # Marte
f"&planeta_jupiter={quote(str(Jupiter.lon))}" # Júpiter
f"&planeta_saturn={quote(str(Saturn.lon))}" # Saturno
f"&planeta_uran={quote(str(Uranus.lon))}" # Urano
f"&planeta_neptun={quote(str(Neptune.lon))}" # Neptuno
f"&planeta_pluto={quote(str(Pluto.lon))}" # Plutón
f"&planeta_uzel={quote(str(North_Node.lon))}" # Nodo Norte
f"&planeta_fortune={quote(str(Pars_Fortuna.lon))}"# Parte de la Fortuna
f"&planeta_syzygy={quote(str(Syzygy.lon))}" # Luna Nueva / Llena (Syzygy)
# -------------------------------------------------
# Retrogradaciones
"&r_saturn=ANO" # Saturno retrógrado
"&r_pluto=ANO" # Plutón retrógrado
"&r_uzel=ANO" # Nodo Norte retrógrado
# -------------------------------------------------
# Otras configuraciones
"&tolerance=1" # Tolerancia de aspecto
"&tolerance_paral=1.2" # Tolerancia de paralelos
"&house_system=equal" # Sistema de casas igual
"&terms=#tabs_redraw" # Redibujar la carta
)
return url
# -------------------------
# Crear app FastAPI
# -------------------------
app = FastAPI(title="Nut API FastAPI")
# Ruta de inicio
@app.get("/")
def root():
return {"message": "Nut API FastAPI"}
# Ruta para generar la URL de Nut
@app.get("/nut")
def procesar_cadena(
datos: str = Query(
"???",
description="Ejemplo de entrada:1962/02/04|14:30|-05:00|05n00|75w32"
)
):
url_generada = Nut(datos)
return {"input": datos, "output": url_generada}