All checks were successful
continuous-integration/drone/push Build is passing
- 从 README.md 中移除详细的更新日志
- 在 CHANGELOG.md 中统一格式,每个版本包含简要说明和技术细节
- README.md 保持简洁,只包含项目介绍和使用说明
- 更新至 v4.4 版本说明
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
13 KiB
13 KiB
Changelog
v4.4 - 2025-09-14
修复未开始比赛被错误标记为完成
- 🐛 修复未开始比赛被错误标记为完成的问题
- ⏰ 添加时间检查:只有已开始的比赛才能被标记为完成
- 🔧 防止Liquipedia的预设比分导致未来比赛被误标为完成
- 📝 为未来带比分的比赛添加debug日志
技术细节:
- 在
_parse_match()方法中添加时间检查逻辑 - 只有当
match_datetime <= now时才会将比赛标记为完成 - 新增
match_has_started检查,确保只处理已开始的比赛 - 例如:修复了 XG vs PV(16:00 UTC)被误标为 "✓ 0-2" 的问题
v4.3 - 2025-09-13
修复标题多重比分问题
- 🐛 修复多重比分累积:解决了标题中出现多个比分的问题(如 "✓ 2-0 1-0")
- 🔧 改进比分清理逻辑:现在能正确清理所有位置的比分,不只是开头
- ✅ 修复了9个历史事件的标题格式
技术细节:
- 🐛 修复多重比分累积问题:
- 修复了
update_event_with_score()和update_event_with_result()方法中的比分清理逻辑 - 原问题:正则表达式
^(\d+[-:]\d+\s+)+无法匹配带有✓标记的标题,导致比分不断累积 - 现在使用
\d+-\d+\s+清理所有比分,不限于开头位置 - 修复了9个历史事件的标题(如 "✓ 2-0 1-0" 改为 "✓ 2-0")
- 修复了
v4.2 - 2025-09-13
智能合并重复比赛
- 🔀 智能合并重复比赛:自动检测同时间具有共同队伍的比赛并合并(处理队伍名称变体)
- 📝 队伍名称标准化:当发现 "OG" 和 "OG Esports" 这样的变体时,保留更长的完整名称
- ⚡ 优化数据获取:在获取数据时即进行去重,减少后续处理的复杂度
技术细节:
- 🔀 智能合并重复比赛:
- 新增
_merge_duplicate_matches()方法 - 自动检测同时间(30分钟窗口)具有共同队伍的比赛
- 当发现两场比赛在同一时间且共享一个队伍时,认为是同一场比赛的不同表示
- 例如:将 "Team Liquid vs OG" 和 "Team Liquid vs OG Esports" 合并为一场比赛
- 新增
- 📝 队伍名称标准化:
- 保留更长的队伍名称作为正式名称
- 解决了队伍名称变体问题(如 "OG" vs "OG Esports")
- 避免因队伍名称不一致导致的重复事件
- ⚡ 优化处理流程:
- 在
fetch_all_matches()后立即进行合并处理 - 减少后续同步过程中的重复检查
- 提高整体同步效率
- 在
v4.1 - 2025-09-13
修复TBD事件重复问题
- 🐛 修复TBD事件匹配逻辑:现在可以正确识别并更新部分TBD事件(如 "TBD vs Team" 或 "Team vs TBD")
- 🔧 增强TBD事件清理:删除所有与确认比赛同时间的TBD事件,不再限于 "TBD vs TBD" 格式
- 🎯 防止创建重复事件:改进事件匹配算法,确保TBD事件被更新而非创建新事件
技术细节:
- 🐛 修复TBD事件匹配逻辑:
- 修复了
find_existing_event()方法中的TBD匹配逻辑 - 原问题:只匹配 "TBD_TBD" 事件键,不匹配 "TBD_NGX" 或 "PV_TBD" 等部分TBD事件
- 现在可以正确识别并更新所有包含TBD的事件("TBD vs Team" 和 "Team vs TBD")
- 防止创建重复事件,确保TBD事件被更新而非创建新事件
- 修复了
- 🔧 增强TBD事件清理:
- 修复了
clean_duplicate_and_expired_events()方法的清理逻辑 - 原问题:只删除 "TBD vs TBD" 格式的事件,导致部分TBD事件无法被清理
- 现在删除所有与确认比赛同时间的TBD事件,不再限于特定格式
- 成功清理了9月13日的3个重复TBD事件
- 修复了
- 🎯 问题根源分析:
- 发现问题:同一时间存在 "TBD vs NGX" 和 "XG vs NGX" 重复事件
- 根本原因:TBD事件没有被正确更新,而是创建了新的确认事件
- 解决方案:改进事件匹配算法,支持部分TBD匹配和时间窗口匹配
v4.0 - 2025-09-05
代码结构重构与错误处理优化
- 🏗️ 代码结构重构:使用 dataclass 替代字典,提高类型安全性
- 🔄 增强错误处理:添加自动重试机制(指数退避)
- 📝 专业日志系统:使用 Python logging 模块,支持多级别日志
- 🛡️ 优雅降级:部分失败不影响整体同步流程
- ⚡ 代码模块化:拆分大函数,提高可维护性
技术细节:
- 🏗️ 代码结构重构:
- 使用
@dataclass替代字典存储比赛数据,提高类型安全性 - 拆分大函数
sync_matches_to_calendar()为多个专门的方法 - 新增
process_upcoming_matches()处理即将进行的比赛 - 新增
process_completed_matches()处理已完成的比赛 - 新增
clean_duplicate_and_expired_events()清理重复和过期事件 - 提取
find_existing_event()统一事件查找逻辑
- 使用
- 🔄 增强错误处理:
- 实现
retry_on_exception装饰器,提供指数退避重试机制 - 所有网络请求(Liquipedia 和 Google Calendar API)都支持自动重试
- 单个比赛处理失败不影响整体同步流程(优雅降级)
- 实现
- 📝 专业日志系统:
- 使用 Python
logging模块替代print语句 - 支持多级别日志(DEBUG, INFO, WARNING, ERROR)
- 添加时间戳和详细的异常堆栈信息
- 支持通过命令行参数调整日志级别
- 使用 Python
- ⚡ 性能和可维护性:
- 提取重复代码为独立方法(
_extract_score(),_extract_format(),_extract_tournament()) - 改进的错误报告和调试信息
- 更好的代码组织和模块化设计
- 提取重复代码为独立方法(
v3.9 - 2025-09-12 - 增强TBD事件清理功能
- 自动删除已结束的TBD事件:
- 检查事件的结束时间,如果已过且仍包含TBD则自动删除
- 避免日历中保留已过期但未更新的TBD占位符
- 例如:删除已结束的 "BB vs TBD"、"Tidebd vs TBD" 等事件
- 智能删除TBD vs TBD占位符:
- 当同一时间段(30分钟窗口)存在确认的比赛时,自动删除TBD vs TBD事件
- 解决了TBD vs TBD与确认比赛重复的问题
- 例如:9月11日的多个TBD vs TBD事件被正确清理
- 改进的事件分组逻辑:
- 按30分钟时间窗口分组事件,更准确地识别同时间的比赛
- 优化了TBD事件与确认比赛的匹配算法
v3.8 - 2025-09-08 - 修复重复比分显示问题
- 修复标题中重复比分的问题:
- 修复了在更新比赛比分时可能出现重复比分的bug(如 "0-2 0-1")
- 改进了
update_event_with_score方法,使用更强的正则表达式清理多个比分 - 改进了
update_event_with_result方法,先清理所有旧比分再添加最终比分
- 增强比分更新逻辑:
- 进行中比分更新时会正确移除之前的所有比分
- 完成比赛更新时会先清理进行中的比分,再添加最终结果
- 确保标题中始终只显示一个比分
v3.7 - 2025-09-08 - 增强重复事件处理和TBD管理
- 改进TBD比赛ID生成:
- TBD vs TBD比赛现在使用时间戳生成唯一ID,避免重复创建
- 普通比赛继续使用队伍+锦标赛组合生成ID
- 自动删除被取代的TBD事件:
- 当同一时间段存在确定的比赛时,自动删除对应的TBD占位符
- 例如:XG vs Tundra确定后,自动删除XG vs TBD事件
- 使用30分钟时间窗口匹配相近时间的事件
- 重复比赛清理功能:
- 自动检测同一天同队伍的重复比赛
- 优先保留已完成的比赛,删除未完成的重复事件
- 修复了NGX vs Liquid等比赛的重复问题
- 增强的重复事件检测:
- 按30分钟时间窗口分组事件
- 自动删除同时间的重复TBD事件
- 改进了过期TBD事件的清理逻辑
- 改进TBD事件更新逻辑:
- 只在队伍确定时才尝试更新TBD事件(避免TBD vs TBD互相匹配)
- 保持1小时的时间窗口用于TBD事件匹配
v3.6 - 改进TBD比赛处理机制
- 放宽TBD比赛时间匹配条件:
- 将TBD事件匹配的时间窗口从5分钟扩大到1小时
- 更好地处理比赛时间调整的情况
- 添加时间差异显示,方便调试
- 自动删除过期TBD事件:
- 新增
delete_calendar_event()方法 - 自动检测并删除超过2小时的过期TBD事件
- 避免日历中积累无效的占位事件
- 新增
- 增强的TBD事件管理:
- 跟踪已更新的TBD事件,避免误删
- 在同步摘要中显示删除的TBD事件数量
v3.5 - 修复TBD比赛标记问题
- 修复TBD比赛错误标记为完成:
- 修改比分解析逻辑,只匹配破折号而不匹配冒号
- 避免将时间(19:00)误识别为比分
- 添加日期格式检查,防止误识别
- TBD比赛保护机制:
- 确保TBD vs TBD的比赛永远不会被标记为有比分或已完成
- 如果错误解析了TBD比赛的比分,会自动删除
- 增强比分验证逻辑
v3.4 - 修复重复事件问题
- 修复进行中比赛更新创建重复的问题:
- 改进事件匹配逻辑,增强基于队伍名称的查找
- 即使比分变化也能正确识别同一场比赛
- 避免在比分更新时(如从 1-0 到 1-1)创建新事件
- 新增重复事件清理工具:
- 添加
cleanup_duplicates.py用于查找和删除重复事件 - 添加
delete_duplicates.py用于手动清理特定重复
- 添加
- 增强的事件查找机制:
- 不仅通过 ID 查找,还通过 team+tournament 组合查找
- 支持忽略比分差异的模糊匹配
- 改进对时间变更和 TBD 更新的处理
v3.3 - 支持进行中比赛的实时比分
- 使用 BeautifulSoup 解析 HTML 结构:
- 重写了
_parse_match方法,使用 DOM 结构而非正则表达式 - 准确提取队名、比分、赛制和锦标赛信息
- 解决了 "Aurora1:0(Bo3)YkBros" 格式的解析问题
- 重写了
- 区分系列赛进行中和已完成状态:
- 新增
has_score标记,表示比赛是否有比分 - Bo3 需要 2 胜才标记为完成,Bo5 需要 3 胜
- 进行中的比赛显示当前比分(如 1-0),但不显示✓标记
- 新增
- 新增进行中比分更新功能:
- 添加
update_event_with_score方法处理进行中比赛 - 在日历标题显示实时比分(如 "1-0 Team1 vs Team2")
- 在描述中添加 "📊 CURRENT SCORE" 标记
- 添加
- 扩展处理时间范围:
- 处理最近 12 小时内的比赛,捕获正在进行的比赛
- 确保进行中的比赛比分能及时同步
v3.2.1 - 修复比分识别问题
- 修复错误的比分解析:
- 修复了将日期时间误识别为比分的问题(如 "19-00")
- 改进比分识别逻辑,只在包含 "vs" 的上下文中查找比分
- 添加比分范围验证(0-5),排除不合理的数值
- 增强时间模式识别,避免将时间戳识别为比分
v3.2 - TBD 比赛优化
- 智能去重机制:
- 相同时间、相同轮次的多个 TBD 比赛只保留一个代表
- 避免日历中出现大量重复的 TBD 条目
- TBD 比赛自动更新:
- 当 TBD 比赛的队伍确定后,自动更新对应的日历事件
- 通过时间和锦标赛信息智能匹配 TBD 事件
- 新增
update_event_with_teams方法专门处理队伍更新
- 改进的事件匹配逻辑:
- 三层匹配机制:ID 匹配 → 队伍+锦标赛匹配 → 时间+锦标赛匹配
- 确保 TBD 比赛更新后仍能正确跟踪
v3.1 - 格式优化更新
- 新的标题格式:
- 之前:
Dota 2 - The International 2025: Team1 vs Team2 - 现在:
Team1 vs Team2 [The International 2025]
- 之前:
- 简化的完成标记:
- 之前:
[COMPLETED] Dota 2 - Tournament: Team1 vs Team2 - 现在:
✓ 2-0 Team1 vs Team2 [Tournament]
- 之前:
- 移除了 "Dota 2" 字样,让日历更简洁
- 比分紧跟在✓后面,更加紧凑
v3.0 - 时间变更检测
- 新增比赛时间变更自动检测
- 当赛程调整时自动更新日历
- 支持
--no-time-updates参数跳过时间更新
v2.0 - 比赛结果更新
- 自动获取已完成比赛的结果
- 更新日历事件显示比分和获胜队伍
- 支持
--no-results参数跳过结果更新
v1.0 - 基础同步
- 从 Liquipedia 获取 Tier 1 比赛
- 同步到 Google Calendar
- 避免重复添加
- 支持 dry-run 模式
功能对比
| 版本 | 同步比赛 | 更新结果 | 时间变更 | 新格式 | TBD优化 | 实时比分 |
|---|---|---|---|---|---|---|
| v1.0 | ✓ | ✗ | ✗ | ✗ | ✗ | ✗ |
| v2.0 | ✓ | ✓ | ✗ | ✗ | ✗ | ✗ |
| v3.0 | ✓ | ✓ | ✓ | ✗ | ✗ | ✗ |
| v3.1 | ✓ | ✓ | ✓ | ✓ | ✗ | ✗ |
| v3.2 | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ |
| v3.3 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| v3.4 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| v3.5 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| v3.6 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| v3.7 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| v3.8 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| v3.9 | ✓ | ✓ | ✓ | ✓ | ✓+ | ✓ |
| v4.0 | ✓ | ✓ | ✓ | ✓ | ✓+ | ✓ |
| v4.1 | ✓ | ✓ | ✓ | ✓ | ✓++ | ✓ |
| v4.2 | ✓ | ✓ | ✓ | ✓ | ✓++ | ✓ |
| v4.3 | ✓ | ✓ | ✓ | ✓ | ✓++ | ✓ |
| v4.4 | ✓ | ✓ | ✓ | ✓ | ✓++ | ✓ |
使用建议
推荐使用最新的 v4.4 版本,它修复了未开始比赛被错误标记为完成的问题:
python sync_dota2_matches.py --calendar-id "YOUR_CALENDAR_ID"
调试模式:
python sync_dota2_matches.py --calendar-id "YOUR_CALENDAR_ID" --log-level DEBUG