+ done <"$tmpf"
+ rm "$tmpf"
+}
+
+beets-gen-playlists() {
+ local i str
+ local -a query_array query_str
+ for i in "${!bpla[@]}"; do
+ query_str=()
+ eval "query_array=(${bpla[$i]})"
+ for str in "${query_array[@]}"; do
+ query_str+=("\"$str\"")
+ done
+ cat <<EOF
+ - name: $i.m3u
+ query: '${query_str[@]}'
+EOF
+ done
+}
+
+# beet playlist. use beetag with a playlist name
+bpl() {
+ eval beetag -r "$@" "${bpla[${@: -1}]}"
+}
+complete -W "${!bpla[*]}" bpl
+
+
+# beet modify quietly
+beetmq() {
+ local tmpf
+ tmpf="$(mktemp)"
+ # a bunch of effort to ignore output we dont care about...
+ sed 's/^format_item:.*/format_item: ignore_this/' ~/.config/beets/config.yaml >$tmpf
+ beet -c $tmpf modify -y "$@" > >(grep -vFx -e 'ignore_this' -e 'Modifying 1 items.' ||:)
+ rm "$tmpf"
+ scrolled+=1
+}
+
+# Must be called from beetag for variables to be setup
+beetag-help() {
+ # - 3 is just a constant that helps things work in practice.
+ if [[ $LINES ]] && (( LINES - 3 < scrolled )); then
+ hr
+ for (( i=0; i<${#button_map[@]}; i++)); do
+ if (( i % 3 == 2 )); then
+ printf "%s %s\n" ${buttons[i]} ${button_map[i]}
+ else
+ printf "%s %-15s" ${buttons[i]} ${button_map[i]}
+ fi
+ done
+ echo
+ cat <<'EOF'
+y other genres z fg player ' = toggle play
+; previous _ = delete -/+ volume ->/<- skip
+EOF
+ hr
+ scrolled=10
+ fi