Bonjour,
Voilà, débutant en python, je me suis amusé à coder en python 2.7 un plugin pour le lecteur quodlibet qui fournit une API en REST au lecteur.
J' ai codé mon plugin avec le "framework" Bottle
Mon code est fait de cette façon - en court ...
Comme vous pouvez le voir, je lance le serveur dans un thread séparé avec threading. Quand j' entre dans mon navigateur http:\\localhost:8000/QLWS/v1/infos/quodlibet, je rentre dans la fonction avec ce décorateur, ici la fonction _F_Exemple().
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40 import threading class MyServer(WSGIRefServer): def run(self, Bapp): from wsgiref.simple_server import make_server srv = make_server(self.host, self.port, Bapp) self.srv = srv srv.serve_forever() def shutdown(self): self.srv.server_close() @route('/QLWS/v1/infos/quodlibet') def _F_exemple(): <ici je lance des fonctions propre à quodlibet, mettons app.player.play, par exemple ....> _infos = {} _infos["version"] = const.VERSION _infos["artists"] = const.ARTISTS response.content_type = 'application/json' return json.dumps(_infos) Bapp = Bottle() class server_launch(): def run_server(self): run(server=self.server) def start_server(self): self.server = MyServer(host=get_Addr(), port=get_port_num()) print_d("starting server") self.server_thread = threading.Thread(target=self.run_server).start() def stop_server(self): self.server.shutdown() self.server_thread.join() print_d("stopped server")
Mon code fonctionne très bien, mais vue que je rentre d' un thread (celui du serveur donc..) dans quodlibet, écrit en GTK, vous imaginez ce qui se produit couramment (mais pas toujours ...), l' IHM freeze ou alors Quodlibet plante complètement.
Il faut en quelque sorte "re-synchroniser" mon callback pour qu' il n' interfère pas avec l' IHM de quodlibet.
Dûe à l' architecture en plugin, je suis obligé me semble-t-il d' utliliser un thread, sachant que "subprocess" ne fonctionne pas avec GTK apparemment ...(enfin, j' ai essayer, ça marcha pas ...)
Sinon, mon appli fonctionne bien, j' ai donc une API en REST avec un retour en JSON et un client Web minimaliste fonctionnel.
J' aimerais solutionner ce problème d' abord avant de continuer à avancer.
J' ai entrepris des recherches de mon côté, mais pour l' instant rien de concluant.
Si vous avez des idées ...
Merci !
(Sinon, je peut toujours intervenir avec quodlibet avec un pipe FIFO ... mais j' aimerais faire sans ...)
Partager