File size: 7,219 Bytes
19cdf96
 
 
f220e14
 
 
 
fef9587
184efa3
fef9587
f220e14
 
 
 
 
 
 
 
 
fef9587
 
f220e14
fef9587
f220e14
fef9587
f220e14
 
 
fef9587
 
 
 
 
f220e14
fef9587
 
f220e14
 
 
 
4c71f23
19cdf96
 
 
 
 
 
 
68b46dc
19cdf96
 
 
17ad50f
19cdf96
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4c71f23
19cdf96
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
#!/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}