Open
Conversation
Front Matter: - tags 保持英文,其他字段改为中文(标题/源/作者主页/创建时间/发布时间/平台/类别/阅读状态/整理) - 修复 _normalize_publish_time 使用 fromisoformat 替代错误的切片逻辑 - 支持 ISO 8601 带时区偏移格式(+08:00) Server 核心修复: - 视频下载任务使用 download_video_async 而非 download_image_async(修复视频从未正确下载的bug) - build_markdown 返回 4 元组(image_tasks, video_tasks 分离) - _handle_config_update 加锁深拷贝,修复线程安全竞态 Extension 修复: - background.js save_tweet 中 /config 请求使用 serverBase 快照而非全局变量 - options.js filename_format 默认值与 server DEFAULT_CONFIG 对齐 - content.js 所有 Twitter/X 消息添加 platform 字段 测试: - 66 个测试全部通过(23 + 43) - 更新所有 build_markdown 调用为 4 返回值解包 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
新增功能: - 评论/回复提取: LinuxDo (Discourse JSON API) + Twitter/X 回复 - 支持 details 折叠 / heading 标题两种显示模式 - 支持楼层范围过滤 (如 "1-10" 或 "2,5,8") - 默认关闭,需手动启用 - iframe 嵌入模式: YouTube/Bilibili 视频可选 iframe 嵌入或本地下载 - embed_mode 配置: "iframe" / "local" - 自动识别 youtube.com/youtu.be/bilibili.com 链接 - Discourse 可配置域名: 支持添加任意 Discourse 论坛 - 动态注册 content scripts (chrome.scripting API) - optional_host_permissions 按需申请权限 - 自动检测站点类型 (Discourse/非Discourse) - 设置面板新增: 评论设置卡片 + Discourse 域名管理 + 嵌入模式选择 测试覆盖: - test_new_features.py: 57 项新增功能测试 (全通过) - test_full.py: 44 项核心功能测试 (全通过) - test_obsidian_render.py: 51 项 Obsidian 渲染测试 (全通过) - 总计 152 项测试全部通过 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
新增飞书文档一键复制功能(opt-in),支持只读/禁止复制的飞书文档: - 三策略内容提取:API → 滚动收集 → DOM兜底 - 输出 Obsidian 兼容 Markdown(图片URL链接、视频iframe嵌入) - 剪贴板写入双重降级(Clipboard API → execCommand) - 自动解除飞书CSS/JS复制保护 - 标题#字符转义防止Markdown格式破坏 - URL括号编码防止图片链接断裂 扩展 site_actions 浮动保存按钮支持微信公众号页面 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
单击点赞按钮:拦截点赞行为,自动保存帖子到OB 双击点赞按钮:恢复原始点赞功能,不保存 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
同一帖子/评论在当前会话内只保存一次,重复点击会提示"已保存过" Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 点赞主帖:保存主帖 + 全部评论(不变) - 点赞评论:保存主帖 + 该评论 + 回复该评论的所有内容 - 不再保存不相关的评论 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- server.py: _normalize_publish_time 支持ISO8601/RFC2822/通用格式转北京时间 - 平台名: Feishu→飞书, WeChat→微信公众号, LinuxDo→LINUX DO - options.html: 平台文件夹配置同步更新 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Twitter/X: 从GraphQL API提取推文#hashtags - LINUX DO/Discourse: 从topic JSON提取帖子标签(tags) - 微信公众号: 从og:article:tag meta标签提取 - server.py: 合并tags+hashtags去重,写入frontmatter tags字段 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
新增功能:
- 飞书多维表格保存(含附件上传 MD/HTML)
- Notion Database 保存(含内容块批量写入)
- HTML 文件导出(Markdown 转 HTML,GitHub 风格样式)
- 三套主题的 Options 设置页重构
- manifest v1.5.0,新增 downloads/飞书/Notion host 权限
架构重构:
- 提取 dispatchMultiTargetSave() 共享函数,save_tweet 和 force_save_tweet 统一调用
- dispatchMultiTargetSave 支持传入已获取的 cfg,避免重复网络请求
- 显式传递 cfg 字段到各 handler,防止 Object spread 键冲突
- content.js handleSaveResponse 支持多目标结果格式
错误处理审计修复(10项):
- [HIGH] 修复飞书 Token 过期重试死代码(classifyFeishuError 返回中文但匹配英文)
- [MED] get_config 增加 resp.ok 检查,防止非 JSON 响应 SyntaxError
- [MED] dispatchMultiTargetSave 使用浅拷贝 enriched,不再原地污染调用方 data
- [MED] 所有目标禁用时返回明确错误信息而非静默 success:false
- [MED] handleSaveToFeishu/Notion 增加必填字段前置验证
- [LOW] handleDownloadHtml 空文件名回退 untitled
- [LOW] convertMarkdownToHtml 未关闭代码块自动补全 + 500KB 截断保护
- [LOW] HTML 导出 btoa 超 2MB data URL 安全检查
- [LOW] 消息 handler 清理 message.data||message 为 message.data||{}
- [LOW] Notion page.id 创建后 null 检查
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
CRITICAL安全修复: - sender验证: onMessage添加sender.id检查,阻止第三方扩展消息 - XSS防护: DOMParser替代innerHTML写入(discourse.js) - XSS防护: popup.js全部改用textContent/DOM API - postMessage origin: feishu.js改用location.origin替代"*" - SSRF防护: options.js Discourse域名禁止内网地址 - 数据结构: fetchDiscourseReplies返回结构化对象(非数组属性) HIGH修复: - SYNC_FIELDS去重: 移除重复定义,统一到顶层常量 - 表格转换去重: 提取共享convertTableToGfm到dom_utils.js - convertMarkdownToHtml重写: 支持Obsidian任务列表、修复列表排序 MEDIUM修复: - Markdown链接转义: 新增escapeMdLinkText/escapeMdLinkUrl共享函数 所有转换器(discourse/feishu/wechat/article_markdown)统一使用 - 运算符优先级: 添加括号明确逻辑(3处) - async关键字: 移除options.js中无await的async声明 LOW修复: - 日志管理: 23处console.log替换为debugLog(X2MD_DEBUG开关控制) - debugLog递归修复: 函数体正确调用console.log而非自身 - bold+italic重叠: feishu.js支持***text***格式 全部35个测试通过,0失败。 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
server.py 的 ALLOWED_CONFIG_KEYS 白名单缺少这些字段, 导致 options 页面保存时这些配置被服务端静默丢弃。 新增白名单字段: - enable_copy_unlock(一键复制按钮) - feishu_* 系列(飞书 Bitable 配置) - notion_* 系列(Notion Database 配置) - html_export_folder(HTML 导出目录) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
X/Twitter 推文中常见 hashtag(如 #山东 #高中语文老师),这些 # 号 会保留在文件名中,导致 Markdown 图片引用路径被解析为 anchor fragment, Obsidian 找不到对应的图片文件。 修复: - sanitize_filename 增加过滤 #、%、[、] 等 Markdown/URL 特殊字符 - 图片路径含空格时用尖括号包裹,确保解析正确 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
上次修改误判了问题根因,实际问题不是 # 号导致路径断裂, 而是图片附件的目录层级引用问题。先还原,后续针对真实问题修复。 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Obsidian 对标准 Markdown 链接路径的解析规则: - 附件/xxx.jpg → 从仓库根目录解析(错误) - ./附件/xxx.jpg → 从当前文件位置解析(正确) 开启平台分类文件夹后,.md 文件在 Twitter/ 子目录下, 图片也保存在 Twitter/附件/ 下,但不带 ./ 前缀时 Obsidian 会去根目录的 附件/ 文件夹找图片,导致引用断裂。 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
核心改动: - 新增微信视频号视频保存开关(默认关闭),可在选项面板勾选启用 - 选项面板从13+卡片重构为9个逻辑分组,减少臃肿 - 修复 PyInstaller 打包缺少 zoneinfo/tzdata 导致 Win/Mac 构建崩溃 - 飞书 feishu-image:// 协议图片替换为说明文本(避免 Obsidian 渲染失败) - HTML 导出支持 [MEDIA_VIDEO_URL] 占位符和 ![[]] wiki-link 渲染 - CI Python 从 3.13 降级到 3.12 提升 PyInstaller 兼容性 - config.json 移除硬编码 Linux 路径 - 北京时间处理增加 timezone(timedelta) 回退方案 - 5轮回归测试通过(187测试/0失败) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
主要变更: - 修复 PyInstaller 打包后 ZoneInfo 时区数据缺失导致保存失败 - get_config 改用 getCachedConfig() 缓存优先策略 - 飞书表格 GFM + HTML 双格式渲染 (renderTableDualFormat) - 飞书 API 模式智能列表合并(连续列表项紧凑排列) - 微信公众号增强:视频号开关、媒体占位符清理 - 标题截断后空标题 fallback 处理 - config.json 补全所有选项面板字段默认值 - build_markdown 异常增加完整 traceback 日志 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
基于 Issue #1 的讨论,提交全面的功能增强和 Bug 修复 PR。
核心修复
HTTPServer改为ThreadingHTTPServer,支持多标签页同时保存_config_lock/_save_lock双锁保护配置和文件写入download_video_async而非错误地走图片下载_normalize_publish_time:使用fromisoformat替代错误的切片逻辑,支持+08:00时区Front Matter 中文化
Extension 修复
background.js:所有 handler 快照SERVER_BASE,防止并发修改background.js:GraphQL discovery 去重(_graphqlInflightMap)content.js:所有 Twitter/X 消息添加platform字段options.js:filename_format默认值对齐 server、sync 默认开启popup.js:动态端口显示discourse.js:平台名 "LinuxDo" 统一其他修复
setup_wizard.py:Windows 文件对话框缩小问题(parent=self.root){handle}/{timestamp}文件名变量实现feishu-image://协议跳过下载author_url空字符串处理download_images/enable_platform_folders默认值修正为True测试
Test plan
python3 test_full.py— 23/23 PASSpython3 test_obsidian_render.py— 43/43 PASSGenerated with Claude Code