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

时间:2017-07-07 17:01:11

标签: python python-2.7 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()

显然现在这是一个相当大的混乱。我觉得它陷入无限循环。我认为应该是我脑子里的参数,但我不确定如何正确地实现它们以递归方式使用上面的目录结构。

参数列表

  • ACTION
    1. 列出(按部分,然后按主题)
    2. 查询(按部分[检查全局搜索],按来源,按动物,按字词/查询)
    3. 播放(链接已被检索,播放)
  • SECTION :我们所在的目录(按动物,按网站,按类别等)
  • TOPIC :从章节中选择的子目录(按动物划分的动物1,按类别划分的可爱/滑稽等)
  • ANIMAL ?:我们选择或正在选择的动物
  • SOURCE ?:我们选择或在
  • 的来源
  • QUERY :包含搜索字词
  • 视频:包含要播放的链接

最后,问题

  • 是否可以使这个结构有效?
    • 如果是这样,怎么样?
  • 我需要以什么顺序检查参数以涵盖所有可能性?
  • 我应该以不同的方式构建它以使其工作吗?
    • 如果是这样,怎么样?

1 个答案:

答案 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()