feat: conversion CBR → CBZ via job asynchrone
Ajoute la possibilité de convertir un livre CBR en CBZ depuis le backoffice. La conversion est sécurisée : le CBR original n'est supprimé qu'après vérification du CBZ généré et mise à jour de la base de données. - parsers: nouvelle fn `convert_cbr_to_cbz` (unar extract → zip pack → vérification → rename atomique) - api: `POST /books/:id/convert` crée un job `cbr_to_cbz` (vérifie format CBR, détecte collision) - indexer: nouveau `converter.rs` dispatché depuis `job.rs` - backoffice: bouton "Convert to CBZ" sur la page détail (visible si CBR), label dans JobRow - migrations: colonne `book_id` sur `index_jobs` + type `cbr_to_cbz` dans le check constraint Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,30 @@
|
||||
## Why
|
||||
|
||||
CBR est un format RAR propriétaire qui nécessite des outils tiers non-libres (`unrar`) pour la lecture. CBZ est un simple ZIP — standard ouvert, mieux supporté par les lecteurs et les outils. Permettre la conversion en backoffice évite une manipulation manuelle des fichiers et garantit une bibliothèque homogène.
|
||||
|
||||
## What Changes
|
||||
|
||||
- Nouvelle fonction `convert_cbr_to_cbz()` dans `crates/parsers`
|
||||
- Nouveau endpoint API `POST /books/:id/convert` qui crée un job de conversion
|
||||
- Nouveau type de job `cbr_to_cbz` traité par l'indexer
|
||||
- Bouton "Convert to CBZ" sur la page détail d'un livre (visible uniquement si `file_format == 'cbr'`)
|
||||
- Affichage du type `cbr_to_cbz` dans la liste des jobs du backoffice
|
||||
|
||||
## Capabilities
|
||||
|
||||
### New Capabilities
|
||||
|
||||
- `cbr-conversion`: Conversion d'un fichier CBR en CBZ via un job asynchrone, avec suppression sécurisée du CBR uniquement après vérification du CBZ généré.
|
||||
|
||||
### Modified Capabilities
|
||||
|
||||
<!-- Aucune spec existante n'est modifiée -->
|
||||
|
||||
## Impact
|
||||
|
||||
- **crates/parsers** : nouvelle fonction publique `convert_cbr_to_cbz`
|
||||
- **apps/api** : nouveau endpoint `POST /books/:id/convert`, nouveau type de job dans `index_jobs.rs`
|
||||
- **apps/indexer** : nouveau `converter.rs`, dispatch dans `worker.rs`
|
||||
- **apps/backoffice** : page détail livre + liste des jobs
|
||||
- **infra/migrations** : migration `0013_add_book_id_to_index_jobs.sql` pour stocker la cible du job
|
||||
- **Dépendances système** : `unar` (déjà requis) + `zip` crate (déjà présent via CBZ)
|
||||
Reference in New Issue
Block a user