From 4d6f5bd7ae615a281c1b10e33a39708b6c8ee938 Mon Sep 17 00:00:00 2001 From: ZXY101 Date: Sun, 24 Sep 2023 07:20:49 +0200 Subject: [PATCH] Handle anki connect integration --- src/lib/anki-connect/index.ts | 85 +++++++++++++++++++++- src/lib/components/Reader/MangaPage.svelte | 4 +- src/lib/components/Reader/TextBoxes.svelte | 30 +++----- src/lib/upload/index.ts | 9 ++- 4 files changed, 102 insertions(+), 26 deletions(-) diff --git a/src/lib/anki-connect/index.ts b/src/lib/anki-connect/index.ts index 32a26b6..24eca94 100644 --- a/src/lib/anki-connect/index.ts +++ b/src/lib/anki-connect/index.ts @@ -1,4 +1,6 @@ +import { settings } from "$lib/settings"; import { showSnackbar } from "$lib/util" +import { get } from "svelte/store"; export async function ankiConnect(action: string, params: Record) { @@ -40,8 +42,85 @@ export function getCardAgeInMin(id: number) { return Math.floor((Date.now() - id) / 60000); } -export async function updateLastCard() { +async function blobToBase64(blob: Blob) { + return new Promise((resolve) => { + const reader = new FileReader(); + reader.onloadend = () => resolve(reader.result as string); + reader.readAsDataURL(blob); + }); +} + +export async function imageToWebp(source: File) { + const image = await createImageBitmap(source); + const canvas = new OffscreenCanvas(image.width, image.height); + const context = canvas.getContext("2d"); + + if (context) { + context.drawImage(image, 0, 0); + const blob = await canvas.convertToBlob({ type: 'image/webp' }); + image.close(); + + return await blobToBase64(blob); + } +} + +export async function updateLastCard(image: File, sentence: string) { + const { + overwriteImage, + enabled, + cropImage, + grabSentence, + pictureField, + sentenceField + } = get(settings).ankiConnectSettings; + + if (!enabled) { + return + } + + showSnackbar('Updating last card...', 10000) + const id = await getLastCardId() - return Math.floor((Date.now() - id) / 60000); -} \ No newline at end of file + if (getCardAgeInMin(id) >= 5) { + showSnackbar('Error: Card created over 5 minutes ago'); + return; + } + + const fields: Record = {}; + + if (grabSentence) { + fields[sentenceField] = sentence; + } + + if (overwriteImage) { + fields[pictureField] = '' + } + + if (cropImage) { + console.log('image cropping here'); + } + + const picture = await imageToWebp(image) + + + if (picture) { + ankiConnect('updateNoteFields', { + note: { + id, + fields, + picture: { + filename: `_${id}.webp`, + data: picture.split(';base64,')[1], + fields: [pictureField], + }, + }, + }).then(() => { + showSnackbar('Card updated!') + }).catch((e) => { + showSnackbar(e) + }) + } else { + showSnackbar('Something went wrong') + } +} diff --git a/src/lib/components/Reader/MangaPage.svelte b/src/lib/components/Reader/MangaPage.svelte index a37e2f0..718bf84 100644 --- a/src/lib/components/Reader/MangaPage.svelte +++ b/src/lib/components/Reader/MangaPage.svelte @@ -3,7 +3,7 @@ import TextBoxes from './TextBoxes.svelte'; export let page: Page; - export let src: Blob; + export let src: File;
- +
diff --git a/src/lib/components/Reader/TextBoxes.svelte b/src/lib/components/Reader/TextBoxes.svelte index e8fb87e..306ce53 100644 --- a/src/lib/components/Reader/TextBoxes.svelte +++ b/src/lib/components/Reader/TextBoxes.svelte @@ -1,11 +1,11 @@ {#each textBoxes as { fontSize, height, left, lines, top, width, writingMode }, index (`text-box-${index}`)} -
onUpdateCard(lines)} {contenteditable} > - {#if $settings.ankiConnectSettings.enabled} - - {/if} {#each lines as line}

{line}

{/each} -
+ {/each}