mirror of
https://github.com/kikootwo/ReadMeABook.git
synced 2026-06-02 20:30:10 +00:00
a3381cba31
Root cause: Singleton caching issue
The qBittorrent service uses a singleton pattern with a configLoaded flag.
Once initialized, it NEVER re-reads the database config, even when the
user changes settings via the admin settings page.
Flow showing the bug:
1. Wizard saves download_dir to database ✓
2. First torrent: service reads config, creates singleton, sets configLoaded=true ✓
3. User changes download_dir in settings page ✓ (database updated)
4. Next torrent: getQBittorrentService() returns CACHED singleton ✗
5. Cached singleton has OLD download_dir value in this.defaultSavePath ✗
6. Category check shows "already has correct save path: /old/path" ✗
7. Download goes to wrong location ✗
The singleton check (line 745):
if (!qbittorrentService || !configLoaded) {
// Only runs if service doesn't exist or config failed
}
Once both exist, this block is SKIPPED forever!
Fix:
1. Added invalidateQBittorrentService() function
- Resets qbittorrentService = null
- Resets configLoaded = false
- Forces reload from database on next use
2. Call invalidation from settings APIs:
- After updating paths (download_dir, media_dir)
- After updating download client (URL, credentials)
3. Next torrent addition:
- getQBittorrentService() sees null singleton
- Re-reads config from database
- Creates new service with current download_dir
- Category updated with correct path
Benefits:
- Settings changes take effect immediately
- No app restart needed
- Category save path always matches current config
- Download client credentials always current
Updated documentation to explain singleton invalidation pattern.
Phase 3: Automation Engine
Status: ⏳ In Development
Multi-stage pipeline transforming requests into downloaded, organized media in Plex.
Pipeline
Request → search_indexers → rank_results → download_torrent
→ monitor_download → process_audiobook → update_plex
Job Types
- search_indexers - Search Prowlarr for torrents
- rank_results - Apply ranking algorithm, select best
- download_torrent - Add to qBittorrent
- monitor_download - Poll progress (10s intervals)
- process_audiobook - Organize files to media directory
- update_plex - Trigger scan, fuzzy match
Integration Points
Indexers: Prowlarr (primary), Jackett (fallback) Download Clients: qBittorrent (primary), Transmission (fallback) Media Server: Plex (scan + match)
Job Queue (Bull)
- Redis-backed for persistence
- Retry: 3 attempts, exponential backoff (2s, 4s, 8s)
- Priorities: High (10), Medium (5), Low (1)
- Concurrency: 3 concurrent per type
- Jobs survive app restarts
Config Keys
Prowlarr: indexer.type=prowlarr, indexer.prowlarr_url, indexer.prowlarr_api_key
qBittorrent: download_client.type=qbittorrent, download_client.qbittorrent_url/username/password
Paths: paths.download_dir, paths.media_dir