def manager(name, imdb, tvdb, content):
    try:
        icon = sctop.infoLabel('ListItem.Icon')
        post = {"movies": [{"ids": {"imdb": imdb}}]} if content == 'movie' else {"shows": [{"ids": {"tvdb": tvdb}}]}

        items = [(sctop.getString(30934).encode('utf-8'), '/sync/collection')]
        items += [(sctop.getString(30935).encode('utf-8'), '/sync/collection/remove')]
        items += [(sctop.getString(30936).encode('utf-8'), '/sync/watchlist')]
        items += [(sctop.getString(30937).encode('utf-8'), '/sync/watchlist/remove')]
        items += [(sctop.getString(30938).encode('utf-8'), '/users/me/lists/%s/items')]

        result = getTrakt('/users/me/lists')
        result = json.loads(result)
        lists = [(i['name'], i['ids']['slug']) for i in result]
        lists = [lists[i // 2] for i in range(len(lists) * 2)]
        util.debug("[SC] string %s" % sctop.getString(30939))
        for i in range(0, len(lists), 2):
            lists[i] = (
                (sctop.getString(30939) % lists[i][0]).encode('utf-8'), 
                '/users/me/lists/%s/items' % lists[i][1])
        for i in range(1, len(lists), 2):
            lists[i] = (
                (sctop.getString(30940) % lists[i][0]).encode('utf-8'), 
                '/users/me/lists/%s/items/remove' % lists[i][1])
        items += lists

        select = sctop.selectDialog([i[0] for i in items], sctop.getString(30941).encode('utf-8'))

        if select == -1:
            return
        elif select == 4:
            t = sctop.getString(30938).encode('utf-8')
            k = sctop.keyboard('', t); k.doModal()
            new = k.getText() if k.isConfirmed() else None
            if (new == None or new == ''): return
            result = getTrakt('/users/me/lists', post={"name": new, "privacy": "private"})

            try: slug = json.loads(result)['ids']['slug']
            except: return sctop.infoDialog(sctop.getString(30941).encode('utf-8'), heading=str(name), sound=True, icon='ERROR')
            result = getTrakt(items[select][1] % slug, post=post)
        else:
            result = getTrakt(items[select][1], post=post)

        icon = icon if not result == None else 'ERROR'

        sctop.infoDialog(sctop.getString(30941).encode('utf-8'), heading=str(name), sound=True, icon=icon)
    except Exception, e:
        util.debug("[SC] trakt error: %s" % str(traceback.format_exc()))
        return
def listAppendToCustom(user, list_id):
    lists = json.loads(getTrakt('/users/me/lists'))
    lists = [(i['ids']['slug'], i['name']) for i in lists]
    select = sctop.selectDialog([i[1] for i in lists],
                                sctop.getString(30968).encode("utf-8"))
    if select == -1: return

    dst_list = lists[select][0]
    dst_items = _getListItemsForImport(user, list_id)
    result, code, info = getTrakt('/users/me/lists/%s/items' % dst_list,
                                  post=dst_items,
                                  output="info")
    if code == 201:
        sctop.infoDialog("%s" % lists[select][1],
                         sctop.getString(30969).encode("utf-8"))
    else:
        util.debug('[SC] import to %s failed. %d, %s' %
                   (dst_list, code, result))
def listAppendToCustom(user, list_id):
    lists = json.loads(getTrakt('/users/me/lists'))
    lists = [(i['ids']['slug'], i['name'], i['ids']['trakt']) for i in lists]
    select = sctop.selectDialog([i[1] for i in lists],
                                sctop.getString(30968).encode("utf-8"))
    if select == -1: return

    dst_list = lists[select]
    dst_items = _getListItemsForImport(user, list_id)
    result, code, info = getTrakt('/users/me/lists/%s/items' % dst_list[0],
                                  post=dst_items,
                                  output="info")
    if code == 201:
        sctop.infoDialog("%s" % dst_list[1],
                         sctop.getString(30969).encode("utf-8"))
        for c in ['shows', 'movies']:
            sctop.cache.set('trakt.lists.%s.%s' % (dst_list[2], c),
                            None,
                            expiration=timedelta())
    else:
        util.debug('[SC] import to %s failed. %d, %s' %
                   (dst_list[0], code, result))
def listAppendToCustom(user, list_id):
    lists = json.loads(getTrakt('/users/me/lists'))
    lists = [(i['ids']['slug'], i['name'], i['ids']['trakt']) for i in lists]
    select = sctop.selectDialog([i[1] for i in lists],
                                sctop.getString(30968).encode("utf-8"))
    if select == -1: return

    dst_list = lists[select]
    dst_items = _getListItemsForImport(user, list_id)
    result, code, info = getTrakt(
        '/users/me/lists/%s/items' % dst_list[0],
        post=dst_items,
        output="info")
    if code == 201:
        sctop.infoDialog("%s" % dst_list[1],
                         sctop.getString(30969).encode("utf-8"))
        for c in ['shows', 'movies']:
            sctop.cache.set(
                'trakt.lists.%s.%s' % (dst_list[2], c),
                None,
                expiration=timedelta())
    else:
        util.debug(
            '[SC] import to %s failed. %d, %s' % (dst_list[0], code, result))
def manager(name, trakt, content):
    try:
        icon = sctop.infoLabel('ListItem.Icon')
        message = sctop.getString(30941).encode('utf-8')
        content = "movies" if content == 'movie' else "shows"
        post = {content: [{"ids": {"trakt": trakt}}]}

        items = []
        if sctop.getSettingAsBool('trakt.collections'):
            items = [(sctop.getString(30934).encode('utf-8'),
                      '/sync/collection')]
            items += [(sctop.getString(30935).encode('utf-8'),
                       '/sync/collection/remove')]
        if sctop.getSettingAsBool('trakt.watchlist'):
            items += [(sctop.getString(30936).encode('utf-8'),
                       '/sync/watchlist')]
            items += [(sctop.getString(30937).encode('utf-8'),
                       '/sync/watchlist/remove')]
        items += [(sctop.getString(30989), 'rating')]
        items += [(sctop.getString(30938).encode('utf-8'),
                   '/users/me/lists/%s/items')]

        result = getTrakt('/users/me/lists')
        result = json.loads(result)
        lists = [(i['name'], i['ids']['slug']) for i in result]
        lists = [lists[i // 2] for i in range(len(lists) * 2)]
        util.debug("[SC] string %s" % sctop.getString(30939))
        for i in range(0, len(lists), 2):
            lists[i] = ((sctop.getString(30939) % lists[i][0]).encode('utf-8'),
                        '/users/me/lists/%s/items' % lists[i][1])
        for i in range(1, len(lists), 2):
            lists[i] = ((sctop.getString(30940) % lists[i][0]).encode('utf-8'),
                        '/users/me/lists/%s/items/remove' % lists[i][1])
        items += lists

        select = sctop.selectDialog([i[0] for i in items],
                                    sctop.getString(30941).encode('utf-8'))

        if select == -1:
            return
        elif items[select][1] == 'rating':
            ratings = [(sctop.getString(i + 30990).encode('utf-8'), i)
                       for i in range(10, -1, -1)]
            select = sctop.selectDialog([i[0] for i in ratings], str(name))
            url = "/sync/ratings/remove"
            if select == -1:
                return
            elif ratings[select][1] != 0:
                url = "/sync/ratings"
                post[content][0]['rating'] = ratings[select][1]
            try:
                result = getTrakt(url, post=post)
                result = json.loads(result)
            except:
                return sctop.infoDialog(sctop.getString(30941).encode('utf-8'),
                                        heading=str(name),
                                        sound=True,
                                        icon='ERROR')

            if 'added' in result:
                if result['added'][content]:
                    message = sctop.getString(30987).encode(
                        'utf-8') % ratings[select][1]
                else:
                    return

            if 'deleted' in result:
                if result['deleted'][content]:
                    message = sctop.getString(30988).encode('utf-8')
                else:
                    return

        elif items[select][1] == '/users/me/lists/%s/items':
            t = sctop.getString(30938).encode('utf-8')
            k = sctop.keyboard('', t)
            k.doModal()
            new = k.getText() if k.isConfirmed() else None
            if (new == None or new == ''): return
            result = getTrakt('/users/me/lists',
                              post={
                                  "name": new,
                                  "privacy": "private"
                              })

            try:
                slug = json.loads(result)['ids']['slug']
            except:
                return sctop.infoDialog(sctop.getString(30941).encode('utf-8'),
                                        heading=str(name),
                                        sound=True,
                                        icon='ERROR')
            result = getTrakt(items[select][1] % slug, post=post)
        else:
            result = getTrakt(items[select][1], post=post)

        icon = icon if not result == None else 'ERROR'

        sctop.infoDialog(message, heading=str(name), sound=True, icon=icon)
    except Exception as e:
        util.debug("[SC] trakt error: %s" % str(traceback.format_exc()))
        return
def manager(name, trakt, content):
    try:
        icon = sctop.infoLabel('ListItem.Icon')
        message = sctop.getString(30941).encode('utf-8')
        content = "movies" if content == 'movie' else "shows"
        post = {content: [{"ids": {"trakt": trakt}}]}
        trakt = int(trakt)
        relevant = sctop.getSettingAsBool('trakt.relevant_menu')

        items = []
        if sctop.getSettingAsBool('trakt.collections'):
            key = 'trakt.collection.%s.ids' % content
            if relevant:
                ids = _get_cached_ids(key, '/users/me/collection/%s' % content)

            if not relevant or trakt not in ids:
                items = [(sctop.getString(30934).encode('utf-8'),
                          '/sync/collection', key)]
            if not relevant or trakt in ids:
                items += [(sctop.getString(30935).encode('utf-8'),
                           '/sync/collection/remove', key)]

        if sctop.getSettingAsBool('trakt.watchlist'):
            key = 'trakt.watchlist.%s.ids' % content
            if relevant:
                ids = _get_cached_ids(key, '/users/me/watchlist/%s' % content)

            if not relevant or trakt not in ids:
                items += [(sctop.getString(30936).encode('utf-8'),
                           '/sync/watchlist', key)]
            if not relevant or trakt in ids:
                items += [(sctop.getString(30937).encode('utf-8'),
                           '/sync/watchlist/remove', key)]

        items += [(sctop.getString(30989), 'rating')]

        lists = sctop.cache.get('trakt.lists')
        if not relevant or not lists:
            result = getTrakt('/users/me/lists')
            lists = json.loads(result)
            sctop.cache.set('trakt.lists', lists)

        util.debug("[SC] string %s" % sctop.getString(30939))

        for lst in lists:
            key = 'trakt.lists.%s.%s.ids' % (lst['ids']['trakt'], content)
            if relevant:
                ids = _get_cached_ids(
                    key, '/users/me/lists/%s/items/%s' %
                    (lst['ids']['slug'], content))
            if not relevant or trakt not in ids:
                items.append(
                    ((sctop.getString(30939) % lst['name']).encode('utf-8'),
                     '/users/me/lists/%s/items' % lst['ids']['slug'], key))

            if not relevant or trakt in ids:
                items.append(
                    ((sctop.getString(30940) % lst['name']).encode('utf-8'),
                     '/users/me/lists/%s/items/remove' % lst['ids']['slug'],
                     key))

        items += [(sctop.getString(30938).encode('utf-8'),
                   '/users/me/lists/%s/items')]

        if relevant:
            items.append(
                (sctop.getString(30811).encode('utf-8'), 'clear_cache'))

        select = sctop.selectDialog([i[0] for i in items],
                                    sctop.getString(30941).encode('utf-8'))

        if select == -1:
            return
        elif items[select][1] == 'rating':
            ratings = [(sctop.getString(i + 30990).encode('utf-8'), i)
                       for i in range(10, -1, -1)]
            select = sctop.selectDialog([i[0] for i in ratings], str(name))
            url = "/sync/ratings/remove"
            if select == -1:
                return
            elif ratings[select][1] != 0:
                url = "/sync/ratings"
                post[content][0]['rating'] = ratings[select][1]
            try:
                result = getTrakt(url, post=post)
                result = json.loads(result)
            except:
                return sctop.infoDialog(sctop.getString(30941).encode('utf-8'),
                                        heading=str(name),
                                        sound=True,
                                        icon='ERROR')

            if 'added' in result:
                if result['added'][content]:
                    message = sctop.getString(30987).encode(
                        'utf-8') % ratings[select][1]
                else:
                    return

            if 'deleted' in result:
                if result['deleted'][content]:
                    message = sctop.getString(30988).encode('utf-8')
                else:
                    return

        elif items[select][1] == '/users/me/lists/%s/items':
            t = sctop.getString(30938).encode('utf-8')
            k = sctop.keyboard('', t)
            k.doModal()
            new = k.getText() if k.isConfirmed() else None
            if (new == None or new == ''): return
            result = getTrakt('/users/me/lists',
                              post={
                                  "name": new,
                                  "privacy": "private"
                              })
            sctop.cache.set('trakt.lists', None, expiration=timedelta())
            try:
                slug = json.loads(result)['ids']['slug']
            except:
                return sctop.infoDialog(sctop.getString(30941).encode('utf-8'),
                                        heading=str(name),
                                        sound=True,
                                        icon='ERROR')
            result = getTrakt(items[select][1] % slug, post=post)
        elif items[select][1] == 'clear_cache':
            ttl = timedelta()
            sctop.cache.set('trakt.lists', None, expiration=ttl)

            contents = ['shows', 'movies']
            for l in ['watchlist', 'collection']:
                for c in contents:
                    key = 'trakt.%s.%s.ids' % (l, c)
                    sctop.cache.set(key, None, expiration=ttl)

            result = getTrakt('/users/me/lists')
            lists = json.loads(result)
            for l in lists:
                for c in contents:
                    key = 'trakt.lists.%s.%s.ids' % (l['ids']['trakt'], c)
                    sctop.cache.set(key, None, expiration=ttl)

            message = sctop.getString(30812).encode('utf-8')
            name = sctop.getString(30941).encode('utf-8')
        else:
            result = getTrakt(items[select][1], post=post)
            key = items[select][2]
            if result and relevant:
                ids = sctop.cache.get(key)
                if type(ids) is list:
                    if items[select][1][-7:] == '/remove':
                        ids = [i for i in ids if i != trakt]
                    else:
                        ids.append(trakt)
                    sctop.cache.set(key, ids)

        icon = icon if not result == None else 'ERROR'

        sctop.infoDialog(message, heading=str(name), sound=True, icon=icon)
    except Exception as e:
        util.debug("[SC] trakt error: %s" % str(traceback.format_exc()))
        return
def manager(name, trakt, content):
    try:
        icon = sctop.infoLabel('ListItem.Icon')
        message = sctop.getString(30941).encode('utf-8')
        content = "movies" if content == 'movie' else "shows"
        post = {content: [{"ids": {"trakt": trakt}}]}
        trakt = int(trakt)
        relevant = sctop.getSettingAsBool('trakt.relevant_menu')

        items = []
        if sctop.getSettingAsBool('trakt.collections'):
            key = 'trakt.collection.%s.ids' % content
            if relevant:
                ids = _get_cached_ids(key, '/uses/me/collection/%s' % content)

            if not relevant or trakt not in ids:
                items = [(sctop.getString(30934).encode('utf-8'),
                          '/sync/collection', key)]
            if not relevant or trakt in ids:
                items += [(sctop.getString(30935).encode('utf-8'),
                           '/sync/collection/remove', key)]

        if sctop.getSettingAsBool('trakt.watchlist'):
            key = 'trakt.watchlist.%s.ids' % content
            if relevant:
                ids = _get_cached_ids(key, '/users/me/watchlist/%s' % content)

            if not relevant or trakt not in ids:
                items += [(sctop.getString(30936).encode('utf-8'),
                           '/sync/watchlist', key)]
            if not relevant or trakt in ids:
                items += [(sctop.getString(30937).encode('utf-8'),
                           '/sync/watchlist/remove', key)]

        items += [(sctop.getString(30989), 'rating')]

        lists = sctop.cache.get('trakt.lists')
        if not relevant or not lists:
            result = getTrakt('/users/me/lists')
            lists = json.loads(result)
            sctop.cache.set('trakt.lists', lists)

        util.debug("[SC] string %s" % sctop.getString(30939))

        for lst in lists:
            key = 'trakt.lists.%s.%s.ids' % (lst['ids']['trakt'], content)
            if relevant:
                ids = _get_cached_ids(
                    key, '/users/me/lists/%s/items/%s' % (lst['ids']['slug'],
                                                          content))
            if not relevant or trakt not in ids:
                items.append(
                    ((sctop.getString(30939) % lst['name']).encode('utf-8'),
                     '/users/me/lists/%s/items' % lst['ids']['slug'], key))

            if not relevant or trakt in ids:
                items.append(
                    ((sctop.getString(30940) % lst['name']).encode('utf-8'),
                     '/users/me/lists/%s/items/remove' % lst['ids']['slug'],
                     key))

        items += [(sctop.getString(30938).encode('utf-8'),
                   '/users/me/lists/%s/items')]

        if relevant:
            items.append((sctop.getString(30811).encode('utf-8'),
                          'clear_cache'))

        select = sctop.selectDialog([i[0] for i in items],
                                    sctop.getString(30941).encode('utf-8'))

        if select == -1:
            return
        elif items[select][1] == 'rating':
            ratings = [(sctop.getString(i + 30990).encode('utf-8'), i)
                       for i in range(10, -1, -1)]
            select = sctop.selectDialog([i[0] for i in ratings], str(name))
            url = "/sync/ratings/remove"
            if select == -1:
                return
            elif ratings[select][1] != 0:
                url = "/sync/ratings"
                post[content][0]['rating'] = ratings[select][1]
            try:
                result = getTrakt(url, post=post)
                result = json.loads(result)
            except:
                return sctop.infoDialog(
                    sctop.getString(30941).encode('utf-8'),
                    heading=str(name),
                    sound=True,
                    icon='ERROR')

            if 'added' in result:
                if result['added'][content]:
                    message = sctop.getString(30987).encode(
                        'utf-8') % ratings[select][1]
                else:
                    return

            if 'deleted' in result:
                if result['deleted'][content]:
                    message = sctop.getString(30988).encode('utf-8')
                else:
                    return

        elif items[select][1] == '/users/me/lists/%s/items':
            t = sctop.getString(30938).encode('utf-8')
            k = sctop.keyboard('', t)
            k.doModal()
            new = k.getText() if k.isConfirmed() else None
            if (new == None or new == ''): return
            result = getTrakt(
                '/users/me/lists', post={
                    "name": new,
                    "privacy": "private"
                })
            sctop.cache.set('trakt.lists', None, expiration=timedelta())
            try:
                slug = json.loads(result)['ids']['slug']
            except:
                return sctop.infoDialog(
                    sctop.getString(30941).encode('utf-8'),
                    heading=str(name),
                    sound=True,
                    icon='ERROR')
            result = getTrakt(items[select][1] % slug, post=post)
        elif items[select][1] == 'clear_cache':
            ttl = timedelta()
            sctop.cache.set('trakt.lists', None, expiration=ttl)

            contents = ['shows', 'movies']
            for l in ['watchlist', 'collection']:
                for c in contents:
                    key = 'trakt.%s.%s.ids' % (l, c)
                    sctop.cache.set(key, None, expiration=ttl)

            result = getTrakt('/users/me/lists')
            lists = json.loads(result)
            for l in lists:
                for c in contents:
                    key = 'trakt.lists.%s.%s.ids' % (l['ids']['trakt'], c)
                    sctop.cache.set(key, None, expiration=ttl)

            message = sctop.getString(30812).encode('utf-8')
            name = sctop.getString(30941).encode('utf-8')
        else:
            result = getTrakt(items[select][1], post=post)
            key = items[select][2]
            if result and relevant:
                ids = sctop.cache.get(key)
                if type(ids) is list:
                    if items[select][1][-7:] == '/remove':
                        ids = [i for i in ids if i != trakt]
                    else:
                        ids.append(trakt)
                    sctop.cache.set(key, ids)

        icon = icon if not result == None else 'ERROR'

        sctop.infoDialog(message, heading=str(name), sound=True, icon=icon)
    except Exception as e:
        util.debug("[SC] trakt error: %s" % str(traceback.format_exc()))
        return