Files
stripstream-librarian/openspec/changes/archive/2026-03-09-cbr-to-cbz-conversion/proposal.md
Froidefond Julien e0b80cae38 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>
2026-03-09 23:02:08 +01:00

31 lines
1.5 KiB
Markdown

## 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)