From 27b3f9d17958d76ced902787e387c15db720af0a Mon Sep 17 00:00:00 2001 From: Patrick Leonard Date: Sun, 29 Dec 2024 04:25:56 -1000 Subject: feat: add Linkwarden importer (#786) * added in Linkwarden import * simpler parsing --------- Co-authored-by: Mohamed Bassem --- apps/web/components/settings/ImportExport.tsx | 17 ++++++++++++- apps/web/lib/i18n/locales/en/translation.json | 1 + apps/web/lib/importBookmarkParser.ts | 36 +++++++++++++++++++++++++++ 3 files changed, 53 insertions(+), 1 deletion(-) (limited to 'apps') diff --git a/apps/web/components/settings/ImportExport.tsx b/apps/web/components/settings/ImportExport.tsx index 34e069da..e38f629a 100644 --- a/apps/web/components/settings/ImportExport.tsx +++ b/apps/web/components/settings/ImportExport.tsx @@ -11,6 +11,7 @@ import { useTranslation } from "@/lib/i18n/client"; import { ParsedBookmark, parseHoarderBookmarkFile, + parseLinkwardenBookmarkFile, parseNetscapeBookmarkFile, parseOmnivoreBookmarkFile, parsePocketBookmarkFile, @@ -121,7 +122,7 @@ export function ImportExportRow() { source, }: { file: File; - source: "html" | "pocket" | "omnivore" | "hoarder"; + source: "html" | "pocket" | "omnivore" | "hoarder" | "linkwarden"; }) => { if (source === "html") { return await parseNetscapeBookmarkFile(file); @@ -131,6 +132,8 @@ export function ImportExportRow() { return await parseHoarderBookmarkFile(file); } else if (source === "omnivore") { return await parseOmnivoreBookmarkFile(file); + } else if (source === "linkwarden") { + return await parseLinkwardenBookmarkFile(file); } else { throw new Error("Unknown source"); } @@ -230,6 +233,18 @@ export function ImportExportRow() {

{t("settings.import.import_bookmarks_from_omnivore_export")}

+ + runUploadBookmarkFile({ file, source: "linkwarden" }) + } + > + +

{t("settings.import.import_bookmarks_from_linkwarden_export")}

+
{ + const textContent = await file.text(); + const zLinkwardenExportSchema = z.object({ + collections: z.array( + z.object({ + links: z.array( + z.object({ + name: z.string(), + url: z.string(), + tags: z.array(z.object({ name: z.string() })), + createdAt: z.coerce.date(), + }), + ), + }), + ), + }); + + const parsed = zLinkwardenExportSchema.safeParse(JSON.parse(textContent)); + if (!parsed.success) { + throw new Error( + `The uploaded JSON file contains an invalid Linkwarden bookmark file: ${parsed.error.toString()}`, + ); + } + + return parsed.data.collections.flatMap((collection) => { + return collection.links.map((bookmark) => ({ + title: bookmark.name ?? "", + content: { type: BookmarkTypes.LINK as const, url: bookmark.url }, + tags: bookmark.tags.map((tag) => tag.name), + addDate: bookmark.createdAt.getTime() / 1000, + })); + }); +} -- cgit v1.2.3-70-g09d2