1. Ce site utilise des cookies. En continuant à utiliser ce site, vous acceptez l'utilisation des cookies. En savoir plus.
  2. Bonjour tout le monde ! Veillez consulter la Politique de forum pour comprendre nos règles, Merci a vous !
    Rejeter la notice

[WD20] Utiliser les API du site discogs.com

Discussion dans 'Windev' créé par Fox59, Avr 14, 2018.

  1. Fox59

    Fox59 New Member

    Inscrit:
    Jan 1, 2018
    Messages:
    10
    J'aime reçus:
    12
    Suite à une suppression du post je retente !
    *************
    Bonjour à tous, développeur à mes heures, j’ai découvert windev lors d’une mission pour mon boulot. A l’époque nous en étions à la 7.5 !

    Grâce aux différents travaux des hommes de l’ombre j’ai pu l’utiliser pour mes applications persos jusqu’à la version 20 actuellement disponible.

    J’ai créé différentes applications persos pour gérer mes tâches quotidiennes : lanceur d’application, téléchargement de séries, de leur sous-titres, gérer mon ampli depuis mon PC, gérer mes lectures, classer et renommer mes photos numériques grâce aux données EXIF, etc.

    J’aime découvrir les ‘nouveautés’ de windev et faire un programme juste pour tester un champ !

    Récemment j’ai voulu gérer tous mes CD pour ne pas acheter des doublons et dans l’idée de faire un jukebox mais ça c’est un autre sujet !

    Je vous propose ici une introduction aux API du site discogs.com

    Pour mon utilisation je n’ai pas besoin de m’identifier (login + mot de passe) dans l'application mais j’utilise un 'jeton' (token) généré sur le site.

    Tout d’abord il faut se créer gratuitement un compte si vous n’en disposez pas :

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!



    Ajouter quelques CD dans votre collection (recherche par nom ou code-barres par exemple).

    Pour utiliser les API du site il faut récupérer un ‘jeton’ ou ‘token’ en allant sur son profil puis dans le menu ‘Developers’ :
    [​IMG]

    Selon vos besoins vous pouvez déclarer une nouvelle application ou juste demander un nouveau jeton.

    Il existe une manière de s’authentifier via le protocole ‘OAuth’ mais je n’avoue ne pas m’y connaitre.


    Les pages d’explications de l’API en v2 sont disponibles ici :

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!



    L’intérêt de ce ‘tuto’ est d’exploiter les données au format JSON ainsi que les tâches parallèles pour notamment récupérer les images des CD.



    Exemple d’une procédure globale :
    Code (Text):
    PROCEDURE SendToUP(param)

    MonResultat est un Buffer
    // en globale, déclarer :
    // Serveur_API_Discogs est une chaîne = https://api.discogs.com/
    // MonToken est une chaîne = "xxxxx"

    param = Serveur_API_Discogs + URLEncode(param)

    HTTPParamètre(httpParamètreDésactiveCache, Vrai)

    cMaRequete est un httpRequête
    cMaRequete..URL = param
    cMaRequete..Entête["Authorization"] = "Discogs token=" + MonToken
    cMaRequete..AgentUtilisateur = "Test"
    cMaReponse est un httpRéponse = HTTPEnvoie(cMaRequete)

    SI ErreurDétectée ALORS
           Erreur(ErreurInfo(errComplet) + RC + cMaReponse..CodeEtat + RC + cMaReponse..Contenu)

    SINON
           SI cMaReponse..CodeEtat <> 200 ALORS
                   MaReponse est une StructBadReponse
                   Désérialise(MaReponse, cMaReponse..Contenu, psdJSON)
                   Erreur(cMaReponse..CodeEtat + RC + MaReponse.message)

           SINON
                   MonResultat = cMaReponse..Contenu

           FIN
    FIN

    RENVOYER MonResultat
    Exemple d’utilisation pour récupérer les dossiers de ma collection (correspond à la méthode

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!

    ) :
    Code (Text):
    soit MaCollection = SendToUP("users/" + MonPseudo + "/collection/folders")
    MesFolder est un StructFolder
    Désérialise(MesFolder, MaCollection, psdJSON)
    Ensuite il faut désérialiser le résultat pour l’utiliser. Pour ce faire il faut déclarer des structures.
    Pour la variable ‘MesFolder’ voici sa déclaration :
    Code (Text):
    StructFolder est une Structure
           folders est un tableau dynamique de folder
    FIN

    folder est une Structure
           id est un entier
           Count est un entier
           name est une chaînes
           resource_url est une chaîne
    FIN
    Dans l’aide cela correspond à cette réponse en JSON :
    HTML:
    {
      "folders": [
        {
          "id": 0,
          "count": 23,
          "name": "All",
          "resource_url": "https://api.discogs.com/users/example/collection/folders/0"
        },

        {
          "id": 1,
          "count": 20,
          "name": "Uncategorized",
          "resource_url": "https://api.discogs.com/users/example/collection/folders/1"
        }
      ]
    }
    Ainsi pour utiliser le résultat je peux, par exemple, charger la liste des répertoires de ma collection dans un Combobox :
    Code (Text):
    POUR CHAQUE folder DE MesFolder.folders
            ListeAjoute(F_Discogs.C_Collections, folder.name + " (" + folder.Count + ")" + gLien(folder.resource_url))
    FIN
    Un autre exemple pour récupérer les ‘releases’ d’un de mes dossiers (aide :

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!

    ) :
    Code (Text):
    UnVariant est un Buffer
    UnVariant = SendToUP("users/" + MonPseudo + "/collection/folders/0/releases?per_page=100", Faux)
    Désérialise(MesReleasesColl, UnVariant, psdJSON)
    Ici le folder ‘0’ correspond au répertoire par défaut avec toutes les releases de tous les dossiers de ma collection.

    Il est possible pour la plupart des requêtes d’ajouter des paramètres de tris ou de pagination (

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!

    ).

    Ici j’ai choisi de récupérer les 100 premières releases. Le 1er résultat me donne notamment le nombre total de releases dans ma collection ainsi que le nombre de page (selon l’affichage demandé) me permettant ensuite de boucler et de faire autant d’appel que de nécessaire.

    Le résultat désérialisé est stocké dans la variable ‘MesReleasesColl’ dont voici la déclaration :
    Code (Text):
    MesReleasesColl est un StructReleases

    StructReleases est une Structure
           pagination est une pagination
           releases est un tableau dynamique de release
    FIN

    pagination est une Structure
           per_page est un entier
           items est un entier
           page est un entier
           urls est une urls
           pages est un entier
    FIN

    urls est une Structure
           first est une chaîne
           prev est une chaîne
           next est une chaîne
           last est une chaîne
    FIN

    release est une Structure
           id est un entier
           instance_id est un entier
           folder_id est un entier
           rating est un entier
           notes est un tableau dynamique de note
           basic_information est un basic_informations
    FIN

    note est une Structure
           field_id est un entier
           value est une chaîne
    FIN

    basic_informations est une Structure
           id est un entier
           title est une chaîne
           year est un entier
           resource_url est une chaîne
           thumb est une chaîne
           formats est un tableau dynamique de format
           labels est un tableau dynamique de label
           artists est un tableau dynamique de artist
    FIN

    format est une Structure
           qty est une chaîne
           descriptions est un tableau dynamique de chaînes
           name est une chaîne
    FIN

    label est une Structure
           resource_url est une chaîne
           entity_type est une chaîne
           catno est une chaîne
           id est un entier
           name est une chaîne
    FIN

    artist est une Structure
           resource_url est une chaîne
           join est une chaîne
           anv est une chaîne
           tracks est une chaîne
           role est une chaîne
           id est un entier
           name est une chaîne
    FIN
    Comme on ne sait pas toujours ce que l’on va récupérer dans un tableau il faut donc utiliser les tableaux dynamiques.

    Si le nom d’une rubrique est en conflit avec un nom réservé de windev, il suffit de la placer entre quotte :
    Code (Text):
    StructBadReponse est une Structure
           'Message' est une chaîne
    FIN
     
    #1 Fox59, Avr 14, 2018
    Dernière édition: Avr 14, 2018
  2. Fox59

    Fox59 New Member

    Inscrit:
    Jan 1, 2018
    Messages:
    10
    J'aime reçus:
    12
    Enfin pour récupérer les images des pochettes je passe par des tâches parallèles.

    Pour éviter des temps encore plus longs de chargement j’ai fait le choix de stocker les images des pochettes sur mon PC avec l’ID de la release.

    Je regarde donc si j’ai la pochette sur mon PC avant de la récupérer en ligne :
    Code (Text):
    SI fFichierExiste(fRepExe() + "\pochette\" + UneRelease.id +
    ".jpg") ALORS
          MaTacheRechercheImage est une TâcheParallèle =
    TâcheParallèleExécute(ChargerImage, (UneRelease.id))
          TâcheParallèleExécuteAprès(MaTacheRechercheImage, AfficheImage,
    (ValeurRenvoyéeTâchePrécédente, UneRelease.id), tpoThreadPrincipal)
          Ajoute(TTache, MaTacheRechercheImage)

    SINON
          MaTacheRechercheImage est une TâcheParallèle =
    TâcheParallèleExécute(RechercheImage,
    (UneRelease.basic_information.thumb))
          TâcheParallèleExécuteAprès(MaTacheRechercheImage, AfficheImage,
    (ValeurRenvoyéeTâchePrécédente, UneRelease.id, Vrai),
    tpoThreadPrincipal)
          Ajoute(TTache, MaTacheRechercheImage)

    FIN
    Code (Text):
    PROCEDURE INTERNE AfficheImage(buffValeur, MonId, bSave = Faux)
          SELON MonPlan
                CAS 1
                       nIndice est un entier = TableCherche(F_Discogs.Table1.cId, MonId)
                       SI nIndice > 0 ALORS F_Discogs.Table1[nIndice].cImage = buffValeur

                AUTRE CAS
                       nIndiceZ est un entier = ZoneRépétéeCherche("F_Discogs.ZR_CollectionAll_" + MonPlan + ".L_Id", MonId)
                       SI nIndiceZ > 0 ALORS {"F_Discogs.ZR_CollectionAll_" + MonPlan}[nIndiceZ].Image = buffValeur

                FIN

                SI bSave ALORS fSauveBuffer(fRepExe() + "\pochette\" + MonId + ".jpg", buffValeur)

          FIN
    Code (Text):
    PROCEDURE ChargerImage(UnId)
        UnBuffer est un Buffer = fChargeBuffer(fRepExe() + "\pochette\" + UnId + ".jpg")
        RENVOYER UnBuffer
    Code (Text):
    PROCEDURE RechercheImage(MonURL est une chaîne)
        bufPhoto est un Buffer
        Résultat1 est un booléen = HTTPRequête(MonURL)
        SI Résultat1 = Vrai ALORS bufPhoto = HTTPDonneRésultat()
        RENVOYER bufPhoto
    A ajouter quelque part dans le code (avant !) :
    TTache est un tableau dynamique de TâchesParallèles
    TâcheParallèleDemandeAnnulation(TTache)
    TableauSupprimeTout(TTache)
    Ici j’affiche les informations dans des zones répétées « ZR_CollectionAll_ » configurées différemment selon que je veuille afficher uniquement la pochette ou le nom de l’artiste, la date etc.


    Bref l’API est riche et il possible de se faire plaisir !

    Dans mon programme je fais le choix de tout charger en mémoire et de ne pas utiliser de base de données locale mais chacun fait comme il le souhaite !

    Pour aller encore plus loin on peut exploiter des dumps au format XML de l’entièreté de la base Discogs qui sont générés tous les mois :

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!



    Quelques ‘screens’ (désolé l’interface est basique je n’ai pas besoin de plus !) :
    [​IMG]
    [​IMG] [​IMG]
    [​IMG]
    [​IMG]
    Exemple d'une autre application où la je stocke en base les ID de mes releases pour faire le lien entre les code-barres des CD (stockés dans les notes du site lors de l'ajout du CD) et la musique encodée numériquement sur mon PC.
    Ainsi quand je scanne un code-barres avec un lecteur sans fil, la musique se lance sur mon PC :
    [​IMG]
    J'aimerai pouvoir faire la même chose en envoyant la musique sur ma Chromecast depuis un PC ou le faire avec le lecteur de code-barres sans fil sur un Raspberry Pi3 (connecté à mon ampli) mais je n'ai pas réussi à le faire (j'ai essayé en python mais galère).
    Je pense qu'avec les dernières versions de windev on peut créer des applis universelles pour un Pi3 sous Windows IoT mais je ne peux pas tester.
     
    #2 Fox59, Avr 14, 2018
    Dernière édition: Avr 14, 2018
  3. joker

    joker New Member
    MEMBRE WX

    Inscrit:
    Jan 30, 2018
    Messages:
    0
    J'aime reçus:
    13

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!

    suite
    Cliquez pour agrandir...
    Héllo & Bienvenue

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!



    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!

    pour ta participation
     
    Fox59 apprécie ceci.
  • gapplicat

    gapplicat Well-Known Member
    MEMBRE WX

    Inscrit:
    Mar 8, 2018
    Messages:
    399
    J'aime reçus:
    707
    Je n'ai pas tout compris, cette API retrouve l'image du CD en fonction des tags MP3 ?
     
  • Fox59

    Fox59 New Member

    Inscrit:
    Jan 1, 2018
    Messages:
    10
    J'aime reçus:
    12

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!

    Je n'ai pas tout compris, cette API retrouve l'image du CD en fonction des tags MP3 ?
    Cliquez pour agrandir...
    Non en fait j'enregistre mon CD sur le site discogs (je rentre le n° du code-barres du CD et il me retrouve le CD correspondant) et ensuite je récupére ma liste des cd sur mon pc.
    L'avantage d'enregistrer le cd sur ce site est que je récupère toutes les informations que d'autres personnes ont ajouté sur sa fiche (pistes, durées, artistes) et également les photos des pochettes, des informations fournies dans le CD physique etc.

    Le dernier programme est différent, l'idée est d'associer une fiche d'un CD avec un répertoire sur mon réseau où se trouve la musique numérique.
    Ainsi si je scan le code-barres du CD physique, je lance la musique numérique associée et sans avoir à avoir le boitier de CD et à insérer le CD dans une chaine HiFi.
     
    joker apprécie ceci.
  • Partager cette page

    Chargement...