def action(action, tmdb_id=None, tmdb_type=None, season=None, episode=None, label=None, cache_refresh=False):
    _traktapi = TraktAPI()

    if action == 'history':
        func = _traktapi.sync_history
    elif action == 'collection':
        func = _traktapi.sync_collection
    elif action == 'watchlist':
        func = _traktapi.sync_watchlist
    elif action == 'add_to_userlist':
        return sync_userlist()
    elif action == 'remove_from_userlist':
        return sync_userlist(remove_item=True)
    elif action == 'library_userlist':
        return library_userlist()
    elif action == 'library':
        return library()
    elif action == 'play':
        return play()
    elif action == 'open':
        return browse()
    else:
        return

    with utils.busy_dialog():
        if tmdb_type == 'episode' and (not season or not episode):
            return
        elif tmdb_id and tmdb_type:
            dbtype = utils.type_convert(tmdb_type, 'dbtype')
            label = label or 'this {}'.format(utils.type_convert(tmdb_type, 'trakt'))
        else:
            label = sys.listitem.getLabel()
            dbtype = sys.listitem.getVideoInfoTag().getMediaType()
            tmdb_id = sys.listitem.getProperty('tmdb_id') if not dbtype == 'episode' else sys.listitem.getProperty('tvshow.tmdb_id')
            season = sys.listitem.getVideoInfoTag().getSeason() if dbtype == 'episode' else None
            episode = sys.listitem.getVideoInfoTag().getEpisode() if dbtype == 'episode' else None
        tmdb_type = 'movie' if dbtype == 'movie' else 'tv'
        trakt_ids = func(utils.type_convert(tmdb_type, 'trakt'), 'tmdb', cache_refresh=cache_refresh)
        boolean = 'remove' if int(tmdb_id) in trakt_ids else 'add'

    dialog_header = 'Trakt {0}'.format(action.capitalize())
    dialog_text = xbmcaddon.Addon().getLocalizedString(32065) if boolean == 'add' else xbmcaddon.Addon().getLocalizedString(32064)
    dialog_text = dialog_text.format(utils.try_decode_string(label), action.capitalize(), tmdb_type, tmdb_id)
    dialog_text = dialog_text + ' Season: {}  Episode: {}'.format(season, episode) if dbtype == 'episode' else dialog_text
    if not xbmcgui.Dialog().yesno(dialog_header, dialog_text):
        return

    with utils.busy_dialog():
        trakt_type = 'episode' if dbtype == 'episode' else utils.type_convert(tmdb_type, 'trakt')
        slug_type = 'show' if dbtype == 'episode' else trakt_type
        slug = _traktapi.get_traktslug(slug_type, 'tmdb', tmdb_id)
        item = _traktapi.get_details(slug_type, slug, season=season, episode=episode)
        items = {trakt_type + 's': [item]}
        func(slug_type, mode=boolean, items=items)

    dialog_header = 'Trakt {0}'.format(action.capitalize())
    dialog_text = xbmcaddon.Addon().getLocalizedString(32062) if boolean == 'add' else xbmcaddon.Addon().getLocalizedString(32063)
    dialog_text = dialog_text.format(tmdb_id, action.capitalize())
    xbmcgui.Dialog().ok(dialog_header, dialog_text)
    xbmc.executebuiltin('Container.Refresh')
Beispiel #2
0
 def get_collection(self, tmdbtype, page=1, limit=20):
     items = []
     if not self.tmdb or not self.authorize():
         return items
     collection = self.sync_collection(utils.type_convert(
         tmdbtype, 'trakt'))
     collection = sorted(
         collection,
         key=lambda i: i[utils.type_convert(tmdbtype, 'trakt')]['title'],
         reverse=False)
     start_at = limit * (page - 1)
     end_at = start_at + limit
     for i in collection[start_at:end_at]:
         i = i.get(utils.type_convert(tmdbtype, 'trakt'))
         i_tmdb = i.get('ids', {}).get('tmdb', '')
         item = ListItem(library=self.library,
                         **self.tmdb.get_detailed_item(tmdbtype, i_tmdb))
         if item and item.label != 'N/A':
             items.append(item)
     if items and collection[
             end_at:]:  # If there's more items add the next page item
         items.append(
             ListItem(library=self.library,
                      label=xbmc.getLocalizedString(33078),
                      nextpage=page + 1))
     return items
    def get_limitedlist(self, itemlist, tmdbtype, limit, islistitem):
        items, added_items = [], []
        if not self.tmdb or not self.authorize():
            return items

        n = 0
        itemtype = utils.type_convert(tmdbtype, 'trakt')
        for i in itemlist:
            if limit and n >= limit:
                break
            item = (
                i.get(itemtype, {}).get('ids', {}).get('slug'),
                i.get(itemtype, {}).get('ids', {}).get('tmdb'),
                i.get(itemtype, {}).get('title'))

            if item in added_items:
                continue

            added_items.append(item)
            if islistitem:
                item = ListItem(library=self.library, **self.tmdb.get_detailed_item(tmdbtype, item[1]))
            items.append(item)
            n += 1

        return items
    def get_url(self,
                url,
                url_tmdb_id=None,
                widget=None,
                fanarttv=None,
                nextpage=None,
                extended=None,
                linklibrary=False):
        self.url = self.url or url.copy()
        self.url[
            'tmdb_id'] = self.tmdb_id = url_tmdb_id or self.tmdb_id or self.url.get(
                'tmdb_id')
        if self.url.get(
                'info'
        ) == 'discover':  # Special handling of discover url to pass tmdb_id
            for k, v in self.url.items():
                if isinstance(v, str):
                    self.url[k] = v.format(tmdb_id=self.url.get('tmdb_id'))
        if self.mixed_type:
            self.url['type'] = self.mixed_type
            self.infolabels['mediatype'] = utils.type_convert(
                self.mixed_type, 'dbtype')
        if self.label == xbmc.getLocalizedString(33078):  # Next Page
            self.infolabels.pop('mediatype', None)
        if self.infolabels.get('mediatype') in ['season', 'episode']:
            self.url['season'] = self.infolabels.get('season')
            self.infoproperties['tvshow.tmdb_id'] = self.url.get('tmdb_id')
        if self.infolabels.get('mediatype') == 'episode':
            self.url['episode'] = self.infolabels.get('episode')
        if fanarttv:
            self.url['fanarttv'] = fanarttv
        if nextpage:
            self.url['nextpage'] = nextpage
        if widget:
            self.url['widget'] = widget
        if not extended and (self.url.get('widget', '').capitalize() == 'True'
                             or self.select_action):
            if self.infolabels.get('mediatype') in ['movie', 'episode']:
                self.url['info'] = 'play'
            elif self.infolabels.get('mediatype') == 'tvshow':
                self.url['info'] = 'seasons'
                if self.addon.getSettingBool('flatten_seasons'):
                    self.url['info'] = 'flatseasons'
                    self.url['type'] = 'episode'

        # Link library for Next Aired
        if linklibrary and self.infolabels.get(
                'mediatype') == 'episode' and self.tvshow_dbid:
            self.url = {
                'url': 'videodb://tvshows/titles/{}/'.format(self.tvshow_dbid)
            }

        # Set video paths to url
        self.is_folder = True
        if self.infolabels.get('mediatype') == 'video' and self.infolabels.get(
                'path') and self.url.get('info') == 'details':
            self.url = {'url': self.infolabels.get('path')}
            self.is_folder = False
        if self.url.get('info') in ['play', 'textviewer', 'imageviewer']:
            self.is_folder = False
Beispiel #5
0
    def build_details(self):
        self.item['id'] = self.tmdb_id
        self.item['tmdb'] = self.tmdb_id
        self.item['imdb'] = self.details.get('infolabels',
                                             {}).get('imdbnumber')
        self.item['name'] = u'{0} ({1})'.format(self.item.get('title'),
                                                self.item.get('year'))
        self.item['firstaired'] = self.details.get('infolabels',
                                                   {}).get('premiered')
        self.item['premiered'] = self.details.get('infolabels',
                                                  {}).get('premiered')
        self.item['released'] = self.details.get('infolabels',
                                                 {}).get('premiered')
        self.item['showname'] = self.item.get('title')
        self.item['clearname'] = self.item.get('title')
        self.item['tvshowtitle'] = self.item.get('title')
        self.item['title'] = self.item.get('title')
        self.item['thumbnail'] = self.details.get('thumb')
        self.item['poster'] = self.details.get('poster')
        self.item['fanart'] = self.details.get('fanart')
        self.item['now'] = datetime.datetime.now().strftime('%Y%m%d%H%M%S%f')

        if self.traktapi:
            slug_type = utils.type_convert(self.tmdbtype, 'trakt')
            trakt_details = self.traktapi.get_details(
                slug_type,
                self.traktapi.get_traktslug(slug_type, 'tmdb', self.tmdb_id))
            self.item['trakt'] = trakt_details.get('ids', {}).get('trakt')
            self.item['imdb'] = trakt_details.get('ids', {}).get('imdb')
            self.item['tvdb'] = trakt_details.get('ids', {}).get('tvdb')
            self.item['slug'] = trakt_details.get('ids', {}).get('slug')

        if self.itemtype == 'episode':  # Do some special episode stuff
            self.item['id'] = self.item.get('tvdb')
            self.item['title'] = self.details.get('infolabels', {}).get(
                'title')  # Set Episode Title
            self.item['name'] = u'{0} S{1:02d}E{2:02d}'.format(
                self.item.get('showname'), int(self.season), int(self.episode))
            self.item['season'] = self.season
            self.item['episode'] = self.episode

        if self.traktapi and self.itemtype == 'episode':
            trakt_details = self.traktapi.get_details(slug_type,
                                                      self.item.get('slug'),
                                                      season=self.season,
                                                      episode=self.episode)
            self.item['epid'] = trakt_details.get('ids', {}).get('tvdb')
            self.item['epimdb'] = trakt_details.get('ids', {}).get('imdb')
            self.item['eptmdb'] = trakt_details.get('ids', {}).get('tmdb')
            self.item['eptrakt'] = trakt_details.get('ids', {}).get('trakt')

        for k, v in self.item.copy().items():
            v = u'{0}'.format(v)
            self.item[k] = v.replace(',', '')
            self.item[k + '_+'] = v.replace(' ', '+')
            self.item[k + '_-'] = v.replace(' ', '-')
            self.item[k + '_escaped'] = v.replace(' ', '%2520')
            self.item[k + '_escaped+'] = v.replace(' ', '%252B')
Beispiel #6
0
def action(action):
    _traktapi = TraktAPI()

    if action == 'history':
        func = _traktapi.sync_history
    elif action == 'collection':
        func = _traktapi.sync_collection
    elif action == 'watchlist':
        func = _traktapi.sync_watchlist
    elif action == 'library':
        return library()
    else:
        return

    with utils.busy_dialog():
        label = sys.listitem.getLabel()
        dbtype = sys.listitem.getVideoInfoTag().getMediaType()
        tmdb_id = sys.listitem.getProperty('tmdb_id')
        tmdb_type = 'movie' if dbtype == 'movie' else 'tv'
        trakt_ids = func(utils.type_convert(tmdb_type, 'trakt'), 'tmdb')
        boolean = 'remove' if int(tmdb_id) in trakt_ids else 'add'

    dialog_header = 'Trakt {0}'.format(action.capitalize())
    dialog_text = xbmcaddon.Addon().getLocalizedString(32065) if boolean == 'add' else xbmcaddon.Addon().getLocalizedString(32064)
    dialog_text = dialog_text.format(label, action.capitalize(), dbtype.capitalize(), tmdb_id)
    if not xbmcgui.Dialog().yesno(dialog_header, dialog_text):
        return

    with utils.busy_dialog():
        trakt_type = utils.type_convert(tmdb_type, 'trakt')
        slug_type = 'show' if dbtype == 'episode' else trakt_type
        slug = _traktapi.get_traktslug(slug_type, 'tmdb', tmdb_id)
        season = sys.listitem.getVideoInfoTag().getSeason() if dbtype == 'episode' else None
        episode = sys.listitem.getVideoInfoTag().getEpisode() if dbtype == 'episode' else None
        item = _traktapi.get_details(slug_type, slug, season=season, episode=episode)
        items = {trakt_type + 's': [item]}
        func(slug_type, mode=boolean, items=items)

    dialog_header = 'Trakt {0}'.format(action.capitalize())
    dialog_text = xbmcaddon.Addon().getLocalizedString(32062) if boolean == 'add' else xbmcaddon.Addon().getLocalizedString(32063)
    dialog_text = dialog_text.format(tmdb_id, action.capitalize())
    xbmcgui.Dialog().ok(dialog_header, dialog_text)
    xbmc.executebuiltin('Container.Refresh')
 def get_ratings(self, tmdbtype=None, imdb_id=None, trakt_id=None, trakt_slug=None, season=None, episode=None):
     slug = trakt_slug or trakt_id or imdb_id
     infoproperties = {}
     if not slug or not tmdbtype:
         return infoproperties
     url = 'episodes/{0}/ratings'.format(episode) if episode else 'ratings'
     url = 'seasons/{0}/{1}'.format(season, url) if season else 'ratings'
     response = self.get_request_lc(utils.type_convert(tmdbtype, 'trakt') + 's', slug, url)
     infoproperties['trakt_rating'] = '{:0.1f}'.format(response.get('rating')) if response.get('rating') else ''
     infoproperties['trakt_votes'] = '{:0,.0f}'.format(response.get('votes')) if response.get('votes') else ''
     return infoproperties
 def set_defaultplayer(self):
     player = Player()
     tmdbtype = self.params.get('set_defaultplayer')
     setting = 'default_player_episodes' if tmdbtype == 'tv' else 'default_player_{0}s'.format(tmdbtype)
     player.setup_players(tmdbtype=tmdbtype, clearsetting=True, assertplayers=False)
     idx = xbmcgui.Dialog().select(
         'Choose Default Player for {0}'.format(utils.type_convert(tmdbtype, 'plural')), player.itemlist)
     if idx == 0:
         self.addon.setSettingString(setting, '')
     if idx > 0:
         selected = player.itemlist[idx].getLabel()
         self.addon.setSettingString(setting, selected)
Beispiel #9
0
    def build_details(self):
        self.item['id'] = self.tmdb_id
        self.item['tmdb'] = self.tmdb_id
        self.item['imdb'] = self.details.get('infolabels', {}).get('imdbnumber')
        self.item['name'] = u'{0} ({1})'.format(self.item.get('title'), self.item.get('year'))
        self.item['premiered'] = self.item['firstaired'] = self.item['released'] = self.details.get('infolabels', {}).get('premiered')
        self.item['plot'] = self.details.get('infolabels', {}).get('plot')
        self.item['cast'] = self.item['actors'] = " / ".join([i.get('name') for i in self.details.get('cast', []) if i.get('name')])
        self.item['showname'] = self.item['clearname'] = self.item['tvshowtitle'] = self.item['title'] = self.item.get('title')
        self.item['thumbnail'] = self.details.get('thumb')
        self.item['poster'] = self.details.get('poster')
        self.item['fanart'] = self.details.get('fanart')
        self.item['now'] = datetime.datetime.now().strftime('%Y%m%d%H%M%S%f')

        if self.traktapi:
            slug_type = utils.type_convert(self.tmdbtype, 'trakt')
            trakt_details = self.traktapi.get_details(slug_type, self.traktapi.get_traktslug(slug_type, 'tmdb', self.tmdb_id))
            self.item['trakt'] = trakt_details.get('ids', {}).get('trakt')
            self.item['imdb'] = self.details.get('infoproperties', {}).get('tvshow.imdb_id') or trakt_details.get('ids', {}).get('imdb')
            self.item['tvdb'] = self.details.get('infoproperties', {}).get('tvshow.tvdb_id') or trakt_details.get('ids', {}).get('tvdb')
            self.item['slug'] = trakt_details.get('ids', {}).get('slug')

        if self.itemtype == 'episode':  # Do some special episode stuff
            self.item['id'] = self.item.get('tvdb')
            self.item['title'] = self.details.get('infolabels', {}).get('title')  # Set Episode Title
            self.item['name'] = u'{0} S{1:02d}E{2:02d}'.format(self.item.get('showname'), int(utils.try_parse_int(self.season)), int(utils.try_parse_int(self.episode)))
            self.item['season'] = self.season
            self.item['episode'] = self.episode
            self.item['showpremiered'] = self.details.get('infoproperties', {}).get('tvshow.premiered')
            self.item['showyear'] = self.details.get('infoproperties', {}).get('tvshow.year')

        if self.traktapi and self.itemtype == 'episode':
            trakt_details = self.traktapi.get_details(slug_type, self.item.get('slug'), season=self.season, episode=self.episode)
            self.item['epid'] = self.details.get('infoproperties', {}).get('tvdb_id') or trakt_details.get('ids', {}).get('tvdb')
            self.item['epimdb'] = trakt_details.get('ids', {}).get('imdb')
            self.item['eptmdb'] = self.details.get('infoproperties', {}).get('tmdb_id') or trakt_details.get('ids', {}).get('tmdb')
            self.item['eptrakt'] = trakt_details.get('ids', {}).get('trakt')

        utils.kodi_log(u'Player Details - Item:\n{}'.format(self.item), 2)

        for k, v in self.item.copy().items():
            if k not in constants.PLAYER_URLENCODE:
                continue
            v = u'{0}'.format(v)
            for key, value in {k: v, '{}_meta'.format(k): dumps(v)}.items():
                self.item[key] = value.replace(',', '')
                self.item[key + '_+'] = value.replace(',', '').replace(' ', '+')
                self.item[key + '_-'] = value.replace(',', '').replace(' ', '-')
                self.item[key + '_escaped'] = quote(quote(utils.try_encode_string(value)))
                self.item[key + '_escaped+'] = quote(quote_plus(utils.try_encode_string(value)))
                self.item[key + '_url'] = quote(utils.try_encode_string(value))
                self.item[key + '_url+'] = quote_plus(utils.try_encode_string(value))
Beispiel #10
0
 def get_mostwatched(self,
                     userslug,
                     tmdbtype,
                     limit=None,
                     islistitem=True,
                     onlyshows=False):
     extended = 'noseasons' if onlyshows else None
     history = self.get_response_json(
         'users',
         userslug,
         'watched',
         utils.type_convert(tmdbtype, 'trakt') + 's',
         extended=extended)
     history = sorted(history, key=lambda i: i['plays'], reverse=True)
     return self.get_limitedlist(history, tmdbtype, limit, islistitem)
Beispiel #11
0
 def get_recentlywatched(self,
                         userslug,
                         tmdbtype,
                         limit=None,
                         islistitem=True,
                         months=6):
     start_at = datetime.date.today() - datetime.timedelta(
         months * 365 / 12)
     history = self.get_response_json(
         'users',
         userslug,
         'history',
         utils.type_convert(tmdbtype, 'trakt') + 's',
         page=1,
         limit=200,
         start_at=start_at.strftime("%Y-%m-%d"))
     return self.get_limitedlist(history, tmdbtype, limit, islistitem)
Beispiel #12
0
 def get_url(self,
             url,
             url_tmdb_id=None,
             widget=None,
             fanarttv=None,
             nextpage=None,
             extended=None):
     self.url = self.url or url.copy()
     self.url[
         'tmdb_id'] = self.tmdb_id = url_tmdb_id or self.tmdb_id or self.url.get(
             'tmdb_id')
     if self.mixed_type:
         self.url['type'] = self.mixed_type
         self.infolabels['mediatype'] = utils.type_convert(
             self.mixed_type, 'dbtype')
     if self.label == xbmc.getLocalizedString(33078):  # Next Page
         self.infolabels.pop('mediatype', None)
     if self.infolabels.get('mediatype') in ['season', 'episode']:
         self.url['season'] = self.infolabels.get('season')
         self.infoproperties['tvshow.tmdb_id'] = self.url.get('tmdb_id')
     if self.infolabels.get('mediatype') == 'episode':
         self.url['episode'] = self.infolabels.get('episode')
     if fanarttv:
         self.url['fanarttv'] = fanarttv
     if nextpage:
         self.url['nextpage'] = nextpage
     if widget:
         self.url['widget'] = widget
     if not extended and (self.url.get('widget', '').capitalize() == 'True'
                          or self.select_action):
         if self.infolabels.get('mediatype') in ['movie', 'episode']:
             self.url['info'] = 'play'
         elif self.infolabels.get('mediatype') == 'tvshow':
             self.url['info'] = 'seasons'
             if self.addon.getSettingBool('flatten_seasons'):
                 self.url['info'] = 'flatseasons'
                 self.url['type'] = 'episode'
     # Set video paths to url
     if self.infolabels.get('mediatype') == 'video' and self.infolabels.get(
             'path'):
         self.url = {'url': self.infolabels.get('path')}
     self.is_folder = False if self.url.get('info') in [
         'play', 'textviewer', 'imageviewer'
     ] or self.url.get('url') else True
    def build_details(self):
        self.item['id'] = self.tmdb_id
        self.item['tmdb'] = self.tmdb_id
        self.item['imdb'] = self.details.get('infolabels',
                                             {}).get('imdbnumber')
        self.item['name'] = u'{0} ({1})'.format(self.item.get('title'),
                                                self.item.get('year'))
        self.item['firstaired'] = self.details.get('infolabels',
                                                   {}).get('premiered')
        self.item['premiered'] = self.details.get('infolabels',
                                                  {}).get('premiered')
        self.item['released'] = self.details.get('infolabels',
                                                 {}).get('premiered')
        self.item['showname'] = self.item.get('title')
        self.item['clearname'] = self.item.get('title')
        self.item['tvshowtitle'] = self.item.get('title')
        self.item['title'] = self.item.get('title')
        self.item['thumbnail'] = self.details.get('thumb')
        self.item['poster'] = self.details.get('poster')
        self.item['fanart'] = self.details.get('fanart')
        self.item['now'] = datetime.datetime.now().strftime('%Y%m%d%H%M%S%f')

        if self.traktapi:
            slug_type = utils.type_convert(self.tmdbtype, 'trakt')
            trakt_details = self.traktapi.get_details(
                slug_type,
                self.traktapi.get_traktslug(slug_type, 'tmdb', self.tmdb_id))
            self.item['trakt'] = trakt_details.get('ids', {}).get('trakt')
            self.item['imdb'] = self.details.get(
                'infoproperties',
                {}).get('tvshow.imdb_id') or trakt_details.get('ids',
                                                               {}).get('imdb')
            self.item['tvdb'] = self.details.get(
                'infoproperties',
                {}).get('tvshow.tvdb_id') or trakt_details.get('ids',
                                                               {}).get('tvdb')
            self.item['slug'] = trakt_details.get('ids', {}).get('slug')

        if self.itemtype == 'episode':  # Do some special episode stuff
            self.item['id'] = self.item.get('tvdb')
            self.item['title'] = self.details.get('infolabels', {}).get(
                'title')  # Set Episode Title
            self.item['name'] = u'{0} S{1:02d}E{2:02d}'.format(
                self.item.get('showname'),
                int(utils.try_parse_int(self.season)),
                int(utils.try_parse_int(self.episode)))
            self.item['season'] = self.season
            self.item['episode'] = self.episode

        if self.traktapi and self.itemtype == 'episode':
            trakt_details = self.traktapi.get_details(slug_type,
                                                      self.item.get('slug'),
                                                      season=self.season,
                                                      episode=self.episode)
            self.item['epid'] = self.details.get(
                'infoproperties', {}).get('tvdb_id') or trakt_details.get(
                    'ids', {}).get('tvdb')
            self.item['epimdb'] = trakt_details.get('ids', {}).get('imdb')
            self.item['eptmdb'] = self.details.get(
                'infoproperties', {}).get('tmdb_id') or trakt_details.get(
                    'ids', {}).get('tmdb')
            self.item['eptrakt'] = trakt_details.get('ids', {}).get('trakt')

        utils.kodi_log(u'Player Details - Item:\n{}'.format(self.item), 2)

        for k, v in self.item.copy().items():
            if k not in [
                    'name', 'showname', 'clearname', 'tvshowtitle', 'title',
                    'thumbnail', 'poster', 'fanart', 'originaltitle'
            ]:
                continue
            v = u'{0}'.format(v)
            self.item[k] = v.replace(',', '')
            self.item[k + '_+'] = v.replace(' ', '+')
            self.item[k + '_-'] = v.replace(' ', '-')
            self.item[k + '_escaped'] = quote(quote(
                utils.try_encode_string(v)))
            self.item[k + '_escaped+'] = quote(
                quote_plus(utils.try_encode_string(v)))
            self.item[k + '_url'] = quote(utils.try_encode_string(v))
            self.item[k + '_url+'] = quote_plus(utils.try_encode_string(v))
def action(action, tmdb_id=None, tmdb_type=None, season=None, episode=None, label=None):
    _traktapi = TraktAPI()

    if action == 'history':
        func = _traktapi.sync_history
    elif action == 'collection':
        func = _traktapi.sync_collection
    elif action == 'watchlist':
        func = _traktapi.sync_watchlist
    elif action == 'add_to_userlist':
        return sync_userlist()
    elif action == 'remove_from_userlist':
        return sync_userlist(remove_item=True)
    elif action == 'library_userlist':
        return library_userlist()
    elif action == 'library':
        return library()
    elif action == 'refresh_item':
        return refresh_item()
    elif action == 'play':
        return play()
    elif action == 'open':
        return browse()
    else:
        return

    with utils.busy_dialog():
        if tmdb_id and tmdb_type:  # Passed details via script
            dbtype = utils.type_convert(tmdb_type, 'dbtype')
            label = label or 'this {}'.format(utils.type_convert(tmdb_type, 'trakt'))
            parent_tmdb_id = tmdb_id
        else:  # Context menu so retrieve details from listitem
            label = sys.listitem.getLabel()
            dbtype = sys.listitem.getVideoInfoTag().getMediaType()
            tmdb_id = sys.listitem.getProperty('tmdb_id')
            parent_tmdb_id = sys.listitem.getProperty('tvshow.tmdb_id') if dbtype == 'episode' else tmdb_id
            season = sys.listitem.getVideoInfoTag().getSeason() if dbtype == 'episode' else None
            episode = sys.listitem.getVideoInfoTag().getEpisode() if dbtype == 'episode' else None

        if tmdb_type == 'episode':  # Passed episode details via script
            if not season or not episode:  # Need season and episode for episodes
                return  # Need season and episode if run from script so leave
            # Retrieve episode details so that we can get tmdb_id for episode
            episode_details = _plugin.tmdb.get_detailed_item(tmdb_type, parent_tmdb_id, season=season, episode=episode)
            tmdb_id = episode_details.get('infoproperties', {}).get('imdb_id')

        if dbtype == 'movie':
            tmdb_type = 'movie'
        elif dbtype == 'tvshow':
            tmdb_type = 'tv'
        elif dbtype == 'episode':
            tmdb_type = 'episode'
        else:
            return

        # Check if we're adding or removing the item and confirm with the user that they want to do that
        trakt_ids = func(utils.type_convert(tmdb_type, 'trakt'), 'tmdb', cache_refresh=True)
        boolean = 'remove' if int(tmdb_id) in trakt_ids else 'add'
        dialog_header = 'Trakt {0}'.format(action.capitalize())
        dialog_text = xbmcaddon.Addon().getLocalizedString(32065) if boolean == 'add' else xbmcaddon.Addon().getLocalizedString(32064)
        dialog_text = dialog_text.format(utils.try_decode_string(label), action.capitalize(), tmdb_type, tmdb_id)
        dialog_text = dialog_text + ' Season: {}  Episode: {}'.format(season, episode) if dbtype == 'episode' else dialog_text
        if not xbmcgui.Dialog().yesno(dialog_header, dialog_text):
            return

        with utils.busy_dialog():
            slug_type = 'show' if tmdb_type == 'episode' else utils.type_convert(tmdb_type, 'trakt')
            trakt_type = utils.type_convert(tmdb_type, 'trakt')
            slug = _traktapi.get_traktslug(slug_type, 'tmdb', parent_tmdb_id)
            item = _traktapi.get_details(slug_type, slug, season=season, episode=episode)
            items = {trakt_type + 's': [item]}
            func(slug_type, mode=boolean, items=items)

        dialog_header = 'Trakt {0}'.format(action.capitalize())
        dialog_text = xbmcaddon.Addon().getLocalizedString(32062) if boolean == 'add' else xbmcaddon.Addon().getLocalizedString(32063)
        dialog_text = dialog_text.format(tmdb_id, action.capitalize())
        xbmcgui.Dialog().ok(dialog_header, dialog_text)
        xbmc.executebuiltin('Container.Refresh')