def getDirectLink(self, lItem):
        if u'catcher' in lItem:
            filename = lItem[u'catcher']
        else:
            netloc = lItem[u'url'].replace(u'//', u'/').split(u'/')[1].replace(u'www.', u'')
            idx = 0
            for i in range(netloc.count(u'.')):
                name = netloc[idx:]
                if os.path.isfile(os.path.join(catDir, name + u'.catcher')):
                    filename =  name + u'.catcher'
                    break
                idx += name.find(u'.') + 1
            else:
                name = lItem[u'cfg'][:-3] + u'catcher'
                if os.path.isfile(os.path.join(catDir, name)):
                    filename = name
                else:
                    filename = u'simple-match.catcher'
        self.loadCatcher(filename)
        redirected = self.parseVideoPage(lItem[u'url'])
        if redirected != None:
            return redirected.videoItem
        if self.link == None and len(self.urlList) > 0:
            self.selectLink()
#        if self.link != None:
#            tmp = {
#                u'url': self.link,
#                u'extension': self.videoExtension
#                }
#            if self.player != None:
#                tmp[u'player'] = self.player
#            tmp = inheritInfos(tmp, lItem)
#            return tmp
#        elif len(self.urlList) > 0:
#            self.selectLink()
        if self.link != None:
            tmp = {
                u'url': self.link,
                u'extension': self.videoExtension
                }
            if self.player != None:
                tmp[u'player'] = self.player
            tmp = inheritInfos(tmp, lItem)
            return tmp
        return None
def loadLocal(lItem, search_phrase = None):
    def loadKey(txt):
        return keys[-1] == txt and keys.pop()
    site = None
    links = []
    keys, values = loadFile(lItem)
    ext = getFileExtension(lItem[u'url'])
    if ext == u'cfg' or ext == u'list':
        filename = lItem[u'url']
        if ext == u'cfg' and u'cfg' not in lItem:
            lItem[u'cfg'] = filename
    else:
        filename = lItem[u'cfg']
#    if u'type' in lItem and lItem[u'type'] == u'search' and search_phrase == None:
#        search_phrase = getSearchPhrase()
    while keys:
        old_line = len(keys)
        while keys and keys[-1].startswith(u'site_'):
            old_line = len(keys)
            if loadKey(u'site_start'):
                site = CRuleSite()
                if ext == u'cfg':
                    site.start = values.pop()
                else:
                    if lItem[u'type'] == u'search':
                        lItem[u'url'] = lItem[u'url'] % search_phrase
                    site.start = lItem[u'url']
                    del values[-1]
                if site.cfg == None and ext == u'cfg':
                    site.cfg = filename
                elif u'cfg' in lItem:
                    site.cfg = lItem[u'cfg']
            if loadKey(u'site_header'):
                headers = values.pop().split(u'|')
                site.txheaders[headers[0]] = headers[1]
            if loadKey(u'site_skill'):
                site.skill = values.pop()
                skill_file = filename[:filename.find(u'.')] + u'.lnk'
                if site.skill.find(u'redirect') != -1:
                    try:
                        f = open(str(os.path.join(resDir, skill_file)), 'r')
                    except IOError:
                        pass
                    else:
                        forward_cfg = f.read()
                        f.close()
                        if forward_cfg != filename:
                            lItem[u'url'] = forward_cfg
                            lItem[u'cfg'] = forward_cfg
                            return loadLocal(lItem)
                elif site.skill.find(u'store') != -1:
                    f = open(str(os.path.join(resDir, skill_file)), 'w')
                    f.write(filename)
                    f.close()
            if loadKey(u'site_sort'):
                if values[-1].find(u'|') != -1:
                    site.sort.extend(values.pop().split(u'|'))
                else:
                    site.sort.append(values.pop())
            if loadKey(u'site_startRE'):
                site.startRE = values.pop()
            if len(keys) == old_line:
                log(u'Syntax Error: "%s" is invalid.' % filename)
                del keys[-1]
        while keys and keys[-1].startswith(u'item_'):
            old_line = len(keys)
            if loadKey(u'item_infos'):
                rule_tmp = CRuleItem()
                rule_tmp.infos = values.pop()
            if loadKey(u'item_order'):
                if values[-1].find(u'|') != -1:
                    rule_tmp.order.extend(values.pop().split(u'|'))
                else:
                    rule_tmp.order.append(values.pop())
            if loadKey(u'item_skill'):
                rule_tmp.skill = values.pop()
            if loadKey(u'item_curr'):
                rule_tmp.curr = values.pop()
            if loadKey(u'item_type'):
                rule_tmp.type = values.pop()
            while keys and keys[-1].startswith(u'item_info_'):
                old_line = len(keys)
                if loadKey(u'item_info_name'):
                    info_tmp = CItemInfo()
                    if values[-1].startswith(u'video.devil.context'):
                        values[-1] = u'context.' + __language__(int(values[-1][20:]))
                    info_tmp.name = values.pop()
                if loadKey(u'item_info_from'):
                    info_tmp.src = values.pop()
                if loadKey(u'item_info'):
                    info_tmp.rule = values.pop()
                if loadKey(u'item_info_default'):
                    info_tmp.default = values.pop()
                if loadKey(u'item_info_build'):
                    if values[-1].startswith(u'video.devil.'):
                        if values[-1].startswith(u'video.devil.locale'):
                            values[-1] = u'  ' + __language__(int(values[-1][19:])) + u'  '
                        elif values[-1].startswith(u'video.devil.image'):
                            values[-1] = os.path.join(imgDir, values[-1][18:])
                    info_tmp.build = values.pop()
                    rule_tmp.info_list.append(info_tmp)
                    info_tmp = None
                if len(keys) == old_line:
                    log(u'Syntax Error: "%s" is invalid.' % filename)
                    del keys[-1]
            if loadKey(u'item_infos_actions'):
                if values[-1].find(u'|') != -1:
                    rule_tmp.actions.extend(values.pop().split(u'|'))
                else:
                    rule_tmp.actions.append(values.pop())
            if loadKey(u'item_url_build'):
                rule_tmp.url_build = values.pop()
                if mode == u'VIEWALL_RSS' or mode == u'VIEWALL_SEARCH':
                    if rule_tmp.type.startswith(u'video') or rule_tmp.type == u'next':
                        site.rules.append(rule_tmp)
                    elif rule_tmp.type == u'category' and not os.path.isfile(os.path.join(allsitesDir, rule_tmp.type + u'.list')):
                        site.rules.append(rule_tmp)
                elif mode == u'VIEWALL_DIRECTORY':
                    if rule_tmp.type == u'category' and not os.listdir(os.path.join(allsitesDir, rule_tmp.type)):
                        site.rules.append(rule_tmp)
                elif mode == u'VIEW_RSS_DIRECTORY':
                    if not rule_tmp.type.startswith(u'video'):
                        site.rules.append(rule_tmp)
                else:
                    site.rules.append(rule_tmp)
                rule_tmp = None
            if len(keys) == old_line:
                log(u'Syntax Error: "%s" is invalid.' % filename)
                del keys[-1]
        while keys and keys[-1].startswith(u'link_'):
            old_line = len(keys)
            if loadKey(u'link_title'):
                tmp = {}
                if values[-1].startswith(u'video.devil.locale'):
                    values[-1] = __language__(int(values[-1][19:]))
                tmp[u'title'] = values.pop()
            while tmp != None and keys[-1] != u'link_url':
                if values[-1].startswith(u'video.devil.image'):
                    values[-1] = os.path.join(imgDir, values[-1][18:])
                tmp[keys[-1][5:]] = values.pop()
                del keys[-1]
            if loadKey(u'link_url'):
                tmp[u'url'] = values.pop()
                if filename == u'sites.list':
                    if addon.getSetting(tmp[u'title']) == u'true':
                        tmp[u'cfg'] = tmp[u'url']
                        links.append(tmp)
                else:
                    tmp = inheritInfos(tmp, lItem)
                    if site != None:
                        tmp[u'title'] = u'  ' + tmp[u'title'] + u'  '
                        if ext == u'cfg' and tmp[u'type'] == u'once':
                            tmp[u'type'] = u'links'
                        site.links[tmp[u'type']] = (tmp, [tmp])
                        if mode == u'VIEW_RSS' or mode == u'VIEWALL_RSS' or mode == u'VIEWALL_SEARCH':
                            for i in range(len(site.rules) - 1, 0, -1):
                                if site.rules[i].type == tmp[u'type']:
                                    log('deleting rule type: "%s"' % tmp[u'type'])
                                    del site.rules[i]
                    else:
                        links.append(tmp)
                tmp = None
                break
            if len(keys) == old_line:
                log(u'Syntax Error: "%s" is invalid.' % filename)
                del keys[-1]
        if len(keys) == old_line:
            log(u'Syntax Error: "%s" is invalid.' % filename)
            del keys[-1]
    if site != None:
        return site
    return links
                    else:
                        rule_items.append(tmp)
            if rule_items:
                if item_rule.type.startswith(u'video'):
#                    start = time.clock()
                    addListItems(rule_items, item_rule.type, lItem)
#                    print('addListItems took = %s' % (time.clock() - start))
                else:
                    tmp_infos = lItem.copy()
                    tmp_infos[u'type'] = item_rule.type
                    for info in item_rule.info_list:
                        if info.name == u'title':
                            tmp_infos[u'title'] = info.build
                        elif info.name == u'icon':
                            tmp_infos[u'icon'] = info.build
                    items[item_rule.type] = (tmp_infos, [inheritInfos(item, lItem) for item in rule_items])
    return items

# Helper functions for loadRemote
def currBuilder(site, rule, lItem, url, match = None, infos_value = None):
    if infos_value == None:
        title = match.group(1).strip()
    else:
        title = infos_value.strip()
    tmp = {}
    if rule.skill.find(u'space') != -1:
        tmp[u'title'] = u'   ' + title + u' (' + __language__(30106) + u')   '
    else:
        tmp[u'title'] = u'  ' + title + u' (' + __language__(30106) + u')  '
    tmp[u'url'] = url
    tmp[u'type'] = rule.type
 def run(self, lItem):
     #loadLocal
     start = time.clock()
     log(str(mode))
     if mode == u'START':
         localParser.load_links(lItem)
         totalItems = len(localParser.links)
         tmp = {
             u'title': u' All Sites',
             u'type': u'rss',
             u'director': u'VideoDevil',
             u'icon': os.path.join(imgDir, u'face_devil_grin.png'),
             u'url': u'sites.list'
         }
         addListItem(mode.selectLinkMode(inheritInfos(tmp, lItem)), totalItems)
         for link in localParser.links:
             addListItem(mode.selectLinkMode(link), totalItems)
     elif mode == u'VIEW_RSS' or mode == u'VIEW_SEARCH' or mode == u'VIEW_RSS_DIRECTORY':
         localParser.load_site(lItem)
         self.sort.extend(localParser.site.sort)
         remoteParser.main(((localParser.site, lItem),))
         type_dict = {}
         for type, infos, items in remoteParser.items.files():
             if type == u'next' or (mode == u'VIEW_RSS_DIRECTORY' and type == lItem[u'type']):
                 log('type added = %s(%d)' % (type,len(items)))
                 addListItems(items, type, lItem)
             else:
                 create_list_and_listItem(cacheDir, type, items, infos, lItem)
         for type, infos, items in localParser.site.links.files():
             if type not in remoteParser.items:
                 for item in items:
                     addListItem(mode.selectLinkMode(item), 0)
     elif mode == u'VIEW_DIRECTORY':
         localParser.load_links(lItem)
         totalItems = len(localParser.links)
         for link in localParser.links:
             addListItem(mode.selectLinkMode(link), totalItems)
     elif mode == u'VIEWALL_RSS' or mode == u'VIEWALL_SEARCH':
         localParser.load_links_and_sites_in_list(lItem)
         remoteParser.main(localParser.sites)
         for type, infos, items in remoteParser.items.files():
             if u'cfg' in infos:
                 del infos[u'cfg']
             if type == u'next':
                 create_list_and_listItem(cacheDir, type, items, infos, lItem)
                 infos[u'title'] = infos[u'title'].strip(u' ')
                 addListItem(infos, 0)
             elif not os.path.isfile(os.path.join(allsitesDir, type + u'.list')):
                 create_list_and_listItem(allsitesDir, type, items, infos, lItem)
             else:
                 create_listItem(allsitesDir, type, infos)
         if u'category' not in remoteParser.items:
             item = lItem.copy()
             item[u'title'] = u'  ' + __language__(30100) + u'  '
             item[u'type'] = u'category'
             item[u'director'] = u'VideoDevil'
             item[u'icon'] = os.path.join(imgDir, u'face_devil_grin.png')
             item[u'url'] = os.path.join(allsitesDir, u'category.list')
             addListItem(mode.selectLinkMode(item), 0)
         if not os.path.isfile(os.path.join(allsitesDir, u'search.list')):
             tmp_items = []
             for site, item in localParser.sites:
                 for type, infos, items in site.links.files():
                     if type == u'search':
                         tmp_items.extend(items)
             infos = tmp_items[0].copy()
             if u'cfg' in infos:
                 del infos[u'cfg']
             create_list_and_listItem(allsitesDir, u'search', tmp_items, infos, lItem)
         else:
             item = lItem.copy()
             item[u'title'] = u'  ' + __language__(30102) + u'  '
             item[u'type'] = u'search'
             item[u'director'] = u'VideoDevil'
             item[u'icon'] = os.path.join(imgDir, u'search.png')
             item[u'url'] = os.path.join(allsitesDir, u'search.list')
             addListItem(mode.selectLinkMode(item), 0)
     elif mode == u'VIEWALL_DIRECTORY':
         fileDir = os.path.join(allsitesDir, lItem[u'type'])
         if not os.path.isdir(fileDir):
             os.mkdir(fileDir)
         if not os.listdir(fileDir):
             localParser.load_links_and_sites_not_in_list(lItem)
             remoteParser.main(localParser.sites)
             for type, infos, items in remoteParser.items.files():
                 if u'cfg' in infos:
                     del infos[u'cfg']
                 if type == lItem[u'type']:
                     self.createDirs(items + localParser.links)
                     dir_items = create_lists_and_listItems(fileDir, self.links, lItem) 
                     if dir_items:
                         saveList(allsitesDir, lItem[u'type'] + u'.list', lItem[u'title'], dir_items)
             addon.setSetting(lItem[u'type'] + '_all_sites_cache', str(time.time()))
         else:
             localParser.load_links(lItem)
             totalItems = len(localParser.links)
             for link in localParser.links:
                 addListItem(mode.selectLinkMode(link), totalItems)
     for sort_method in self.sort:
         xbmcplugin.addSortMethod(handle = self.handle, sortMethod = sort_dict[sort_method])
     log('time elapsed = %s' % (time.clock() - start))
     return 0