feat: 🚀 finished the main opds part

This commit is contained in:
Michel Roux 2025-02-22 17:59:56 +00:00
parent a7da64b4de
commit 77511ece72

@ -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