我正在为Kodi创建一个附加组件,我正在重构目录结构和router
函数,因为我的程序流程和功能自首次启动项目以来已经发生了翻天覆地的变化。我希望实现的新目录结构如下:
正如您所看到的,有一些重复的目录项,我打算允许用户在深入了解目录结构时优化搜索。那些重复的项目是我目前失去的与如何处理它们有关的地方。我重新设计的router
函数目前看起来像这样:
MAIN_MENU = ['By Animal',
'By Site',
'By Category',
'Live Streams',
'Random Video',
'Random Continuous',
'Search']
def get_url(**kwargs):
return '{0}?{1}'.format(_url, urlencode(kwargs))
def main_menu():
for menu_item in MAIN_MENU:
list_item = xbmcgui.ListItem(label=menu_item)
is_folder = True
url = get_url(action='listing', section=menu_item)
xbmcplugin.addDirectoryItem(_handle, url, list_item, is_folder)
xbmcplugin.addSortMethod(_handle, xbmcplugin.SORT_METHOD_NONE)
xbmcplugin.endOfDirectory(_handle)
def router(paramstring):
params = dict(parse_qsl(paramstring))
if params:
if params['action'] == 'listing':
if 'topic' in params:
meta.get_directory(params['section'], params['topic'])
else:
meta.get_directory(params['section'])
elif params['action'] == 'query':
if 'section' in params:
#further checks
if 'topic' in params:
#Only search sources under this topic (suggested category, all, by site, random video, etc)
#meta.get_results(params['section'], params['topic'], params['query'])
elif 'animal' in params:
#Only search sources with this animal in their meta tags
else:
#global search
#scraper.Site.search(params['QUERY'])
elif params['action'] == 'play':
else:
raise ValueError('Invalid paramstring: {0}!'.format(paramstring))
else:
main_menu()
显然现在这是一个相当大的混乱。我觉得它陷入无限循环。我认为应该是我脑子里的参数,但我不确定如何正确地实现它们以递归方式使用上面的目录结构。
答案 0 :(得分:0)
对于复杂的路径层次结构,我建议不要发明轮子,而是使用此路由库:https://github.com/tamland/kodi-plugin-routing。它是Kodi官方插件库中的script.module.routing
。
这个图书馆创造了#34;漂亮"具有任意路径的URL与流行的Flask Web框架非常相似,可以解决所有繁重的问题,例如路径解析"引擎盖下#34;。
从图书馆的自述文件中复制粘贴:
import routing
from xbmcgui import ListItem
from xbmcplugin import addDirectoryItem, endOfDirectory
plugin = routing.Plugin()
@plugin.route('/')
def index():
addDirectoryItem(plugin.handle, plugin.url_for(show_category, "one"), ListItem("Category One"), True)
addDirectoryItem(plugin.handle, plugin.url_for(show_category, "two"), ListItem("Category Two"), True)
endOfDirectory(plugin.handle)
@plugin.route('/category/<category_id>')
def show_category(category_id):
addDirectoryItem(plugin.handle, "", ListItem("Hello category %s!" % category_id))
endOfDirectory(plugin.handle)
if __name__ == '__main__':
plugin.run()