Remote control via JSON-RPC
#1
Hi!

I'm trying to use JSON-RPC to monitor the current playing song and display it as Desktop Notification.

I wrote a simple python script, using socket to send/recv JSON, which works, but I get a lot of socket.timeout errors, and I don't know why...

Also, I would like to avoid polling, and want to use notifications, as described here. But I don't understand how to do that.

Does somebody have examples, based on socket or websocket, in python?

Thanks,
Frédéric
Reply
#2
Either retry on the timeout and/or set the socket timeout to be disabled/infinite/very long time. There is a default:

from "socket.create_connection":

"Passing the optional timeout parameter will set the timeout on the socket instance before attempting to connect. If no timeout is supplied, the global default timeout setting returned by getdefaulttimeout() is used."
Reply
#3
Yes, but I would like to know why it sometimes takes more than 20s to answer, and other times it answers immediatly...
Frédéric
Reply
#4
(2015-05-07, 07:17)fmafma Wrote: Yes, but I would like to know why it sometimes takes more than 20s to answer, and other times it answers immediatly...

put up an example script and logs when it doesn't respond. TBH It sounds like a routing issue to me
If you have problems please read this before posting

Always read the XBMC online-manual, FAQ and search the forum before posting.
Do not e-mail XBMC-Team members directly asking for support. Read/follow the forum rules.
For troubleshooting and bug reporting please make sure you read this first.

Image

"Well Im gonna download the code and look at it a bit but I'm certainly not a really good C/C++ programer but I'd help as much as I can, I mostly write in C#."
Reply
#5
Here is the basic script I'm using:

Code:
# -*- coding: utf-8 -*-

"""
"""

import time
import socket
import json

import notify2

JSON_REQUEST = {
    "jsonrpc": "2.0",
    "method": "Player.GetItem",
    "params": {
        "properties": [
            "title"
        ],
        "playerid": 0
    },
    "id": "AudioGetItem"
}

NOTIFIER_TIMEOUT = 30000  # ms


def main():
    notify2.init("kodi notifier")
    notifier = notify2.Notification("Kodi now playing:")
    notifier.timeout = NOTIFIER_TIMEOUT

    s = socket.socket()
    s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
    s.connect(("localhost", 9090))
    s.settimeout(30)

    oldTitle = None

    while True:
        try:

            # get current playing title
            start = time.time()
            s.send(json.dumps(JSON_REQUEST))
            ans = json.loads(s.recv(1024))
            print "got answer after %ds" % (time.time() - start)
            title = ans["result"]["item"]["title"]

            if title != oldTitle:
                oldTitle = title
                parts = title.split(" - ")
                notifier.update("Kodi now playing:", '\n'.join(parts))
                notifier.show()

            time.sleep(1)

        except KeyError:
            print "KeyError: ans=%s" % ans

        except ValueError:
            print "ValueError:"

        except socket.timeout:
            print "socket.timeout"


if __name__ == "__main__":
    main()

About routing, I'm on the same machine, for my tests, so I don't think it is the problem.

But... this morning, it seems to works fine! Never have more than 3s.

I'm testing this script while listening to a web radio, using the "Radio" plugin; could it be related? I noticed that when Kodi is filling buffer, all the app hangs (which is annoying, I have to say!).
Even if it plays fine, it maybe the issue? Sometime the buffer is waiting for the stream, and Kofi hangs a few seconds...
Frédéric
Reply
#6
While writing, I made a simple test by disconnecting the ethernet cable and I can reproduce the issue! So, it is the 'normal' hang of Kodi Wink

Ok, so, now I would like to use notifications. Any idea how to do that?
Frédéric
Reply

Logout Mark Read Team Forum Stats Members Help
Remote control via JSON-RPC0