The Movie Database (Utilisation de l'API)

Partagez votre expérience de PureBasic avec les autres utilisateurs.
boddhi
Messages : 596
Inscription : lun. 26/avr./2010 16:14
Localisation : S 48° 52' 31'' / O 123° 23' 33''

The Movie Database (Utilisation de l'API)

Message par boddhi »

Un petit code qui permet de récupérer des informations sur des films grâce à l'API de TheMovieDatabase.
Toutes les données récupérables à l'aide de cette API ne sont pas forcément gérées.
Ce n'est qu'une base (j'ai une version plus complexe intégrée dans un gestionnaire de base de données de vidéos).

Pour pouvoir l'utiliser, il vous faut obtenir une clé API auprès du site.
Si cela vous intéresse, c'est par ici et c'est gratuit !
Une fois votre clé obtenue, il vous suffira de modifier la valeur de la constante #CLETMDB du source.

N'hésitez pas à me faire part de vos remarques et/ou possibilités d'améliorations/optimisations.

Code : Tout sélectionner

EnableExplicit
; ╔═════════════════════════════════════════════════════════════════════════════╗
; ║ STRUCTURES - ENUMERATIONS - CONSTANTES - MACROS - MAPS - VARIABLES GLOBALES ║
; ╚═════════════════════════════════════════════════════════════════════════════╝
;{ ════  PLUGINS              ════
;- ════  PLUGINS
UseJPEGImageDecoder()
;}
;{ ════  STRUCTURES           ════
;- ════  STRUCTURES           ════
Structure JSONTMDB_GENRE ;{
  id.l
  name.s
EndStructure ;}
Structure JSONTMDB_GENRES ;{
  List genres.JSONTMDB_GENRE()
EndStructure ;}
Structure JSONTMDB_FILM ;{
	vote_average.l
	overview.s
	release_date.s
	original_language.s
	original_title.s
	backdrop_path.s
	popularity.f
	poster_path.s
	title.s
	vote_count.l
	adult.s
	video.s
	id.q
	List genre_ids.l()
EndStructure ;}
Structure JSONTMDB_FILMS ;{
	total_results.l
	total_pages.l
	page.l
	List results.JSONTMDB_FILM()
EndStructure ;}
Structure JSONTMDB_AFFICHE ;{
  aspect_ratio.d
  height.u
  vote_average.d
  file_path.s
  iso_639_1.s
  width.u
  vote_count.w
EndStructure ;}
Structure JSONTMDB_AFFICHES ;{
  List posters.JSONTMDB_AFFICHE()
EndStructure ;}
Structure DONNEEAFFICHE
  Nom.s
  Dimensions.s
EndStructure
Structure FILMTMDB
  IDTMDB.i
  Titre.s
  TitreOrig.s
  Annee.s
  Genre.s
  Synopsis.s
  Miniature.a
  List Affiches.DONNEEAFFICHE()
EndStructure
;}
;{ ════  ENUMERATIONS         ════
;- ════  ENUMERATIONS ════
Runtime Enumeration Fenetres ;{
  #FEN_RECHERCHETMDB
EndEnumeration ;}
Runtime Enumeration Gadgets ;{ 
  #GAD_LIB_TITRERECHERCHE
  #GAD_CP_TITRERECHERCHE
  #GAD_BT_RECHERCHER
  #GAD_LIB_MOTNBITEMS
  #GAD_LIB_NBITEMS
  #GAD_LS_TITRESTMDB
  #GAD_BT_OUVRIRLIENINTERNET
  #GAD_BG_DONNEES
  #GAD_LIB_IDTMDB
  #GAD_CP_IDTMDB
  #GAD_LIB_TITRETMDB
  #GAD_CP_TITRETMDB
  #GAD_LIB_TITREORIGTMDB
  #GAD_CP_TITREORIGTMDB
  #GAD_LIB_ANNEETMDB
  #GAD_CP_ANNEETMDB
  #GAD_LIB_GENRETMDB
  #GAD_CP_GENRETMDB
  #GAD_LIB_SYNOPSISTMDB
  #GAD_ED_SYNOPSISTMDB
  #GAD_IMG_AFFICHETMDB
  #GAD_LIB_DIMENSIONSAFFICHE
  #GAD_BT_AFFICHETMDBPRECEDENTE
  #GAD_CP_NOAFFICHE
  #GAD_BT_AFFICHETMDBSUIVANTE
  #GAD_BT_CHARGERAFFICHE
  #GAD_BT_QUITTER
EndEnumeration ;}
Enumeration MenusRaccourcis 500 ;{
  #RACCOURCI_QUITTER        ; Échap
EndEnumeration ;}
Enumeration XML ;{
  #TMDB_XML
EndEnumeration ;}
Enumeration DialoguesXML ;{
  #XML_FENPRINCIPALE
EndEnumeration ;}
Enumeration JSON ;{
  #TMDB_JSON
  #TMDB_JSONAFFICHE
EndEnumeration ;}
Enumeration Images ;{
  #IMG_AFFICHE
EndEnumeration ;}
Enumeration Fichiers ;{
  #FIC_IMAGE
EndEnumeration ;}
;}
;{ ════  CONSTANTES           ════
;- ════  CONSTANTES           ════
#CLETMDB=""
;#CLETMDB=""
CompilerIf #CLETMDB=""
  CompilerError "Vous devez définir votre clé TMDB !"
  End
CompilerEndIf
#LANGAGETMDB="&language=fr"
#TAILLEAFFICHE="185" ; Valeurs possibles : 92, 154, 185, 342, 500, 780 (ou "original" mais ne pas utiliser ce dernier dans ce code)
#URLTMDB_GENRES="https://api.themoviedb.org/3/genre/movie/list?api_key="+#CLETMDB+#LANGAGETMDB
#URLTMDB_AFFICHES="https://image.tmdb.org/t/p/"
;}
;{ ════  MACROS               ════
; -════  MACROS               ════
Macro Mc_FormatageXML(ArgChaine)
  EscapeString(ArgChaine,#PB_String_EscapeXML)
EndMacro
Macro Mc_DeformatageXML(ArgChaine)
  UnescapeString(ArgChaine,#PB_String_EscapeXML)
EndMacro
Macro Mc_RemplacementChaineS(ArgChaine,ArgChaineRemplacement)
  ReplaceString(ArgChaine,"%s",ArgChaineRemplacement)
EndMacro
;}
;{ ════  MAPS                 ════
;- ════  MAPS                 ════
Global NewMap GenresTMDB.s()
;}
;{ ════  LISTES               ════
;- ════  LISTES               ════
Global NewList FilmsTMDB.FILMTMDB()
;}
;{ ════  VARIABLES GLOBALES   ════
;- ════  VARIABLES GLOBALES   ════
;}
; ╔═════════════════════════════════════════╗
; ║ DECLARATIONS - FICHIERS INCLUS - IMAGES ║
; ╚═════════════════════════════════════════╝
;{ ════  DECLARATIONS         ════
;- ════  DECLARATIONS         ════
;}
;{ ════  FICHIERS INCLUS      ════
;- ════  FICHIERS INCLUS      ════
;}
;{ ════  IMAGES               ════
;- ════  IMAGES               ════
;}
;-══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
; ╔════════════╗
; ║ PROCEDURES ║
; ╚════════════╝
Procedure   Pc_TMDB_RecuperationGenres()
  Protected *RetourTMDB
  Protected.JSONTMDB_GENRES Genres
  Protected.i IDJSON
  Protected.s Chaine
  Protected NewList ListeGenres.s()

  *RetourTMDB=ReceiveHTTPMemory(#URLTMDB_GENRES)
  If *RetourTMDB
    IDJSON=CatchJSON(#TMDB_JSON,*RetourTMDB,MemorySize(*RetourTMDB))
    If IDJSON
      ExtractJSONStructure(JSONValue(#TMDB_JSON),@Genres,JSONTMDB_GENRES)
      With Genres
        ForEach \Genres()
          GenresTMDB(Str(\Genres()\id))=\Genres()\name
        Next
      EndWith
	    FreeJSON(#TMDB_JSON)
		EndIf
		FreeMemory(*RetourTMDB)
	EndIf
EndProcedure
Procedure   Pc_TMDB_OuvertureLienInternetFilm()
  Protected.u NoItem=GetGadgetState(#GAD_LS_TITRESTMDB)
  
  If NoItem>=0
    SelectElement(FilmsTMDB(),NoItem)
    RunProgram("https://www.themoviedb.org/movie/"+FilmsTMDB()\IDTMDB)
  EndIf
EndProcedure  
Procedure   Pc_TMDB_ChargementAffiche()
  Static.s AncDossier
  Protected *TamponAffiche
  Protected.q NbOctets
  Protected.s Dossier=AncDossier,Fichier,Extension

  If FilmsTMDB()\Affiches()
    If FileSize(AncDossier)<>-2
      Dossier=GetUserDirectory(#PB_Directory_Pictures)
    EndIf
    Extension=GetExtensionPart(FilmsTMDB()\Affiches()\Nom)
    Fichier=SaveFileRequester("Sauvegarde de l'affiche",Dossier+FilmsTMDB()\Titre+"-"+FilmsTMDB()\Affiches()\Dimensions+"."+Extension,"Fichiers "+Extension,0)
    If Fichier="":ProcedureReturn:EndIf
    If FileSize(Fichier)>=0
      If MessageRequester("Sauvegarde d'affiche",UnescapeString("Le fichier existe déjà !\n\nLe remplacer ?"),#PB_MessageRequester_YesNo)=#PB_MessageRequester_No:ProcedureReturn:EndIf
    EndIf
    AncDossier=GetPathPart(Fichier)
    If Not CreateFile(#FIC_IMAGE,Fichier)
      MessageRequester("Sauvegarde d'affiche","Le fichier n'a pu être créé !",#PB_MessageRequester_Error)
      ProcedureReturn
    EndIf
    *TamponAffiche=ReceiveHTTPMemory(#URLTMDB_AFFICHES+"original/"+FilmsTMDB()\Affiches()\Nom)
    If *TamponAffiche
      NbOctets=WriteData(#FIC_IMAGE,*TamponAffiche,MemorySize(*TamponAffiche))
      FreeMemory(*TamponAffiche)
    Else
      MessageRequester("Sauvegarde d'affiche","Le chargement de l'affiche a échoué !",#PB_MessageRequester_Error)
    EndIf
    CloseFile(#FIC_IMAGE)
  EndIf
EndProcedure

Procedure   Pc_TMDB_RechercheDonneesPageFilm(ArgTitre.s,ArgNoPage.u=0)
  Protected *RetourTMDB,*RetourTMDBAffiches
  Protected.JSONTMDB_FILMS DonneesPagesTMDB
  Protected.JSONTMDB_AFFICHES DonneesAffichesTMDB
  Protected.i IDJSON,IDJSONAffiches
  Protected.u NbPagesTMDB,NoPageTMDB
  Protected.s NoPage,AffichePrincipale

  If ArgNoPage>0
    NoPage="&page="+Str(ArgNoPage)
  EndIf
  *RetourTMDB=ReceiveHTTPMemory("https://api.themoviedb.org/3/search/movie?api_key="+#CLETMDB+"&query="+ArgTitre+#LANGAGETMDB+NoPage)
  If *RetourTMDB
    IDJSON=CatchJSON(#TMDB_JSON,*RetourTMDB,MemorySize(*RetourTMDB))
  	If IDJSON
  	  ExtractJSONStructure(JSONValue(#TMDB_JSON),@DonneesPagesTMDB,JSONTMDB_FILMS)
  	  NbPagesTMDB=DonneesPagesTMDB\total_pages
  	  NoPageTMDB=DonneesPagesTMDB\page
		  If DonneesPagesTMDB\total_results
	      ForEach DonneesPagesTMDB\results()
	        AddElement(FilmsTMDB())
	        With FilmsTMDB()
	          \IDTMDB=DonneesPagesTMDB\results()\id
	          \Titre=DonneesPagesTMDB\results()\title
	          \TitreOrig=DonneesPagesTMDB\results()\original_title
	          \Annee=Left(DonneesPagesTMDB\results()\release_date,4)
	          \Synopsis=DonneesPagesTMDB\results()\overview
	          If DonneesPagesTMDB\results()\poster_path
	            AffichePrincipale=DonneesPagesTMDB\results()\poster_path
	            AddElement(\Affiches())
	            \Affiches()\Nom=AffichePrincipale
	          EndIf
	          ; ---- Récupération URL affiches françaises
	          *RetourTMDBAffiches=ReceiveHTTPMemory("https://api.themoviedb.org/3/movie/"+\IDTMDB+"/images?api_key="+#CLETMDB)
            If *RetourTMDBAffiches
              IDJSONAffiches=CatchJSON(#TMDB_JSONAFFICHE,*RetourTMDBAffiches,MemorySize(*RetourTMDBAffiches))
              If IDJSONAffiches
            	  ExtractJSONStructure(JSONValue(#TMDB_JSONAFFICHE),@DonneesAffichesTMDB,JSONTMDB_AFFICHES)
              	ForEach DonneesAffichesTMDB\posters()
              	  If DonneesAffichesTMDB\posters()\file_path=AffichePrincipale
              	    SelectElement(\Affiches(),0)
            	      \Affiches()\Dimensions=Str(DonneesAffichesTMDB\posters()\width)+" x "+Str(DonneesAffichesTMDB\posters()\height)
              	  ElseIf DonneesAffichesTMDB\posters()\iso_639_1="fr"
            	      AddElement(\Affiches())
            	      \Affiches()\Nom=DonneesAffichesTMDB\posters()\file_path
            	      \Affiches()\Dimensions=Str(DonneesAffichesTMDB\posters()\width)+" x "+Str(DonneesAffichesTMDB\posters()\height)
            	    EndIf
            	  Next
            	  FreeJSON(#TMDB_JSONAFFICHE)
            	EndIf
		          FreeMemory(*RetourTMDBAffiches)
		        EndIf
		        ; ---- Traitement genres film
	          ForEach DonneesPagesTMDB\results()\genre_ids()
	            \Genre+"|"+GenresTMDB(Str(DonneesPagesTMDB\results()\genre_ids()))
	          Next
	          \Genre=ReplaceString(LTrim(\Genre,"|"),"|"," - ")
	        EndWith
	      Next
	    EndIf
	    FreeJSON(#TMDB_JSON)
		EndIf
		FreeMemory(*RetourTMDB)
	EndIf
	If NoPageTMDB<NbPagesTMDB
	  Pc_TMDB_RechercheDonneesPageFilm(ArgTitre.s,NoPageTMDB+1)
	EndIf
EndProcedure
Procedure   Pc_TMDB_ReinitialisationGadgets(ArgMode.a=#True)
  SetGadgetText(#GAD_CP_IDTMDB,"")
  SetGadgetText(#GAD_CP_TITRETMDB,"")
  SetGadgetText(#GAD_CP_TITREORIGTMDB,"")
  SetGadgetText(#GAD_CP_ANNEETMDB,"")
  SetGadgetText(#GAD_CP_GENRETMDB,"")
  SetGadgetText(#GAD_ED_SYNOPSISTMDB,"")
  SetGadgetText(#GAD_CP_NOAFFICHE,"")
  SetGadgetText(#GAD_LIB_DIMENSIONSAFFICHE,"")
  SetGadgetState(#GAD_IMG_AFFICHETMDB,0)
EndProcedure
Procedure   Pc_TMDB_AffichageDonneesFilm()
  Protected *TamponAffiche
  Protected.l NbDonnees=ListSize(FilmsTMDB()),NoItem,NoImage
  Protected.a NbAffiches

  If NbDonnees>=0
    NoItem=GetGadgetState(#GAD_LS_TITRESTMDB)
    SelectElement(FilmsTMDB(),NoItem)
    With FilmsTMDB()
      NbAffiches=ListSize(\Affiches())
      If NbAffiches
        FirstElement(\Affiches())
        *TamponAffiche=ReceiveHTTPMemory(#URLTMDB_AFFICHES+"w"+#TAILLEAFFICHE+"/"+\Affiches()\Nom)
        If *TamponAffiche
          If CatchImage(#IMG_AFFICHE,*TamponAffiche)
            NoImage=ImageID(#IMG_AFFICHE)
          EndIf
          FreeMemory(*TamponAffiche)
        EndIf
        SetGadgetText(#GAD_CP_NOAFFICHE,"1/"+Str(NbAffiches))
        SetGadgetText(#GAD_LIB_DIMENSIONSAFFICHE,\Affiches()\Dimensions)
      Else
        SetGadgetText(#GAD_CP_NOAFFICHE,"0")
        SetGadgetText(#GAD_LIB_DIMENSIONSAFFICHE,"")
      EndIf
      SetGadgetText(#GAD_CP_IDTMDB,Str(\IDTMDB))
      SetGadgetText(#GAD_CP_TITRETMDB,\Titre)
      SetGadgetText(#GAD_CP_TITREORIGTMDB,\TitreOrig)
      SetGadgetText(#GAD_CP_ANNEETMDB,\Annee)
      SetGadgetText(#GAD_CP_GENRETMDB,\Genre)
      SetGadgetText(#GAD_ED_SYNOPSISTMDB,\Synopsis)
    EndWith
    SetGadgetState(#GAD_IMG_AFFICHETMDB,NoImage)
  EndIf
  DisableGadget(#GAD_BT_AFFICHETMDBPRECEDENTE,#True)
  DisableGadget(#GAD_BT_AFFICHETMDBSUIVANTE,Bool(NbAffiches<=1))
  DisableGadget(#GAD_BT_CHARGERAFFICHE,Bool(NbAffiches=0))
EndProcedure
Procedure   Pc_TMDB_RechercheDonneesFilm()
  Protected.f Ratio
  Protected.u NbItems
  Protected.s NomFilm=GetGadgetText(#GAD_CP_TITRERECHERCHE),Chaine
  
  If NomFilm="":ProcedureReturn:EndIf
  ClearList(FilmsTMDB())
  DisableWindow(#FEN_RECHERCHETMDB,#True)
  Pc_TMDB_RechercheDonneesPageFilm(URLEncoder(NomFilm,#PB_UTF8))
  NbItems=ListSize(FilmsTMDB())
  SetGadgetText(#GAD_LIB_NBITEMS,Str(NbItems))
  ClearGadgetItems(#GAD_LS_TITRESTMDB)
  If NbItems
    ForEach FilmsTMDB()
      With FilmsTMDB()
        Chaine=\Titre
        If \Annee:Chaine+" ("+\Annee+")":EndIf
        AddGadgetItem(#GAD_LS_TITRESTMDB,-1,Chaine)
      EndWith
    Next
    SetGadgetState(#GAD_LS_TITRESTMDB,0)
    FirstElement(FilmsTMDB())
    Pc_TMDB_AffichageDonneesFilm()
  Else
	  Pc_TMDB_ReinitialisationGadgets()
	EndIf
  DisableGadget(#GAD_BT_OUVRIRLIENINTERNET,Bool(NbItems=0))
  DisableWindow(#FEN_RECHERCHETMDB,#False)
EndProcedure
Procedure   Pc_TMDB_ChangementAffiche(ArgNoGadget.l)
  Protected *TamponAffiche
  Protected.l NoImage
  Protected.a NbAffiches=ListSize(FilmsTMDB()\Affiches()),NoAffiche=ListIndex(FilmsTMDB()\Affiches())+1
  
  Select ArgNoGadget
    Case #GAD_BT_AFFICHETMDBPRECEDENTE
      PreviousElement(FilmsTMDB()\Affiches())
      NoAffiche-1
    Case #GAD_BT_AFFICHETMDBSUIVANTE
      NextElement(FilmsTMDB()\Affiches())
      NoAffiche+1
  EndSelect
  SetGadgetText(#GAD_CP_NOAFFICHE,Str(NoAffiche)+"/"+Str(NbAffiches))
  
  *TamponAffiche=ReceiveHTTPMemory(#URLTMDB_AFFICHES+"w"+#TAILLEAFFICHE+"/"+FilmsTMDB()\Affiches()\Nom)
  If *TamponAffiche
    If CatchImage(#IMG_AFFICHE,*TamponAffiche)
      NoImage=ImageID(#IMG_AFFICHE)
    EndIf
    FreeMemory(*TamponAffiche)
  EndIf
  SetGadgetState(#GAD_IMG_AFFICHETMDB,NoImage)
  SetGadgetText(#GAD_LIB_DIMENSIONSAFFICHE,FilmsTMDB()\Affiches()\Dimensions)
  DisableGadget(#GAD_BT_AFFICHETMDBPRECEDENTE,Bool(NoAffiche=1))
  DisableGadget(#GAD_BT_AFFICHETMDBSUIVANTE,Bool(NoAffiche=NbAffiches))
EndProcedure
;-══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
; ╔════════════════════╗
; ║ FENETRE PRINCIPALE ║
; ╚════════════════════╝
Procedure.a Fc_Fenetres_OuvertureDialogueXML(ArgArbreXML.u,ArgDialogueXML.u,ArgChaineXML.s,ArgNomFenetre.s,ArgIdFenetreParente.i=0)
  Protected.i NoDialogue
  Protected.a TypeErreur
  Protected.s TitreMSG="Recherche TMDB",MsgErreur
  
  If ArgChaineXML
    If ParseXML(ArgArbreXML,ArgChaineXML)
      If XMLStatus(ArgArbreXML)=#PB_XML_Success
        If CreateDialog(ArgDialogueXML)
          If ArgIdFenetreParente<>0
            NoDialogue=OpenXMLDialog(ArgDialogueXML,ArgArbreXML,ArgNomFenetre,0,0,0,0,ArgIdFenetreParente)
          Else
            NoDialogue=OpenXMLDialog(ArgDialogueXML,ArgArbreXML,ArgNomFenetre,0,0,0,0)
          EndIf
          If NoDialogue
            FreeXML(ArgArbreXML)
            ProcedureReturn #True
          Else
            TypeErreur=3
          EndIf
          FreeDialog(ArgDialogueXML)
        Else
          TypeErreur=2
        EndIf
        FreeXML(ArgArbreXML)
      Else
        TypeErreur=1
        MsgErreur="Erreur durant l'interprétation du dialogue XML !"
      EndIf
    Else
      TypeErreur=1
      MsgErreur="Erreur durant la lecture des données du dialogue XML !"
    EndIf
  EndIf
  Select TypeErreur
    Case 1:MsgErreur+"\n\n  No erreur : "+XMLStatus(ArgArbreXML)+" - "+XMLError(ArgArbreXML)+"\n  Ligne : "+Str(XMLErrorLine(ArgArbreXML))+" - Colonne : "+Str(XMLErrorPosition(ArgArbreXML))
    Case 2:MsgErreur="Erreur durant la création de la fenêtre de dialogue !"
    Case 3:MsgErreur="Erreur durant l'ouverture de la fenêtre de dialogue !\n\nErreur : "+DialogError(ArgDialogueXML)
  EndSelect
  MessageRequester(TitreMSG,UnescapeString(MsgErreur),#PB_MessageRequester_Error)
EndProcedure
Procedure   Pc_FenPrincipale_GestionEvenements()
  Debug #PB_Compiler_Procedure,5
  Define.l Evenmt,EvenmtMenu,TypeEvenmt,NoGadget

  Repeat
    Evenmt=WaitWindowEvent()
    TypeEvenmt=EventType()
    Select Evenmt
      Case #PB_Event_ActivateWindow
      Case #PB_Event_Gadget
        NoGadget=EventGadget()
        Select TypeEvenmt
          Case #PB_EventType_Change
            Select NoGadget
              Case #GAD_LS_TITRESTMDB:Pc_TMDB_AffichageDonneesFilm()
            EndSelect
          Case #PB_EventType_LeftClick
            Select NoGadget
              Case #GAD_BT_RECHERCHER:Pc_TMDB_RechercheDonneesFilm()
              Case #GAD_BT_OUVRIRLIENINTERNET:Pc_TMDB_OuvertureLienInternetFilm()
              Case #GAD_BT_AFFICHETMDBPRECEDENTE,#GAD_BT_AFFICHETMDBSUIVANTE:Pc_TMDB_ChangementAffiche(NoGadget)
              Case #GAD_BT_CHARGERAFFICHE:Pc_TMDB_ChargementAffiche()
              Case #GAD_BT_QUITTER:End
            EndSelect
        EndSelect
      Case #PB_Event_CloseWindow
        End
      Case #PB_Event_Menu
        EvenmtMenu=EventMenu()
        Select EvenmtMenu
          Case #RACCOURCI_QUITTER:End
        EndSelect
    EndSelect
  ForEver
EndProcedure
Procedure   Pc_FenPrincipale_Affichage()
  Protected.a ValeurRetour
  Protected.s ChaineXML
  
  ChaineXML="<?xml version='1.0' encoding='UTF-16'?>"+Chr(10)+ ;{
            "<dialogs>"+Chr(10)+
            "  <window id='"+Str(#FEN_RECHERCHETMDB)+"' name='FEN_RECHERCHETMDB' text='"+Mc_FormatageXML("Recherche Base de données TMDB (©Boddhi-2023)")+"' xpos='0' ypos='0' width='800' height='200' minwidth='auto' minheight='auto' maxheight='auto' margin='top:20,left:24,right:24,bottom:0' flags='#PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_Invisible|#PB_Window_ScreenCentered'>"+Chr(10)+
            "    <vbox expand='no' align='top' spacing='8'>"+Chr(10)+
            "      <hbox expand='item:2' align='left' spacing='4'>"+Chr(10)+
            "        <text id='"+Str(#GAD_LIB_TITRERECHERCHE)+"' name='GAD_LIB_TITRERECHERCHE' text='"+Mc_FormatageXML("Titre : ")+"'/>"+Chr(10)+
            "        <string id='"+Str(#GAD_CP_TITRERECHERCHE)+"' name='GAD_CP_TITRERECHERCHE'/>"+Chr(10)+
            "        <button id='"+Str(#GAD_BT_RECHERCHER)+"' name='GAD_BT_RECHERCHER' text='"+Mc_FormatageXML("🔎")+"'/>"+Chr(10)+
            "      </hbox>"+Chr(10)+
            "      <empty/>"+Chr(10)+
            "      <hbox expand='item:4' spacing='4'>"+Chr(10)+
            "        <vbox expand='no' align='center' spacing='0'>"+Chr(10)+
            "          <text id='"+Str(#GAD_LIB_MOTNBITEMS)+"' name='GAD_LIB_MOTNBITEMS' text='"+Mc_FormatageXML("Items trouvés : ")+"'/> "+Chr(10)+
            "        </vbox>"+Chr(10)+
            "        <vbox expand='no' align='center' spacing='0'>"+Chr(10)+
            "          <text id='"+Str(#GAD_LIB_NBITEMS)+"' name='GAD_LIB_NBITEMS' text='"+Mc_FormatageXML("99999")+"'/> "+Chr(10)+
            "        </vbox>"+Chr(10)+
            "        <empty/>"+Chr(10)+
            "        <combobox id='"+Str(#GAD_LS_TITRESTMDB)+"' name='GAD_LS_TITRESTMDB'/> "+Chr(10)+
            "        <button id='"+Str(#GAD_BT_OUVRIRLIENINTERNET)+"' name='GAD_BT_OUVRIRLIENINTERNET' text='"+Mc_FormatageXML("🔗")+"' disabled='yes'/>"+Chr(10)+
            "      </hbox>"+Chr(10)+
            "      <singlebox height='0'/>"+Chr(10)+
            "      <hbox expand='item:1' spacing='16'>"+Chr(10)+
            "        <gridbox id='"+Str(#GAD_BG_DONNEES)+"' name='GAD_BG_DONNEES' columns='2' rowspacing='8' colexpand='item:2' rowexpand='item:6'>"+Chr(10)+
            "          <text id='"+Str(#GAD_LIB_IDTMDB)+"' name='GAD_LIB_IDTMDB' text='"+Mc_FormatageXML("ID TMDB : ")+"'/>"+Chr(10)+
            "          <hbox expand='no' spacing='0'>"+Chr(10)+
            "            <string id='"+Str(#GAD_CP_IDTMDB)+"' name='GAD_CP_IDTMDB' width='72' flags='#PB_String_ReadOnly'/>"+Chr(10)+
            "          </hbox>"+Chr(10)+
            "          <text id='"+Str(#GAD_LIB_TITRETMDB)+"' name='GAD_LIB_TITRETMDB' text='"+Mc_FormatageXML("Titre : ")+"'/>"+Chr(10)+
            "          <string id='"+Str(#GAD_CP_TITRETMDB)+"' name='GAD_CP_TITRETMDB'/>"+Chr(10)+
            "          <text id='"+Str(#GAD_LIB_TITREORIGTMDB)+"' name='GAD_LIB_TITREORIGTMDB' text='"+Mc_FormatageXML("Titre originel : ")+"'/>"+Chr(10)+
            "          <string id='"+Str(#GAD_CP_TITREORIGTMDB)+"' name='GAD_CP_TITREORIGTMDB'/>"+Chr(10)+
            "          <text id='"+Str(#GAD_LIB_ANNEETMDB)+"' name='GAD_LIB_ANNEETMDB' text='"+Mc_FormatageXML("Année : ")+"'/>"+Chr(10)+
            "          <hbox expand='no' spacing='0'>"+Chr(10)+
            "            <string id='"+Str(#GAD_CP_ANNEETMDB)+"' name='GAD_CP_ANNEETMDB' width='48'/>"+Chr(10)+
            "          </hbox>"+Chr(10)+
            "          <text id='"+Str(#GAD_LIB_GENRETMDB)+"' name='GAD_LIB_GENRETMDB' text='"+Mc_FormatageXML("Genre : ")+"'/>"+Chr(10)+
            "          <string id='"+Str(#GAD_CP_GENRETMDB)+"' name='GAD_CP_GENRETMDB'/>"+Chr(10)+
            "          <text id='"+Str(#GAD_LIB_SYNOPSISTMDB)+"' name='GAD_LIB_SYNOPSISTMDB' text='"+Mc_FormatageXML("Synopsis : ")+"'/>"+Chr(10)+
            "          <editor id='"+Str(#GAD_ED_SYNOPSISTMDB)+"' name='GAD_ED_SYNOPSISTMDB' flags='#PB_Editor_WordWrap'/>"+Chr(10)+
            "        </gridbox>"+Chr(10)+
            "        <vbox expand='no' align='' spacing='4'>"+Chr(10)+
            "          <image id='"+Str(#GAD_IMG_AFFICHETMDB)+"' name='GAD_IMG_AFFICHETMDB' width='"+#TAILLEAFFICHE+"' height='300'/>"+Chr(10)+
            "          <text id='"+Str(#GAD_LIB_DIMENSIONSAFFICHE)+"' name='GAD_LIB_DIMENSIONSAFFICHE' text=' ' flags='#PB_Text_Center'/>"+Chr(10)+
            "          <hbox expand='item:2' spacing='0'>"+Chr(10)+
            "            <button id='"+Str(#GAD_BT_AFFICHETMDBPRECEDENTE)+"' name='GAD_BT_AFFICHETMDBPRECEDENTE' text='"+Mc_FormatageXML("◀")+"' disabled='yes'/>"+Chr(10)+
            "            <string id='"+Str(#GAD_CP_NOAFFICHE)+"' name='GAD_CP_NOAFFICHE' disabled='yes' width='32' flags='#PB_String_Numeric|#PB_String_ReadOnly'/>"+Chr(10)+
            "            <button id='"+Str(#GAD_BT_AFFICHETMDBSUIVANTE)+"' name='GAD_BT_AFFICHEBTMDBPLUS' text='"+Mc_FormatageXML("▶")+"' disabled='yes'/> "+Chr(10)+
            "            <empty/> "+Chr(10)+
            "            <button id='"+Str(#GAD_BT_CHARGERAFFICHE)+"' name='GAD_BT_CHARGERAFFICHE' text='"+Mc_FormatageXML("📥")+"' disabled='yes'/> "+Chr(10)+
            "          </hbox> "+Chr(10)+
            "        </vbox> "+Chr(10)+
            "      </hbox>"+Chr(10)+
            "      <singlebox height='32'/>"+Chr(10)+
            "      <hbox expand='no' align='right'>"+Chr(10)+
            "        <button id='"+Str(#GAD_BT_QUITTER)+"' name='GAD_BT_QUITTER' text='"+Mc_FormatageXML("Quitter")+"' width='120'/> "+Chr(10)+
            "      </hbox>"+Chr(10)+
            "      <empty/> "+Chr(10)+
            "    </vbox> "+Chr(10)+
            "  </window>"+Chr(10)+
            "</dialogs>" ;}
  ValeurRetour=Fc_Fenetres_OuvertureDialogueXML(#TMDB_XML,#XML_FENPRINCIPALE,ChaineXML,"FEN_RECHERCHETMDB")
  If ValeurRetour
    SetGadgetText(#GAD_LIB_NBITEMS,"")
    AddKeyboardShortcut(#FEN_RECHERCHETMDB,#PB_Shortcut_Escape,#RACCOURCI_QUITTER)
    HideWindow(#FEN_RECHERCHETMDB,#False)
    Pc_FenPrincipale_GestionEvenements()
  EndIf
EndProcedure
;-══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
; ╔═══════════════════════╗
; ║ DÉMARRAGE APPLICATION ║
; ╚═══════════════════════╝
Pc_TMDB_RecuperationGenres()
Pc_FenPrincipale_Affichage()
End
; ══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════

 
Note : N'hésitez pas aussi à jouer du CTRL + F4 dans l'IDE PB pour simplifier l'affichage :wink: :D
Dernière modification par boddhi le dim. 02/juil./2023 14:00, modifié 6 fois.
boddhi
Messages : 596
Inscription : lun. 26/avr./2010 16:14
Localisation : S 48° 52' 31'' / O 123° 23' 33''

The Movie Database

Message par boddhi »

Ajout d'un bouton ouvrant la page internet du film sélectionné
boddhi
Messages : 596
Inscription : lun. 26/avr./2010 16:14
Localisation : S 48° 52' 31'' / O 123° 23' 33''

The Movie Database

Message par boddhi »

Ajout de l'affichage des dimensions de l'affiche du film
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: The Movie Database

Message par Kwai chang caine »

Cool !!! ton programme 8O
Justement, je m'étais toujours demandé comment on utilisait une API :oops:
Et en plus c'est un sujet qui me passionne aussi le cinéma :wink:
J'ai pas trop le temps en ce moment alors j'ai vite essayé de faire tourner ton avion, mais rien ne se passe :|
C'est bien la clef qui faut entrer, pas le jeton de 2 km ?
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
boddhi
Messages : 596
Inscription : lun. 26/avr./2010 16:14
Localisation : S 48° 52' 31'' / O 123° 23' 33''

Re: The Movie Database

Message par boddhi »

Salut KCC,

Oui, c'est bien la clé codée sur 32 caractères (et de forme hexadécimale, en tout cas pour moi, c'est le cas) qu'i faut utiliser.
Dans tes paramètres API de ton profil themoviedatabase, c'est la clé mentionnée dans "Clé d'API".

N'hésite pas si tu as des questions :wink:
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: The Movie Database (Utilisation de l'API)

Message par Kwai chang caine »

Bonjour Bodhi

Merci de ton aide 8)
J'y comprends rien, toujours rien ne se passe et en plus j'ai des points d'interrogation dans les boutons 8O
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
boddhi
Messages : 596
Inscription : lun. 26/avr./2010 16:14
Localisation : S 48° 52' 31'' / O 123° 23' 33''

Re: The Movie Database (Utilisation de l'API)

Message par boddhi »

Kwai chang caine a écrit : mar. 27/juin/2023 16:26 J'y comprends rien, toujours rien ne se passe et en plus j'ai des points d'interrogation dans les boutons 8O
Salut KCC,
J'en suis navré...
Pas de blocage par un pare-feu ?
As-tu adapté le code pour tes besoins ?
Si oui, pourrais-tu publier le bout de ton source qui récupère les données sur internet ?
Et une copie-écran de l'UI aussi pour voir le pb des '?' que tu évoques...
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: The Movie Database (Utilisation de l'API)

Message par Kwai chang caine »

Non j'ai rien modifié à part la valeur de #CLETMDB ou j'ai rentré ma clef :wink:
Faut il rentré autre chose ???
J'ai relancé ton code en désactivant mon pare-feu, bien que j'ai jamais eu de problème avec tous les autres codes jusqu'à présent, et rien de mieux

Et comme tu peux le voir chez moi tout est vide :cry:
Rien dans la combo et dans les champs, et les boutons avec des points d'interroogation

Image
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
boddhi
Messages : 596
Inscription : lun. 26/avr./2010 16:14
Localisation : S 48° 52' 31'' / O 123° 23' 33''

Re: The Movie Database (Utilisation de l'API)

Message par boddhi »

Salut KCC,
Kwai chang caine a écrit : Non j'ai rien modifié à part la valeur de #CLETMDB ou j'ai rentré ma clef :wink:
Faut il rentré autre chose ???
Non, absolument rien d'autre !
Je viens de tester à partir du code posté en saisissant ma clé et cela fonctionne.

Pour info, ton image ne s'affiche pas sur mon navigateur.
Ton lien est un lien HTTP et non HTTPS et je crois me souvenir avoir lu que les liens HTTP n'étaient pas acceptés.
Voilà, ce que tu devrais avoir comme UI :
Image
Kwai chang caine a écrit : [...] les boutons avec des points d'interroogation
Quel OS utilises-tu ? Ta police par défaut gère-t-elle les caractères Unicode ?
Sous Windows 7 à 10 (version sous laquelle tourne mon PC), la police par défaut est SEGOE UI. Sous W11, c'est SEGOE UI Variable.
Jette un coup d'oeil de côté-là, c'est probablement la cause de ton pb.
Si tel est le cas, je te laisse le soin d'ajouter les instructions nécessaires au code pour gérer cette police (ou toute autre Unicode).
Kwai chang caine a écrit : Et comme tu peux le voir chez moi tout est vide :cry:
Rien dans la combo et dans les champs
Pardon. Peut-être aurais-je dû préciser, qu'effectivement, rien ne s'affiche au lancement et que c'est à l'utilisateur de déclencher l'action.
Au vu de ce que doit être normalement le contenu de l'UI, tu auras compris qu'il faut saisir une chaîne dans le champ 'Titre' puis cliquer sur '🔎'.
('Star wars', pour l'exemple, serait un bon choix, faudra juste être un peu patient... :wink: )
Une fois la recherche lancée, le combobox sera alors alimenté si des résultats sont récupérés,
Le bouton '🔗' servira à afficher la page Web de The Movie Database liée au film sélectionné dans le combobox.
Quant aux boutons '◀' et '▶', ils permettront d'afficher, si tant est qu'il y en ait, les différentes affiches du film sélectionné.

Voilà, le résultat :
Image

N'hésite-pas à me tenir au courant :wink:
boddhi
Messages : 596
Inscription : lun. 26/avr./2010 16:14
Localisation : S 48° 52' 31'' / O 123° 23' 33''

The Movie Database (Utilisation de l'API)

Message par boddhi »

Ajout d'un bouton 📥 - à côté des flèches de navigation - permettant de sauvegarder l'affiche en cours
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: The Movie Database (Utilisation de l'API)

Message par Kwai chang caine »

Boddhi a écrit :Ton lien est un lien HTTP et non HTTPS et je crois me souvenir avoir lu que les liens HTTP n'étaient pas acceptés.
Oui je sais...j'ai la flemme de passer tout mon serveur 1&1 en HTTPS, et pourtant c'est depuis un bon bout de temps gratoche :oops:
Mais je me méfie...a chaque fois que je modifie quelque chose qui touche tout un ensemble, au début ça parait une bonne et rapide idée, et après c'est x heures de boulot pour au final avoir sensiblement la même chose qu'avant :cry:
Mais bon...on arrête pas le progrès (enfin si s'en est un)... faudra que je me fasse violence un jour :wink:

Pour en revenir à ton joli code
Avec tes explications , ça marche !!!! :D

J'ai toujours les points d'interrogation dans les boutons, c'est pas grave
Mais comme tu m'as prévenu ...j'ai été patient et au bout de 30 secondes a peu prés ma GUI était comme la tienne :wink:

Merci beaucoup de ta patience et du partage de ton travail 8)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
boddhi
Messages : 596
Inscription : lun. 26/avr./2010 16:14
Localisation : S 48° 52' 31'' / O 123° 23' 33''

Re: The Movie Database (Utilisation de l'API)

Message par boddhi »

Salut KCC,
Kwai chang caine a écrit : a chaque fois que je modifie quelque chose qui touche tout un ensemble, au début ça parait une bonne et rapide idée, et après c'est x heures de boulot pour au final avoir sensiblement la même chose qu'avant :cry:
"Mais que diable allait-il faire dans cette galère ?"
Hé ouais, c'est souvent comme ça en informatique, mais je ne t'apprends rien !
Moi, ce qui m'impressionne, sous Windows (je ne sais pas si c'est la même sur les autres OS), c'est la tonne de lignes qu'il faut parfois produire avec les API pour obtenir un tout petit effet graphique ou technique que ne gère pas PB en natif. Et même avec l'aide de codes partiels fournis par la communauté, personnellement, il m'arrive souvent de me demander si telle ou telle petite amélioration vaut le coup de passer un temps fou à tâtonner des heures et des heures 1) pour déjà comprendre les codes et 2) pour tenter de les adapter à mes propres besoins... Surtout quand du temps, bah, j'en ai pas bcp...
Régulièrement, la réponse est non et je me contente de ce que je peux produire dans un temps donné pour des objectifs raisonnables.
Kwai chang caine a écrit : [...] ça marche !!!! :D
:wink:
Kwai chang caine a écrit : J'ai toujours les points d'interrogation dans les boutons, c'est pas grave
Rien ne t'empêche de les remplacer par des boutons images, Là, pour le coup, ça ne devrait pas te prendre bcp de temps... :mrgreen:
Kwai chang caine a écrit : Mais comme tu m'as prévenu ...j'ai été patient et au bout de 30 secondes a peu prés ma GUI était comme la tienne :wink:
Oui, je sais que ma démo est un peu lente pour deux raisons principales :
1) L'API qui limite à 20 le nombre de résultats retournés par appel. Avec l'exemple de Star wars, c'est pas moins de 8 appels pour obtenir une liste de 157 films recensés.
2) Le parti pris de mon développement qui consiste à récupérer les données des affiches pour chaque film recensé. Ce qui fait, pour le coup, pour Star wars 165 (8+157) requêtes...

Bien évidemment, ce code devra être adapté en fonction des besoins de chacun en gardant à l'esprit que plus on fournit de 'mots-clé' lors de la recherche, plus les résultats retournés seront affinés et les délais raccourcis...
Avatar de l’utilisateur
cage
Messages : 506
Inscription : ven. 16/oct./2015 18:22
Localisation : France
Contact :

Re: The Movie Database (Utilisation de l'API)

Message par cage »

Merci pour ton code.

Je me suis inscrit sur TMDB et j'ai demandé une clé API

Ton code fonctionne parfaitement et va me permettre d'améliorer mon application 'my player iptv' avec des infos sur les vidéos.

cage
■ Win10 64-bit (Intel Celeron CPU N2920 @ 1.86GHz, 4,0GB RAM, Intel HD Graphics) & PB 6.00 LTS
■ Vivre et laisser vivre.
■ PureBasic pour le fun
■ Gérard sur le forum Anglais
■ Mes sites: http://pbcage.free.fr - http://yh.toolbox.free.fr
boddhi
Messages : 596
Inscription : lun. 26/avr./2010 16:14
Localisation : S 48° 52' 31'' / O 123° 23' 33''

Re: The Movie Database (Utilisation de l'API)

Message par boddhi »

cage a écrit : Merci pour ton code.
De rien ! Content qu'il puisse te servir :wink:
Répondre