如何构建这些 kodi 参数检查?



我正在为 Kodi 创建一个附加组件,并且正在重组目录结构和router功能,因为我的编程流程和功能自首次启动项目以来发生了巨大变化。我希望实现的新目录结构如下所示:

  • 按动物
    • 动物 1(例如猫(
      • 建议的类别/搜索 1(例如 Roombas上的猫(
      • 建议的类别/搜索2(例如猫和黄瓜(
      • 按站点
      • 随机视频
      • 随机连续
      • 搜索
    • 动物 2
      • 建议的类别/搜索 1
      • 建议的类别/搜索 2
      • 按站点
      • 随机视频
      • 随机连续
      • 搜索
  • 按站点
    • 站点 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. 列表(按部分,然后按主题(
    2. 查询
    3. (按部分 [检查是否全局搜索]、按来源、按动物、按术语/查询(
    4. 播放
    5. (链接已被检索,播放(
  • 部分:我们所在的目录(按动物、按站点、按类别等(
  • 主题:从该部分中选择哪个子目录(按动物下的动物 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()

最新更新