From 77d155cdea473873b8e179eefa180901f12c1623 Mon Sep 17 00:00:00 2001 From: Pauligrinder Date: Mon, 23 Jan 2017 12:43:40 +0200 Subject: [PATCH] Add a plugin to update a Kodi music library I created one for an older version before, but it didn't work since the change to Python 3. So I created a new one that works. --- beetsplug/kodiupdate.py | 66 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 beetsplug/kodiupdate.py diff --git a/beetsplug/kodiupdate.py b/beetsplug/kodiupdate.py new file mode 100644 index 000000000..236f914bf --- /dev/null +++ b/beetsplug/kodiupdate.py @@ -0,0 +1,66 @@ +# -*- coding: utf-8 -*- + +"""Updates a Kodi library whenever the beets library is changed. This is based on the Plex Update plugin. + +Put something like the following in your config.yaml to configure: + kodi: + host: localhost + port: 8080 + user: user + pwd: secret +""" +from __future__ import division, absolute_import, print_function + +import requests +import json +from requests.auth import HTTPBasicAuth +from beets import config +from beets.plugins import BeetsPlugin + + +def update_kodi(host, port, user, password): + """Sends request to the Kodi api to start a library refresh. + """ + url = "http://{0}:{1}/jsonrpc/".format(host, port) + + # The kodi jsonrpc documentation states that Content-Type: application/json is mandatory + headers = {'Content-Type': 'application/json'} + # Create the payload. Id seems to be mandatory. + payload = {'jsonrpc': '2.0', 'method':'AudioLibrary.Scan', 'id':1} + r = requests.post(url, auth=HTTPBasicAuth(user, password), json=payload, headers=headers) + return r + +class KodiUpdate(BeetsPlugin): + def __init__(self): + super(KodiUpdate, self).__init__() + + # Adding defaults. + config['kodi'].add({ + u'host': u'localhost', + u'port': 8080, + u'user': u'kodi', + u'pwd': u'kodi'}) + + self.register_listener('database_change', self.listen_for_db_change) + + def listen_for_db_change(self, lib, model): + """Listens for beets db change and register the update for the end""" + self.register_listener('cli_exit', self.update) + + def update(self, lib): + """When the client exists try to send refresh request to Kodi server. + """ + self._log.info(u'Updating Kodi library...') + + # Try to send update request. + try: + update_kodi( + config['kodi']['host'].get(), + config['kodi']['port'].get(), + config['kodi']['user'].get(), + config['kodi']['pwd'].get()) + self._log.info(u'... started.') + + except requests.exceptions.RequestException: + self._log.warning(u'Update failed.') +