diff --git a/lib/Controller/PageController.php b/lib/Controller/PageController.php index 0f2a630..aba5ddb 100644 --- a/lib/Controller/PageController.php +++ b/lib/Controller/PageController.php @@ -4,6 +4,9 @@ declare(strict_types=1); namespace OCA\OpdsCatalog\Controller; +use Kiwilan\Ebook\Ebook; +use Kiwilan\Opds\Entries\OpdsEntryBook; +use Kiwilan\Opds\Entries\OpdsEntryBookAuthor; use Kiwilan\Opds\Entries\OpdsEntryNavigation; use Kiwilan\Opds\Enums\OpdsVersionEnum; use Kiwilan\Opds\Opds; @@ -38,7 +41,7 @@ class PageController extends Controller #[NoCSRFRequired] #[NoAdminRequired] - #[FrontpageRoute(verb: 'GET', url: '/{path}', requirements: ['path' => '.+'])] + #[FrontpageRoute(verb: 'GET', url: '/index/{path}', requirements: ['path' => '.*'])] public function index(string $path): Response { $userFolder = $this->rootFolder->getUserFolder($this->user->getUID()); $root = $userFolder->get($path); @@ -50,13 +53,44 @@ class PageController extends Controller $feeds[] = new OpdsEntryNavigation( (string) $node->getId(), $node->getName(), - $userFolder->getRelativePath($node->getPath()) ?? $path.'/'.$node->getName(), + $this->urlGenerator->linkToRouteAbsolute( + 'opds_catalog.page.index', + ['path' => $userFolder->getRelativePath($node->getPath()) ?? $path.'/'.$node->getName()] + ), properties: [ 'numberOfItems' => count($node->getDirectoryListing()), ], updated: new \DateTime('@'.$node->getMTime()) ); } elseif ($node instanceof File) { + $ebook = Ebook::read($node->getPath()); + if ($ebook instanceof Ebook) { + $authors = []; + foreach ($ebook->getAuthors() as $author) { + if (null !== $author->getName()) { + $authors[] = new OpdsEntryBookAuthor($author->getName()); + } + } + + $feeds[] = new OpdsEntryBook( + (string) $node->getId(), + $ebook->getTitle() ?? $ebook->getFilename(), + $this->urlGenerator->linkToRoute('opds_catalog.page.books', ['path' => $path.'/'.$node->getName()]), + summary: $ebook->getDescription(), + media: $this->urlGenerator->linkTo('', 'core/preview', ['fileId' => $node->getId(), 'x' => 1024, 'y' => 1024]), + updated: new \DateTime('@'.$node->getMTime()), + download: $this->urlGenerator->linkTo('', 'remote.php/dav/files/'.$this->user->getUID().'/'.$userFolder->getRelativePath($node->getPath())), + mediaThumbnail: $this->urlGenerator->linkTo('', 'core/preview', ['fileId' => $node->getId()]), + categories: $ebook->getTags(), + authors: $authors, + published: $ebook->getPublishDate(), + volume: $ebook->getVolume(), + serie: $ebook->getSeries(), + language: $ebook->getLanguage(), + identifier: $ebook->getIdentifiers()[0]->getValue(), + publisher: $ebook->getPublisher() + ); + } } } } @@ -65,12 +99,12 @@ class PageController extends Controller name: $this->user->getDisplayName()."'s Library", author: $this->user->getDisplayName(), iconUrl: $this->urlGenerator->getAbsoluteURL('/avatar/'.$this->user->getUID().'/512'), - startUrl: $this->urlGenerator->linkToRoute('opds_catalog.page.index'), - searchUrl: $this->urlGenerator->linkToRoute('opds_catalog.page.search') + startUrl: $this->urlGenerator->linkToRouteAbsolute('opds_catalog.page.index'), + searchUrl: $this->urlGenerator->linkToRouteAbsolute('opds_catalog.page.search') ); - $opds = Opds::make($config)->get(); - $response = $opds->getResponse(); + $opds = Opds::make($config)->feeds($feeds)->get(); + $response = $opds->getResponse(); if ($response instanceof OpdsResponse) { if (OpdsVersionEnum::v1Dot2 === $opds->getVersion()) { // @phpstan-ignore-next-line