feat: modale Prowlarr avec bouton remplacer + fix parseur volumes

- Modale Prowlarr (page série) : remplacé le bouton qBittorrent brut
  par QbittorrentDownloadButton avec suivi managé (libraryId,
  seriesName, expectedVolumes) et bouton "télécharger et remplacer".
- Ajout de alwaysShowReplace pour la modale Prowlarr (toujours montrer
  le bouton remplacer) vs la page downloads (seulement si allVolumes >
  expectedVolumes).
- Fix parseur : les tags de version entre crochets [V2], [V3] ne sont
  plus extraits comme volumes (le préfixe "v" est ignoré après "[").
- Progression qBittorrent : utilise directement le champ progress
  (completed et amount_left sont non-fiables sur qBittorrent 4.3.2).
- Référence import : ne plus exclure les volumes attendus de la
  recherche de référence (corrige le mauvais dossier/nommage quand
  tous les volumes sont dans expected_volumes).
- allVolumes ajouté à ProwlarrRelease (backend + frontend).
- flex-wrap sur les pastilles volumes dans la modale Prowlarr.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-03-27 17:27:34 +01:00
parent 8d48b7669f
commit 00f5564f05
6 changed files with 72 additions and 97 deletions

View File

@@ -36,6 +36,7 @@ export function QbittorrentDownloadButton({
seriesName,
expectedVolumes,
allVolumes,
alwaysShowReplace,
}: {
downloadUrl: string;
releaseId: string;
@@ -43,6 +44,8 @@ export function QbittorrentDownloadButton({
seriesName?: string;
expectedVolumes?: number[];
allVolumes?: number[];
/** Show replace button even when allVolumes == expectedVolumes (e.g. in Prowlarr search modal) */
alwaysShowReplace?: boolean;
}) {
const { t } = useTranslation();
const { configured, onDownloadStarted } = useContext(QbConfigContext);
@@ -53,8 +56,8 @@ export function QbittorrentDownloadButton({
if (!configured) return null;
const hasExistingVolumes = allVolumes && expectedVolumes
&& allVolumes.length > expectedVolumes.length;
const showReplaceButton = allVolumes && allVolumes.length > 0
&& (alwaysShowReplace || (expectedVolumes && allVolumes.length > expectedVolumes.length));
async function handleSend(volumes?: number[], replaceExisting = false) {
setSending(true);
@@ -115,7 +118,7 @@ export function QbittorrentDownloadButton({
)}
</button>
{hasExistingVolumes && (
{showReplaceButton && (
<button
type="button"
onClick={() => setShowConfirm(true)}