tagger.sh: added
This commit is contained in:
parent
d85aa7f729
commit
6c464a0225
107
src/.local/bin/tagger.sh
Executable file
107
src/.local/bin/tagger.sh
Executable file
@ -0,0 +1,107 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
# wrapper over tmsu for easy tagging
|
||||||
|
#
|
||||||
|
# takes in file paths via stdin to tag
|
||||||
|
# pipe in `tmsu untagged` to tag untagged files
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# read -n 1 isn't POSIX-compliant so we implement something
|
||||||
|
# https://unix.stackexchange.com/questions/464930/can-i-read-a-single-character-from-stdin-in-posix-shell
|
||||||
|
|
||||||
|
readc() {
|
||||||
|
# return a single character from input
|
||||||
|
|
||||||
|
# if tty
|
||||||
|
if [ -t 0 ]; then
|
||||||
|
# save settings
|
||||||
|
saved_settings="$(stty -g)"
|
||||||
|
# make it so we get the character even if no enter press
|
||||||
|
stty -icanon
|
||||||
|
fi
|
||||||
|
|
||||||
|
dd bs=1 count=1 2>/dev/null
|
||||||
|
|
||||||
|
if [ -t 0 ]; then
|
||||||
|
# restore settings
|
||||||
|
stty "$saved_settings"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
view() {
|
||||||
|
mpv --no-resume-playback --loop "$1"
|
||||||
|
}
|
||||||
|
|
||||||
|
export TMSU_ARGS="$(mktemp)"
|
||||||
|
|
||||||
|
editargs() {
|
||||||
|
"$EDITOR" "$TMSU_ARGS" < /dev/tty
|
||||||
|
}
|
||||||
|
|
||||||
|
appendargs() {
|
||||||
|
while true; do
|
||||||
|
RES="$(tmsu tags \
|
||||||
|
| fzf -m --print-query --header "Select tag (or write 'tagname+' or any other special character to create a new tag)" \
|
||||||
|
|| true)"
|
||||||
|
|
||||||
|
if [ -z "$RES" ]; then
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
SEL="$(printf "%s\n" "$RES" | tail -n+2)"
|
||||||
|
QUER="$(printf "%s" "$RES" | head -n 1 | head -c-1)"
|
||||||
|
if [ "$SEL" = "" ]; then
|
||||||
|
printf "$QUER\n" >> "$TMSU_ARGS"
|
||||||
|
else
|
||||||
|
printf "$SEL\n" >> "$TMSU_ARGS"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
INPUT_FILE="$(mktemp)"
|
||||||
|
tmsu untagged > "$INPUT_FILE"
|
||||||
|
|
||||||
|
# this seems to magically fix some tmsu issue i don't really understand
|
||||||
|
# tmsu freezes for a second or two
|
||||||
|
# and then it doesn't apply the tag
|
||||||
|
cat "$INPUT_FILE" | \
|
||||||
|
while read -r FILE; do
|
||||||
|
if [ -d "$FILE" ] || [ "$(basename "$FILE")" = "db" ]; then
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
view "$FILE"
|
||||||
|
appendargs
|
||||||
|
|
||||||
|
while true; do
|
||||||
|
printf "%s\n" "$FILE"
|
||||||
|
printf "tagging %s with tags:\n" "$FILE"
|
||||||
|
cat "$TMSU_ARGS" | sed 's/^/- /'
|
||||||
|
printf "\nh view again, j add tmsu args, k edit tmsu args, l confirm, q exit, s skip\n"
|
||||||
|
printf "\n> "
|
||||||
|
ANS="$(readc </dev/tty)"
|
||||||
|
case "$ANS" in
|
||||||
|
q ) exit;;
|
||||||
|
h ) view "$FILE";;
|
||||||
|
j ) appendargs;;
|
||||||
|
k ) editargs;;
|
||||||
|
l ) printf "\n"
|
||||||
|
cat "$TMSU_ARGS" | sed -e '/^$/d' -e "s|^|$FILE |g" | tmsu tag -
|
||||||
|
printf "\nPress enter to continue, or enter 'back' to retag\n"
|
||||||
|
read ANS </dev/tty
|
||||||
|
if [ "$ANS" = "back" ]; then
|
||||||
|
tmsu untag -a "$FILE"
|
||||||
|
else
|
||||||
|
break
|
||||||
|
fi;;
|
||||||
|
s ) break;;
|
||||||
|
* )
|
||||||
|
printf "\nInvalid input! Press enter to continue\n";
|
||||||
|
read </dev/tty;
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
printf "" > "$TMSU_ARGS"
|
||||||
|
done
|
||||||
|
|
||||||
|
rm "$TMSU_ARGS"
|
||||||
|
rm "$INPUT_FILE"
|
Loading…
Reference in New Issue
Block a user