Releases: EstrellaXD/Auto_Bangumi
Releases · EstrellaXD/Auto_Bangumi
🌙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
3.2.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.0
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_review和needs_review_reason字段 - 新增
schema_version表追踪迁移版本
🤖 Generated with Claude Code
🌙3.2.0-beta.13
Changes since 3.2.0-beta.12
Features
- feat(database): add title alias system for mid-season naming changes
Fixes
- fix(webui): prevent empty search and cancel search on modal close
- fix(webui): fix iOS Safari input zoom and keyboard issues
- fix(error-handling): replace bare except clauses with specific exceptions
Performance
- perf(database): optimize N+1 queries and add caching
Documentation
- docs(dev): add database developer guide
Full Changelog: 3.2.0-beta.12...3.2.0-beta.13
🌙3.2.0-beta.12
[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
- 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
- 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
- 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-screen devices
New Components
ab-bottom-sheet— Touch-driven bottom sheet component (drag to close, max height limit)ab-adaptive-modal— Adaptive modal (bottom sheet on mobile / centered dialog on desktop)ab-pull-refresh— Pull-to-refresh wrapper componentab-swipe-container— Horizontal swipe container (CSS scroll-snap)ab-data-list— Mobile-friendly card list (replacing NDataTable)ab-mobile-nav— Enhanced bottom navigation bar (icon + label + active indicator)useSafeArea— Safe area composable
Performance
- Downloader store uses
shallowRefinstead ofrefto avoid deep reactive proxy on large arrays - Table column definitions moved to
computedto avoid rebuilding on each render - RSS table columns separated from data, column config not rebuilt on data changes
- Calendar page removed duplicate
getAll()calls ab-selectwatchEffectchanged towatch, eliminates invalid emit on mountuseClipboardhoisted to store top level, avoids creating new instance on eachcopy()setIntervalreplaced withuseIntervalFnfor automatic lifecycle management
Changes
- Refactored search logic, removed rxjs dependency
- Search store export refactored to match component expectations
- Upgraded frontend dependencies
- Breakpoint system expanded ...
🌙3.2.0-beta.9
[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 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
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
- 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
- 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-screen devices
New Components
ab-bottom-sheet— Touch-driven bottom sheet component (drag to close, max height limit)ab-adaptive-modal— Adaptive modal (bottom sheet on mobile / centered dialog on desktop)ab-pull-refresh— Pull-to-refresh wrapper componentab-swipe-container— Horizontal swipe container (CSS scroll-snap)ab-data-list— Mobile-friendly card list (replacing NDataTable)ab-mobile-nav— Enhanced bottom navigation bar (icon + label + active indicator)useSafeArea— Safe area composable
Changes
- Refactored search logic, removed rxjs dependency
- Search store export refactored to match component expectations
- Upgraded frontend dependencies
- Breakpoint system expanded from single 1024px to 640px + 1024px two-tier
useBreakpointQueryaddedisTablet,isMobileOrTablet,isTabletOrPCmedia-query.vueadded#tabletslot (falls back to#mobile)- UnoCSS added
sm: 640pxbreakpoint ab-inputmobile full-width + increased touch target styling- Layout uses
dvhunits instead ofvh, supports safe-area-inset - Fixed calendar page unknown column width
- Unified action bar button sizes in downloader page
CI/Infrastructure
- CI added build test on PR open (dev branch PRs to main auto-trigger build)
- CI upgraded
actions/upload-artifactandactions/download-artifactto v4 - Docker build removed
linux/arm/v7platform (uv image doesn't support it) - Added CLAUDE.md development guide
🌙3.2.0-beta.7
[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
- 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
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
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
- 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
- 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
- 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-screen devices
New Components
ab-bottom-sheet— Touch-driven bottom sheet component (drag to close, max height limit)ab-adaptive-modal— Adaptive modal (bottom sheet on mobile / centered dialog on desktop)ab-pull-refresh— Pull-to-refresh wrapper componentab-swipe-container— Horizontal swipe container (CSS scroll-snap)ab-data-list— Mobile-friendly card list (replacing NDataTable)ab-mobile-nav— Enhanced bottom navigation bar (icon + label + active indicator)useSafeArea— Safe area composable
Changes
- Refactored search logic, removed rxjs dependency
- Search store export refactored to match component expectations
- Upgraded frontend dependencies
- Breakpoint system expanded from single 1024px to 640px + 1024px two-tier
useBreakpointQueryaddedisTablet,isMobileOrTablet,isTabletOrPCmedia-query.vueadded#tabletslot (falls back to#mobile)- UnoCSS added
sm: 640pxbreakpoint ab-inputmobile full-width + increased touch target styling- Layout uses
dvhunits instead ofvh, supports safe-area-inset - Fixed calendar page unknown column width
- Unified action bar button sizes in downloader page
CI/Infrastructure
- CI added build test on PR open (dev branch PRs to main auto-trigger build)
- CI upgraded
actions/upload-artifactandactions/download-artifactto v4 - Docker build removed
linux/arm/v7platform (uv image doesn't support it) - Added CLAUDE.md development guide