From 152f814fb676164e995d827acafa14803e967af7 Mon Sep 17 00:00:00 2001 From: jxxghp Date: Thu, 26 Jun 2025 13:28:11 +0800 Subject: [PATCH] fix base chain --- app/chain/__init__.py | 8 +-- app/helper/rss.py | 127 +++++++++++++++++++++--------------------- app/helper/service.py | 3 +- 3 files changed, 68 insertions(+), 70 deletions(-) diff --git a/app/chain/__init__.py b/app/chain/__init__.py index 13c45f24..88558d95 100644 --- a/app/chain/__init__.py +++ b/app/chain/__init__.py @@ -94,9 +94,8 @@ class ChainBase(metaclass=ABCMeta): return ret is None result = None - plugin_modules = self.pluginmanager.get_plugin_modules() # 插件模块 - for plugin, module_dict in plugin_modules.items(): + for plugin, module_dict in self.pluginmanager.get_plugin_modules().items(): plugin_id, plugin_name = plugin if method in module_dict: func = module_dict[method] @@ -138,10 +137,7 @@ class ChainBase(metaclass=ABCMeta): # 系统模块 logger.debug(f"请求系统模块执行:{method} ...") - modules = self.modulemanager.get_running_modules(method) - # 按优先级排序 - modules = sorted(modules, key=lambda x: x.get_priority()) - for module in modules: + for module in sorted(self.modulemanager.get_running_modules(method), key=lambda x: x.get_priority()): module_id = module.__class__.__name__ try: module_name = module.get_name() diff --git a/app/helper/rss.py b/app/helper/rss.py index 7552889f..6f6434c9 100644 --- a/app/helper/rss.py +++ b/app/helper/rss.py @@ -306,6 +306,7 @@ class RssHelper: return False finally: if parser is not None: + parser.close() del parser if root is None: @@ -319,70 +320,72 @@ class RssHelper: items_count = min(len(items), self.MAX_RSS_ITEMS) if len(items) > self.MAX_RSS_ITEMS: logger.warning(f"RSS条目过多: {len(items)},仅处理前{self.MAX_RSS_ITEMS}个") + try: + for item in items[:items_count]: + try: + # 使用xpath提取信息,更高效 + title_nodes = item.xpath('.//title') + title = title_nodes[0].text if title_nodes and title_nodes[0].text else "" + if not title: + continue - for item in items[:items_count]: - try: - # 使用xpath提取信息,更高效 - title_nodes = item.xpath('.//title') - title = title_nodes[0].text if title_nodes and title_nodes[0].text else "" - if not title: + # 描述 + desc_nodes = item.xpath('.//description | .//summary') + description = desc_nodes[0].text if desc_nodes and desc_nodes[0].text else "" + + # 种子页面 + link_nodes = item.xpath('.//link') + if link_nodes: + link = link_nodes[0].text if hasattr(link_nodes[0], 'text') and link_nodes[0].text else link_nodes[0].get('href', '') + else: + link = "" + + # 种子链接 + enclosure_nodes = item.xpath('.//enclosure') + enclosure = enclosure_nodes[0].get('url', '') if enclosure_nodes else "" + if not enclosure and not link: + continue + # 部分RSS只有link没有enclosure + if not enclosure and link: + enclosure = link + + # 大小 + size = 0 + if enclosure_nodes: + size_attr = enclosure_nodes[0].get('length', '0') + if size_attr and str(size_attr).isdigit(): + size = int(size_attr) + + # 发布日期 + pubdate_nodes = item.xpath('.//pubDate | .//published | .//updated') + pubdate = "" + if pubdate_nodes and pubdate_nodes[0].text: + pubdate = StringUtils.get_time(pubdate_nodes[0].text) + + # 获取豆瓣昵称 + nickname_nodes = item.xpath('.//*[local-name()="creator"]') + nickname = nickname_nodes[0].text if nickname_nodes and nickname_nodes[0].text else "" + + # 返回对象 + tmp_dict = { + 'title': title, + 'enclosure': enclosure, + 'size': size, + 'description': description, + 'link': link, + 'pubdate': pubdate + } + # 如果豆瓣昵称不为空,返回数据增加豆瓣昵称,供doubansync插件获取 + if nickname: + tmp_dict['nickname'] = nickname + ret_array.append(tmp_dict) + + except Exception as e1: + logger.debug(f"解析RSS条目失败:{str(e1)} - {traceback.format_exc()}") continue - - # 描述 - desc_nodes = item.xpath('.//description | .//summary') - description = desc_nodes[0].text if desc_nodes and desc_nodes[0].text else "" - - # 种子页面 - link_nodes = item.xpath('.//link') - if link_nodes: - link = link_nodes[0].text if hasattr(link_nodes[0], 'text') and link_nodes[0].text else \ - link_nodes[0].get('href', '') - else: - link = "" - - # 种子链接 - enclosure_nodes = item.xpath('.//enclosure') - enclosure = enclosure_nodes[0].get('url', '') if enclosure_nodes else "" - if not enclosure and not link: - continue - # 部分RSS只有link没有enclosure - if not enclosure and link: - enclosure = link - - # 大小 - size = 0 - if enclosure_nodes: - size_attr = enclosure_nodes[0].get('length', '0') - if size_attr and str(size_attr).isdigit(): - size = int(size_attr) - - # 发布日期 - pubdate_nodes = item.xpath('.//pubDate | .//published | .//updated') - pubdate = "" - if pubdate_nodes and pubdate_nodes[0].text: - pubdate = StringUtils.get_time(pubdate_nodes[0].text) - - # 获取豆瓣昵称 - nickname_nodes = item.xpath('.//*[local-name()="creator"]') - nickname = nickname_nodes[0].text if nickname_nodes and nickname_nodes[0].text else "" - - # 返回对象 - tmp_dict = { - 'title': title, - 'enclosure': enclosure, - 'size': size, - 'description': description, - 'link': link, - 'pubdate': pubdate - } - # 如果豆瓣昵称不为空,返回数据增加豆瓣昵称,供doubansync插件获取 - if nickname: - tmp_dict['nickname'] = nickname - ret_array.append(tmp_dict) - - except Exception as e1: - logger.debug(f"解析RSS条目失败:{str(e1)} - {traceback.format_exc()}") - continue + finally: + items.clear() + del items except Exception as e2: logger.error(f"解析RSS失败:{str(e2)} - {traceback.format_exc()}") diff --git a/app/helper/service.py b/app/helper/service.py index 57a1b357..2fb71056 100644 --- a/app/helper/service.py +++ b/app/helper/service.py @@ -107,8 +107,7 @@ class ServiceBaseHelper(Generic[TConf]): 迭代所有模块的实例及其对应的配置,返回 ServiceInfo 实例 """ configs = self.get_configs() - modules = self.modulemanager.get_running_type_modules(self.module_type) - for module in modules: + for module in self.modulemanager.get_running_type_modules(self.module_type): if not module: continue module_instances = module.get_instances()