From d2b3c165c7a698aa1f0ac0a02370364052bf6819 Mon Sep 17 00:00:00 2001 From: Huang Xin Date: Tue, 2 Dec 2025 00:28:36 +0800 Subject: [PATCH] fix(opds): use custom header for content length when streaming content (#2584) --- .../public/locales/ar/translation.json | 3 +- .../public/locales/bn/translation.json | 3 +- .../public/locales/bo/translation.json | 3 +- .../public/locales/de/translation.json | 3 +- .../public/locales/el/translation.json | 3 +- .../public/locales/es/translation.json | 3 +- .../public/locales/fa/translation.json | 3 +- .../public/locales/fr/translation.json | 3 +- .../public/locales/hi/translation.json | 3 +- .../public/locales/id/translation.json | 3 +- .../public/locales/it/translation.json | 3 +- .../public/locales/ja/translation.json | 3 +- .../public/locales/ko/translation.json | 3 +- .../public/locales/ms/translation.json | 3 +- .../public/locales/nl/translation.json | 3 +- .../public/locales/pl/translation.json | 3 +- .../public/locales/pt/translation.json | 3 +- .../public/locales/ru/translation.json | 3 +- .../public/locales/si/translation.json | 3 +- .../public/locales/sv/translation.json | 3 +- .../public/locales/ta/translation.json | 3 +- .../public/locales/th/translation.json | 3 +- .../public/locales/tr/translation.json | 3 +- .../public/locales/uk/translation.json | 3 +- .../public/locales/vi/translation.json | 3 +- .../public/locales/zh-CN/translation.json | 3 +- .../public/locales/zh-TW/translation.json | 3 +- .../src/app/api/opds/proxy/route.ts | 2 +- .../src/app/library/components/ImportMenu.tsx | 2 +- .../src/app/library/components/OPDSDialog.tsx | 2 +- .../src/app/opds/CatelogManager.tsx | 4 +-- .../src/app/opds/PublicationView.tsx | 11 +++++-- .../app/reader/components/sidebar/TOCView.tsx | 33 ++++++++++--------- apps/readest-app/src/utils/transfer.ts | 3 +- 34 files changed, 88 insertions(+), 50 deletions(-) diff --git a/apps/readest-app/public/locales/ar/translation.json b/apps/readest-app/public/locales/ar/translation.json index 3544e4d0..84cb4af7 100644 --- a/apps/readest-app/public/locales/ar/translation.json +++ b/apps/readest-app/public/locales/ar/translation.json @@ -740,5 +740,6 @@ "Next": "التالي", "Last": "الأخير", "Cannot Load Page": "تعذر تحميل الصفحة", - "An error occurred": "حدث خطأ ما" + "An error occurred": "حدث خطأ ما", + "Online Library": "المكتبة عبر الإنترنت" } diff --git a/apps/readest-app/public/locales/bn/translation.json b/apps/readest-app/public/locales/bn/translation.json index b79b27fc..2beb25b5 100644 --- a/apps/readest-app/public/locales/bn/translation.json +++ b/apps/readest-app/public/locales/bn/translation.json @@ -720,5 +720,6 @@ "Next": "পরবর্তী", "Last": "শেষ", "Cannot Load Page": "পৃষ্ঠা লোড করা যায়নি", - "An error occurred": "একটি ত্রুটি ঘটেছে" + "An error occurred": "একটি ত্রুটি ঘটেছে", + "Online Library": "অনলাইন লাইব্রেরি" } diff --git a/apps/readest-app/public/locales/bo/translation.json b/apps/readest-app/public/locales/bo/translation.json index 67ba5fea..1cece03f 100644 --- a/apps/readest-app/public/locales/bo/translation.json +++ b/apps/readest-app/public/locales/bo/translation.json @@ -715,5 +715,6 @@ "Next": "རྗེས་མ།", "Last": "མཐའ་མ།", "Cannot Load Page": "ཤོག་ངོས་འགུལ་སྐྱོང་བྱེད་ཐུབ་མེད།", - "An error occurred": "ནོར་འཁྲུལ་ཞིག་བྱུང་སོང་།" + "An error occurred": "ནོར་འཁྲུལ་ཞིག་བྱུང་སོང་།", + "Online Library": "དྲ་རྒྱུན་དེབ་མཛོད།" } diff --git a/apps/readest-app/public/locales/de/translation.json b/apps/readest-app/public/locales/de/translation.json index af177f98..427e1069 100644 --- a/apps/readest-app/public/locales/de/translation.json +++ b/apps/readest-app/public/locales/de/translation.json @@ -720,5 +720,6 @@ "Next": "Nächste", "Last": "Letzte", "Cannot Load Page": "Seite kann nicht geladen werden", - "An error occurred": "Ein Fehler ist aufgetreten" + "An error occurred": "Ein Fehler ist aufgetreten", + "Online Library": "Online-Bibliothek" } diff --git a/apps/readest-app/public/locales/el/translation.json b/apps/readest-app/public/locales/el/translation.json index c8209699..03b84d69 100644 --- a/apps/readest-app/public/locales/el/translation.json +++ b/apps/readest-app/public/locales/el/translation.json @@ -720,5 +720,6 @@ "Next": "Επόμενο", "Last": "Τελευταίο", "Cannot Load Page": "Δεν είναι δυνατή η φόρτωση της σελίδας", - "An error occurred": "Προέκυψε σφάλμα" + "An error occurred": "Προέκυψε σφάλμα", + "Online Library": "Online Βιβλιοθήκη" } diff --git a/apps/readest-app/public/locales/es/translation.json b/apps/readest-app/public/locales/es/translation.json index 98437a3c..5e5a7c32 100644 --- a/apps/readest-app/public/locales/es/translation.json +++ b/apps/readest-app/public/locales/es/translation.json @@ -725,5 +725,6 @@ "Next": "Siguiente", "Last": "Último", "Cannot Load Page": "No se puede cargar la página", - "An error occurred": "Ocurrió un error" + "An error occurred": "Ocurrió un error", + "Online Library": "Biblioteca en línea" } diff --git a/apps/readest-app/public/locales/fa/translation.json b/apps/readest-app/public/locales/fa/translation.json index 5ed24f82..7321a667 100644 --- a/apps/readest-app/public/locales/fa/translation.json +++ b/apps/readest-app/public/locales/fa/translation.json @@ -720,5 +720,6 @@ "Next": "بعدی", "Last": "آخرین", "Cannot Load Page": "بارگذاری صفحه امکان‌پذیر نیست", - "An error occurred": "خطایی رخ داد" + "An error occurred": "خطایی رخ داد", + "Online Library": "کتابخانه آنلاین" } diff --git a/apps/readest-app/public/locales/fr/translation.json b/apps/readest-app/public/locales/fr/translation.json index 6af2de62..cba8f351 100644 --- a/apps/readest-app/public/locales/fr/translation.json +++ b/apps/readest-app/public/locales/fr/translation.json @@ -725,5 +725,6 @@ "Next": "Suivant", "Last": "Dernier", "Cannot Load Page": "Impossible de charger la page", - "An error occurred": "Une erreur est survenue" + "An error occurred": "Une erreur est survenue", + "Online Library": "Bibliothèque en ligne" } diff --git a/apps/readest-app/public/locales/hi/translation.json b/apps/readest-app/public/locales/hi/translation.json index 9d31ea66..366441a0 100644 --- a/apps/readest-app/public/locales/hi/translation.json +++ b/apps/readest-app/public/locales/hi/translation.json @@ -720,5 +720,6 @@ "Next": "अगला", "Last": "अंतिम", "Cannot Load Page": "पृष्ठ लोड नहीं किया जा सका", - "An error occurred": "एक त्रुटि हुई" + "An error occurred": "एक त्रुटि हुई", + "Online Library": "ऑनलाइन लाइब्रेरी" } diff --git a/apps/readest-app/public/locales/id/translation.json b/apps/readest-app/public/locales/id/translation.json index bf6eec8b..a419367d 100644 --- a/apps/readest-app/public/locales/id/translation.json +++ b/apps/readest-app/public/locales/id/translation.json @@ -715,5 +715,6 @@ "Next": "Berikutnya", "Last": "Terakhir", "Cannot Load Page": "Tidak dapat memuat halaman", - "An error occurred": "Terjadi kesalahan" + "An error occurred": "Terjadi kesalahan", + "Online Library": "Perpustakaan Online" } diff --git a/apps/readest-app/public/locales/it/translation.json b/apps/readest-app/public/locales/it/translation.json index fe314f0a..625f7419 100644 --- a/apps/readest-app/public/locales/it/translation.json +++ b/apps/readest-app/public/locales/it/translation.json @@ -725,5 +725,6 @@ "Next": "Successivo", "Last": "Ultimo", "Cannot Load Page": "Impossibile caricare la pagina", - "An error occurred": "Si è verificato un errore" + "An error occurred": "Si è verificato un errore", + "Online Library": "Libreria online" } diff --git a/apps/readest-app/public/locales/ja/translation.json b/apps/readest-app/public/locales/ja/translation.json index 0f474263..dfd3c9db 100644 --- a/apps/readest-app/public/locales/ja/translation.json +++ b/apps/readest-app/public/locales/ja/translation.json @@ -715,5 +715,6 @@ "Next": "次へ", "Last": "最後", "Cannot Load Page": "ページを読み込めません", - "An error occurred": "エラーが発生しました" + "An error occurred": "エラーが発生しました", + "Online Library": "オンラインライブラリ" } diff --git a/apps/readest-app/public/locales/ko/translation.json b/apps/readest-app/public/locales/ko/translation.json index 0e0212f0..0b1d356b 100644 --- a/apps/readest-app/public/locales/ko/translation.json +++ b/apps/readest-app/public/locales/ko/translation.json @@ -715,5 +715,6 @@ "Next": "다음", "Last": "마지막", "Cannot Load Page": "페이지를 불러올 수 없습니다", - "An error occurred": "오류가 발생했습니다" + "An error occurred": "오류가 발생했습니다", + "Online Library": "온라인 라이브러리" } diff --git a/apps/readest-app/public/locales/ms/translation.json b/apps/readest-app/public/locales/ms/translation.json index 4cc4f0c5..c37f191a 100644 --- a/apps/readest-app/public/locales/ms/translation.json +++ b/apps/readest-app/public/locales/ms/translation.json @@ -715,5 +715,6 @@ "Next": "Seterusnya", "Last": "Terakhir", "Cannot Load Page": "Tidak dapat memuatkan halaman", - "An error occurred": "Ralat telah berlaku" + "An error occurred": "Ralat telah berlaku", + "Online Library": "Perpustakaan Dalam Talian" } diff --git a/apps/readest-app/public/locales/nl/translation.json b/apps/readest-app/public/locales/nl/translation.json index 01bae6bb..271c087f 100644 --- a/apps/readest-app/public/locales/nl/translation.json +++ b/apps/readest-app/public/locales/nl/translation.json @@ -720,5 +720,6 @@ "Next": "Volgende", "Last": "Laatste", "Cannot Load Page": "Pagina kan niet worden geladen", - "An error occurred": "Er is een fout opgetreden" + "An error occurred": "Er is een fout opgetreden", + "Online Library": "Online Bibliotheek" } diff --git a/apps/readest-app/public/locales/pl/translation.json b/apps/readest-app/public/locales/pl/translation.json index 03e5479d..278792c3 100644 --- a/apps/readest-app/public/locales/pl/translation.json +++ b/apps/readest-app/public/locales/pl/translation.json @@ -730,5 +730,6 @@ "Next": "Następna", "Last": "Ostatnia", "Cannot Load Page": "Nie można załadować strony", - "An error occurred": "Wystąpił błąd" + "An error occurred": "Wystąpił błąd", + "Online Library": "Biblioteka online" } diff --git a/apps/readest-app/public/locales/pt/translation.json b/apps/readest-app/public/locales/pt/translation.json index 72d78d72..c7ba44cc 100644 --- a/apps/readest-app/public/locales/pt/translation.json +++ b/apps/readest-app/public/locales/pt/translation.json @@ -725,5 +725,6 @@ "Next": "Następna", "Last": "Ostatnia", "Cannot Load Page": "Nie można załadować strony", - "An error occurred": "Wystąpił błąd" + "An error occurred": "Wystąpił błąd", + "Online Library": "Biblioteka online" } diff --git a/apps/readest-app/public/locales/ru/translation.json b/apps/readest-app/public/locales/ru/translation.json index c68abd66..d0195c9b 100644 --- a/apps/readest-app/public/locales/ru/translation.json +++ b/apps/readest-app/public/locales/ru/translation.json @@ -730,5 +730,6 @@ "Next": "Следующая", "Last": "Последняя", "Cannot Load Page": "Не удалось загрузить страницу", - "An error occurred": "Произошла ошибка" + "An error occurred": "Произошла ошибка", + "Online Library": "Онлайн библиотека" } diff --git a/apps/readest-app/public/locales/si/translation.json b/apps/readest-app/public/locales/si/translation.json index 58c9a9d0..c953cd75 100644 --- a/apps/readest-app/public/locales/si/translation.json +++ b/apps/readest-app/public/locales/si/translation.json @@ -720,5 +720,6 @@ "Next": "ඊළඟ", "Last": "අවසාන", "Cannot Load Page": "පිටුවට ප්‍රවේශ විය නොහැක", - "An error occurred": "දෝෂයක් සිදු විය" + "An error occurred": "දෝෂයක් සිදු විය", + "Online Library": "ඔන්ලයින් පුස්තකාලය" } diff --git a/apps/readest-app/public/locales/sv/translation.json b/apps/readest-app/public/locales/sv/translation.json index a546fdfa..ba27ce8a 100644 --- a/apps/readest-app/public/locales/sv/translation.json +++ b/apps/readest-app/public/locales/sv/translation.json @@ -720,5 +720,6 @@ "Next": "Nästa", "Last": "Sista", "Cannot Load Page": "Kan inte ladda sidan", - "An error occurred": "Ett fel uppstod" + "An error occurred": "Ett fel uppstod", + "Online Library": "Onlinebibliotek" } diff --git a/apps/readest-app/public/locales/ta/translation.json b/apps/readest-app/public/locales/ta/translation.json index 2f56da5a..bdcf44c5 100644 --- a/apps/readest-app/public/locales/ta/translation.json +++ b/apps/readest-app/public/locales/ta/translation.json @@ -720,5 +720,6 @@ "Next": "அடுத்தது", "Last": "இறுதி", "Cannot Load Page": "பக்கம் ஏற்ற முடியவில்லை", - "An error occurred": "ஒரு பிழை ஏற்பட்டது" + "An error occurred": "ஒரு பிழை ஏற்பட்டது", + "Online Library": "ஆன்லைன் நூலகம்" } diff --git a/apps/readest-app/public/locales/th/translation.json b/apps/readest-app/public/locales/th/translation.json index ad5f2744..2f89972a 100644 --- a/apps/readest-app/public/locales/th/translation.json +++ b/apps/readest-app/public/locales/th/translation.json @@ -715,5 +715,6 @@ "Next": "ถัดไป", "Last": "สุดท้าย", "Cannot Load Page": "ไม่สามารถโหลดหน้าหน้าได้", - "An error occurred": "เกิดข้อผิดพลาด" + "An error occurred": "เกิดข้อผิดพลาด", + "Online Library": "ห้องสมุดออนไลน์" } diff --git a/apps/readest-app/public/locales/tr/translation.json b/apps/readest-app/public/locales/tr/translation.json index 87cd159b..69899018 100644 --- a/apps/readest-app/public/locales/tr/translation.json +++ b/apps/readest-app/public/locales/tr/translation.json @@ -720,5 +720,6 @@ "Next": "Sonraki", "Last": "Son", "Cannot Load Page": "Sayfa yüklenemiyor", - "An error occurred": "Bir hata oluştu" + "An error occurred": "Bir hata oluştu", + "Online Library": "Çevrimiçi Kütüphane" } diff --git a/apps/readest-app/public/locales/uk/translation.json b/apps/readest-app/public/locales/uk/translation.json index 5a38803c..ec4ce745 100644 --- a/apps/readest-app/public/locales/uk/translation.json +++ b/apps/readest-app/public/locales/uk/translation.json @@ -730,5 +730,6 @@ "Next": "Наступна", "Last": "Остання", "Cannot Load Page": "Не вдалося завантажити сторінку", - "An error occurred": "Сталася помилка" + "An error occurred": "Сталася помилка", + "Online Library": "Онлайн бібліотека" } diff --git a/apps/readest-app/public/locales/vi/translation.json b/apps/readest-app/public/locales/vi/translation.json index 7ecd44d7..3b254454 100644 --- a/apps/readest-app/public/locales/vi/translation.json +++ b/apps/readest-app/public/locales/vi/translation.json @@ -715,5 +715,6 @@ "Next": "Tiếp theo", "Last": "Cuối cùng", "Cannot Load Page": "Không thể tải trang", - "An error occurred": "Đã xảy ra lỗi" + "An error occurred": "Đã xảy ra lỗi", + "Online Library": "Thư viện trực tuyến" } diff --git a/apps/readest-app/public/locales/zh-CN/translation.json b/apps/readest-app/public/locales/zh-CN/translation.json index 5b95dcc0..85061089 100644 --- a/apps/readest-app/public/locales/zh-CN/translation.json +++ b/apps/readest-app/public/locales/zh-CN/translation.json @@ -715,5 +715,6 @@ "Next": "下一页", "Last": "末页", "Cannot Load Page": "无法加载页面", - "An error occurred": "发生错误" + "An error occurred": "发生错误", + "Online Library": "在线书库" } diff --git a/apps/readest-app/public/locales/zh-TW/translation.json b/apps/readest-app/public/locales/zh-TW/translation.json index 307ac553..9e2dc1fd 100644 --- a/apps/readest-app/public/locales/zh-TW/translation.json +++ b/apps/readest-app/public/locales/zh-TW/translation.json @@ -715,5 +715,6 @@ "Next": "下一頁", "Last": "最後一頁", "Cannot Load Page": "無法載入頁面", - "An error occurred": "發生錯誤" + "An error occurred": "發生錯誤", + "Online Library": "線上書庫" } diff --git a/apps/readest-app/src/app/api/opds/proxy/route.ts b/apps/readest-app/src/app/api/opds/proxy/route.ts index 26cdcea5..cff1e3ba 100644 --- a/apps/readest-app/src/app/api/opds/proxy/route.ts +++ b/apps/readest-app/src/app/api/opds/proxy/route.ts @@ -111,7 +111,7 @@ async function handleRequest(request: NextRequest, method: 'GET' | 'HEAD') { status: 200, headers: { 'Content-Type': contentType, - 'Content-Length': contentLength || '', + 'X-Content-Length': contentLength || '', 'Cache-Control': 'public, max-age=300', 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Methods': 'GET, HEAD, OPTIONS', diff --git a/apps/readest-app/src/app/library/components/ImportMenu.tsx b/apps/readest-app/src/app/library/components/ImportMenu.tsx index 636ebfcd..f2646243 100644 --- a/apps/readest-app/src/app/library/components/ImportMenu.tsx +++ b/apps/readest-app/src/app/library/components/ImportMenu.tsx @@ -45,7 +45,7 @@ const ImportMenu: React.FC = ({ onClick={handleImportBooks} /> } onClick={handleOpenCatalogManager} /> diff --git a/apps/readest-app/src/app/library/components/OPDSDialog.tsx b/apps/readest-app/src/app/library/components/OPDSDialog.tsx index 48afabac..014b55ff 100644 --- a/apps/readest-app/src/app/library/components/OPDSDialog.tsx +++ b/apps/readest-app/src/app/library/components/OPDSDialog.tsx @@ -12,7 +12,7 @@ export function CatalogDialog({ onClose }: CatalogDialogProps) { return (
-

{_('OPDS Catalogs')}

-

+

{_('OPDS Catalogs')}

+

{_('Browse and download books from online catalogs')}

diff --git a/apps/readest-app/src/app/opds/PublicationView.tsx b/apps/readest-app/src/app/opds/PublicationView.tsx index f531bb01..e93bf5a8 100644 --- a/apps/readest-app/src/app/opds/PublicationView.tsx +++ b/apps/readest-app/src/app/opds/PublicationView.tsx @@ -202,8 +202,15 @@ export function PublicationView({
{downloading && progress && progress > 0 && (
diff --git a/apps/readest-app/src/app/reader/components/sidebar/TOCView.tsx b/apps/readest-app/src/app/reader/components/sidebar/TOCView.tsx index 3c44bcad..ed517d62 100644 --- a/apps/readest-app/src/app/reader/components/sidebar/TOCView.tsx +++ b/apps/readest-app/src/app/reader/components/sidebar/TOCView.tsx @@ -111,7 +111,7 @@ const TOCView: React.FC<{ }; } return; - }, [initialize]); + }, [initialize, handleInteraction]); useTextTranslation( bookKey, @@ -162,7 +162,7 @@ const TOCView: React.FC<{ scrollContainer.removeEventListener('scroll', handleInteraction); } }; - }, [expandedItems]); + }, [expandedItems, handleInteraction]); const activeHref = useMemo(() => progress?.sectionHref || null, [progress?.sectionHref]); const flatItems = useFlattenedTOC(toc, expandedItems); @@ -170,19 +170,22 @@ const TOCView: React.FC<{ return flatItems.findIndex((item) => item.item.href === activeHref); }, [flatItems, activeHref]); - const handleToggleExpand = useCallback((item: TOCItem) => { - const itemId = getItemIdentifier(item); - handleInteraction(); - setExpandedItems((prev) => { - const newSet = new Set(prev); - if (newSet.has(itemId)) { - newSet.delete(itemId); - } else { - newSet.add(itemId); - } - return newSet; - }); - }, []); + const handleToggleExpand = useCallback( + (item: TOCItem) => { + const itemId = getItemIdentifier(item); + handleInteraction(); + setExpandedItems((prev) => { + const newSet = new Set(prev); + if (newSet.has(itemId)) { + newSet.delete(itemId); + } else { + newSet.add(itemId); + } + return newSet; + }); + }, + [handleInteraction], + ); const handleItemClick = useCallback( (item: TOCItem) => { diff --git a/apps/readest-app/src/utils/transfer.ts b/apps/readest-app/src/utils/transfer.ts index 7e4ee434..49d4b9f8 100644 --- a/apps/readest-app/src/utils/transfer.ts +++ b/apps/readest-app/src/utils/transfer.ts @@ -61,7 +61,8 @@ export const webDownload = async ( throw new Error(UploadFileError.DownloadFailed); } - const contentLength = response.headers.get('Content-Length'); + const contentLength = + response.headers.get('Content-Length') || response.headers.get('X-Content-Length'); if (!contentLength) throw new Error('Cannot track progress: Content-Length missing'); const totalSize = parseInt(contentLength, 10);