Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
KODI API
#1
Czy istnieje możliwość sterowania KODI za pomocą jakiegoś API?
To znaczy w zasadzie domyślam się że się da, ale może są gdzieś jakieś konkretne działające przykłady? Mam jakiś tam background w pythonie, ale z żadnym API jeszcze nie pracowałem i nie wiem, jak to ugryźć.
Nie zależy mi na wysterowaniu wszystkiego ze szczegółami, ale póki co jakieś podstawy jak play/pause/stop, vol_up/vol_down/mute, ale i - co może być większym wyzwaniem - np. wystartowanie stacji radiowej (standardowy dodatek radio, ten z którym ostatnio jest problem i tu na forum polecono mi zamiennik).

Dobrze by było zacząć od jakiegoś działającego przykładu.
Odpowiedz
REKLAMA:



#2
Włączasz interfejs web w kodi i już możesz szaleć w nim via API. Opis API jest w manualu Kodi i na oficjanym forum.
Poniższy starter powinien pomóc zacząć zabawę.

#CONSTANTS, default local Kodi with web enabled under default port
KODI_IP = '127.0.0.1'
KODI_PORT = '8080'

AppProperties    = b'{"jsonrpc": "2.0", "method": "Application.GetProperties", "params": {"properties": ["version", "name"]}, "id": 1 }'
XBMCInfoBool     = b'{"jsonrpc": "2.0", "method": "XBMC.GetInfoBooleans", "params": { "booleans": ["System.ScreenSaverActive ","System.IdleTime(600) "] }, "id": 1}'
GetActivePlayers = b'{"jsonrpc": "2.0", "method": "Player.GetActivePlayers", "id": 1}'
AudioPlayerItem = b'{"jsonrpc": "2.0", "method": "Player.GetItem", "params": {"properties": ["title", "album", "artist", "duration", "thumbnail", "file", "fanart", "streamdetails"], "playerid": 0 }, "id": 0}'
VideoPlayerItem = b'{"jsonrpc": "2.0", "method": "Player.GetItem", "params": {"properties": ["title","album","artist","season","episode","duration","showtitle","tvshowid","thumbnail","file","fanart","streamdetails"],"playerid":1 }, "id": 1}'
VideoPlayerProperties  = b'{"jsonrpc": "2.0", "method": "Player.GetProperties","params":{"playerid":1,"properties":["audiostreams","currentaudiostream","currentsubtitle","currentvideostream","percentage","subtitleenabled","subtitles","videostreams","time","totaltime"]},"id": 1}' 
AudioPlayerProperties  = b'{"jsonrpc": "2.0", "method": "Player.GetProperties","params":{"playerid":0,"properties":["audiostreams","currentaudiostream","currentsubtitle","currentvideostream","percentage","subtitleenabled","subtitles","videostreams"]},"id": 0}' 
GUIProperties    = b'{"jsonrpc":"2.0","method":"GUI.GetProperties","params":{"properties":["currentwindow", "currentcontrol"]},"id":1}'

import json
try: #py2
    from urllib2 import Request as urllib2_Request, urlopen as urllib2_urlopen
except Exception: #py3
    from urllib.request import Request as urllib2_Request, urlopen as urllib2_urlopen

class remoteKODI():
    def __init__(self, host, port):
        self.host = host
        self.port = port

    def getState(self, data):
        url = 'http://%s:%s/jsonrpc' % (self.host, self.port)
        headers = {"Content-Type":"application/json",}
        req = urllib2_Request(url, data, headers)

        try:
            response = urllib2_urlopen(req, timeout=0.3)
            response = response.read()
            response = json.loads(response)
            if 'result' in response and isinstance(response['result'],dict):
                response['result']['isError'] = False
                response['result']['ErrorDescr'] = 'OK-dict' 
            elif 'result' in response and isinstance(response['result'],list):
                if len(response['result']) > 0:
                    response['result'] = response['result'][0]
                    response['result']['isError'] = False
                    response['result']['ErrorDescr'] = 'OK-list[0]'
                else:
                    response = {'result': {'isError': False, 'ErrorDescr': 'OK-empty list'} }
            else:
                response = {'result': {'isError': True, 'ErrorDescr': 'no or empty dict result'} }

        except Exception as e:
            response = {'result': {'isError': True, 'ErrorDescr': str(e).lower()} }
       
        return response['result']

#for tests outside e2 only do NOT use
if __name__ == '__main__':
    kodi = remoteKODI('127.0.0.1', '8080')
    #print(kodi.getState(GetActivePlayers))
    #print(kodi.getState(VideoPlayerItem))
    #print(kodi.getState(VideoPlayerProperties))
    print(kodi.getState(GUIProperties))

p.s. więcej przykładów nie posiadam, nic poza wyświetlaniem stanu kodi na LCD tunera satelitarnego nie było mi potrzebne.
Odpowiedz
#3
Ooo, super - dziękuję bardzo.
Dostałem też link do By zobaczyć linki musisz się zalogować lub zarejestrować. - jest tam między innymi sterowanie playerem (choć nie wszystko mi działa w czasie testów)
Jeszcze nie wiem jak ocbsłużyć dodatek Radio, ale mam nadzieję, że wydedukuję.

BTW, masz zdefiniowane KODI_IP i KODI_PORT, ale ich nie używasz - jawnie wywołujesz kodi = remoteKODI('127.0.0.1', '8080')
Odpowiedz
#4
to zaszłość z pierwszej wersji skryptu. Nie przeszkadza i niczym nie skutkuje.
Odpowiedz
#5
Oczywiscie, choć w pierwszej chwili się zdziwiłem, gdy po ustawieniu wartości chciał mi się łączyć z localhost.
Tak czy inaczej - skrypt bez problemu odpala np. video na youtube, czy zmienia głośność. Żeby sterować radiem muszę znaleźć info jak obsłużyć dodatek, szukam cały czas...
Odpowiedz
#6
Jakis czas temu takze bylem zainteresowany jak z boxa z coreelec zrobic responsywne radio internetowe. Uzywanie w tym wypadku kodi i iptv simple bylo wielkim nieporozumieniem bo responsywnosc takiego zestawu byla nie do zaakceptowania. Przelaczanie stacji trwalo wieki i ciagle jakies update-y i alerty w tle. Olalem kodi (wylaczajac go calkowicie) i zainstalowalem mpd z klientem mpc. To wszystko sterowane z pilota poprzez daemona triggerhappy. W koncu box dostal skrzydel. Obciazenie boxa to jakies 2-3%. Stacje wskakuja blyskawicznie. Nic sie nie przycina i wszystko dziala stabilnie. Oczywiscie do tego wlasna lista ulubionych stacji w m3u. Polecam takie rozwiazanie.
-------------------------------------------------------------------------
X96 Max Plus 4/64 + DVBSky S960 + CoreELEC + VDR + OSCam
-------------------------------------------------------------------------
Odpowiedz
REKLAMA:



#7
Ale idea jest zupełnie inna.
Ja mam działające libreelec z kodi i jest jak najbardziej szybkie i responsywne. Jedyne co usiłuję zrobić to wysterować niektóre, wybrane funkcje z zewnętrznego systemu. Celem jest sterowanie głosowe, zarządzanie z innego komputera - napisałem już wstępny skrypt TTS/STT i mogę poleceniem głosowym zmienić głośność, lub np. włączyć konkretne, wcześniej ustalone wideo na youtube. Ale radia jeszcze włączyć nie umiem.
A taką funkcję chcę wyprodukować dla żony - ma ona dwie-trzy ulubione stacje i chcę, żeby wchodząc do pokoju mogła włączyć dowolną z nich. Szukania stacji wg dowolnych kryteriów nie przewiduję - chcę trzy statyczne polecenia przez rpc.


mpd nawet mam na serwerze, ale chyba wreszcie wyłączę, nie potrzebne mi.
Odpowiedz
#8
(24-05-2024, 06:41 PM)andrkac napisał(a): ... Celem jest sterowanie głosowe, zarządzanie z innego komputera - napisałem już wstępny skrypt TTS/STT i mogę poleceniem głosowym zmienić głośność, lub np. włączyć konkretne, wcześniej ustalone wideo na youtube. ...

Zaciekawił mnie kolega. Smile

Można prosić o trochę szczegółów? Rozumiem, że cała zabawka/apka jest do telefonu, czy może korzysta kolega z mikrofonu od pilot BT?
Odpowiedz
#9
Nie, telefon nie ma brać w tym udziału.
Mój odtwarzacz to Librelec@x86_64 z quazicustomową obudową. Oprócz tego w domu mam serwer (obecnie ubuntu, wcześniej centos)

Odtwarzacz stoi w salonie, serwer - w garderobie.
Cel to infrastruktura, która umożliwi następującą akcję:
Najlepsza z żon wchodzi  do salonu, mówi "Henio, włącz Antyradio" i za kilka sekund odtwarzacz włącza Antyradio.

Napisałem skrypt (python), który korzysta z googlowych speech-to-text i text-to-speech - rozpoznaje co powiem i może na podstawie tego wykonać akcję, uruchomić coś albo odpowiedzieć głosem Google Assistant. Imię Henio jest przypadkowe - to "magic word", żeby nie przetwarzać wszystkiego co ktokolwiek mówi. Skrypt jest kulawy, pada nawet po zbyt małej liczbie słów (jedno, tylko imię) i w wielu innych sytuacjach, ale jest to do opanowania.
Teraz mam dwie opcje.
1) Skrypt ma dużo zależności, niełatwo go wrzucić do libreelec, ale z tego co czytałem takie coś można ogarnąć dockerem - zapakować całe środowisko do kontenera. Nie miałem jeszcze do czynienia z dockerem, więc póki co - nie spróbowałem
2) Bardziej myślę szerszym rozwiązaniu: bot Rasa (znalazłem gdzieś, jak go nauczyć polskiego - w teorii bo mi nie idzie), do tego piper do mówienia i whisper do słuchania - i to wszystko na serwerze. Zależy mi na piper/whisper zamiast googlowych TTS/STT, bo nie chcę być zależny od dostępu do internetu.

Chcę bardziej opcję 2), bo jednocześnie buduję sobie własnego smarthome (esp8266/esp32, mqtt) i tegoż też chcę móc sterować głosowo. Więc do tego potrzebuję albo jakiś zdalny mikrofon (z salonu do garderoby), albo Audio over IP - dopiero się doczytałem o tym protokole, nie wiem jeszcze jak działa - albo jakieś cuda z pulseaudio (z odtwarzacza do serwera).

Obie opcje wymagają wciąż bardzo dużo pracy, na razie kolekcjonuję klocki do zbudowania całości. Druga zresztą wymaga też wymiany sprzętu serwerowego (to thin client z obudową JBOD), albo przynajmniej dołożenia zewnętrznej karty graficznej, bo zdecydowanie brakuje mi mocy.


Oczywiscie intefejs głosowy nie ma się ograniczać wyłącznie do włączenia jednej stacji. Do tego ma być sterowanie głośnością, zmiana stacji (na jedną z kilku wcześniej zdefiniowanych), wyłączenie. Nie potrzebuję sterować całym kodi. Ale to nie ma znaczenia - jak już ogarnę radio, to reszta to pryszcz - głośnością już umiem sterować.

A "quazicustomowa obudowa" oznacza, że wywaliłem bebechy z niedziałąjącego odtwarzacza CD-Audio i wsadziłem do środka:
- thin client dell wyse 5060,
- LCD 2x16 zamiast oryginalnego,
- własny odbiornik IR (wzystko normalnie działa z pilota uniwersalnego),
- nagrywarkę BluRay (choć nigdy nic na niej nie nagrałem, ale odtwarzać - tak)
- arduino micro, które odbiera polecenia od przycisków na obudowie (wszystkie robią co trzeba) oraz obsługuje włąsnej roboty ambilight (za pomocą hyperiona)


----------------------------------
EDIT: wiem już z forum kodi.tv, że użycie rpc może być niemożliwe. Ale mam w zanadrzu jeszcze kilka pomysłów, będę próbował.
Odpowiedz
#10
Nooo i... jest nieźle.
Autor nowego Radio.de dzięki moim naciskom poprawił kilka rzeczy w kodzie i działa mi już głosowe włączenie wybranych stacji , sterowanie głośnością i wyłączanie. Działa mniej więcej stabilnie.
Teraz porządkuję kod i poprawiam drobiazgi.

Póki co będę chciał to zapakować do kontera i wrzucić do dockera, ale... nie mam jeszcze pojęcia jak to się robi Smile
Odpowiedz


Skocz do:


Użytkownicy przeglądający ten wątek: 1 gości