This commit is contained in:
www.xueximeng.com
2025-08-20 21:07:39 +08:00
parent 8ad95990ce
commit 166098913f
8 changed files with 37 additions and 43 deletions

View File

@@ -112,6 +112,7 @@ cd pansou
| ASYNC_MAX_BACKGROUND_WORKERS | 最大后台工作者数量 | CPU核心数×5 |
| ASYNC_MAX_BACKGROUND_TASKS | 最大后台任务数量 | 工作者数×5 |
| ASYNC_CACHE_TTL_HOURS | 异步缓存有效期(小时) | `1` |
| ASYNC_PLUGIN_ENABLED | 异步插件是否启用 | `true` |
| HTTP_READ_TIMEOUT | HTTP读取超时(秒) | 自动计算 |
| HTTP_WRITE_TIMEOUT | HTTP写入超时(秒) | 自动计算 |
| HTTP_IDLE_TIMEOUT | HTTP空闲超时(秒) | `120` |

29
main.go
View File

@@ -298,20 +298,23 @@ func printServiceInfo(port string, pluginManager *plugin.PluginManager) {
fmt.Println("异步插件已禁用")
}
// 输出插件信息(按优先级排序)
fmt.Println("已加载插件:")
plugins := pluginManager.GetPlugins()
// 只有当插件功能启用时才输出插件信息
if config.AppConfig.AsyncPluginEnabled {
// 输出插件信息(按优先级排序)
fmt.Println("已加载插件:")
plugins := pluginManager.GetPlugins()
// 按优先级排序(优先级数字越小越靠前)
sort.Slice(plugins, func(i, j int) bool {
// 优先级相同时按名称排序
if plugins[i].Priority() == plugins[j].Priority() {
return plugins[i].Name() < plugins[j].Name()
// 按优先级排序(优先级数字越小越靠前)
sort.Slice(plugins, func(i, j int) bool {
// 优先级相同时按名称排序
if plugins[i].Priority() == plugins[j].Priority() {
return plugins[i].Name() < plugins[j].Name()
}
return plugins[i].Priority() < plugins[j].Priority()
})
for _, p := range plugins {
fmt.Printf(" - %s (优先级: %d)\n", p.Name(), p.Priority())
}
return plugins[i].Priority() < plugins[j].Priority()
})
for _, p := range plugins {
fmt.Printf(" - %s (优先级: %d)\n", p.Name(), p.Priority())
}
}

View File

@@ -147,7 +147,6 @@ func (p *ClmaoPlugin) searchImpl(client *http.Client, keyword string, ext map[st
}
}
fmt.Printf("[%s] 找到搜索结果数量: %d\n", p.Name(), len(allResults))
// 3. 关键词过滤
searchKeyword := keyword

View File

@@ -248,7 +248,7 @@ func NewPanSearchPlugin() *PanSearchAsyncPlugin {
go func() {
_, err := p.getBuildId()
if err != nil {
fmt.Printf("预热获取 buildId 失败: %v\n", err)
// fmt.Printf("预热获取 buildId 失败: %v\n", err)
}
}()
@@ -278,7 +278,7 @@ func (p *PanSearchAsyncPlugin) updateBuildId() {
// 发送请求获取页面
req, err := http.NewRequestWithContext(ctx, "GET", WebsiteURL, nil)
if err != nil {
fmt.Printf("创建请求失败: %v\n", err)
// fmt.Printf("创建请求失败: %v\n", err)
return
}
@@ -292,7 +292,7 @@ func (p *PanSearchAsyncPlugin) updateBuildId() {
resp, err := p.GetClient().Do(req)
if err != nil {
fmt.Printf("请求失败: %v\n", err)
// fmt.Printf("请求失败: %v\n", err)
return
}
defer resp.Body.Close()
@@ -306,7 +306,7 @@ func (p *PanSearchAsyncPlugin) updateBuildId() {
var bodyBuilder strings.Builder
_, err = io.Copy(&bodyBuilder, resp.Body)
if err != nil {
fmt.Printf("读取响应失败: %v\n", err)
// fmt.Printf("读取响应失败: %v\n", err)
return
}
body := bodyBuilder.String()
@@ -392,7 +392,7 @@ func (p *PanSearchAsyncPlugin) getBuildId() (string, error) {
if err != nil {
// 如果创建请求失败但有旧的缓存,使用旧的缓存(优雅降级)
if buildIdCache != "" {
fmt.Printf("创建请求失败使用旧的buildId: %v\n", err)
// fmt.Printf("创建请求失败使用旧的buildId: %v\n", err)
return buildIdCache, nil
}
return "", fmt.Errorf("创建请求失败: %w", err)
@@ -430,7 +430,7 @@ func (p *PanSearchAsyncPlugin) getBuildId() (string, error) {
// 如果所有重试都失败,但有旧的缓存,使用旧的缓存(优雅降级)
if respErr != nil || resp == nil {
if buildIdCache != "" {
fmt.Printf("请求失败使用旧的buildId: %v\n", respErr)
// fmt.Printf("请求失败使用旧的buildId: %v\n", respErr)
return buildIdCache, nil
}
return "", fmt.Errorf("请求失败: %w", respErr)
@@ -452,7 +452,7 @@ func (p *PanSearchAsyncPlugin) getBuildId() (string, error) {
if err != nil {
// 如果读取响应失败,但有旧的缓存,使用旧的缓存(优雅降级)
if buildIdCache != "" {
fmt.Printf("读取响应失败使用旧的buildId: %v\n", err)
// fmt.Printf("读取响应失败使用旧的buildId: %v\n", err)
return buildIdCache, nil
}
return "", fmt.Errorf("读取响应失败: %w", err)
@@ -465,7 +465,7 @@ func (p *PanSearchAsyncPlugin) getBuildId() (string, error) {
// 如果提取失败,但有旧的缓存,使用旧的缓存(优雅降级)
if buildId == "" {
if buildIdCache != "" {
fmt.Println("未找到buildId使用旧的buildId")
// fmt.Println("未找到buildId使用旧的buildId")
return buildIdCache, nil
}
return "", fmt.Errorf("未找到buildId")

View File

@@ -212,7 +212,6 @@ func (p *PanyqPlugin) doSearch(client *http.Client, keyword string, ext map[stri
credentials, err := p.getCredentials(keyword, actionIDs[ActionIDKeys[0]], client)
if err != nil {
// 如果获取凭证失败尝试刷新Action ID并重试
fmt.Println("panyq: failed to get credentials, refreshing Action IDs...")
actionIDs, err = p.discoverActionIDs()
if err != nil {
return nil, fmt.Errorf("刷新Action ID失败: %w", err)

View File

@@ -151,7 +151,6 @@ func (p *WujiPlugin) searchImpl(client *http.Client, keyword string, ext map[str
}
}
fmt.Printf("[%s] 找到搜索结果数量: %d\n", p.Name(), len(allResults))
// 3. 并发获取每个结果的详情页磁力链接
finalResults := p.enrichWithMagnetLinks(allResults, client)

View File

@@ -5,6 +5,7 @@ import (
"time"
"pansou/model"
"pansou/plugin"
"pansou/util/cache"
)
@@ -82,18 +83,13 @@ func (c *CacheWriteIntegration) HandleCacheWrite(key string, results []model.Sea
// getPluginPriority 获取插件优先级
func (c *CacheWriteIntegration) getPluginPriority(pluginName string) int {
// 这里应该从插件管理器获取真实的优先级
// 暂时使用简化的映射
switch pluginName {
case "hdr4k", "susu", "panta", "xuexizhinan", "zhizhen", "labi", "wanou":
return 1 // 等级1插件
case "muou", "huban", "ouge", "duoduo", "shandian", "panyq":
return 2 // 等级2插件
case "fox4k", "qupansou", "pansearch", "hunhepan", "pan666", "jikepan":
return 3 // 等级3插件
default:
return 4 // 默认等级4
// 从插件管理器动态获取真实的优先级
if pluginInstance, exists := plugin.GetPluginByName(pluginName); exists {
return pluginInstance.Priority()
}
// 如果插件不存在返回默认等级4最低优先级
return 4
}
// estimateDataSize 估算数据大小

View File

@@ -436,8 +436,8 @@ func (s *SearchService) Search(keyword string, channels []string, concurrency in
tgResults, tgErr = s.searchTG(keyword, channels, forceRefresh)
}()
}
// 如果需要搜索插件
if sourceType == "all" || sourceType == "plugin" {
// 如果需要搜索插件(且插件功能已启用)
if (sourceType == "all" || sourceType == "plugin") && config.AppConfig.AsyncPluginEnabled {
wg.Add(1)
go func() {
defer wg.Done()
@@ -1373,12 +1373,9 @@ func getPluginLevelBySource(source string) int {
// getPluginPriorityByName 根据插件名获取优先级
func getPluginPriorityByName(pluginName string) int {
// 从已注册插件中获取优先级
plugins := plugin.GetRegisteredPlugins()
for _, p := range plugins {
if p.Name() == pluginName {
return p.Priority()
}
// 从插件管理器动态获取真实的优先级 (O(1)哈希查找)
if pluginInstance, exists := plugin.GetPluginByName(pluginName); exists {
return pluginInstance.Priority()
}
return 3 // 默认等级
}