diff options
| author | Ahmad Mujahid <55625580+AhmadMuj@users.noreply.github.com> | 2025-02-17 13:25:16 +0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-02-17 09:25:16 +0000 |
| commit | e5cb9aa848009ea22c1385e4d33b7edf372979fb (patch) | |
| tree | 89470d8da8aab10f30bbfccea8d1b0cea08a1408 /packages/shared | |
| parent | a14be108736133535e2828b6bbdc8d0a69accd63 (diff) | |
| download | karakeep-e5cb9aa848009ea22c1385e4d33b7edf372979fb.tar.zst | |
feat: Add PDF screenshot generation and display (#995)
* Updated pdf2json to 3.1.5
* Extract and store a screenshot from PDF files using pdf2pic
* Installing graphicsmagick and ghostscript
* Generate Missing PDF screenshot with tidyAssets worker for backward support
* Display PDF screenshot instead of the PDF in web if it exists.
* Display PDF screenshot in mobile app if exists.
* Updated pnpm-lock.yaml
* Removed console.log
* Revert the unnecessary changes in package.json
* Revert pnpm-lock changes
* Prevent rendering PDF files if the screenshot is not generated
* refactor: replace useEffect with useMemo for section initialization
* feat: show PDF file download button and handle large PDFs by defaulting to screenshot view
* feat: add file size to openapi spec
* feature: Add Assets preprocessing in fix mode to admin actions
* i18n: add reprocess_assets_fix_mode translation
* i18n: Add missing ar translations
* A bunch of fixes
* Fix openspec schema
---------
Co-authored-by: Mohamed Bassem <me@mbassem.com>
Diffstat (limited to 'packages/shared')
| -rw-r--r-- | packages/shared/assetdb.ts | 33 | ||||
| -rw-r--r-- | packages/shared/queues.ts | 8 | ||||
| -rw-r--r-- | packages/shared/types/bookmarks.ts | 2 |
3 files changed, 43 insertions, 0 deletions
diff --git a/packages/shared/assetdb.ts b/packages/shared/assetdb.ts index 89738fcf..974f7893 100644 --- a/packages/shared/assetdb.ts +++ b/packages/shared/assetdb.ts @@ -4,6 +4,7 @@ import { Glob } from "glob"; import { z } from "zod"; import serverConfig from "./config"; +import logger from "./logger"; const ROOT_PATH = path.join(serverConfig.dataDir, "assets"); @@ -241,3 +242,35 @@ export async function* getAllAssets() { }; } } + +export async function storeScreenshot( + screenshot: Buffer | undefined, + userId: string, + jobId: string, +) { + if (!serverConfig.crawler.storeScreenshot) { + logger.info( + `[Crawler][${jobId}] Skipping storing the screenshot as per the config.`, + ); + return null; + } + if (!screenshot) { + logger.info( + `[Crawler][${jobId}] Skipping storing the screenshot as it's empty.`, + ); + return null; + } + const assetId = newAssetId(); + const contentType = "image/png"; + const fileName = "screenshot.png"; + await saveAsset({ + userId, + assetId, + metadata: { contentType, fileName }, + asset: screenshot, + }); + logger.info( + `[Crawler][${jobId}] Stored the screenshot as assetId: ${assetId}`, + ); + return { assetId, contentType, fileName, size: screenshot.byteLength }; +} diff --git a/packages/shared/queues.ts b/packages/shared/queues.ts index cbe58f8d..5484ffb2 100644 --- a/packages/shared/queues.ts +++ b/packages/shared/queues.ts @@ -98,6 +98,13 @@ export async function triggerSearchDeletion(bookmarkId: string) { }); } +export async function triggerReprocessingFixMode(bookmarkId: string) { + await AssetPreprocessingQueue.enqueue({ + bookmarkId, + fixMode: true, + }); +} + export const zvideoRequestSchema = z.object({ bookmarkId: z.string(), url: z.string(), @@ -143,6 +150,7 @@ export const FeedQueue = new SqliteQueue<ZFeedRequestSchema>( // Preprocess Assets export const zAssetPreprocessingRequestSchema = z.object({ bookmarkId: z.string(), + fixMode: z.boolean().optional().default(false), }); export type AssetPreprocessingRequest = z.infer< typeof zAssetPreprocessingRequestSchema diff --git a/packages/shared/types/bookmarks.ts b/packages/shared/types/bookmarks.ts index b6a74474..9644095c 100644 --- a/packages/shared/types/bookmarks.ts +++ b/packages/shared/types/bookmarks.ts @@ -17,6 +17,7 @@ export type ZSortOrder = z.infer<typeof zSortOrder>; export const zAssetTypesSchema = z.enum([ "screenshot", + "assetScreenshot", "bannerImage", "fullPageArchive", "video", @@ -61,6 +62,7 @@ export const zBookmarkedAssetSchema = z.object({ assetId: z.string(), fileName: z.string().nullish(), sourceUrl: z.string().nullish(), + size: z.number().nullish(), }); export type ZBookmarkedAsset = z.infer<typeof zBookmarkedAssetSchema>; |
