Releases: EstrellaXD/Auto_Bangumi
Releases · EstrellaXD/Auto_Bangumi
🌟3.2.6
Summary
- fix(database): add missing
search_official_titlemethod toBangumiDatabase(#1005, #998) - fix(parser): handle
Nonereturn fromraw_parserto avoidAttributeErroron non-episodic resources (#992) - test: add regression tests for #992 and #1005
Test plan
- All 699 tests pass (
pytest— 0 failures) - Verify search functionality works without
AttributeErroronsearch_official_title - Verify non-episodic resources (movies, collections) are skipped gracefully during RSS parsing
🤖 Generated with Claude Code
🌟3.2.5
更新内容
- fix(api): 修复配置保存时密码被掩码值
********覆盖的问题 (#995) - fix(api): 修复初始化向导中无法使用私有/局域网 IP 测试 qBittorrent 连接的问题 (#1001)
- fix(config): 修正默认过滤正则
\d+-\d为\d+-\d+(#999) - fix(mcp): 修复 SSE 断开连接时
handle_sse返回 NoneType 错误 (#1000)
测试
- 后端测试全部通过(44 个配置/设置测试,679 个总计)
- 手动验证:初始化向导可使用私有 IP 连接 qBittorrent
- 手动验证:未修改密码时保存配置不会覆盖原密码
🌟3.2.4
Summary
- fix(downloader): 修复 qBittorrent SSL 连接问题,解耦 HTTPS 协议选择与 TLS 证书验证 (#923)
- fix(downloader): 修复
torrents_rename_file重命名验证循环逻辑错误 (continue→break) - feat(parser): 新增 fallback episode 解析器用于 TITLE_RE 匹配失败场景 (#876, #910, #773)
- fix(parser): 修复以数字开头的标题导致崩溃的问题 (#990)
- feat(security): 新增安全配置 UI,改进认证与 MCP 安全
- feat(calendar): 新增拖拽功能将未知番剧分配到星期
- fix(webui): 组件卸载时关闭 EventSource 并清除定时器
Test plan
- Backend tests: 679 passed
- WebUI tests: passed
- CI: all checks green
- Verified qBittorrent HTTPS connection with self-signed cert
Generated with /ship
🌟3.2.3
3.2.3
Added
- MCP 服务器:新增 Model Context Protocol 服务器,支持通过 Claude Desktop 等 LLM 工具管理番剧订阅
- SSE 传输层挂载在
/mcp/sse - 10 个工具 + 4 个资源,本地网络 IP 白名单安全中间件
- SSE 传输层挂载在
- 通知系统重构:支持多通知渠道同时启用(Telegram、Bark、Server 酱、企业微信、Discord、Gotify、Pushover、Webhook)
- E2E 集成测试:覆盖 RSS→下载→重命名全流程
Fixes
- 修复第 0 集(SP/OVA)被错误重命名为第 1 集的问题 (#977)
- 修复 RSS 过滤器包含特殊字符(如
[字幕组)导致程序崩溃 (#974) - 修复聚合 RSS 解析时
title_raw为空导致TypeError(#976) - 修复解析器处理无括号种子名称时
IndexError(#973) - 修复删除番剧时未清理关联种子记录
- 修复认证路由、JWT 刷新和 WebAuthn 注册流程的安全问题
- 修复程序生命周期管理和后台任务取消逻辑
- 修复数据库迁移在部分场景下未正确执行
- 修复前端认证路由守卫和 i18n 初始化顺序
- README 移除未实现的 Aria2 和 Transmission 下载器 (#987)
Performance
- 日志系统:
RotatingFileHandler轮转 +QueueHandler异步写入 + 限读 512 KB - 重命名器:批量数据库查询 + 并发获取种子文件列表
- ~80 处 debug 日志从 f-string 转为惰性
%s格式化
Tests
Test Plan
- Episode 0 (S01E00) 文件不再被重命名为 E01
- 包含
[等特殊字符的 RSS 过滤器不再导致崩溃 - 聚合 RSS 中 title_raw 为空的番剧不再导致 TypeError
- 无括号种子名称不再导致 IndexError
- 全部 26 个回归测试通过
- Docker 构建验证
- 升级测试(3.2.2 → 3.2.3 数据库迁移)
Full diff: 130 files changed, 7298 insertions(+), 762 deletions(-)
🤖 Generated with Claude Code
🌙3.2.3-beta.5
[3.2] - 2025-01
Backend
Features
- Added WebAuthn Passkey passwordless login support
- Register, authenticate, and manage Passkey credentials
- Multi-device credential backup detection (iCloud Keychain, etc.)
- Clone attack protection (sign_count verification)
- Authentication strategy pattern unifying password and Passkey login interfaces
- Usernameless login support via discoverable credentials (resident keys)
- Added season/episode offset auto-detection
- Analyzes TMDB episode air dates to detect "virtual seasons" (e.g., Frieren S1 split into two parts)
- Auto-identifies different parts when broadcast gap exceeds 6 months
- Calculates episode offset (e.g., RSS shows S2E1 → TMDB S1E29)
- Background scan thread automatically detects offset issues in existing subscriptions
- New API endpoints:
POST /bangumi/detect-offset,PATCH /bangumi/dismiss-review/{id}
- Added bangumi archive functionality
- Manual archive/unarchive support
- Auto-archive completed series
- New API endpoints:
PATCH /bangumi/archive/{id},PATCH /bangumi/unarchive/{id},GET /bangumi/refresh/metadata
- Added search provider configuration API
GET /search/provider/config- Get search provider configPUT /search/provider/config- Update search provider config
- Offset detection panel now shows suggested values (parsed season/episode and recommended offset)
- Fixed season offset not being applied to download folder path
- Setting season offset now auto-updates qBittorrent save path (e.g.,
Season 2→Season 1) - RSS rule save paths also sync the update
- Setting season offset now auto-updates qBittorrent save path (e.g.,
- Optimized episode offset suggestion logic
- Simple season mismatch no longer suggests episode offset (only virtual seasons need it)
- Improved prompt messages to clarify whether episode adjustment is needed
- Added RSS connection status tracking
- Records
connection_status(healthy/error),last_checked_at, andlast_errorafter each refresh
- Records
- Added first-run setup wizard
- 7-step guided configuration: account, downloader, RSS source, media path, notifications
- Downloader connection test, RSS source validation
- Optional steps can be skipped and configured later in settings
- Sentinel file mechanism (
config/.setup_complete) prevents re-triggering - Unauthenticated setup API (only available on first run, returns 403 after completion)
- Added calendar view with Bangumi.tv broadcast schedule integration
- Added downloader API and management interface
- Full async migration
- Database layer async support (aiosqlite) for non-blocking I/O in Passkey operations
UserDatabasesupports both sync/async modes for backward compatibilityDatabasecontext manager supports bothwith(sync) andasync with(async)- RSS engine, downloader, checker, and parser fully converted to async
- Network requests migrated from
requeststohttpx(AsyncClient)
- Backend migrated to
uvpackage manager (pyproject.toml + uv.lock) - Server startup uses background tasks to avoid blocking (fixes #891, #929)
- Database migration auto-fills NULL values with model defaults
- Database adds
needs_reviewandneeds_review_reasonfields for offset detection
Performance
- Shared HTTP client connection pool, reuses TCP/SSL connections
- RSS refresh now concurrent (
asyncio.gather), ~10x faster with multiple sources - Torrent file download now concurrent, ~5x faster for multiple torrents
- Rename module concurrent file list fetching, ~20x faster
- Notification sending now concurrent, removed 2-second hardcoded delay
- Added TMDB and Mikan parser result caching to avoid duplicate API calls
- Database indexes added for
Torrent.url,Torrent.rss_id,Bangumi.title_raw,Bangumi.deleted,RSSItem.url - RSS batch enable/disable uses single transaction instead of per-item commits
- Pre-compiled regex patterns for torrent name parsing and filter matching
SeasonCollectorcreated outside loops, reuses single authentication- RSS parsing deduplication changed from O(n²) list lookup to O(1) set lookup
Episode/SeasonInfodataclasses use__slots__for reduced memory footprint
Changes
- Upgraded WebAuthn dependency to py_webauthn 2.7.0
_get_webauthn_from_requestprioritizes browser Origin header, fixing verification issues in cross-port development environmentsauth_userandupdate_user_infoconverted to async functionsTitleParser.tmdb_parserconverted to async functionRSSEnginemethods fully async (pull_rss,refresh_rss,download_bangumi,add_rss)Checker.check_downloaderconverted to async functionProgramStatusmigrated from threading to asyncio (Event, Lock)
Bugfixes
- Fixed downloader connection check with max retry limit
- Fixed transient network errors when adding torrents with retry logic
- Fixed multiple issues in search and subscription flow
- Improved torrent fetch reliability and error handling
- Fixed
aaguidtype error (nowstrin py_webauthn 2.7.0, no longerbytes) - Fixed missing
credential_backup_eligiblefield (replaced withcredential_device_type) - Fixed
verify_authentication_responsereceiving invalidcredential_idparameter causing TypeError - Fixed program startup blocking the server (fixes #891, #929, #886, #917, #946)
- Fixed search interface export not matching component expectations
- Fixed poster endpoint path check incorrectly intercepting all requests (fixes #933, #934)
- Fixed OpenAI parser security issue
- Fixed database tests using async sessions with sync code mismatch
- Fixed config field conflicts when upgrading from 3.1.x to 3.2 causing settings loss (fixes #956)
program.sleep_time/program.timesauto-migrated torss_time/rename_time- Removed deprecated
rss_parserfields (type,custom_url,token,enable_tmdb) - Fixed
ENV_TO_ATTRenvironment variable mapping pointing to non-existent model fields - Fixed
DEFAULT_SETTINGSinconsistency with current config model
- Fixed version upgrade migration logic errors (all upgrades calling 3.0→3.1 migration)
- Added version-aware migration dispatch based on source version
- Added
from_31_to_32()migration function for database schema changes
Frontend
Features
- Complete UI design system redesign
- Unified design tokens (colors, fonts, spacing, shadows, animations)
- Light/dark theme toggle support
- Comprehensive accessibility support (ARIA, keyboard navigation, focus management)
- Responsive layout for mobile devices
- Added first-run setup wizard page
- Multi-step wizard component (progress bar + step navigation)
- Route guard auto-detection and redirect to setup page
- Downloader/RSS/notification connection test feedback
- Chinese and English i18n support
- Added Passkey management panel (settings page)
- WebAuthn browser support detection
- Automatic device name identification
- Passkey list display and deletion
- Added Passkey fingerprint login button on login page (supports usernameless login)
- Added calendar view page
- Added downloader management page
- Added Bangumi card hover overlay (showing title and tags)
- Added
resolvePosterUrlutility function for unified external URL and local path handling (fixes #934) - Redesigned search panel with modal and filter system
- Added filter section supporting fansub group, resolution, subtitle type, and season filtering
- Multi-select filters with smart disable for incompatible options (grayed out)
- Result item tags changed to non-clickable colored pill style
- Unified tag styling (pill shape, 12px font)
- Standardized tag values (resolution: FHD/HD/4K, subtitles: CHS/CHT/Dual)
- Filter categories and result variants support expand/collapse
- Poster height auto-matches 4 rows of variant items (168px)
- Click outside modal to auto-close
- Redesigned login panel with modern glassmorphism style
- Added log level filter in log view
- Redesigned LLM settings panel (fixes #938)
- Redesigned settings, downloader, player, and log page styles
- Added search provider settings panel
- View, add, edit, delete search sources in UI
- Default sources (mikan, nyaa, dmhy) cannot be deleted
- URL template validation ensures
%splaceholder
- Added iOS-style notification badge system
- Yellow badge + purple border for subscriptions needing review
- Combined display support (e.g.,
! | 2for warning + multiple rules) - Yellow glow animation on cards needing attention
- Edit modal warning banner with one-click auto-detect and dismiss
- Rule selection modal highlights rules with warnings
- Calendar page bangumi grouping: same anime with multiple rules merged, click to select specific rule
- Bangumi list page collapsible "Archived" section
- Bangumi list page skeleton loading animation
- Rule editor episode offset field with "Auto Detect" button
- Empty state on home page now includes "Add RSS Subscription" button to guide new users
- Calendar page poster images now use lazy loading for better performance
- Calendar page "Unknown Air Date" section separated into its own block for better visual rhythm
- RSS management page connection status labels: green "Connected" when healthy, red "Error" with tooltip for details
- New mobile-first responsive design
- Three-tier breakpoint system: mobile (<640px), tablet (640-1023px), desktop (≥1024px)
- Mobile bottom navigation bar (with icons and text labels)
- Tablet mini sidebar (56px icon navigation)
- Mobile popups automatically switch to bottom sheets
- Pull-to-refresh support
- Horizontal swipe container support
- Mobile card list replacing data tables (RSS page)
- CSS Grid responsive layout (Bangumi card grid)
- Form labels stack vertically on mobile, full-width inputs
- Touch targets minimum 44px, meeting accessibility standards
- Safe area support (notched devices)
100dvhdynamic viewport height (fixes mobile browser address bar issue)viewport-fit=coverfor full-sc...
🌙3.2.3-beta.4
[3.2] - 2025-01
Backend
Features
- Added WebAuthn Passkey passwordless login support
- Register, authenticate, and manage Passkey credentials
- Multi-device credential backup detection (iCloud Keychain, etc.)
- Clone attack protection (sign_count verification)
- Authentication strategy pattern unifying password and Passkey login interfaces
- Usernameless login support via discoverable credentials (resident keys)
- Added season/episode offset auto-detection
- Analyzes TMDB episode air dates to detect "virtual seasons" (e.g., Frieren S1 split into two parts)
- Auto-identifies different parts when broadcast gap exceeds 6 months
- Calculates episode offset (e.g., RSS shows S2E1 → TMDB S1E29)
- Background scan thread automatically detects offset issues in existing subscriptions
- New API endpoints:
POST /bangumi/detect-offset,PATCH /bangumi/dismiss-review/{id}
- Added bangumi archive functionality
- Manual archive/unarchive support
- Auto-archive completed series
- New API endpoints:
PATCH /bangumi/archive/{id},PATCH /bangumi/unarchive/{id},GET /bangumi/refresh/metadata
- Added search provider configuration API
GET /search/provider/config- Get search provider configPUT /search/provider/config- Update search provider config
- Offset detection panel now shows suggested values (parsed season/episode and recommended offset)
- Fixed season offset not being applied to download folder path
- Setting season offset now auto-updates qBittorrent save path (e.g.,
Season 2→Season 1) - RSS rule save paths also sync the update
- Setting season offset now auto-updates qBittorrent save path (e.g.,
- Optimized episode offset suggestion logic
- Simple season mismatch no longer suggests episode offset (only virtual seasons need it)
- Improved prompt messages to clarify whether episode adjustment is needed
- Added RSS connection status tracking
- Records
connection_status(healthy/error),last_checked_at, andlast_errorafter each refresh
- Records
- Added first-run setup wizard
- 7-step guided configuration: account, downloader, RSS source, media path, notifications
- Downloader connection test, RSS source validation
- Optional steps can be skipped and configured later in settings
- Sentinel file mechanism (
config/.setup_complete) prevents re-triggering - Unauthenticated setup API (only available on first run, returns 403 after completion)
- Added calendar view with Bangumi.tv broadcast schedule integration
- Added downloader API and management interface
- Full async migration
- Database layer async support (aiosqlite) for non-blocking I/O in Passkey operations
UserDatabasesupports both sync/async modes for backward compatibilityDatabasecontext manager supports bothwith(sync) andasync with(async)- RSS engine, downloader, checker, and parser fully converted to async
- Network requests migrated from
requeststohttpx(AsyncClient)
- Backend migrated to
uvpackage manager (pyproject.toml + uv.lock) - Server startup uses background tasks to avoid blocking (fixes #891, #929)
- Database migration auto-fills NULL values with model defaults
- Database adds
needs_reviewandneeds_review_reasonfields for offset detection
Performance
- Shared HTTP client connection pool, reuses TCP/SSL connections
- RSS refresh now concurrent (
asyncio.gather), ~10x faster with multiple sources - Torrent file download now concurrent, ~5x faster for multiple torrents
- Rename module concurrent file list fetching, ~20x faster
- Notification sending now concurrent, removed 2-second hardcoded delay
- Added TMDB and Mikan parser result caching to avoid duplicate API calls
- Database indexes added for
Torrent.url,Torrent.rss_id,Bangumi.title_raw,Bangumi.deleted,RSSItem.url - RSS batch enable/disable uses single transaction instead of per-item commits
- Pre-compiled regex patterns for torrent name parsing and filter matching
SeasonCollectorcreated outside loops, reuses single authentication- RSS parsing deduplication changed from O(n²) list lookup to O(1) set lookup
Episode/SeasonInfodataclasses use__slots__for reduced memory footprint
Changes
- Upgraded WebAuthn dependency to py_webauthn 2.7.0
_get_webauthn_from_requestprioritizes browser Origin header, fixing verification issues in cross-port development environmentsauth_userandupdate_user_infoconverted to async functionsTitleParser.tmdb_parserconverted to async functionRSSEnginemethods fully async (pull_rss,refresh_rss,download_bangumi,add_rss)Checker.check_downloaderconverted to async functionProgramStatusmigrated from threading to asyncio (Event, Lock)
Bugfixes
- Fixed downloader connection check with max retry limit
- Fixed transient network errors when adding torrents with retry logic
- Fixed multiple issues in search and subscription flow
- Improved torrent fetch reliability and error handling
- Fixed
aaguidtype error (nowstrin py_webauthn 2.7.0, no longerbytes) - Fixed missing
credential_backup_eligiblefield (replaced withcredential_device_type) - Fixed
verify_authentication_responsereceiving invalidcredential_idparameter causing TypeError - Fixed program startup blocking the server (fixes #891, #929, #886, #917, #946)
- Fixed search interface export not matching component expectations
- Fixed poster endpoint path check incorrectly intercepting all requests (fixes #933, #934)
- Fixed OpenAI parser security issue
- Fixed database tests using async sessions with sync code mismatch
- Fixed config field conflicts when upgrading from 3.1.x to 3.2 causing settings loss (fixes #956)
program.sleep_time/program.timesauto-migrated torss_time/rename_time- Removed deprecated
rss_parserfields (type,custom_url,token,enable_tmdb) - Fixed
ENV_TO_ATTRenvironment variable mapping pointing to non-existent model fields - Fixed
DEFAULT_SETTINGSinconsistency with current config model
- Fixed version upgrade migration logic errors (all upgrades calling 3.0→3.1 migration)
- Added version-aware migration dispatch based on source version
- Added
from_31_to_32()migration function for database schema changes
Frontend
Features
- Complete UI design system redesign
- Unified design tokens (colors, fonts, spacing, shadows, animations)
- Light/dark theme toggle support
- Comprehensive accessibility support (ARIA, keyboard navigation, focus management)
- Responsive layout for mobile devices
- Added first-run setup wizard page
- Multi-step wizard component (progress bar + step navigation)
- Route guard auto-detection and redirect to setup page
- Downloader/RSS/notification connection test feedback
- Chinese and English i18n support
- Added Passkey management panel (settings page)
- WebAuthn browser support detection
- Automatic device name identification
- Passkey list display and deletion
- Added Passkey fingerprint login button on login page (supports usernameless login)
- Added calendar view page
- Added downloader management page
- Added Bangumi card hover overlay (showing title and tags)
- Added
resolvePosterUrlutility function for unified external URL and local path handling (fixes #934) - Redesigned search panel with modal and filter system
- Added filter section supporting fansub group, resolution, subtitle type, and season filtering
- Multi-select filters with smart disable for incompatible options (grayed out)
- Result item tags changed to non-clickable colored pill style
- Unified tag styling (pill shape, 12px font)
- Standardized tag values (resolution: FHD/HD/4K, subtitles: CHS/CHT/Dual)
- Filter categories and result variants support expand/collapse
- Poster height auto-matches 4 rows of variant items (168px)
- Click outside modal to auto-close
- Redesigned login panel with modern glassmorphism style
- Added log level filter in log view
- Redesigned LLM settings panel (fixes #938)
- Redesigned settings, downloader, player, and log page styles
- Added search provider settings panel
- View, add, edit, delete search sources in UI
- Default sources (mikan, nyaa, dmhy) cannot be deleted
- URL template validation ensures
%splaceholder
- Added iOS-style notification badge system
- Yellow badge + purple border for subscriptions needing review
- Combined display support (e.g.,
! | 2for warning + multiple rules) - Yellow glow animation on cards needing attention
- Edit modal warning banner with one-click auto-detect and dismiss
- Rule selection modal highlights rules with warnings
- Calendar page bangumi grouping: same anime with multiple rules merged, click to select specific rule
- Bangumi list page collapsible "Archived" section
- Bangumi list page skeleton loading animation
- Rule editor episode offset field with "Auto Detect" button
- Empty state on home page now includes "Add RSS Subscription" button to guide new users
- Calendar page poster images now use lazy loading for better performance
- Calendar page "Unknown Air Date" section separated into its own block for better visual rhythm
- RSS management page connection status labels: green "Connected" when healthy, red "Error" with tooltip for details
- New mobile-first responsive design
- Three-tier breakpoint system: mobile (<640px), tablet (640-1023px), desktop (≥1024px)
- Mobile bottom navigation bar (with icons and text labels)
- Tablet mini sidebar (56px icon navigation)
- Mobile popups automatically switch to bottom sheets
- Pull-to-refresh support
- Horizontal swipe container support
- Mobile card list replacing data tables (RSS page)
- CSS Grid responsive layout (Bangumi card grid)
- Form labels stack vertically on mobile, full-width inputs
- Touch targets minimum 44px, meeting accessibility standards
- Safe area support (notched devices)
100dvhdynamic viewport height (fixes mobile browser address bar issue)viewport-fit=coverfor full-sc...
🌙3.2.3-beta.3
[3.2] - 2025-01
Backend
Features
- Added WebAuthn Passkey passwordless login support
- Register, authenticate, and manage Passkey credentials
- Multi-device credential backup detection (iCloud Keychain, etc.)
- Clone attack protection (sign_count verification)
- Authentication strategy pattern unifying password and Passkey login interfaces
- Usernameless login support via discoverable credentials (resident keys)
- Added season/episode offset auto-detection
- Analyzes TMDB episode air dates to detect "virtual seasons" (e.g., Frieren S1 split into two parts)
- Auto-identifies different parts when broadcast gap exceeds 6 months
- Calculates episode offset (e.g., RSS shows S2E1 → TMDB S1E29)
- Background scan thread automatically detects offset issues in existing subscriptions
- New API endpoints:
POST /bangumi/detect-offset,PATCH /bangumi/dismiss-review/{id}
- Added bangumi archive functionality
- Manual archive/unarchive support
- Auto-archive completed series
- New API endpoints:
PATCH /bangumi/archive/{id},PATCH /bangumi/unarchive/{id},GET /bangumi/refresh/metadata
- Added search provider configuration API
GET /search/provider/config- Get search provider configPUT /search/provider/config- Update search provider config
- Offset detection panel now shows suggested values (parsed season/episode and recommended offset)
- Fixed season offset not being applied to download folder path
- Setting season offset now auto-updates qBittorrent save path (e.g.,
Season 2→Season 1) - RSS rule save paths also sync the update
- Setting season offset now auto-updates qBittorrent save path (e.g.,
- Optimized episode offset suggestion logic
- Simple season mismatch no longer suggests episode offset (only virtual seasons need it)
- Improved prompt messages to clarify whether episode adjustment is needed
- Added RSS connection status tracking
- Records
connection_status(healthy/error),last_checked_at, andlast_errorafter each refresh
- Records
- Added first-run setup wizard
- 7-step guided configuration: account, downloader, RSS source, media path, notifications
- Downloader connection test, RSS source validation
- Optional steps can be skipped and configured later in settings
- Sentinel file mechanism (
config/.setup_complete) prevents re-triggering - Unauthenticated setup API (only available on first run, returns 403 after completion)
- Added calendar view with Bangumi.tv broadcast schedule integration
- Added downloader API and management interface
- Full async migration
- Database layer async support (aiosqlite) for non-blocking I/O in Passkey operations
UserDatabasesupports both sync/async modes for backward compatibilityDatabasecontext manager supports bothwith(sync) andasync with(async)- RSS engine, downloader, checker, and parser fully converted to async
- Network requests migrated from
requeststohttpx(AsyncClient)
- Backend migrated to
uvpackage manager (pyproject.toml + uv.lock) - Server startup uses background tasks to avoid blocking (fixes #891, #929)
- Database migration auto-fills NULL values with model defaults
- Database adds
needs_reviewandneeds_review_reasonfields for offset detection
Performance
- Shared HTTP client connection pool, reuses TCP/SSL connections
- RSS refresh now concurrent (
asyncio.gather), ~10x faster with multiple sources - Torrent file download now concurrent, ~5x faster for multiple torrents
- Rename module concurrent file list fetching, ~20x faster
- Notification sending now concurrent, removed 2-second hardcoded delay
- Added TMDB and Mikan parser result caching to avoid duplicate API calls
- Database indexes added for
Torrent.url,Torrent.rss_id,Bangumi.title_raw,Bangumi.deleted,RSSItem.url - RSS batch enable/disable uses single transaction instead of per-item commits
- Pre-compiled regex patterns for torrent name parsing and filter matching
SeasonCollectorcreated outside loops, reuses single authentication- RSS parsing deduplication changed from O(n²) list lookup to O(1) set lookup
Episode/SeasonInfodataclasses use__slots__for reduced memory footprint
Changes
- Upgraded WebAuthn dependency to py_webauthn 2.7.0
_get_webauthn_from_requestprioritizes browser Origin header, fixing verification issues in cross-port development environmentsauth_userandupdate_user_infoconverted to async functionsTitleParser.tmdb_parserconverted to async functionRSSEnginemethods fully async (pull_rss,refresh_rss,download_bangumi,add_rss)Checker.check_downloaderconverted to async functionProgramStatusmigrated from threading to asyncio (Event, Lock)
Bugfixes
- Fixed downloader connection check with max retry limit
- Fixed transient network errors when adding torrents with retry logic
- Fixed multiple issues in search and subscription flow
- Improved torrent fetch reliability and error handling
- Fixed
aaguidtype error (nowstrin py_webauthn 2.7.0, no longerbytes) - Fixed missing
credential_backup_eligiblefield (replaced withcredential_device_type) - Fixed
verify_authentication_responsereceiving invalidcredential_idparameter causing TypeError - Fixed program startup blocking the server (fixes #891, #929, #886, #917, #946)
- Fixed search interface export not matching component expectations
- Fixed poster endpoint path check incorrectly intercepting all requests (fixes #933, #934)
- Fixed OpenAI parser security issue
- Fixed database tests using async sessions with sync code mismatch
- Fixed config field conflicts when upgrading from 3.1.x to 3.2 causing settings loss (fixes #956)
program.sleep_time/program.timesauto-migrated torss_time/rename_time- Removed deprecated
rss_parserfields (type,custom_url,token,enable_tmdb) - Fixed
ENV_TO_ATTRenvironment variable mapping pointing to non-existent model fields - Fixed
DEFAULT_SETTINGSinconsistency with current config model
- Fixed version upgrade migration logic errors (all upgrades calling 3.0→3.1 migration)
- Added version-aware migration dispatch based on source version
- Added
from_31_to_32()migration function for database schema changes
Frontend
Features
- Complete UI design system redesign
- Unified design tokens (colors, fonts, spacing, shadows, animations)
- Light/dark theme toggle support
- Comprehensive accessibility support (ARIA, keyboard navigation, focus management)
- Responsive layout for mobile devices
- Added first-run setup wizard page
- Multi-step wizard component (progress bar + step navigation)
- Route guard auto-detection and redirect to setup page
- Downloader/RSS/notification connection test feedback
- Chinese and English i18n support
- Added Passkey management panel (settings page)
- WebAuthn browser support detection
- Automatic device name identification
- Passkey list display and deletion
- Added Passkey fingerprint login button on login page (supports usernameless login)
- Added calendar view page
- Added downloader management page
- Added Bangumi card hover overlay (showing title and tags)
- Added
resolvePosterUrlutility function for unified external URL and local path handling (fixes #934) - Redesigned search panel with modal and filter system
- Added filter section supporting fansub group, resolution, subtitle type, and season filtering
- Multi-select filters with smart disable for incompatible options (grayed out)
- Result item tags changed to non-clickable colored pill style
- Unified tag styling (pill shape, 12px font)
- Standardized tag values (resolution: FHD/HD/4K, subtitles: CHS/CHT/Dual)
- Filter categories and result variants support expand/collapse
- Poster height auto-matches 4 rows of variant items (168px)
- Click outside modal to auto-close
- Redesigned login panel with modern glassmorphism style
- Added log level filter in log view
- Redesigned LLM settings panel (fixes #938)
- Redesigned settings, downloader, player, and log page styles
- Added search provider settings panel
- View, add, edit, delete search sources in UI
- Default sources (mikan, nyaa, dmhy) cannot be deleted
- URL template validation ensures
%splaceholder
- Added iOS-style notification badge system
- Yellow badge + purple border for subscriptions needing review
- Combined display support (e.g.,
! | 2for warning + multiple rules) - Yellow glow animation on cards needing attention
- Edit modal warning banner with one-click auto-detect and dismiss
- Rule selection modal highlights rules with warnings
- Calendar page bangumi grouping: same anime with multiple rules merged, click to select specific rule
- Bangumi list page collapsible "Archived" section
- Bangumi list page skeleton loading animation
- Rule editor episode offset field with "Auto Detect" button
- Empty state on home page now includes "Add RSS Subscription" button to guide new users
- Calendar page poster images now use lazy loading for better performance
- Calendar page "Unknown Air Date" section separated into its own block for better visual rhythm
- RSS management page connection status labels: green "Connected" when healthy, red "Error" with tooltip for details
- New mobile-first responsive design
- Three-tier breakpoint system: mobile (<640px), tablet (640-1023px), desktop (≥1024px)
- Mobile bottom navigation bar (with icons and text labels)
- Tablet mini sidebar (56px icon navigation)
- Mobile popups automatically switch to bottom sheets
- Pull-to-refresh support
- Horizontal swipe container support
- Mobile card list replacing data tables (RSS page)
- CSS Grid responsive layout (Bangumi card grid)
- Form labels stack vertically on mobile, full-width inputs
- Touch targets minimum 44px, meeting accessibility standards
- Safe area support (notched devices)
100dvhdynamic viewport height (fixes mobile browser address bar issue)viewport-fit=coverfor full-sc...
🌙3.2.3-beta.2
[3.2] - 2025-01
Backend
Features
- Added WebAuthn Passkey passwordless login support
- Register, authenticate, and manage Passkey credentials
- Multi-device credential backup detection (iCloud Keychain, etc.)
- Clone attack protection (sign_count verification)
- Authentication strategy pattern unifying password and Passkey login interfaces
- Usernameless login support via discoverable credentials (resident keys)
- Added season/episode offset auto-detection
- Analyzes TMDB episode air dates to detect "virtual seasons" (e.g., Frieren S1 split into two parts)
- Auto-identifies different parts when broadcast gap exceeds 6 months
- Calculates episode offset (e.g., RSS shows S2E1 → TMDB S1E29)
- Background scan thread automatically detects offset issues in existing subscriptions
- New API endpoints:
POST /bangumi/detect-offset,PATCH /bangumi/dismiss-review/{id}
- Added bangumi archive functionality
- Manual archive/unarchive support
- Auto-archive completed series
- New API endpoints:
PATCH /bangumi/archive/{id},PATCH /bangumi/unarchive/{id},GET /bangumi/refresh/metadata
- Added search provider configuration API
GET /search/provider/config- Get search provider configPUT /search/provider/config- Update search provider config
- Offset detection panel now shows suggested values (parsed season/episode and recommended offset)
- Fixed season offset not being applied to download folder path
- Setting season offset now auto-updates qBittorrent save path (e.g.,
Season 2→Season 1) - RSS rule save paths also sync the update
- Setting season offset now auto-updates qBittorrent save path (e.g.,
- Optimized episode offset suggestion logic
- Simple season mismatch no longer suggests episode offset (only virtual seasons need it)
- Improved prompt messages to clarify whether episode adjustment is needed
- Added RSS connection status tracking
- Records
connection_status(healthy/error),last_checked_at, andlast_errorafter each refresh
- Records
- Added first-run setup wizard
- 7-step guided configuration: account, downloader, RSS source, media path, notifications
- Downloader connection test, RSS source validation
- Optional steps can be skipped and configured later in settings
- Sentinel file mechanism (
config/.setup_complete) prevents re-triggering - Unauthenticated setup API (only available on first run, returns 403 after completion)
- Added calendar view with Bangumi.tv broadcast schedule integration
- Added downloader API and management interface
- Full async migration
- Database layer async support (aiosqlite) for non-blocking I/O in Passkey operations
UserDatabasesupports both sync/async modes for backward compatibilityDatabasecontext manager supports bothwith(sync) andasync with(async)- RSS engine, downloader, checker, and parser fully converted to async
- Network requests migrated from
requeststohttpx(AsyncClient)
- Backend migrated to
uvpackage manager (pyproject.toml + uv.lock) - Server startup uses background tasks to avoid blocking (fixes #891, #929)
- Database migration auto-fills NULL values with model defaults
- Database adds
needs_reviewandneeds_review_reasonfields for offset detection
Performance
- Shared HTTP client connection pool, reuses TCP/SSL connections
- RSS refresh now concurrent (
asyncio.gather), ~10x faster with multiple sources - Torrent file download now concurrent, ~5x faster for multiple torrents
- Rename module concurrent file list fetching, ~20x faster
- Notification sending now concurrent, removed 2-second hardcoded delay
- Added TMDB and Mikan parser result caching to avoid duplicate API calls
- Database indexes added for
Torrent.url,Torrent.rss_id,Bangumi.title_raw,Bangumi.deleted,RSSItem.url - RSS batch enable/disable uses single transaction instead of per-item commits
- Pre-compiled regex patterns for torrent name parsing and filter matching
SeasonCollectorcreated outside loops, reuses single authentication- RSS parsing deduplication changed from O(n²) list lookup to O(1) set lookup
Episode/SeasonInfodataclasses use__slots__for reduced memory footprint
Changes
- Upgraded WebAuthn dependency to py_webauthn 2.7.0
_get_webauthn_from_requestprioritizes browser Origin header, fixing verification issues in cross-port development environmentsauth_userandupdate_user_infoconverted to async functionsTitleParser.tmdb_parserconverted to async functionRSSEnginemethods fully async (pull_rss,refresh_rss,download_bangumi,add_rss)Checker.check_downloaderconverted to async functionProgramStatusmigrated from threading to asyncio (Event, Lock)
Bugfixes
- Fixed downloader connection check with max retry limit
- Fixed transient network errors when adding torrents with retry logic
- Fixed multiple issues in search and subscription flow
- Improved torrent fetch reliability and error handling
- Fixed
aaguidtype error (nowstrin py_webauthn 2.7.0, no longerbytes) - Fixed missing
credential_backup_eligiblefield (replaced withcredential_device_type) - Fixed
verify_authentication_responsereceiving invalidcredential_idparameter causing TypeError - Fixed program startup blocking the server (fixes #891, #929, #886, #917, #946)
- Fixed search interface export not matching component expectations
- Fixed poster endpoint path check incorrectly intercepting all requests (fixes #933, #934)
- Fixed OpenAI parser security issue
- Fixed database tests using async sessions with sync code mismatch
- Fixed config field conflicts when upgrading from 3.1.x to 3.2 causing settings loss (fixes #956)
program.sleep_time/program.timesauto-migrated torss_time/rename_time- Removed deprecated
rss_parserfields (type,custom_url,token,enable_tmdb) - Fixed
ENV_TO_ATTRenvironment variable mapping pointing to non-existent model fields - Fixed
DEFAULT_SETTINGSinconsistency with current config model
- Fixed version upgrade migration logic errors (all upgrades calling 3.0→3.1 migration)
- Added version-aware migration dispatch based on source version
- Added
from_31_to_32()migration function for database schema changes
Frontend
Features
- Complete UI design system redesign
- Unified design tokens (colors, fonts, spacing, shadows, animations)
- Light/dark theme toggle support
- Comprehensive accessibility support (ARIA, keyboard navigation, focus management)
- Responsive layout for mobile devices
- Added first-run setup wizard page
- Multi-step wizard component (progress bar + step navigation)
- Route guard auto-detection and redirect to setup page
- Downloader/RSS/notification connection test feedback
- Chinese and English i18n support
- Added Passkey management panel (settings page)
- WebAuthn browser support detection
- Automatic device name identification
- Passkey list display and deletion
- Added Passkey fingerprint login button on login page (supports usernameless login)
- Added calendar view page
- Added downloader management page
- Added Bangumi card hover overlay (showing title and tags)
- Added
resolvePosterUrlutility function for unified external URL and local path handling (fixes #934) - Redesigned search panel with modal and filter system
- Added filter section supporting fansub group, resolution, subtitle type, and season filtering
- Multi-select filters with smart disable for incompatible options (grayed out)
- Result item tags changed to non-clickable colored pill style
- Unified tag styling (pill shape, 12px font)
- Standardized tag values (resolution: FHD/HD/4K, subtitles: CHS/CHT/Dual)
- Filter categories and result variants support expand/collapse
- Poster height auto-matches 4 rows of variant items (168px)
- Click outside modal to auto-close
- Redesigned login panel with modern glassmorphism style
- Added log level filter in log view
- Redesigned LLM settings panel (fixes #938)
- Redesigned settings, downloader, player, and log page styles
- Added search provider settings panel
- View, add, edit, delete search sources in UI
- Default sources (mikan, nyaa, dmhy) cannot be deleted
- URL template validation ensures
%splaceholder
- Added iOS-style notification badge system
- Yellow badge + purple border for subscriptions needing review
- Combined display support (e.g.,
! | 2for warning + multiple rules) - Yellow glow animation on cards needing attention
- Edit modal warning banner with one-click auto-detect and dismiss
- Rule selection modal highlights rules with warnings
- Calendar page bangumi grouping: same anime with multiple rules merged, click to select specific rule
- Bangumi list page collapsible "Archived" section
- Bangumi list page skeleton loading animation
- Rule editor episode offset field with "Auto Detect" button
- Empty state on home page now includes "Add RSS Subscription" button to guide new users
- Calendar page poster images now use lazy loading for better performance
- Calendar page "Unknown Air Date" section separated into its own block for better visual rhythm
- RSS management page connection status labels: green "Connected" when healthy, red "Error" with tooltip for details
- New mobile-first responsive design
- Three-tier breakpoint system: mobile (<640px), tablet (640-1023px), desktop (≥1024px)
- Mobile bottom navigation bar (with icons and text labels)
- Tablet mini sidebar (56px icon navigation)
- Mobile popups automatically switch to bottom sheets
- Pull-to-refresh support
- Horizontal swipe container support
- Mobile card list replacing data tables (RSS page)
- CSS Grid responsive layout (Bangumi card grid)
- Form labels stack vertically on mobile, full-width inputs
- Touch targets minimum 44px, meeting accessibility standards
- Safe area support (notched devices)
100dvhdynamic viewport height (fixes mobile browser address bar issue)viewport-fit=coverfor full-sc...
🌙3.2.3-beta.1
[3.2] - 2025-01
Backend
Features
- Added WebAuthn Passkey passwordless login support
- Register, authenticate, and manage Passkey credentials
- Multi-device credential backup detection (iCloud Keychain, etc.)
- Clone attack protection (sign_count verification)
- Authentication strategy pattern unifying password and Passkey login interfaces
- Usernameless login support via discoverable credentials (resident keys)
- Added season/episode offset auto-detection
- Analyzes TMDB episode air dates to detect "virtual seasons" (e.g., Frieren S1 split into two parts)
- Auto-identifies different parts when broadcast gap exceeds 6 months
- Calculates episode offset (e.g., RSS shows S2E1 → TMDB S1E29)
- Background scan thread automatically detects offset issues in existing subscriptions
- New API endpoints:
POST /bangumi/detect-offset,PATCH /bangumi/dismiss-review/{id}
- Added bangumi archive functionality
- Manual archive/unarchive support
- Auto-archive completed series
- New API endpoints:
PATCH /bangumi/archive/{id},PATCH /bangumi/unarchive/{id},GET /bangumi/refresh/metadata
- Added search provider configuration API
GET /search/provider/config- Get search provider configPUT /search/provider/config- Update search provider config
- Offset detection panel now shows suggested values (parsed season/episode and recommended offset)
- Fixed season offset not being applied to download folder path
- Setting season offset now auto-updates qBittorrent save path (e.g.,
Season 2→Season 1) - RSS rule save paths also sync the update
- Setting season offset now auto-updates qBittorrent save path (e.g.,
- Optimized episode offset suggestion logic
- Simple season mismatch no longer suggests episode offset (only virtual seasons need it)
- Improved prompt messages to clarify whether episode adjustment is needed
- Added RSS connection status tracking
- Records
connection_status(healthy/error),last_checked_at, andlast_errorafter each refresh
- Records
- Added first-run setup wizard
- 7-step guided configuration: account, downloader, RSS source, media path, notifications
- Downloader connection test, RSS source validation
- Optional steps can be skipped and configured later in settings
- Sentinel file mechanism (
config/.setup_complete) prevents re-triggering - Unauthenticated setup API (only available on first run, returns 403 after completion)
- Added calendar view with Bangumi.tv broadcast schedule integration
- Added downloader API and management interface
- Full async migration
- Database layer async support (aiosqlite) for non-blocking I/O in Passkey operations
UserDatabasesupports both sync/async modes for backward compatibilityDatabasecontext manager supports bothwith(sync) andasync with(async)- RSS engine, downloader, checker, and parser fully converted to async
- Network requests migrated from
requeststohttpx(AsyncClient)
- Backend migrated to
uvpackage manager (pyproject.toml + uv.lock) - Server startup uses background tasks to avoid blocking (fixes #891, #929)
- Database migration auto-fills NULL values with model defaults
- Database adds
needs_reviewandneeds_review_reasonfields for offset detection
Performance
- Shared HTTP client connection pool, reuses TCP/SSL connections
- RSS refresh now concurrent (
asyncio.gather), ~10x faster with multiple sources - Torrent file download now concurrent, ~5x faster for multiple torrents
- Rename module concurrent file list fetching, ~20x faster
- Notification sending now concurrent, removed 2-second hardcoded delay
- Added TMDB and Mikan parser result caching to avoid duplicate API calls
- Database indexes added for
Torrent.url,Torrent.rss_id,Bangumi.title_raw,Bangumi.deleted,RSSItem.url - RSS batch enable/disable uses single transaction instead of per-item commits
- Pre-compiled regex patterns for torrent name parsing and filter matching
SeasonCollectorcreated outside loops, reuses single authentication- RSS parsing deduplication changed from O(n²) list lookup to O(1) set lookup
Episode/SeasonInfodataclasses use__slots__for reduced memory footprint
Changes
- Upgraded WebAuthn dependency to py_webauthn 2.7.0
_get_webauthn_from_requestprioritizes browser Origin header, fixing verification issues in cross-port development environmentsauth_userandupdate_user_infoconverted to async functionsTitleParser.tmdb_parserconverted to async functionRSSEnginemethods fully async (pull_rss,refresh_rss,download_bangumi,add_rss)Checker.check_downloaderconverted to async functionProgramStatusmigrated from threading to asyncio (Event, Lock)
Bugfixes
- Fixed downloader connection check with max retry limit
- Fixed transient network errors when adding torrents with retry logic
- Fixed multiple issues in search and subscription flow
- Improved torrent fetch reliability and error handling
- Fixed
aaguidtype error (nowstrin py_webauthn 2.7.0, no longerbytes) - Fixed missing
credential_backup_eligiblefield (replaced withcredential_device_type) - Fixed
verify_authentication_responsereceiving invalidcredential_idparameter causing TypeError - Fixed program startup blocking the server (fixes #891, #929, #886, #917, #946)
- Fixed search interface export not matching component expectations
- Fixed poster endpoint path check incorrectly intercepting all requests (fixes #933, #934)
- Fixed OpenAI parser security issue
- Fixed database tests using async sessions with sync code mismatch
- Fixed config field conflicts when upgrading from 3.1.x to 3.2 causing settings loss (fixes #956)
program.sleep_time/program.timesauto-migrated torss_time/rename_time- Removed deprecated
rss_parserfields (type,custom_url,token,enable_tmdb) - Fixed
ENV_TO_ATTRenvironment variable mapping pointing to non-existent model fields - Fixed
DEFAULT_SETTINGSinconsistency with current config model
- Fixed version upgrade migration logic errors (all upgrades calling 3.0→3.1 migration)
- Added version-aware migration dispatch based on source version
- Added
from_31_to_32()migration function for database schema changes
Frontend
Features
- Complete UI design system redesign
- Unified design tokens (colors, fonts, spacing, shadows, animations)
- Light/dark theme toggle support
- Comprehensive accessibility support (ARIA, keyboard navigation, focus management)
- Responsive layout for mobile devices
- Added first-run setup wizard page
- Multi-step wizard component (progress bar + step navigation)
- Route guard auto-detection and redirect to setup page
- Downloader/RSS/notification connection test feedback
- Chinese and English i18n support
- Added Passkey management panel (settings page)
- WebAuthn browser support detection
- Automatic device name identification
- Passkey list display and deletion
- Added Passkey fingerprint login button on login page (supports usernameless login)
- Added calendar view page
- Added downloader management page
- Added Bangumi card hover overlay (showing title and tags)
- Added
resolvePosterUrlutility function for unified external URL and local path handling (fixes #934) - Redesigned search panel with modal and filter system
- Added filter section supporting fansub group, resolution, subtitle type, and season filtering
- Multi-select filters with smart disable for incompatible options (grayed out)
- Result item tags changed to non-clickable colored pill style
- Unified tag styling (pill shape, 12px font)
- Standardized tag values (resolution: FHD/HD/4K, subtitles: CHS/CHT/Dual)
- Filter categories and result variants support expand/collapse
- Poster height auto-matches 4 rows of variant items (168px)
- Click outside modal to auto-close
- Redesigned login panel with modern glassmorphism style
- Added log level filter in log view
- Redesigned LLM settings panel (fixes #938)
- Redesigned settings, downloader, player, and log page styles
- Added search provider settings panel
- View, add, edit, delete search sources in UI
- Default sources (mikan, nyaa, dmhy) cannot be deleted
- URL template validation ensures
%splaceholder
- Added iOS-style notification badge system
- Yellow badge + purple border for subscriptions needing review
- Combined display support (e.g.,
! | 2for warning + multiple rules) - Yellow glow animation on cards needing attention
- Edit modal warning banner with one-click auto-detect and dismiss
- Rule selection modal highlights rules with warnings
- Calendar page bangumi grouping: same anime with multiple rules merged, click to select specific rule
- Bangumi list page collapsible "Archived" section
- Bangumi list page skeleton loading animation
- Rule editor episode offset field with "Auto Detect" button
- Empty state on home page now includes "Add RSS Subscription" button to guide new users
- Calendar page poster images now use lazy loading for better performance
- Calendar page "Unknown Air Date" section separated into its own block for better visual rhythm
- RSS management page connection status labels: green "Connected" when healthy, red "Error" with tooltip for details
- New mobile-first responsive design
- Three-tier breakpoint system: mobile (<640px), tablet (640-1023px), desktop (≥1024px)
- Mobile bottom navigation bar (with icons and text labels)
- Tablet mini sidebar (56px icon navigation)
- Mobile popups automatically switch to bottom sheets
- Pull-to-refresh support
- Horizontal swipe container support
- Mobile card list replacing data tables (RSS page)
- CSS Grid responsive layout (Bangumi card grid)
- Form labels stack vertically on mobile, full-width inputs
- Touch targets minimum 44px, meeting accessibility standards
- Safe area support (notched devices)
100dvhdynamic viewport height (fixes mobile browser address bar issue)viewport-fit=coverfor full-sc...
🌟3.2.2
Summary
- fix(ci): Extract version number from PR title for proper Docker tagging and release creation
Test plan
- CI workflow extracts version correctly from PR titles
🤖 Generated with Claude Code