From 6640664a6923fdf50f4ddf156ca8bf5e0e0e5338 Mon Sep 17 00:00:00 2001 From: sudacode Date: Sun, 13 Apr 2025 23:26:32 -0700 Subject: [PATCH] add base anki scripts --- record-audio.sh | 93 ++++++++++++++++++++++++++++++++++++++++++++++ screenshot-anki.sh | 75 +++++++++++++++++++++++++++++++++++++ 2 files changed, 168 insertions(+) create mode 100644 record-audio.sh create mode 100644 screenshot-anki.sh diff --git a/record-audio.sh b/record-audio.sh new file mode 100644 index 0000000..30947fc --- /dev/null +++ b/record-audio.sh @@ -0,0 +1,93 @@ +#!/bin/sh + +# Version 1.2 +# shoutout to https://gist.github.com/Cephian/f849e326e3522be9a4386b60b85f2f23 for the original script, +# https://github.com/xythh/ added the ankiConnect functionality +# toggle record computer audio (run once to start, run again to stop) +# dependencies: ffmpeg, pulseaudio, curl + +# where recording gets saved, gets deleted after being imported to anki +DIRECTORY="$HOME/.cache/" +FORMAT="mp3" # ogg or mp3 +# cut file since it glitches a bit at the end sometimes +CUT_DURATION="0.1" +#port used by ankiconnect +ankiConnectPort="8765" +# gets the newest created card, so make sure to create the card first with yomichan +newestNoteId=$(curl -s localhost:$ankiConnectPort -X POST -d '{"action": "findNotes", "version": 6, "params": { "query": "is:new"}}' | jq '.result[-1]') +#Audio field name +audioFieldName="SentenceAudio" + +#if there is no newest note, you either have a complete empty anki or ankiconnect isn't running +if [ "$newestNoteId" = "" ]; then + notify-send "anki connect not found" + exit 1 +fi + +if pgrep -f "parec"; then + pkill -f "parec" +else + time=$(date +%s) + name="$DIRECTORY/$time" + wav_file="$name.wav" + out_file="$name.$FORMAT" + + if ! [ -d "$DIRECTORY" ]; then + mkdir "$DIRECTORY" + fi + notify-send -t 1000 "Audio recording started" + #timeout 1m arecord -t wav -f cd "$wav_file" + + # just grabs last running source... may not always work if your pulseaudio setup is complicated + if ! timeout 1m parec -d"$(pactl list sinks | grep -B1 'State: RUNNING' | sed -nE 's/Sink #(.*)/\1/p' | tail -n 1)" --file-format=wav "$wav_file"; then + + notify-send "Error recording " "most likely no audio playing" + rm "$wav_file" + exit 1 + fi + + input_duration=$(ffprobe -v error -select_streams a:0 -show_entries stream=duration -of default=noprint_wrappers=1:nokey=1 "$wav_file") + output_duration=$(echo "$input_duration"-"$CUT_DURATION" | bc) + + # encode file and delete OG + if [ $FORMAT = "ogg" ]; then + ffmpeg -i "$wav_file" -vn -codec:a libvorbis -b:a 64k -t "$output_duration" "$out_file" + elif [ $FORMAT = "mp3" ]; then + ffmpeg -i "$wav_file" -vn -codec:a libmp3lame -qscale:a 1 -t "$output_duration" "$out_file" + else + notify-send "Record Error" "Unknown format $FORMAT" + fi + rm "$wav_file" + + # Update newest note with recorded audio + curl -s localhost:$ankiConnectPort -X POST -d '{ + + "action": "updateNoteFields", + "version": 6, + "params": { + "note": { + "id": '"$newestNoteId"', + "fields": { + "'$audioFieldName'": "" + }, + "audio": [{ + "path": "'"$out_file"'", + "filename": "'"$time"'.'$FORMAT'", + "fields": [ + "'$audioFieldName'" + ] + }] + } +} +}' + # opens changed note, comment if you don't want it. + curl -s localhost:$ankiConnectPort -X POST -d '{ + "action": "guiBrowse", + "version": 6, + "params": { + "query": "nid:'"$newestNoteId"'" + } +}' + notify-send -t 1000 "Audio recording copied" + rm "$out_file" +fi diff --git a/screenshot-anki.sh b/screenshot-anki.sh new file mode 100644 index 0000000..464bbc0 --- /dev/null +++ b/screenshot-anki.sh @@ -0,0 +1,75 @@ +#!/bin/sh + +# Version 1.2 +# click and drag to screenshot dragged portion +# click on specific window to screenshot window area +# dependencies: imagemagick, xclip,curl maybe xdotool (see comment below) +# shoutout to https://gist.github.com/Cephian/f849e326e3522be9a4386b60b85f2f23 for the original script, +# https://github.com/xythh/ added the ankiConnect functionality +# if anki is running the image is added to your latest note as a jpg, if anki is not running it's added to your clipboard as a png +time=$(date +%s) +tmp_file="$HOME/.cache/$time" +ankiConnectPort="8765" +pictureField="Picture" +quality="90" + +# This gets your notes marked as new and returns the newest one. +newestNoteId=$(curl -s localhost:$ankiConnectPort -X POST -d '{"action": "findNotes", "version": 6, "params": { "query": "is:new"}}' | jq '.result[-1]') + +# you can remove these two lines if you don't have software which +# makes your mouse disappear when you use the keyboard (e.g. xbanish, unclutter) +# https://github.com/ImageMagick/ImageMagick/issues/1745#issuecomment-777747494 +xdotool mousemove_relative 1 1 +xdotool mousemove_relative -- -1 -1 + +# if anki connect is running it will return your latest note id, and the following code will run, if anki connect is not running nothing is return. +if [ "$newestNoteId" != "" ]; then + if ! import -quality $quality "$tmp_file.jpg"; then + # most likley reason this returns a error, is for fullscreen applications that take full control which does not allowing imagemagick to select the area, use windowed fullscreen or if running wine use a virtual desktop to avoid this. + notify-send "Error screenshoting " "most likely unable to find selection" + exit 1 + fi + + curl -s localhost:$ankiConnectPort -X POST -d '{ + "action": "updateNoteFields", + "version": 6, + "params": { + "note": { + "id": '"$newestNoteId"', + "fields": { + "'$pictureField'": "" + }, + "picture": [{ + "path": "'"$tmp_file"'.jpg", + "filename": "paste-'"$time"'.jpg", + "fields": [ + "'$pictureField'" + ] + }] + } + } +}' + + #remove if you don't want anki to show you the card you just edited + curl -s localhost:$ankiConnectPort -X POST -d '{ + "action": "guiBrowse", + "version": 6, + "params": { + "query": "nid:'"$newestNoteId"'" + } +}' + + #you can comment this if you do not use notifcations. + notify-send "Screenshot Taken" "Added to note" + rm "$tmp_file.jpg" +else + if ! import -quality $quality "$tmp_file.png"; then + notify-send "Error screenshoting " "most likely unable to find selection" + exit 1 + fi + # we use pngs when copying to clipboard because they have greater support when pasting. + xclip -selection clipboard -target image/png -i "$tmp_file.png" + rm "$tmp_file.png" + #you can comment this if you do not use notifcations. + notify-send "Screenshot Taken" "Copied to clipboard" +fi