Added:
- new simpler modal without bootstrap - new loadingbutton component - cleanupsome old code - toolbar adjusments
This commit is contained in:
@@ -5,39 +5,35 @@ namespace App\Controller;
|
||||
use App\Entity\Chapter;
|
||||
use App\Entity\Manga;
|
||||
use App\Manager\Toolbar\Factory\ToolbarFactory;
|
||||
use App\Manager\ToolbarManager;
|
||||
use App\Message\DownloadChapter;
|
||||
use App\Repository\ChapterRepository;
|
||||
use App\Repository\MangaRepository;
|
||||
use App\Service\CbzService;
|
||||
use App\Service\MangaExportService;
|
||||
use App\Service\LelScansProviderService;
|
||||
use App\Service\MangaScraperServiceOld;
|
||||
use App\Service\MangaUpdatesMetadataProvider;
|
||||
use App\Service\MangadexProvider;
|
||||
use Doctrine\DBAL\Exception\UniqueConstraintViolationException;
|
||||
use Doctrine\ORM\EntityManagerInterface;
|
||||
use Doctrine\ORM\NonUniqueResultException;
|
||||
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
||||
use Symfony\Component\HttpFoundation\BinaryFileResponse;
|
||||
use Symfony\Component\HttpFoundation\JsonResponse;
|
||||
use Symfony\Component\HttpFoundation\RedirectResponse;
|
||||
use Symfony\Component\HttpFoundation\Request;
|
||||
use Symfony\Component\HttpFoundation\Response;
|
||||
use Symfony\Component\HttpFoundation\ResponseHeaderBag;
|
||||
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
|
||||
use Symfony\Component\Messenger\MessageBusInterface;
|
||||
use Symfony\Component\Routing\Attribute\Route;
|
||||
use Symfony\Component\String\Slugger\AsciiSlugger;
|
||||
|
||||
class MangaController extends AbstractController
|
||||
{
|
||||
public function __construct(
|
||||
private readonly MangaScraperServiceOld $mangaScraperService,
|
||||
private readonly MangaExportService $mangaExportService,
|
||||
private readonly LelScansProviderService $mangaProviderService,
|
||||
private readonly MangaRepository $mangaRepository,
|
||||
private readonly ChapterRepository $chapterRepository,
|
||||
private readonly MangaUpdatesMetadataProvider $mangaUpdatesDbProvider,
|
||||
private readonly MessageBusInterface $bus,
|
||||
private readonly CbzService $cbzService,
|
||||
private readonly ToolbarFactory $toolbarFactory
|
||||
private readonly ToolbarFactory $toolbarFactory,
|
||||
private MangadexProvider $mangadexProvider,
|
||||
private EntityManagerInterface $entityManager
|
||||
)
|
||||
{
|
||||
}
|
||||
@@ -146,21 +142,70 @@ class MangaController extends AbstractController
|
||||
]);
|
||||
}
|
||||
|
||||
#[Route('/manga/new/{query}', name: 'app_manga_new')]
|
||||
public function addNew(string $query = ''): Response
|
||||
#[Route('/manga/search/{query}', name: 'app_manga_search')]
|
||||
public function search(string $query = ''): Response
|
||||
{
|
||||
return $this->render('manga/add_new.html.twig', [
|
||||
'query' => $query,
|
||||
]);
|
||||
}
|
||||
|
||||
public function search(string $title): Response
|
||||
{
|
||||
$mangas = $this->mangaUpdatesDbProvider->search($title);
|
||||
|
||||
return $this->render('manga/add_new.html.twig', [
|
||||
'mangas' => $mangas,
|
||||
]);
|
||||
#[Route('/addManga', name: 'app_manga_add')]
|
||||
public function addManga(Request $request): Response
|
||||
{
|
||||
$manga = new Manga();
|
||||
$manga->setTitle($request->request->get('title'))
|
||||
->setSlug($request->request->get('slug'))
|
||||
->setDescription($request->request->get('description'))
|
||||
->setImageUrl($request->request->get('imageUrl'))
|
||||
->setStatus($request->request->get('status'))
|
||||
->setGenres(explode(',', $request->request->get('genres')))
|
||||
->setAuthor($request->request->get('author'))
|
||||
->setPublicationYear($request->request->get('publicationYear'))
|
||||
->setRating($request->request->get('rating'))
|
||||
->setExternalId($request->request->get('externalId'));
|
||||
|
||||
$mangaFeed = $this->mangadexProvider->getFeed($manga);
|
||||
$mangaAggregate = $this->mangadexProvider->getMangaAggregate($manga);
|
||||
|
||||
$allChapters = array_merge($mangaFeed, $mangaAggregate);
|
||||
|
||||
$mergedChapters = [];
|
||||
foreach ($allChapters as $chapter) {
|
||||
$number = $chapter->getNumber();
|
||||
|
||||
if (isset($mergedChapters[$number])) {
|
||||
$existingChapter = $mergedChapters[$number];
|
||||
|
||||
if (!empty($chapter->getExternalId()) ||
|
||||
(empty($existingChapter->getExternalId()) && !strpos($chapter->getTitle(), 'Chapter ') == 0)) {
|
||||
$mergedChapters[$number] = $chapter;
|
||||
}
|
||||
} else {
|
||||
$mergedChapters[$number] = $chapter;
|
||||
}
|
||||
}
|
||||
|
||||
foreach($mergedChapters as $chapter) {
|
||||
$manga->addChapter($chapter);
|
||||
}
|
||||
|
||||
try {
|
||||
foreach ($manga->getChapters() as $chapter) {
|
||||
$this->entityManager->persist($chapter);
|
||||
}
|
||||
|
||||
$this->entityManager->persist($manga);
|
||||
$this->entityManager->flush();
|
||||
} catch (\Exception $e) {
|
||||
if ($e instanceof UniqueConstraintViolationException) {
|
||||
return $this->redirectToRoute('app_manga_show', ['mangaSlug' => $manga->getSlug()]);
|
||||
}
|
||||
throw $e;
|
||||
}
|
||||
|
||||
return $this->redirectToRoute('app_manga_show', ['mangaSlug' => $manga->getSlug()]);
|
||||
}
|
||||
|
||||
#[Route('/addChapter/{id}', name: 'add_chapter')]
|
||||
@@ -226,108 +271,4 @@ class MangaController extends AbstractController
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
#[Route('/scrape', name: 'manga_scrape', methods: 'POST')]
|
||||
public function scrapeByMangaAndChapter(Request $request): Response
|
||||
{
|
||||
$mangaSlug = $request->request->get('mangaSlug');
|
||||
$chapterNumber = $request->request->get('chapterNumber');
|
||||
|
||||
$response = $this->scrapeChapter($mangaSlug, $chapterNumber);
|
||||
|
||||
$manga = $this->mangaRepository->findOneBy(['slug' => $mangaSlug]);
|
||||
|
||||
$availableChapters = $this->mangaProviderService->getChapterList($mangaSlug);
|
||||
|
||||
return $this->render('manga/show_chapters.html.twig', [
|
||||
'controller_name' => 'MangaController',
|
||||
'manga' => $manga,
|
||||
'availableChapters' => $availableChapters,
|
||||
]);
|
||||
}
|
||||
|
||||
#[Route('/scrapeFrom', name: 'manga_scrape_from_chapter', methods: 'POST')]
|
||||
public function scrapeByMangaFromChapter(Request $request): Response
|
||||
{
|
||||
$mangaSlug = $request->request->get('mangaSlug');
|
||||
$chapterNumber = $request->request->get('chapterNumber');
|
||||
|
||||
do {
|
||||
$response = $this->scrapeChapter($mangaSlug, $chapterNumber);
|
||||
$chapterNumber++;
|
||||
} while ($response !== false);
|
||||
|
||||
$availableChapters = $this->mangaProviderService->getChapterList($mangaSlug);
|
||||
|
||||
return $this->redirectToRoute('app_manga_show', ['mangaSlug' => $mangaSlug, 'availableChapters' => $availableChapters]);
|
||||
}
|
||||
|
||||
#[Route('/manga/exportFrom/{mangaSlug}/{chapterNumber}', name: 'manga_export')]
|
||||
public function exportMangaCbz(string $mangaSlug, float $chapterNumber)
|
||||
{
|
||||
$response = $this->exportCbz($this->slugToTitle($mangaSlug), $chapterNumber);
|
||||
|
||||
dd($response);
|
||||
}
|
||||
|
||||
#[Route('/getList', name: 'get_manga_list')]
|
||||
public function getMangaList()
|
||||
{
|
||||
$list = $this->mangaProviderService->getMangaList();
|
||||
|
||||
}
|
||||
|
||||
private function scrapeChapter(string $mangaSlug, float $chapterNumber): array|bool
|
||||
{
|
||||
$url = 'https://lelscans.net/scan-' . $mangaSlug . '/' . $chapterNumber;
|
||||
|
||||
$manga = $this->mangaRepository->findOneBy(['slug' => $mangaSlug]);
|
||||
|
||||
if (!is_null($manga)) {
|
||||
$scrapedManga = $this->mangaScraperService->scrapeMangaChapter($url, $manga->getTitle(), $chapterNumber);
|
||||
} else {
|
||||
$title = $this->slugToTitle($mangaSlug);
|
||||
$manga = new Manga();
|
||||
$manga->setTitle($title);
|
||||
$manga->setSlug($mangaSlug);
|
||||
$this->mangaRepository->save($manga);
|
||||
$scrapedManga = $this->mangaScraperService->scrapeMangaChapter($url, $title, $chapterNumber);
|
||||
}
|
||||
|
||||
return $scrapedManga;
|
||||
}
|
||||
|
||||
private function exportCbz(string $mangaSlug, float $chapterNumber): array
|
||||
{
|
||||
$exported = [];
|
||||
do {
|
||||
$response = $this->mangaExportService->exportMangaChapter($mangaSlug, $chapterNumber);
|
||||
|
||||
if ($response === 'already_exported') {
|
||||
$exported[] = $mangaSlug . ' - ' . $chapterNumber . ' ' . $response;
|
||||
} elseif ($response === true) {
|
||||
$exported[] = $mangaSlug . ' - ' . $chapterNumber . ' exported';
|
||||
} else {
|
||||
$exported[] = $mangaSlug . ' - ' . $chapterNumber . ' something went wrong';
|
||||
}
|
||||
|
||||
$chapterNumber++;
|
||||
} while ($response !== false);
|
||||
|
||||
return $exported;
|
||||
}
|
||||
|
||||
private function slugToTitle(string $slug): string
|
||||
{
|
||||
$slugger = new AsciiSlugger();
|
||||
$title = $slugger->slug($slug)->replace('-', ' ')->title(true)->toString();
|
||||
|
||||
return $title;
|
||||
}
|
||||
|
||||
private function titleToSlug(string $title): string
|
||||
{
|
||||
$slugger = new AsciiSlugger();
|
||||
return $slugger->slug($title)->lower()->toString();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user