Forums de Grospixels
Bienvenue sur le forum de Grospixels : [ S'Enregistrer ]
Déjà inscrit ? [ Connexion ]
 
retour sur le site
rechercher
Index du Forum » » Technique » » Retropie : récupérer des informations JSON
48 messages • page
123
Auteur Retropie : récupérer des informations JSON
MTF
Modérateur groovy


Joue à faire l'imbécile.

Inscrit : Jan 28, 2005
Messages : 6674
De : Caen

Hors ligne
Posté le: 2021-01-14 16:41
Bonjour J'ai besoin d'informations pour m'aider à rendre mon retropie plus joli encore. J'ai customisé le thème .qml de mon frontend retropie afin de faire quelque chose de tout beau :

Image

Image

Ce que l'on ne voit pas cependant ici, c'est que sur le menu de sélection du jeu, on entend le flux radio de https://rainwave.cc/all/ , une radio Internet de jeux vidéo, histoire de donner un peu d'ambiance et de laisser le Pie tourner en fond pendant que je suis sur le PC. Ce que j'aimerai à présent cependant, c'est récupérer les métadonnées du flux (Titre de la musique, album, cover...) et les mettre dans le petit rectangle "en lecture :" que l'on voit en bas à droite de la première image.

Les informations sont stockées dans un JSON : https://rainwave.cc/api4/info Et il faut évidemment que je mette les infos dans mon .qml, qui produit ledit rectangle... or, j'ai beau regarder des tutos, je ne parviens pas à le faire :/ Si vous bidouillez un peu ça, vous pourriez m'aider ? Merci beaucoup

  Voir le site web de MTF
RainMakeR
Chef de Rubrique Nécrologique
Score au grosquiz
1035015 pts.

Joue à Exoprimal, The Chants, Princess Peach : Showtime

Inscrit : Apr 01, 2003
Messages : 32833
De : Toulouse

Hors ligne
Posté le: 2021-01-14 20:41
j'ai un peu laché le code mais je peux tenter de t'aider

Bon deja je connais pas retropie
C'est un logiciel lourd ou un truc via le web ?

Sinon LA question qui fache, tu connais un peu ou tu veux un truc tout fait ?

T'as le détail là pour faire ce que veux => https://rainwave.cc/api4/
En cherchant viteuf j'ai trouvé ca

Code :

xhr.open("POST", "https://rainwave.cc/api4/info", true);
xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhr.send("sid=1&user=2&key=AUTHKEYFROMUSER");


Si t'appelles cette URL https://rainwave.cc/api4/info?sid=1&user=2&key=AUTHKEYFROMUSER
T'as toutes les infos, il doit y'avoir une méthode plus précise pour avoir juste LA chanson qui passe

_________________

Image


RainMakeR
Chef de Rubrique Nécrologique
Score au grosquiz
1035015 pts.

Joue à Exoprimal, The Chants, Princess Peach : Showtime

Inscrit : Apr 01, 2003
Messages : 32833
De : Toulouse

Hors ligne
Posté le: 2021-01-14 20:47
Je comprend pas, il doit y'avoir un parametre qu'il file pas, on est censé pouvoir taper l'historique mais j'ai un code 400

https://rainwave.cc/api4/help/api4/current_listeners
_________________

Image


Youpla
Pixel monstrueux

Score au grosquiz
0002030 pts.

Inscrit : May 13, 2009
Messages : 3452
De : Villeurbanne

Hors ligne
Posté le: 2021-01-14 22:01   [ Edité le: 2021-01-14 22:03 ]
Je ne connais pas QML mais en attendant la réponse d'un spécialiste je peux quand même aider à dégrossir ton problème. Par contre ce n'est sûrement pas aussi simple que ce que tu espérais, il faut toucher un peu en javascript.

Si je me fie à la fiche wikipedia, le moteur qui interprète ton fichier QML sait aussi exécuter du code javascript. Tu vas donc pouvoir integrer du code JS pour :
1) envoyer une requête AJAX pour récupérer le fichier JSON qui contient les métadonnées
2) "parser" ces données JSON ( = les répartir dans des variables javascript )
3) modifier le contenu de ton petit rectangle.

Et comme il n'y a pas de mécanisme te permettant de détecter le passage au titre suivant, tu vas devoir répéter ces 3 étapes en boucle à quelques secondes d'intervalle (pas idéal).

Voici un exemple simple d'utilisation d'AJAX avec QML. Bon courage
https://www.cfdev.fr/faire-de-l-ajax-avec-qml

RainMakeR
Chef de Rubrique Nécrologique
Score au grosquiz
1035015 pts.

Joue à Exoprimal, The Chants, Princess Peach : Showtime

Inscrit : Apr 01, 2003
Messages : 32833
De : Toulouse

Hors ligne
Posté le: 2021-01-15 00:54   [ Edité le: 2021-01-15 00:55 ]
Citation :
Le 2021-01-14 22:01, Youpla a écrit :
en attendant la réponse d'un spécialiste je peux quand même aider à dégrossir ton problème.


genre moi pas
_________________

Image


MTF
Modérateur groovy


Joue à faire l'imbécile.

Inscrit : Jan 28, 2005
Messages : 6674
De : Caen

Hors ligne
Posté le: 2021-01-15 09:03
Merci les gars, je vais déjà explorer vos pistes

@Rain :

Ben, j'aimerais bien le faire moi-même ^^ Du moins, comprendre suffisamment pour pouvoir savoir ce que j'écris/recopie.

@Youpla :

J'étais effectivement tombé sur cette page en cherchant des mots clés, mais sans trop comprendre ce que je faisais... Comme tu me détailles mieux les étapes nécessaires, je vais pouvoir reprendre ça plus sereinement ! Et puis, j'ai ma copine qui fait du Python, à ce qu'elle a vu ça y ressemblait, on y arrivera

Et une fois que ça marchera, je posterai le code pour votre curiosité ^^ Et si ça marche pas, ben... je reviens vers vous pour avoir vos lumières

  Voir le site web de MTF
Youpla
Pixel monstrueux

Score au grosquiz
0002030 pts.

Inscrit : May 13, 2009
Messages : 3452
De : Villeurbanne

Hors ligne
Posté le: 2021-01-15 12:15   [ Edité le: 2021-01-15 12:16 ]
Pour faire le pont avec le post de Rain, ils filent des exemples de requêtes AJAX sur le site de Rainwave (reconnaissables par l'utilisation de XMLHttpRequest() ). C'est pas prévu spécifiquement pour du QML mais c'est du javascript, donc ça devrait fonctionner aussi bien (voire mieux) que l'exemple que j'avais donné. Au pire faire un mixe des deux.

Citation :
Le 2021-01-14 20:41, RainMakeR a écrit :
T'as le détail là pour faire ce que veux => https://rainwave.cc/api4/


Attention, il n'y a que le premier exemple qui est complet, les suivants supposent que tu as déjà fait le xhr = new XMLHttpRequest(); et le xhr.onload = function() { console.log(xhr.response) };

MTF
Modérateur groovy


Joue à faire l'imbécile.

Inscrit : Jan 28, 2005
Messages : 6674
De : Caen

Hors ligne
Posté le: 2021-01-15 12:30
Alors, ça progresse : déjà, mes modifs ne font plus planter le thème ^^ Voilà mon code pour l'instant :

Code :

import QtQuick 2.7
import QtMultimedia 5.9
import QtQuick.Layouts 1.3
import SortFilterProxyModel 0.2

Rectangle {
gradient: Gradient {
GradientStop { position: 0.0; color: "transparent" }
GradientStop { position: 1.0; color: "#ff4035" }
}
radius: 10
id: musique
width: 500
height: childrenRect.height
anchors.bottom: gamegrid.bottom
anchors.right: gamegrid.right

// Fonction requête JSON
function request(url, callback) {
var xhr = new XMLHttpRequest();
xhr.open("GET", "https://rainwave.cc/api4/info", true);
xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhr.onload = function() { console.log(xhr.response) };
xhr.send("sid=5");
}

Text {
id: textfix
text: "En lecture : " + musicid
font.family: "Helvetica"
font.pointSize: 24
color: "yellow"
}

Text {
id: musicid
text: {
request('https://rainwave.cc/api4/info', function (o) {
console.log(o.responseText);
var d = eval('new Object(' + o.responseText + ')');
var touteslesinfo = JSON.parse('"toto"');
var shred = touteslesinfo.shred_current
if(touteslesinfo) {
console.log(touteslesinfo);
txtResponse.text = touteslesinfo;
}

});
}
}

}


La fonction ne fait pas planter le code ; maintenant, c'est le Text (id: musicid) qui ne rend rien, puisque ça me renvoie un "QQuickText(0x1de)", donc un pointeur vide... Je dois mieux définir les variables là-dedans je pense, mais il faut que je comprenne comme ça fonctionne ^^ Je suis à fond dans les tutos, mais c'est comme apprendre une toute autre langue pour moi...


  Voir le site web de MTF
Youpla
Pixel monstrueux

Score au grosquiz
0002030 pts.

Inscrit : May 13, 2009
Messages : 3452
De : Villeurbanne

Hors ligne
Posté le: 2021-01-15 14:14   [ Edité le: 2021-01-16 16:33 ]
Alors plusieurs choses qui ne vont pas :

1) ta façon de mixer les codes ne va pas. Dans la définition de ta fonction request, tu ne fais rien de la fonction callback. Donc le code de ta fonction o n'est jamais exécuté. La notion de fonction de callback n'est pas vraiment évidente, il faut un peu s'accrocher.

Je pense que tu pourrais simplifier en enlevant le paramètre callback, et en mettant le code de la fonction o directement dans la fonction xhr.onload().

2) je pense que tu ne peux pas mettre l'appel à request directement dans l'attribut text de ton Text.
Dans l'exemple il est associé à l’événement OnClicked(). Si tu veux procéder de cette manière, tu vas devoir trouver un événement à implémenter qui ne soit pas dépendant d'une intervention de l'utilisateur.

Tu trouvera peut-être ton bonheur ici :
https://doc.qt.io/qt-5/qtqml-syntax-signals.html

Perso le Component.onCompleted() me parait un bon candidat pour commencer, mais ce n'est exécuté qu'une fois alors que toi tu veux un truc qui se répète.

3) Comme tu ne peux pas faire 2), tu vas devoir mettre quelque part dans le code (dans la fonction o si tu décides de la garder, ou directement dans la fonction xhr.onload() ) un musicid.text=....

french snake
Pixel monstrueux

Score au grosquiz
0012080 pts.

Joue à Lost Judgement

Inscrit : May 09, 2006
Messages : 2794
De : Aix en Provence

Hors ligne
Posté le: 2021-01-15 14:26
Moi à la lecture des explications de YOUPLA

Image
_________________

Ce genre de feu, il est très difficile de l’éteindre. Les tendres rameaux de l’innocence brûlent les premiers. Puis le vent se lève, et toute bonté est alors en péril

Ratatata: Nikeleos vous êtes vraiment étrange dans vos réactions


MTF
Modérateur groovy


Joue à faire l'imbécile.

Inscrit : Jan 28, 2005
Messages : 6674
De : Caen

Hors ligne
Posté le: 2021-01-15 18:25
D'accord, je pense comprendre ^^; Un peu ! Je continue de bosser dessus, je vous tiens au courant...

  Voir le site web de MTF
Youpla
Pixel monstrueux

Score au grosquiz
0002030 pts.

Inscrit : May 13, 2009
Messages : 3452
De : Villeurbanne

Hors ligne
Posté le: 2021-01-15 22:20
Citation :
Le 2021-01-15 14:26, french snake a écrit :
Moi à la lecture des explications de YOUPLA

Nan mais les gars, moi j'déconne, j'ai juste mis des mots au hasard pour voir la réaction de MTF.

(c'est pas vrai )


MTF
Modérateur groovy


Joue à faire l'imbécile.

Inscrit : Jan 28, 2005
Messages : 6674
De : Caen

Hors ligne
Posté le: 2021-01-16 00:11
Bon... J'ai recommencé du début : et j'ai essayé justement de comprendre comment fonctionne le "Component.onCompleted" que tu me conseillais. Il y a du mieux ; mais j'ai beau trituré les exemples des tutos, ça ne me marche pas. Voilà où j'en suis :

Code :
import QtQuick 2.7
import QtMultimedia 5.9
import QtQuick.Layouts 1.3
import SortFilterProxyModel 0.2

Rectangle {
property var third: { 'example': 'true' }
gradient: Gradient {
GradientStop { position: 0.0; color: "transparent" }
GradientStop { position: 1.0; color: "#ff4035" }
}
radius: 10
id: musique
width: 500
height: childrenRect.height
anchors.bottom: gamegrid.bottom
anchors.right: gamegrid.right

Text {
id: enlecture
text: ""
font.family: globalFonts.sans
font.pointSize: 24
font.weight: Font.DemiBold
color: "yellow"
}


Component.onCompleted: {

console.log(third.example)
var d = eval('new Object(' + third.example + ')');
if(d) {
console.log(d);
// Définit la valeur de l'objet Text (id: enlecture)
enlecture.text = "En lecture : " + d.example
}
}
}



Dans le rectangle, il apparaît à présent "En lecture : undefined", et on me renvoie l'erreur : "Error: Cannot assign [undefined] to QString"... J'avoue que je suis perplexe ici :/

  Voir le site web de MTF
Kaede
Pixel visible depuis la Lune


Inscrit : Mar 06, 2002
Messages : 5250

Hors ligne
Posté le: 2021-01-16 10:44   [ Edité le: 2021-01-16 11:10 ]
L'erreur n'est pas associée à un numéro de ligne, et/ou une stacktrace ?

On peut avoir tout le code ? (il n'y a que ça, ou c'est un extrait ?).
Le top ce serait qu'on puisse lancer ton truc, mais j'imagine qu'il faut retropie et tout le bouzin donc ça me paraît compliqué ...

-

Je ne comprends pas l'intêret du bloc qui suit, à part la ligne avec l'affectation à enlecture.text, bien sûr, ou tu veux changer la valeur de enlecture.text :

Code :
var d = eval('new Object(' + third.example + ')');
if(d) {
console.log(d);
// Définit la valeur de l'objet Text (id: enlecture)
enlecture.text = "En lecture : " + d.example
}


Je ne sais pas ce que tu veux faire avec ce eval, mais ça ne m'a pas l'air bon je pense.
third.example vaut 'true', donc ton objet d contiendra la chaîne 'true', et d.example (que tu concatènes plus bas, à la suite de "En lecture : " n'est pas défini (mais pas sûr que ce soit pour cela que tu as ton erreur).
Et du coup, tu peux aussi simplifier en remplaçant

Code :
if(d)
par
Code :
if(third.example === 'true')
.

Eval, ça te sert notamment si tu veux évaluer la valeur d'une variable, d'une fonction, etc. à partir de son nom, tel que l'aurais écrit dans le code, en dur. Sauf qu'on peut fournir à eval la valeur que l'on souhaite à l'exécution, et non pas lors de l'écriture du programme, comme on le fait habituellement. Mais dans ton exemple de code, je n'en vois pas l'intêret.

chatpopeye
Camarade grospixelien


Joue à Alan Wake 2

Inscrit : Jan 19, 2003
Messages : 6278
De : Poitiers

Hors ligne
Posté le: 2021-01-16 11:02
Citation :
Le 2021-01-15 14:26, french snake a écrit :

Moi à la lecture des explications de YOUPLA

Image


C'est exactement ça !!

MTF
Modérateur groovy


Joue à faire l'imbécile.

Inscrit : Jan 28, 2005
Messages : 6674
De : Caen

Hors ligne
Posté le: 2021-01-16 11:09
Bon, merci à vous de vous être penché sur ce truc, mais je vais laisser tomber :/ Je ne parviens pas à faire ça, et il me faudrait vraiment repartir de zéro en code pour y parvenir... Du coup, je vais mettre un texte/image fixe à la place, et puis tant pis ;_; Mais bon, c'est comme ça ^^

  Voir le site web de MTF
MTF
Modérateur groovy


Joue à faire l'imbécile.

Inscrit : Jan 28, 2005
Messages : 6674
De : Caen

Hors ligne
Posté le: 2021-01-16 12:27
Bon, que vous voyez quand même à quoi ça ressemble en mouvement ^^ Je suis trop content de ce que j'ai réussi à faire


  Voir le site web de MTF
JPB
Camarade grospixelien


Joue à FS2020, Pacific Drive

Inscrit : Apr 25, 2002
Messages : 3358
De : Liverdun

Hors ligne
Posté le: 2021-01-16 13:57
Ça a vraiment de la gueule !!
Ça m'intéresserait un truc comme ça, mais il faudrait que je parte à 0 et je pense n'avoir ni le temps ni la patience.
_________________

JPB,
tombé dans les jeux vidéo depuis TRON


RainMakeR
Chef de Rubrique Nécrologique
Score au grosquiz
1035015 pts.

Joue à Exoprimal, The Chants, Princess Peach : Showtime

Inscrit : Apr 01, 2003
Messages : 32833
De : Toulouse

Hors ligne
Posté le: 2021-01-16 14:01
Je plussoie si t'as tout le code ca aiderait pas mal.

Par contre un des trucs que j'ai jamais compris dans le jevascript c'est qu'a part du moment où t'a sun objet complexe, si tu ne colles pas dans une variable les trucs dont t'as besoin, ils finissent par etre nul 2 lignes plus loin ....
_________________

Image


MTF
Modérateur groovy


Joue à faire l'imbécile.

Inscrit : Jan 28, 2005
Messages : 6674
De : Caen

Hors ligne
Posté le: 2021-01-16 15:14
Sincèrement, JPB, c'est vraiment pas dur ^^ Il y a de très bons tutos sur le site de Retropie (https://retropie.org.uk/) et sur celui du frontend que j'utilise : https://pegasus-frontend.org/ J'ai juste fait ensuite des modifications très superficielles, mais franchement, il n'y a rien de très élaboré !

  Voir le site web de MTF

Index du Forum » » Technique » » Retropie : récupérer des informations JSON

48 messages • page
123




Forum www.grospixels.com (© 2011-2019 Grospixels)