Commit Graph

390 Commits

Author SHA1 Message Date
5e6217cc30 chore: bump version to 2.14.17 2026-03-28 17:50:41 +01:00
67d4ebade9 chore: bump version to 2.14.16
All checks were successful
Deploy with Docker Compose / deploy (push) Successful in 41s
2026-03-28 17:44:15 +01:00
002bcc0acf fix: désactiver le Router Cache client pour les pages dynamiques
All checks were successful
Deploy with Docker Compose / deploy (push) Successful in 42s
La navigation client-side (via Link) servait des pages cachées,
empêchant les recherches de fonctionner sans Ctrl+R.
staleTimes.dynamic: 0 force Next.js à toujours re-fetcher les pages
dynamiques lors de la navigation.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-28 14:09:56 +01:00
5b3e4c6f8b chore: bump version to 2.14.15 2026-03-28 14:08:47 +01:00
354d24a7f6 feat: notification Telegram à la fin d'un import torrent
Ajoute les événements TorrentImportCompleted et TorrentImportFailed
au système de notifications. Une notif Telegram est envoyée après
l'import des fichiers dans la bibliothèque (succès ou erreur),
avec le nom de la série, la bibliothèque et le nombre de fichiers.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-28 14:07:02 +01:00
da96e1ea0a fix: résoudre les URLs Prowlarr avant envoi à qBittorrent
qBittorrent ne suit pas les redirections 301 des URLs proxy Prowlarr.
L'API résout maintenant les redirections elle-même : si l'URL mène à un
magnet on le passe directement, si c'est un .torrent on l'uploade en
multipart. Ajoute aussi des logs sur tous les points d'échec du endpoint
/qbittorrent/add et un User-Agent "Stripstream-Librarian" sur les
appels Prowlarr.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-28 13:42:23 +01:00
9a3ab27886 chore: bump version to 2.14.14
All checks were successful
Deploy with Docker Compose / deploy (push) Successful in 40s
2026-03-28 13:33:08 +01:00
622fc98490 chore: bump version to 2.14.13 2026-03-28 13:32:51 +01:00
dc3b2467e1 chore: bump version to 2.14.12
All checks were successful
Deploy with Docker Compose / deploy (push) Successful in 43s
2026-03-28 13:26:45 +01:00
03e4fce5f9 feat: unifier la recherche livres via le endpoint /books avec paramètre q
La recherche utilise désormais le endpoint paginé /books avec un filtre
ILIKE sur title/series/author, ce qui permet la pagination des résultats.
Les series_hits sont toujours récupérés en parallèle via searchBooks.
Corrige aussi le remount du LiveSearchForm lors de la navigation.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-28 13:23:51 +01:00
aa1a501adf chore: bump version to 2.14.11 2026-03-28 09:30:50 +01:00
ce10c3cbe4 chore: bump version to 2.14.10
All checks were successful
Deploy with Docker Compose / deploy (push) Successful in 42s
2026-03-28 08:53:16 +01:00
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