Advertisement
Guest User

Untitled

a guest
May 24th, 2018
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.00 KB | None | 0 0
  1. # -*- coding: utf-8 -*-
  2. from operator import itemgetter
  3. import sys
  4. from urllib import urlencode
  5. from urlparse import parse_qsl
  6. import middle
  7. import xbmc, xbmcgui, xbmcplugin, xbmcaddon
  8.  
  9.  
  10. _url = sys.argv[0]
  11. _handle = int(sys.argv[1])
  12. # TODO: замена на свои значения
  13. __settings__ = xbmcaddon.Addon(id='plugin.video.example')
  14. locale_type = __settings__.getSetting('locale')
  15.  
  16. def get_url(**kwargs):
  17.     """
  18.    Create a URL for calling the plugin recursively
  19.    from the given set of keyword arguments.
  20.    """
  21.     return '{0}?{1}'.format(_url, urlencode(kwargs))
  22.  
  23. def alert(title, message):
  24.     xbmcgui.Dialog().ok(title, message)
  25.  
  26. def addDirItem(label, action, category, is_folder=True, **kwargs):
  27.     item = xbmcgui.ListItem(label=label)
  28.     url = get_url(action=action, category=category, **kwargs)
  29.     xbmcplugin.addDirectoryItem(_handle, url, item, is_folder)
  30.  
  31. def titlesListGenerator(titles):
  32.     """Gets list of dicts, returns dirs"""
  33.     # TODO: подкрутить имена, фанарты, прочее
  34.     for title in titles:
  35.         title_name = title['name_ru'].encode('utf-8') if title.get(
  36.             'name_ru') else title['name_en']
  37.         list_item = xbmcgui.ListItem(label=title_name)
  38.         list_item.setArt({
  39.             'thumb': title['poster'],
  40.             'icon': title['poster'],
  41.             'fanart': title['poster']})
  42.         list_item.setInfo('video', {
  43.             'title': title_name,
  44.             'genre': title_name,
  45.             'mediatype': 'video'})
  46.         url = get_url(action='listing', category=title['id'])
  47.         xbmcplugin.addDirectoryItem(_handle, url, list_item, True)
  48.  
  49. def home(page='1'):
  50.     """
  51.    Create the list of video categories in the Kodi interface.
  52.    """
  53.     xbmcplugin.setPluginCategory(_handle, 'Shikimori')
  54.     xbmcplugin.setContent(_handle, 'videos')
  55.     lu, isNextPage = middle.getLastUpdates(page=page)
  56.  
  57.     if page == '1':
  58.         addDirItem('Поиск', 'search', '1')
  59.         addDirItem('Избранное Shikimori', 'selected', 'Избранное')
  60.         addDirItem('Избранное сообществом', 'community', \
  61.             'Избранное сообществом')
  62.         addDirItem('Поиск1', 'full_search', 'Full Search')
  63.  
  64.     titlesListGenerator(lu)
  65.  
  66.     if isNextPage:
  67.         next_page = int(page) + 1
  68.         addDirItem('---Далее---', 'home', '%s'% next_page)
  69.     view_mode_id = 500
  70.     xbmc.executebuiltin('Container.SetViewMode(%d)' % view_mode_id)
  71.     xbmcplugin.endOfDirectory(_handle)
  72.  
  73. def search(page='1', query=''):
  74.     if int(page) == 1:
  75.         xbmcplugin.setPluginCategory(_handle, 'Search result')
  76.         xbmcplugin.setContent(_handle, 'videos')
  77.         kb = xbmc.Keyboard()
  78.         kb.setDefault('')
  79.         kb.setHeading("Поиск")
  80.         kb.doModal()
  81.         if kb.isConfirmed():
  82.             query = kb.getText()
  83.             filter_ = middle.filter_(page=page, search=query)
  84. #            serp, isNext = middle.search(filter_=filter_)
  85. #            titlesListGenerator(serp)
  86.     else:
  87.         filter_ = middle.filter_(page=page, search=query)
  88.  
  89.     serp, isNext = middle.search(filter_=filter_)
  90.     titlesListGenerator(serp)
  91.  
  92.     if isNext:
  93.         next_page = int(page) + 1
  94.         addDirItem('---Далее---', 'search', '%s'% next_page, query=query)
  95.  
  96.     xbmcplugin.endOfDirectory(_handle)
  97.  
  98. def searchWithFilters():
  99.     # TODO: выбор темы "список" для папки
  100.     xbmcplugin.setPluginCategory(_handle, 'Фильтры')
  101.     xbmcplugin.setContent(_handle, 'videos')
  102.     addDirItem('Тип', 'search_type', 'type')
  103.     addDirItem('Статус', 'search_status', 'status')
  104.     addDirItem('Сезон,год', 'search_season', 'season')
  105.     addDirItem('Жанр', 'search_genre', 'genre')
  106.     addDirItem('Оценка', 'search_score', 'score')
  107.     addDirItem('Сортировка', 'search_sort_by', 'sort_by')
  108.     #query
  109.  
  110.     xbmcplugin.endOfDirectory(_handle)
  111.  
  112. def selected():
  113.     xbmcplugin.setPluginCategory(_handle, 'Избранное')
  114.     xbmcplugin.setContent(_handle, 'videos')
  115.     selected_filter = middle.filter_(selected=True)
  116.     selected, isNext = middle.search(filter_=selected_filter)
  117.     titlesListGenerator(selected)
  118.     xbmcplugin.endOfDirectory(_handle)
  119.  
  120. def communityChoosen():
  121.     """Community choosen directory at home directory."""
  122.     xbmcplugin.setPluginCategory(_handle, 'Избранное')
  123.     xbmcplugin.setContent(_handle, 'videos')
  124.     community_filter = middle.filter_(community_choosen=True)
  125.     community_choosen, isNext = middle.search(filter_=community_filter)
  126.     titlesListGenerator(community_choosen)
  127.     xbmcplugin.endOfDirectory(_handle)
  128.  
  129. def listVideos(category):
  130.     """
  131.    Create the list of playable videos in the Kodi interface.
  132.    """
  133.     xbmcplugin.setPluginCategory(_handle, category)
  134.     xbmcplugin.setContent(_handle, 'videos')
  135.     eps_list = middle.getEpisodes(category, 'full')
  136.     if eps_list:
  137.         for ep in eps_list:
  138.             item = xbmcgui.ListItem(label=ep['episode'])
  139.             item.setProperty('IsPlayable', 'true')
  140.             url = get_url(action='find_relevant', \
  141.                 category=ep['episode'].encode('utf-8'), \
  142.                 link=ep['episode_link'])
  143.             xbmcplugin.addDirectoryItem(_handle, url, item)
  144.         xbmcplugin.endOfDirectory(_handle)
  145.     else:
  146.         alert('Упс!', 'Что-то пошло не так! Возможно до этого аниме ' \
  147.             'добрались правообладатели.')
  148.         xbmcplugin.endOfDirectory(_handle)
  149.  
  150. def findRelevant(url):
  151.     #locale_type
  152.     video = middle.getRelevantVideo(url, locale_type)
  153.     play_item = xbmcgui.ListItem(path=video)
  154.     xbmcplugin.setResolvedUrl(_handle, True, listitem=play_item)
  155.  
  156. def play_video(path):
  157.     """
  158.    Play a video by the provided path.
  159.    """
  160.     play_item = xbmcgui.ListItem(path=path)
  161.     xbmcplugin.setResolvedUrl(_handle, True, listitem=play_item)
  162.  
  163.  
  164. def router(paramstring):
  165.     """
  166.    Router function that calls other functions
  167.    depending on the provided paramstring
  168.    """
  169.     params = dict(parse_qsl(paramstring))
  170.     if params:
  171.         if params['action'] == 'search':
  172.             search(params['category'], query=params.get('query', ''))
  173.         elif params['action'] == 'fullSearch':
  174.             searchWithFilters()
  175.         elif params['action'] == 'selected':
  176.             selected()
  177.         elif params['action'] == 'community':
  178.             communityChoosen()
  179.         elif params['action'] == 'listing':
  180.             listVideos(params['category'])
  181.         elif params['action'] == 'home':
  182.             home(params['category'])
  183.  
  184.         elif params['action'] == 'find_relevant':
  185.             findRelevant(params['link'])
  186.  
  187.         elif params['action'] == 'play':
  188.             play_video(params['video'])
  189.         else:
  190.             raise ValueError('Invalid paramstring: {0}!'.format(paramstring))
  191.     else:
  192.         home()
  193.  
  194.  
  195. if __name__ == '__main__':
  196.     router(sys.argv[2][1:])
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement