Commit Graph

378 Commits

Author SHA1 Message Date
a398225fa6 fix: nettoyer les available_downloads orphelins lors de la détection
Supprime les entrées available_downloads dont le series_name ne
correspond plus à aucune série existante dans books, au début de
chaque job de détection de téléchargements.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-28 08:53:08 +01:00
0555cb85b1 chore: bump version to 2.14.9
All checks were successful
Deploy with Docker Compose / deploy (push) Successful in 57s
2026-03-28 08:50:27 +01:00
e913a92411 fix: tri "derniers ajoutés" utilise created_at au lieu de updated_at
Le tri par date d'ajout utilisait updated_at qui est écrasé à chaque
rescan de l'indexer, empêchant les livres/séries récemment ajoutés
de remonter en premier. Utilise maintenant created_at qui reflète
la vraie date d'ajout.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-28 08:49:00 +01:00
00f5564f05 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>
2026-03-27 17:27:34 +01:00
8d48b7669f chore: bump version to 2.14.8
All checks were successful
Deploy with Docker Compose / deploy (push) Successful in 47s
2026-03-27 17:04:24 +01:00
733d3f981e chore: bump version to 2.14.7
All checks were successful
Deploy with Docker Compose / deploy (push) Successful in 41s
2026-03-27 16:47:41 +01:00
9a6b74604f chore: bump version to 2.14.6
All checks were successful
Deploy with Docker Compose / deploy (push) Successful in 43s
2026-03-27 16:37:17 +01:00
152e0a06e5 chore: bump version to 2.14.5 2026-03-27 16:26:30 +01:00
da966ce59a chore: bump version to 2.14.4
All checks were successful
Deploy with Docker Compose / deploy (push) Successful in 44s
2026-03-27 16:09:56 +01:00
eabb88eb9d feat: bouton télécharger et remplacer + fix extraction volumes UTF-8
- Ajout d'un bouton "télécharger et remplacer" avec popup de
  confirmation, qui passe tous les volumes du pack (pas seulement
  les manquants) et replace_existing=true à l'API.
- Nouvelle colonne replace_existing dans torrent_downloads.
- Fix critique du parseur de volumes : le pass 2 mélangeait les
  indices d'octets (String::find) avec les indices de caractères
  (Vec<char>), causant un décalage quand le titre contenait des
  caractères multi-octets (é, à...). "Tome #097" extrayait 9
  au lieu de 97. Réécrit en indexation char pure.
- Le préfixe "tome" skip désormais "#" (tome #097 → 97).
- Protection intra-batch : si une destination est déjà utilisée,
  le fichier garde son nom original au lieu d'écraser.
- Alerte WARN si N fichiers source donnent N/3 volumes uniques.
- Nettoyage du répertoire sl-{id} et de la catégorie qBittorrent
  après import.
- Badges volumes en flex-wrap dans la page downloads.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-27 16:01:08 +01:00
9c18802864 chore: bump version to 2.14.3
All checks were successful
Deploy with Docker Compose / deploy (push) Successful in 46s
2026-03-27 15:51:59 +01:00
c94a4d4407 chore: bump version to 2.14.2
All checks were successful
Deploy with Docker Compose / deploy (push) Successful in 44s
2026-03-27 15:34:22 +01:00
c3bdbc32d1 chore: bump version to 2.14.1
All checks were successful
Deploy with Docker Compose / deploy (push) Successful in 42s
2026-03-27 15:08:44 +01:00
4a706f6b52 chore: bump version to 2.14.0
All checks were successful
Deploy with Docker Compose / deploy (push) Successful in 49s
2026-03-27 14:10:34 +01:00
4ca0d1980c chore: bump version to 2.13.3
All checks were successful
Deploy with Docker Compose / deploy (push) Successful in 42s
2026-03-27 13:54:04 +01:00
b748c41ba4 chore: bump version to 2.13.2
All checks were successful
Deploy with Docker Compose / deploy (push) Successful in 43s
2026-03-27 13:49:26 +01:00
ac6358437a fix: réinitialiser le bouton de téléchargement après 5 secondes
Le bouton revient à son état initial après l'icône verte de
confirmation, permettant de relancer un téléchargement si besoin.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-27 13:49:18 +01:00
2a4e2decde fix: résolution du hash qBittorrent par catégorie unique
L'ancienne stratégie diff avant/après échouait quand plusieurs
torrents étaient ajoutés en parallèle (le diff voyait N nouveaux
torrents et ne pouvait pas les distinguer). Les tags et savepath
ne sont pas appliqués sur qBittorrent 4.x en url-encoded.

Nouvelle approche : chaque download managé crée une catégorie
`sl-{uuid}` dans qBittorrent, puis résout le hash en filtrant
par catégorie. Le poller retente aussi la résolution par catégorie
pour les torrents avec qb_hash NULL.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-27 13:47:45 +01:00
336ffa759b fix: rafraîchir la liste des téléchargements disponibles côté client
All checks were successful
Deploy with Docker Compose / deploy (push) Successful in 47s
La section "available downloads" n'était jamais mise à jour après le
chargement initial car seuls les torrent downloads étaient rafraîchis.
Stocke latestFound en state React et le rafraîchit en parallèle.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-27 13:11:05 +01:00
fc3810e9c3 chore: bump version to 2.13.1 2026-03-27 13:09:55 +01:00
d86396e395 feat: lien vers la série sur les noms dans la liste des téléchargements
All checks were successful
Deploy with Docker Compose / deploy (push) Successful in 50s
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-27 13:01:09 +01:00
f580df85eb chore: bump version to 2.13.0 2026-03-27 13:00:10 +01:00
885ef7b5b2 feat: table available_downloads découplée des jobs de détection
- Nouvelle table available_downloads (library_id, series_name) unique
  comme source de vérité pour les téléchargements disponibles
- Les jobs de détection font UPSERT (ajout/mise à jour) et DELETE
  (séries complètes ou sans résultat)
- Après import, mise à jour ciblée : retire les volumes importés des
  releases, supprime l'entrée si plus de releases
- Migration avec import des données existantes depuis detection_results
- Endpoint latest-found simplifié : une seule query sur la table

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-27 12:59:57 +01:00
c4f2424787 chore: bump version to 2.12.18
All checks were successful
Deploy with Docker Compose / deploy (push) Successful in 25s
2026-03-27 11:12:34 +01:00
4a1da48d6b fix: corrige le lien repo vers Gitea
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-27 11:12:09 +01:00
d9ee8e6566 fix: fallback localhost pour la version indexer (dev local)
Essaie INDEXER_BASE_URL, puis indexer:7081 (Docker), puis
localhost:7081 (dev local) avec timeout 2s par tentative.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-27 11:11:24 +01:00
b5bb867d9c fix: retire CONCURRENTLY des CREATE INDEX (incompatible avec transactions sqlx)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-27 11:08:56 +01:00
d32a7717a5 feat: affiche les versions API, Indexer et Backoffice dans About
- Endpoint GET /version sur l'indexer (sans auth)
- Le backoffice fetch la version indexer directement (INDEXER_BASE_URL)
- Grille 3 colonnes avec les 3 versions

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-27 11:07:42 +01:00
98d0f1c9c5 feat: bloc About avec versions dans les settings
- Endpoint GET /version (sans auth) retournant la version API
- Bloc About dans l'onglet General : nom du projet, description,
  versions API et Backoffice, lien GitHub

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-27 10:41:31 +01:00
18756debfd chore: bump version to 2.12.17
Some checks failed
Deploy with Docker Compose / deploy (push) Failing after 43s
2026-03-27 10:21:17 +01:00
1af565bf29 perf: optimise la query des auteurs — single pass + index GIN
- Remplace les 5 CTEs + double query (données + count) par une seule
  requête avec COUNT(*) OVER() pour le total
- Calcule book_count et series_count directement depuis UNNEST, sans
  re-JOIN sur les tables
- Ajoute des index GIN sur books.authors et series_metadata.authors

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-27 10:20:48 +01:00
f5139b3598 chore: bump version to 2.12.16
All checks were successful
Deploy with Docker Compose / deploy (push) Successful in 44s
2026-03-27 09:36:35 +01:00
cf1b4d4a5e fix: fiabilise le SSE du widget jobs dans le header
- Serveur : envoie toujours les données (plus de skip si identiques),
  ajoute un heartbeat toutes les 15s pour garder la connexion vivante
- Client : détecte les connexions mortes (timeout 30s sans message)
  et reconnecte automatiquement, reconnexion plus rapide (3s vs 5s)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-27 09:33:22 +01:00
fe3702c4b3 fix: refresh auto de la liste des téléchargements après ajout qBittorrent
Le QbittorrentProvider expose un callback onDownloadStarted qui est
appelé quand un téléchargement est lancé avec succès. Sur la page
downloads, ce callback déclenche un refresh de la liste.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-27 09:28:28 +01:00
65daac4177 chore: bump version to 2.12.15
All checks were successful
Deploy with Docker Compose / deploy (push) Successful in 42s
2026-03-27 09:19:28 +01:00
e078b0029f fix: SSR pour les providers cachés dans MetadataSearchModal
Les metadata providers sont récupérés côté serveur et les providers
sans API key sont passés en prop initialHiddenProviders, supprimant
le fetch client useEffect qui causait un layout shift.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-27 09:13:38 +01:00
e7295a371d feat: SSR pour toutes les cards de la page Settings
Toutes les configurations (Prowlarr, qBittorrent, Telegram, Anilist,
Komga, metadata providers, status mappings) sont maintenant récupérées
côté serveur dans page.tsx et passées en props aux cards.

Supprime ~10 fetchs client useEffect au chargement, élimine les
layout shifts et réduit le temps de rendu initial.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-27 09:11:12 +01:00
432bb519ab chore: bump version to 2.12.14
All checks were successful
Deploy with Docker Compose / deploy (push) Successful in 42s
2026-03-27 08:44:56 +01:00
2dad295451 fix: supprime le layout shift du bouton Prowlarr sur la page série
Les configs Prowlarr et qBittorrent sont récupérées côté serveur et
passées en props au ProwlarrSearchModal, évitant les deux fetchs
client qui causaient l'apparition tardive du bouton.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-27 08:44:19 +01:00
f5ddeb461b fix: supprime le layout shift des boutons qBittorrent au chargement
La config qBittorrent est maintenant récupérée côté serveur et passée
en prop au QbittorrentProvider, évitant le fetch client qui causait
l'apparition tardive des boutons de téléchargement.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-27 08:38:57 +01:00
59f9a657a4 feat: lien vers la page série sur les résultats de détection
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-27 08:31:27 +01:00
4fd6909334 chore: bump version to 2.12.13
All checks were successful
Deploy with Docker Compose / deploy (push) Successful in 51s
2026-03-27 08:19:59 +01:00
6580149e85 feat: nettoyage après import — supprime le répertoire source et le torrent qBittorrent
- Après import réussi, supprime le sous-répertoire content_path dans
  /downloads/ (ne touche jamais /downloads/ lui-même)
- Supprime le torrent de qBittorrent via DELETE avec deleteFiles=true

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-27 08:19:49 +01:00
fb06dc7f65 chore: bump version to 2.12.12 2026-03-27 08:10:12 +01:00
013d7a50ba fix: onglets settings scrollables horizontalement sur mobile
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-27 08:07:55 +01:00
5d91ffbc09 fix: responsive mobile de la page téléchargements
- Header : titre réduit et bouton refresh icône seule sur mobile
- Filtres : scroll horizontal, texte compact
- DownloadRow : layout empilé sur mobile (nom+badge / volumes+date)
- Section disponibles : releases empilées, padding réduit, texte compact

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-27 08:05:11 +01:00
c79bb75b53 chore: bump version to 2.12.11
All checks were successful
Deploy with Docker Compose / deploy (push) Successful in 47s
2026-03-26 23:08:47 +01:00
6834d00b15 feat: pagination et lignes compactes sur la page téléchargements
- Remplace les cartes par des lignes compactes (DownloadRow) pour
  réduire l'espace vertical de chaque téléchargement
- Pagination côté client (10 par page) avec navigation prev/next
- Reset automatique à la page 1 au changement de filtre

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-26 23:08:34 +01:00
ca17d02116 feat: refresh metadata ciblé par série après import et dans la modale
- Après import torrent, refresh automatique des métadonnées uniquement
  sur la série importée (via refresh_link) au lieu d'un job complet
- Nouvel endpoint POST /metadata/refresh-link/:id pour rafraîchir un
  seul lien metadata approuvé
- Bouton "Rafraîchir" dans la modale metadata (état linked) avec
  spinner et confirmation visuelle

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-26 23:05:06 +01:00
072d6870fe feat: persistance des filtres server-side via cookies
All checks were successful
Deploy with Docker Compose / deploy (push) Successful in 47s
Remplace localStorage par des cookies pour la persistance des filtres.
Le proxy restaure les filtres sauvegardés côté serveur, éliminant le flash au chargement.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-26 22:45:48 +01:00