From 401e61dd3201974a4dd2c738d2bcba2fd8256387 Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 7 Mar 2026 17:57:16 +0000 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=20/s=20=E5=91=BD?= =?UTF-8?q?=E4=BB=A4=E4=B8=AD=E8=B7=AF=E5=BE=84/=E5=B7=A5=E5=85=B7?= =?UTF-8?q?=E9=80=89=E6=8B=A9=E6=97=A0=E6=95=88=E7=9A=84=20bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit torrent_callback 对 sb_path_select / sb_tool_select 等回调的处理原本在 PAGE 查找之后,而 /s 搜索结果只存在 search.py 的 PAGE 中,导致 PAGE.get() 返回 None、提前 return,使点击路径/工具按钮无任何响应。 将 sb_path_select、sb_cd_、sb_confirm_path、sb_tool_select、sb_tool_、 sb_cancel_* 和 tb_add_ 等回调的处理移至 PAGE 检查之前,这些操作依赖 DOWNLOAD_INFO 而非搜索结果页,/s 和 /sb 均可正常使用。 --- module/torrent_search/torrent_search.py | 260 ++++++++++++------------ 1 file changed, 128 insertions(+), 132 deletions(-) diff --git a/module/torrent_search/torrent_search.py b/module/torrent_search/torrent_search.py index 60f09a4..7889886 100644 --- a/module/torrent_search/torrent_search.py +++ b/module/torrent_search/torrent_search.py @@ -290,15 +290,15 @@ async def search_with_indexer(update: Update, context: ContextTypes.DEFAULT_TYPE async def torrent_callback(update: Update, context: ContextTypes.DEFAULT_TYPE): query = update.callback_query - + try: await query.answer() except Exception: pass - + data = query.data msg = query.message - + if data.startswith("sb_indexer_"): parts = data.replace("sb_indexer_", "").split("_", 1) if len(parts) != 2: @@ -328,132 +328,7 @@ async def torrent_callback(update: Update, context: ContextTypes.DEFAULT_TYPE): await search_with_indexer(update, context, indexer_id, keyword, query.message.text) return - - cmid = f"{msg.chat.id}|{msg.message_id}" - page = PAGE.get(cmid) - - if not page: - try: - await query.answer("搜索结果已过期,请重新搜索", show_alert=True) - except Exception: - pass - return - - if data == "torrent_next": - page.next_page() - text, buttons = page.now_page_text() - await msg.edit_text(text=text, reply_markup=InlineKeyboardMarkup(buttons)) - return - elif data == "torrent_previous": - page.previous_page() - text, buttons = page.now_page_text() - await msg.edit_text(text=text, reply_markup=InlineKeyboardMarkup(buttons)) - return - elif data.startswith("torrent_magnet_"): - try: - index = int(data.split("_")[-1]) - except ValueError: - return - result = RESULT_INDEXER.get(f"{cmid}_{index}") - if not result: - return - - try: - await query.answer("🔄 转换中...", show_alert=False) - except Exception: - pass - - cache = TorrentCache(bot_cfg.torrent_cache_max or 10) - - # 检查是否已有有效的磁力链接 - magnet = None - if result.magnet_url and result.magnet_url.startswith("magnet:"): - magnet = result.magnet_url - elif result.torrent_url: - magnet = await cache.get_magnet(result.torrent_url) - else: - try: - await query.answer("无可用链接", show_alert=True) - except Exception: - pass - return - - if magnet: - await query.message.reply_text( - f"🧲 磁力链接:\n\n`{magnet}`\n\n👆 点击复制", - parse_mode="Markdown" - ) - else: - try: - await query.answer("转换失败", show_alert=True) - except Exception: - pass - return - elif data.startswith("torrent_add_"): - try: - index = int(data.split("_")[-1]) - except ValueError: - return - result = RESULT_INDEXER.get(f"{cmid}_{index}") - if not result: - try: - await query.answer("搜索结果已过期,请重新搜索", show_alert=True) - except Exception: - pass - return - - try: - await query.answer("🔄 获取下载信息...", show_alert=False) - except Exception: - pass - - # 获取下载工具和路径 - 使用刷新后的配置 - try: - from config.config import reload_od_cfg - cfg = reload_od_cfg() - path = cfg.download_path if cfg and cfg.download_path else "/" - tool = cfg.download_tool if cfg and cfg.download_tool else "qbittorrent" - except Exception: - path = "/" - tool = "qbittorrent" - - # 尝试获取有效的磁力链接 - download_url = None - if result.magnet_url and result.magnet_url.startswith("magnet:"): - download_url = result.magnet_url - elif result.torrent_url: - cache = TorrentCache(bot_cfg.torrent_cache_max or 10) - magnet = await cache.get_magnet(result.torrent_url) - if magnet: - download_url = magnet - - if not download_url: - try: - await query.answer("无可用链接", show_alert=True) - except Exception: - pass - return - - chat_id = query.message.chat.id - - # 显示确认按钮,包含工具和路径信息 - file_name = result.title[:30] + "..." if len(result.title) > 30 else result.title - - # 保存下载信息到缓存 - DOWNLOAD_INFO[chat_id] = { - "result": result, - "index": index, - "cmid": cmid, - "path": path, - "tool": tool, - "url": download_url, - "file_name": file_name - } - - text, keyboard = await build_download_confirm_message(chat_id, DOWNLOAD_INFO[chat_id]) - await query.message.edit_text(text, reply_markup=keyboard, parse_mode="Markdown") - return - + # 选择下载路径 - 显示存储列表 if data == "sb_path_select": chat_id = msg.chat.id @@ -622,20 +497,141 @@ async def torrent_callback(update: Update, context: ContextTypes.DEFAULT_TYPE): except Exception: pass return - + try: await query.answer("🔄 准备下载...", show_alert=False) except Exception: pass - + info = DOWNLOAD_INFO[chat_id] download_url = info.get("url") path = info.get("path", "/") tool = info.get("tool", "qbittorrent") - + # 调用 /od 的确认流程 from module.offline_download.offline_download import start_download_with_url await start_download_with_url(query.message, tool, path, download_url) + return + + # 以下需要搜索结果页(种子搜索翻页 / 磁力 / 添加下载) + cmid = f"{msg.chat.id}|{msg.message_id}" + page = PAGE.get(cmid) + + if not page: + try: + await query.answer("搜索结果已过期,请重新搜索", show_alert=True) + except Exception: + pass + return + + if data == "torrent_next": + page.next_page() + text, buttons = page.now_page_text() + await msg.edit_text(text=text, reply_markup=InlineKeyboardMarkup(buttons)) + return + elif data == "torrent_previous": + page.previous_page() + text, buttons = page.now_page_text() + await msg.edit_text(text=text, reply_markup=InlineKeyboardMarkup(buttons)) + return + elif data.startswith("torrent_magnet_"): + try: + index = int(data.split("_")[-1]) + except ValueError: + return + result = RESULT_INDEXER.get(f"{cmid}_{index}") + if not result: + return + + try: + await query.answer("🔄 转换中...", show_alert=False) + except Exception: + pass + + cache = TorrentCache(bot_cfg.torrent_cache_max or 10) + + magnet = None + if result.magnet_url and result.magnet_url.startswith("magnet:"): + magnet = result.magnet_url + elif result.torrent_url: + magnet = await cache.get_magnet(result.torrent_url) + else: + try: + await query.answer("无可用链接", show_alert=True) + except Exception: + pass + return + + if magnet: + await query.message.reply_text( + f"🧲 磁力链接:\n\n`{magnet}`\n\n👆 点击复制", + parse_mode="Markdown" + ) + else: + try: + await query.answer("转换失败", show_alert=True) + except Exception: + pass + return + elif data.startswith("torrent_add_"): + try: + index = int(data.split("_")[-1]) + except ValueError: + return + result = RESULT_INDEXER.get(f"{cmid}_{index}") + if not result: + try: + await query.answer("搜索结果已过期,请重新搜索", show_alert=True) + except Exception: + pass + return + + try: + await query.answer("🔄 获取下载信息...", show_alert=False) + except Exception: + pass + + try: + from config.config import reload_od_cfg + cfg = reload_od_cfg() + path = cfg.download_path if cfg and cfg.download_path else "/" + tool = cfg.download_tool if cfg and cfg.download_tool else "qbittorrent" + except Exception: + path = "/" + tool = "qbittorrent" + + download_url = None + if result.magnet_url and result.magnet_url.startswith("magnet:"): + download_url = result.magnet_url + elif result.torrent_url: + cache = TorrentCache(bot_cfg.torrent_cache_max or 10) + magnet = await cache.get_magnet(result.torrent_url) + if magnet: + download_url = magnet + + if not download_url: + try: + await query.answer("无可用链接", show_alert=True) + except Exception: + pass + return + + chat_id = query.message.chat.id + file_name = result.title[:30] + "..." if len(result.title) > 30 else result.title + + DOWNLOAD_INFO[chat_id] = { + "result": result, + "index": index, + "cmid": cmid, + "path": path, + "tool": tool, + "url": download_url, + "file_name": file_name + } + + text, keyboard = await build_download_confirm_message(chat_id, DOWNLOAD_INFO[chat_id]) + await query.message.edit_text(text, reply_markup=keyboard, parse_mode="Markdown") + return def register_handlers(app: Application):