Unabhängig von VS schaue ich mir auch gern andere Lösungen an. Wenn Dein Framework unter Windows läuft oder in einer virtuellen Umgebung, würde ich es testen. Wie komme ich zu dem Framework?
Ich hab für die Mediatheken ursprünglich die libMediathek geschrieben, damit ich den Code zur Verzeichniserstellung zentral verwalten kann. Darum brauche ich in den Mediathek Add-ons selbst keine Kodi Module zu importieren, wodurch man alles in einer externen Umgebung laufen lassen kann. Fertig ist es aber noch nicht, der Code muss erst einmal aufgeräumt werden. Auch fehlt die Dokumentation.
Hier mal ein Beispiel, wie ein Add-on ohne Kodi Abhängigkeiten aussehen kann:
# -*- coding: utf-8 -*-
import libMediathek2 as libMediathek
#import xbmcplugin
#import xbmcgui
import json
import re
import _utils#todo: move to lib
modes = {
'main': main,
'listVideos': listVideos,
'play': play,
}
def main():
url = 'https://www.nhl.com/video/'
response = _utils.getUrl(url)
jsonraw = re.compile('dataBootstrap.+?= (.+?);\n', re.DOTALL).findall(response)[0]
j = json.loads(jsonraw)
l = []
for topic in j['navData']['mainMenu']['topics']:
if topic['type'] == 'topic':
d = {}
d['_name'] = topic['title']
d['url'] = 'https://search-api.svc.nhl.com/svc/search/v2/nhl_global_en/topic/' + topic['id'] + '?page=1&sort=new&type=video&hl=false&expand=image.cuts.640x360%2Cimage.cuts.1136x640'
d['_type'] = 'dir'
d['mode'] = 'listVideos'
l.append(d)
elif topic['type'] == 'category':
catName = topic['title']
for topic2 in topic['topics']:
d = {}
d['_name'] = catName + ' - ' + topic2['title']
d['url'] = 'https://search-api.svc.nhl.com/svc/search/v2/nhl_global_en/topic/' + topic2['id'] + '?page=1&sort=new&type=video&hl=false&expand=image.cuts.640x360%2Cimage.cuts.1136x640'
d['_type'] = 'dir'
d['mode'] = 'listVideos'
l.append(d)
libMediathek.addEntries(l)
def listVideos():
response = _utils.getUrl(params['url'])
j = json.loads(response)
l = []
for doc in j['docs']:
d = {}
d['_name'] = doc['blurb']
d['_plot'] = doc['bigBlurb']
s = doc['duration'].split(':')
d['_duration'] = str(int(s[0]) * 60 + int(s[1]))
d['_thumb'] = doc['image']['cuts']['640x360']['src']
d['url'] = 'https://nhl.bamcontent.com/nhl/id/v1/' + doc['asset_id'] + '/details/web-v1.json'
d['_type'] = 'video'
d['mode'] = 'play'
l.append(d)
page = int(params['url'].split('page=')[-1].split('&')[0])
if page * j['meta']['page_size'] < j['meta']['hits']:
d = {}
d['url'] = params['url'].replace('page='+str(page),'page='+str(page+1))
d['type'] = 'nextPage'
d['mode'] = 'listVideos'
l.append(d)
libMediathek.addEntries(l)
def play():
response = _utils.getUrl(params['url'])
j = json.loads(response)
for vid in j['playbacks']:
if vid['name'] == 'HTTP_CLOUD_WIRED_60':
url = vid['url']
libMediathek.setResolved(url)
#listitem = xbmcgui.ListItem(path=url)
#xbmcplugin.setResolvedUrl(pluginhandle, True, listitem)
def list():
global params
params = libMediathek.get_params()
global pluginhandle
pluginhandle = int(sys.argv[1])
if not params.has_key('mode'):
main()
libMediathek.endOfDirectory()
#xbmcplugin.endOfDirectory(int(sys.argv[1]))
else:
modes.get(params['mode'],main)()
libMediathek.endOfDirectory()
#xbmcplugin.endOfDirectory(int(sys.argv[1]))
list()
Alles anzeigen
Das Add-on gibt eine Liste mit verschiedenen Dict Einträgen an die libMediathek. Wenn man nun das Add-on extern ausführen möchte braucht man nur eine kleines Modul, was die Aufrufe entsprechend protokolliert bzw. Startparameter per get_params() liefert.
Ich brauche mit dem Framework noch etwas Zeit, da es immer wieder eweitert und verbessert wurde. Schreib dir am besten etwas eigenes.