123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339 |
- # -*- coding: utf-8 -*-
- """
- kodiswift.listitem
- ------------------
-
- This module contains the ListItem class, which acts as a wrapper
- for xbmcgui.ListItem.
-
- :copyright: (c) 2012 by Jonathan Beluch
- :license: GPLv3, see LICENSE for more details.
- """
- from __future__ import absolute_import
-
- import warnings
-
- from kodiswift import xbmcgui
-
- __all__ = ['ListItem']
-
-
- class ListItem(object):
- """A wrapper for the xbmcgui.ListItem class. The class keeps track
- of any set properties that xbmcgui doesn't expose getters for.
- """
-
- def __init__(self, label=None, label2=None, icon=None, thumbnail=None,
- path=None):
- """Defaults are an emtpy string since xbmcgui.ListItem will not
- accept None.
- """
- self._listitem = xbmcgui.ListItem(label=label, label2=label2, path=path)
-
- # The docs have the thumbnail property set as thumb
- # http://mirrors.kodi.tv/docs/python-docs/16.x-jarvis/xbmcgui.html#ListItem-setArt
- self._art = {'icon': icon, 'thumb': thumbnail}
- self._icon = icon
- self._path = path
- self._thumbnail = thumbnail
- self._context_menu_items = []
- self._played = False
- self._playable = False
- self.is_folder = True
-
- def get_context_menu_items(self):
- """Returns the list of currently set context_menu items."""
- return self._context_menu_items
-
- def add_context_menu_items(self, items, replace_items=False):
- """Adds context menu items. If replace_items is True all
- previous context menu items will be removed.
- """
- for label, action in items:
- assert isinstance(label, basestring)
- assert isinstance(action, basestring)
- if replace_items:
- self._context_menu_items = []
- self._context_menu_items.extend(items)
- self._listitem.addContextMenuItems(items, replace_items)
-
- @property
- def label(self):
- """
- Returns:
- str:
- """
- return self._listitem.getLabel()
-
- @label.setter
- def label(self, value):
- """
- Args:
- value (str):
- """
- self._listitem.setLabel(value)
-
- def get_label(self):
- warnings.warn('get_label is deprecated, use label property',
- DeprecationWarning)
- return self.label
-
- def set_label(self, value):
- warnings.warn('set_label is deprecated, use label property',
- DeprecationWarning)
- return self._listitem.setLabel(value)
-
- @property
- def label2(self):
- return self._listitem.getLabel2()
-
- @label2.setter
- def label2(self, value):
- self._listitem.setLabel2(value)
-
- def get_label2(self):
- warnings.warn('get_label2 is deprecated, use label2 property',
- DeprecationWarning)
- return self.label2
-
- def set_label2(self, value):
- warnings.warn('set_label2 is deprecated, use label2 property',
- DeprecationWarning)
- return self._listitem.setLabel2(value)
-
- @property
- def selected(self):
- return self._listitem.isSelected()
-
- @selected.setter
- def selected(self, value):
- self._listitem.select(value)
-
- def is_selected(self):
- warnings.warn('is_selected is deprecated, use selected property',
- DeprecationWarning)
- return self._listitem.isSelected()
-
- def select(self, selected_status=True):
- warnings.warn('select is deprecated, use selected property',
- DeprecationWarning)
- return self._listitem.select(selected_status)
-
- @property
- def icon(self):
- return self._art.get('icon')
-
- @icon.setter
- def icon(self, value):
- self._art['icon'] = value
- self._listitem.setArt(self._art)
-
- def get_icon(self):
- warnings.warn('get_icon is deprecated, use icon property',
- DeprecationWarning)
- return self.icon
-
- def set_icon(self, icon):
- warnings.warn('set_icon is deprecated, use icon property',
- DeprecationWarning)
- self.icon = icon
- return self.icon
-
- @property
- def thumbnail(self):
- return self._art.get('thumb')
-
- @thumbnail.setter
- def thumbnail(self, value):
- self._art['thumb'] = value
- self._listitem.setArt(self._art)
-
- def get_thumbnail(self):
- warnings.warn('get_thumbnail is deprecated, use thumbnail property',
- DeprecationWarning)
- return self.thumbnail
-
- def set_thumbnail(self, thumbnail):
- warnings.warn('set_thumbnail is deprecated, use thumbnail property',
- DeprecationWarning)
- self.thumbnail = thumbnail
- return self.thumbnail
-
- @property
- def poster(self):
- return self._art.get('poster')
-
- @poster.setter
- def poster(self, value):
- self._art['poster'] = value
- self._listitem.setArt(self._art)
-
- @property
- def path(self):
- return self._path
-
- @path.setter
- def path(self, value):
- self._path = value
- self._listitem.setPath(value)
-
- def get_path(self):
- warnings.warn('get_path is deprecated, use path property',
- DeprecationWarning)
- return self._path
-
- def set_path(self, path):
- warnings.warn('set_path is deprecated, use path property',
- DeprecationWarning)
- self._path = path
- return self._listitem.setPath(path)
-
- @property
- def playable(self):
- return self._playable
-
- @playable.setter
- def playable(self, value):
- self._playable = value
- is_playable = 'true' if self._playable else 'false'
- self.set_property('isPlayable', is_playable)
-
- def get_is_playable(self):
- warnings.warn('get_is_playable is deprecated, use playable property',
- DeprecationWarning)
- return self._playable
-
- def set_is_playable(self, is_playable):
- warnings.warn('set_is_playable is deprecated, use playable property',
- DeprecationWarning)
- self._playable = is_playable
- value = 'false'
- if is_playable:
- value = 'true'
- self.set_property('isPlayable', value)
-
- @property
- def played(self):
- return self._played
-
- @played.setter
- def played(self, value):
- self._played = value
-
- def set_played(self, was_played):
- """Sets the played status of the listitem.
-
- Used to differentiate between a resolved video versus a playable item.
- Has no effect on Kodi, it is strictly used for kodiswift.
- """
- warnings.warn('set_played is deprecated, use played property',
- DeprecationWarning)
- self._played = was_played
-
- def get_played(self):
- warnings.warn('get_played is deprecated, use played property',
- DeprecationWarning)
- return self._played
-
- @property
- def art(self):
- return self._art
-
- @art.setter
- def art(self, value):
- self._art = value
- self._listitem.setArt(value)
-
- def set_art(self, value):
- self._art = value
- self._listitem.setArt(value)
-
- def set_info(self, info_type, info_labels):
- """Sets the listitem's info"""
- return self._listitem.setInfo(info_type, info_labels)
-
- def get_property(self, key):
- """Returns the property associated with the given key"""
- return self._listitem.getProperty(key)
-
- def set_property(self, key, value):
- """Sets a property for the given key and value"""
- return self._listitem.setProperty(key, value)
-
- def add_stream_info(self, stream_type, stream_values):
- """Adds stream details"""
- return self._listitem.addStreamInfo(stream_type, stream_values)
-
- def as_tuple(self):
- """Returns a tuple of list item properties:
- (path, the wrapped xbmcgui.ListItem, is_folder)
- """
- return self.path, self._listitem, self.is_folder
-
- def as_xbmc_listitem(self):
- """Returns the wrapped xbmcgui.ListItem"""
- return self._listitem
-
- @classmethod
- def from_dict(cls, label=None, label2=None, icon=None, thumbnail=None,
- path=None, selected=None, info=None, properties=None,
- context_menu=None, replace_context_menu=False,
- is_playable=None, info_type='video', stream_info=None,
- **kwargs):
- """A ListItem constructor for setting a lot of properties not
- available in the regular __init__ method. Useful to collect all
- the properties in a dict and then use the **dct to call this
- method.
- """
- # TODO(Sinap): Should this just use **kwargs? or should art be a dict?
- listitem = cls(label, label2, path=path)
- listitem.art = {
- 'icon': icon,
- 'thumb': thumbnail,
- 'poster': kwargs.get('poster'),
- 'banner': kwargs.get('banner'),
- 'fanart': kwargs.get('fanart'),
- 'landscape': kwargs.get('landscape'),
- }
-
- if selected is not None:
- listitem.selected = selected
-
- if info:
- listitem.set_info(info_type, info)
-
- if is_playable:
- listitem.playable = True
- listitem.is_folder = False # III
-
- if properties:
- # Need to support existing tuples, but prefer to have a dict for
- # properties.
- if hasattr(properties, 'items'):
- properties = properties.items()
- for key, val in properties:
- listitem.set_property(key, val)
-
- if stream_info:
- for stream_type, stream_values in stream_info.items():
- listitem.add_stream_info(stream_type, stream_values)
-
- if context_menu:
- listitem.add_context_menu_items(context_menu, replace_context_menu)
-
- return listitem
-
- def __eq__(self, other):
- if not isinstance(other, ListItem):
- raise NotImplementedError
- self_props = (self.label, self.label2, self.art, self.path,
- self.playable, self.selected, self.played,)
- other_props = (other.label, other.label2, other.art, other.path,
- other.playable, other.selected, other.played,)
- return self_props == other_props
-
- def __str__(self):
- return ('%s (%s)' % (self.label, self.path)).encode('utf-8')
-
- def __repr__(self):
- return ("<ListItem '%s'>" % self.label).encode('utf-8')
|