Skip to content

Releases: EstrellaXD/Auto_Bangumi

🌟3.2.6

01 Mar 07:26
717ad11

Choose a tag to compare

Summary

  • fix(database): add missing search_official_title method to BangumiDatabase (#1005, #998)
  • fix(parser): handle None return from raw_parser to avoid AttributeError on 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 AttributeError on search_official_title
  • Verify non-episodic resources (movies, collections) are skipped gracefully during RSS parsing

🤖 Generated with Claude Code

🌟3.2.5

28 Feb 21:55
ccafd04

Choose a tag to compare

更新内容

  • 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

24 Feb 19:02
e1b90c9

Choose a tag to compare

Summary

  • fix(downloader): 修复 qBittorrent SSL 连接问题,解耦 HTTPS 协议选择与 TLS 证书验证 (#923)
  • fix(downloader): 修复 torrents_rename_file 重命名验证循环逻辑错误 (continuebreak)
  • 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

23 Feb 12:01
ba61194

Choose a tag to compare

3.2.3

Added

  • MCP 服务器:新增 Model Context Protocol 服务器,支持通过 Claude Desktop 等 LLM 工具管理番剧订阅
    • SSE 传输层挂载在 /mcp/sse
    • 10 个工具 + 4 个资源,本地网络 IP 白名单安全中间件
  • 通知系统重构:支持多通知渠道同时启用(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

  • 新增 26 个回归测试覆盖 #974#976#977#986
  • 扩展 raw_parser、torrent_parser、path_parser 测试覆盖率
  • 新增 E2E 集成测试套件

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

22 Feb 17:27

Choose a tag to compare

🌙3.2.3-beta.5 Pre-release
Pre-release

[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 config
    • PUT /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 2Season 1)
    • RSS rule save paths also sync the update
  • 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, and last_error after each refresh
  • 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
    • UserDatabase supports both sync/async modes for backward compatibility
    • Database context manager supports both with (sync) and async with (async)
    • RSS engine, downloader, checker, and parser fully converted to async
    • Network requests migrated from requests to httpx (AsyncClient)
  • Backend migrated to uv package 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_review and needs_review_reason fields 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
  • SeasonCollector created outside loops, reuses single authentication
  • RSS parsing deduplication changed from O(n²) list lookup to O(1) set lookup
  • Episode/SeasonInfo dataclasses use __slots__ for reduced memory footprint

Changes

  • Upgraded WebAuthn dependency to py_webauthn 2.7.0
  • _get_webauthn_from_request prioritizes browser Origin header, fixing verification issues in cross-port development environments
  • auth_user and update_user_info converted to async functions
  • TitleParser.tmdb_parser converted to async function
  • RSSEngine methods fully async (pull_rss, refresh_rss, download_bangumi, add_rss)
  • Checker.check_downloader converted to async function
  • ProgramStatus migrated 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 aaguid type error (now str in py_webauthn 2.7.0, no longer bytes)
  • Fixed missing credential_backup_eligible field (replaced with credential_device_type)
  • Fixed verify_authentication_response receiving invalid credential_id parameter 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.times auto-migrated to rss_time / rename_time
    • Removed deprecated rss_parser fields (type, custom_url, token, enable_tmdb)
    • Fixed ENV_TO_ATTR environment variable mapping pointing to non-existent model fields
    • Fixed DEFAULT_SETTINGS inconsistency 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 resolvePosterUrl utility 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 %s placeholder
  • Added iOS-style notification badge system
    • Yellow badge + purple border for subscriptions needing review
    • Combined display support (e.g., ! | 2 for 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)
    • 100dvh dynamic viewport height (fixes mobile browser address bar issue)
    • viewport-fit=cover for full-sc...
Read more

🌙3.2.3-beta.4

22 Feb 13:15

Choose a tag to compare

🌙3.2.3-beta.4 Pre-release
Pre-release

[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 config
    • PUT /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 2Season 1)
    • RSS rule save paths also sync the update
  • 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, and last_error after each refresh
  • 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
    • UserDatabase supports both sync/async modes for backward compatibility
    • Database context manager supports both with (sync) and async with (async)
    • RSS engine, downloader, checker, and parser fully converted to async
    • Network requests migrated from requests to httpx (AsyncClient)
  • Backend migrated to uv package 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_review and needs_review_reason fields 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
  • SeasonCollector created outside loops, reuses single authentication
  • RSS parsing deduplication changed from O(n²) list lookup to O(1) set lookup
  • Episode/SeasonInfo dataclasses use __slots__ for reduced memory footprint

Changes

  • Upgraded WebAuthn dependency to py_webauthn 2.7.0
  • _get_webauthn_from_request prioritizes browser Origin header, fixing verification issues in cross-port development environments
  • auth_user and update_user_info converted to async functions
  • TitleParser.tmdb_parser converted to async function
  • RSSEngine methods fully async (pull_rss, refresh_rss, download_bangumi, add_rss)
  • Checker.check_downloader converted to async function
  • ProgramStatus migrated 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 aaguid type error (now str in py_webauthn 2.7.0, no longer bytes)
  • Fixed missing credential_backup_eligible field (replaced with credential_device_type)
  • Fixed verify_authentication_response receiving invalid credential_id parameter 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.times auto-migrated to rss_time / rename_time
    • Removed deprecated rss_parser fields (type, custom_url, token, enable_tmdb)
    • Fixed ENV_TO_ATTR environment variable mapping pointing to non-existent model fields
    • Fixed DEFAULT_SETTINGS inconsistency 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 resolvePosterUrl utility 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 %s placeholder
  • Added iOS-style notification badge system
    • Yellow badge + purple border for subscriptions needing review
    • Combined display support (e.g., ! | 2 for 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)
    • 100dvh dynamic viewport height (fixes mobile browser address bar issue)
    • viewport-fit=cover for full-sc...
Read more

🌙3.2.3-beta.3

30 Jan 12:17

Choose a tag to compare

🌙3.2.3-beta.3 Pre-release
Pre-release

[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 config
    • PUT /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 2Season 1)
    • RSS rule save paths also sync the update
  • 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, and last_error after each refresh
  • 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
    • UserDatabase supports both sync/async modes for backward compatibility
    • Database context manager supports both with (sync) and async with (async)
    • RSS engine, downloader, checker, and parser fully converted to async
    • Network requests migrated from requests to httpx (AsyncClient)
  • Backend migrated to uv package 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_review and needs_review_reason fields 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
  • SeasonCollector created outside loops, reuses single authentication
  • RSS parsing deduplication changed from O(n²) list lookup to O(1) set lookup
  • Episode/SeasonInfo dataclasses use __slots__ for reduced memory footprint

Changes

  • Upgraded WebAuthn dependency to py_webauthn 2.7.0
  • _get_webauthn_from_request prioritizes browser Origin header, fixing verification issues in cross-port development environments
  • auth_user and update_user_info converted to async functions
  • TitleParser.tmdb_parser converted to async function
  • RSSEngine methods fully async (pull_rss, refresh_rss, download_bangumi, add_rss)
  • Checker.check_downloader converted to async function
  • ProgramStatus migrated 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 aaguid type error (now str in py_webauthn 2.7.0, no longer bytes)
  • Fixed missing credential_backup_eligible field (replaced with credential_device_type)
  • Fixed verify_authentication_response receiving invalid credential_id parameter 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.times auto-migrated to rss_time / rename_time
    • Removed deprecated rss_parser fields (type, custom_url, token, enable_tmdb)
    • Fixed ENV_TO_ATTR environment variable mapping pointing to non-existent model fields
    • Fixed DEFAULT_SETTINGS inconsistency 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 resolvePosterUrl utility 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 %s placeholder
  • Added iOS-style notification badge system
    • Yellow badge + purple border for subscriptions needing review
    • Combined display support (e.g., ! | 2 for 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)
    • 100dvh dynamic viewport height (fixes mobile browser address bar issue)
    • viewport-fit=cover for full-sc...
Read more

🌙3.2.3-beta.2

28 Jan 19:32

Choose a tag to compare

🌙3.2.3-beta.2 Pre-release
Pre-release

[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 config
    • PUT /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 2Season 1)
    • RSS rule save paths also sync the update
  • 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, and last_error after each refresh
  • 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
    • UserDatabase supports both sync/async modes for backward compatibility
    • Database context manager supports both with (sync) and async with (async)
    • RSS engine, downloader, checker, and parser fully converted to async
    • Network requests migrated from requests to httpx (AsyncClient)
  • Backend migrated to uv package 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_review and needs_review_reason fields 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
  • SeasonCollector created outside loops, reuses single authentication
  • RSS parsing deduplication changed from O(n²) list lookup to O(1) set lookup
  • Episode/SeasonInfo dataclasses use __slots__ for reduced memory footprint

Changes

  • Upgraded WebAuthn dependency to py_webauthn 2.7.0
  • _get_webauthn_from_request prioritizes browser Origin header, fixing verification issues in cross-port development environments
  • auth_user and update_user_info converted to async functions
  • TitleParser.tmdb_parser converted to async function
  • RSSEngine methods fully async (pull_rss, refresh_rss, download_bangumi, add_rss)
  • Checker.check_downloader converted to async function
  • ProgramStatus migrated 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 aaguid type error (now str in py_webauthn 2.7.0, no longer bytes)
  • Fixed missing credential_backup_eligible field (replaced with credential_device_type)
  • Fixed verify_authentication_response receiving invalid credential_id parameter 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.times auto-migrated to rss_time / rename_time
    • Removed deprecated rss_parser fields (type, custom_url, token, enable_tmdb)
    • Fixed ENV_TO_ATTR environment variable mapping pointing to non-existent model fields
    • Fixed DEFAULT_SETTINGS inconsistency 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 resolvePosterUrl utility 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 %s placeholder
  • Added iOS-style notification badge system
    • Yellow badge + purple border for subscriptions needing review
    • Combined display support (e.g., ! | 2 for 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)
    • 100dvh dynamic viewport height (fixes mobile browser address bar issue)
    • viewport-fit=cover for full-sc...
Read more

🌙3.2.3-beta.1

28 Jan 07:25

Choose a tag to compare

🌙3.2.3-beta.1 Pre-release
Pre-release

[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 config
    • PUT /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 2Season 1)
    • RSS rule save paths also sync the update
  • 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, and last_error after each refresh
  • 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
    • UserDatabase supports both sync/async modes for backward compatibility
    • Database context manager supports both with (sync) and async with (async)
    • RSS engine, downloader, checker, and parser fully converted to async
    • Network requests migrated from requests to httpx (AsyncClient)
  • Backend migrated to uv package 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_review and needs_review_reason fields 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
  • SeasonCollector created outside loops, reuses single authentication
  • RSS parsing deduplication changed from O(n²) list lookup to O(1) set lookup
  • Episode/SeasonInfo dataclasses use __slots__ for reduced memory footprint

Changes

  • Upgraded WebAuthn dependency to py_webauthn 2.7.0
  • _get_webauthn_from_request prioritizes browser Origin header, fixing verification issues in cross-port development environments
  • auth_user and update_user_info converted to async functions
  • TitleParser.tmdb_parser converted to async function
  • RSSEngine methods fully async (pull_rss, refresh_rss, download_bangumi, add_rss)
  • Checker.check_downloader converted to async function
  • ProgramStatus migrated 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 aaguid type error (now str in py_webauthn 2.7.0, no longer bytes)
  • Fixed missing credential_backup_eligible field (replaced with credential_device_type)
  • Fixed verify_authentication_response receiving invalid credential_id parameter 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.times auto-migrated to rss_time / rename_time
    • Removed deprecated rss_parser fields (type, custom_url, token, enable_tmdb)
    • Fixed ENV_TO_ATTR environment variable mapping pointing to non-existent model fields
    • Fixed DEFAULT_SETTINGS inconsistency 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 resolvePosterUrl utility 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 %s placeholder
  • Added iOS-style notification badge system
    • Yellow badge + purple border for subscriptions needing review
    • Combined display support (e.g., ! | 2 for 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)
    • 100dvh dynamic viewport height (fixes mobile browser address bar issue)
    • viewport-fit=cover for full-sc...
Read more

🌟3.2.2

27 Jan 10:11
93eae80

Choose a tag to compare

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