diff --git a/docs/.vitepress/config.ts b/docs/.vitepress/config.ts index 385bae72..b971fb06 100644 --- a/docs/.vitepress/config.ts +++ b/docs/.vitepress/config.ts @@ -87,6 +87,7 @@ export default defineConfig({ items: [ { text: 'RSS Management', link: '/feature/rss' }, { text: 'Bangumi Management', link: '/feature/bangumi' }, + { text: 'Calendar View', link: '/feature/calendar' }, { text: 'File Renaming', link: '/feature/rename' }, { text: 'Torrent Search', link: '/feature/search' }, ], diff --git a/docs/changelog/3.2.md b/docs/changelog/3.2.md index 005b8213..d13fd599 100644 --- a/docs/changelog/3.2.md +++ b/docs/changelog/3.2.md @@ -10,6 +10,21 @@ - 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 +- 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 @@ -27,6 +42,22 @@ - 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 @@ -89,6 +120,21 @@ - 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 +- 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) @@ -114,6 +160,16 @@ - `ab-mobile-nav` — Enhanced bottom navigation bar (icon + label + active indicator) - `useSafeArea` — Safe area composable +### Performance + +- Downloader store uses `shallowRef` instead of `ref` to avoid deep reactive proxy on large arrays +- Table column definitions moved to `computed` to 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-select` `watchEffect` changed to `watch`, eliminates invalid emit on mount +- `useClipboard` hoisted to store top level, avoids creating new instance on each `copy()` +- `setInterval` replaced with `useIntervalFn` for automatic lifecycle management + ### Changes - Refactored search logic, removed rxjs dependency diff --git a/docs/feature/bangumi.md b/docs/feature/bangumi.md index df77c8ee..b08ceb30 100644 --- a/docs/feature/bangumi.md +++ b/docs/feature/bangumi.md @@ -2,7 +2,67 @@ Click an anime poster on the homepage to manage individual anime entries. -![Edit Bangumi](../image/feature/edit.png) +![Bangumi List](../image/feature/bangumi-list.png) + +If an anime has multiple download rules (e.g., different subtitle groups), a rule selection popup will appear: + +![Rule Selection](../image/feature/rule-select.png) + +After selecting a rule, the edit modal opens: + +![Edit Bangumi](../image/feature/bangumi-edit.png) + +## Notification Badges + +Since v3.2, bangumi cards display iOS-style notification badges to indicate status: + +- **Yellow badge with `!`**: Subscription needs review (e.g., offset issues detected) +- **Number badge**: Multiple rules exist for this anime +- **Combined badge** (e.g., `! | 2`): Has warning and multiple rules + +Cards with warnings also display a yellow glow animation to draw attention. + +## Episode Offset Auto-Detection + +Some anime have complex season structures that cause mismatches between RSS episode numbers and TMDB data. For example: +- "Frieren: Beyond Journey's End" Season 1 was broadcast in two parts with a 6-month gap +- RSS may show "S2E01" while TMDB considers it "S1E29" + +AB v3.2 can automatically detect these issues: + +1. Click the **Auto Detect** button in the edit modal +2. AB analyzes TMDB episode air dates to identify "virtual seasons" +3. If a mismatch is found, AB suggests the correct offset values +4. Click **Apply** to save the offset + +The background scan thread also periodically checks existing subscriptions for offset issues and marks them for review. + +## Archive / Unarchive Anime + +Since v3.2, you can archive completed or inactive anime to keep your list organized. + +### Manual Archive + +1. Click on an anime poster +2. In the edit modal, click the **Archive** button +3. The anime moves to the "Archived" section at the bottom of the list + +### Automatic Archive + +AB can automatically archive anime when: +- The series status on TMDB shows as "Ended" or "Canceled" +- Use **Config** → refresh metadata to trigger auto-archive + +### Viewing Archived Anime + +Archived anime appear in a collapsible "Archived" section at the bottom of the bangumi list. Click to expand and view archived items. + +### Unarchive + +To restore an archived anime: +1. Expand the "Archived" section +2. Click on the anime poster +3. Click the **Unarchive** button ## Disable / Delete Anime @@ -11,3 +71,13 @@ Since AB continuously parses **aggregated RSS** feeds, for download rules from a - Remove the subscription from the aggregated RSS If you delete the anime entry, it will be recreated on the next parse cycle. + +## Advanced Settings + +Click **Advanced Settings** in the edit modal to access additional options: + +![Advanced Settings](../image/feature/bangumi-edit-advanced.png) + +- **Season Offset**: Adjust the season number offset +- **Episode Offset**: Adjust the episode number offset +- **Filter**: Custom regex filter for torrent matching diff --git a/docs/feature/calendar.md b/docs/feature/calendar.md new file mode 100644 index 00000000..a373576e --- /dev/null +++ b/docs/feature/calendar.md @@ -0,0 +1,40 @@ +# Calendar View + +Since v3.2, AB includes a calendar view that shows your subscribed anime organized by broadcast day. + +![Calendar](../image/feature/calendar.png) + +## Features + +### Weekly Schedule + +The calendar displays anime organized by their broadcast weekday (Monday through Sunday), plus an "Unknown" column for anime without broadcast schedule data. + +### Bangumi.tv Integration + +AB fetches broadcast schedule data from Bangumi.tv to accurately display when each anime airs. + +Click the **Refresh schedule** button to update the broadcast data. + +### Grouped Display + +Since v3.2, anime with multiple download rules are grouped together: + +- Same anime appears once, even with multiple subtitle group rules +- Click on a grouped anime to see all available rules +- Select a specific rule to edit + +This keeps the calendar clean while still providing access to all your rules. + +## Navigation + +Click on any anime poster in the calendar to: +- View anime details +- Edit download rules +- Access archive/disable options + +## Tips + +::: tip +If an anime appears in the "Unknown" column, it may not have broadcast data on Bangumi.tv, or the anime title couldn't be matched. +::: diff --git a/docs/feature/rename.md b/docs/feature/rename.md index 219d2104..cb85840e 100644 --- a/docs/feature/rename.md +++ b/docs/feature/rename.md @@ -38,3 +38,24 @@ AB can also rename subtitle files in the first-level directory. After renaming, episodes and directories are placed in the `Season` folder. Renamed collections are moved and categorized under `BangumiCollection`. + +## Episode Offset + +Since v3.2, AB supports episode offset for renaming. This is useful when: +- RSS shows different episode numbers than expected (e.g., S2E01 should be S1E29) +- Anime has "virtual seasons" due to broadcast gaps + +When an offset is configured for a bangumi, AB automatically applies it during renaming: + +``` +Original: S02E01.mkv +With offset (season: -1, episode: +28): S01E29.mkv +``` + +To configure offset: +1. Click on the anime poster +2. Open Advanced Settings +3. Set Season Offset and/or Episode Offset values +4. Or use "Auto Detect" to let AB suggest the correct offset + +See [Bangumi Management](./bangumi.md#episode-offset-auto-detection) for more details on auto-detection. diff --git a/docs/feature/rss.md b/docs/feature/rss.md index 56cf9fe8..87384bdd 100644 --- a/docs/feature/rss.md +++ b/docs/feature/rss.md @@ -4,6 +4,25 @@ title: RSS Management # RSS Management +## RSS Manager Page + +The RSS Manager page displays all your RSS subscriptions with their connection status. + +![RSS Manager](../image/feature/rss-manager.png) + +### Connection Status + +Since v3.2, AB tracks the connection status of each RSS source: + +| Status | Description | +|--------|-------------| +| **Connected** (green) | RSS source is reachable and returning valid data | +| **Error** (red) | RSS source failed to respond or returned invalid data | + +When a source shows an error, hover over the status label to see the error details in a tooltip. + +AB automatically updates the connection status on each RSS refresh cycle. + ## Adding Collections AB provides two manual download methods: diff --git a/docs/feature/search.md b/docs/feature/search.md index 4aa54056..3037b460 100644 --- a/docs/feature/search.md +++ b/docs/feature/search.md @@ -8,7 +8,9 @@ Since v3.1, AB includes a search feature for quickly finding anime. The search feature relies on the main program's parser. The current version does not support parsing collections. A `warning` when parsing collections is normal behavior. ::: -The search bar is located in the AB top bar. You can select the source site on the right side of the search bar, such as: Mikan Project, Nyaa, etc. +The search bar is located in the AB top bar. Click to open the search panel. + +![Search Panel](../image/feature/search-panel.png) Select the source site, enter keywords, and AB will automatically parse and display search results. To add an anime, click the add button on the right side of the card. @@ -16,11 +18,47 @@ Select the source site, enter keywords, and AB will automatically parse and disp When the source is **Mikan**, AB uses the `mikan` parser by default. For other sources, the TMDB parser is used. ::: -## Adding Custom Sources +## Managing Search Sources -Users can manually add source sites by editing `config/search_provider.json`. +Since v3.2, you can manage search sources directly in the Settings page without editing JSON files. + +### Search Provider Settings Panel + +Navigate to **Config** → **Search Provider** to access the settings panel. + +![Search Provider Settings](../image/feature/search-provider.png) + +From here you can: +- **View** all configured search sources +- **Add** new search sources with the "Add Provider" button +- **Edit** existing source URLs +- **Delete** custom sources (default sources mikan, nyaa, dmhy cannot be deleted) + +### URL Template Format + +When adding a custom source, the URL must contain `%s` as a placeholder for the search keyword. + +Example: +``` +https://example.com/rss/search?q=%s +``` + +The `%s` will be replaced with the user's search query. + +### Default Sources + +The following sources are built-in and cannot be deleted: + +| Source | URL Template | +|--------|--------------| +| mikan | `https://mikanani.me/RSS/Search?searchstr=%s` | +| nyaa | `https://nyaa.si/?page=rss&q=%s&c=0_0&f=0` | +| dmhy | `http://dmhy.org/topics/rss/rss.xml?keyword=%s` | + +### Adding Sources via Config File + +You can also manually add sources by editing `config/search_provider.json`: -Default configuration: ```json { "mikan": "https://mikanani.me/RSS/Search?searchstr=%s", diff --git a/docs/image/feature/bangumi-edit-advanced.png b/docs/image/feature/bangumi-edit-advanced.png new file mode 100644 index 00000000..6802374f Binary files /dev/null and b/docs/image/feature/bangumi-edit-advanced.png differ diff --git a/docs/image/feature/bangumi-edit.png b/docs/image/feature/bangumi-edit.png new file mode 100644 index 00000000..ffe8cc29 Binary files /dev/null and b/docs/image/feature/bangumi-edit.png differ diff --git a/docs/image/feature/bangumi-list.png b/docs/image/feature/bangumi-list.png new file mode 100644 index 00000000..daec78f8 Binary files /dev/null and b/docs/image/feature/bangumi-list.png differ diff --git a/docs/image/feature/calendar.png b/docs/image/feature/calendar.png new file mode 100644 index 00000000..38f1f223 Binary files /dev/null and b/docs/image/feature/calendar.png differ diff --git a/docs/image/feature/login.png b/docs/image/feature/login.png new file mode 100644 index 00000000..1e346769 Binary files /dev/null and b/docs/image/feature/login.png differ diff --git a/docs/image/feature/rss-manager.png b/docs/image/feature/rss-manager.png new file mode 100644 index 00000000..663c0b38 Binary files /dev/null and b/docs/image/feature/rss-manager.png differ diff --git a/docs/image/feature/rule-select.png b/docs/image/feature/rule-select.png new file mode 100644 index 00000000..7d9ed56b Binary files /dev/null and b/docs/image/feature/rule-select.png differ diff --git a/docs/image/feature/search-panel.png b/docs/image/feature/search-panel.png new file mode 100644 index 00000000..47bf3e75 Binary files /dev/null and b/docs/image/feature/search-panel.png differ diff --git a/docs/image/feature/search-provider.png b/docs/image/feature/search-provider.png new file mode 100644 index 00000000..8f6bdef6 Binary files /dev/null and b/docs/image/feature/search-provider.png differ diff --git a/docs/image/feature/settings.png b/docs/image/feature/settings.png new file mode 100644 index 00000000..dbaf70f0 Binary files /dev/null and b/docs/image/feature/settings.png differ