Application web de lecture en ligne de mangas aux formats CBZ et CBR.
Conçue pour être déployée sur un hébergement PHP — aucun build step, aucune base de données, déploiement par simple copie FTP/SFTP.
- Grille des séries avec miniatures de couverture générées automatiquement
- Vue détaillée des tomes d'une série
| Feature | Description |
|---|---|
| Modes de lecture | RTL (manga, défaut), LTR (occidental), Webtoon (scroll vertical) |
| Navigation | Swipe tactile, flèches clavier, zones cliquables, slider de pages, champ numérique |
| Zoom | Pinch-to-zoom, boutons +/−, double-tap reset, persisté par volume |
| Pan | Glissement au doigt ou à la souris quand zoom > 1 |
| Double page | 2 pages côte à côte (LTR/RTL), option de décalage de couverture |
| Reprise de lecture | Dernière page sauvegardée par tome en localStorage |
| Préchargement | Pages suivante et précédente préchargées en arrière-plan |
| Navigation inter-tomes | Boutons Tome précédent / Tome suivant |
| Mode nuit / jour | Thème sombre par défaut, basculable, persisté |
| Plein écran | Fullscreen API (bouton + touche F) |
| Raccourcis clavier | ←/→ navigation · F plein écran · S paramètres · +/- zoom · Échap fermer |
| Composant | Choix |
|---|---|
| Serveur | PHP 8.1+ — ZipArchive natif, Imagick/GD, compatible cPanel |
| Base de données | Aucune — scan dynamique + cache JSON sur disque |
| Frontend | HTML5 / CSS3 / JS ES2022 vanilla — aucune dépendance externe |
| CBZ | ZipArchive (PHP natif) — streaming page par page sans extraction |
| CBR | PECL rar › exec(unrar) › exec(7z) › erreur gracieuse |
| Miniatures | Imagick (préféré) ou GD (fallback) |
| Serveur web | Apache + .htaccess (mod_rewrite) |
CBZ-viewer/
├── index.php ← Bibliothèque : grille des séries
├── series.php ← Tomes d'une série (?s=slug)
├── reader.php ← Lecteur plein écran (?file=serie/tome.cbz)
├── api/
│ ├── lib.php ← Fonctions partagées (CBZ/CBR, cache, miniatures)
│ ├── meta.php ← API JSON : nombre de pages + liste ordonnée
│ ├── page.php ← Stream une image : ?file=…&page=N (0-indexé)
│ └── thumb.php ← Miniature JPEG de couverture (mise en cache)
├── assets/
│ ├── css/style.css
│ └── js/reader.js
├── data/ ← Vos archives CBZ/CBR (non versionnées)
│ └── {serie}/
│ └── {tome}.cbz / .cbr
├── cache/ ← Généré automatiquement par PHP
│ ├── thumbnails/
│ └── metadata/
└── .htaccess ← Rewrite + protection /data et /cache
- PHP 8.1+ avec les extensions :
zip(standard),gdouimagick - Serveur Apache avec
mod_rewriteet support.htaccess - Extension PECL
rarpour la lecture de fichiers.cbr(optionnel, voir ci-dessous)
- Sélectionner PHP 8.1+ sur l'hébergeur ou un hébergeur compatible
- Transférer le projet (sans
data/nicache/) via FTP/SFTP danspublic_html/ - Créer les dossiers
data/{serie}/et y copier les fichiers CBZ/CBR - Vérifier les droits :
cache/doit être accessible en écriture par PHP (755suffit avec suPHP/FastCGI) - Premier accès : le cache se génère automatiquement lors de la navigation
Placez vos archives dans data/ en respectant la structure :
data/
├── one-piece/
│ ├── One_Piece_T001.cbz
│ └── One_Piece_T002.cbz
└── death-note/
├── Death Note T01.cbr
└── Death Note T02.cbr
- Chaque sous-répertoire = une série
- Nommage libre pour les dossiers et les fichiers
- Les pages à l'intérieur des archives sont triées par ordre naturel
La lecture de fichiers .cbr utilise une cascade de méthodes :
- Extension PHP PECL
rar(recommandé) - Binaire
unrarviaexec() - Binaire
7zviaexec() - Message d'erreur explicite avec suggestion de conversion si aucune méthode n'est disponible
# Linux/macOS
for f in *.cbr; do
mkdir tmp_cbr
unrar x "$f" tmp_cbr/
zip -j "${f%.cbr}.cbz" tmp_cbr/*
rm -rf tmp_cbr
doneSur Windows : utiliser CDisplayEx ou Calibre, ou renommer .cbr → .cbz si l'archive est un ZIP déguisé.
Le cache est géré automatiquement dans le dossier cache/ :
- Miniatures :
cache/thumbnails/— images JPEG générées à la première visite - Métadonnées :
cache/metadata/— JSON indexant les pages de chaque archive - Invalidation : automatique si le fichier source change (clé
md5(chemin + filemtime)) - Préchauffage manuel (optionnel, en SSH) :
php -r "
require 'api/lib.php';
foreach (getAllSeries() as \$s) {
foreach (getSeriesFiles(\$s['path']) as \$f) {
getFileMeta(\$f);
\$thumb = getThumbnailCachePath(\$f);
if (!file_exists(\$thumb)) generateThumbnail(\$f);
}
}
echo 'Cache préchauffé.' . PHP_EOL;
"Ce projet est distribué sous licence CC BY-NC-SA 4.0 (Creative Commons Attribution — Non Commercial — ShareAlike 4.0 International).
Vous pouvez :
- Utiliser et modifier librement le code
Sous les conditions suivantes :
- Attribution (BY) : citer l'auteur original (Maugrey) et inclure un lien vers le dépôt source (github.com/Maugrey/CBZ-viewer) en cas de redistribution ou de modification publiée
- Non commercial (NC) : toute utilisation — y compris après modification — doit rester personnelle et non commerciale
- ShareAlike (SA) : toute redistribution d'une version modifiée doit se faire sous cette même licence CC BY-NC-SA
Aucune obligation de publier vos modifications — la clause SA ne s'applique qu'en cas de redistribution.