Compare commits

...

10 Commits

5 changed files with 527 additions and 170 deletions

View File

@@ -46,8 +46,12 @@ if [ "${1:-}" = "--decorate" ]; then
exit 0 exit 0
fi fi
if [ "$MUSICDIR" ] && [ "${1:-}" = "--load-local" ]; then if [ "${1:-}" = "--reload" ]; then
[ ! "${MUSICDIR:-}" ] && err "The environment variable MUSICDIR is not set." && exit 1
[ ! -d "${MUSICDIR:-}" ] && err "The environment variable MUSICDIR does not point to a directory." && exit 1
info "Reloading information of local music directory $MUSICDIR"
load_local || err "Failed to load local data" load_local || err "Failed to load local data"
info "Done"
exit 0 exit 0
fi fi
@@ -67,15 +71,70 @@ if [ "${1:-}" = "--list-artists" ]; then
fi fi
if [ "${1:-}" = "--play-release" ]; then if [ "${1:-}" = "--play-release" ]; then
echo "Playing release $2" >>/tmp/foo mbid=${2}
deco=${3}
base="$(dirname "$deco")"
echo "Playing release ($mbid) [$deco]" >>/tmp/foo
tmplist=$(mktemp)
mb_release "$mbid" |
$JQ -r --slurpfile deco "$deco" --arg base "$base" '$deco[].tracks as $filenames |
.media[] |
.position as $pos |
.tracks |
map({
$pos,
number: .number,
file: $filenames[.id]
}) |
map(
if(.number | type == "string" and test("^[0-9]+$")) then
.number |= tonumber
else
.
end
) |
sort_by([.pos, .number]) |
map($base + "/" + .file)[]' >"$tmplist"
if [ "${4:-}" ]; then
mpv_play_list "$tmplist"
else
mpv_queue_list "$tmplist"
fi
rm -f "$tmplist"
exit 0 exit 0
fi fi
if [ "${1:-}" = "--play-recording" ]; then if [ "${1:-}" = "--play-recording" ]; then
echo "Playing recording $2" >>/tmp/foo echo "Playing recording $2" >>/tmp/foo
mpv_play_file "$2"
if [ "${3:-}" ]; then
mpv_play_file "$2"
else
mpv_queue_file "$2"
fi
exit 0 exit 0
fi fi
if [ "${1:-}" = "--play-toggle" ]; then
mpv_toggle_pause
fi
if [ "${1:-}" = "--play-next" ]; then
mpv_next
fi
if [ "${1:-}" = "--play-previous" ]; then
mpv_prev
fi
if [ "${1:-}" = "--seek-forward" ]; then
mpv_seek_forward
fi
if [ "${1:-}" = "--seek-backward" ]; then
mpv_seek_backward
fi
if [ "${1:-}" = "--internal-preview-artist" ]; then if [ "${1:-}" = "--internal-preview-artist" ]; then
__preview_artist "$2" __preview_artist "$2"
exit 0 exit 0
@@ -288,115 +347,46 @@ if [ "${1:-}" = "--internal-list-recordings" ]; then
cut -d "$(printf '\t')" -f 2- | cut -d "$(printf '\t')" -f 2- |
column -t -s "$(printf '\t')" -R 2,3,6 | column -t -s "$(printf '\t')" -R 2,3,6 |
sed 's| \+\([0-9a-f-]\+\):\(.*$\)$|\t\1\t\2|' sed 's| \+\([0-9a-f-]\+\):\(.*$\)$|\t\1\t\2|'
if [ -f "$rectmp" ]; then if [ "${rectmp:-}" ] && [ -f "$rectmp" ]; then
rm -f "$rectmp" rm -f "$rectmp"
fi fi
exit 0 exit 0
fi fi
if [ "${1:-}" = "--internal-list-local-artists" ]; then if [ "${1:-}" = "--internal-list-local-artists" ]; then
while IFS= read -r aid; do cat "$LOCALDATA_ARTISTS_VIEW" 2>/dev/null
mb_artist "$aid" | $JQ -r '[
.id,
.type,
.name,
.disambiguation,
.["life-span"].begin,
.["life-span"].end
] | join("\t")'
done <"$LOCALDATA_ARTISTS" |
awk \
-F "\t" \
-v format_person="$AV_PERSON" \
-v format_group="$AV_GROUP" \
-v format_disambiguation="$AV_DISAMBIGUATION" \
"$AWK_ARTISTS"
exit 0 exit 0
fi fi
if [ "${1:-}" = "--internal-list-local-releasegroups" ]; then if [ "${1:-}" = "--internal-list-local-releasegroups" ]; then
while IFS= read -r rgid; do cat "$LOCALDATA_RELEASEGROUPS_VIEW" 2>/dev/null
mb_releasegroup "$rgid" | $JQ -r '[
.id,
."primary-type",
(."secondary-types" // []|join(";")),
."first-release-date",
.title,
(."artist-credit" | map(([.name, .joinphrase]|join(""))) | join(""))
] | join("\t")'
done <"$LOCALDATA_RELEASEGROUPS" |
awk \
-F "\t" \
-v format_release="$RGV_RELEASE" \
-v format_release_w_artist="$RGV_RELEASE_W_ARTIST" \
-v format_year="$RGV_YEAR" \
-v format_album="$FORMAT_TYPE_ALBUM" \
-v format_single="$FORMAT_TYPE_SINGLE" \
-v format_ep="$FORMAT_TYPE_EP" \
-v format_broadcast="$FORMAT_TYPE_BROADCAST" \
-v format_other="$FORMAT_TYPE_OTHER" \
-v format_has_secondary="$FORMAT_TYPE_HAS_SECONDARY" \
-v format_secondary="$FORMAT_TYPE_SECONDARY" \
-v format_compilation="$FORMAT_TYPE_SECONDARY_COMPILATION" \
-v format_soundtrack="$FORMAT_TYPE_SECONDARY_SOUNDTRACK" \
-v format_spokenword="$FORMAT_TYPE_SECONDARY_SPOKENWORD" \
-v format_interview="$FORMAT_TYPE_SECONDARY_INTERVIEW" \
-v format_audiobook="$FORMAT_TYPE_SECONDARY_AUDIOBOOK" \
-v format_audiodrama="$FORMAT_TYPE_SECONDARY_AUDIODRAMA" \
-v format_live="$FORMAT_TYPE_SECONDARY_LIVE" \
-v format_remix="$FORMAT_TYPE_SECONDARY_REMIX" \
-v format_djmix="$FORMAT_TYPE_SECONDARY_DJMIX" \
-v format_mixtape="$FORMAT_TYPE_SECONDARY_MIXTAPE" \
-v format_demo="$FORMAT_TYPE_SECONDARY_DEMO" \
-v format_fieldrec="$FORMAT_TYPE_SECONDARY_FIELDREC" \
"$AWK_RELEASEGROUPS" |
sort -n -r |
cut -d "$(printf '\t')" -f 2- |
column -t -s "$(printf '\t')" |
sed 's| \+\([0-9a-f-]\+\)$|\t\1|'
exit 0 exit 0
fi fi
if [ "${1:-}" = "--internal-list-local-releases" ]; then if [ "${1:-}" = "--internal-list-local-releases" ]; then
list_releases | cat "$LOCALDATA_RELEASES_VIEW" 2>/dev/null
while IFS= read -r rid; do
mb_release "$rid" | $JQ -r '[
.id,
.status,
.date,
."cover-art-archive".count,
(."label-info" | map(.label.name) | unique | join(", ")),
(.media | map(."track-count") | add),
(.media | map(.format) | unique | join(", ")),
.country,
.title,
(."artist-credit" | map(([.name, .joinphrase]|join(""))) | join(""))
] | join("\t")'
done |
awk \
-F "\t" \
-v release_official="$FORMAT_STATUS_OFFICIAL" \
-v release_promotion="$FORMAT_STATUS_PROMO" \
-v release_bootleg="$FORMAT_STATUS_BOOTLEG" \
-v release_pseudo="$FORMAT_STATUS_PSEUDO" \
-v release_withdrawn="$FORMAT_STATUS_WITHDRAWN" \
-v release_expunged="$FORMAT_STATUS_EXPUNGED" \
-v release_cancelled="$FORMAT_STATUS_CANCELLED" \
-v release_format="$RV_FORMAT" \
-v release_format_title_artist="$RV_TITLE_ARTIST" \
-v release_format_title="$RV_TITLE" \
-v release_format_artist="$RV_ARTIST" \
"$AWK_RELEASES" |
sort -n -r |
cut -d "$(printf '\t')" -f 2- |
column -t -s "$(printf '\t')" |
sed 's| \+\([0-9a-f-]\+\):\(.*$\)$|\t\1\t\2|'
exit 0 exit 0
fi fi
if [ "${1:-}" = "--help" ]; then if [ "${1:-}" = "--help" ]; then
cat <<EOF cat <<EOF
Usage: $0 [ --help | --artist <mbid> | --releasegroup <mbid> | --release <mbid> ] Usage: $0 [OPTION]
GENERAL OPTIONS:
--help Show this help and exit.
--artists Default options, list artists of local music
--albums List albums of local music
--search-artist [<query>] Search artist on MusicBrainz
--search-album [<query>] Search album on MusicBrainz
--artist <mbid> List release groups of given artist <mbid>
--releasegroup <mbid> List releases in given release group <mbid>
--release <mbid> Show release given by <mbid>
--ni-search-artist [<query>] Non-interactive search on MusicBrainz
--ni-search-album [<query>] Non-interactive search on MusicBrainz
MANAGE LOCAL MUSIC:
--decorate <path> Decorate directory containing a tagged release
--reload Populate database with decorated local music
EOF EOF
exit 0 exit 0
fi fi
@@ -412,24 +402,27 @@ PIDFILE="$tmpdir/pid"
trap 'rm -rf "$tmpdir"' EXIT INT trap 'rm -rf "$tmpdir"' EXIT INT
export LOCKFILE RESULTS PIDFILE export LOCKFILE RESULTS PIDFILE
if [ "${1:-}" = "--search-artist" ]; then if [ "${1:-}" = "--ni-search-artist" ]; then
$0 --internal-search "artist" "$2" $0 --internal-search "artist" "$2"
exit 0 exit 0
fi fi
if [ "${1:-}" = "--search-album" ]; then if [ "${1:-}" = "--ni-search-album" ]; then
$0 --internal-search "releasegroup" "$2" $0 --internal-search "releasegroup" "$2"
exit 0 exit 0
fi fi
case "${1:-}" in case "${1:-}" in
"" | "--artist" | "--releasegroup" | "--release") ;; "" | "--artist" | "--releasegroup" | "--release" | "--search-artist" | "--search-album" | "--albums" | "--artists") ;;
*) *)
err "Unknown option $1" err "Unknown option $1"
exit 1 exit 1
;; ;;
esac esac
# Start mpv
mpv_start
while true; do while true; do
case "${1:-}" in case "${1:-}" in
"--artist") "--artist")
@@ -449,7 +442,8 @@ while true; do
--accept-nth="{2}" \ --accept-nth="{2}" \
--with-nth="{1}" \ --with-nth="{1}" \
--expect="ctrl-h,ctrl-a" \ --expect="ctrl-h,ctrl-a" \
--bind="load:unbind(enter)+transform:[ \"\$FZF_TOTAL_COUNT\" -gt 0 ] && echo \"rebind:ctrl-l\" || echo \"unbind:ctrl-l)\"" \ --bind="alt-l:change-query($FORMAT_LOCAL )" \
--bind="load:unbind(enter)+unbind(alt-enter)+transform:[ \"\$FZF_TOTAL_COUNT\" -gt 0 ] && echo \"rebind:ctrl-l\" || echo \"unbind:ctrl-l)\"" \
--bind="ctrl-l:accept" \ --bind="ctrl-l:accept" \
--bind="alt-b:execute-silent:xdg-open 'https://musicbrainz.org/release-group/{r2}' &" \ --bind="alt-b:execute-silent:xdg-open 'https://musicbrainz.org/release-group/{r2}' &" \
--bind="alt-1:change-query(!$secsymb ),alt-2:change-query($secsymb )" \ --bind="alt-1:change-query(!$secsymb ),alt-2:change-query($secsymb )" \
@@ -463,7 +457,6 @@ while true; do
[ "$lns" -eq 2 ] && [ "$key" = "ctrl-a" ] && set -- "--select-artist" "$(mb_releasegroup "$mid" | $JQ -r '."artist-credit"')" [ "$lns" -eq 2 ] && [ "$key" = "ctrl-a" ] && set -- "--select-artist" "$(mb_releasegroup "$mid" | $JQ -r '."artist-credit"')"
;; ;;
"--releasegroup") "--releasegroup")
set -x
title="$(mb_releasegroup "$2" | title="$(mb_releasegroup "$2" |
$JQ -r '.title')" $JQ -r '.title')"
artist="$(mb_releasegroup "$2" | artist="$(mb_releasegroup "$2" |
@@ -482,9 +475,21 @@ while true; do
--accept-nth="{2}" \ --accept-nth="{2}" \
--with-nth="{1}" \ --with-nth="{1}" \
--expect="ctrl-h,ctrl-a" \ --expect="ctrl-h,ctrl-a" \
--bind="alt-l:change-query($FORMAT_LOCAL )" \
--bind="load:transform:[ \"\$FZF_TOTAL_COUNT\" -gt 0 ] && echo \"rebind:ctrl-l\" || echo \"unbind:ctrl-l\"" \ --bind="load:transform:[ \"\$FZF_TOTAL_COUNT\" -gt 0 ] && echo \"rebind:ctrl-l\" || echo \"unbind:ctrl-l\"" \
--bind="enter:execute-silent:$0 --play-release {3}" \ --bind="enter:execute-silent:$0 --play-release {2} {3}" \
--bind="focus:transform:[ {3} ] && echo \"rebind:enter\" || echo \"unbind:enter\"" \ --bind="alt-enter:execute-silent:$0 --play-release {2} {3} q" \
--bind="space:execute-silent:$0 --play-toggle" \
--bind="ctrl-n:execute-silent:$0 --play-next" \
--bind="ctrl-p:execute-silent:$0 --play-previous" \
--bind="shift-right:execute-silent:$0 --seek-forward" \
--bind="shift-left:execute-silent:$0 --seek-backward" \
--bind="focus:transform:
[ {3} ] && c=rebind || c=unbind
for key in enter alt-enter space ctrl-n ctrl-p shift-right shift-left; do
printf \"+%s(%s)\" \"\$c\" \"\$key\"
done
" \
--bind="ctrl-l:accept" \ --bind="ctrl-l:accept" \
--bind="alt-b:execute-silent:xdg-open 'https://musicbrainz.org/release/{r2}' &" \ --bind="alt-b:execute-silent:xdg-open 'https://musicbrainz.org/release/{r2}' &" \
--bind="ctrl-d:half-page-down,ctrl-u:half-page-up" --bind="ctrl-d:half-page-down,ctrl-u:half-page-up"
@@ -514,8 +519,20 @@ while true; do
--accept-nth="{2}" \ --accept-nth="{2}" \
--with-nth="{1}" \ --with-nth="{1}" \
--expect="ctrl-h,ctrl-a" \ --expect="ctrl-h,ctrl-a" \
--bind="alt-l:change-query($FORMAT_LOCAL )" \
--bind="enter:execute-silent:$0 --play-recording {3}" \ --bind="enter:execute-silent:$0 --play-recording {3}" \
--bind="focus:transform:[ {3} ] && echo \"rebind:enter\" || echo \"unbind:enter\"" \ --bind="alt-enter:execute-silent:$0 --play-recording {3} q" \
--bind="space:execute-silent:$0 --play-toggle" \
--bind="ctrl-n:execute-silent:$0 --play-next" \
--bind="ctrl-p:execute-silent:$0 --play-previous" \
--bind="shift-right:execute-silent:$0 --seek-forward" \
--bind="shift-left:execute-silent:$0 --seek-backward" \
--bind="focus:transform:
[ {3} ] && c=rebind || c=unbind
for key in enter alt-enter space ctrl-n ctrl-p shift-right shift-left; do
printf \"+%s(%s)\" \"\$c\" \"\$key\"
done
" \
--bind="alt-b:execute-silent:xdg-open 'https://musicbrainz.org/track/{r2}' &" \ --bind="alt-b:execute-silent:xdg-open 'https://musicbrainz.org/track/{r2}' &" \
--bind="ctrl-d:half-page-down,ctrl-u:half-page-up" --bind="ctrl-d:half-page-down,ctrl-u:half-page-up"
) )
@@ -532,10 +549,14 @@ while true; do
$JQ -r 'map([.artist.id, .artist.type, .name] | join("\t")) | join("\n")' | $JQ -r 'map([.artist.id, .artist.type, .name] | join("\t")) | join("\n")' |
awk \ awk \
-F "\t" \ -F "\t" \
-v file_local_artists="${LOCALDATA_ARTISTS:-}" \
-v format_person="$AV_PERSON" \ -v format_person="$AV_PERSON" \
-v format_group="$AV_GROUP" \ -v format_group="$AV_GROUP" \
-v format_disambiguation="$AV_DISAMBIGUATION" \ -v format_disambiguation="$AV_DISAMBIGUATION" \
-v format_local="$FORMAT_LOCAL" \
"$AWK_ARTISTS" | "$AWK_ARTISTS" |
column -t -s "$(printf '\t')" |
sed 's| \+\([0-9a-f-]\+\)$|\t\1|' |
$FZF \ $FZF \
--no-clear \ --no-clear \
-1 \ -1 \
@@ -547,12 +568,13 @@ while true; do
--delimiter="\t" \ --delimiter="\t" \
--prompt="$SEARCH_PROMPT" \ --prompt="$SEARCH_PROMPT" \
--margin="5%,20%" \ --margin="5%,20%" \
--bind="alt-l:change-query($FORMAT_LOCAL )" \
--accept-nth="{2}" \ --accept-nth="{2}" \
--with-nth="{1}" --with-nth="{1}"
) )
[ "$sel" ] && set -- "--artist" "$sel" [ "$sel" ] && set -- "--artist" "$sel"
;; ;;
"--search-releasegroup") "--search-album")
sel=$( sel=$(
printf "" | printf "" |
$FZF \ $FZF \
@@ -565,11 +587,15 @@ while true; do
--delimiter="\t" \ --delimiter="\t" \
--prompt="$SEARCH_PROMPT" \ --prompt="$SEARCH_PROMPT" \
--info="inline-right" \ --info="inline-right" \
--info-command="echo \"Search album\"" \ --info-command="echo \"Search album on MusicBrainz\"" \
--color='input-fg:#ba478f' \
--accept-nth="{2}" \ --accept-nth="{2}" \
--with-nth="{1}" \ --with-nth="{1}" \
--expect="ctrl-c,ctrl-q,tab" \ --expect="ctrl-c,ctrl-q,tab" \
--bind="load:unbind(enter)+transform:[ \"\$FZF_TOTAL_COUNT\" -gt 0 ] && echo \"rebind:ctrl-l\" || echo \"unbind:ctrl-l\"" \ --expect="ctrl-/" \
--bind="alt-l:change-query($FORMAT_LOCAL )" \
--bind="start:transform:[ \"${2:-}\" ] && echo \"change-query:${2:-}\"" \
--bind="load:unbind(enter)+unbind(alt-enter)+transform:[ \"\$FZF_TOTAL_COUNT\" -gt 0 ] && echo \"rebind:ctrl-l\" || echo \"unbind:ctrl-l\"" \
--bind="ctrl-l:accept" \ --bind="ctrl-l:accept" \
--bind="ctrl-d:half-page-down,ctrl-u:half-page-up" \ --bind="ctrl-d:half-page-down,ctrl-u:half-page-up" \
--bind="alt-b:execute-silent:xdg-open 'https://musicbrainz.org/release-group/{r2}' &" \ --bind="alt-b:execute-silent:xdg-open 'https://musicbrainz.org/release-group/{r2}' &" \
@@ -581,9 +607,10 @@ while true; do
[ "$key" = "ctrl-c" ] && tput rmcup && exit 0 [ "$key" = "ctrl-c" ] && tput rmcup && exit 0
[ "$key" = "ctrl-q" ] && tput rmcup && exit 0 [ "$key" = "ctrl-q" ] && tput rmcup && exit 0
[ "$key" = "tab" ] && set -- "--search-artist" [ "$key" = "tab" ] && set -- "--search-artist"
[ "$key" = "ctrl-/" ] && set -- "--albums"
[ "$lns" -eq 2 ] && [ ! "$key" ] && [ "$mid" ] && set -- "--releasegroup" "$mid" [ "$lns" -eq 2 ] && [ ! "$key" ] && [ "$mid" ] && set -- "--releasegroup" "$mid"
;; ;;
*) "--search-artist")
sel=$( sel=$(
printf "" | printf "" |
$FZF \ $FZF \
@@ -596,13 +623,17 @@ while true; do
--delimiter="\t" \ --delimiter="\t" \
--prompt="$SEARCH_PROMPT" \ --prompt="$SEARCH_PROMPT" \
--info="inline-right" \ --info="inline-right" \
--info-command="echo \"Search music artist\"" \ --info-command="echo \"Search music artist on MusicBrainz\"" \
--color='input-fg:#ba478f' \
--accept-nth="{2}" \ --accept-nth="{2}" \
--with-nth="{1}" \ --with-nth="{1}" \
--preview-window="right,25%,border-left,wrap,<30(hidden)" \ --preview-window="right,25%,border-left,wrap,<30(hidden)" \
--preview="$0 --internal-preview-artist {2}" \ --preview="$0 --internal-preview-artist {2}" \
--expect="ctrl-c,ctrl-q,tab" \ --expect="ctrl-c,ctrl-q,tab" \
--bind="load:unbind(enter)+transform:[ \"\$FZF_TOTAL_COUNT\" -gt 0 ] && echo \"rebind:ctrl-l\" || echo \"unbind:ctrl-l\"" \ --expect="ctrl-/" \
--bind="alt-l:change-query($FORMAT_LOCAL )" \
--bind="start:transform:[ \"${2:-}\" ] && echo \"change-query:${2:-}\"" \
--bind="load:unbind(enter)+unbind(alt-enter)+transform:[ \"\$FZF_TOTAL_COUNT\" -gt 0 ] && echo \"rebind:ctrl-l\" || echo \"unbind:ctrl-l\"" \
--bind="ctrl-l:accept" \ --bind="ctrl-l:accept" \
--bind="ctrl-d:half-page-down,ctrl-u:half-page-up" \ --bind="ctrl-d:half-page-down,ctrl-u:half-page-up" \
--bind="down:preview-half-page-down,up:preview-half-page-up" \ --bind="down:preview-half-page-down,up:preview-half-page-up" \
@@ -614,7 +645,89 @@ while true; do
mid=$(echo "$sel" | head -2 | tail -1) mid=$(echo "$sel" | head -2 | tail -1)
[ "$key" = "ctrl-c" ] && tput rmcup && exit 0 [ "$key" = "ctrl-c" ] && tput rmcup && exit 0
[ "$key" = "ctrl-q" ] && tput rmcup && exit 0 [ "$key" = "ctrl-q" ] && tput rmcup && exit 0
[ "$key" = "tab" ] && set -- "--search-releasegroup" [ "$key" = "tab" ] && set -- "--search-album"
[ "$key" = "ctrl-/" ] && set -- "--artists"
[ "$lns" -eq 2 ] && [ ! "$key" ] && [ "$mid" ] && set -- "--artist" "$mid"
;;
"--albums")
sel=$(
$0 --internal-list-local-releasegroups |
$FZF \
--no-clear \
--ansi \
--reverse \
--cycle \
--delimiter="\t" \
--prompt="$SEARCH_PROMPT" \
--info="inline-right" \
--info-command="echo \"Search albums\"" \
--accept-nth="{2}" \
--with-nth="{1}" \
--expect="ctrl-h,ctrl-a" \
--expect="ctrl-c,ctrl-q,tab" \
--expect="ctrl-/" \
--bind="alt-l:change-query($FORMAT_LOCAL )" \
--bind="load:transform:[ \"\$FZF_TOTAL_COUNT\" -gt 0 ] && echo \"rebind:ctrl-l\" || echo \"unbind:ctrl-l\"" \
--bind="enter:execute-silent:$0 --play-release {2} {3}" \
--bind="alt-enter:execute-silent:$0 --play-release {2} {3} q" \
--bind="space:execute-silent:$0 --play-toggle" \
--bind="ctrl-n:execute-silent:$0 --play-next" \
--bind="ctrl-p:execute-silent:$0 --play-previous" \
--bind="shift-right:execute-silent:$0 --seek-forward" \
--bind="shift-left:execute-silent:$0 --seek-backward" \
--bind="focus:transform:
[ {3} ] && c=rebind || c=unbind
for key in enter alt-enter space ctrl-n ctrl-p shift-right shift-left; do
printf \"+%s(%s)\" \"\$c\" \"\$key\"
done
" \
--bind="ctrl-l:accept" \
--bind="alt-b:execute-silent:xdg-open 'https://musicbrainz.org/release/{r2}' &" \
--bind="ctrl-d:half-page-down,ctrl-u:half-page-up" || true
)
lns=$(echo "$sel" | wc -l)
key=$(echo "$sel" | head -1 | tail -1)
mid=$(echo "$sel" | head -2 | tail -1)
[ "$lns" -eq 2 ] && [ ! "$key" ] && [ "$mid" ] && set -- "--releasegroup" "$mid"
[ "$lns" -eq 2 ] && [ "$key" = "ctrl-h" ] && set -- "--albums"
[ "$lns" -eq 2 ] && [ "$key" = "ctrl-a" ] && set -- "--select-artist" "$(mb_releasegroup "$mid" | $JQ -r -c '."artist-credit"')"
[ "$key" = "ctrl-c" ] && tput rmcup && exit 0
[ "$key" = "ctrl-q" ] && tput rmcup && exit 0
[ "$key" = "ctrl-/" ] && set -- "--search-album"
[ "$key" = "tab" ] && set -- "--artists"
;;
*)
sel=$(
$0 --internal-list-local-artists |
$FZF \
--no-clear \
--ansi \
--reverse \
--cycle \
--delimiter="\t" \
--prompt="$SEARCH_PROMPT" \
--info="inline-right" \
--info-command="echo \"Search music artist\"" \
--accept-nth="{2}" \
--with-nth="{1}" \
--preview-window="right,25%,border-left,wrap,<30(hidden)" \
--preview="$0 --internal-preview-artist {2}" \
--expect="ctrl-c,ctrl-q,tab" \
--expect="ctrl-/" \
--bind="alt-l:change-query($FORMAT_LOCAL )" \
--bind="load:unbind(enter)+unbind(alt-enter)+transform:[ \"\$FZF_TOTAL_COUNT\" -gt 0 ] && echo \"rebind:ctrl-l\" || echo \"unbind:ctrl-l\"" \
--bind="ctrl-l:accept" \
--bind="ctrl-d:half-page-down,ctrl-u:half-page-up" \
--bind="down:preview-half-page-down,up:preview-half-page-up" \
--bind="alt-b:execute-silent:xdg-open 'https://musicbrainz.org/artist/{r2}' &" || true
)
lns=$(echo "$sel" | wc -l)
key=$(echo "$sel" | head -1 | tail -1)
mid=$(echo "$sel" | head -2 | tail -1)
[ "$key" = "ctrl-c" ] && tput rmcup && exit 0
[ "$key" = "ctrl-q" ] && tput rmcup && exit 0
[ "$key" = "tab" ] && set -- "--albums"
[ "$key" = "ctrl-/" ] && set -- "--search-artist"
[ "$lns" -eq 2 ] && [ ! "$key" ] && [ "$mid" ] && set -- "--artist" "$mid" [ "$lns" -eq 2 ] && [ ! "$key" ] && [ "$mid" ] && set -- "--artist" "$mid"
;; ;;
esac esac

View File

@@ -1,93 +1,216 @@
MB_MAX_RETRIES=10
MB_BROWSE_STEPS=100 MB_BROWSE_STEPS=100
USER_AGENT="$APP_NAME/$APP_VERSION ($APP_WEBSITE)"
SLEEP_ON_ERROR=1
export MB_BROWSE_STEPS export MB_BROWSE_STEPS
api_mb_artist() { __mpv_command() {
echo "mpv_command: $*" >>/tmp/foo
printf "{ \"command\": [\"%s\"] }\n" "$1" | $SOCAT - "$MPV_SOCKET"
}
__mpv_command_with_arg() {
echo "mpv_command_1: $*" >>/tmp/foo
printf "{ \"command\": [\"%s\", \"%s\"] }\n" "$1" "$2" | $SOCAT - "$MPV_SOCKET"
}
__mpv_command_with_args2() {
echo "mpv_command_2: $*" >>/tmp/foo
printf "{ \"command\": [\"%s\", \"%s\", \"%s\"] }\n" "$1" "$2" "$3" | $SOCAT - "$MPV_SOCKET"
}
__mpv_get() {
__mpv_command_with_arg "expand-text" "$2" | $JQ -r '.data'
}
mpv_playlist_count() {
__mpv_get '${playlist/count}'
}
mpv_playlist_position() {
__mpv_get '${playlist-pos}'
}
mpv_quit() {
__mpv_command "quit"
}
mpv_start() {
MPV_SOCKET="$(mktemp --suffix=.sock)"
trap 'mpv_quit; rm -f "$MPV_SOCKET"' EXIT INT
$MPV --no-config --no-terminal --input-ipc-server="$MPV_SOCKET" --idle --no-osc --no-input-default-bindings &
}
mpv_play_file() {
__mpv_command_with_arg "loadfile" "$1"
}
mpv_queue_file() {
__mpv_command_with_args2 "loadfile" "$1" "append-play"
}
mpv_play_list() {
__mpv_command_with_arg "loadlist" "$1"
}
mpv_queue_list() {
__mpv_command_with_arg "loadlist" "$1" "append-play"
}
mpv_next() {
__mpv_command "playlist-next"
}
mpv_prev() {
__mpv_command "playlist-prev"
}
mpv_seek_forward() {
__mpv_command_with_arg "seek" "10"
}
mpv_seek_backward() {
__mpv_command_with_arg "seek" "-10"
}
mpv_toggle_pause() {
__mpv_command_with_arg "cycle" "pause"
}
__api_mb() {
tmpout=$(mktemp)
for _ in $(seq "$MB_MAX_RETRIES"); do
case "$1" in
"artist")
$CURL \ $CURL \
--output "$tmpout" \
--get \ --get \
--data fmt=json \ --data fmt=json \
--data inc="url-rels+artist-rels+aliases" \ --data inc="url-rels+artist-rels+aliases" \
-A "$APP_NAME/$APP_VERSION ($APP_WEBSITE)" \ -A "$USER_AGENT" \
"https://musicbrainz.org/ws/2/artist/$1" "https://musicbrainz.org/ws/2/artist/$2"
} ;;
api_mb_releasegroup() { "releasegroup")
$CURL \ $CURL \
--output "$tmpout" \
--get \ --get \
--data fmt=json \ --data fmt=json \
--data inc=artist-credits \ --data inc=artist-credits \
-A "$APP_NAME/$APP_VERSION ($APP_WEBSITE)" \ -A "$USER_AGENT" \
"https://musicbrainz.org/ws/2/release-group/$1" "https://musicbrainz.org/ws/2/release-group/$2"
} ;;
"release")
api_mb_release() {
$CURL \ $CURL \
--output "$tmpout" \
--get \ --get \
--data fmt=json \ --data fmt=json \
--data inc="recordings+artist-credits+release-groups+labels" \ --data inc="recordings+artist-credits+release-groups+labels" \
-A "$APP_NAME/$APP_VERSION ($APP_WEBSITE)" \ -A "$USER_AGENT" \
"https://musicbrainz.org/ws/2/release/$1" "https://musicbrainz.org/ws/2/release/$2"
} ;;
"browse-artist-releasegroups")
api_mb_browse_artist_releasegroups() {
$CURL \ $CURL \
--output "$tmpout" \
--get \ --get \
--data fmt=json \ --data fmt=json \
--data inc=artist-credits \ --data inc=artist-credits \
--data limit="$MB_BROWSE_STEPS" \ --data limit="$MB_BROWSE_STEPS" \
--data offset="${2:-0}" \ --data offset="$3" \
--data artist="$1" \ --data artist="$2" \
-A "$APP_NAME/$APP_VERSION ($APP_WEBSITE)" \ -A "$USER_AGENT" \
"https://musicbrainz.org/ws/2/release-group" "https://musicbrainz.org/ws/2/release-group"
} ;;
"browse-releasegroup-releases")
api_mb_browse_releasegroup_releases() {
$CURL \ $CURL \
--output "$tmpout" \
--get \ --get \
--data fmt=json \ --data fmt=json \
--data inc="artist-credits+labels+media+release-groups" \ --data inc="artist-credits+labels+media+release-groups" \
--data limit="$MB_BROWSE_STEPS" \ --data limit="$MB_BROWSE_STEPS" \
--data offset="${2:-0}" \ --data offset="$3" \
--data release-group="$1" \ --data release-group="$2" \
-A "$APP_NAME/$APP_VERSION ($APP_WEBSITE)" \ -A "$USER_AGENT" \
"https://musicbrainz.org/ws/2/release" "https://musicbrainz.org/ws/2/release"
;;
"search-artist")
$CURL \
--output "$tmpout" \
--get \
--data fmt=json \
--data-urlencode query="$2" \
-A "$USER_AGENT" \
"https://musicbrainz.org/ws/2/artist"
;;
"search-releasegroup")
$CURL \
--output "$tmpout" \
--get \
--data fmt=json \
--data inc=artist-credits \
--data-urlencode query="$2" \
-A "$USER_AGENT" \
"https://musicbrainz.org/ws/2/release-group"
;;
esac
if ! $JQ -e '.error' "$tmpout" >/dev/null 2>/dev/stdout; then
cat "$tmpout"
rm -f "$tmpout"
return 0
else
sleep "$SLEEP_ON_ERROR"
fi
done
rm -f "$tmpout"
err "Failed to fetch MusicBrainz data for $1 $2"
return 1
}
api_mb_artist() {
__api_mb "artist" "$1"
}
api_mb_releasegroup() {
__api_mb "releasegroup" "$1"
}
api_mb_release() {
__api_mb "release" "$1"
}
api_mb_browse_artist_releasegroups() {
__api_mb "browse-artist-releasegroups" "$1" "${2:-0}"
}
api_mb_browse_releasegroup_releases() {
__api_mb "browse-releasegroup-releases" "$1" "${2:-0}"
} }
# Argument: Search string # Argument: Search string
api_mb_search_artist() { api_mb_search_artist() {
$CURL \ __api_mb "search-artist" "$1"
--get \
--data fmt=json \
--data-urlencode query="$1" \
-A "$APP_NAME/$APP_VERSION ($APP_WEBSITE)" \
"https://musicbrainz.org/ws/2/artist"
} }
api_mb_search_releasegroup() { api_mb_search_releasegroup() {
$CURL \ __api_mb "search-releasegroup" "$1"
--get \
--data fmt=json \
--data inc=artist-credits \
--data-urlencode query="$1" \
-A "$APP_NAME/$APP_VERSION ($APP_WEBSITE)" \
"https://musicbrainz.org/ws/2/release-group"
} }
api_discogs_artist() { api_discogs_artist() {
$CURL \ $CURL \
--get \ --get \
-A "$APP_NAME/$APP_VERSION ($APP_WEBSITE)" \ -A "$USER_AGENT" \
"https://api.discogs.com/artists/$1" "https://api.discogs.com/artists/$1"
} }
api_wikidata_sitelinks() { api_wikidata_sitelinks() {
$CURL \ $CURL \
--get \ --get \
-A "$APP_NAME/$APP_VERSION ($APP_WEBSITE)" \ -A "$USER_AGENT" \
"https://www.wikidata.org/w/rest.php/wikibase/v1/entities/items/$1/sitelinks" "https://www.wikidata.org/w/rest.php/wikibase/v1/entities/items/$1/sitelinks"
} }
api_wikipedia_en_summary() { api_wikipedia_en_summary() {
$CURL \ $CURL \
--get \ --get \
-A "$APP_NAME/$APP_VERSION ($APP_WEBSITE)" \ -A "$USER_AGENT" \
"https://en.wikipedia.org/api/rest_v1/page/summary/$1" "https://en.wikipedia.org/api/rest_v1/page/summary/$1"
} }

View File

@@ -75,17 +75,17 @@ __batch_load_missing() {
while IFS= read -r mbid; do while IFS= read -r mbid; do
case "$1" in case "$1" in
"$TYPE_ARTIST") "$TYPE_ARTIST")
mb_artist "$mbid" >/dev/null name=$(mb_artist "$mbid" | $JQ -r ".name")
;; ;;
"$TYPE_RELEASEGROUP") "$TYPE_RELEASEGROUP")
mb_releasegroup "$mbid" >/dev/null name=$(mb_releasegroup "$mbid" | $JQ -r ".title")
;; ;;
"$TYPE_RELEASE") "$TYPE_RELEASE")
mb_release "$mbid" >/dev/null name=$(mb_release "$mbid" | $JQ -r ".title")
;; ;;
esac esac
cnt=$((cnt + 1)) cnt=$((cnt + 1))
printf "\033[K\r%d/%d (%s: %s)" "$cnt" "$lines" "$mbid" "$($JQ -r ".name // .title")" printf "\033[2K\r%d/%d (%s: %s)" "$cnt" "$lines" "$mbid" "$name"
sleep 1 sleep 1
done <"$tmpf" done <"$tmpf"
printf "\n" printf "\n"
@@ -98,12 +98,16 @@ LOCALDATADIR="$HOME/.cache/$APP_NAME/local"
LOCALDATA_ARTISTS="$LOCALDATADIR/artists" LOCALDATA_ARTISTS="$LOCALDATADIR/artists"
LOCALDATA_RELEASEGROUPS="$LOCALDATADIR/releasegroups" LOCALDATA_RELEASEGROUPS="$LOCALDATADIR/releasegroups"
LOCALDATA_RELEASES="$LOCALDATADIR/releases" LOCALDATA_RELEASES="$LOCALDATADIR/releases"
LOCALDATA_ARTISTS_VIEW="$LOCALDATADIR/artists_view"
LOCALDATA_RELEASEGROUPS_VIEW="$LOCALDATADIR/releasegroups_view"
LOCALDATA_RELEASES_VIEW="$LOCALDATADIR/releases_view"
# Load local music # Load local music
load_local() { load_local() {
[ -d "$LOCALDATADIR" ] || mkdir -p "$LOCALDATADIR" [ -d "$LOCALDATADIR" ] || mkdir -p "$LOCALDATADIR"
tmpreleases=$(mktemp) tmpreleases=$(mktemp)
[ -f "$tmpreleases" ] || exit 1 [ -f "$tmpreleases" ] || exit 1
info "Locating and parsing decoration files ($DECORATION_FILENAME)"
find "$MUSICDIR" -type f -name "$DECORATION_FILENAME" -print0 | find "$MUSICDIR" -type f -name "$DECORATION_FILENAME" -print0 |
xargs -0 -P 4 $JQ -r '.releaseid+"\t"+input_filename' | xargs -0 -P 4 $JQ -r '.releaseid+"\t"+input_filename' |
tee "$LOCALDATA_RELEASES" | tee "$LOCALDATA_RELEASES" |
@@ -122,6 +126,107 @@ load_local() {
__batch_load_missing "$TYPE_RELEASEGROUP" "$LOCALDATA_RELEASEGROUPS" __batch_load_missing "$TYPE_RELEASEGROUP" "$LOCALDATA_RELEASEGROUPS"
__batch_load_missing "$TYPE_ARTIST" "$LOCALDATA_ARTISTS" __batch_load_missing "$TYPE_ARTIST" "$LOCALDATA_ARTISTS"
rm -f "$tmpreleases" rm -f "$tmpreleases"
# Precompute views
info "Precomputing artist view"
while IFS= read -r aid; do
mb_artist "$aid" | $JQ -r '[
.id,
.type,
.name,
.disambiguation,
.["life-span"].begin,
.["life-span"].end
] | join("\t")'
done <"$LOCALDATA_ARTISTS" |
awk \
-F "\t" \
-v file_local_artists="${LOCALDATA_ARTISTS:-}" \
-v format_person="$AV_PERSON" \
-v format_group="$AV_GROUP" \
-v format_disambiguation="$AV_DISAMBIGUATION" \
-v format_local="$FORMAT_LOCAL" \
"$AWK_ARTISTS" |
sort |
column -t -s "$(printf '\t')" |
sed 's| \+\([0-9a-f-]\+\)$|\t\1|' >"$LOCALDATA_ARTISTS_VIEW"
info "Precomputing releasegroup view"
while IFS= read -r rgid; do
mb_releasegroup "$rgid" | $JQ -r '[
.id,
."primary-type",
(."secondary-types" // []|join(";")),
."first-release-date",
.title,
(."artist-credit" | map(([.name, .joinphrase]|join(""))) | join(""))
] | join("\t")'
done <"$LOCALDATA_RELEASEGROUPS" |
awk \
-F "\t" \
-v file_local_releasegroups="${LOCALDATA_RELEASEGROUPS:-}" \
-v format_release="$RGV_RELEASE" \
-v format_release_w_artist="$RGV_RELEASE_W_ARTIST" \
-v format_year="$RGV_YEAR" \
-v format_album="$FORMAT_TYPE_ALBUM" \
-v format_single="$FORMAT_TYPE_SINGLE" \
-v format_ep="$FORMAT_TYPE_EP" \
-v format_broadcast="$FORMAT_TYPE_BROADCAST" \
-v format_other="$FORMAT_TYPE_OTHER" \
-v format_has_secondary="$FORMAT_TYPE_HAS_SECONDARY" \
-v format_secondary="$FORMAT_TYPE_SECONDARY" \
-v format_compilation="$FORMAT_TYPE_SECONDARY_COMPILATION" \
-v format_soundtrack="$FORMAT_TYPE_SECONDARY_SOUNDTRACK" \
-v format_spokenword="$FORMAT_TYPE_SECONDARY_SPOKENWORD" \
-v format_interview="$FORMAT_TYPE_SECONDARY_INTERVIEW" \
-v format_audiobook="$FORMAT_TYPE_SECONDARY_AUDIOBOOK" \
-v format_audiodrama="$FORMAT_TYPE_SECONDARY_AUDIODRAMA" \
-v format_live="$FORMAT_TYPE_SECONDARY_LIVE" \
-v format_remix="$FORMAT_TYPE_SECONDARY_REMIX" \
-v format_djmix="$FORMAT_TYPE_SECONDARY_DJMIX" \
-v format_mixtape="$FORMAT_TYPE_SECONDARY_MIXTAPE" \
-v format_demo="$FORMAT_TYPE_SECONDARY_DEMO" \
-v format_fieldrec="$FORMAT_TYPE_SECONDARY_FIELDREC" \
-v format_local="$FORMAT_LOCAL" \
"$AWK_RELEASEGROUPS" |
sort -n -r |
cut -d "$(printf '\t')" -f 2- |
column -t -s "$(printf '\t')" |
sed 's| \+\([0-9a-f-]\+\)$|\t\1|' >"$LOCALDATA_RELEASEGROUPS_VIEW"
info "Precomputing release view"
list_releases |
while IFS= read -r rid; do
mb_release "$rid" | $JQ -r '[
.id,
.status,
.date,
."cover-art-archive".count,
(."label-info" | map(.label.name) | unique | join(", ")),
(.media | map(."track-count") | add),
(.media | map(.format) | unique | join(", ")),
.country,
.title,
(."artist-credit" | map(([.name, .joinphrase]|join(""))) | join(""))
] | join("\t")'
done |
awk \
-F "\t" \
-v file_local_releases="${LOCALDATA_RELEASES:-}" \
-v release_official="$FORMAT_STATUS_OFFICIAL" \
-v release_promotion="$FORMAT_STATUS_PROMO" \
-v release_bootleg="$FORMAT_STATUS_BOOTLEG" \
-v release_pseudo="$FORMAT_STATUS_PSEUDO" \
-v release_withdrawn="$FORMAT_STATUS_WITHDRAWN" \
-v release_expunged="$FORMAT_STATUS_EXPUNGED" \
-v release_cancelled="$FORMAT_STATUS_CANCELLED" \
-v release_format="$RV_FORMAT" \
-v release_format_title_artist="$RV_TITLE_ARTIST" \
-v release_format_title="$RV_TITLE" \
-v release_format_artist="$RV_ARTIST" \
-v format_local="$FORMAT_LOCAL" \
"$AWK_RELEASES" |
sort -n -r |
cut -d "$(printf '\t')" -f 2- |
column -t -s "$(printf '\t')" |
sed 's| \+\([0-9a-f-]\+\):\(.*$\)$|\t\1\t\2|' >"$LOCALDATA_RELEASES_VIEW"
} }
# List all releases # List all releases

View File

@@ -23,8 +23,8 @@ AV_GROUP="${AV_GROUP:-"🧑‍🤝‍🧑 $CARTIST<<name>>$OFF"}"
AV_DISAMBIGUATION="${AV_DISAMBIGUATION:-"$CDISAMB(<<disambiguation>>)$OFF"}" AV_DISAMBIGUATION="${AV_DISAMBIGUATION:-"$CDISAMB(<<disambiguation>>)$OFF"}"
# Release group view # Release group view
RGV_RELEASE="${RGV_RELEASE:-"${CTITLE}<<title>>"}" RGV_RELEASE="${RGV_RELEASE:-"${CTITLE}<<title>>$OFF"}"
RGV_RELEASE_W_ARTIST="${RGV_RELEASE_W_ARTIST:-"${CTITLE}<<title>> — ${CARTIST}<<artist>>"}" RGV_RELEASE_W_ARTIST="${RGV_RELEASE_W_ARTIST:-"${CTITLE}<<title>>$OFF${CARTIST}<<artist>>$OFF"}"
RGV_YEAR="${RGV_YEAR:-"${CYEAR}(<<year>>)$OFF"}" RGV_YEAR="${RGV_YEAR:-"${CYEAR}(<<year>>)$OFF"}"
# Types # Types
@@ -34,7 +34,7 @@ FORMAT_TYPE_SINGLE="${FORMAT_TYPE_SINGLE:-"SI 🎶"}"
FORMAT_TYPE_BROADCAST="${FORMAT_TYPE_BROADCAST:-"BR 📻"}" FORMAT_TYPE_BROADCAST="${FORMAT_TYPE_BROADCAST:-"BR 📻"}"
FORMAT_TYPE_OTHER="${FORMAT_TYPE_OTHER:-"OT ❔"}" FORMAT_TYPE_OTHER="${FORMAT_TYPE_OTHER:-"OT ❔"}"
FORMAT_TYPE_HAS_SECONDARY="${FORMAT_TYPE_HAS_SECONDARY:-"%s☼"}" FORMAT_TYPE_HAS_SECONDARY="${FORMAT_TYPE_HAS_SECONDARY:-"%s☼"}"
FORMAT_TYPE_SECONDARY="${FORMAT_TYPE_SECONDARY:-"${CNOTE}[☼: %s]"}" FORMAT_TYPE_SECONDARY="${FORMAT_TYPE_SECONDARY:-"${CNOTE}[☼: %s]$OFF"}"
FORMAT_TYPE_SECONDARY_COMPILATION="${FORMAT_TYPE_SECONDARY_COMPILATION:-"🧩 compilation"}" FORMAT_TYPE_SECONDARY_COMPILATION="${FORMAT_TYPE_SECONDARY_COMPILATION:-"🧩 compilation"}"
FORMAT_TYPE_SECONDARY_SOUNDTRACK="${FORMAT_TYPE_SECONDARY_SOUNDTRACK:-"🎬 soundtrack"}" FORMAT_TYPE_SECONDARY_SOUNDTRACK="${FORMAT_TYPE_SECONDARY_SOUNDTRACK:-"🎬 soundtrack"}"
FORMAT_TYPE_SECONDARY_SPOKENWORD="${FORMAT_TYPE_SECONDARY_SPOKENWORD:-"📖 spokenword"}" FORMAT_TYPE_SECONDARY_SPOKENWORD="${FORMAT_TYPE_SECONDARY_SPOKENWORD:-"📖 spokenword"}"
@@ -66,10 +66,10 @@ FORMAT_STATUS_EXPUNGED="${FORMAT_STATUS_EXPUNGED:-"🧹 expunged"}"
FORMAT_STATUS_CANCELLED="${FORMAT_STATUS_CANCELLED:-"❌ cancelled"}" FORMAT_STATUS_CANCELLED="${FORMAT_STATUS_CANCELLED:-"❌ cancelled"}"
# Release view # Release view
RV_FORMAT="<<status>>\t${CXXX}<<tracks>> tracks\t<<media>>\t${CYEAR}<<year>>\t<<country>>\t${CARTIST}<<label>>$OFF" RV_FORMAT="<<status>>\t${CXXX}<<tracks>> tracks\t<<media>>$OFF\t${CYEAR}<<year>>\t<<country>>$OFF\t${CARTIST}<<label>>$OFF"
RV_TITLE_ARTIST="${FAINT}as ${CTITLE}<<title>> by ${FAINT}${CARTIST}<<artist>>$OFF" RV_TITLE_ARTIST="${FAINT}as ${CTITLE}<<title>>$OFF by ${FAINT}${CARTIST}<<artist>>$OFF"
RV_TITLE="${FAINT}as ${CTITLE}<<title>>$OFF" RV_TITLE="${FAINT}as ${CTITLE}<<title>>$OFF"
RV_ARTIST="${FAINT}by ${CARTIST}<<artist>>$OFF" RV_ARTIST="${FAINT}by ${CARTIST}<<artist>>$OFF"
# Recording view # Recording view
REC_FORMAT="${CNOTE}${FAINT}<<med>>\t${CNOTE}<<nr>>\t$OFF${CTITLE}<<title>>\t${CARTIST}<<artist>>\t${CXXX}<<duration>>$OFF" REC_FORMAT="${CNOTE}${FAINT}<<med>>\t${CNOTE}<<nr>>$OFF\t${CTITLE}<<title>>\t${CARTIST}<<artist>>\t${CXXX}<<duration>>$OFF"

View File

@@ -21,3 +21,19 @@ else
exit 1 exit 1
fi fi
export JQ export JQ
if command -v "mpv" >/dev/null; then
MPV="mpv"
else
err "Did not find mpv."
exit 1
fi
export MPV
if command -v "socat" >/dev/null; then
SOCAT="socat"
else
err "Did not find socat."
exit 1
fi
export SOCAT