Auteur |
Retropie : récupérer des informations JSON |
MTF Modérateur groovy
Joue à faire l'imbécile.
Inscrit : Jan 28, 2005 Messages : 6738 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 :
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
|
RainMakeR Chef de Rubrique Nécrologique Score au grosquiz
1035015
pts.
Joue à Kamiwaza Way of the Thief
Inscrit : Apr 01, 2003 Messages : 33378 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
_________________
|
RainMakeR Chef de Rubrique Nécrologique Score au grosquiz
1035015
pts.
Joue à Kamiwaza Way of the Thief
Inscrit : Apr 01, 2003 Messages : 33378 De : Toulouse
Hors ligne | Posté le: 2021-01-14 20:47
|
Youpla Pixel monstrueux
Score au grosquiz
0002030
pts.
Inscrit : May 13, 2009 Messages : 3496 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 à Kamiwaza Way of the Thief
Inscrit : Apr 01, 2003 Messages : 33378 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 _________________
|
MTF Modérateur groovy
Joue à faire l'imbécile.
Inscrit : Jan 28, 2005 Messages : 6738 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
|
Youpla Pixel monstrueux
Score au grosquiz
0002030
pts.
Inscrit : May 13, 2009 Messages : 3496 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.
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 : 6738 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...
|
Youpla Pixel monstrueux
Score au grosquiz
0002030
pts.
Inscrit : May 13, 2009 Messages : 3496 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 : 2908 De : Aix en Provence
Hors ligne | Posté le: 2021-01-15 14:26
Moi à la lecture des explications de YOUPLA
_________________ 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 : 6738 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...
|
Youpla Pixel monstrueux
Score au grosquiz
0002030
pts.
Inscrit : May 13, 2009 Messages : 3496 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 : 6738 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 :/
|
Kaede Pixel visible depuis la Lune
Inscrit : Mar 06, 2002 Messages : 5267
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
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 à Indiana Jones et le cercle ancien
Inscrit : Jan 19, 2003 Messages : 6318 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
C'est exactement ça !!
|
MTF Modérateur groovy
Joue à faire l'imbécile.
Inscrit : Jan 28, 2005 Messages : 6738 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 ^^
|
MTF Modérateur groovy
Joue à faire l'imbécile.
Inscrit : Jan 28, 2005 Messages : 6738 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
|
JPB Camarade grospixelien
Joue à Shadow of the Erdtree
Inscrit : Apr 25, 2002 Messages : 3387 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 à Kamiwaza Way of the Thief
Inscrit : Apr 01, 2003 Messages : 33378 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 .... _________________
|
MTF Modérateur groovy
Joue à faire l'imbécile.
Inscrit : Jan 28, 2005 Messages : 6738 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é !
|