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:
@@ -876,3 +876,37 @@ export async function getMetadataBatchResults(jobId: string, status?: string) {
|
||||
const params = status ? `?status=${status}` : "";
|
||||
return apiFetch<MetadataBatchResultDto[]>(`/metadata/batch/${jobId}/results${params}`);
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Prowlarr
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
export type ProwlarrCategory = {
|
||||
id: number;
|
||||
name: string | null;
|
||||
};
|
||||
|
||||
export type ProwlarrRelease = {
|
||||
guid: string;
|
||||
title: string;
|
||||
size: number;
|
||||
downloadUrl: string | null;
|
||||
indexer: string | null;
|
||||
seeders: number | null;
|
||||
leechers: number | null;
|
||||
publishDate: string | null;
|
||||
protocol: string | null;
|
||||
infoUrl: string | null;
|
||||
categories: ProwlarrCategory[] | null;
|
||||
};
|
||||
|
||||
export type ProwlarrSearchResponse = {
|
||||
results: ProwlarrRelease[];
|
||||
query: string;
|
||||
};
|
||||
|
||||
export type ProwlarrTestResponse = {
|
||||
success: boolean;
|
||||
message: string;
|
||||
indexer_count: number | null;
|
||||
};
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -456,6 +456,40 @@ const fr = {
|
||||
"settings.newTargetPlaceholder": "Nouveau statut cible (ex: hiatus)",
|
||||
"settings.createTargetStatus": "Créer un statut",
|
||||
|
||||
// Settings - Prowlarr
|
||||
"settings.prowlarr": "Prowlarr",
|
||||
"settings.prowlarrDesc": "Configurer Prowlarr pour rechercher des releases sur les indexeurs (torrents/usenet). Seule la recherche manuelle est disponible pour le moment.",
|
||||
"settings.prowlarrUrl": "URL Prowlarr",
|
||||
"settings.prowlarrUrlPlaceholder": "http://localhost:9696",
|
||||
"settings.prowlarrApiKey": "Clé API",
|
||||
"settings.prowlarrApiKeyPlaceholder": "Clé API Prowlarr",
|
||||
"settings.prowlarrCategories": "Catégories",
|
||||
"settings.prowlarrCategoriesHelp": "ID de catégories Newznab séparés par des virgules (7030 = Comics, 7020 = Ebooks)",
|
||||
"settings.testConnection": "Tester la connexion",
|
||||
"settings.testing": "Test en cours...",
|
||||
"settings.testSuccess": "Connexion réussie",
|
||||
"settings.testFailed": "Échec de la connexion",
|
||||
|
||||
// Prowlarr search modal
|
||||
"prowlarr.searchButton": "Prowlarr",
|
||||
"prowlarr.modalTitle": "Recherche Prowlarr",
|
||||
"prowlarr.searchSeries": "Rechercher la série",
|
||||
"prowlarr.searchVolume": "Rechercher",
|
||||
"prowlarr.searching": "Recherche en cours...",
|
||||
"prowlarr.noResults": "Aucun résultat trouvé",
|
||||
"prowlarr.resultCount": "{{count}} résultat{{plural}}",
|
||||
"prowlarr.missingVolumes": "Volumes manquants",
|
||||
"prowlarr.columnTitle": "Titre",
|
||||
"prowlarr.columnIndexer": "Indexeur",
|
||||
"prowlarr.columnSize": "Taille",
|
||||
"prowlarr.columnSeeders": "Seeds",
|
||||
"prowlarr.columnLeechers": "Peers",
|
||||
"prowlarr.columnProtocol": "Protocole",
|
||||
"prowlarr.searchError": "Erreur lors de la recherche",
|
||||
"prowlarr.notConfigured": "Prowlarr n'est pas configuré",
|
||||
"prowlarr.download": "Télécharger",
|
||||
"prowlarr.info": "Info",
|
||||
|
||||
// Settings - Language
|
||||
"settings.language": "Langue",
|
||||
"settings.languageDesc": "Choisir la langue de l'interface",
|
||||
|
||||
Reference in New Issue
Block a user