fix(opds): use custom header for content length when streaming content (#2584)
This commit is contained in:
@@ -740,5 +740,6 @@
|
||||
"Next": "التالي",
|
||||
"Last": "الأخير",
|
||||
"Cannot Load Page": "تعذر تحميل الصفحة",
|
||||
"An error occurred": "حدث خطأ ما"
|
||||
"An error occurred": "حدث خطأ ما",
|
||||
"Online Library": "المكتبة عبر الإنترنت"
|
||||
}
|
||||
|
||||
@@ -720,5 +720,6 @@
|
||||
"Next": "পরবর্তী",
|
||||
"Last": "শেষ",
|
||||
"Cannot Load Page": "পৃষ্ঠা লোড করা যায়নি",
|
||||
"An error occurred": "একটি ত্রুটি ঘটেছে"
|
||||
"An error occurred": "একটি ত্রুটি ঘটেছে",
|
||||
"Online Library": "অনলাইন লাইব্রেরি"
|
||||
}
|
||||
|
||||
@@ -715,5 +715,6 @@
|
||||
"Next": "རྗེས་མ།",
|
||||
"Last": "མཐའ་མ།",
|
||||
"Cannot Load Page": "ཤོག་ངོས་འགུལ་སྐྱོང་བྱེད་ཐུབ་མེད།",
|
||||
"An error occurred": "ནོར་འཁྲུལ་ཞིག་བྱུང་སོང་།"
|
||||
"An error occurred": "ནོར་འཁྲུལ་ཞིག་བྱུང་སོང་།",
|
||||
"Online Library": "དྲ་རྒྱུན་དེབ་མཛོད།"
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
|
||||
@@ -720,5 +720,6 @@
|
||||
"Next": "Επόμενο",
|
||||
"Last": "Τελευταίο",
|
||||
"Cannot Load Page": "Δεν είναι δυνατή η φόρτωση της σελίδας",
|
||||
"An error occurred": "Προέκυψε σφάλμα"
|
||||
"An error occurred": "Προέκυψε σφάλμα",
|
||||
"Online Library": "Online Βιβλιοθήκη"
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
|
||||
@@ -720,5 +720,6 @@
|
||||
"Next": "بعدی",
|
||||
"Last": "آخرین",
|
||||
"Cannot Load Page": "بارگذاری صفحه امکانپذیر نیست",
|
||||
"An error occurred": "خطایی رخ داد"
|
||||
"An error occurred": "خطایی رخ داد",
|
||||
"Online Library": "کتابخانه آنلاین"
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
|
||||
@@ -720,5 +720,6 @@
|
||||
"Next": "अगला",
|
||||
"Last": "अंतिम",
|
||||
"Cannot Load Page": "पृष्ठ लोड नहीं किया जा सका",
|
||||
"An error occurred": "एक त्रुटि हुई"
|
||||
"An error occurred": "एक त्रुटि हुई",
|
||||
"Online Library": "ऑनलाइन लाइब्रेरी"
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
|
||||
@@ -715,5 +715,6 @@
|
||||
"Next": "次へ",
|
||||
"Last": "最後",
|
||||
"Cannot Load Page": "ページを読み込めません",
|
||||
"An error occurred": "エラーが発生しました"
|
||||
"An error occurred": "エラーが発生しました",
|
||||
"Online Library": "オンラインライブラリ"
|
||||
}
|
||||
|
||||
@@ -715,5 +715,6 @@
|
||||
"Next": "다음",
|
||||
"Last": "마지막",
|
||||
"Cannot Load Page": "페이지를 불러올 수 없습니다",
|
||||
"An error occurred": "오류가 발생했습니다"
|
||||
"An error occurred": "오류가 발생했습니다",
|
||||
"Online Library": "온라인 라이브러리"
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
|
||||
@@ -730,5 +730,6 @@
|
||||
"Next": "Следующая",
|
||||
"Last": "Последняя",
|
||||
"Cannot Load Page": "Не удалось загрузить страницу",
|
||||
"An error occurred": "Произошла ошибка"
|
||||
"An error occurred": "Произошла ошибка",
|
||||
"Online Library": "Онлайн библиотека"
|
||||
}
|
||||
|
||||
@@ -720,5 +720,6 @@
|
||||
"Next": "ඊළඟ",
|
||||
"Last": "අවසාන",
|
||||
"Cannot Load Page": "පිටුවට ප්රවේශ විය නොහැක",
|
||||
"An error occurred": "දෝෂයක් සිදු විය"
|
||||
"An error occurred": "දෝෂයක් සිදු විය",
|
||||
"Online Library": "ඔන්ලයින් පුස්තකාලය"
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
|
||||
@@ -720,5 +720,6 @@
|
||||
"Next": "அடுத்தது",
|
||||
"Last": "இறுதி",
|
||||
"Cannot Load Page": "பக்கம் ஏற்ற முடியவில்லை",
|
||||
"An error occurred": "ஒரு பிழை ஏற்பட்டது"
|
||||
"An error occurred": "ஒரு பிழை ஏற்பட்டது",
|
||||
"Online Library": "ஆன்லைன் நூலகம்"
|
||||
}
|
||||
|
||||
@@ -715,5 +715,6 @@
|
||||
"Next": "ถัดไป",
|
||||
"Last": "สุดท้าย",
|
||||
"Cannot Load Page": "ไม่สามารถโหลดหน้าหน้าได้",
|
||||
"An error occurred": "เกิดข้อผิดพลาด"
|
||||
"An error occurred": "เกิดข้อผิดพลาด",
|
||||
"Online Library": "ห้องสมุดออนไลน์"
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
|
||||
@@ -730,5 +730,6 @@
|
||||
"Next": "Наступна",
|
||||
"Last": "Остання",
|
||||
"Cannot Load Page": "Не вдалося завантажити сторінку",
|
||||
"An error occurred": "Сталася помилка"
|
||||
"An error occurred": "Сталася помилка",
|
||||
"Online Library": "Онлайн бібліотека"
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
|
||||
@@ -715,5 +715,6 @@
|
||||
"Next": "下一页",
|
||||
"Last": "末页",
|
||||
"Cannot Load Page": "无法加载页面",
|
||||
"An error occurred": "发生错误"
|
||||
"An error occurred": "发生错误",
|
||||
"Online Library": "在线书库"
|
||||
}
|
||||
|
||||
@@ -715,5 +715,6 @@
|
||||
"Next": "下一頁",
|
||||
"Last": "最後一頁",
|
||||
"Cannot Load Page": "無法載入頁面",
|
||||
"An error occurred": "發生錯誤"
|
||||
"An error occurred": "發生錯誤",
|
||||
"Online Library": "線上書庫"
|
||||
}
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -45,7 +45,7 @@ const ImportMenu: React.FC<ImportMenuProps> = ({
|
||||
onClick={handleImportBooks}
|
||||
/>
|
||||
<MenuItem
|
||||
label={_('OPDS Catalogs')}
|
||||
label={_('Online Library')}
|
||||
Icon={<MdRssFeed className='h-5 w-5' />}
|
||||
onClick={handleOpenCatalogManager}
|
||||
/>
|
||||
|
||||
@@ -12,7 +12,7 @@ export function CatalogDialog({ onClose }: CatalogDialogProps) {
|
||||
return (
|
||||
<Dialog
|
||||
isOpen={true}
|
||||
title={_('OPDS Catalog')}
|
||||
title={_('Online Library')}
|
||||
onClose={onClose}
|
||||
bgClassName={'sm:!bg-black/75'}
|
||||
boxClassName='sm:min-w-[520px] sm:w-3/4 sm:h-[85%] sm:!max-w-screen-sm'
|
||||
|
||||
@@ -134,8 +134,8 @@ export function CatalogManager() {
|
||||
return (
|
||||
<div className='container max-w-2xl'>
|
||||
<div className='mb-8'>
|
||||
<h1 className='mb-2 text-lg font-bold'>{_('OPDS Catalogs')}</h1>
|
||||
<p className='text-base-content/70 text-sm'>
|
||||
<h1 className='mb-2 text-base font-bold'>{_('OPDS Catalogs')}</h1>
|
||||
<p className='text-base-content/70 text-xs'>
|
||||
{_('Browse and download books from online catalogs')}
|
||||
</p>
|
||||
</div>
|
||||
|
||||
@@ -202,8 +202,15 @@ export function PublicationView({
|
||||
<div className='flex h-12 w-12 items-center justify-center'>
|
||||
{downloading && progress && progress > 0 && (
|
||||
<div
|
||||
className='radial-progress flex items-center justify-center text-xs'
|
||||
style={{ '--value': progress, '--size': '2.5rem' } as React.CSSProperties}
|
||||
className='radial-progress flex items-center justify-center'
|
||||
style={
|
||||
{
|
||||
'--value': progress,
|
||||
'--size': '2.5rem',
|
||||
fontSize: '0.6rem',
|
||||
lineHeight: '0.8rem',
|
||||
} as React.CSSProperties
|
||||
}
|
||||
aria-valuenow={progress || 0}
|
||||
role='progressbar'
|
||||
>
|
||||
|
||||
@@ -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) => {
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user