fix: amélioration du préchargement des pages dans le lecteur

This commit is contained in:
Julien Froidefond
2025-02-12 21:50:01 +01:00
parent 7bd6892cfd
commit 26d4790b0a

View File

@@ -113,6 +113,7 @@ export function BookReader({ book, pages, onClose }: BookReaderProps) {
const blob = await response.blob(); const blob = await response.blob();
const url = URL.createObjectURL(blob); const url = URL.createObjectURL(blob);
console.log("PRELOAD", pageNumber);
pageCache.current[pageNumber] = { pageCache.current[pageNumber] = {
blob, blob,
url, url,
@@ -127,12 +128,21 @@ export function BookReader({ book, pages, onClose }: BookReaderProps) {
// Fonction pour précharger les prochaines pages // Fonction pour précharger les prochaines pages
const preloadNextPages = useCallback( const preloadNextPages = useCallback(
async (currentPageNumber: number, count: number = 2) => { async (currentPageNumber: number) => {
const pagesToPreload = Array.from( // Préchargement des pages suivantes
{ length: count }, const nextPages = Array.from({ length: 4 }, (_, i) => currentPageNumber + i + 1).filter(
(_, i) => currentPageNumber + i + 1 (page) => page <= pages.length
).filter((page) => page <= pages.length); );
// Préchargement des pages précédentes
const previousPages = Array.from({ length: 2 }, (_, i) => currentPageNumber - i - 1).filter(
(page) => page >= 1
);
// Combiner les pages à précharger
const pagesToPreload = [...nextPages, ...previousPages];
// Précharger toutes les pages en parallèle
await Promise.all(pagesToPreload.map(preloadPage)); await Promise.all(pagesToPreload.map(preloadPage));
}, },
[pages.length, preloadPage] [pages.length, preloadPage]
@@ -140,7 +150,8 @@ export function BookReader({ book, pages, onClose }: BookReaderProps) {
// Nettoyer le cache des pages trop anciennes // Nettoyer le cache des pages trop anciennes
const cleanCache = useCallback( const cleanCache = useCallback(
(currentPageNumber: number, maxDistance: number = 5) => { (currentPageNumber: number) => {
const maxDistance = 8; // On garde plus de pages en cache
const minPage = Math.max(1, currentPageNumber - maxDistance); const minPage = Math.max(1, currentPageNumber - maxDistance);
const maxPage = Math.min(pages.length, currentPageNumber + maxDistance); const maxPage = Math.min(pages.length, currentPageNumber + maxDistance);
@@ -158,6 +169,11 @@ export function BookReader({ book, pages, onClose }: BookReaderProps) {
// Fonction pour obtenir l'URL d'une page // Fonction pour obtenir l'URL d'une page
const getPageUrl = useCallback( const getPageUrl = useCallback(
(pageNumber: number) => { (pageNumber: number) => {
// Si la page est dans le cache, utiliser l'URL du cache
if (pageCache.current[pageNumber]) {
return pageCache.current[pageNumber].url;
}
// Sinon, retourner l'URL de l'API
return `/api/komga/images/books/${book.id}/pages/${pageNumber}`; return `/api/komga/images/books/${book.id}/pages/${pageNumber}`;
}, },
[book.id] [book.id]
@@ -171,11 +187,70 @@ export function BookReader({ book, pages, onClose }: BookReaderProps) {
[book.id] [book.id]
); );
// Effet pour précharger les pages au changement de page // Effet pour précharger la page courante et les pages adjacentes
useEffect(() => { useEffect(() => {
preloadNextPages(currentPage); const preloadCurrentPages = async () => {
// Précharger la page courante si elle n'est pas dans le cache
if (!pageCache.current[currentPage]) {
await preloadPage(currentPage);
}
// En mode double page, précharger aussi la page suivante si nécessaire
if (
isDoublePage &&
shouldShowDoublePage(currentPage) &&
!pageCache.current[currentPage + 1]
) {
await preloadPage(currentPage + 1);
}
// Lancer le préchargement des pages suivantes et précédentes
const preloadPagesForCurrentMode = async () => {
if (isDoublePage) {
// En mode double page, on précharge plus de pages
const pagesToPreload = [];
// Pages suivantes
for (let i = 1; i <= 3; i++) {
const nextPage = currentPage + i * 2;
if (nextPage <= pages.length) {
pagesToPreload.push(nextPage);
if (nextPage + 1 <= pages.length) {
pagesToPreload.push(nextPage + 1);
}
}
}
// Pages précédentes
for (let i = 1; i <= 2; i++) {
const prevPage = currentPage - i * 2;
if (prevPage >= 1) {
pagesToPreload.push(prevPage);
if (prevPage + 1 <= pages.length) {
pagesToPreload.push(prevPage + 1);
}
}
}
await Promise.all(pagesToPreload.map(preloadPage));
} else {
// En mode simple page, on utilise la fonction standard
await preloadNextPages(currentPage);
}
};
// Lancer le préchargement en arrière-plan
preloadPagesForCurrentMode();
};
preloadCurrentPages();
cleanCache(currentPage); cleanCache(currentPage);
}, [currentPage, preloadNextPages, cleanCache]); }, [
currentPage,
isDoublePage,
shouldShowDoublePage,
preloadPage,
preloadNextPages,
cleanCache,
pages.length,
]);
useEffect(() => { useEffect(() => {
const handleKeyDown = (event: KeyboardEvent) => { const handleKeyDown = (event: KeyboardEvent) => {