diff options
Diffstat (limited to 'packages/shared')
| -rw-r--r-- | packages/shared/assetdb.ts | 16 | ||||
| -rw-r--r-- | packages/shared/config.ts | 6 | ||||
| -rw-r--r-- | packages/shared/queues.ts | 23 | ||||
| -rw-r--r-- | packages/shared/types/bookmarks.ts | 2 |
4 files changed, 47 insertions, 0 deletions
diff --git a/packages/shared/assetdb.ts b/packages/shared/assetdb.ts index 64413e9f..fb7d2461 100644 --- a/packages/shared/assetdb.ts +++ b/packages/shared/assetdb.ts @@ -13,6 +13,7 @@ export const enum ASSET_TYPES { IMAGE_WEBP = "image/webp", APPLICATION_PDF = "application/pdf", TEXT_HTML = "text/html", + VIDEO_MP4 = "video/mp4", } export const IMAGE_ASSET_TYPES: Set<string> = new Set<string>([ @@ -31,6 +32,7 @@ export const SUPPORTED_UPLOAD_ASSET_TYPES: Set<string> = new Set<string>([ export const SUPPORTED_ASSET_TYPES: Set<string> = new Set<string>([ ...SUPPORTED_UPLOAD_ASSET_TYPES, ASSET_TYPES.TEXT_HTML, + ASSET_TYPES.VIDEO_MP4, ]); function getAssetDir(userId: string, assetId: string) { @@ -152,6 +154,20 @@ export async function getAssetSize({ return stat.size; } +/** + * Deletes the passed in asset if it exists and ignores any errors + * @param userId the id of the user the asset belongs to + * @param assetId the id of the asset to delete + */ +export async function silentDeleteAsset( + userId: string, + assetId: string | undefined, +) { + if (assetId) { + await deleteAsset({ userId, assetId }).catch(() => ({})); + } +} + export async function deleteAsset({ userId, assetId, diff --git a/packages/shared/config.ts b/packages/shared/config.ts index 4b51d15d..35d3df54 100644 --- a/packages/shared/config.ts +++ b/packages/shared/config.ts @@ -42,6 +42,9 @@ const allEnv = z.object({ CRAWLER_STORE_SCREENSHOT: stringBool("true"), CRAWLER_FULL_PAGE_SCREENSHOT: stringBool("false"), CRAWLER_FULL_PAGE_ARCHIVE: stringBool("false"), + CRAWLER_VIDEO_DOWNLOAD: stringBool("false"), + CRAWLER_VIDEO_DOWNLOAD_MAX_SIZE: z.coerce.number().default(50), + CRAWLER_VIDEO_DOWNLOAD_TIMEOUT_SEC: z.coerce.number().default(10 * 60), MEILI_ADDR: z.string().optional(), MEILI_MASTER_KEY: z.string().default(""), LOG_LEVEL: z.string().default("debug"), @@ -98,6 +101,9 @@ const serverConfigSchema = allEnv.transform((val) => { storeScreenshot: val.CRAWLER_STORE_SCREENSHOT, fullPageScreenshot: val.CRAWLER_FULL_PAGE_SCREENSHOT, fullPageArchive: val.CRAWLER_FULL_PAGE_ARCHIVE, + downloadVideo: val.CRAWLER_VIDEO_DOWNLOAD, + maxVideoDownloadSize: val.CRAWLER_VIDEO_DOWNLOAD_MAX_SIZE, + downloadVideoTimeout: val.CRAWLER_VIDEO_DOWNLOAD_TIMEOUT_SEC, }, ocr: { langs: val.OCR_LANGS, diff --git a/packages/shared/queues.ts b/packages/shared/queues.ts index 0cb30aae..6189a633 100644 --- a/packages/shared/queues.ts +++ b/packages/shared/queues.ts @@ -93,3 +93,26 @@ export async function triggerSearchDeletion(bookmarkId: string) { type: "delete", }); } + +export const zvideoRequestSchema = z.object({ + bookmarkId: z.string(), + url: z.string(), +}); +export type ZVideoRequest = z.infer<typeof zvideoRequestSchema>; + +export const VideoWorkerQueue = new SqliteQueue<ZVideoRequest>( + "video_queue", + queueDB, + { + defaultJobArgs: { + numRetries: 5, + }, + }, +); + +export async function triggerVideoWorker(bookmarkId: string, url: string) { + await VideoWorkerQueue.enqueue({ + bookmarkId, + url, + }); +} diff --git a/packages/shared/types/bookmarks.ts b/packages/shared/types/bookmarks.ts index c731cb32..2d46684e 100644 --- a/packages/shared/types/bookmarks.ts +++ b/packages/shared/types/bookmarks.ts @@ -15,6 +15,7 @@ export const zAssetTypesSchema = z.enum([ "screenshot", "bannerImage", "fullPageArchive", + "video", "bookmarkAsset", "unknown", ]); @@ -34,6 +35,7 @@ export const zBookmarkedLinkSchema = z.object({ imageAssetId: z.string().nullish(), screenshotAssetId: z.string().nullish(), fullPageArchiveAssetId: z.string().nullish(), + videoAssetId: z.string().nullish(), favicon: z.string().url().nullish(), htmlContent: z.string().nullish(), crawledAt: z.date().nullish(), |
