add base anki scripts
This commit is contained in:
parent
1b62414392
commit
6640664a69
93
record-audio.sh
Normal file
93
record-audio.sh
Normal file
@ -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
|
75
screenshot-anki.sh
Normal file
75
screenshot-anki.sh
Normal file
@ -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
|
Loading…
x
Reference in New Issue
Block a user