fix(opds): use custom header for content length when streaming content (#2584)

This commit is contained in:
Huang Xin
2025-12-02 00:28:36 +08:00
committed by GitHub
parent 742f06ce05
commit d2b3c165c7
34 changed files with 88 additions and 50 deletions
@@ -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) => {
+2 -1
View File
@@ -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);