Skip to content

3.2.0#955

Merged
EstrellaXD merged 109 commits into
mainfrom
3.2-dev
Jan 26, 2026
Merged

3.2.0#955
EstrellaXD merged 109 commits into
mainfrom
3.2-dev

Conversation

@EstrellaXD
Copy link
Copy Markdown
Owner

@EstrellaXD EstrellaXD commented Jan 24, 2026

AutoBangumi 3.2.0

主要新功能 / Key Features

🎨 全新 UI 设计 / UI Redesign

  • 现代化界面设计,优化视觉体验
  • 深色模式支持,自动跟随系统设置
  • 全新移动端适配,支持手势操作
  • 骨架屏加载动画,提升加载体验
  • 统一的设计系统:圆角、阴影、过渡动画

🔍 搜索面板重新设计 / Search Panel Redesign

  • 新增筛选区域,支持按字幕组、分辨率、字幕类型、季度分类筛选
  • 多选筛选器,智能禁用不兼容的选项
  • 结果项标签改为彩色药丸样式,统一视觉风格
  • 标签值标准化(分辨率:FHD/HD/4K,字幕:简/繁/双语)
  • 筛选分类和结果变体支持展开/收起
  • 点击弹窗外部自动关闭

📱 移动端优化 / Mobile Interface

  • 响应式布局,完美适配手机和平板
  • 底部导航栏,便于单手操作
  • 下拉刷新、滑动手势支持
  • 底部弹出式表单,优化触摸体验

🧙 设置向导 / Setup Wizard

  • 首次使用引导式配置流程
  • 分步设置:下载器、RSS 源、通知推送
  • 配置验证和连接测试
  • 一键完成初始化

🗄️ 番剧归档 / Bangumi Archive

  • 支持手动归档/取消归档番剧
  • 已完结番剧自动归档
  • 番剧列表页新增可折叠的「已归档」分区

🔢 季度/集数偏移自动检测 / Season/Episode Offset Auto-Detection

  • 通过分析 TMDB 剧集播出日期检测「虚拟季度」(如芙莉莲第一季分两部分播出)
  • 自动计算集数偏移量(如 RSS 显示 S2E1 → TMDB S1E29)
  • 规则编辑器新增「自动检测」按钮和建议值显示
  • iOS 风格通知角标提示需要检查的订阅
  • 季度偏移自动应用到下载文件夹路径

🏷️ 标题别名系统 / Title Alias System

  • 处理字幕组季中改名问题(如 "LoliHouse" → "LoliHouse&动漫国")
  • 自动检测语义重复并合并为别名
  • 避免同一番剧因命名变化产生重复规则

📥 种子管理 / Torrent Management

  • 全新下载器页面:按番剧分组显示种子
  • 支持批量选择、暂停、恢复、删除操作
  • 实时显示下载进度、速度、ETA、做种数
  • 显示「番剧名 / Season」格式便于识别

⚙️ 搜索源配置 / Search Provider Config

  • 新增搜索源设置面板
  • 支持查看、添加、编辑、删除搜索源
  • 默认搜索源(mikan、nyaa、dmhy)不可删除
  • URL 模板验证,确保包含 %s 占位符

📅 日历页分组 / Calendar Grouping

  • 相同番剧的多个规则合并显示
  • 点击可选择具体规则编辑
  • 海报图片懒加载,提升性能
  • 「未知播出日」独立为单独区块

📡 RSS 连接状态追踪 / RSS Connection Status

  • 每次刷新后记录连接状态(healthy/error)
  • RSS 管理页面显示连接状态标签和错误详情

⚡ 性能优化 / Performance

Backend

  • HTTP 连接池:复用 TCP/SSL 连接,减少握手开销
  • 并发处理
    • RSS 刷新并发拉取(速度提升 ~10x)
    • 种子下载并发获取(速度提升 ~5x)
    • 重命名模块并发处理(速度提升 ~20x)
    • 通知发送并发执行
  • 缓存优化:TMDB/Mikan 解析结果内存缓存,番剧列表 5 分钟 TTL 缓存
  • 数据库索引:为常用查询字段添加索引
  • 正则预编译:避免运行时重复编译

Frontend

  • 下载器 store 使用 shallowRef 优化大数组
  • 表格列定义改为 computed
  • 移除重复 API 调用和不必要的延迟
  • 内存泄漏修复(useIntervalFn 替代 setInterval

🐛 Bug 修复 / Bug Fixes

Backend

  • 修复 add_all() 缺少去重检查导致重复添加番剧规则
  • 修复从 3.1.x 升级后数据库缺少 air_weekday 列的问题
  • 修复重命名模块中 'dict' object has no attribute 'files' 错误
  • 修复 disable_rule() 未清除缓存导致匹配异常
  • 修复季度偏移未应用到下载文件夹路径的问题
  • 新增 schema_version 表确保数据库迁移可靠执行

Frontend

  • 修复弹窗 z-index 层级问题
  • 修复下载器页面仅显示季度文件夹名的问题
  • 修复 iOS Safari 输入框缩放和键盘问题
  • 修复空搜索和关闭弹窗时取消搜索
  • 修复移动端设置页面水平溢出问题
  • 修复移动端顶栏布局和搜索弹窗关闭按钮被截断问题
  • 改善无障碍体验:44px 触摸区域、焦点状态、aria-label
  • 修复多处类型安全问题

🧪 测试 / Tests

新增全面的测试套件,覆盖核心业务逻辑:

  • RSS 引擎全流程测试
  • 下载客户端测试
  • 重命名器测试
  • 认证/通知/搜索/配置测试
  • 标题别名系统测试
  • 集成测试

📝 API 变更 / API Changes

新增端点:

  • PATCH /bangumi/archive/{id} - 归档番剧
  • PATCH /bangumi/unarchive/{id} - 取消归档
  • GET /bangumi/refresh/metadata - 刷新元数据
  • GET /bangumi/suggest-offset/{id} - 获取建议的剧集偏移量
  • POST /bangumi/detect-offset - 检测季度/集数偏移
  • PATCH /bangumi/dismiss-review/{id} - 忽略偏移检查提醒
  • GET /search/provider/config - 获取搜索源配置
  • PUT /search/provider/config - 更新搜索源配置

📦 数据库迁移 / Database Migrations

  • v2: rssitem 表添加连接状态字段
  • v4: bangumi 表添加 archived 字段
  • v8: bangumi 表添加 title_aliases 字段
  • v9: bangumi 表添加 needs_reviewneeds_review_reason 字段
  • 新增 schema_version 表追踪迁移版本

🤖 Generated with Claude Code

EstrellaXD and others added 20 commits April 29, 2025 15:05
- Add passkey login as alternative authentication method
- Support multiple passkeys per user with custom names
- Backend: WebAuthn service, auth strategy pattern, API endpoints
- Frontend: passkey management UI in settings, login option
- Fix: convert downloader check from sync requests to async httpx
  to prevent blocking the event loop when downloader unavailable

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Replace pip + requirements.txt with uv for dependency management.

- Multi-stage Dockerfile using ghcr.io/astral-sh/uv builder image
- CI updated to use astral-sh/setup-uv@v4
- Ruff config moved to [tool.ruff.lint] (fixes deprecation)
- Transitive deps removed, missing direct deps added (requests, PySocks, urllib3)
- Database layer migrated to async (AsyncSession + aiosqlite)
- Tests updated to match async database interface

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
…accessibility

Implement a comprehensive UI overhaul using CSS custom properties for theming,
scoped SCSS for all components and pages, dark/light mode toggle with flash
prevention, page transitions, ARIA accessibility attributes, and responsive
layout fixes. Fix VueUse auto-import configuration and dev proxy target.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add passkey login as alternative authentication method
- Support multiple passkeys per user with custom names
- Backend: WebAuthn service, auth strategy pattern, API endpoints
- Frontend: passkey management UI in settings, login option
- Fix: convert downloader check from sync requests to async httpx
  to prevent blocking the event loop when downloader unavailable

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Fix aaguid type (str not bytes) in registration verification
- Fix missing credential_backup_eligible field (use credential_device_type)
- Remove invalid credential_id param from verify_authentication_response
- Fix origin detection to use browser Origin header for WebAuthn verification
- Add async database engine support (aiosqlite) for passkey operations
- Convert UserDatabase to async-compatible with sync/async session detection
- Update Database class to support both sync and async context managers

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
# Conflicts:
#	webui/src/components/ab-bangumi-card.vue
#	webui/src/components/ab-container.vue
#	webui/src/components/ab-fold-panel.vue
#	webui/src/components/ab-search-bar.vue
#	webui/src/components/basic/ab-search.vue
#	webui/src/components/basic/ab-tag.vue
#	webui/src/components/layout/ab-topbar.vue
#	webui/src/pages/index.vue
#	webui/src/pages/index/bangumi.vue
#	webui/src/pages/index/config.vue
#	webui/src/pages/index/player.vue
#	webui/src/pages/login.vue
#	webui/types/dts/auto-imports.d.ts
#	webui/vite.config.ts
- Add secondary button type to ab-button with proper styling
- Fix small button sizing (min-width instead of fixed width)
- Add btn-content wrapper for icon+text alignment in buttons
- Add config-passkey panel to settings page
- Improve WebAuthn error messages with DOMException handling
- Prevent duplicate error messages from axios interceptor
- Fix Vite proxy to preserve Origin header for WebAuthn

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The previous refactoring broke backward compatibility by converting
Database from Session-extending sync class to a standalone async class.
This broke RSSEngine, startup code, and auth flows.

- Restore Database(Session) with sync interface for legacy code
- Restore UserDatabase to sync methods
- Restore security/api.py and auth.py to sync calls
- Passkey API now uses async_session_factory directly
- PasskeyAuthStrategy uses async sessions independently
- Remove unused db_session from engine.py

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add minimal test server for passkey development (no downloader check)
- Add changelog for version 3.2 features

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Add weekly broadcast schedule page showing subscribed anime grouped by
day-of-week. Backend fetches air_weekday from Bangumi.tv calendar API
and matches titles. Frontend displays responsive grid (desktop) and
vertical list (mobile). Edit popup moved to parent layout to fix
KeepAlive conflicts, and restyled with purple theme.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Restyle config components (ab-container, ab-fold-panel, ab-label,
ab-setting) and all config-* setting panels to use the new design
system. Add empty state guides with setup steps for downloader and
player pages. Simplify log page layout.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
# Conflicts:
#	backend/requirements.txt
# Conflicts:
#	backend/pyproject.toml
#	backend/requirements.txt
#	backend/src/module/api/passkey.py
#	backend/src/module/database/combine.py
#	backend/src/module/database/engine.py
#	backend/src/module/security/auth_strategy.py
#	backend/src/module/security/webauthn.py
#	webui/src/components/setting/config-passkey.vue
#	webui/src/hooks/usePasskey.ts
#	webui/src/pages/index/config.vue
#	webui/src/pages/login.vue
#	webui/src/services/webauthn.ts
Change program.startup() to run via asyncio.create_task() so uvicorn
accepts connections immediately while downloader check runs in background.
Also add .claude/ project settings.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Fix search store exports to match component expectations (inputValue,
  bangumiList, onSearch) and transform data to SearchResult format
- Fix poster endpoint path check that incorrectly blocked all requests
- Add resolvePosterUrl utility to handle both external URLs and local paths
- Move tags into hover overlay on homepage cards and calendar cards
- Show title and tags on poster hover with dark semi-transparent styling
- Add downloader API, store, and page
- Update backend to async patterns and uv migration changes
- Remove .claude/settings.local.json from tracking

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Rename "Experimental Setting" to "LLM Settings" with cleaner labels
- Replace jarring yellow warning banner with subtle themed notice
- Only show config fields when LLM is enabled (slide-fade transition)
- Add gpt-4o and gpt-4o-mini to model options
- Use scoped CSS instead of UnoCSS utility classes for the section
- Update i18n labels for both en and zh-CN

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
@vercel
Copy link
Copy Markdown

vercel Bot commented Jan 24, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Review Updated (UTC)
auto-bangumi Ready Ready Preview, Comment Jan 26, 2026 8:03pm

The database classes (BangumiDatabase, TorrentDatabase, RSSDatabase) use
synchronous Session, but tests were incorrectly using AsyncSession with
await calls, causing AttributeError on coroutine objects.

Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
Previously the build pipeline only ran after a PR was merged to main.
Now it also runs as a test build (push: false) when a PR is opened or
updated from a *-dev branch, allowing build verification before merge.

Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
v3 is deprecated and GitHub now rejects it, causing build-webui to fail.

Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
The uv builder image (ghcr.io/astral-sh/uv:0.5-python3.12-alpine) only
supports amd64 and arm64, not arm/v7.

Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
Include async migration, calendar view, downloader API, CI changes,
and all bugfixes based on actual commit history.

Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
When subtitle groups change their naming convention mid-season (e.g.,
"LoliHouse" → "LoliHouse&动漫国"), AutoBangumi was creating duplicate
entries. This adds a title alias system that:

- Detects semantic duplicates (same official_title, dpi, subtitle,
  source, and similar group name)
- Merges them as aliases instead of creating new entries
- Updates match_torrent() and match_list() to check aliases
- Adds title_aliases field to Bangumi model (JSON list)
- Includes migration v8 for the new column
- Adds 10 new tests for the feature
- Fixes cache invalidation bug in disable_rule()

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Generates concise release notes showing only changes between beta versions:
- Auto-detects previous beta tag
- Groups commits by type (feat, fix, perf, docs)
- Excludes chore/refactor/test commits from notes
- Includes link to full changelog comparison

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Backend:
- Add API test files for auth, program, downloader, config, log, bangumi extended, search, and passkey endpoints
- Update conftest.py with new fixtures (app, authed_client, unauthed_client, mock_program, mock_webauthn, mock_download_client)
- Update factories.py with make_config and make_passkey functions

Frontend:
- Setup vitest testing infrastructure with happy-dom environment
- Add test setup file with mocks for axios, router, i18n, localStorage
- Add mock API data for testing
- Add tests for API logic, store logic, hooks, and basic components
- Add @vue/test-utils and happy-dom dev dependencies

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Use RSS type instead of non-existent RSSItem/RSSResponse
- Add expire field to mockLoginSuccess
- Replace offset with episode_offset/season_offset in mockBangumiAPI
- Add needs_review_reason field to mockBangumiAPI
- Add missing RSS fields (connection_status, last_checked_at, last_error)
- Fix generic types in test utilities

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Update requires-python to >=3.13 in pyproject.toml
- Update ruff and black target versions to py313
- Update Dockerfile to use python:3.13-alpine
- Add explicit Python 3.13 setup in CI workflow
- Regenerate uv.lock for Python 3.13

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Pydantic V2:
- Replace @validator with @field_validator in models/config.py
- Replace .dict() with .model_dump() in Config, Settings, and BangumiDatabase
- Replace .parse_obj() with .model_validate() in Settings and tests
- Replace Field(example=) with Field(json_schema_extra=) in response models

Datetime:
- Replace datetime.utcnow() with datetime.now(timezone.utc) in jwt.py
- Update factories.py to use timezone-aware datetime

FastAPI:
- Migrate from deprecated @router.on_event() to lifespan context manager
- Move startup/shutdown handlers from program.py to main.py

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add common.selectAll and common.items translations
- Add theme.light and theme.dark translations
- Update ab-mobile-nav to use i18n for theme toggle label
- Remove hardcoded fallback in ab-data-list

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
EstrellaXD and others added 4 commits January 26, 2026 20:11
… redirects

URLs entered without http:// or https:// were being treated as relative
paths by the browser. Added normalizeUrl() function that prepends http://
when no protocol is present.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The media library path is now taken directly from the downloader path
field, eliminating the unnecessary separate step.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Allow setup in dev mode even if settings differ from defaults
- Add mock downloader type for development testing
- Only check sentinel file in dev mode for need_setup status

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Path is now synced directly through downloaderData.path.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
EstrellaXD and others added 3 commits January 26, 2026 20:14
Standardize form element dimensions for visual consistency:
- Input height: 48px → 44px (matches button height)
- Input font: 16px → 14px (consistent with form elements)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add filter section with group, resolution, subtitle, season categories
- Implement multi-select filters with smart disabling for incompatible options
- Display result variant tags as non-clickable colored pills
- Unify tag styling (pill shape, 12px font) across filters and results
- Add expand/collapse for filter categories and variant overflow
- Normalize tag values (resolution: FHD/HD/4K, subtitle: 简/繁/双语)
- Calculate poster height to match 4 rows of variant chips (168px)
- Add click-outside-to-close for modal

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
@EstrellaXD EstrellaXD merged commit eda98db into main Jan 26, 2026
16 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants