Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # -*- coding: utf-8 -*-
- from operator import itemgetter
- import sys
- from urllib import urlencode
- from urlparse import parse_qsl
- import middle
- import xbmc, xbmcgui, xbmcplugin, xbmcaddon
- _url = sys.argv[0]
- _handle = int(sys.argv[1])
- # TODO: замена на свои значения
- __settings__ = xbmcaddon.Addon(id='plugin.video.example')
- locale_type = __settings__.getSetting('locale')
- def get_url(**kwargs):
- """
- Create a URL for calling the plugin recursively
- from the given set of keyword arguments.
- """
- return '{0}?{1}'.format(_url, urlencode(kwargs))
- def alert(title, message):
- xbmcgui.Dialog().ok(title, message)
- def addDirItem(label, action, category, is_folder=True, **kwargs):
- item = xbmcgui.ListItem(label=label)
- url = get_url(action=action, category=category, **kwargs)
- xbmcplugin.addDirectoryItem(_handle, url, item, is_folder)
- def titlesListGenerator(titles):
- """Gets list of dicts, returns dirs"""
- # TODO: подкрутить имена, фанарты, прочее
- for title in titles:
- title_name = title['name_ru'].encode('utf-8') if title.get(
- 'name_ru') else title['name_en']
- list_item = xbmcgui.ListItem(label=title_name)
- list_item.setArt({
- 'thumb': title['poster'],
- 'icon': title['poster'],
- 'fanart': title['poster']})
- list_item.setInfo('video', {
- 'title': title_name,
- 'genre': title_name,
- 'mediatype': 'video'})
- url = get_url(action='listing', category=title['id'])
- xbmcplugin.addDirectoryItem(_handle, url, list_item, True)
- def home(page='1'):
- """
- Create the list of video categories in the Kodi interface.
- """
- xbmcplugin.setPluginCategory(_handle, 'Shikimori')
- xbmcplugin.setContent(_handle, 'videos')
- lu, isNextPage = middle.getLastUpdates(page=page)
- if page == '1':
- addDirItem('Поиск', 'search', '1')
- addDirItem('Избранное Shikimori', 'selected', 'Избранное')
- addDirItem('Избранное сообществом', 'community', \
- 'Избранное сообществом')
- addDirItem('Поиск1', 'full_search', 'Full Search')
- titlesListGenerator(lu)
- if isNextPage:
- next_page = int(page) + 1
- addDirItem('---Далее---', 'home', '%s'% next_page)
- view_mode_id = 500
- xbmc.executebuiltin('Container.SetViewMode(%d)' % view_mode_id)
- xbmcplugin.endOfDirectory(_handle)
- def search(page='1', query=''):
- if int(page) == 1:
- xbmcplugin.setPluginCategory(_handle, 'Search result')
- xbmcplugin.setContent(_handle, 'videos')
- kb = xbmc.Keyboard()
- kb.setDefault('')
- kb.setHeading("Поиск")
- kb.doModal()
- if kb.isConfirmed():
- query = kb.getText()
- filter_ = middle.filter_(page=page, search=query)
- # serp, isNext = middle.search(filter_=filter_)
- # titlesListGenerator(serp)
- else:
- filter_ = middle.filter_(page=page, search=query)
- serp, isNext = middle.search(filter_=filter_)
- titlesListGenerator(serp)
- if isNext:
- next_page = int(page) + 1
- addDirItem('---Далее---', 'search', '%s'% next_page, query=query)
- xbmcplugin.endOfDirectory(_handle)
- def searchWithFilters():
- # TODO: выбор темы "список" для папки
- xbmcplugin.setPluginCategory(_handle, 'Фильтры')
- xbmcplugin.setContent(_handle, 'videos')
- addDirItem('Тип', 'search_type', 'type')
- addDirItem('Статус', 'search_status', 'status')
- addDirItem('Сезон,год', 'search_season', 'season')
- addDirItem('Жанр', 'search_genre', 'genre')
- addDirItem('Оценка', 'search_score', 'score')
- addDirItem('Сортировка', 'search_sort_by', 'sort_by')
- #query
- xbmcplugin.endOfDirectory(_handle)
- def selected():
- xbmcplugin.setPluginCategory(_handle, 'Избранное')
- xbmcplugin.setContent(_handle, 'videos')
- selected_filter = middle.filter_(selected=True)
- selected, isNext = middle.search(filter_=selected_filter)
- titlesListGenerator(selected)
- xbmcplugin.endOfDirectory(_handle)
- def communityChoosen():
- """Community choosen directory at home directory."""
- xbmcplugin.setPluginCategory(_handle, 'Избранное')
- xbmcplugin.setContent(_handle, 'videos')
- community_filter = middle.filter_(community_choosen=True)
- community_choosen, isNext = middle.search(filter_=community_filter)
- titlesListGenerator(community_choosen)
- xbmcplugin.endOfDirectory(_handle)
- def listVideos(category):
- """
- Create the list of playable videos in the Kodi interface.
- """
- xbmcplugin.setPluginCategory(_handle, category)
- xbmcplugin.setContent(_handle, 'videos')
- eps_list = middle.getEpisodes(category, 'full')
- if eps_list:
- for ep in eps_list:
- item = xbmcgui.ListItem(label=ep['episode'])
- item.setProperty('IsPlayable', 'true')
- url = get_url(action='find_relevant', \
- category=ep['episode'].encode('utf-8'), \
- link=ep['episode_link'])
- xbmcplugin.addDirectoryItem(_handle, url, item)
- xbmcplugin.endOfDirectory(_handle)
- else:
- alert('Упс!', 'Что-то пошло не так! Возможно до этого аниме ' \
- 'добрались правообладатели.')
- xbmcplugin.endOfDirectory(_handle)
- def findRelevant(url):
- #locale_type
- video = middle.getRelevantVideo(url, locale_type)
- play_item = xbmcgui.ListItem(path=video)
- xbmcplugin.setResolvedUrl(_handle, True, listitem=play_item)
- def play_video(path):
- """
- Play a video by the provided path.
- """
- play_item = xbmcgui.ListItem(path=path)
- xbmcplugin.setResolvedUrl(_handle, True, listitem=play_item)
- def router(paramstring):
- """
- Router function that calls other functions
- depending on the provided paramstring
- """
- params = dict(parse_qsl(paramstring))
- if params:
- if params['action'] == 'search':
- search(params['category'], query=params.get('query', ''))
- elif params['action'] == 'fullSearch':
- searchWithFilters()
- elif params['action'] == 'selected':
- selected()
- elif params['action'] == 'community':
- communityChoosen()
- elif params['action'] == 'listing':
- listVideos(params['category'])
- elif params['action'] == 'home':
- home(params['category'])
- elif params['action'] == 'find_relevant':
- findRelevant(params['link'])
- elif params['action'] == 'play':
- play_video(params['video'])
- else:
- raise ValueError('Invalid paramstring: {0}!'.format(paramstring))
- else:
- home()
- if __name__ == '__main__':
- router(sys.argv[2][1:])
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement