docs: add i18n support with Chinese as default language

- Configure VitePress locales with zh-CN as root and en-US as /en/
- Translate all documentation to Chinese (31 files)
- Create English documentation under /en/ directory
- Add Chinese UI labels for navigation and pagination
- Language switcher now available in site header

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

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
This commit is contained in:
Estrella Pan
2026-01-27 07:57:13 +01:00
parent 7e9f3a707a
commit 03bf265651
63 changed files with 4750 additions and 1414 deletions

619
docs/en/api/index.md Normal file
View File

@@ -0,0 +1,619 @@
# REST API Reference
AutoBangumi exposes a REST API at `/api/v1`. All endpoints (except login and setup) require JWT authentication.
**Base URL:** `http://your-host:7892/api/v1`
**Authentication:** Include the JWT token as a cookie or `Authorization: Bearer <token>` header.
**Interactive Docs:** When running in development mode, Swagger UI is available at `http://your-host:7892/docs`.
---
## Authentication
### Login
```
POST /auth/login
```
Authenticate with username and password.
**Request Body:**
```json
{
"username": "string",
"password": "string"
}
```
**Response:** Sets authentication cookie with JWT token.
### Refresh Token
```
GET /auth/refresh_token
```
Refresh the current authentication token.
### Logout
```
GET /auth/logout
```
Clear authentication cookies and log out.
### Update Credentials
```
POST /auth/update
```
Update username and/or password.
**Request Body:**
```json
{
"username": "string",
"password": "string"
}
```
---
## Passkey / WebAuthn <Badge type="tip" text="v3.2+" />
Passwordless authentication using WebAuthn/FIDO2 Passkeys.
### Register Passkey
```
POST /passkey/register/options
```
Get WebAuthn registration options (challenge, relying party info).
```
POST /passkey/register/verify
```
Verify and save the Passkey registration response from the browser.
### Authenticate with Passkey
```
POST /passkey/auth/options
```
Get WebAuthn authentication challenge options.
```
POST /passkey/auth/verify
```
Verify the Passkey authentication response and issue a JWT token.
### Manage Passkeys
```
GET /passkey/list
```
List all registered Passkeys for the current user.
```
POST /passkey/delete
```
Delete a registered Passkey by credential ID.
---
## Configuration
### Get Configuration
```
GET /config/get
```
Retrieve the current application configuration.
**Response:** Full configuration object including `program`, `downloader`, `rss_parser`, `bangumi_manager`, `notification`, `proxy`, and `experimental_openai` sections.
### Update Configuration
```
PATCH /config/update
```
Partially update the application configuration. Only include fields you want to change.
**Request Body:** Partial configuration object.
---
## Bangumi (Anime Rules)
### List All Bangumi
```
GET /bangumi/get/all
```
Get all anime download rules.
### Get Bangumi by ID
```
GET /bangumi/get/{bangumi_id}
```
Get a specific anime rule by ID.
### Update Bangumi
```
PATCH /bangumi/update/{bangumi_id}
```
Update an anime rule's metadata (title, season, episode offset, etc.).
### Delete Bangumi
```
DELETE /bangumi/delete/{bangumi_id}
```
Delete a single anime rule and its associated torrents.
```
DELETE /bangumi/delete/many/
```
Batch delete multiple anime rules.
**Request Body:**
```json
{
"bangumi_ids": [1, 2, 3]
}
```
### Disable / Enable Bangumi
```
DELETE /bangumi/disable/{bangumi_id}
```
Disable an anime rule (keeps files, stops downloading).
```
DELETE /bangumi/disable/many/
```
Batch disable multiple anime rules.
```
GET /bangumi/enable/{bangumi_id}
```
Re-enable a previously disabled anime rule.
### Poster Refresh
```
GET /bangumi/refresh/poster/all
```
Refresh poster images for all anime from TMDB.
```
GET /bangumi/refresh/poster/{bangumi_id}
```
Refresh the poster image for a specific anime.
### Calendar
```
GET /bangumi/refresh/calendar
```
Refresh the anime broadcast calendar data from Bangumi.tv.
### Reset All
```
GET /bangumi/reset/all
```
Delete all anime rules. Use with caution.
---
## RSS Feeds
### List All Feeds
```
GET /rss
```
Get all configured RSS feeds.
### Add Feed
```
POST /rss/add
```
Add a new RSS feed subscription.
**Request Body:**
```json
{
"url": "string",
"aggregate": true,
"parser": "mikan"
}
```
### Enable / Disable Feeds
```
POST /rss/enable/many
```
Enable multiple RSS feeds.
```
PATCH /rss/disable/{rss_id}
```
Disable a single RSS feed.
```
POST /rss/disable/many
```
Batch disable multiple RSS feeds.
### Delete Feeds
```
DELETE /rss/delete/{rss_id}
```
Delete a single RSS feed.
```
POST /rss/delete/many
```
Batch delete multiple RSS feeds.
### Update Feed
```
PATCH /rss/update/{rss_id}
```
Update an RSS feed's configuration.
### Refresh Feeds
```
GET /rss/refresh/all
```
Manually trigger a refresh of all RSS feeds.
```
GET /rss/refresh/{rss_id}
```
Refresh a specific RSS feed.
### Get Torrents from Feed
```
GET /rss/torrent/{rss_id}
```
Get the list of torrents parsed from a specific RSS feed.
### Analysis & Subscription
```
POST /rss/analysis
```
Analyze an RSS URL and extract anime metadata without subscribing.
**Request Body:**
```json
{
"url": "string"
}
```
```
POST /rss/collect
```
Download all episodes from an RSS feed (for completed anime).
```
POST /rss/subscribe
```
Subscribe to an RSS feed for automatic ongoing downloads.
---
## Search
### Search Bangumi (Server-Sent Events)
```
GET /search/bangumi?keyword={keyword}&provider={provider}
```
Search for anime torrents. Returns results as a Server-Sent Events (SSE) stream for real-time updates.
**Query Parameters:**
- `keyword` — Search keyword
- `provider` — Search provider (e.g., `mikan`, `nyaa`, `dmhy`)
**Response:** SSE stream with parsed search results.
### List Search Providers
```
GET /search/provider
```
Get the list of available search providers.
---
## Program Control
### Get Status
```
GET /status
```
Get program status including version, running state, and first_run flag.
**Response:**
```json
{
"status": "running",
"version": "3.2.0",
"first_run": false
}
```
### Start Program
```
GET /start
```
Start the main program (RSS checking, downloading, renaming).
### Restart Program
```
GET /restart
```
Restart the main program.
### Stop Program
```
GET /stop
```
Stop the main program (WebUI remains accessible).
### Shutdown
```
GET /shutdown
```
Shutdown the entire application (restarts the Docker container).
### Check Downloader
```
GET /check/downloader
```
Test connectivity to the configured downloader (qBittorrent).
---
## Downloader Management <Badge type="tip" text="v3.2+" />
Manage torrents in the downloader directly from AutoBangumi.
### List Torrents
```
GET /downloader/torrents
```
Get all torrents in the Bangumi category.
### Pause Torrents
```
POST /downloader/torrents/pause
```
Pause torrents by hash.
**Request Body:**
```json
{
"hashes": ["hash1", "hash2"]
}
```
### Resume Torrents
```
POST /downloader/torrents/resume
```
Resume paused torrents by hash.
**Request Body:**
```json
{
"hashes": ["hash1", "hash2"]
}
```
### Delete Torrents
```
POST /downloader/torrents/delete
```
Delete torrents with optional file deletion.
**Request Body:**
```json
{
"hashes": ["hash1", "hash2"],
"delete_files": false
}
```
---
## Setup Wizard <Badge type="tip" text="v3.2+" />
These endpoints are only available during first-run setup (before setup is complete). They do **not** require authentication. After setup completes, all endpoints return `403 Forbidden`.
### Check Setup Status
```
GET /setup/status
```
Check if setup wizard is needed (first run).
**Response:**
```json
{
"need_setup": true
}
```
### Test Downloader Connection
```
POST /setup/test-downloader
```
Test connection to a downloader with provided credentials.
**Request Body:**
```json
{
"type": "qbittorrent",
"host": "172.17.0.1:8080",
"username": "admin",
"password": "adminadmin",
"ssl": false
}
```
### Test RSS Feed
```
POST /setup/test-rss
```
Validate an RSS feed URL is accessible and parseable.
**Request Body:**
```json
{
"url": "https://mikanime.tv/RSS/MyBangumi?token=xxx"
}
```
### Test Notification
```
POST /setup/test-notification
```
Send a test notification with provided settings.
**Request Body:**
```json
{
"type": "telegram",
"token": "bot_token",
"chat_id": "chat_id"
}
```
### Complete Setup
```
POST /setup/complete
```
Save all configuration and mark setup as complete. Creates the sentinel file `config/.setup_complete`.
**Request Body:** Full configuration object.
---
## Logs
### Get Logs
```
GET /log
```
Retrieve the full application log file.
### Clear Logs
```
GET /log/clear
```
Clear the log file.
---
## Response Format
All API responses follow a consistent format:
```json
{
"msg_en": "Success message in English",
"msg_zh": "Success message in Chinese",
"status": true
}
```
Error responses include appropriate HTTP status codes (400, 401, 403, 404, 500) with error messages in both languages.

137
docs/en/changelog/2.6.md Normal file
View File

@@ -0,0 +1,137 @@
# [2.6] Release Notes
## Upgrade Notes from Older Versions
Starting from version 2.6, AutoBangumi (AB) configuration has moved from environment variables to `config.json`. Note the following before upgrading.
### Environment Variable Migration
Old environment variables are automatically converted to `config.json` on the first startup after upgrading to 2.6. The generated `config.json` is placed in the `/app/config` folder.
Once you've mapped the `/app/config` folder, old environment variables no longer affect AB's operation. You can delete `config.json` to regenerate from environment variables.
### Container Volume Mapping
After version 2.6, the following folders need to be mapped:
- `/app/config`: Configuration folder containing `config.json`
- `/app/data`: Data folder containing `bangumi.json`, etc.
### Data Files
Due to major updates, we don't recommend using old data files. AB will automatically generate a new `bangumi.json` in `/app/data`.
Don't worry — QB won't re-download previously downloaded anime.
### Subsequent Configuration Changes
AB can now edit configuration directly in the WebUI. After editing, restart the container for changes to take effect.
## How to Upgrade
### Docker Compose
You can use your existing docker-compose.yml file to upgrade:
```bash
docker compose stop autobangumi
docker compose pull autobangumi
```
Then modify docker-compose.yml to add volume mappings:
```yaml
version: "3.8"
services:
autobangumi:
image: estrellaxd/auto_bangumi:latest
container_name: autobangumi
restart: unless-stopped
environment:
- PUID=1000
- PGID=1000
- TZ=Asia/Shanghai
volumes:
- /path/to/config:/app/config
- /path/to/data:/app/data
networks:
- bridge
dns:
- 8.8.8.8
```
Then start AB:
```bash
docker compose up -d autobangumi
```
### Portainer
In Portainer, modify the volume mappings and click `Recreate` to complete the upgrade.
### What to do if the upgrade causes issues
Since configurations may vary, upgrades might cause the program to fail. Delete all previous data and generated configuration files, then restart the container and reconfigure in the WebUI.
## New Features
### Configuration Method Change
After v2.6, program configuration has moved from Docker environment variables to `config.json`.
The new WebUI also provides a web-based configuration editor. Access the AB URL and find `Settings` in the sidebar to modify configuration. Restart the container after editing.
### Custom Reverse Proxy URL and AB as Proxy Relay
To handle situations where [Mikan Project](https://mikanani.me) is inaccessible, AB provides three approaches:
1. HTTP and SOCKS Proxy
This feature existed in older versions. After upgrading to 2.6, just check the proxy configuration in the WebUI to access Mikan Project normally.
However, qBittorrent still can't access Mikan's RSS and torrent URLs directly, so you need to add a proxy in qBittorrent as well. See #198 for details.
2. Custom Reverse Proxy URL
Version 2.6 added a `custom_url` option for custom reverse proxy URLs.
Set it to your properly configured reverse proxy URL. AB will use this custom URL to access Mikan Project, and QB can download normally.
3. AB as Proxy Relay
After configuring a proxy in AB, AB can serve as a local proxy relay (currently only for RSS-related functions).
Set `custom_url` to `http://abhost:abport` where `abhost` is AB's IP and `abport` is AB's port.
AB will push its own address to qBittorrent, which will use AB as a proxy to access Mikan Project.
Note: If you haven't set up a reverse proxy for AB with Nginx or similar, include `http://` to ensure proper operation.
**Important Notes**
If AB and QB are in the same container, don't use `127.0.0.1` or `localhost` as they can't communicate this way.
If on the same network, use container name addressing, e.g., `http://autobangumi:7892`.
You can also use the Docker gateway address, e.g., `http://172.17.0.1:7892`.
If on different hosts, use the host machine's IP address.
### Collection and Folder Renaming
AB can now rename files within collections and folders, moving media files back to the root directory.
Note that AB still relies on the save path to determine season and episode information, so place collection files according to AB's standard.
After version **2.6.4**, AB can rename subtitles within folders (feature still being refined). Collections and subtitles default to `pn` format renaming; adjustment options are not yet available.
**Standard Path**
```
/downloads/Bangumi/Title/Season 1/xxx
```
### Push Notifications
AB can now send rename completion notifications via `Telegram` and `ServerChan`.
In the WebUI, enable push notifications and fill in the required parameters.
- Telegram requires Bot Token and Chat ID. Refer to various tutorials for obtaining these.
- ServerChan requires a Token. Refer to various tutorials for obtaining this.

46
docs/en/changelog/3.0.md Normal file
View File

@@ -0,0 +1,46 @@
# [3.0] Release Notes
### New WebUI
- Login functionality — AB now supports username/password authentication. Some operations require login.
- New poster wall
- Bangumi management features
- Edit anime season info and names. Changes automatically update **download rules** / **downloaded file paths** and trigger renaming.
- New link parser — after parsing a link, you can manually adjust download info, select download season, or add automatic download rules.
- Delete anime — one-click deletion of anime and its torrent files.
- Custom download rules per anime, independent of global rules.
- New configuration interface for easier application rule configuration
- Added initialization page for first-time startup guidance
- Downloader connection checker for qBittorrent connectivity
- RSS URL validator to check if RSS feeds are valid
- Added program management buttons for starting/stopping the program and restarting the container from the WebUI
### Parser
- New parser with support for different source types to obtain official titles and poster URLs
- Supports changing RSS subscription sources without regenerating the database
### Notification Module
- Added `Bark` notification module
- New notification format — can now push posters, anime names, and updated episode numbers to Telegram
### Data Migration
- Automatic data migration when upgrading from older versions
- Migrated data also automatically matches posters
## Fixes
- Fixed renaming bugs that could occur with Windows paths
## Changes
- Migrated from `json` to `sqlite` for data storage
- Migrated from multiprocessing to multithreading
- Refactored main program
- Improved startup/shutdown time
- Refactored parser module
- Refactored renaming module
- Temporarily removed `normal` mode
- Added `ghcr.io` image registry

47
docs/en/changelog/3.1.md Normal file
View File

@@ -0,0 +1,47 @@
# [3.1] - 2023-08
- Merged backend and frontend repositories, optimized project directory structure
- Optimized version release workflow
- Wiki migrated to VitePress at: https://autobangumi.org
## Backend
### Features
- Added `RSS Engine` module — AB can now independently update and manage RSS subscriptions and send torrents to the downloader
- Supports multiple aggregated RSS subscription sources, managed via the RSS Engine module
- Download deduplication — duplicate subscribed torrents won't be re-downloaded
- Added manual refresh API for RSS subscriptions
- Added RSS subscription management API
- Added `Search Engine` module — search torrents by keyword and parse results into collection or subscription tasks
- Plugin-based search engine with support for `mikan`, `dmhy`, and `nyaa`
- Added subtitle group-specific rules for individual group configurations
- Added IPv6 listening support (set `IPV6=1` in environment variables)
- Added batch operations API for bulk rule and RSS subscription management
### Changes
- Database structure changed to `sqlmodel` for database management
- Added version management for seamless software data updates
- Unified API format
- Added API response language options
- Added database mock tests
- Code optimizations
### Bugfixes
- Fixed various minor issues
- Introduced some major issues
## Frontend
### Features
- Added `i18n` support — currently supports `zh-CN` and `en-US`
- Added PWA support
- Added RSS management page
- Added search top bar
### Changes
- Adjusted various UI details

192
docs/en/changelog/3.2.md Normal file
View File

@@ -0,0 +1,192 @@
# [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
- 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
- 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
- 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-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 component
- `ab-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 `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
- Search store export refactored to match component expectations
- Upgraded frontend dependencies
- Breakpoint system expanded from single 1024px to 640px + 1024px two-tier
- `useBreakpointQuery` added `isTablet`, `isMobileOrTablet`, `isTabletOrPC`
- `media-query.vue` added `#tablet` slot (falls back to `#mobile`)
- UnoCSS added `sm: 640px` breakpoint
- `ab-input` mobile full-width + increased touch target styling
- Layout uses `dvh` units instead of `vh`, 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-artifact` and `actions/download-artifact` to v4
- Docker build removed `linux/arm/v7` platform (uv image doesn't support it)
- Added CLAUDE.md development guide

View File

@@ -0,0 +1,56 @@
# Downloader Settings
## WebUI Configuration
![downloader](/image/config/downloader.png){width=500}{class=ab-shadow-card}
<br/>
- **Downloader Type** is the downloader type. Currently only qBittorrent is supported.
- **Host** is the downloader address. [See below](#downloader-address)
- **Download path** is the mapped download path for the downloader. [See below](#download-path-issues)
- **SSL** enables SSL for the downloader connection.
## Common Issues
### Downloader Address
::: warning Note
Do not use 127.0.0.1 or localhost as the downloader address.
:::
Since AB runs in Docker with **Bridge** mode in the official tutorial, using 127.0.0.1 or localhost will resolve to AB itself, not the downloader.
- If your qBittorrent also runs in Docker, we recommend using the Docker **gateway address: 172.17.0.1**.
- If your qBittorrent runs on the host machine, use the host machine's IP address.
If you run AB in **Host** mode, you can use 127.0.0.1 instead of the Docker gateway address.
::: warning Note
Macvlan isolates container networks. Without additional bridge configuration, containers cannot access other containers or the host itself.
:::
### Download Path Issues
The path configured in AB is only used to generate the corresponding anime file path. AB itself does not directly manage files at that path.
**What should I put for the download path?**
This parameter just needs to match your **downloader's** configuration:
- Docker: If qB uses `/downloads`, then set `/downloads/Bangumi`. You can change `Bangumi` to anything.
- Linux/macOS: If it's `/home/usr/downloads` or `/User/UserName/Downloads`, just append `/Bangumi` at the end.
- Windows: Change `D:\Media\` to `D:\Media\Bangumi`
## `config.json` Configuration Options
The corresponding options in the configuration file are:
Configuration section: `downloader`
| Parameter | Description | Type | WebUI Option | Default |
|-----------|---------------------|---------|----------------------|---------------------|
| type | Downloader type | String | Downloader type | qbittorrent |
| host | Downloader address | String | Downloader address | 172.17.0.1:8080 |
| username | Downloader username | String | Downloader username | admin |
| password | Downloader password | String | Downloader password | adminadmin |
| path | Download path | String | Download path | /downloads/Bangumi |
| ssl | Enable SSL | Boolean | Enable SSL | false |

View File

@@ -0,0 +1,57 @@
# Experimental Features
::: warning
Experimental features are still in testing. Enabling them may cause unexpected issues and they may be removed in future versions. Use with caution!
:::
## OpenAI ChatGPT
Use OpenAI ChatGPT for better structured title parsing. For example:
```
input: "【喵萌奶茶屋】★04月新番★[夏日重现/Summer Time Rendering][11][1080p][繁日双语][招募翻译]"
output: '{"group": "喵萌奶茶屋", "title_en": "Summer Time Rendering", "resolution": "1080p", "episode": 11, "season": 1, "title_zh": "夏日重现", "sub": "", "title_jp": "", "season_raw": "", "source": ""}'
```
![experimental OpenAI](/image/config/experimental-openai.png){width=500}{class=ab-shadow-card}
- **Enable OpenAI** enables OpenAI and uses ChatGPT for title parsing.
- **OpenAI API Type** defaults to OpenAI.
- **OpenAI API Key** is your OpenAI account API key.
- **OpenAI API Base URL** is the OpenAI endpoint. Defaults to the official OpenAI URL; you can change it to a compatible third-party endpoint.
- **OpenAI Model** is the ChatGPT model parameter. Currently provides `gpt-3.5-turbo`, which is affordable and produces excellent results with the right prompts.
## Microsoft Azure OpenAI
![experimental Microsoft Azure OpenAI](/image/config/experimental-azure-openai.png){width=500}{class=ab-shadow-card}
In addition to standard OpenAI, [version 3.1.8](https://github.com/EstrellaXD/Auto_Bangumi/releases/tag/3.1.8) added Microsoft Azure OpenAI support. Usage is similar to standard OpenAI with some shared parameters, but note the following:
- **Enable OpenAI** enables OpenAI and uses ChatGPT for title parsing.
- **OpenAI API Type** — Select `azure` to show Azure-specific options.
- **OpenAI API Key** is your Microsoft Azure OpenAI API key.
- **OpenAI API Base URL** corresponds to the Microsoft Azure OpenAI Entrypoint. **Must be filled in manually**.
- **Azure OpenAI Version** is the API version. Defaults to `2023-05-15`. See [supported versions](https://learn.microsoft.com/en-us/azure/ai-services/openai/reference#completions).
- **Azure OpenAI Deployment ID** is your deployment ID, usually the same as the model name. Note that Azure OpenAI doesn't support symbols other than `_-`, so `gpt-3.5-turbo` becomes `gpt-35-turbo` in Azure. **Must be filled in manually**.
Reference documentation:
- [Quickstart: Get started using GPT-35-Turbo and GPT-4 with Azure OpenAI Service](https://learn.microsoft.com/en-us/azure/ai-services/openai/chatgpt-quickstart?tabs=command-line&pivots=programming-language-python)
- [Learn how to work with the GPT-35-Turbo and GPT-4 models](https://learn.microsoft.com/en-us/azure/ai-services/openai/how-to/chatgpt?pivots=programming-language-chat-completions)
## `config.json` Configuration Options
The corresponding options in the configuration file are:
Configuration section: `experimental_openai`
| Parameter | Description | Type | WebUI Option | Default |
|---------------|--------------------------|---------|---------------------------|---------------------------|
| enable | Enable OpenAI parser | Boolean | Enable OpenAI | false |
| api_type | OpenAI API type | String | API type (`openai`/`azure`) | openai |
| api_key | OpenAI API key | String | OpenAI API Key | |
| api_base | API Base URL (Azure entrypoint) | String | OpenAI API Base URL | https://api.openai.com/v1 |
| model | OpenAI model | String | OpenAI Model | gpt-3.5-turbo |
| api_version | Azure OpenAI API version | String | Azure API Version | 2023-05-15 |
| deployment_id | Azure Deployment ID | String | Azure Deployment ID | |

36
docs/en/config/manager.md Normal file
View File

@@ -0,0 +1,36 @@
# Bangumi Manager Settings
## WebUI Configuration
![proxy](/image/config/manager.png){width=500}{class=ab-shadow-card}
<br/>
- **Enable** enables the bangumi manager. If disabled, the settings below will not take effect.
- **Rename method** is the renaming method. Currently supported:
- `pn``Torrent Title S0XE0X.mp4` format
- `advance``Official Title S0XE0X.mp4` format
- `none` — No renaming
- **Eps complete** enables episode completion for the current season. If enabled, missing episodes will be downloaded.
- **Add group tag** adds subtitle group tags to download rules.
- **Delete bad torrent** deletes errored torrents.
- [About file paths][1]
- [About renaming][2]
## `config.json` Configuration Options
The corresponding options in the configuration file are:
Configuration section: `bangumi_manager`
| Parameter | Description | Type | WebUI Option | Default |
|--------------------|------------------------------ |---------|-------------------|---------|
| enable | Enable bangumi manager | Boolean | Enable manager | true |
| eps_complete | Enable episode completion | Boolean | Episode completion | false |
| rename_method | Rename method | String | Rename method | pn |
| group_tag | Add subtitle group tag | Boolean | Group tag | false |
| remove_bad_torrent | Delete bad torrents | Boolean | Remove bad torrent | false |
[1]: https://www.autobangumi.org/faq/#download-path
[2]: https://www.autobangumi.org/faq/#file-renaming

View File

@@ -0,0 +1,34 @@
# Notification Settings
## WebUI Configuration
![notification](/image/config/notifier.png){width=500}{class=ab-shadow-card}
<br/>
- **Enable** enables notifications. If disabled, the settings below will not take effect.
- **Type** is the notification type. Currently supported:
- Telegram
- Wecom
- Bark
- ServerChan
- **Chat ID** only needs to be filled in when using `telegram` notifications. [How to get Telegram Bot Chat ID][1]
- **Wecom**: Fill in the custom push URL in the Chat ID field, and add [Rich Text Message][2] type on the server side. [Wecom Configuration Guide][3]
## `config.json` Configuration Options
The corresponding options in the configuration file are:
Configuration section: `notification`
| Parameter | Description | Type | WebUI Option | Default |
|-----------|------------------|---------|-----------------|----------|
| enable | Enable notifications | Boolean | Notifications | false |
| type | Notification type | String | Notification type | telegram |
| token | Notification token | String | Notification token | |
| chat_id | Notification Chat ID | String | Notification Chat ID | |
[1]: https://core.telegram.org/bots#6-botfather
[2]: https://github.com/umbors/wecomchan-alifun
[3]: https://github.com/easychen/wecomchan

34
docs/en/config/parser.md Normal file
View File

@@ -0,0 +1,34 @@
# Parser Settings
AB's parser is used to parse aggregated RSS links. When new entries appear in the RSS feed, AB will parse the titles and generate automatic download rules.
::: tip
Since v3.1, parser settings have moved to individual RSS settings. To configure the **parser type**, see [Setting up parser for RSS][add_rss].
:::
## Parser Settings in WebUI
![parser](/image/config/parser.png){width=500}{class=ab-shadow-card}
<br/>
- **Enable**: Whether to enable the RSS parser.
- **Language** is the RSS parser language. Currently supports `zh`, `jp`, and `en`.
- **Exclude** is the global RSS parser filter. You can enter strings or regular expressions, and AB will filter out matching entries during RSS parsing.
## `config.json` Configuration Options
The corresponding options in the configuration file are:
Configuration section: `rss_parser`
| Parameter | Description | Type | WebUI Option | Default |
|-----------|-----------------------|---------|---------------------|----------------|
| enable | Enable RSS parser | Boolean | Enable RSS parser | true |
| filter | RSS parser filter | Array | Filter | [720,\d+-\d+] |
| language | RSS parser language | String | RSS parser language | zh |
[rss_token]: rss
[add_rss]: /feature/rss#parser-settings
[reproxy]: proxy#reverse-proxy

25
docs/en/config/program.md Normal file
View File

@@ -0,0 +1,25 @@
# Program Settings
## WebUI Configuration
![program](/image/config/program.png){width=500}{class=ab-shadow-card}
<br/>
- Interval Time parameters are in seconds. Convert to seconds if you need to set minutes.
- RSS is the RSS check interval, which affects how often automatic download rules are generated.
- Rename is the rename check interval. Modify this if you need to change how often renaming is checked.
- WebUI Port is the port number. Note that if you're using Docker, you need to remap the port in Docker after changing it.
## `config.json` Configuration Options
The corresponding options in the configuration file are:
Configuration section: `program`
| Parameter | Description | Type | WebUI Option | Default |
|-------------|---------------------|-----------------|---------------------|---------|
| rss_time | RSS check interval | Integer (seconds) | RSS check interval | 7200 |
| rename_time | Rename check interval | Integer (seconds) | Rename check interval | 60 |
| webui_port | WebUI port | Integer | WebUI port | 7892 |

85
docs/en/config/proxy.md Normal file
View File

@@ -0,0 +1,85 @@
# Proxy and Reverse Proxy
## Proxy
![proxy](/image/config/proxy.png){width=500}{class=ab-shadow-card}
<br/>
AB supports HTTP and SOCKS5 proxies to help resolve network issues.
- **Enable**: Whether to enable the proxy.
- **Type** is the proxy type.
- **Host** is the proxy address.
- **Port** is the proxy port.
::: tip
In **SOCKS5** mode, username and password are required.
:::
## `config.json` Configuration Options
The corresponding options in the configuration file are:
Configuration section: `proxy`
| Parameter | Description | Type | WebUI Option | Default |
|-----------|---------------|---------|---------------|---------|
| enable | Enable proxy | Boolean | Proxy | false |
| type | Proxy type | String | Proxy type | http |
| host | Proxy address | String | Proxy address | |
| port | Proxy port | Integer | Proxy port | |
| username | Proxy username | String | Proxy username | |
| password | Proxy password | String | Proxy password | |
## Reverse Proxy
- Use the Mikan Project alternative domain `mikanime.tv` to replace `mikanani.me` in your RSS subscription URL.
- Use a Cloudflare Worker as a reverse proxy and replace all `mikanani.me` domains in the RSS feed.
## Cloudflare Workers
Based on the approach used to bypass blocks on other services, you can set up a reverse proxy using Cloudflare Workers. How to register a domain and bind it to Cloudflare is beyond the scope of this guide. Add the following code in Workers to use your own domain to access Mikan Project and download torrents from RSS links:
```js
const TELEGRAPH_URL = 'https://mikanani.me';
const MY_DOMAIN = 'https://yourdomain.com'
addEventListener('fetch', event => {
event.respondWith(handleRequest(event.request))
})
async function handleRequest(request) {
const url = new URL(request.url);
url.host = TELEGRAPH_URL.replace(/^https?:\/\//, '');
const modifiedRequest = new Request(url.toString(), {
headers: request.headers,
method: request.method,
body: request.body,
redirect: 'manual'
});
const response = await fetch(modifiedRequest);
const contentType = response.headers.get('Content-Type') || '';
// Only perform replacement if content type is RSS
if (contentType.includes('application/xml')) {
const text = await response.text();
const replacedText = text.replace(/https?:\/\/mikanani\.me/g, MY_DOMAIN);
const modifiedResponse = new Response(replacedText, response);
// Add CORS headers
modifiedResponse.headers.set('Access-Control-Allow-Origin', '*');
return modifiedResponse;
} else {
const modifiedResponse = new Response(response.body, response);
// Add CORS headers
modifiedResponse.headers.set('Access-Control-Allow-Origin', '*');
return modifiedResponse;
}
}
```

38
docs/en/config/rss.md Normal file
View File

@@ -0,0 +1,38 @@
# RSS Feed Setup
AutoBangumi can automatically parse aggregated anime RSS feeds and generate download rules based on subtitle groups and anime names, enabling fully automatic anime tracking.
The following uses [Mikan Project][mikan-site] as an example to explain how to get an RSS subscription URL.
Note that the main Mikan Project site may be blocked in some regions. If you cannot access it without a proxy, use the following alternative domain:
[Mikan Project (Alternative)][mikan-cn-site]
## Get Subscription URL
This project is based on parsing RSS URLs provided by Mikan Project. To enable automatic anime tracking, you need to register and obtain a Mikan Project RSS URL:
![image](/image/rss/rss-token.png){data-zoomable}
The RSS URL will look like:
```txt
https://mikanani.me/RSS/MyBangumi?token=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
# or
https://mikanime.tv/RSS/MyBangumi?token=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
```
## Mikan Project Subscription Tips
Since AutoBangumi parses all RSS entries it receives, keep the following in mind when subscribing:
![image](/image/rss/advanced-subscription.png){data-zoomable}
- Enable advanced settings in your profile settings.
- Subscribe to only one subtitle group per anime. Click the anime poster on Mikan Project to open the submenu and select a single subtitle group.
- If a subtitle group offers both Simplified and Traditional Chinese subtitles, Mikan Project usually provides a way to choose. Select one subtitle type.
- If no subtitle type selection is available, you can set up a `filter` in AutoBangumi to filter them, or manually filter in qBittorrent after the rule is generated.
- OVA and movie subscriptions are currently not supported for parsing.
[mikan-site]: https://mikanani.me/
[mikan-cn-site]: https://mikanime.tv/

View File

@@ -0,0 +1,56 @@
# Deploy with Docker CLI
## Note on New Versions
Since AutoBangumi 2.6, you can configure everything directly in the WebUI. You can start the container first and then configure it in the WebUI. Environment variable configuration from older versions will be automatically migrated. Environment variables still work but only take effect on the first startup.
## Create Data and Configuration Directories
To ensure AB's data and configuration persist across updates, we recommend using Docker volumes or bind mounts.
```shell
# Using bind mount
mkdir -p ${HOME}/AutoBangumi/{config,data}
cd ${HOME}/AutoBangumi
```
Choose either bind mount or Docker volume:
```shell
# Using Docker volume
docker volume create AutoBangumi_config
docker volume create AutoBangumi_data
```
## Deploy AutoBangumi with Docker CLI
Copy and run the following command.
Make sure your working directory is AutoBangumi.
```shell
docker run -d \
--name=AutoBangumi \
-v ${HOME}/AutoBangumi/config:/app/config \
-v ${HOME}/AutoBangumi/data:/app/data \
-p 7892:7892 \
-e TZ=Asia/Shanghai \
-e PUID=$(id -u) \
-e PGID=$(id -g) \
-e UMASK=022 \
--network=bridge \
--dns=8.8.8.8 \
--restart unless-stopped \
ghcr.io/estrellaxd/auto_bangumi:latest
```
If using Docker volumes, replace the bind paths accordingly:
```shell
-v AutoBangumi_config:/app/config \
-v AutoBangumi_data:/app/data \
```
The AB WebUI will start automatically, but the main program will be paused. Access `http://abhost:7892` to configure it.
AB will automatically write environment variables to `config.json` and start running.
We recommend using _[Portainer](https://www.portainer.io)_ or similar Docker management UIs for advanced deployment.

View File

@@ -0,0 +1,86 @@
# Deploy with Docker Compose
A one-click deployment method for **AutoBangumi** using a `docker-compose.yml` file.
## Install Docker Compose
Docker Compose usually comes bundled with Docker. Check with:
```bash
docker compose -v
```
If not installed, install it with:
```bash
$ sudo apt-get update
$ sudo apt-get install docker-compose-plugin
```
## Deploy **AutoBangumi**
### Create AutoBangumi and Data Directories
```bash
mkdir -p ${HOME}/AutoBangumi/{config,data}
cd ${HOME}/AutoBangumi
```
### Option 1: Custom Docker Compose Configuration
```yaml
version: "3.8"
services:
AutoBangumi:
image: "ghcr.io/estrellaxd/auto_bangumi:latest"
container_name: AutoBangumi
volumes:
- ./config:/app/config
- ./data:/app/data
ports:
- "7892:7892"
restart: unless-stopped
dns:
- 8.8.8.8
network_mode: bridge
environment:
- TZ=Asia/Shanghai
- PGID=$(id -g)
- PUID=$(id -u)
- UMASK=022
```
Copy the above content into a `docker-compose.yml` file.
### Option 2: Download Docker Compose Configuration File
If you don't want to create the `docker-compose.yml` file manually, the project provides pre-made configurations:
- Install **AutoBangumi** only:
```bash
wget https://raw.githubusercontent.com/EstrellaXD/Auto_Bangumi/main/docs/resource/docker-compose/AutoBangumi/docker-compose.yml
```
- Install **qBittorrent** and **AutoBangumi**:
```bash
wget https://raw.githubusercontent.com/EstrellaXD/Auto_Bangumi/main/docs/resource/docker-compose/qBittorrent+AutoBangumi/docker-compose.yml
```
Choose your installation method and run the command to download the `docker-compose.yml` file. You can customize parameters with a text editor if needed.
### Define Environment Variables
If you're using the downloaded AB+QB Docker Compose file, you need to define the following environment variables:
```shell
export \
QB_PORT=<YOUR_PORT>
```
- `QB_PORT`: Enter your existing qBittorrent port or your desired custom port, e.g., `8080`
### Start Docker Compose
```bash
docker compose up -d
```

121
docs/en/deploy/dsm.md Normal file
View File

@@ -0,0 +1,121 @@
# Synology NAS (DSM 7.2) Deployment (QNAP Similar)
DSM 7.2 supports Docker Compose, so we recommend using Docker Compose for one-click deployment.
## Create Configuration and Data Directories
Create an `AutoBangumi` folder under `/volume1/docker/`, then create `config` and `data` subfolders inside it.
## Install Container Manager (Docker) Package
Open Package Center and install the Container Manager (Docker) package.
![install-docker](/image/dsm/install-docker.png){data-zoomable}
## Install AB via Docker Compose
Click **Project**, then click **Create**, and select **Docker Compose**.
![new-compose](/image/dsm/new-compose.png){data-zoomable}
Copy and paste the following content into **Docker Compose**:
```yaml
version: "3.4"
services:
ab:
image: "ghcr.io/estrellaxd/auto_bangumi:latest"
container_name: "auto_bangumi"
restart: unless-stopped
ports:
- "7892:7892"
volumes:
- "./config:/app/config"
- "./data:/app/data"
network_mode: bridge
environment:
- TZ=Asia/Shanghai
- AB_METHOD=Advance
- PGID=1000
- PUID=1000
- UMASK=022
```
Click **Next**, then click **Done**.
![create](/image/dsm/create.png){data-zoomable}
After creation, access `http://<NAS IP>:7892` to enter AB and configure it.
## Install AB and qBittorrent via Docker Compose
When you have both a proxy and IPv6, configuring IPv6 in Docker on Synology NAS can be complex. We recommend installing both AB and qBittorrent on the host network to reduce complexity.
The following configuration assumes you have a Clash proxy deployed in Docker that is accessible via a local IP at a specified port.
Following the previous section, adjust and paste the following content into **Docker Compose**:
```yaml
qbittorrent:
container_name: qbittorrent
image: linuxserver/qbittorrent
hostname: qbittorrent
environment:
- PGID=1000 # Modify as needed
- PUID=1000 # Modify as needed
- WEBUI_PORT=8989
- TZ=Asia/Shanghai
volumes:
- ./qb_config:/config
- your_anime_path:/downloads # Change this to your anime storage directory. Set download path in AB as /downloads
networks:
- host
restart: unless-stopped
auto_bangumi:
container_name: AutoBangumi
environment:
- TZ=Asia/Shanghai
- PGID=1000 # Modify as needed
- PUID=1000 # Modify as needed
- UMASK=022
- AB_DOWNLOADER_HOST=127.0.0.1:8989 # Modify port as needed
volumes:
- /volume1/docker/ab/config:/app/config
- /volume1/docker/ab/data:/app/data
network_mode: host
environment:
- AB_METHOD=Advance
dns:
- 8.8.8.8
restart: unless-stopped
image: "ghcr.io/estrellaxd/auto_bangumi:latest"
depends_on:
- qbittorrent
```
## Additional Notes
The PGID and PUID values need to be determined for your system. For newer Synology NAS devices, they are typically: `PUID=1026, PGID=100`. When modifying the qBittorrent port, make sure to update it in all locations.
For proxy setup, refer to: [Proxy Settings](../config/proxy)
On lower-performance machines, the default configuration may heavily use the CPU, causing AB to fail connecting to qB and the qB WebUI to become inaccessible.
For devices like the 220+, recommended qBittorrent settings to reduce CPU usage:
- Settings -> Connections -> Connection Limits
- Global maximum number of connections: 300
- Maximum number of connections per torrent: 60
- Global upload slots limit: 15
- Upload slots per torrent: 4
- BitTorrent
- Maximum active checking torrents: 1
- Torrent Queueing
- Maximum active downloads: 3
- Maximum active uploads: 5
- Maximum active torrents: 10
- RSS
- RSS Reader
- Maximum number of articles per feed: 50

59
docs/en/deploy/local.md Normal file
View File

@@ -0,0 +1,59 @@
# Local Deployment
::: warning
Local deployment may cause unexpected issues. We strongly recommend using Docker instead.
This documentation may have update delays. If you have questions, please raise them in [Issues](https://github.com/EstrellaXD/Auto_Bangumi/issues).
:::
## Download the Latest Release
```bash
VERSION=$(curl -s "https://api.github.com/repos/EstrellaXD/Auto_Bangumi/releases/latest" | grep '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/')
curl -L -O "https://github.com/EstrellaXD/Auto_Bangumi/releases/download/$VERSION/app-v$VERSION.zip"
```
## Extract the Archive
On Unix/WSL systems, use the following command. On Windows, extract manually.
```bash
unzip app-v$VERSION.zip -d AutoBangumi
cd AutoBangumi
```
## Create Virtual Environment and Install Dependencies
Ensure you have Python 3.10+ and pip installed locally.
```bash
cd src
python3 -m venv env
python3 pip install -r requirements.txt
```
## Create Configuration and Data Directories
```bash
mkdir config
mkdir data
```
## Run AutoBangumi
```bash
python3 main.py
```
## Windows Auto-Start on Boot
You can use `nssm` for auto-start on boot. Example with `nssm`:
```powershell
nssm install AutoBangumi (Get-Command python).Source
nssm set AutoBangumi AppParameters (Get-Item .\main.py).FullName
nssm set AutoBangumi AppDirectory (Get-Item ..).FullName
nssm set AutoBangumi Start SERVICE_DELAYED_AUTO_START
```

View File

@@ -0,0 +1,131 @@
# Quick Start
We recommend deploying AutoBangumi in Docker.
Before deployment, make sure you have [Docker Engine][docker-engine] or [Docker Desktop][docker-desktop] installed.
## Create Data and Configuration Directories
To ensure AB's data and configuration persist across updates, we recommend using bind mounts or Docker volumes.
```shell
# Using bind mount
mkdir -p ${HOME}/AutoBangumi/{config,data}
cd ${HOME}/AutoBangumi
```
Choose either bind mount or Docker volume:
```shell
# Using Docker volume
docker volume create AutoBangumi_config
docker volume create AutoBangumi_data
```
## Deploy AutoBangumi with Docker
Make sure you are in the AutoBangumi directory when running these commands.
### Option 1: Deploy with Docker CLI
Copy and run the following command:
```shell
docker run -d \
--name=AutoBangumi \
-v ${HOME}/AutoBangumi/config:/app/config \
-v ${HOME}/AutoBangumi/data:/app/data \
-p 7892:7892 \
-e TZ=Asia/Shanghai \
-e PUID=$(id -u) \
-e PGID=$(id -g) \
-e UMASK=022 \
--network=bridge \
--dns=8.8.8.8 \
--restart unless-stopped \
ghcr.io/estrellaxd/auto_bangumi:latest
```
### Option 2: Deploy with Docker Compose
Copy the following content into a `docker-compose.yml` file:
```yaml
version: "3.8"
services:
AutoBangumi:
image: "ghcr.io/estrellaxd/auto_bangumi:latest"
container_name: AutoBangumi
volumes:
- ./config:/app/config
- ./data:/app/data
ports:
- "7892:7892"
network_mode: bridge
restart: unless-stopped
dns:
- 8.8.8.8
environment:
- TZ=Asia/Shanghai
- PGID=$(id -g)
- PUID=$(id -u)
- UMASK=022
```
Run the following command to start the container:
```shell
docker compose up -d
```
## Install qBittorrent
If you haven't installed qBittorrent, please install it first:
- [Install qBittorrent in Docker][qbittorrent-docker]
- [Install qBittorrent on Windows/macOS][qbittorrent-desktop]
- [Install qBittorrent-nox on Linux][qbittorrent-nox]
## Get an Aggregated RSS Link (Using Mikan Project as an Example)
Visit [Mikan Project][mikan-project], register an account and log in, then click the **RSS** button in the bottom right corner and copy the link.
![mikan-rss](/image/rss/rss-token.png){data-zoomable}
The RSS URL will look like:
```txt
https://mikanani.me/RSS/MyBangumi?token=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
# or
https://mikanime.tv/RSS/MyBangumi?token=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
```
For detailed steps, see [Mikan RSS Setup][config-rss].
## Configure AutoBangumi
After installing AB, the WebUI will start automatically, but the main program will be paused. You can access `http://abhost:7892` to configure it.
1. Open the webpage. The default username is `admin` and the default password is `adminadmin`. Change these immediately after first login.
2. Enter your downloader's address, port, username, and password.
![ab-webui](/image/config/downloader.png){width=500}{class=ab-shadow-card}
3. Click **Apply** to save the configuration. AB will restart, and when the dot in the upper right corner turns green, it indicates AB is running normally.
4. Click the **+** button in the upper right corner, check **Aggregated RSS**, select the parser type, and enter your Mikan RSS URL.
![ab-rss](/image/config/add-rss.png){width=500}{class=ab-shadow-card}
Wait for AB to parse the aggregated RSS. Once parsing is complete, it will automatically add anime and manage downloads.
[docker-engine]: https://docs.docker.com/engine/install/
[docker-desktop]: https://www.docker.com/products/docker-desktop
[config-rss]: ../config/rss
[mikan-project]: https://mikanani.me/
[qbittorrent-docker]: https://hub.docker.com/r/superng6/qbittorrent
[qbittorrent-desktop]: https://www.qbittorrent.org/download
[qbittorrent-nox]: https://www.qbittorrent.org/download-nox

394
docs/en/dev/database.md Normal file
View File

@@ -0,0 +1,394 @@
# Database Developer Guide
This guide covers the database architecture, models, and operations in AutoBangumi.
## Overview
AutoBangumi uses **SQLite** as its database with **SQLModel** (Pydantic + SQLAlchemy hybrid) for ORM. The database file is located at `data/data.db`.
### Architecture
```
module/database/
├── engine.py # SQLAlchemy engine configuration
├── combine.py # Database class, migrations, session management
├── bangumi.py # Bangumi (anime subscription) operations
├── rss.py # RSS feed operations
├── torrent.py # Torrent tracking operations
└── user.py # User authentication operations
```
## Core Components
### Database Class
The `Database` class in `combine.py` is the main entry point. It inherits from SQLModel's `Session` and provides access to all sub-databases:
```python
from module.database import Database
with Database() as db:
# Access sub-databases
bangumis = db.bangumi.search_all()
rss_items = db.rss.search_active()
torrents = db.torrent.search_all()
```
### Sub-Database Classes
| Class | Model | Purpose |
|-------|-------|---------|
| `BangumiDatabase` | `Bangumi` | Anime subscription rules |
| `RSSDatabase` | `RSSItem` | RSS feed sources |
| `TorrentDatabase` | `Torrent` | Downloaded torrent tracking |
| `UserDatabase` | `User` | Authentication |
## Models
### Bangumi Model
Core model for anime subscriptions:
```python
class Bangumi(SQLModel, table=True):
id: int # Primary key
official_title: str # Display name (e.g., "Mushoku Tensei")
title_raw: str # Raw title for torrent matching (indexed)
season: int = 1 # Season number
episode_offset: int = 0 # Episode numbering adjustment
season_offset: int = 0 # Season numbering adjustment
rss_link: str # Comma-separated RSS feed URLs
filter: str # Exclusion filter (e.g., "720,\\d+-\\d+")
poster_link: str # TMDB poster URL
save_path: str # Download destination path
rule_name: str # qBittorrent RSS rule name
added: bool = False # Whether rule is added to downloader
deleted: bool = False # Soft delete flag (indexed)
archived: bool = False # For completed series (indexed)
needs_review: bool = False # Offset mismatch detected
needs_review_reason: str # Reason for review
suggested_season_offset: int # Suggested season offset
suggested_episode_offset: int # Suggested episode offset
air_weekday: int # Airing day (0=Sunday, 6=Saturday)
```
### RSSItem Model
RSS feed subscriptions:
```python
class RSSItem(SQLModel, table=True):
id: int # Primary key
name: str # Display name
url: str # Feed URL (unique, indexed)
aggregate: bool = True # Whether to parse torrents
parser: str = "mikan" # Parser type: mikan, dmhy, nyaa
enabled: bool = True # Active flag
connection_status: str # "healthy" or "error"
last_checked_at: str # ISO timestamp
last_error: str # Last error message
```
### Torrent Model
Tracks downloaded torrents:
```python
class Torrent(SQLModel, table=True):
id: int # Primary key
name: str # Torrent name (indexed)
url: str # Torrent/magnet URL (unique, indexed)
rss_id: int # Source RSS feed ID
bangumi_id: int # Linked Bangumi ID (nullable)
qb_hash: str # qBittorrent info hash (indexed)
downloaded: bool = False # Download completed
```
## Common Operations
### BangumiDatabase
```python
with Database() as db:
# Create
db.bangumi.add(bangumi) # Single insert
db.bangumi.add_all(bangumi_list) # Batch insert (deduplicates)
# Read
db.bangumi.search_all() # All records (cached, 5min TTL)
db.bangumi.search_id(123) # By ID
db.bangumi.match_torrent("torrent name") # Find by title_raw match
db.bangumi.not_complete() # Incomplete series
db.bangumi.get_needs_review() # Flagged for review
# Update
db.bangumi.update(bangumi) # Update single record
db.bangumi.update_all(bangumi_list) # Batch update
# Delete
db.bangumi.delete_one(123) # Hard delete
db.bangumi.disable_rule(123) # Soft delete (deleted=True)
```
### RSSDatabase
```python
with Database() as db:
# Create
db.rss.add(rss_item) # Single insert
db.rss.add_all(rss_items) # Batch insert (deduplicates)
# Read
db.rss.search_all() # All feeds
db.rss.search_active() # Enabled feeds only
db.rss.search_aggregate() # Enabled + aggregate=True
# Update
db.rss.update(id, rss_update) # Partial update
db.rss.enable(id) # Enable feed
db.rss.disable(id) # Disable feed
db.rss.enable_batch([1, 2, 3]) # Batch enable
db.rss.disable_batch([1, 2, 3]) # Batch disable
```
### TorrentDatabase
```python
with Database() as db:
# Create
db.torrent.add(torrent) # Single insert
db.torrent.add_all(torrents) # Batch insert
# Read
db.torrent.search_all() # All torrents
db.torrent.search_by_qb_hash(hash) # By qBittorrent hash
db.torrent.search_by_url(url) # By URL
db.torrent.check_new(torrents) # Filter out existing
# Update
db.torrent.update_qb_hash(id, hash) # Set qb_hash
```
## Caching
### Bangumi Cache
`search_all()` results are cached at the module level with a 5-minute TTL:
```python
# Module-level cache in bangumi.py
_bangumi_cache: list[Bangumi] | None = None
_bangumi_cache_time: float = 0
_BANGUMI_CACHE_TTL: float = 300.0 # 5 minutes
# Cache invalidation
def _invalidate_bangumi_cache():
global _bangumi_cache, _bangumi_cache_time
_bangumi_cache = None
_bangumi_cache_time = 0
```
**Important:** The cache is automatically invalidated on:
- `add()`, `add_all()`
- `update()`, `update_all()`
- `delete_one()`, `delete_all()`
- `archive_one()`, `unarchive_one()`
- Any RSS link update operations
### Session Expunge
Cached objects are **expunged** from the session to prevent `DetachedInstanceError`:
```python
for b in bangumis:
self.session.expunge(b) # Detach from session
```
## Migration System
### Schema Versioning
Migrations are tracked via a `schema_version` table:
```python
CURRENT_SCHEMA_VERSION = 7
# Each migration: (version, description, [SQL statements])
MIGRATIONS = [
(1, "add air_weekday column", [...]),
(2, "add connection status columns", [...]),
(3, "create passkey table", [...]),
(4, "add archived column", [...]),
(5, "rename offset to episode_offset", [...]),
(6, "add qb_hash column", [...]),
(7, "add suggested offset columns", [...]),
]
```
### Adding a New Migration
1. Increment `CURRENT_SCHEMA_VERSION` in `combine.py`
2. Add migration tuple to `MIGRATIONS` list:
```python
MIGRATIONS = [
# ... existing migrations ...
(
8,
"add my_new_column to bangumi",
[
"ALTER TABLE bangumi ADD COLUMN my_new_column TEXT DEFAULT NULL",
],
),
]
```
3. Add idempotency check in `run_migrations()`:
```python
if "bangumi" in tables and version == 8:
columns = [col["name"] for col in inspector.get_columns("bangumi")]
if "my_new_column" in columns:
needs_run = False
```
4. Update the corresponding Pydantic model in `module/models/`
### Default Value Backfill
After migrations, `_fill_null_with_defaults()` automatically fills NULL values based on model defaults:
```python
# If model defines:
class Bangumi(SQLModel, table=True):
my_field: bool = False
# Then existing rows with NULL will be updated to False
```
## Performance Patterns
### Batch Queries
`add_all()` uses a single query to check for duplicates instead of N queries:
```python
# Efficient: single SELECT
keys_to_check = [(d.title_raw, d.group_name) for d in datas]
conditions = [
and_(Bangumi.title_raw == tr, Bangumi.group_name == gn)
for tr, gn in keys_to_check
]
statement = select(Bangumi.title_raw, Bangumi.group_name).where(or_(*conditions))
```
### Regex Matching
`match_list()` compiles a single regex pattern for all title matches:
```python
# Compile once, match many
sorted_titles = sorted(title_index.keys(), key=len, reverse=True)
pattern = "|".join(re.escape(title) for title in sorted_titles)
title_regex = re.compile(pattern)
# O(1) lookup per torrent instead of O(n)
for torrent in torrent_list:
match = title_regex.search(torrent.name)
```
### Indexed Columns
The following columns have indexes for fast lookups:
| Table | Column | Index Type |
|-------|--------|------------|
| `bangumi` | `title_raw` | Regular |
| `bangumi` | `deleted` | Regular |
| `bangumi` | `archived` | Regular |
| `rssitem` | `url` | Unique |
| `torrent` | `name` | Regular |
| `torrent` | `url` | Unique |
| `torrent` | `qb_hash` | Regular |
## Testing
### Test Database Setup
Tests use an in-memory SQLite database:
```python
# conftest.py
@pytest.fixture
def db_engine():
engine = create_engine("sqlite:///:memory:")
SQLModel.metadata.create_all(engine)
yield engine
engine.dispose()
@pytest.fixture
def db_session(db_engine):
with Session(db_engine) as session:
yield session
```
### Factory Functions
Use factory functions for creating test data:
```python
from test.factories import make_bangumi, make_torrent, make_rss_item
def test_bangumi_search():
bangumi = make_bangumi(title_raw="Test Title", season=2)
# ... test logic
```
## Design Notes
### No Foreign Keys
SQLite foreign key enforcement is disabled by default. Relationships (like `Torrent.bangumi_id`) are managed in application logic rather than database constraints.
### Soft Deletes
The `Bangumi.deleted` flag enables soft deletes. Queries should filter by `deleted=False` for user-facing data:
```python
statement = select(Bangumi).where(Bangumi.deleted == false())
```
### Torrent Tagging
Torrents are tagged in qBittorrent with `ab:{bangumi_id}` for offset lookup during rename operations. This enables fast bangumi identification without database queries.
## Common Issues
### DetachedInstanceError
If you access cached objects from a different session:
```python
# Wrong: accessing cached object in new session
bangumis = db.bangumi.search_all() # Cached
with Database() as new_db:
new_db.session.add(bangumis[0]) # Error!
# Right: objects are expunged, work independently
bangumis = db.bangumi.search_all()
bangumis[0].title_raw = "New Title" # OK, but won't persist
```
### Cache Staleness
If manual SQL updates bypass the ORM, invalidate the cache:
```python
from module.database.bangumi import _invalidate_bangumi_cache
with engine.connect() as conn:
conn.execute(text("UPDATE bangumi SET ..."))
conn.commit()
_invalidate_bangumi_cache() # Important!
```

135
docs/en/dev/index.md Normal file
View File

@@ -0,0 +1,135 @@
# Contributing Guide
We welcome contributors to help make AutoBangumi better at solving issues encountered by users.
This guide will walk you through how to contribute code to AutoBangumi. Please take a few minutes to read through before submitting a Pull Request.
This article covers:
- [Project Roadmap](#project-roadmap)
- [Request for Comments (RFC)](#request-for-comments-rfc)
- [Git Branch Management](#git-branch-management)
- [Version Numbering](#version-numbering)
- [Branch Development, Trunk Release](#branch-development-trunk-release)
- [Branch Lifecycle](#branch-lifecycle)
- [Git Workflow Overview](#git-workflow-overview)
- [Pull Request](#pull-request)
- [Release Process](#release-process)
## Project Roadmap
The AutoBangumi development team uses [GitHub Project](https://github.com/EstrellaXD/Auto_Bangumi/projects?query=is%3Aopen) boards to manage planned development, ongoing fixes, and their progress.
This helps you understand:
- What the development team is working on
- What aligns with your intended contribution, so you can participate directly
- What's already in progress, to avoid duplicate work
In [Project](https://github.com/EstrellaXD/Auto_Bangumi/projects?query=is%3Aopen), beyond the usual `[Feature Request]`, `[BUG]`, and small improvements, you'll find **`[RFC]`** items.
### Request for Comments (RFC)
> Find existing [AutoBangumi RFCs](https://github.com/EstrellaXD/Auto_Bangumi/issues?q=is%3Aissue+label%3ARFC) via the `RFC` label in issues.
For small improvements or bug fixes, feel free to adjust the code and submit a Pull Request. Just read the [Branch Management](#git-branch-management) section to base your work on the correct branch, and the [Pull Request](#pull-request) section to understand how PRs are merged.
<br/>
For **larger** feature refactors with broad scope, please first write an RFC proposal via [Issue: Feature Proposal](https://github.com/EstrellaXD/Auto_Bangumi/issues/new?assignees=&labels=RFC&projects=&template=rfc.yml&title=%5BRFC%5D%3A+) to briefly describe your approach and seek developer discussion and consensus.
Some proposals may conflict with decisions the development team has already made, and this step helps avoid wasted effort.
> If you only want to discuss whether to add or improve a feature (not "how to implement it"), use -> [Issue: Feature Request](https://github.com/EstrellaXD/Auto_Bangumi/issues/new?labels=feature+request&template=feature_request.yml&title=%5BFeature+Request%5D+)
<br/>
An [RFC Proposal](https://github.com/EstrellaXD/Auto_Bangumi/issues?q=is%3Aissue+is%3Aopen+label%3ARFC) is **"a document for developers to review technical design/approach before concrete development of a feature/refactor"**.
The purpose is to ensure collaborating developers clearly know "what to do" and "how it will be done", with all developers able to participate in open discussion.
This helps evaluate impacts (overlooked considerations, backward compatibility, conflicts with existing features).
Therefore, proposals focus on describing the **approach, design, and steps** for solving the problem.
## Git Branch Management
### Version Numbering
Git branches in the AutoBangumi project are closely related to release version rules.
AutoBangumi follows [Semantic Versioning (SemVer)](https://semver.org/) with a `<Major>.<Minor>.<Patch>` format:
- **Major**: Major version update, likely with incompatible configuration/API changes
- **Minor**: Backward-compatible new functionality
- **Patch**: Backward-compatible bug fixes / minor improvements
### Branch Development, Trunk Release
AutoBangumi uses a "branch development, trunk release" model.
[**`main`**](https://github.com/EstrellaXD/Auto_Bangumi/commits/main) is the stable **trunk branch**, used only for releases, not for direct development.
Each Minor version has a corresponding **development branch** for new features and post-release maintenance.
Development branches are named `<Major>.<Minor>-dev`, e.g., `3.1-dev`, `3.0-dev`, `2.6-dev`. Find them in [All Branches](https://github.com/EstrellaXD/Auto_Bangumi/branches/all?query=-dev).
### Branch Lifecycle
When a Minor development branch (e.g., `3.1-dev`) completes feature development and **first** merges into main:
- Release the Minor version (e.g., `3.1.0`)
- Create the **next** Minor development branch (`3.2-dev`) for next version features
- The **previous** version's branch (`3.0-dev`) is archived
- This Minor branch (`3.1-dev`) enters maintenance — no new features/refactors, only bug fixes
- Bug fixes are merged to the maintenance branch, then to main for `Patch` releases
For contributors choosing Git branches:
- **Bug fixes** — base on the **current released version's** Minor branch, PR to that branch
- **New features/refactors** — base on the **next unreleased version's** Minor branch, PR to that branch
> "Current released version" is the latest version on the [[Releases page]](https://github.com/EstrellaXD/Auto_Bangumi/releases)
### Git Workflow Overview
> Commit timeline goes from left to right --->
![dev-branch](/image/dev/branch.png)
## Pull Request
Ensure you've selected the correct PR target branch per the Git Branch Management section above:
> - **Bug fixes** → PR to the **current released version's** Minor maintenance branch
> - **New features/refactors** → PR to the **next version's** Minor development branch
<br/>
- A PR should correspond to a single concern and not introduce unrelated changes.
Split different concerns into multiple PRs to help the team focus on one issue per review.
- In the PR title and description, briefly explain the changes including reasons and intent.
Link related issues or RFCs in the PR description.
This helps the team understand context quickly during code review.
- Ensure "Allow edits from maintainers" is checked. This allows direct minor edits/refactors and saves time.
- Ensure local tests and linting pass. These are also checked in PR CI.
- For bug fixes and new features, the team may request corresponding unit test coverage.
The development team will review contributor PRs and discuss or approve merging as soon as possible.
## Release Process
Releases are currently triggered automatically after the development team manually merges a specific "release PR".
Bug fix PRs are typically released quickly, usually within a week.
New feature releases take longer and are less predictable. Check the [GitHub Project](https://github.com/EstrellaXD/Auto_Bangumi/projects?query=is%3Aopen) board for development progress — a version is released when all planned features are complete.

159
docs/en/faq/index.md Normal file
View File

@@ -0,0 +1,159 @@
# Frequently Asked Questions
## WebUI
### WebUI Address
The default port is 7892. For server deployments, access `http://serverhost:7892`. For local deployments, access `http://localhost:7892`. If you changed the port, remember to also update the Docker port mapping.
### Default Username and Password
- Default username: `admin`, default password: `adminadmin`.
- Please change your password after first login.
### Changing or Resetting Password
- Change password: After logging in, click `···` in the upper right, click `Profile`, and modify your username and password.
- There is currently no simple password reset method. If you forget your password, delete the `data/data.db` file and restart.
### Why don't my configuration changes take effect?
- After changing configuration, click the **Apply** button, then click **Restart** in the `···` menu to restart the main process.
- If Debug mode is enabled, click **Shutdown** in the `···` menu to restart the container.
### How to check if the program is running normally
The new WebUI has a small dot in the upper right corner. Green means running normally, red means an error occurred and the program is paused.
### Poster wall not showing images
- If your version is 3.0:
AB uses `mikanani.me` addresses as poster image sources by default. If images aren't showing, your network cannot access these images.
- If your version is 3.1 or later:
- If posters show an error icon, the images are missing. Click the refresh poster button in the upper right menu to fetch TMDB posters.
- If posters fail to load, clear your browser cache.
- When using `mikanime.tv` as the RSS address, client-side proxies may prevent poster loading. Add a `direct` rule for it.
## How Does v3.0 Manage Bangumi
After upgrading to v3.0, AB can manage anime torrents and download rules in the WebUI. It relies on the torrent download path and rule name.
If you manually change torrent download paths in QB, you may encounter issues like notifications missing posters or failed torrent deletion.
Please manage anime and torrents within AB as much as possible.
## Downloads and Keyword Filtering
### Download Path
**What should I put for the download path?**
- This parameter just needs to match your qBittorrent configuration:
- Docker: If qB uses `/downloads`, then set `/downloads/Bangumi`. You can change `Bangumi` to anything.
- Linux/macOS: If it's `/home/usr/downloads` or `/User/UserName/Downloads`, just append `/Bangumi` at the end.
- Windows: Change `D:\Media\` to `D:\Media\Bangumi`
### Downloads not starting automatically
Check AutoBangumi's logs for any torrent-related entries.
- If none exist, check if your subscription is correct.
### Downloads not saved in the correct directory
- Check if the [download path](#download-path) is correct.
- Check qBittorrent's PGID and PUID configuration for folder creation permissions. Try manually downloading any torrent to a specified directory — if errors occur or the directory isn't created, it's a permissions issue.
- Check qBittorrent's default settings: Saving Management should be set to Manual (Saving Management >> Default Torrent Management Mode >> Manual).
### Downloading many unsubscribed anime
- Check if your Mikan subscription includes all subtitle groups for a single anime. Subscribe to only one group per anime, and enable advanced subscriptions.
- Advanced subscriptions can be enabled in Mikan Project's user settings.
- Regex filtering may be insufficient — see the next section for expanding regex.
- If neither applies, report with logs at [Issues][ISSUE].
### How to write filter keywords
Filter keywords in AB are regular expressions, added only when rules are created. To expand rules after creation, use the WebUI (v3.0+) to configure each anime individually.
- Filter keywords are regex — separate unwanted keywords with `|`.
- The default `720|\d+-\d+` rule filters out all collections and 720P anime. Add filters before deploying AB; subsequent environment variable changes only affect new rules.
- Common regex keywords (separated by `|`):
- `720` — filters 720, 720P, 720p, etc.
- `\d+-\d+` — filters collections like [1-12]
- `[Bb]aha` — filters Baha releases
- `[Bb]ilibili`, `[Bb]-Global` — filters Bilibili releases
- `繁`, `CHT` — filters Traditional Chinese subtitles
- To match specific keywords, add in QB's include field: `XXXXX+1080P\+` where `1080P\+` matches 1080P+ releases.
### First deployment downloaded unwanted anime
1. Delete extra automatic download rules and files in QB.
2. Check subscriptions and filter rules.
3. Visit the resetRule API in your browser: `http://localhost:7892/api/v1/resetRule` to reset rules.
4. Restart AB.
### AB identifies fewer RSS entries than subscribed
In newer versions, AB's filter also filters all RSS entries by default. Don't add all filters at once. For fine-grained control, configure each anime individually in the WebUI.
### Filter keywords not working
- Check if the **global filter** parameter is set correctly.
- Check QB's RSS auto-download rules — you can see matched RSS on the right side, adjust download rules, and click save to identify which keyword is causing issues.
## Episode Completion
### Episode completion not working
Check if the **Episode completion** parameter is correctly configured.
## File Renaming
### Parse error `Cannot parse XXX`
- AB does not currently support parsing collections.
- If it's not a collection, report the issue on GitHub Issues.
### `Rename failed` or renaming errors
- Check file paths. Standard storage path should be `/title/Season/Episode.mp4`. Non-standard paths cause naming errors — check your qBittorrent configuration.
- Check if the `download path` is filled in correctly. Incorrect paths prevent proper renaming.
- For other issues, report on GitHub Issues.
### No automatic renaming
- Check if the torrent category in QB is `Bangumi`.
- AB only renames downloaded files.
### How to rename non-AB anime with AB
- Simply change the torrent's category to `Bangumi`.
- Note: The torrent must be stored in a `Title/Season X/` folder to trigger renaming.
### How to rename collections
1. Change the collection's category to `Bangumi`.
2. Change the collection's storage path to `Title/Season X/`.
3. Wait for the collection to finish downloading, and renaming will complete.
## Docker
### How to auto-update
Run a `watchtower` daemon in Docker to automatically update your containers.
[watchtower](https://containrrr.dev/watchtower) official documentation
### Updating with Docker Compose
If your AB is deployed with Docker Compose, use `docker compose pull` to update.
After pulling the new image, use `docker compose up -d` to restart.
You can also add `pull_policy: always` to your `docker-compose.yml` to pull the latest image on every start.
### What to do if an upgrade causes issues
Since configurations may vary, upgrades might cause the program to fail. In this case, delete all previous data and generated configuration files, then restart the container.
Then reconfigure in the WebUI.
If upgrading from an older version, first refer to the [upgrade guide](/changelog/2.6).
If you encounter issues not covered above, report them at [Issues][ISSUE] using the bug template.
[ISSUE]: https://github.com/EstrellaXD/Auto_Bangumi/issues

97
docs/en/faq/network.md Normal file
View File

@@ -0,0 +1,97 @@
# Network Issues
## Cannot Connect to Mikan Project
Since the main Mikan Project site (`https://mikanani.me`) may be blocked in some regions, AB may fail to connect. Use the following solutions:
- [Use Mikan Project alternative domain](#mikan-project-alternative-domain)
- [Use a proxy](#configuring-a-proxy)
- [Use a Cloudflare Worker reverse proxy](#cloudflare-workers-reverse-proxy)
### Mikan Project Alternative Domain
Mikan Project has a new domain `https://mikanime.tv`. Use this domain with AB without enabling a proxy.
If you see:
```
DNS/Connect ERROR
```
- Check your network connection. If it's fine, check DNS resolution.
- Add `dns=8.8.8.8` to AB. If using Host network mode, this can be ignored.
If you're using a proxy, this error typically won't occur with correct configuration.
### Configuring a Proxy
::: tip
In AB 3.1+, AB handles RSS updates and notifications itself, so you only need to configure the proxy in AB.
:::
AB has built-in proxy configuration. To configure a proxy, follow the instructions in [Proxy Settings](../config/proxy) to set up HTTP or SOCKS proxy correctly. This resolves access issues.
**For versions before 3.1, qBittorrent proxy configuration is also needed**
Configure the proxy in QB as shown below (same approach for SOCKS):
<img width="483" alt="image" src="https://user-images.githubusercontent.com/33726646/233681562-cca3957a-a5de-40e2-8fb3-4cc7f57cc139.png">
### Cloudflare Workers Reverse Proxy
You can also use a reverse proxy approach via Cloudflare Workers. Setting up a domain and binding it to Cloudflare is beyond the scope of this guide.
Add the following code in Workers to use your own domain to access Mikan Project and download torrents from RSS links:
```javascript
const TELEGRAPH_URL = 'https://mikanani.me';
const MY_DOMAIN = 'https://yourdomain.com'
addEventListener('fetch', event => {
event.respondWith(handleRequest(event.request))
})
async function handleRequest(request) {
const url = new URL(request.url);
url.host = TELEGRAPH_URL.replace(/^https?:\/\//, '');
const modifiedRequest = new Request(url.toString(), {
headers: request.headers,
method: request.method,
body: request.body,
redirect: 'manual'
});
const response = await fetch(modifiedRequest);
const contentType = response.headers.get('Content-Type') || '';
// Only perform replacement if content type is RSS
if (contentType.includes('application/xml')) {
const text = await response.text();
const replacedText = text.replace(/https?:\/\/mikanani\.me/g, MY_DOMAIN);
const modifiedResponse = new Response(replacedText, response);
// Add CORS headers
modifiedResponse.headers.set('Access-Control-Allow-Origin', '*');
return modifiedResponse;
} else {
const modifiedResponse = new Response(response.body, response);
// Add CORS headers
modifiedResponse.headers.set('Access-Control-Allow-Origin', '*');
return modifiedResponse;
}
}
```
After completing the configuration, replace `https://mikanani.me` with your domain when **adding RSS**.
## Cannot Connect to qBittorrent
First, check if the **downloader address** parameter in AB is correct.
- If AB and QB are on the same Docker network, try using the container name for addressing, e.g., `http://qbittorrent:8080`.
- If AB and QB are on the same Docker server, try using the Docker gateway address, e.g., `http://172.17.0.1:8080`.
- If AB's network mode is not `host`, do not use `127.0.0.1` to access QB.
If containers in Docker cannot access each other, set up a network link between QB and AB in QB's network connection settings. If qBittorrent uses HTTPS, add the `https://` prefix to the **downloader address**.

View File

@@ -0,0 +1,39 @@
---
title: Troubleshooting
---
## General Troubleshooting Flow
1. If AB fails to start, check if the startup command is correct. If incorrect and you don't know how to fix it, try redeploying AB.
2. After deploying AB, check the logs first. If you see output like the following, AB is running normally and connected to QB:
```
[2022-07-09 21:55:19,164] INFO: _ ____ _
[2022-07-09 21:55:19,165] INFO: /\ | | | _ \ (_)
[2022-07-09 21:55:19,166] INFO: / \ _ _| |_ ___ | |_) | __ _ _ __ __ _ _ _ _ __ ___ _
[2022-07-09 21:55:19,167] INFO: / /\ \| | | | __/ _ \| _ < / _` | '_ \ / _` | | | | '_ ` _ \| |
[2022-07-09 21:55:19,167] INFO: / ____ \ |_| | || (_) | |_) | (_| | | | | (_| | |_| | | | | | | |
[2022-07-09 21:55:19,168] INFO: /_/ \_\__,_|\__\___/|____/ \__,_|_| |_|\__, |\__,_|_| |_| |_|_|
[2022-07-09 21:55:19,169] INFO: __/ |
[2022-07-09 21:55:19,169] INFO: |___/
[2022-07-09 21:55:19,170] INFO: Version 3.0.1 Author: EstrellaXD Twitter: https://twitter.com/Estrella_Pan
[2022-07-09 21:55:19,171] INFO: GitHub: https://github.com/EstrellaXD/Auto_Bangumi/
[2022-07-09 21:55:19,172] INFO: Starting AutoBangumi...
[2022-07-09 21:55:20,717] INFO: Add RSS Feed successfully.
[2022-07-09 21:55:21,761] INFO: Start collecting RSS info.
[2022-07-09 21:55:23,431] INFO: Finished
[2022-07-09 21:55:23,432] INFO: Running....
```
1. If you see this log, AB cannot connect to qBittorrent. Check if qBittorrent is running. If it is, go to the [Network Issues](/faq/network) section.
```
[2022-07-09 22:01:24,534] WARNING: Cannot connect to qBittorrent, wait 5min and retry
```
2. If you see this log, AB cannot connect to Mikan RSS. Go to the [Network Issues](/faq/network) section.
```
[2022-07-09 21:55:21,761] INFO: Start collecting RSS info.
[2022-07-09 22:01:24,534] WARNING: Connected Failed, please check DNS/Connection
```
3. At this point, QB should have download tasks.
1. If downloads show path issues, check QB's "Saving Management" → "Default Torrent Management Mode" is set to "Manual".
2. If all downloads show exclamation marks or no category folders are created in the download path, check QB's permissions.
4. If none of the above resolves the issue, try redeploying a fresh qBittorrent.
5. If still unsuccessful, report with logs at [Issues](https://www.github.com/EstrellaXD/Auto_Bangumi/issues).

View File

@@ -0,0 +1,83 @@
# Bangumi Management
Click an anime poster on the homepage to manage individual anime entries.
![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
Since AB continuously parses **aggregated RSS** feeds, for download rules from aggregated RSS that you no longer need:
- Disable anime: The anime won't be downloaded or re-parsed
- 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

View File

@@ -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.
:::

61
docs/en/feature/rename.md Normal file
View File

@@ -0,0 +1,61 @@
# File Renaming
AB currently provides three renaming methods: `pn`, `advance`, and `none`.
### pn
Short for `pure name`. This method uses the torrent download name for renaming.
Example:
```
[Lilith-Raws] 86 - Eighty Six - 01 [Baha][WEB-DL][1080p][AVC AAC][CHT][MKV].mkv
>>
86 - Eighty Six S01E01.mkv
```
### advance
Advanced renaming. This method uses the parent folder name for renaming.
```
/downloads/Bangumi/86 - Eighty Six(2023)/Season 1/[Lilith-Raws] 86 - Eighty Six - 01 [Baha][WEB-DL][1080p][AVC AAC][CHT][MKV].mkv
>>
86 - Eighty Six(2023) S01E01.mkv
```
### none
No renaming. Files are left as-is.
## Collection Renaming
AB supports renaming collections. Collection renaming requires:
- Episodes are in the collection's first-level directory
- Episode numbers can be parsed from file names
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.

68
docs/en/feature/rss.md Normal file
View File

@@ -0,0 +1,68 @@
---
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:
**Collect** and **Subscribe**.
- **Collect** downloads all episodes at once, suitable for completed anime.
- **Subscribe** adds an automatic download rule with the corresponding RSS link, suitable for ongoing anime.
### Parsing RSS Links
AB supports parsing collection RSS links from all resource sites. Find the collection RSS for your desired anime on the corresponding site, click the **+** button in the upper right corner of AB, and paste the RSS link in the popup window.
### Adding Downloads
If parsing succeeds, a window will appear showing the parsed anime information. Click **Collect** or **Subscribe** to add it to the download queue.
### Common Issues
If a parsing error occurs, it may be due to an incorrect RSS link or an unsupported subtitle group naming format.
## Managing Bangumi
Since v3.0, AB provides manual anime management in the WebUI, allowing you to manually adjust incorrectly parsed anime information.
### Editing Anime Information
In the anime list, click the anime poster to enter the anime information page.
After modifying the information, click **Apply**.
AB will readjust the directory and automatically rename files based on your changes.
### Deleting Anime
Since v3.0, you can manually delete anime. Click the anime poster, enter the information page, and click **Delete**.
::: warning
After deleting anime, if the RSS subscription hasn't been cancelled, AB will still re-parse it. To disable the download rule, use [Disable Anime](#disabling-anime).
:::
### Disabling Anime
Since v3.0, you can manually disable anime. Click the anime poster, enter the information page, and click **Disable**.
Once disabled, the anime poster will be grayed out and sorted to the end. To re-enable the download rule, click **Enable**.

69
docs/en/feature/search.md Normal file
View File

@@ -0,0 +1,69 @@
# Torrent Search
Since v3.1, AB includes a search feature for quickly finding anime.
## Using the Search Feature
::: warning
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. 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.
::: tip
When the source is **Mikan**, AB uses the `mikan` parser by default. For other sources, the TMDB parser is used.
:::
## Managing Search Sources
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`:
```json
{
"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",
"bangumi.moe": "https://bangumi.moe/rss/search/%s"
}
```

102
docs/en/home/index.md Normal file
View File

@@ -0,0 +1,102 @@
---
title: About
---
<p align="center">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="/image/icons/dark-icon.svg">
<source media="(prefers-color-scheme: light)" srcset="/image/icons/light-icon.svg">
<img src="/image/icons/light-icon.svg" width=50%>
</picture>
</p>
## About AutoBangumi
<p align="center">
<img
title="AutoBangumi WebUI"
alt="AutoBangumi WebUI"
src="/image/preview/window.png"
width=85%
data-zoomable
>
</p>
**`AutoBangumi`** is a fully automated anime downloading and organizing tool based on RSS feeds. Simply subscribe to anime on [Mikan Project][mikan] or similar sites, and it will automatically track and download new episodes.
The organized file names and directory structure are directly compatible with [Plex][plex], [Jellyfin][jellyfin], and other media library software without requiring additional metadata scraping.
## Features
- Simple one-time configuration for continuous use
- Hands-free RSS parser that extracts anime information and automatically generates download rules
- Anime file organization:
```
Bangumi
├── bangumi_A_title
│ ├── Season 1
│ │ ├── A S01E01.mp4
│ │ ├── A S01E02.mp4
│ │ ├── A S01E03.mp4
│ │ └── A S01E04.mp4
│ └── Season 2
│ ├── A S02E01.mp4
│ ├── A S02E02.mp4
│ ├── A S02E03.mp4
│ └── A S02E04.mp4
├── bangumi_B_title
│ └─── Season 1
```
- Fully automatic renaming — over 99% of anime files can be directly scraped by media library software after renaming
```
[Lilith-Raws] Kakkou no Iinazuke - 07 [Baha][WEB-DL][1080p][AVC AAC][CHT][MP4].mp4
>>
Kakkou no Iinazuke S01E07.mp4
```
- Custom renaming based on parent folder names for all child files
- Mid-season catch-up to fill in all missed episodes of the current season
- Highly customizable options that can be fine-tuned for different media library software
- Zero maintenance, completely transparent operation
- Built-in TMDB parser for generating complete TMDB-formatted files and anime metadata
- Reverse proxy support for Mikan RSS feeds
## Community
- Update notifications: [Telegram Channel](https://t.me/autobangumi_update)
- Bug reports: [Telegram](https://t.me/+yNisOnDGaX5jMTM9)
## Acknowledgments
Thanks to [Sean](https://github.com/findix) for extensive help with the project.
## Contributing
Issues and Pull Requests are welcome!
<a href="https://github.com/EstrellaXD/Auto_Bangumi/graphs/contributors">
<img src="https://contrib.rocks/image?repo=EstrellaXD/Auto_Bangumi" />
</a>
## Disclaimer
Since AutoBangumi obtains anime through unofficial copyright channels:
- **Do not** use AutoBangumi for commercial purposes.
- **Do not** create video content featuring AutoBangumi for distribution on domestic video platforms (copyright stakeholders).
- **Do not** use AutoBangumi for any activity that violates laws or regulations.
AutoBangumi is for educational and personal use only.
## License
[MIT License](https://github.com/EstrellaXD/Auto_Bangumi/blob/main/LICENSE)
[mikan]: https://mikanani.me
[plex]: https://plex.tv
[jellyfin]: https://jellyfin.org

12
docs/en/home/pipline.md Normal file
View File

@@ -0,0 +1,12 @@
# How AutoBangumi Works
AutoBangumi (AB for short) is essentially an RSS parser. It parses RSS feeds from anime torrent sites, extracts metadata from torrent titles, generates download rules, and sends them to qBittorrent for downloading. After downloading, it organizes files into a standard media library directory structure.
## Pipeline Overview
1. **RSS Parsing** — AB periodically fetches and parses your subscribed RSS feeds
2. **Title Analysis** — Torrent titles are parsed to extract anime name, episode number, season, subtitle group, and resolution
3. **Rule Generation** — Download rules are created in qBittorrent based on the parsed information
4. **Download Management** — qBittorrent handles the actual downloading of torrents
5. **File Organization** — Downloaded files are renamed and moved into a standardized directory structure
6. **Media Library Ready** — The organized files can be directly recognized by Plex, Jellyfin, and other media servers

100
docs/en/index.md Normal file
View File

@@ -0,0 +1,100 @@
---
# https://vitepress.dev/reference/default-theme-home-page
layout: home
title: AutoBangumi
titleTemplate: 全自动追番,解放双手!
hero:
name: AutoBangumi
text: 全自动追番,解放双手!
tagline: 全自动 RSS 订阅解析、下载管理和文件整理
actions:
- theme: brand
text: 快速开始
link: /deploy/quick-start
- theme: alt
text: 关于
link: /home/
- theme: alt
text: 更新日志
link: /changelog/3.2
features:
- icon:
src: /image/icons/rss.png
title: RSS 订阅解析
details: 自动识别并解析番剧 RSS 订阅源。无需手动输入,只需订阅即可自动完成解析、下载和整理。
- icon:
src: /image/icons/qbittorrent-logo.svg
title: qBittorrent 下载器
details: 使用 qBittorrent 下载番剧资源。在 AutoBangumi 中即可管理现有番剧、下载往期番剧以及删除条目。
- icon:
src: /image/icons/tmdb-icon.png
title: TMDB 元数据匹配
details: 通过 TMDB 匹配番剧信息以获取准确的元数据,确保即使在多个字幕组之间也能正确解析。
- icon:
src: /image/icons/plex-icon.png
title: Plex / Jellyfin / Infuse ...
details: 根据匹配结果自动整理文件名和目录结构,确保媒体库软件能够高成功率地刮削元数据。
---
<div class="container">
<div class="vp-doc">
## 鸣谢
### 致谢
感谢
- [Mikan Project](https://mikanani.me) 提供了如此优秀的番剧资源。
- [VitePress](https://vitepress.dev) 提供了优秀的文档框架。
- [qBittorrent](https://www.qbittorrent.org) 提供了优秀的下载器。
- [Plex](https://www.plex.tv) / [Jellyfin](https://jellyfin.org) 提供了优秀的自托管媒体库。
- [Infuse](https://firecore.com/infuse) 提供了优雅的视频播放器。
- [弹弹 Play](https://www.dandanplay.com) 提供了优秀的弹幕播放器。
- 每一个番剧制作组 / 字幕组 / 爱好者。
### 贡献者
[
![](https://contrib.rocks/image?repo=EstrellaXD/Auto_Bangumi){class=contributors-avatar}
](https://github.com/EstrellaXD/Auto_Bangumi/graphs/contributors)
## 免责声明
由于 AutoBangumi 通过非官方版权渠道获取番剧:
- **请勿**将 AutoBangumi 用于商业用途。
- **请勿**制作包含 AutoBangumi 的视频内容并在国内视频平台(版权相关方)上发布。
- **请勿**将 AutoBangumi 用于任何违反法律法规的活动。
</div>
</div>
<style scoped>
.container {
display: flex;
position: relative;
margin: 0 auto;
padding: 0 24px;
max-width: 1280px;
}
@media (min-width: 640px) {
.container {
padding-inline: 48px;
}
}
@media (min-width: 960px) {
.container {
padding-inline: 64px;
}
}
.contributors-avatar {
width: 600px;
}
</style>