From b04055ec22e2b91dcd1f16d80907a6562bcb599c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Guillot?= Date: Thu, 27 Jun 2024 11:49:32 +0200 Subject: [PATCH] Added: - hamburger menu - download cbz --- assets/controllers/menu_controller.js | 10 +++++++ src/Controller/MangaController.php | 42 +++++++++++++++++++++++---- 2 files changed, 46 insertions(+), 6 deletions(-) create mode 100644 assets/controllers/menu_controller.js diff --git a/assets/controllers/menu_controller.js b/assets/controllers/menu_controller.js new file mode 100644 index 0000000..b0bd6d2 --- /dev/null +++ b/assets/controllers/menu_controller.js @@ -0,0 +1,10 @@ +// assets/controllers/menu_controller.js +import { Controller } from '@hotwired/stimulus'; + +export default class extends Controller { + static targets = ["sidebar"] + + toggleMenu() { + this.sidebarTarget.classList.toggle('-translate-x-full') + } +} diff --git a/src/Controller/MangaController.php b/src/Controller/MangaController.php index 94b4cbd..29cac02 100644 --- a/src/Controller/MangaController.php +++ b/src/Controller/MangaController.php @@ -2,6 +2,7 @@ namespace App\Controller; +use App\Entity\Chapter; use App\Entity\Manga; use App\Message\DownloadChapter; use App\Repository\ChapterRepository; @@ -170,22 +171,51 @@ class MangaController extends AbstractController public function downloadChapter(int $chapterId): BinaryFileResponse { $chapter = $this->chapterRepository->find($chapterId); - $response = $this->mangaExportService->downloadCbz($chapter->getManga()->getTitle(), $chapter->getNumber()); - - if ($response === false) { + if (!$chapter) { throw $this->createNotFoundException("Le chapitre demandé n'existe pas."); } - // Définir les en-têtes pour le téléchargement - $response->headers->set('Content-Type', 'application/x-cbz'); + $cbzPath = $chapter->getCbzPath(); + if (!$cbzPath || !file_exists($cbzPath)) { + throw $this->createNotFoundException("Le fichier CBZ n'existe pas."); + } + + $response = new BinaryFileResponse($cbzPath); + + // Vérifier si c'est un volume complet ou un chapitre individuel + $isFullVolume = $this->isFullVolume($chapter); + + if ($isFullVolume) { + $fileName = sprintf("%s_volume_%02d.cbz", $chapter->getManga()->getSlug(), $chapter->getVolume()); + } else { + $fileName = sprintf("%s_chapter_%s.cbz", $chapter->getManga()->getSlug(), number_format($chapter->getNumber(), 2)); + } + $response->setContentDisposition( ResponseHeaderBag::DISPOSITION_ATTACHMENT, - "{$chapter->getManga()->getSlug()}_{$chapter->getNumber()}.cbz" + $fileName ); return $response; } + private function isFullVolume(Chapter $chapter): bool + { + $volumeChapters = $this->chapterRepository->findBy([ + 'manga' => $chapter->getManga(), + 'volume' => $chapter->getVolume() + ]); + + $firstChapterPath = $volumeChapters[0]->getCbzPath(); + foreach ($volumeChapters as $volumeChapter) { + if ($volumeChapter->getCbzPath() !== $firstChapterPath) { + return false; + } + } + + return true; + } + #[Route('/scrape', name: 'manga_scrape', methods: 'POST')] public function scrapeByMangaAndChapter(Request $request): Response {