NASA Open APIs

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
MetalOS
Messages : 1524
Inscription : mar. 20/juin/2006 22:17
Localisation : Lorraine
Contact :

NASA Open APIs

Message par MetalOS »

Salut tous le monde,

Je viens de découvrir il y a quelques jours que la NASA partageais un api gratuitement. Il suffit de faire une demande de clé gratuite sur ce site pour l'exploiter:

https://api.nasa.gov/

Une fois fait, j'ai créé un exemple simple qui permet d'exploiter certains API. J'ai commenté le code pour aider ceux qui en ont besoin. Il faut ajouter votre clé api en haut du code pour que ça fonctionne.

Code : Tout sélectionner

; ======================================================================
; Client NASA multi-API
; By MetalOS
; ======================================================================

EnableExplicit

UsePNGImageDecoder()
UseJPEGImageDecoder()

; ----------------------------------------------------------------------
; CONFIGURATION NASA
; ----------------------------------------------------------------------
Global NASA_API_KEY$ = "Votre clé API"
Global NASA_BASE_URL$ = "https://api.nasa.gov"

; ----------------------------------------------------------------------
; CONST / GADGETS
; ----------------------------------------------------------------------
Enumeration 1
  #WinMain
  
  #TabMain
  
  ; Onglet APOD
  #BtnApodLoad
  #ImgApod
  #EdtApodTitle
  #EdtApodDate
  #EdtApodUrl
  #TxtApodExplanation
  
  ; Onglet NEO
  #BtnNeoLoad
  #ListNeo
  
  ; Onglet Mars - Images
  #BtnMarsImgSearch
  #EdtMarsImgQuery
  #ListMarsImg
  
  ; Onglet Mars - Météo
  #BtnMarsWeatherLoad
  #ListMarsWeather
  
  ; Onglet Mars - HiRISE
  #BtnMarsHiRISELoad
  #ListMarsHiRISE
  
  ; Onglet EPIC
  #BtnEpicLoad
  #ListEpic
  
  ; Onglet DONKI
  #BtnDonkiLoad
  #ListDonki
EndEnumeration

; ----------------------------------------------------------------------
; OUTILS HTTP / JSON
; ----------------------------------------------------------------------

; Requête HTTP GET basique, retourne le corps en UTF-8 (ou "")
Procedure.s HttpGet(URL$)
  Protected Request, Result$, Status$
  
  Debug "HTTP GET: " + URL$
  
  Request = HTTPRequest(#PB_HTTP_Get, URL$, "", #PB_HTTP_Debug)
  
  If Request
    Status$ = HTTPInfo(Request, #PB_HTTP_StatusCode)
    Result$ = HTTPInfo(Request, #PB_HTTP_Response)
    
    Debug "HTTP Status: " + Status$
    
    ; Si ce n'est pas 200, on log et on renvoie chaîne vide
    If Status$ <> "200"
      Debug "Réponse NASA (erreur, tronquée à 500 caractères) :"
      Debug Left(Result$, 500)
      Result$ = ""   ; Forcer l'échec dans les LoadXXX()
    EndIf
    
    FinishHTTP(Request)
  Else
    Debug "HTTPRequest() a échoué pour l'URL : " + URL$
    Result$ = ""
  EndIf
  
  ProcedureReturn Result$
EndProcedure

; Affichage simple d'une erreur
Procedure ShowError(Message$)
  MessageRequester("Erreur", Message$, #PB_MessageRequester_Ok | #PB_MessageRequester_Error)
EndProcedure

; Raccourci pour lire une chaîne dans un objet JSON à partir d'une clé
; (utilise la fonction interne GetJSONString(Value) de PureBasic)
; Raccourci pour lire une valeur JSON et la retourner sous forme de texte,
; quel que soit son type (string, nombre, booléen).
Procedure.s JSON_GetField(Value, Key$)
  Protected Child, t
  
  Child = GetJSONMember(Value, Key$)
  If Child = 0
    ProcedureReturn ""
  EndIf
  
  t = JSONType(Child)
  
  Select t
    Case #PB_JSON_String
      ProcedureReturn GetJSONString(Child)
      
    Case #PB_JSON_Number
      ; On passe les nombres en texte (double)
      ProcedureReturn StrD(GetJSONDouble(Child))
      
    Case #PB_JSON_Boolean
      If GetJSONBoolean(Child)
        ProcedureReturn "true"
      Else
        ProcedureReturn "false"
      EndIf
      
    Default
      ; Pour objets / tableaux, on ne retourne rien (tu pourras adapter au besoin)
      ProcedureReturn ""
  EndSelect
EndProcedure


; Encodage minimal pour les requêtes texte (espaces, accents basiques)
Procedure.s UrlEncode(Text$)
  Protected i, c, r$
  
  For i = 1 To Len(Text$)
    c = Asc(Mid(Text$, i, 1))
    
    Select c
      Case 'A' To 'Z', 'a' To 'z', '0' To '9', '-', '_', '.', '~'
        r$ + Chr(c)
      Case ' '
        r$ + "%20"
      Default
        r$ + "%" + RSet(Hex(c), 2, "0")
    EndSelect
  Next
  
  ProcedureReturn r$
EndProcedure

; ----------------------------------------------------------------------
; FONCTIONS APOD
; ----------------------------------------------------------------------

Procedure LoadAPOD()
  Protected URL$, Json$, JsonID, Root
  Protected MediaType$, Title$, Explanation$, Date$, ImageUrl$
  Protected HttpReq, *ImgMem, ImgSize, ImgNum, ResizedImg
  Protected GadgetW, GadgetH
  
  ; Construire l'URL APOD
  URL$ = NASA_BASE_URL$ + "/planetary/apod?api_key=" + NASA_API_KEY$
  
  ; Récupérer le JSON via HttpGet()
  Json$ = HttpGet(URL$)
  If Json$ = ""
    ShowError("Impossible de récupérer l'APOD.")
    ProcedureReturn
  EndIf
  
  ; Parser le JSON
  JsonID = ParseJSON(#PB_Any, Json$)
  If JsonID = 0
    ShowError("Erreur de parsing JSON APOD.")
    ProcedureReturn
  EndIf
  
  Root = JSONValue(JsonID)
  If Root = 0
    ShowError("Format JSON APOD inattendu.")
    FreeJSON(JsonID)
    ProcedureReturn
  EndIf
  
  ; Lire les champs principaux
  Title$       = JSON_GetField(Root, "title")
  Explanation$ = JSON_GetField(Root, "explanation")
  Date$        = JSON_GetField(Root, "date")
  MediaType$   = JSON_GetField(Root, "media_type")
  ImageUrl$    = JSON_GetField(Root, "url")
  
  ; Mettre à jour les gadgets texte
  SetGadgetText(#EdtApodTitle, Title$)
  SetGadgetText(#EdtApodDate, Date$)
  SetGadgetText(#EdtApodUrl, ImageUrl$)
  SetGadgetText(#TxtApodExplanation, Explanation$)
  
  ; Charger l'image uniquement si media_type = "image"
  If MediaType$ = "image" And ImageUrl$ <> ""
    Debug "APOD image URL: " + ImageUrl$
    
    ; --- Téléchargement de l'image via la nouvelle API HTTP ---
    HttpReq = HTTPRequest(#PB_HTTP_Get, ImageUrl$, "", #PB_HTTP_Debug)
    If HttpReq
      *ImgMem = HTTPMemory(HttpReq)
      If *ImgMem
        ImgSize = MemorySize(*ImgMem)
        Debug "Taille image APOD reçue (HTTPMemory) : " + Str(ImgSize)
        
        ImgNum = CatchImage(#PB_Any, *ImgMem, ImgSize)
        FreeMemory(*ImgMem)
        
        If ImgNum
          Debug "CatchImage OK, ImgNum = " + Str(ImgNum)
          
          ; --- Redimensionnement automatique à la taille du gadget ---
          GadgetW = GadgetWidth(#ImgApod)
          GadgetH = GadgetHeight(#ImgApod)
          
          ResizedImg = CreateImage(#PB_Any, GadgetW, GadgetH)
          If ResizedImg
            If StartDrawing(ImageOutput(ResizedImg))
              Box(0, 0, GadgetW, GadgetH, $000000) ; fond noir (optionnel)
              DrawImage(ImageID(ImgNum), 0, 0, GadgetW, GadgetH)
              StopDrawing()
            EndIf
            
            SetGadgetState(#ImgApod, ImageID(ResizedImg))
          Else
            ; Si on ne peut pas créer l'image redimensionnée, on affiche l'originale
            SetGadgetState(#ImgApod, ImageID(ImgNum))
          EndIf
          
          ; On peut libérer l'image originale si on ne la réutilise pas
          FreeImage(ImgNum)
          
        Else
          Debug "CatchImage a échoué pour l'image APOD"
          ShowError("Impossible de décoder l'image APOD (format non supporté ?).")
          SetGadgetState(#ImgApod, 0)
        EndIf
        
      Else
        Debug "HTTPMemory() a renvoyé 0 pour l'image APOD"
        ShowError("Impossible de lire les données de l'image APOD.")
        SetGadgetState(#ImgApod, 0)
      EndIf
      
      FinishHTTP(HttpReq)
    Else
      Debug "HTTPRequest() a échoué pour l'image APOD"
      ShowError("Impossible de télécharger l'image APOD.")
      SetGadgetState(#ImgApod, 0)
    EndIf
    
  Else
    ; Si ce n'est pas une image (vidéo, etc.), on vide l'ImageGadget
    Debug "APOD media_type = " + MediaType$ + " -> aucune image à afficher."
    SetGadgetState(#ImgApod, 0)
  EndIf
  
  FreeJSON(JsonID)
EndProcedure

; ----------------------------------------------------------------------
; FONCTIONS NEO (Near Earth Objects)
; ----------------------------------------------------------------------

; /neo/rest/v1/feed?start_date=...
Procedure LoadNEO()
  Protected URL$, Json$, JsonID, Root, NearEarth
  Protected DateArrayValue, NeoArray, NeoCount, j
  Protected ObjNode, Name$, MagH$, Haz$, Distance$, Speed$
  Protected Date$, CAD, CADCount, CADItem, MissDist, RelVel
  Protected HazardValue
  
  ; On récupère les NEO du jour
  Date$ = FormatDate("%yyyy-%mm-%dd", Date())
  
  URL$ = NASA_BASE_URL$ + "/neo/rest/v1/feed?start_date=" + Date$ + "&end_date=" + Date$ + "&api_key=" + NASA_API_KEY$
  
  Json$ = HttpGet(URL$)
  If Json$ = ""
    ShowError("Impossible de récupérer les données ...")
    ProcedureReturn
  EndIf
  
  ClearGadgetItems(#ListNeo)
  
  JsonID = ParseJSON(#PB_Any, Json$)
  If JsonID = 0
    ShowError("Erreur de parsing JSON NEO.")
    ProcedureReturn
  EndIf
  
  Root = JSONValue(JsonID)
  If Root = 0
    ShowError("Format NEO inattendu.")
    FreeJSON(JsonID)
    ProcedureReturn
  EndIf
  
  ; near_earth_objects est un objet dont chaque clé est une date
  NearEarth = GetJSONMember(Root, "near_earth_objects")
  If NearEarth = 0
    ShowError("Champ 'near_earth_objects' introuvable.")
    FreeJSON(JsonID)
    ProcedureReturn
  EndIf
  
  ; On ne lit que la date du jour : near_earth_objects[Date$]
  DateArrayValue = GetJSONMember(NearEarth, Date$)
  If DateArrayValue = 0
    ShowError("Aucun NEO trouvé pour la date " + Date$ + ".")
    FreeJSON(JsonID)
    ProcedureReturn
  EndIf
  
  NeoArray = DateArrayValue
  NeoCount = JSONArraySize(NeoArray)
  
  For j = 0 To NeoCount - 1
    ObjNode = GetJSONElement(NeoArray, j)
    If ObjNode
      Name$ = JSON_GetField(ObjNode, "name")
      
      If GetJSONMember(ObjNode, "absolute_magnitude_h")
        MagH$ = StrD(GetJSONDouble(GetJSONMember(ObjNode, "absolute_magnitude_h")))
      Else
        MagH$ = ""
      EndIf
      
      HazardValue = GetJSONMember(ObjNode, "is_potentially_hazardous_asteroid")
      If HazardValue And GetJSONBoolean(HazardValue)
        Haz$ = "Oui"
      Else
        Haz$ = "Non"
      EndIf
      
      Distance$ = ""
      Speed$    = ""
      
      ; Distance & vitesse approx (première approche close_approach_data)
      CAD = GetJSONMember(ObjNode, "close_approach_data")
      If CAD
        CADCount = JSONArraySize(CAD)
        If CADCount > 0
          CADItem = GetJSONElement(CAD, 0)
          If CADItem
            MissDist = GetJSONMember(CADItem, "miss_distance")
            If MissDist
              Distance$ = JSON_GetField(MissDist, "kilometers")
            EndIf
            RelVel = GetJSONMember(CADItem, "relative_velocity")
            If RelVel
              Speed$ = JSON_GetField(RelVel, "kilometers_per_hour")
            EndIf
          EndIf
        EndIf
      EndIf
      
      AddGadgetItem(#ListNeo, -1, Date$ + Chr(10) + Name$ + Chr(10) + MagH$ + Chr(10) + Haz$ + Chr(10) + Distance$ + Chr(10) + Speed$)
    EndIf
  Next j
  
  FreeJSON(JsonID)
EndProcedure

; ----------------------------------------------------------------------
; MARS IMAGES via NASA Image and Video Library
; ----------------------------------------------------------------------
Procedure LoadMarsImages()
  Protected Query$, URL$, Json$, JsonID, Root, Collection, Items
  Protected Count, i, Item, DataArray, LinksArray, Data0, Link0
  Protected Title$, Date$, ImgUrl$
  
  Query$ = Trim(GetGadgetText(#EdtMarsImgQuery))
  If Query$ = ""
    Query$ = "curiosity rover"
  EndIf
  
  URL$ = "https://images-api.nasa.gov/search?q=" + UrlEncode(Query$) + "&media_type=image"
  
  Json$ = HttpGet(URL$)
  If Json$ = ""
    ShowError("Impossible de récupérer les images pour la requête : " + Query$)
    ProcedureReturn
  EndIf
  
  ClearGadgetItems(#ListMarsImg)
  
  JsonID = ParseJSON(#PB_Any, Json$)
  If JsonID = 0
    ShowError("Erreur de parsing JSON (Mars Images).")
    ProcedureReturn
  EndIf
  
  Root = JSONValue(JsonID)
  If Root = 0
    ShowError("Format JSON inattendu (Mars Images).")
    FreeJSON(JsonID)
    ProcedureReturn
  EndIf
  
  Collection = GetJSONMember(Root, "collection")
  If Collection = 0
    ShowError("Champ 'collection' introuvable (Mars Images).")
    FreeJSON(JsonID)
    ProcedureReturn
  EndIf
  
  Items = GetJSONMember(Collection, "items")
  If Items = 0 Or JSONType(Items) <> #PB_JSON_Array
    ShowError("Champ 'items' introuvable ou invalide (Mars Images).")
    FreeJSON(JsonID)
    ProcedureReturn
  EndIf
  
  Count = JSONArraySize(Items)
  For i = 0 To Count - 1
    Item = GetJSONElement(Items, i)
    If Item
      Title$ = ""
      Date$  = ""
      ImgUrl$ = ""
      
      DataArray = GetJSONMember(Item, "data")
      If DataArray And JSONType(DataArray) = #PB_JSON_Array And JSONArraySize(DataArray) > 0
        Data0 = GetJSONElement(DataArray, 0)
        If Data0
          Title$ = JSON_GetField(Data0, "title")
          Date$  = JSON_GetField(Data0, "date_created")
        EndIf
      EndIf
      
      LinksArray = GetJSONMember(Item, "links")
      If LinksArray And JSONType(LinksArray) = #PB_JSON_Array And JSONArraySize(LinksArray) > 0
        Link0 = GetJSONElement(LinksArray, 0)
        If Link0
          ImgUrl$ = JSON_GetField(Link0, "href")
        EndIf
      EndIf
      
      If Title$ <> "" Or ImgUrl$ <> ""
        AddGadgetItem(#ListMarsImg, -1, Title$ + Chr(10) + Date$ + Chr(10) + ImgUrl$)
      EndIf
    EndIf
  Next i
  
  FreeJSON(JsonID)
EndProcedure

; ----------------------------------------------------------------------
; MARS METEO (InSight Weather API)
; ----------------------------------------------------------------------
Procedure LoadMarsWeather()
  Protected URL$, Json$, JsonID, Root, SolKeys, SolCount, i
  Protected SolNode, SolKey$, SolObj
  Protected AT, PRE
  Protected Tmn$, Tmx$, Pav$, FirstUTC$, Season$
  
  URL$ = "https://api.nasa.gov/insight_weather/?api_key=" + NASA_API_KEY$ + "&feedtype=json&ver=1.0"
  
  Json$ = HttpGet(URL$)
  If Json$ = ""
    ShowError("Impossible de récupérer la météo InSight (API indisponible ou clé invalide).")
    ProcedureReturn
  EndIf
  
  ClearGadgetItems(#ListMarsWeather)
  
  JsonID = ParseJSON(#PB_Any, Json$)
  If JsonID = 0
    ShowError("Erreur de parsing JSON (Mars Météo).")
    ProcedureReturn
  EndIf
  
  Root = JSONValue(JsonID)
  If Root = 0
    ShowError("Format JSON inattendu (Mars Météo).")
    FreeJSON(JsonID)
    ProcedureReturn
  EndIf
  
  SolKeys = GetJSONMember(Root, "sol_keys")
  If SolKeys = 0 Or JSONType(SolKeys) <> #PB_JSON_Array
    ShowError("Champ 'sol_keys' introuvable (Mars Météo).")
    FreeJSON(JsonID)
    ProcedureReturn
  EndIf
  
  SolCount = JSONArraySize(SolKeys)
  For i = 0 To SolCount - 1
    SolNode = GetJSONElement(SolKeys, i)
    If SolNode
      SolKey$ = GetJSONString(SolNode)
      If SolKey$ <> ""
        SolObj = GetJSONMember(Root, SolKey$)
        If SolObj
          FirstUTC$ = JSON_GetField(SolObj, "First_UTC")
          Season$   = JSON_GetField(SolObj, "Season")
          
          Tmn$ = ""
          Tmx$ = ""
          Pav$ = ""
          
          AT = GetJSONMember(SolObj, "AT")
          If AT
            Tmn$ = JSON_GetField(AT, "mn")
            Tmx$ = JSON_GetField(AT, "mx")
          EndIf
          
          PRE = GetJSONMember(SolObj, "PRE")
          If PRE
            Pav$ = JSON_GetField(PRE, "av")
          EndIf
          
          AddGadgetItem(#ListMarsWeather, -1, SolKey$ + Chr(10) + FirstUTC$ + Chr(10) + Tmn$ + Chr(10) + Tmx$ + Chr(10) + Pav$ + Chr(10) + Season$)
        EndIf
      EndIf
    EndIf
  Next i
  
  FreeJSON(JsonID)
EndProcedure

; ----------------------------------------------------------------------
; MARS HiRISE (images MRO via NASA Image Library)
; ----------------------------------------------------------------------
Procedure LoadMarsHiRISE()
  Protected URL$, Json$, JsonID, Root, Collection, Items
  Protected Count, i, Item, DataArray, LinksArray, Data0, Link0
  Protected Title$, Date$, ImgUrl$
  
  ; Requête fixe pour des images HiRISE de Mars
  URL$ = "https://images-api.nasa.gov/search?q=" + UrlEncode("HiRISE Mars") + "&media_type=image"
  
  Json$ = HttpGet(URL$)
  If Json$ = ""
    ShowError("Impossible de récupérer les images HiRISE.")
    ProcedureReturn
  EndIf
  
  ClearGadgetItems(#ListMarsHiRISE)
  
  JsonID = ParseJSON(#PB_Any, Json$)
  If JsonID = 0
    ShowError("Erreur de parsing JSON (Mars HiRISE).")
    ProcedureReturn
  EndIf
  
  Root = JSONValue(JsonID)
  If Root = 0
    ShowError("Format JSON inattendu (Mars HiRISE).")
    FreeJSON(JsonID)
    ProcedureReturn
  EndIf
  
  Collection = GetJSONMember(Root, "collection")
  If Collection = 0
    ShowError("Champ 'collection' introuvable (Mars HiRISE).")
    FreeJSON(JsonID)
    ProcedureReturn
  EndIf
  
  Items = GetJSONMember(Collection, "items")
  If Items = 0 Or JSONType(Items) <> #PB_JSON_Array
    ShowError("Champ 'items' introuvable ou invalide (Mars HiRISE).")
    FreeJSON(JsonID)
    ProcedureReturn
  EndIf
  
  Count = JSONArraySize(Items)
  For i = 0 To Count - 1
    Item = GetJSONElement(Items, i)
    If Item
      Title$ = ""
      Date$  = ""
      ImgUrl$ = ""
      
      DataArray = GetJSONMember(Item, "data")
      If DataArray And JSONType(DataArray) = #PB_JSON_Array And JSONArraySize(DataArray) > 0
        Data0 = GetJSONElement(DataArray, 0)
        If Data0
          Title$ = JSON_GetField(Data0, "title")
          Date$  = JSON_GetField(Data0, "date_created")
        EndIf
      EndIf
      
      LinksArray = GetJSONMember(Item, "links")
      If LinksArray And JSONType(LinksArray) = #PB_JSON_Array And JSONArraySize(LinksArray) > 0
        Link0 = GetJSONElement(LinksArray, 0)
        If Link0
          ImgUrl$ = JSON_GetField(Link0, "href")
        EndIf
      EndIf
      
      If Title$ <> "" Or ImgUrl$ <> ""
        AddGadgetItem(#ListMarsHiRISE, -1, Title$ + Chr(10) + Date$ + Chr(10) + ImgUrl$)
      EndIf
    EndIf
  Next i
  
  FreeJSON(JsonID)
EndProcedure


; ----------------------------------------------------------------------
; FONCTIONS EPIC (images de la Terre) - via epic.gsfc.nasa.gov (sans api_key)
; ----------------------------------------------------------------------

; /api/natural
Procedure LoadEPIC()
  Protected URL$, Json$, JsonID, Root, Count, i, Node, Date$, Img$
  
  ; On n'utilise PAS NASA_BASE_URL ici, on tape directement l'API EPIC
  URL$ = "https://epic.gsfc.nasa.gov/api/natural"
  
  Json$ = HttpGet(URL$)
  If Json$ = ""
    ShowError("Impossible de récupérer les données EPIC (service indisponible).")
    ProcedureReturn
  EndIf
  
  ClearGadgetItems(#ListEpic)
  
  JsonID = ParseJSON(#PB_Any, Json$)
  If JsonID = 0
    ShowError("Erreur de parsing JSON EPIC.")
    ProcedureReturn
  EndIf
  
  Root = JSONValue(JsonID)
  If Root = 0 Or JSONType(Root) <> #PB_JSON_Array
    ShowError("Format EPIC inattendu (tableau JSON attendu).")
    FreeJSON(JsonID)
    ProcedureReturn
  EndIf
  
  Count = JSONArraySize(Root)
  For i = 0 To Count - 1
    Node = GetJSONElement(Root, i)
    If Node
      Date$ = JSON_GetField(Node, "date")
      Img$  = JSON_GetField(Node, "image")
      AddGadgetItem(#ListEpic, -1, Date$ + Chr(10) + Img$)
    EndIf
  Next i
  
  FreeJSON(JsonID)
EndProcedure

; ----------------------------------------------------------------------
; FONCTIONS DONKI (Space Weather)
; ----------------------------------------------------------------------

; /DONKI/CME?startDate=YYYY-MM-DD&endDate=YYYY-MM-DD&api_key=...
Procedure LoadDonki()
  Protected Start$, End$, URL$, Json$, JsonID, Root
  Protected Count, i, Node, Time$, Note$
  
  ; On prend les 7 derniers jours
  Start$ = FormatDate("%yyyy-%mm-%dd", Date() - 7 * 24 * 60 * 60)
  End$   = FormatDate("%yyyy-%mm-%dd", Date())
  
  URL$ = NASA_BASE_URL$ + "/DONKI/CME?startDate=" + Start$ + "&endDate=" + End$ + "&api_key=" + NASA_API_KEY$
  Json$ = HttpGet(URL$)
  If Json$ = ""
    ShowError("Impossible de récupérer les données DONKI CME.")
    ProcedureReturn
  EndIf
  
  ClearGadgetItems(#ListDonki)
  
  JsonID = ParseJSON(#PB_Any, Json$)
  If JsonID = 0
    ShowError("Erreur de parsing JSON DONKI.")
    ProcedureReturn
  EndIf
  
  Root = JSONValue(JsonID)
  If Root = 0
    ShowError("Format DONKI inattendu.")
    FreeJSON(JsonID)
    ProcedureReturn
  EndIf
  
  Count = JSONArraySize(Root)
  For i = 0 To Count - 1
    Node = GetJSONElement(Root, i)
    If Node
      Time$ = JSON_GetField(Node, "startTime")
      Note$ = JSON_GetField(Node, "note")
      AddGadgetItem(#ListDonki, -1, Time$ + Chr(10) + Note$)
    EndIf
  Next i
  
  FreeJSON(JsonID)
EndProcedure

; ----------------------------------------------------------------------
; CREATION INTERFACE
; ----------------------------------------------------------------------
Procedure CreateGUI()
  Protected w = 1100, h = 700
  
  If OpenWindow(#WinMain, 0, 0, w, h, "Client NASA API", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_SizeGadget)
    
    PanelGadget(#TabMain, 10, 10, w - 20, h - 20)
    
    ; ====================================================================
    ; ONGLET APOD
    ; ====================================================================
    AddGadgetItem(#TabMain, -1, "APOD")
    
    ButtonGadget(#BtnApodLoad, 20, 40, 160, 30, "Charger l'APOD du jour")
    ImageGadget(#ImgApod, 20, 80, 400, 300, 0, #PB_Image_Border)
    
    TextGadget(#PB_Any, 440, 40, 100, 20, "Titre :")
    StringGadget(#EdtApodTitle, 490, 40, 580, 20, "")
    
    TextGadget(#PB_Any, 440, 70, 100, 20, "Date :")
    StringGadget(#EdtApodDate, 490, 70, 200, 20, "")
    
    TextGadget(#PB_Any, 440, 100, 100, 20, "URL :")
    StringGadget(#EdtApodUrl, 490, 100, 580, 20, "")
    
    TextGadget(#PB_Any, 440, 130, 200, 20, "Description :")
    EditorGadget(#TxtApodExplanation, 440, 150, 630, 230)
    
    ; ====================================================================
    ; ONGLET NEO
    ; ====================================================================
    AddGadgetItem(#TabMain, -1, "NEO (Astéroïdes)")
    
    ButtonGadget(#BtnNeoLoad, 20, 40, 250, 30, "Charger les NEO d'aujourd'hui")
    
    ListIconGadget(#ListNeo, 20, 80, w - 60, h - 140, "Date", 100)
    AddGadgetColumn(#ListNeo, 1, "Nom", 200)
    AddGadgetColumn(#ListNeo, 2, "Mag H", 60)
    AddGadgetColumn(#ListNeo, 3, "Dangereux ?", 90)
    AddGadgetColumn(#ListNeo, 4, "Dist (km)", 120)
    AddGadgetColumn(#ListNeo, 5, "Vitesse (km/h)", 140)
    
    ; ====================================================================
    ; ONGLET MARS - IMAGES
    ; ====================================================================
    AddGadgetItem(#TabMain, -1, "Mars - Images")
    
    TextGadget(#PB_Any, 20, 40, 70, 20, "Rechercher :")
    StringGadget(#EdtMarsImgQuery, 90, 40, 250, 20, "curiosity rover")
    ButtonGadget(#BtnMarsImgSearch, 360, 40, 260, 30, "Chercher dans NASA Image Library")
    
    ListIconGadget(#ListMarsImg, 20, 80, w - 60, h - 140, "Titre", 300)
    AddGadgetColumn(#ListMarsImg, 1, "Date", 150)
    AddGadgetColumn(#ListMarsImg, 2, "URL image", 400)
    
    ; ====================================================================
    ; ONGLET MARS - METEO (InSight)
    ; ====================================================================
    AddGadgetItem(#TabMain, -1, "Mars - Météo (InSight)")
    
    ButtonGadget(#BtnMarsWeatherLoad, 20, 40, 260, 30, "Charger la météo (InSight)")
    
    ListIconGadget(#ListMarsWeather, 20, 80, w - 60, h - 140, "Sol", 80)
    AddGadgetColumn(#ListMarsWeather, 1, "Date début", 180)
    AddGadgetColumn(#ListMarsWeather, 2, "Temp min (°C)", 120)
    AddGadgetColumn(#ListMarsWeather, 3, "Temp max (°C)", 120)
    AddGadgetColumn(#ListMarsWeather, 4, "Pression moy (Pa)", 140)
    AddGadgetColumn(#ListMarsWeather, 5, "Saison", 120)
    
    ; ====================================================================
    ; ONGLET MARS - HiRISE
    ; ====================================================================
    AddGadgetItem(#TabMain, -1, "Mars - HiRISE")
    
    ButtonGadget(#BtnMarsHiRISELoad, 20, 40, 260, 30, "Charger images HiRISE (NASA Library)")
    
    ListIconGadget(#ListMarsHiRISE, 20, 80, w - 60, h - 140, "Titre", 300)
    AddGadgetColumn(#ListMarsHiRISE, 1, "Date", 180)
    AddGadgetColumn(#ListMarsHiRISE, 2, "URL image", 400)
    
    ; ====================================================================
    ; ONGLET EPIC
    ; ====================================================================
    AddGadgetItem(#TabMain, -1, "EPIC (Terre)")
    
    ButtonGadget(#BtnEpicLoad, 20, 40, 220, 30, "Charger images EPIC")
    
    ListIconGadget(#ListEpic, 20, 80, w - 60, h - 140, "Date", 200)
    AddGadgetColumn(#ListEpic, 1, "Image", 400)
    
    ; ====================================================================
    ; ONGLET DONKI
    ; ====================================================================
    AddGadgetItem(#TabMain, -1, "DONKI (Space Weather)")
    
    ButtonGadget(#BtnDonkiLoad, 20, 40, 260, 30, "Charger CME (7 derniers jours)")
    
    ListIconGadget(#ListDonki, 20, 80, w - 60, h - 140, "Start Time", 200)
    AddGadgetColumn(#ListDonki, 1, "Note", 500)
    
  EndIf
EndProcedure

; ----------------------------------------------------------------------
; BOUCLE PRINCIPALE
; ----------------------------------------------------------------------
Procedure Main()
  Protected Event, GadgetID
  
  CreateGUI()
  
  Repeat
    Event = WaitWindowEvent()
    
    Select Event
      Case #PB_Event_CloseWindow
        Break
        
      Case #PB_Event_Gadget
        GadgetID = EventGadget()
        
        Select GadgetID
          Case #BtnApodLoad
            LoadAPOD()
          Case #BtnNeoLoad
            LoadNEO()
          Case #BtnMarsImgSearch
            LoadMarsImages()
          Case #BtnMarsWeatherLoad
            LoadMarsWeather()
          Case #BtnMarsHiRISELoad
            LoadMarsHiRISE()
          Case #BtnEpicLoad
            LoadEPIC()
          Case #BtnDonkiLoad
            LoadDonki()
        EndSelect
        
    EndSelect
    
  ForEver
  
EndProcedure

; ----------------------------------------------------------------------
; LANCEMENT
; ----------------------------------------------------------------------
Main()
End

Avatar de l’utilisateur
SPH
Messages : 5018
Inscription : mer. 09/nov./2005 9:53

Re: NASA Open APIs

Message par SPH »

Hoooo, merci pour ça. Je regarderais en détail demain... 8)

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Répondre