aboutsummaryrefslogtreecommitdiffstats
path: root/packages/shared
diff options
context:
space:
mode:
Diffstat (limited to 'packages/shared')
-rw-r--r--packages/shared/assetdb.ts16
-rw-r--r--packages/shared/config.ts6
-rw-r--r--packages/shared/queues.ts23
-rw-r--r--packages/shared/types/bookmarks.ts2
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(),