mirror of
https://github.com/jxxghp/MoviePilot.git
synced 2026-09-05 23:47:41 +08:00
Address code review comments: improve code organization and use modern asyncio
Co-authored-by: jxxghp <51039935+jxxghp@users.noreply.github.com>
This commit is contained in:
co-authored by
jxxghp
parent
ca18705d88
commit
eca339d107
@@ -1,15 +1,20 @@
|
|||||||
"""搜索网络内容工具"""
|
"""搜索网络内容工具"""
|
||||||
|
|
||||||
|
import asyncio
|
||||||
import json
|
import json
|
||||||
import re
|
import re
|
||||||
from typing import Optional, Type
|
from typing import Optional, Type
|
||||||
|
|
||||||
|
from duckduckgo_search import DDGS
|
||||||
from pydantic import BaseModel, Field
|
from pydantic import BaseModel, Field
|
||||||
|
|
||||||
from app.agent.tools.base import MoviePilotTool
|
from app.agent.tools.base import MoviePilotTool
|
||||||
from app.core.config import settings
|
from app.core.config import settings
|
||||||
from app.log import logger
|
from app.log import logger
|
||||||
|
|
||||||
|
# 搜索超时时间(秒)
|
||||||
|
SEARCH_TIMEOUT = 20
|
||||||
|
|
||||||
|
|
||||||
class SearchWebInput(BaseModel):
|
class SearchWebInput(BaseModel):
|
||||||
"""搜索网络内容工具的输入参数模型"""
|
"""搜索网络内容工具的输入参数模型"""
|
||||||
@@ -63,6 +68,25 @@ class SearchWebTool(MoviePilotTool):
|
|||||||
logger.error(f"搜索网络内容失败: {e}", exc_info=True)
|
logger.error(f"搜索网络内容失败: {e}", exc_info=True)
|
||||||
return error_message
|
return error_message
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def _get_proxy_url(proxy_setting) -> Optional[str]:
|
||||||
|
"""
|
||||||
|
从代理设置中提取代理URL
|
||||||
|
|
||||||
|
Args:
|
||||||
|
proxy_setting: 代理设置,可以是字符串或字典
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
代理URL字符串,如果没有配置则返回None
|
||||||
|
"""
|
||||||
|
if not proxy_setting:
|
||||||
|
return None
|
||||||
|
|
||||||
|
if isinstance(proxy_setting, dict):
|
||||||
|
return proxy_setting.get('http') or proxy_setting.get('https')
|
||||||
|
|
||||||
|
return proxy_setting
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
async def _search_duckduckgo(query: str, max_results: int) -> list:
|
async def _search_duckduckgo(query: str, max_results: int) -> list:
|
||||||
"""
|
"""
|
||||||
@@ -76,27 +100,18 @@ class SearchWebTool(MoviePilotTool):
|
|||||||
搜索结果列表
|
搜索结果列表
|
||||||
"""
|
"""
|
||||||
try:
|
try:
|
||||||
from duckduckgo_search import DDGS
|
|
||||||
import asyncio
|
|
||||||
|
|
||||||
# duckduckgo-search 是同步库,需要在 executor 中运行
|
# duckduckgo-search 是同步库,需要在 executor 中运行
|
||||||
def sync_search():
|
def sync_search():
|
||||||
results = []
|
results = []
|
||||||
try:
|
try:
|
||||||
# 使用代理(如果配置了)
|
# 使用代理(如果配置了)
|
||||||
ddgs_kwargs = {}
|
ddgs_kwargs = {}
|
||||||
if settings.PROXY:
|
proxy_url = SearchWebTool._get_proxy_url(settings.PROXY)
|
||||||
# duckduckgo-search 支持代理配置
|
if proxy_url:
|
||||||
if isinstance(settings.PROXY, dict):
|
ddgs_kwargs['proxy'] = proxy_url
|
||||||
proxy_url = settings.PROXY.get('http') or settings.PROXY.get('https')
|
|
||||||
else:
|
|
||||||
proxy_url = settings.PROXY
|
|
||||||
|
|
||||||
if proxy_url:
|
|
||||||
ddgs_kwargs['proxy'] = proxy_url
|
|
||||||
|
|
||||||
# 设置超时
|
# 设置超时
|
||||||
ddgs_kwargs['timeout'] = 20
|
ddgs_kwargs['timeout'] = SEARCH_TIMEOUT
|
||||||
|
|
||||||
with DDGS(**ddgs_kwargs) as ddgs:
|
with DDGS(**ddgs_kwargs) as ddgs:
|
||||||
# 使用 text 方法进行搜索
|
# 使用 text 方法进行搜索
|
||||||
@@ -120,7 +135,7 @@ class SearchWebTool(MoviePilotTool):
|
|||||||
return results
|
return results
|
||||||
|
|
||||||
# 在线程池中运行同步搜索
|
# 在线程池中运行同步搜索
|
||||||
loop = asyncio.get_event_loop()
|
loop = asyncio.get_running_loop()
|
||||||
results = await loop.run_in_executor(None, sync_search)
|
results = await loop.run_in_executor(None, sync_search)
|
||||||
return results
|
return results
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user