From 33515f1f09d7b6815e02385179723b8dd12439d6 Mon Sep 17 00:00:00 2001 From: Huang Xin Date: Wed, 16 Jul 2025 01:33:13 +0800 Subject: [PATCH] fix: save custom cover images in apps (#1588) --- .../public/locales/ar/translation.json | 3 +- .../public/locales/de/translation.json | 3 +- .../public/locales/el/translation.json | 3 +- .../public/locales/es/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/nl/translation.json | 3 +- .../public/locales/pl/translation.json | 3 +- .../public/locales/pt/translation.json | 3 +- .../public/locales/ru/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 +- apps/readest-app/src/app/library/page.tsx | 24 +++++-- apps/readest-app/src/components/BookCover.tsx | 6 +- .../components/metadata/BookDetailEdit.tsx | 64 +++++++++++++------ .../components/metadata/BookDetailModal.tsx | 2 +- .../components/metadata/BookDetailView.tsx | 10 +-- .../components/metadata/useMetadataEdit.ts | 1 - apps/readest-app/src/libs/document.ts | 2 + apps/readest-app/src/services/appService.ts | 24 +++++-- apps/readest-app/src/services/constants.ts | 3 + apps/readest-app/src/types/system.ts | 2 +- 30 files changed, 129 insertions(+), 69 deletions(-) diff --git a/apps/readest-app/public/locales/ar/translation.json b/apps/readest-app/public/locales/ar/translation.json index 151fc6e3..22839be8 100644 --- a/apps/readest-app/public/locales/ar/translation.json +++ b/apps/readest-app/public/locales/ar/translation.json @@ -464,5 +464,6 @@ "Keep manual input": "الاحتفاظ بالإدخال اليدوي", "Google Books": "كتب جوجل", "Open Library": "المكتبة المفتوحة", - "Fiction, Science, History": "خيال، علوم، تاريخ" + "Fiction, Science, History": "خيال، علوم، تاريخ", + "Select Cover Image": "اختر صورة الغلاف" } diff --git a/apps/readest-app/public/locales/de/translation.json b/apps/readest-app/public/locales/de/translation.json index 483e6e4b..7482a73c 100644 --- a/apps/readest-app/public/locales/de/translation.json +++ b/apps/readest-app/public/locales/de/translation.json @@ -448,5 +448,6 @@ "Keep manual input": "Manuelle Eingabe beibehalten", "Google Books": "Google Books", "Open Library": "Open Library", - "Fiction, Science, History": "Belletristik, Wissenschaft, Geschichte" + "Fiction, Science, History": "Belletristik, Wissenschaft, Geschichte", + "Select Cover Image": "Coverbild auswählen" } diff --git a/apps/readest-app/public/locales/el/translation.json b/apps/readest-app/public/locales/el/translation.json index 6992a5a0..44bbc252 100644 --- a/apps/readest-app/public/locales/el/translation.json +++ b/apps/readest-app/public/locales/el/translation.json @@ -448,5 +448,6 @@ "Keep manual input": "Διατήρηση χειροκίνητης εισαγωγής", "Google Books": "Google Books", "Open Library": "Open Library", - "Fiction, Science, History": "Μυθοπλασία, Επιστήμη, Ιστορία" + "Fiction, Science, History": "Μυθοπλασία, Επιστήμη, Ιστορία", + "Select Cover Image": "Επιλέξτε εικόνα εξωφύλλου" } diff --git a/apps/readest-app/public/locales/es/translation.json b/apps/readest-app/public/locales/es/translation.json index 8d08bbce..50354024 100644 --- a/apps/readest-app/public/locales/es/translation.json +++ b/apps/readest-app/public/locales/es/translation.json @@ -452,5 +452,6 @@ "Keep manual input": "Mantener entrada manual", "Google Books": "Google Books", "Open Library": "Open Library", - "Fiction, Science, History": "Ficción, Ciencia, Historia" + "Fiction, Science, History": "Ficción, Ciencia, Historia", + "Select Cover Image": "Seleccionar imagen de portada" } diff --git a/apps/readest-app/public/locales/fr/translation.json b/apps/readest-app/public/locales/fr/translation.json index 10095755..a7026ab6 100644 --- a/apps/readest-app/public/locales/fr/translation.json +++ b/apps/readest-app/public/locales/fr/translation.json @@ -452,5 +452,6 @@ "Keep manual input": "Conserver la saisie manuelle", "Google Books": "Google Books", "Open Library": "Open Library", - "Fiction, Science, History": "Fiction, Science, Histoire" + "Fiction, Science, History": "Fiction, Science, Histoire", + "Select Cover Image": "Sélectionner l'image de couverture" } diff --git a/apps/readest-app/public/locales/hi/translation.json b/apps/readest-app/public/locales/hi/translation.json index f0879bcd..516ae2f1 100644 --- a/apps/readest-app/public/locales/hi/translation.json +++ b/apps/readest-app/public/locales/hi/translation.json @@ -448,5 +448,6 @@ "Keep manual input": "मैन्युअल इनपुट रखें", "Google Books": "गूगल बुक्स", "Open Library": "ओपन लाइब्रेरी", - "Fiction, Science, History": "काल्पनिक, विज्ञान, इतिहास" + "Fiction, Science, History": "काल्पनिक, विज्ञान, इतिहास", + "Select Cover Image": "कवर इमेज चुनें" } diff --git a/apps/readest-app/public/locales/id/translation.json b/apps/readest-app/public/locales/id/translation.json index 1366106f..0128ebbc 100644 --- a/apps/readest-app/public/locales/id/translation.json +++ b/apps/readest-app/public/locales/id/translation.json @@ -444,5 +444,6 @@ "Keep manual input": "Pertahankan input manual", "Google Books": "Google Books", "Open Library": "Open Library", - "Fiction, Science, History": "Fiksi, Sains, Sejarah" + "Fiction, Science, History": "Fiksi, Sains, Sejarah", + "Select Cover Image": "Pilihan Gambar Sampul" } diff --git a/apps/readest-app/public/locales/it/translation.json b/apps/readest-app/public/locales/it/translation.json index 7303c639..b90a71f2 100644 --- a/apps/readest-app/public/locales/it/translation.json +++ b/apps/readest-app/public/locales/it/translation.json @@ -452,5 +452,6 @@ "Keep manual input": "Mantieni input manuale", "Google Books": "Google Books", "Open Library": "Open Library", - "Fiction, Science, History": "Narrativa, Scienza, Storia" + "Fiction, Science, History": "Narrativa, Scienza, Storia", + "Select Cover Image": "Seleziona immagine di copertina" } diff --git a/apps/readest-app/public/locales/ja/translation.json b/apps/readest-app/public/locales/ja/translation.json index 89bb5e89..80a1716c 100644 --- a/apps/readest-app/public/locales/ja/translation.json +++ b/apps/readest-app/public/locales/ja/translation.json @@ -444,5 +444,6 @@ "Keep manual input": "手動入力を保持", "Google Books": "Google Books", "Open Library": "Open Library", - "Fiction, Science, History": "小説、科学、歴史" + "Fiction, Science, History": "小説、科学、歴史", + "Select Cover Image": "表紙画像を選択" } diff --git a/apps/readest-app/public/locales/ko/translation.json b/apps/readest-app/public/locales/ko/translation.json index 5ad3605b..c5802914 100644 --- a/apps/readest-app/public/locales/ko/translation.json +++ b/apps/readest-app/public/locales/ko/translation.json @@ -444,5 +444,6 @@ "Keep manual input": "수동 입력 유지", "Google Books": "구글 북스", "Open Library": "오픈 라이브러리", - "Fiction, Science, History": "소설, 과학, 역사" + "Fiction, Science, History": "소설, 과학, 역사", + "Select Cover Image": "표지 이미지 선택" } diff --git a/apps/readest-app/public/locales/nl/translation.json b/apps/readest-app/public/locales/nl/translation.json index ffdc90b8..e9703796 100644 --- a/apps/readest-app/public/locales/nl/translation.json +++ b/apps/readest-app/public/locales/nl/translation.json @@ -448,5 +448,6 @@ "Keep manual input": "Handmatige invoer behouden", "Google Books": "Google Books", "Open Library": "Open Library", - "Fiction, Science, History": "Fictie, Wetenschap, Geschiedenis" + "Fiction, Science, History": "Fictie, Wetenschap, Geschiedenis", + "Select Cover Image": "Selecteer omslagafbeelding" } diff --git a/apps/readest-app/public/locales/pl/translation.json b/apps/readest-app/public/locales/pl/translation.json index 948179c8..7decf527 100644 --- a/apps/readest-app/public/locales/pl/translation.json +++ b/apps/readest-app/public/locales/pl/translation.json @@ -456,5 +456,6 @@ "Keep manual input": "Zachowaj wprowadzenie ręczne", "Google Books": "Google Books", "Open Library": "Open Library", - "Fiction, Science, History": "Beletrystyka, Nauka, Historia" + "Fiction, Science, History": "Beletrystyka, Nauka, Historia", + "Select Cover Image": "Zaznacz obraz okładki" } diff --git a/apps/readest-app/public/locales/pt/translation.json b/apps/readest-app/public/locales/pt/translation.json index a6acf722..f608d9ac 100644 --- a/apps/readest-app/public/locales/pt/translation.json +++ b/apps/readest-app/public/locales/pt/translation.json @@ -452,5 +452,6 @@ "Keep manual input": "Manter entrada manual", "Google Books": "Google Books", "Open Library": "Open Library", - "Fiction, Science, History": "Ficção, Ciência, História" + "Fiction, Science, History": "Ficção, Ciência, História", + "Select Cover Image": "Selecionar imagem da capa" } diff --git a/apps/readest-app/public/locales/ru/translation.json b/apps/readest-app/public/locales/ru/translation.json index 3ba4da1b..9652b3d6 100644 --- a/apps/readest-app/public/locales/ru/translation.json +++ b/apps/readest-app/public/locales/ru/translation.json @@ -456,5 +456,6 @@ "Keep manual input": "Сохранить ручной ввод", "Google Books": "Google Книги", "Open Library": "Open Library", - "Fiction, Science, History": "Художественная литература, Наука, История" + "Fiction, Science, History": "Художественная литература, Наука, История", + "Select Cover Image": "Выбрать изображение обложки" } diff --git a/apps/readest-app/public/locales/th/translation.json b/apps/readest-app/public/locales/th/translation.json index c940b1a2..8c7b9516 100644 --- a/apps/readest-app/public/locales/th/translation.json +++ b/apps/readest-app/public/locales/th/translation.json @@ -444,5 +444,6 @@ "Keep manual input": "เก็บข้อมูลที่ป้อนด้วยตนเอง", "Google Books": "Google Books", "Open Library": "Open Library", - "Fiction, Science, History": "นิยาย, วิทยาศาสตร์, ประวัติศาสตร์" + "Fiction, Science, History": "นิยาย, วิทยาศาสตร์, ประวัติศาสตร์", + "Select Cover Image": "เลือกภาพปก" } diff --git a/apps/readest-app/public/locales/tr/translation.json b/apps/readest-app/public/locales/tr/translation.json index 140e1992..9bc3bcdf 100644 --- a/apps/readest-app/public/locales/tr/translation.json +++ b/apps/readest-app/public/locales/tr/translation.json @@ -448,5 +448,6 @@ "Keep manual input": "Manuel girişi koru", "Google Books": "Google Books", "Open Library": "Open Library", - "Fiction, Science, History": "Kurgu, Bilim, Tarih" + "Fiction, Science, History": "Kurgu, Bilim, Tarih", + "Select Cover Image": "Kapak Resmi Seç" } diff --git a/apps/readest-app/public/locales/uk/translation.json b/apps/readest-app/public/locales/uk/translation.json index 3482a1c1..8ddb6097 100644 --- a/apps/readest-app/public/locales/uk/translation.json +++ b/apps/readest-app/public/locales/uk/translation.json @@ -456,5 +456,6 @@ "Keep manual input": "Зберегти ручне введення", "Google Books": "Google Books", "Open Library": "Open Library", - "Fiction, Science, History": "Художня література, Наука, Історія" + "Fiction, Science, History": "Художня література, Наука, Історія", + "Select Cover Image": "Оберіть зображення обкладинки" } diff --git a/apps/readest-app/public/locales/vi/translation.json b/apps/readest-app/public/locales/vi/translation.json index 19eedb4e..b7fe57cc 100644 --- a/apps/readest-app/public/locales/vi/translation.json +++ b/apps/readest-app/public/locales/vi/translation.json @@ -444,5 +444,6 @@ "Keep manual input": "Giữ nhập liệu thủ công", "Google Books": "Google Books", "Open Library": "Open Library", - "Fiction, Science, History": "Tiểu thuyết, Khoa học, Lịch sử" + "Fiction, Science, History": "Tiểu thuyết, Khoa học, Lịch sử", + "Select Cover Image": "Chọn ảnh bìa" } diff --git a/apps/readest-app/public/locales/zh-CN/translation.json b/apps/readest-app/public/locales/zh-CN/translation.json index 942f946d..2f1786aa 100644 --- a/apps/readest-app/public/locales/zh-CN/translation.json +++ b/apps/readest-app/public/locales/zh-CN/translation.json @@ -444,5 +444,6 @@ "Keep manual input": "保留手动输入", "Google Books": "谷歌图书", "Open Library": "开放图书馆", - "Fiction, Science, History": "小说,科学,历史" + "Fiction, Science, History": "小说,科学,历史", + "Select Cover Image": "选择封面图片" } diff --git a/apps/readest-app/public/locales/zh-TW/translation.json b/apps/readest-app/public/locales/zh-TW/translation.json index aeab28cb..7d879157 100644 --- a/apps/readest-app/public/locales/zh-TW/translation.json +++ b/apps/readest-app/public/locales/zh-TW/translation.json @@ -444,5 +444,6 @@ "Keep manual input": "保留手動輸入", "Google Books": "Google 圖書", "Open Library": "開放圖書館", - "Fiction, Science, History": "小說,科學,歷史" + "Fiction, Science, History": "小說,科學,歷史", + "Select Cover Image": "選擇封面圖片" } diff --git a/apps/readest-app/src/app/library/page.tsx b/apps/readest-app/src/app/library/page.tsx index bd92fd46..881ea075 100644 --- a/apps/readest-app/src/app/library/page.tsx +++ b/apps/readest-app/src/app/library/page.tsx @@ -21,7 +21,7 @@ import { eventDispatcher } from '@/utils/event'; import { ProgressPayload } from '@/utils/transfer'; import { throttle } from '@/utils/throttle'; import { parseOpenWithFiles } from '@/helpers/openWith'; -import { isTauriAppPlatform } from '@/services/environment'; +import { isTauriAppPlatform, isWebAppPlatform } from '@/services/environment'; import { checkForAppUpdates, checkAppReleaseNotes } from '@/helpers/updater'; import { FILE_ACCEPT_FORMATS, SUPPORTED_FILE_EXTS } from '@/services/constants'; import { impactFeedback } from '@tauri-apps/plugin-haptics'; @@ -565,17 +565,29 @@ const LibraryPageContent = ({ searchParams }: { searchParams: ReadonlyURLSearchP book.title = formatTitle(metadata.title); book.author = formatAuthors(metadata.author); book.primaryLanguage = getPrimaryLanguage(metadata.language); - if (metadata.coverImageBlobUrl || metadata.coverImageUrl) { + book.updatedAt = Date.now(); + if (metadata.coverImageBlobUrl || metadata.coverImageUrl || metadata.coverImageFile) { + book.coverImageUrl = metadata.coverImageBlobUrl || metadata.coverImageUrl; try { - appService?.updateCoverImage( + await appService?.updateCoverImage( book, - (metadata.coverImageBlobUrl || metadata.coverImageUrl) as string, + metadata.coverImageBlobUrl || metadata.coverImageUrl, + metadata.coverImageFile, ); } catch (error) { console.warn('Failed to update cover image:', error); } } + if (isWebAppPlatform()) { + // Clear HTTP cover image URL if cover is updated with a local file + if (metadata.coverImageBlobUrl) { + metadata.coverImageUrl = undefined; + } + } else { + metadata.coverImageUrl = undefined; + } metadata.coverImageBlobUrl = undefined; + metadata.coverImageFile = undefined; await updateBook(envConfig, book); }; @@ -585,9 +597,9 @@ const LibraryPageContent = ({ searchParams }: { searchParams: ReadonlyURLSearchP let files; if (isTauriAppPlatform()) { - files = (await selectFilesTauri()) as [string]; + files = (await selectFilesTauri()) as string[]; } else { - files = (await selectFilesWeb()) as [File]; + files = (await selectFilesWeb()) as File[]; } importBooks(files); }; diff --git a/apps/readest-app/src/components/BookCover.tsx b/apps/readest-app/src/components/BookCover.tsx index 81bb3284..5f0713fe 100644 --- a/apps/readest-app/src/components/BookCover.tsx +++ b/apps/readest-app/src/components/BookCover.tsx @@ -37,9 +37,7 @@ const BookCover: React.FC = ({
{coverFit === 'crop' ? ( {book.title} = ({ )} > {book.title} = ({ onSave, }) => { const _ = useTranslation(); + const { appService } = useEnv(); const hasLockedFields = Object.values(lockedFields).some((locked) => locked); const allFieldsLocked = Object.values(lockedFields).every((locked) => locked); const isCoverLocked = lockedFields['coverImageUrl'] || false; - const [coverImageUpdated, setCoverImageUpdated] = useState(false); + const [newCoverImageUrl, setNewCoverImageUrl] = useState(null); useEffect(() => { if (metadata.coverImageUrl) { - if (book.metadata) { - book.metadata.coverImageUrl = metadata.coverImageUrl; - } - setCoverImageUpdated(true); + setNewCoverImageUrl(metadata.coverImageUrl); } - }, [book.metadata, metadata.coverImageUrl]); + }, [metadata.coverImageUrl]); const titleAuthorFields = [ { @@ -147,12 +148,11 @@ const BookDetailEdit: React.FC = ({ }, ]; - const selectImageFile = () => { - if (coverImageUpdated) setCoverImageUpdated(false); + const selectImageFileWeb = () => { return new Promise((resolve) => { const fileInput = document.createElement('input'); fileInput.type = 'file'; - fileInput.accept = '.png, .jpg, .jpeg'; + fileInput.accept = IMAGE_ACCEPT_FORMATS; fileInput.multiple = false; fileInput.click(); @@ -162,27 +162,50 @@ const BookDetailEdit: React.FC = ({ }); }; + const selectImageFileTauri = async () => { + const exts = appService?.isMobileApp ? [] : SUPPORTED_IMAGE_EXTS; + const files = (await appService?.selectFiles(_('Select Cover Image'), exts)) || []; + if (appService?.isIOSApp) { + return files.filter((file) => { + const fileExt = file.split('.').pop()?.toLowerCase() || 'unknown'; + return SUPPORTED_IMAGE_EXTS.includes(fileExt); + }); + } + return files; + }; + const handleSelectLocalImage = async () => { - const files = (await selectImageFile()) as [File]; - if (files && files.length > 0) { - const file = files[0]; - metadata.coverImageBlobUrl = URL.createObjectURL(file); - setCoverImageUpdated(true); + let files; + if (isTauriAppPlatform()) { + files = (await selectImageFileTauri()) as string[]; + if (files.length > 0) { + metadata.coverImageFile = files[0]!; + metadata.coverImageUrl = appService?.fs.getURL(files[0]!); + setNewCoverImageUrl(metadata.coverImageUrl!); + } + } else { + files = (await selectImageFileWeb()) as File[]; + if (files.length > 0) { + metadata.coverImageBlobUrl = URL.createObjectURL(files[0]!); + setNewCoverImageUrl(metadata.coverImageBlobUrl!); + } } }; return (
-
+
@@ -191,14 +214,15 @@ const BookDetailEdit: React.FC = ({ onClick={handleSelectLocalImage} disabled={isCoverLocked} className={clsx( - 'flex flex-1 items-center justify-center gap-1 rounded px-2 py-1 text-xs', + 'flex flex-1 items-center justify-center gap-1 rounded px-2 py-1', 'border border-gray-300 bg-white hover:bg-gray-50', 'disabled:cursor-not-allowed disabled:opacity-50', + 'text-sm sm:text-xs', isCoverLocked && '!text-base-content !bg-base-200', )} title={_('Change cover image')} > - + {_('Replace')} diff --git a/apps/readest-app/src/components/metadata/BookDetailModal.tsx b/apps/readest-app/src/components/metadata/BookDetailModal.tsx index 70a4f3d4..2d3ef170 100644 --- a/apps/readest-app/src/components/metadata/BookDetailModal.tsx +++ b/apps/readest-app/src/components/metadata/BookDetailModal.tsx @@ -99,7 +99,7 @@ const BookDetailModal: React.FC = ({ const handleSaveMetadata = () => { if (editedMeta && handleBookMetadataUpdate) { - setBookMeta(editedMeta); + setBookMeta({ ...editedMeta }); handleBookMetadataUpdate(book, editedMeta); setEditMode(false); } diff --git a/apps/readest-app/src/components/metadata/BookDetailView.tsx b/apps/readest-app/src/components/metadata/BookDetailView.tsx index a6e29024..6c11c7e3 100644 --- a/apps/readest-app/src/components/metadata/BookDetailView.tsx +++ b/apps/readest-app/src/components/metadata/BookDetailView.tsx @@ -48,15 +48,7 @@ const BookDetailView: React.FC = ({
- +
diff --git a/apps/readest-app/src/components/metadata/useMetadataEdit.ts b/apps/readest-app/src/components/metadata/useMetadataEdit.ts index 285adac8..71bccbad 100644 --- a/apps/readest-app/src/components/metadata/useMetadataEdit.ts +++ b/apps/readest-app/src/components/metadata/useMetadataEdit.ts @@ -39,7 +39,6 @@ export const useMetadataEdit = (metadata: BookMetadata | null) => { useEffect(() => { if (metadata) { - console.log('initial metadata:', metadata); setEditedMeta({ ...metadata }); } }, [metadata]); diff --git a/apps/readest-app/src/libs/document.ts b/apps/readest-app/src/libs/document.ts index 6a91715c..8afee1a0 100644 --- a/apps/readest-app/src/libs/document.ts +++ b/apps/readest-app/src/libs/document.ts @@ -75,6 +75,8 @@ export type BookMetadata = { series?: string; seriesIndex?: number; seriesTotal?: number; + + coverImageFile?: string; coverImageUrl?: string; coverImageBlobUrl?: string; }; diff --git a/apps/readest-app/src/services/appService.ts b/apps/readest-app/src/services/appService.ts index 5927118b..cb00c94c 100644 --- a/apps/readest-app/src/services/appService.ts +++ b/apps/readest-app/src/services/appService.ts @@ -539,26 +539,36 @@ export abstract class BaseAppService implements AppService { await this.fs.writeFile(getLibraryFilename(), 'Books', JSON.stringify(libraryBooks)); } - private imageToArrayBuffer(imageUrl: string): Promise { + private imageToArrayBuffer(imageUrl?: string, imageFile?: string): Promise { return new Promise((resolve, reject) => { - if (imageUrl.startsWith('blob:')) { + if (!imageUrl && !imageFile) { + reject(new Error('No image URL or file provided')); + return; + } + if (this.appPlatform === 'web' && imageUrl && imageUrl.startsWith('blob:')) { fetch(imageUrl) .then((response) => response.arrayBuffer()) .then((buffer) => resolve(buffer)) .catch((error) => reject(error)); - } else if (this.appPlatform === 'web') { - reject(new Error('Skip non-blob URL')); - } else if (this.appPlatform === 'tauri') { + } else if (this.appPlatform === 'tauri' && imageFile) { + this.fs + .openFile(imageFile, 'None') + .then((file) => file.arrayBuffer()) + .then((buffer) => resolve(buffer)) + .catch((error) => reject(error)); + } else if (this.appPlatform === 'tauri' && imageUrl) { tauriFetch(imageUrl, { method: 'GET' }) .then((response) => response.arrayBuffer()) .then((buffer) => resolve(buffer)) .catch((error) => reject(error)); + } else { + reject(new Error('Unsupported platform or missing image data')); } }); } - async updateCoverImage(book: Book, imageUrl: string): Promise { - const arrayBuffer = await this.imageToArrayBuffer(imageUrl); + async updateCoverImage(book: Book, imageUrl?: string, imageFile?: string): Promise { + const arrayBuffer = await this.imageToArrayBuffer(imageUrl, imageFile); await this.fs.writeFile(getCoverFilename(book), 'Books', arrayBuffer); } } diff --git a/apps/readest-app/src/services/constants.ts b/apps/readest-app/src/services/constants.ts index 509a2e59..f2d60076 100644 --- a/apps/readest-app/src/services/constants.ts +++ b/apps/readest-app/src/services/constants.ts @@ -33,6 +33,9 @@ export const FILE_ACCEPT_FORMATS = SUPPORTED_FILE_EXTS.map((ext) => `.${ext}`).j export const BOOK_UNGROUPED_NAME = ''; export const BOOK_UNGROUPED_ID = ''; +export const SUPPORTED_IMAGE_EXTS = ['png', 'jpg', 'jpeg']; +export const IMAGE_ACCEPT_FORMATS = SUPPORTED_IMAGE_EXTS.map((ext) => `.${ext}`).join(', '); + export const DEFAULT_SYSTEM_SETTINGS: Partial = { keepLogin: false, autoUpload: true, diff --git a/apps/readest-app/src/types/system.ts b/apps/readest-app/src/types/system.ts index 6ea828e1..079ffb0e 100644 --- a/apps/readest-app/src/types/system.ts +++ b/apps/readest-app/src/types/system.ts @@ -71,5 +71,5 @@ export interface AppService { getCoverImageUrl(book: Book): string; getCoverImageBlobUrl(book: Book): Promise; generateCoverImageUrl(book: Book): Promise; - updateCoverImage(book: Book, imageUrl: string): Promise; + updateCoverImage(book: Book, imageUrl?: string, imageFile?: string): Promise; }