feat: add Prowlarr integration for manual release search

Add Prowlarr indexer integration (step 1: config + manual search).
Allows searching for comics/ebooks releases on Prowlarr indexers
directly from the series detail page, with download links and
per-volume search for missing books.

- Backend: new prowlarr module with search and test endpoints
- Migration: add prowlarr settings (url, api_key, categories)
- Settings UI: Prowlarr config card with test connection button
- ProwlarrSearchModal: auto-search on open, missing volumes shortcuts
- Fix series.readCount i18n plural parameter on series pages

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-19 21:43:34 +01:00
parent e6aa7ebed0
commit 57bc82703d
13 changed files with 755 additions and 2 deletions

View File

@@ -458,6 +458,40 @@ const en: Record<TranslationKey, string> = {
"settings.newTargetPlaceholder": "New target status (e.g. hiatus)",
"settings.createTargetStatus": "Create status",
// Settings - Prowlarr
"settings.prowlarr": "Prowlarr",
"settings.prowlarrDesc": "Configure Prowlarr to search for releases on indexers (torrents/usenet). Only manual search is available for now.",
"settings.prowlarrUrl": "Prowlarr URL",
"settings.prowlarrUrlPlaceholder": "http://localhost:9696",
"settings.prowlarrApiKey": "API Key",
"settings.prowlarrApiKeyPlaceholder": "Prowlarr API key",
"settings.prowlarrCategories": "Categories",
"settings.prowlarrCategoriesHelp": "Comma-separated Newznab category IDs (7030 = Comics, 7020 = Ebooks)",
"settings.testConnection": "Test connection",
"settings.testing": "Testing...",
"settings.testSuccess": "Connection successful",
"settings.testFailed": "Connection failed",
// Prowlarr search modal
"prowlarr.searchButton": "Prowlarr",
"prowlarr.modalTitle": "Prowlarr Search",
"prowlarr.searchSeries": "Search series",
"prowlarr.searchVolume": "Search",
"prowlarr.searching": "Searching...",
"prowlarr.noResults": "No results found",
"prowlarr.resultCount": "{{count}} result{{plural}}",
"prowlarr.missingVolumes": "Missing volumes",
"prowlarr.columnTitle": "Title",
"prowlarr.columnIndexer": "Indexer",
"prowlarr.columnSize": "Size",
"prowlarr.columnSeeders": "Seeds",
"prowlarr.columnLeechers": "Peers",
"prowlarr.columnProtocol": "Protocol",
"prowlarr.searchError": "Search failed",
"prowlarr.notConfigured": "Prowlarr is not configured",
"prowlarr.download": "Download",
"prowlarr.info": "Info",
// Settings - Language
"settings.language": "Language",
"settings.languageDesc": "Choose the interface language",