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