🎯 主要更新: - ✅ EPUB CFI 排序: 完整实现 IDPF 规范,笔记按真实位置排序 - ✅ 阅读统计修复: 修复数据结构变更导致的计算错误 - ✅ 界面优化: 清理 CSS 警告,改进按钮交互效果 - ✅ 测试覆盖: CFI 解析、排序、导出全面验证 - ✅ 文档更新: todolist.md, readme.md, release.md 📊 验证数据: - 书籍处理: 660+ 本 - 笔记排序: 232 条按 CFI 正确排序 - 阅读统计: 7天70分钟,30天159分钟,年度12313分钟 🔧 技术改进: - 新增 epub_cfi_parser.py 核心模块 - 数据结构优化: 嵌套字典 → CFI排序列表 - 向后兼容: 平滑升级,不破坏现有功能
278 lines
9.5 KiB
Bash
Executable File
278 lines
9.5 KiB
Bash
Executable File
#!/bin/bash
|
||
# release_fixed.sh
|
||
# ----------------
|
||
# 用途:创建 Gitea Release v1.2
|
||
# 功能:自动提交代码、推送、创建标签和Release
|
||
|
||
set -e # 遇到错误立即退出
|
||
|
||
VERSION="1.2"
|
||
RELEASE_NAME="v1.2 CFI排序与优化版本"
|
||
GITEA_URL="https://biboer.cn/gitea"
|
||
REPO_OWNER="gavin"
|
||
REPO_NAME="iBook"
|
||
|
||
echo "🚀 开始创建 iBooks 笔记专家 v${VERSION} Release"
|
||
echo "================================================"
|
||
|
||
# 1. 检查工作目录状态
|
||
echo "📋 1. 检查工作目录状态..."
|
||
if [ -n "$(git status --porcelain)" ]; then
|
||
echo " 发现未提交的更改,准备提交..."
|
||
git add .
|
||
git status --short
|
||
else
|
||
echo " ✅ 工作目录干净"
|
||
fi
|
||
|
||
# 2. 提交所有更改
|
||
echo ""
|
||
echo "💾 2. 提交v${VERSION}更改..."
|
||
COMMIT_MSG="🎉 Release v${VERSION}: CFI排序系统与界面优化
|
||
|
||
🎯 主要更新:
|
||
- ✅ EPUB CFI 排序: 完整实现 IDPF 规范,笔记按真实位置排序
|
||
- ✅ 阅读统计修复: 修复数据结构变更导致的计算错误
|
||
- ✅ 界面优化: 清理 CSS 警告,改进按钮交互效果
|
||
- ✅ 测试覆盖: CFI 解析、排序、导出全面验证
|
||
- ✅ 文档更新: todolist.md, readme.md, release.md
|
||
|
||
📊 验证数据:
|
||
- 书籍处理: 660+ 本
|
||
- 笔记排序: 232 条按 CFI 正确排序
|
||
- 阅读统计: 7天70分钟,30天159分钟,年度12313分钟
|
||
|
||
🔧 技术改进:
|
||
- 新增 epub_cfi_parser.py 核心模块
|
||
- 数据结构优化: 嵌套字典 → CFI排序列表
|
||
- 向后兼容: 平滑升级,不破坏现有功能"
|
||
|
||
if [ -n "$(git status --porcelain)" ]; then
|
||
git commit -m "$COMMIT_MSG"
|
||
echo " ✅ 代码已提交"
|
||
else
|
||
echo " ℹ️ 无新更改需要提交"
|
||
fi
|
||
|
||
# 3. 推送到远程仓库
|
||
echo ""
|
||
echo "🌐 3. 推送到远程仓库..."
|
||
git push origin main
|
||
echo " ✅ 代码已推送"
|
||
|
||
# 4. 创建并推送标签
|
||
echo ""
|
||
echo "🏷️ 4. 创建版本标签..."
|
||
TAG_NAME="v${VERSION}"
|
||
if git tag -l | grep -q "^${TAG_NAME}$"; then
|
||
echo " ⚠️ 标签 ${TAG_NAME} 已存在,删除旧标签..."
|
||
git tag -d "${TAG_NAME}" || true
|
||
git push origin ":refs/tags/${TAG_NAME}" || true
|
||
fi
|
||
|
||
git tag -a "${TAG_NAME}" -m "${RELEASE_NAME}
|
||
|
||
🎯 重大更新 - EPUB CFI 排序系统
|
||
===============================
|
||
|
||
v1.2 是一个重大功能更新版本,实现了完整的 EPUB CFI 排序系统,
|
||
确保笔记按真实阅读位置排序,同时修复了多个界面和统计问题。
|
||
|
||
主要特性:
|
||
- EPUB CFI 排序: 符合 IDPF 标准的位置排序
|
||
- 阅读统计修复: 准确的时长统计和可视化
|
||
- 界面优化: 清洁的用户体验
|
||
- 全面测试: 真实数据验证
|
||
|
||
技术栈:
|
||
- Python 3.12+
|
||
- PyQt6 GUI
|
||
- SQLite 数据库
|
||
- EPUB CFI 解析
|
||
- Matplotlib 可视化
|
||
|
||
升级说明:
|
||
从 v1.1 升级到 v1.2 完全向后兼容,无需额外配置。"
|
||
|
||
git push origin "${TAG_NAME}"
|
||
echo " ✅ 标签 ${TAG_NAME} 已创建并推送"
|
||
|
||
# 5. 生成 Release Notes
|
||
echo ""
|
||
echo "📝 5. 生成 Release Notes..."
|
||
RELEASE_NOTES="## 🎉 iBooks 笔记专家 v${VERSION} 发布
|
||
|
||
**发布时间**: $(date '+%Y-%m-%d')
|
||
**版本代号**: CFI 排序与优化版本
|
||
|
||
### 🎯 重大更新
|
||
|
||
#### 1. EPUB CFI 排序系统
|
||
- **完整实现 IDPF EPUB CFI 规范**: 按真实文档位置排序笔记,解决之前字符串排序的错误
|
||
- **智能章节识别**: 自动提取章节信息,支持复杂的 CFI 格式
|
||
- **降级处理机制**: CFI 解析失败时自动使用物理位置和创建时间排序
|
||
- **测试覆盖**: 全面的 CFI 解析、排序、导出验证测试
|
||
|
||
#### 2. 阅读统计修复
|
||
- **数据结构适配**: 修复 CFI 实现后的数据兼容性问题
|
||
- **统计准确性**: 7天/30天/年度阅读时长计算恢复正常
|
||
- **图表显示**: 阅读统计图表数据源修复
|
||
|
||
#### 3. 界面与体验优化
|
||
- **样式修复**: 清理 4 个 \"Unknown property filter\" CSS 警告
|
||
- **按钮交互**: 使用原生 Qt 渐变替代不支持的 CSS3 属性
|
||
- **调试信息**: 禁用冗余的控制台输出,保持界面清洁
|
||
|
||
#### 4. 技术架构
|
||
- **新增模块**: \`epub_cfi_parser.py\` - 专门的 CFI 解析引擎
|
||
- **向后兼容**: 保持所有现有功能的完整性
|
||
- **性能优化**: 优化数据处理流程,减少不必要的计算
|
||
|
||
### 📊 验证数据
|
||
|
||
- **书籍处理**: 660+ 本书籍元数据正常
|
||
- **笔记排序**: 232 条笔记按 CFI 位置正确排序
|
||
- **阅读统计**: 7天70分钟,30天159分钟,年度12313分钟
|
||
- **功能验证**: 所有核心功能测试通过
|
||
|
||
### 🔧 技术细节
|
||
|
||
\`\`\`python
|
||
# CFI 排序示例
|
||
原始顺序: [\"/6/22\", \"/6/18\", \"/6/22\", \"/6/18\"]
|
||
CFI 排序: [\"/6/18\", \"/6/18\", \"/6/22\", \"/6/22\"] ✅
|
||
字符串排序: [\"/6/18\", \"/6/2\", \"/6/22\"] ❌ 错误
|
||
\`\`\`
|
||
|
||
### 🚀 升级指南
|
||
|
||
v1.1 → v1.2 升级自动兼容,无需额外配置:
|
||
1. 笔记排序自动切换到 CFI 模式
|
||
2. 阅读统计自动修复数据获取
|
||
3. 界面样式自动更新
|
||
|
||
### 🔗 相关链接
|
||
|
||
- [详细技术文档](readme.md)
|
||
- [CFI 实现总结](CFI_IMPLEMENTATION_SUMMARY.md)
|
||
- [修复总结](FIX_SUMMARY.md)
|
||
- [版本变更](release.md)
|
||
|
||
---
|
||
|
||
**下载**: 克隆此仓库或下载源码包
|
||
**运行**: \`python ibook_export_app.py\`
|
||
**要求**: Python 3.12+, PyQt6, beautifulsoup4"
|
||
|
||
echo "$RELEASE_NOTES" > release_notes_v${VERSION}.md
|
||
|
||
# 6. 创建 Gitea Release (如果有API访问)
|
||
echo ""
|
||
echo "🌐 6. 尝试创建 Gitea Release..."
|
||
|
||
# 自动解析远程URL
|
||
remote_url=$(git config --get remote.origin.url)
|
||
echo " 远程URL: $remote_url"
|
||
|
||
if [[ "$remote_url" =~ ^https://([^/]+)/gitea/([^/]+)/(.+)\.git$ ]]; then
|
||
# HTTPS格式:https://biboer.cn/gitea/gavin/iBook.git
|
||
GITEA_HOST="${BASH_REMATCH[1]}"
|
||
GITEA_USER="${BASH_REMATCH[2]}"
|
||
GITEA_REPO_NAME="${BASH_REMATCH[3]}"
|
||
API_URL="https://${GITEA_HOST}/gitea/api/v1/repos/${GITEA_USER}/${GITEA_REPO_NAME}/releases"
|
||
echo " 解析结果: Host=$GITEA_HOST, User=$GITEA_USER, Repo=$GITEA_REPO_NAME"
|
||
elif [[ "$remote_url" =~ ^ssh://git@([^:]+):([^/]+)/([^/]+)/(.+)\.git$ ]]; then
|
||
# SSH格式特殊端口
|
||
GITEA_HOST="${BASH_REMATCH[1]}"
|
||
GITEA_USER="${BASH_REMATCH[3]}"
|
||
GITEA_REPO_NAME="${BASH_REMATCH[4]}"
|
||
API_URL="https://${GITEA_HOST}/gitea/api/v1/repos/${GITEA_USER}/${GITEA_REPO_NAME}/releases"
|
||
echo " 解析结果: Host=$GITEA_HOST, User=$GITEA_USER, Repo=$GITEA_REPO_NAME"
|
||
else
|
||
echo " ❌ 无法解析远程URL格式: $remote_url"
|
||
echo " 支持的格式:"
|
||
echo " - HTTPS: https://host/gitea/user/repo.git"
|
||
echo " - SSH: ssh://git@host:port/user/repo.git"
|
||
API_URL=""
|
||
fi
|
||
|
||
# 检查是否有 Gitea API Token
|
||
if [ -n "$GITEA_TOKEN" ] && [ -n "$API_URL" ]; then
|
||
echo " 发现 API Token,尝试自动创建 Release..."
|
||
|
||
# 使用简化的英文描述避免编码问题
|
||
SIMPLE_BODY="## iBooks Notes Expert v${VERSION}
|
||
|
||
**Release Date**: $(date '+%Y-%m-%d')
|
||
**Codename**: CFI Sorting & Optimization
|
||
|
||
### Key Features
|
||
- ✅ EPUB CFI Sorting: Implemented IDPF standard for accurate note positioning
|
||
- ✅ Reading Statistics: Fixed 7-day/30-day/yearly statistics calculation
|
||
- ✅ UI Improvements: Cleaned CSS warnings and enhanced button interactions
|
||
- ✅ Test Coverage: Comprehensive CFI parsing, sorting, and export validation
|
||
|
||
### Technical Details
|
||
- New Module: epub_cfi_parser.py - Dedicated CFI parsing engine
|
||
- Data Structure: Optimized from nested dict to CFI-sorted list
|
||
- Backward Compatible: Smooth upgrade without breaking existing features
|
||
|
||
### Verification Data
|
||
- Books Processed: 660+ books metadata normal
|
||
- Notes Sorted: 232 notes correctly sorted by CFI position
|
||
- Reading Stats: 7-day 70min, 30-day 159min, yearly 12313min
|
||
|
||
For detailed Chinese release notes, see release.md in repository."
|
||
|
||
response=$(curl -s -w "\\nHTTP_CODE:%{http_code}" \
|
||
-X POST \
|
||
-H "Authorization: token $GITEA_TOKEN" \
|
||
-H "Content-Type: application/json" \
|
||
"$API_URL" \
|
||
-d "{
|
||
\"tag_name\": \"${TAG_NAME}\",
|
||
\"name\": \"${RELEASE_NAME}\",
|
||
\"body\": $(echo "$SIMPLE_BODY" | jq -Rs .),
|
||
\"draft\": false,
|
||
\"prerelease\": false
|
||
}")
|
||
|
||
http_code=$(echo "$response" | grep "HTTP_CODE:" | cut -d: -f2)
|
||
response_body=$(echo "$response" | sed '/HTTP_CODE:/d')
|
||
|
||
if [ "$http_code" = "201" ]; then
|
||
echo " ✅ Release 创建成功!"
|
||
echo " 🔗 访问: https://${GITEA_HOST}/gitea/${GITEA_USER}/${GITEA_REPO_NAME}/releases/tag/${TAG_NAME}"
|
||
else
|
||
echo " ❌ Release 创建失败 (HTTP $http_code)"
|
||
echo " 响应: $response_body"
|
||
if echo "$response_body" | grep -qi "collation\|utf8"; then
|
||
echo " 💡 提示: 检测到字符编码问题,这是服务器端问题"
|
||
fi
|
||
fi
|
||
else
|
||
echo " ⚠️ 未设置 GITEA_TOKEN 环境变量"
|
||
echo " 📋 请手动在 Gitea 中创建 Release:"
|
||
echo " 1. 访问: ${GITEA_URL}/${REPO_OWNER}/${REPO_NAME}/releases"
|
||
echo " 2. 点击 'New Release'"
|
||
echo " 3. 选择标签: ${TAG_NAME}"
|
||
echo " 4. 设置标题: ${RELEASE_NAME}"
|
||
echo " 5. 复制 release_notes_v${VERSION}.md 的内容到描述"
|
||
fi
|
||
|
||
echo ""
|
||
echo "🎉 v${VERSION} Release 流程完成!"
|
||
echo "================================================"
|
||
echo "📋 已完成的操作:"
|
||
echo " ✅ 代码提交和推送"
|
||
echo " ✅ 版本标签创建 (${TAG_NAME})"
|
||
echo " ✅ Release Notes 生成"
|
||
echo ""
|
||
echo "📂 生成的文件:"
|
||
echo " - release_notes_v${VERSION}.md"
|
||
echo ""
|
||
echo "🔗 仓库地址: ${GITEA_URL}/${REPO_OWNER}/${REPO_NAME}"
|
||
echo "🏷️ 标签地址: ${GITEA_URL}/${REPO_OWNER}/${REPO_NAME}/releases/tag/${TAG_NAME}"
|
||
echo ""
|
||
echo "💡 提示: 如需自动创建 Release,请设置 GITEA_TOKEN 环境变量"
|