FOMOD数据库浏览器 - MO2插件
一个读取由Mod Organizer 2生成的`fomod.db`文件的插件。
FOMOD Plus - Mod Organizer 2 的模组安装全面革新 并在可搜索、可折叠的网页界面中显示所有已知的FOMOD模组及其选项。
AI协助与测试
此插件在AI助手的帮助下开发,并在受控环境(我的个人电脑)中进行测试。
若您在游戏过程中遇到任何问题、漏洞或异常情况,欢迎随时留言反馈。
我为什么制作这个
我创建了这个工具,是为了方便检查已安装的模组中是否有哪个未来可能需要兼容性补丁,而无需逐一手动浏览每个FOMOD安装程序来查看是否存在补丁。
特色功能
- 层级浏览器: Mods -> Steps -> Groups -> Options(所有部分均可独立折叠/展开,并提供全部展开/全部折叠按钮)
- 实时搜索 跨模组名称、步骤、分组和选项名称(已做防抖处理,无需按回车键)
- 筛选 按选择状态(已选择/可选/已取消选择)和类型模式(必需/推荐/可选/不可用)分类
- 找到补丁选项卡输入模组名称,即可在数据库中所有FOMOD中查找提及该模组的每个选项——非常适合查看哪些FOMOD包含特定模组的兼容补丁。
- 依赖分析器选项卡 (新增于v1.2.0):一键工具,可构建模组依赖关系的定向无环图(DAG),并检查每个FOMOD选项所需的前置插件与当前已激活插件是否匹配。高亮显示缺失的依赖(暂时无法使用的补丁),并检测可能导致安装顺序问题的循环依赖。
- .esp/.esm 文件名搜索 在依赖分析器(v1.2.2新增功能)内:按插件文件名筛选缺失依赖结果,支持基于令牌的匹配(例如“Cloaks”可同时匹配“Cloaks.esp”和“Cloaks of Skyrim.esp”)
- 状态筛选下拉框 在依赖分析器(v1.2.3新增)中:可在“全部选项”、“仅缺失的主文件”或“仅全部正常的主文件”之间快速切换。
- 可点击的Nexus Mods链接 (新增于v1.3.0):每个模组的Nexus ID都是可点击的链接,点击后会在新的浏览器标签页中打开该模组的Nexus页面——在全部三个标签页(浏览模组、查找补丁、依赖分析器)中均适用
- 属性栏 包含模组数量、总选项数、按状态分类的明细以及数据库大小
- 状态栏 顶部显示插件版本、当前数据库文件以及自动刷新开关(始终可见,不隐藏在页脚中)
- 智能自动刷新 此功能会在您积极使用页面(点击、打字、滚动)时暂停计时,并在您停止操作30秒后恢复。同时,当页面处于后台标签页时会跳过刷新。刷新时会保留您的滚动位置。
- 重新加载数据库按钮 无需重启MO2即可重新检测fomod.db
- 多语言支持 (开箱即支持英语和西班牙语;将JSON文件放入translations/文件夹即可添加更多语言)
- 无外部依赖 — 纯 Python + 内嵌 HTML/CSS/JS
- 隐私友好 — 绝不在界面或日志中暴露你的完整文件路径(仅显示文件名)
- 稳健的插件检测: 兼容任何MO2设置(便携版、分离安装/实例、自定义工作目录),得益于多位置文件搜索和多种API回退方法
要求
- Mod Organizer 2 (2.5.2)
- 一个 `fomod.db` 文件(当你使用 FOMOD 安装程序安装任何模组时,FOMOD+ 会自动创建此文件)
安装
将 `fomod_db_explorer.py` 复制到你的 MO2 `plugins/` 文件夹中(即 `fomod_plus_installer.dll` 所在的文件夹——通常与 `ModOrganizer.exe` 位于同一目录)。
2.
(可选,面向非英语用户) 从`translations/`文件夹中将JSON文件复制到`<MO2>/translations/`中。插件会自动检测你的MO2语言并加载对应的文件。如果没有匹配的文件,则使用英文。
3. 重启MO2。
4. 通过以下方式打开插件:
工具 菜单 →
FOMOD 数据库浏览器.浏览器窗口将在`http://127.0.0.1:8080`(或下一个可用端口,直至8089)打开。
运作方式
插件直接读取`fomod.db`(FOMOD+维护的JSON文件)。它会在多个位置搜索该文件,以支持所有MO2设置类型(便携式、分离安装/实例、自定义工作目录):
<basePath>/fomod.db — MO2实例目录(mods/下载内容所在位置)
2. `<cwd>/fomod.db` — MO2 安装目录(即 `ModOrganizer.exe` 所在位置)
3. 位于 `fomod_plus_installer.dll` 旁边
4. `<cwd>/logs/fomod.db`
5. `<pluginsPath>/fomod.db`
使用找到的第一个。如果不存在,界面会显示空状态,并带有“重新加载数据库”按钮,以便在安装 FOMOD 后重试。
可见指示器 + 手动切换
在页脚中,您会看到一个指示器,它有3种可能的状态:
- 🟢 ▶ 自动刷新:开 — 活跃中,等待闲置
- 🟠 ⏸ 自动刷新已暂停(进行中) — 因您在活跃使用页面而暂停 (默认)
- ⚪ ⏸ 自动刷新:关闭 — 已手动禁用
点击指示器文字,可随时开启或关闭自动刷新。
翻译(i18n)
该插件自带英文和西班牙文翻译。如需添加您自己的语言:
- 将 `translations/fomod_db_explorer_en.json` 复制到 `translations/fomod_db_explorer_<你的语言>.json`(例如,德语为 `fomod_db_explorer_de.json`,法语为 `fomod_db_explorer_fr.json`,以此类推)。
- 翻译这些值(键必须保持不变)。
- 将文件放入`<MO2>/translations/`目录下。
- 重启MO2。
插件按以下顺序自动检测语言:
- MO2的`language`/`locale`设置(通过`IOrganizer.setting()` API)
- `ModOrganizer.ini` 的 `[Settings]` 部分
- 系统区域设置
- 回退到英文
如果检测语言的翻译文件缺失,则使用英语。如果翻译文件中缺少个别键值,则这些键值将回退使用英语值。
文件结构(用于分发)
插件/
fomod_db_explorer.py <- 主插件文件(放在plugins/目录下)
translations/
fomod_db_explorer_en.json <- 英语(默认/备用)
fomod_db_explorer_es.json <- 西班牙语
fomod_db_explorer_<lang>.json <- 在此处添加更多语言
隐私
- 插件
从不 在Web界面或弹窗提示中暴露了您的完整文件系统路径。仅显示文件名(例如 `fomod.db`)。
- 网络服务器仅绑定到 `127.0.0.1`(本地主机)——局域网中的其他计算机无法访问。
- 无遥测,无网络请求,无分析。
故障排除
该插件未出现在“工具”菜单中- 请确保该文件位于正确的 `plugins/` 文件夹中(即 `ModOrganizer.exe` 旁边的那个,而不是实例文件夹)。
- 完全重启 MO2(检查任务管理器,确保没有残留的 `ModOrganizer.exe` 进程)。
- 请查看 `<MO2>/fomod_db_explorer_debug.txt` 中的错误信息。
未找到FOMOD数据库确保已安装 FOMOD+,且 `fomod_plus_installer.dll` 文件存在。
- 安装至少一个带有 FOMOD 安装器的模组——这会创建 `fomod.db`。
- 点击界面中的“重新加载数据库”按钮。
浏览器已打开,但显示的内容不正确。如果之前的MO2会话在8080端口留下了僵尸网络服务器,就会出现这种情况。请完全关闭MO2(检查任务管理器),关闭所有指向`127.0.0.1:8080`的浏览器标签页,然后重新启动MO2。
插件的语言与我的MO2语言不匹配验证翻译文件存在于`<MO2>/translations/fomod_db_explorer_<lang>.json`。
- 请检查 `<MO2>/fomod_db_explorer_debug.txt` 中的 `[I18N]` 条目 — 它们会显示检测到的语言以及加载的文件。
许可证
此插件按原样提供给MO2社区。欢迎分叉、修改和重新分发。
制作人员名单
专为相辅相成而设计
FOMOD Plus——Mod Organizer 2的模组安装全面革新 由
田野间的微光 .
受浏览FOMOD选项而无需重新运行安装程序的需求启发。
更新日志
FOMOD数据库浏览器插件的所有显著变更均记录于此。
[1.3.2] — 2026-08-04
已添加
- 按需启动服务器:通过start_server_on_mo2_startup设置(布尔值,默认false)控制。当为false时(新默认值),MO2启动时web服务器不会启动——仅在你通过“工具 -> FOMOD数据库浏览器”打开插件时才启动。这意味着当你不需要时,服务器不会在后台运行消耗资源。当为true时,服务器会在MO2启动时启动(即之前的行为)。
- 通过auto_shutdown_when_idle设置(布尔值,默认true)在空闲时自动关机。页面打开时,浏览器每20秒向服务器发送一次心跳。关闭浏览器标签页后,心跳停止,经过配置的空闲超时时间后服务器自动关闭。设为false可让服务器无限期运行。
- 通过idle_shutdown_timeout设置可配置空闲超时时间(整数,默认60秒,限制在30-3600之间)。控制服务器在无心跳信号后等待多久才关闭。
- 新增 /heartbeat HTTP 端点,浏览器每 20 秒调用一次以保持服务器活跃。
- 服务器现在可以按需关闭并重新启动。在关闭后调用display()时,服务器会在相同或新的端口上干净地重启。
已更改
- 默认行为已更改:开箱即用时,服务器现在仅在您打开插件时启动(而非在MO2启动时),并在您关闭浏览器标签页60秒后关闭。这比之前的常驻行为更节省资源。如果您偏好旧行为,请设置start_server_on_mo2_startup=true和auto_shutdown_when_idle=false。
- 状态栏、/ping HTTP端点、MO2插件元数据以及两个翻译文件中的版本均已提升至1.3.2。
- README已更新,设置表中记录了三个新设置,并新增“默认行为”部分,说明了开箱即用的生命周期。
[1.3.1] — 2026-08-04
已添加可通过MO2插件设置配置调试日志(工具 -> 设置 -> 插件 -> FOMOD数据库浏览器):
- debug_enabled(布尔值,默认true):设为false可完全禁用调试日志记录——将不会生成任何fomod_db_explorer_debug.txt文件。
- debug_rotation (字符串,默认值“daily”):控制调试日志随时间增长的方式。三种模式:
- 每日 — 当日日期变更时,旧日志会重命名为 fomod_db_explorer_debug_YYYY-MM-DD.txt,并开始记录新日志。这样可防止文件无限增大,同时按日保留历史日志。
- 绝不——日志文件会在每次MO2启动时被覆盖(截断)。仅保留当前会话的日志。
- 无限 — 始终追加(原始行为)。日志将无限制地增长。
- 可通过web_server_port设置配置Web服务器端口(整数,默认值0):
- 0 = 自动端口选择(尝试8080、8081、……、8089——原始行为)
- 1-65535 = 优先尝试指定端口。如果该端口已被其他进程占用,插件将自动从该端口起向上选择可用端口。
已变更- 状态栏中的版本已更新至1.3.1,包括/ping HTTP端点、MO2插件元数据以及两个翻译文件。
[1.3.0] — 2026-07-31已添加- 可点击的Nexus Mods链接: Mods浏览页、补丁查找页和依赖分析器页中的Mod ID现在是可点击的链接,点击后会在新浏览器标签页中打开该Mod的Nexus Mods页面。链接仅对拥有有效(非零)Nexus ID的Mod显示。点击链接不再触发父级Mod卡片的展开或折叠。
已改变- 版本升级至1.3.0 在状态栏中,/ping HTTP端点、MO2插件元数据以及两个翻译文件。
[1.2.3] — 2026-07-31已更改- 依赖分析器中的更智能搜索: .esp/.esm过滤器框现在会将查询拆分为以空格分隔的标记,并针对选项的主文件名(包括缺失和现有的)将每个标记作为子字符串进行匹配。此前,整个查询字符串必须完全一致出现,因此搜索“Cloaks”无法匹配“Cloaks of Skyrim.esp”。现在“Cloaks”能同时匹配两者,而“Cloaks skyrim”仅匹配其主文件中同时包含这两个词(顺序不限)的选项。
新增- 状态筛选下拉框 在依赖分析器中,有三个选项:
- 所有选项 (default) — 显示所有内容
- 独缺大师 — 仅显示至少缺少一个主文件的选项(红色X标记的)
- 只有万事通晓的大师 — 只显示所有必要主技能当前激活(绿色勾选)的选项
- 文本过滤器与状态过滤器采用“与”逻辑组合,因此您可以同时搜索“斗篷”且仅显示缺失项。
- 当筛选器激活时,区域标题现在会实时显示可见选项数与总数的对比(例如“存在缺失依赖的选项 (5 / 967)”)。
[1.2.2] — 2026-07-31固定- 混乱的依赖指示符: :此前,依赖分析器中每个选项名称旁的颜色点反映的是FOMOD的选择状态(已选=绿色),这容易误导用户,因为一个选项可能显示绿点,但其主文件仍有缺失。现在该指示器直接反映依赖状态: 红色X 如果该选项有任何缺失的主控, 绿色勾选 如果所有大师都处于激活状态。“缺少大师:”文本标签旁出现的重复红色X也已移除。
新增- 依赖分析器中的可折叠模组卡片::缺失依赖项部分中的模组卡片现在会在您点击模组标题时展开和收起。A 全部折叠 按钮(其标签可切换至 全部展开) 让你一键折叠或展开所有卡牌。
- .esp/.esm 文件名搜索框 在依赖分析器中,它会实时筛选各个选项行及其父级模组卡片。缺少或含有的主模组不包含搜索词的选项将被隐藏,且没有可见选项的模组卡片会被完全隐藏。
[1.2.1] — 2026-07-31固定- 未检测到启用的插件::某些MO2配置在调用pluginList().activePlugins() Python API时返回了空列表,尽管MO2自身的界面明确显示了活动插件。这导致依赖分析器报告“活动插件:0”,并将每个FOMOD选项的主插件标记为缺失。该插件现在按顺序尝试多种方法,并使用第一个有效的方法:
- pluginList().activePlugins() (原始方法)
- pluginList().allPlugins() + pluginList().state(name) == STATE_ACTIVE(基于状态的回退)
- 直接读取 <basePath>/profiles/<activeProfile>/plugins.txt(基于文件的回退方式,最后也会尝试读取 loadorder.txt)
- 活动档案名称优先通过organizer.profileName()检测,若不可用则回退读取ModOrganizer.ini中的[Settings] selected_profile。
- 所有回退方法都会将哪个方法成功记录到fomod_db_explorer_debug.txt中,以便用户确认修复是否生效。
[1.2.0] — 2026-07-31已添加- 新增“依赖分析器”选项卡 — 一个一键工具,用于构建模组依赖关系的有向无环图(DAG),并对照你当前启用的插件,检查每个FOMOD选项所需的主文件。该工具基于社区建议“通过树状DAG查找缺失依赖,然后列出启用的ESP并与之核对”而设计。
分析包括:
- 汇总统计: 活动插件数量、总选项数、有主文件的选项、全部正常的选项、缺失的选项、无主文件的选项、被引用的唯一主文件、缺失的唯一主文件
- 循环依赖检测:使用深度优先搜索(DFS)查找循环依赖(如模组A需要模组B,模组B又需要模组A)。循环将以完整链路形式列出:A -> B -> C -> A
- 依赖关系图摘要:显示数据库中所有FOMOD选项中最常被依赖的模组(前10名),并包含图表中的模组总数及总依赖关系数。
- 缺少依赖项详细信息:每个至少缺少一个主文件的FOMOD选项都会列出,并按模组分组。对于每个选项,缺失的主文件以红色显示,存在的主文件以绿色显示。
- 后端端点: 新增/analyze_deps.json HTTP端点,以JSON格式返回完整报告
- 空状态处理: 如果未检测到活动插件,工具将显示明确警告,说明所有选项都将显示为缺失。
技术性- 循环检测算法已用5个用例进行测试:无环、简单双节点环(A<->B)、较长三节点环(A->B->C->A)、自环(A->A),以及一个含隐藏环的复杂图。所有用例均通过。
- 依赖图是通过扫描每个模组目录中的.esp/.esm/.esl文件,并将其映射到提供这些文件的模组来构建的,因此循环检测是在模组层面(而非插件层面)进行的。
类别备注
我不是很确定像这样适用于MO2的插件是否应该公开发布。
天际, 因为它目前只经过天际模组的测试。
如果这属于
模组制作工具模组 我会把它移动到那个部分。