我正在为 Kodi 创建一个附加组件,并且正在重组目录结构和router
功能,因为我的编程流程和功能自首次启动项目以来发生了巨大变化。我希望实现的新目录结构如下所示:
- 按动物
- 动物 1(例如猫(
- 建议的类别/搜索 1(例如 Roombas上的猫(
- 建议的类别/搜索2(例如猫和黄瓜(
- 都
- 按站点
- 随机视频
- 随机连续
- 搜索
- 动物 2
- 建议的类别/搜索 1
- 建议的类别/搜索 2
- 都
- 按站点
- 随机视频
- 随机连续
- 搜索
- 动物 1(例如猫(
- 按站点
- 站点 1(活动(
- 站点 2(休眠(
- 站点 3(活动/大型选择(
- 站点 4(休眠/大量选择(
- 按类别
- 教育/野生动物
- 都
- 按动物
- 按站点
- 随机视频
- 随机连续
- 搜索
- 感人
- 都
- 按动物
- 按站点
- 随机视频
- 随机连续
- 搜索
- 可爱/有趣
- 都
- 按动物
- 按站点
- 随机视频
- 随机连续
- 搜索
- 教育/野生动物
- 直播流
- 随机视频
- 随机连续
- 全球搜索
如您所见,有一些重复的目录项,我打算允许用户在深入了解目录结构时优化搜索。这些重复的项目是我目前在如何处理它们方面迷失的地方。我重新设计的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()
显然,现在这是一个很大的混乱。我觉得它陷入了一个无限循环。我脑海中已经有了我认为应该是参数的东西,但不确定如何正确实现它们以递归地使用上面的目录结构。
<小时 />参数列表
- 行动:
- 列表(按部分,然后按主题( 查询
- (按部分 [检查是否全局搜索]、按来源、按动物、按术语/查询( 播放
- (链接已被检索,播放(
- 部分:我们所在的目录(按动物、按站点、按类别等(
- 主题:从该部分中选择哪个子目录(按动物下的动物 1,按类别下的可爱/有趣等( 动物
- ?:我们选择或属于哪种动物 来源
- ?:我们选择或位于哪个来源
- 查询:包含搜索词
- 视频:包含播放链接
最后,问题
- 是否有可能使这种结构起作用?
- 如果是这样,如何?
- 我需要按什么顺序检查参数才能涵盖所有可能性?
- 我应该以不同的方式构建它才能让它工作吗?
- 如果是这样,如何?
对于复杂的路径层次结构,我建议不要发明轮子,而是使用此路由库:https://github.com/tamland/kodi-plugin-routing 。它在 Kodi 官方插件存储库中script.module.routing
。
这个库使用任意路径创建"漂亮"的URL,就像流行的Flask Web框架一样,做所有繁重的工作,如"引擎盖下"的路径解析。
从库的自述文件中复制粘贴:
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()