Compare commits
14 Commits
7826cb471c
...
feat/mpv
Author | SHA1 | Date | |
---|---|---|---|
f4594ca492 | |||
3395f8e068 | |||
210cfd01f7 | |||
30765b7347 | |||
053b594608 | |||
30b3a44a98 | |||
0db4b7069c | |||
c46cd9a57f | |||
6549c3f022 | |||
91343b4b9f | |||
fac25108a6 | |||
58930c75e1 | |||
b56d691041 | |||
dd1b15e925 |
333
src/main.sh
333
src/main.sh
@@ -46,8 +46,12 @@ if [ "${1:-}" = "--decorate" ]; then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if [ "$MUSICDIR" ] && [ "${1:-}" = "--load-local" ]; then
|
||||
load_local || err "Failed to load local data"
|
||||
if [ "${1:-}" = "--reload" ]; then
|
||||
[ ! "${2:-}" ] && err "Path to decorated music is missing." && exit 1
|
||||
[ ! -d "$2" ] && err "Path does not point to a directory." && exit 1
|
||||
info "Reloading information of local music directory $2"
|
||||
load_local "$2" || err "Failed to load local data"
|
||||
info "Done"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
@@ -67,15 +71,69 @@ if [ "${1:-}" = "--list-artists" ]; then
|
||||
fi
|
||||
|
||||
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_queue_list "$tmplist"
|
||||
else
|
||||
mpv_play_list "$tmplist"
|
||||
fi
|
||||
rm -f "$tmplist"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if [ "${1:-}" = "--play-recording" ]; then
|
||||
echo "Playing recording $2" >>/tmp/foo
|
||||
if [ "${3:-}" ]; then
|
||||
mpv_queue_file "$2"
|
||||
else
|
||||
mpv_play_file "$2"
|
||||
fi
|
||||
exit 0
|
||||
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
|
||||
__preview_artist "$2"
|
||||
exit 0
|
||||
@@ -288,115 +346,46 @@ if [ "${1:-}" = "--internal-list-recordings" ]; then
|
||||
cut -d "$(printf '\t')" -f 2- |
|
||||
column -t -s "$(printf '\t')" -R 2,3,6 |
|
||||
sed 's| \+\([0-9a-f-]\+\):\(.*$\)$|\t\1\t\2|'
|
||||
if [ -f "$rectmp" ]; then
|
||||
if [ "${rectmp:-}" ] && [ -f "$rectmp" ]; then
|
||||
rm -f "$rectmp"
|
||||
fi
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if [ "${1:-}" = "--internal-list-local-artists" ]; then
|
||||
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 format_person="$AV_PERSON" \
|
||||
-v format_group="$AV_GROUP" \
|
||||
-v format_disambiguation="$AV_DISAMBIGUATION" \
|
||||
"$AWK_ARTISTS"
|
||||
cat "$LOCALDATA_ARTISTS_VIEW" 2>/dev/null
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if [ "${1:-}" = "--internal-list-local-releasegroups" ]; then
|
||||
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 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|'
|
||||
cat "$LOCALDATA_RELEASEGROUPS_VIEW" 2>/dev/null
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if [ "${1:-}" = "--internal-list-local-releases" ]; then
|
||||
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 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|'
|
||||
cat "$LOCALDATA_RELEASES_VIEW" 2>/dev/null
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if [ "${1:-}" = "--help" ]; then
|
||||
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 <path> Populate database with decorated local music from <path>
|
||||
EOF
|
||||
exit 0
|
||||
fi
|
||||
@@ -412,24 +401,27 @@ PIDFILE="$tmpdir/pid"
|
||||
trap 'rm -rf "$tmpdir"' EXIT INT
|
||||
export LOCKFILE RESULTS PIDFILE
|
||||
|
||||
if [ "${1:-}" = "--search-artist" ]; then
|
||||
if [ "${1:-}" = "--ni-search-artist" ]; then
|
||||
$0 --internal-search "artist" "$2"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if [ "${1:-}" = "--search-album" ]; then
|
||||
if [ "${1:-}" = "--ni-search-album" ]; then
|
||||
$0 --internal-search "releasegroup" "$2"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
case "${1:-}" in
|
||||
"" | "--artist" | "--releasegroup" | "--release") ;;
|
||||
"" | "--artist" | "--releasegroup" | "--release" | "--search-artist" | "--search-album" | "--albums" | "--artists") ;;
|
||||
*)
|
||||
err "Unknown option $1"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
# Start mpv
|
||||
mpv_start
|
||||
|
||||
while true; do
|
||||
case "${1:-}" in
|
||||
"--artist")
|
||||
@@ -449,7 +441,8 @@ while true; do
|
||||
--accept-nth="{2}" \
|
||||
--with-nth="{1}" \
|
||||
--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="alt-b:execute-silent:xdg-open 'https://musicbrainz.org/release-group/{r2}' &" \
|
||||
--bind="alt-1:change-query(!$secsymb ),alt-2:change-query($secsymb )" \
|
||||
@@ -463,7 +456,6 @@ while true; do
|
||||
[ "$lns" -eq 2 ] && [ "$key" = "ctrl-a" ] && set -- "--select-artist" "$(mb_releasegroup "$mid" | $JQ -r '."artist-credit"')"
|
||||
;;
|
||||
"--releasegroup")
|
||||
set -x
|
||||
title="$(mb_releasegroup "$2" |
|
||||
$JQ -r '.title')"
|
||||
artist="$(mb_releasegroup "$2" |
|
||||
@@ -482,9 +474,21 @@ while true; do
|
||||
--accept-nth="{2}" \
|
||||
--with-nth="{1}" \
|
||||
--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="enter:execute-silent:$0 --play-release {3}" \
|
||||
--bind="focus:transform:[ {3} ] && echo \"rebind:enter\" || echo \"unbind:enter\"" \
|
||||
--bind="enter:execute-silent:$0 --play-release {2} {3}" \
|
||||
--bind="alt-enter:execute-silent:$0 --play-release {2} {3} q" \
|
||||
--bind="alt-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 alt-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"
|
||||
@@ -514,8 +518,20 @@ while true; do
|
||||
--accept-nth="{2}" \
|
||||
--with-nth="{1}" \
|
||||
--expect="ctrl-h,ctrl-a" \
|
||||
--bind="alt-l:change-query($FORMAT_LOCAL )" \
|
||||
--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="alt-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 alt-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="ctrl-d:half-page-down,ctrl-u:half-page-up"
|
||||
)
|
||||
@@ -525,6 +541,11 @@ while true; do
|
||||
[ "$lns" -eq 2 ] && [ "$key" = "ctrl-h" ] && set -- "--releasegroup" "$(mb_release "$2" | $JQ -r -c '."release-group".id')"
|
||||
[ "$lns" -eq 2 ] && [ "$key" = "ctrl-a" ] && set -- "--select-artist" "$(mb_release "$2" | $JQ -r -c ".media[].tracks[] | select(.id==\"$mid\") | .\"artist-credit\"")"
|
||||
;;
|
||||
"--playlist")
|
||||
count=$(mpv_playlist_count)
|
||||
echo "Playlist: count=$count" >>/tmp/foo
|
||||
set -- ""
|
||||
;;
|
||||
"--select-artist")
|
||||
tput rmcup
|
||||
sel=$(
|
||||
@@ -532,10 +553,14 @@ while true; do
|
||||
$JQ -r 'map([.artist.id, .artist.type, .name] | join("\t")) | join("\n")' |
|
||||
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" |
|
||||
column -t -s "$(printf '\t')" |
|
||||
sed 's| \+\([0-9a-f-]\+\)$|\t\1|' |
|
||||
$FZF \
|
||||
--no-clear \
|
||||
-1 \
|
||||
@@ -547,12 +572,13 @@ while true; do
|
||||
--delimiter="\t" \
|
||||
--prompt="$SEARCH_PROMPT" \
|
||||
--margin="5%,20%" \
|
||||
--bind="alt-l:change-query($FORMAT_LOCAL )" \
|
||||
--accept-nth="{2}" \
|
||||
--with-nth="{1}"
|
||||
)
|
||||
[ "$sel" ] && set -- "--artist" "$sel"
|
||||
;;
|
||||
"--search-releasegroup")
|
||||
"--search-album")
|
||||
sel=$(
|
||||
printf "" |
|
||||
$FZF \
|
||||
@@ -565,11 +591,15 @@ while true; do
|
||||
--delimiter="\t" \
|
||||
--prompt="$SEARCH_PROMPT" \
|
||||
--info="inline-right" \
|
||||
--info-command="echo \"Search album\"" \
|
||||
--info-command="echo \"Search album on MusicBrainz\"" \
|
||||
--color='input-fg:#ba478f' \
|
||||
--accept-nth="{2}" \
|
||||
--with-nth="{1}" \
|
||||
--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-d:half-page-down,ctrl-u:half-page-up" \
|
||||
--bind="alt-b:execute-silent:xdg-open 'https://musicbrainz.org/release-group/{r2}' &" \
|
||||
@@ -581,9 +611,10 @@ while true; do
|
||||
[ "$key" = "ctrl-c" ] && tput rmcup && exit 0
|
||||
[ "$key" = "ctrl-q" ] && tput rmcup && exit 0
|
||||
[ "$key" = "tab" ] && set -- "--search-artist"
|
||||
[ "$key" = "ctrl-/" ] && set -- "--albums"
|
||||
[ "$lns" -eq 2 ] && [ ! "$key" ] && [ "$mid" ] && set -- "--releasegroup" "$mid"
|
||||
;;
|
||||
*)
|
||||
"--search-artist")
|
||||
sel=$(
|
||||
printf "" |
|
||||
$FZF \
|
||||
@@ -596,13 +627,17 @@ while true; do
|
||||
--delimiter="\t" \
|
||||
--prompt="$SEARCH_PROMPT" \
|
||||
--info="inline-right" \
|
||||
--info-command="echo \"Search music artist\"" \
|
||||
--info-command="echo \"Search music artist on MusicBrainz\"" \
|
||||
--color='input-fg:#ba478f' \
|
||||
--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" \
|
||||
--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-d:half-page-down,ctrl-u:half-page-up" \
|
||||
--bind="down:preview-half-page-down,up:preview-half-page-up" \
|
||||
@@ -614,7 +649,89 @@ while true; do
|
||||
mid=$(echo "$sel" | head -2 | tail -1)
|
||||
[ "$key" = "ctrl-c" ] && 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="alt-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 alt-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"
|
||||
;;
|
||||
esac
|
||||
|
229
src/sh/api.sh
229
src/sh/api.sh
@@ -1,93 +1,216 @@
|
||||
MB_MAX_RETRIES=10
|
||||
MB_BROWSE_STEPS=100
|
||||
USER_AGENT="$APP_NAME/$APP_VERSION ($APP_WEBSITE)"
|
||||
SLEEP_ON_ERROR=1
|
||||
export MB_BROWSE_STEPS
|
||||
|
||||
api_mb_artist() {
|
||||
$CURL \
|
||||
--get \
|
||||
--data fmt=json \
|
||||
--data inc="url-rels+artist-rels+aliases" \
|
||||
-A "$APP_NAME/$APP_VERSION ($APP_WEBSITE)" \
|
||||
"https://musicbrainz.org/ws/2/artist/$1"
|
||||
__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 \
|
||||
--output "$tmpout" \
|
||||
--get \
|
||||
--data fmt=json \
|
||||
--data inc="url-rels+artist-rels+aliases" \
|
||||
-A "$USER_AGENT" \
|
||||
"https://musicbrainz.org/ws/2/artist/$2"
|
||||
;;
|
||||
"releasegroup")
|
||||
$CURL \
|
||||
--output "$tmpout" \
|
||||
--get \
|
||||
--data fmt=json \
|
||||
--data inc=artist-credits \
|
||||
-A "$USER_AGENT" \
|
||||
"https://musicbrainz.org/ws/2/release-group/$2"
|
||||
;;
|
||||
"release")
|
||||
$CURL \
|
||||
--output "$tmpout" \
|
||||
--get \
|
||||
--data fmt=json \
|
||||
--data inc="recordings+artist-credits+release-groups+labels" \
|
||||
-A "$USER_AGENT" \
|
||||
"https://musicbrainz.org/ws/2/release/$2"
|
||||
;;
|
||||
"browse-artist-releasegroups")
|
||||
$CURL \
|
||||
--output "$tmpout" \
|
||||
--get \
|
||||
--data fmt=json \
|
||||
--data inc=artist-credits \
|
||||
--data limit="$MB_BROWSE_STEPS" \
|
||||
--data offset="$3" \
|
||||
--data artist="$2" \
|
||||
-A "$USER_AGENT" \
|
||||
"https://musicbrainz.org/ws/2/release-group"
|
||||
;;
|
||||
"browse-releasegroup-releases")
|
||||
$CURL \
|
||||
--output "$tmpout" \
|
||||
--get \
|
||||
--data fmt=json \
|
||||
--data inc="artist-credits+labels+media+release-groups" \
|
||||
--data limit="$MB_BROWSE_STEPS" \
|
||||
--data offset="$3" \
|
||||
--data release-group="$2" \
|
||||
-A "$USER_AGENT" \
|
||||
"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() {
|
||||
$CURL \
|
||||
--get \
|
||||
--data fmt=json \
|
||||
--data inc=artist-credits \
|
||||
-A "$APP_NAME/$APP_VERSION ($APP_WEBSITE)" \
|
||||
"https://musicbrainz.org/ws/2/release-group/$1"
|
||||
__api_mb "releasegroup" "$1"
|
||||
}
|
||||
|
||||
api_mb_release() {
|
||||
$CURL \
|
||||
--get \
|
||||
--data fmt=json \
|
||||
--data inc="recordings+artist-credits+release-groups+labels" \
|
||||
-A "$APP_NAME/$APP_VERSION ($APP_WEBSITE)" \
|
||||
"https://musicbrainz.org/ws/2/release/$1"
|
||||
__api_mb "release" "$1"
|
||||
}
|
||||
|
||||
api_mb_browse_artist_releasegroups() {
|
||||
$CURL \
|
||||
--get \
|
||||
--data fmt=json \
|
||||
--data inc=artist-credits \
|
||||
--data limit="$MB_BROWSE_STEPS" \
|
||||
--data offset="${2:-0}" \
|
||||
--data artist="$1" \
|
||||
-A "$APP_NAME/$APP_VERSION ($APP_WEBSITE)" \
|
||||
"https://musicbrainz.org/ws/2/release-group"
|
||||
__api_mb "browse-artist-releasegroups" "$1" "${2:-0}"
|
||||
}
|
||||
|
||||
api_mb_browse_releasegroup_releases() {
|
||||
$CURL \
|
||||
--get \
|
||||
--data fmt=json \
|
||||
--data inc="artist-credits+labels+media+release-groups" \
|
||||
--data limit="$MB_BROWSE_STEPS" \
|
||||
--data offset="${2:-0}" \
|
||||
--data release-group="$1" \
|
||||
-A "$APP_NAME/$APP_VERSION ($APP_WEBSITE)" \
|
||||
"https://musicbrainz.org/ws/2/release"
|
||||
__api_mb "browse-releasegroup-releases" "$1" "${2:-0}"
|
||||
}
|
||||
|
||||
# Argument: Search string
|
||||
api_mb_search_artist() {
|
||||
$CURL \
|
||||
--get \
|
||||
--data fmt=json \
|
||||
--data-urlencode query="$1" \
|
||||
-A "$APP_NAME/$APP_VERSION ($APP_WEBSITE)" \
|
||||
"https://musicbrainz.org/ws/2/artist"
|
||||
__api_mb "search-artist" "$1"
|
||||
}
|
||||
|
||||
api_mb_search_releasegroup() {
|
||||
$CURL \
|
||||
--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_mb "search-releasegroup" "$1"
|
||||
}
|
||||
|
||||
api_discogs_artist() {
|
||||
$CURL \
|
||||
--get \
|
||||
-A "$APP_NAME/$APP_VERSION ($APP_WEBSITE)" \
|
||||
-A "$USER_AGENT" \
|
||||
"https://api.discogs.com/artists/$1"
|
||||
}
|
||||
|
||||
api_wikidata_sitelinks() {
|
||||
$CURL \
|
||||
--get \
|
||||
-A "$APP_NAME/$APP_VERSION ($APP_WEBSITE)" \
|
||||
-A "$USER_AGENT" \
|
||||
"https://www.wikidata.org/w/rest.php/wikibase/v1/entities/items/$1/sitelinks"
|
||||
}
|
||||
|
||||
api_wikipedia_en_summary() {
|
||||
$CURL \
|
||||
--get \
|
||||
-A "$APP_NAME/$APP_VERSION ($APP_WEBSITE)" \
|
||||
-A "$USER_AGENT" \
|
||||
"https://en.wikipedia.org/api/rest_v1/page/summary/$1"
|
||||
}
|
||||
|
@@ -1,7 +1,4 @@
|
||||
if [ "${CONFIGFILE:-}" ]; then
|
||||
[ ! -f "$CONFIGFILE" ] && err "Configuration $CONFIGFILE not found." && exit 1
|
||||
. "$CONFIGFLIE"
|
||||
[ ! "${MUSICDIR:-}" ] && err "MUSICDIR configuration not set." && exit 1
|
||||
fi
|
||||
[ "${MUSICDIR:-}" ] && [ ! -d "${MUSICDIR:-}" ] && err "The specified path ${MUSICDIR:-} is not a directory." && exit 1
|
||||
DECORATION_FILENAME=${DECORATION_FILENAME:-"mbid.json"}
|
||||
|
117
src/sh/local.sh
117
src/sh/local.sh
@@ -75,17 +75,17 @@ __batch_load_missing() {
|
||||
while IFS= read -r mbid; do
|
||||
case "$1" in
|
||||
"$TYPE_ARTIST")
|
||||
mb_artist "$mbid" >/dev/null
|
||||
name=$(mb_artist "$mbid" | $JQ -r ".name")
|
||||
;;
|
||||
"$TYPE_RELEASEGROUP")
|
||||
mb_releasegroup "$mbid" >/dev/null
|
||||
name=$(mb_releasegroup "$mbid" | $JQ -r ".title")
|
||||
;;
|
||||
"$TYPE_RELEASE")
|
||||
mb_release "$mbid" >/dev/null
|
||||
name=$(mb_release "$mbid" | $JQ -r ".title")
|
||||
;;
|
||||
esac
|
||||
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
|
||||
done <"$tmpf"
|
||||
printf "\n"
|
||||
@@ -98,13 +98,19 @@ LOCALDATADIR="$HOME/.cache/$APP_NAME/local"
|
||||
LOCALDATA_ARTISTS="$LOCALDATADIR/artists"
|
||||
LOCALDATA_RELEASEGROUPS="$LOCALDATADIR/releasegroups"
|
||||
LOCALDATA_RELEASES="$LOCALDATADIR/releases"
|
||||
LOCALDATA_ARTISTS_VIEW="$LOCALDATADIR/artists_view"
|
||||
LOCALDATA_RELEASEGROUPS_VIEW="$LOCALDATADIR/releasegroups_view"
|
||||
LOCALDATA_RELEASES_VIEW="$LOCALDATADIR/releases_view"
|
||||
DECORATION_FILENAME=${DECORATION_FILENAME:-"mbid.json"}
|
||||
|
||||
# Load local music
|
||||
# argument $1: path to decorated music files
|
||||
load_local() {
|
||||
[ -d "$LOCALDATADIR" ] || mkdir -p "$LOCALDATADIR"
|
||||
tmpreleases=$(mktemp)
|
||||
[ -f "$tmpreleases" ] || exit 1
|
||||
find "$MUSICDIR" -type f -name "$DECORATION_FILENAME" -print0 |
|
||||
info "Locating and parsing decoration files ($DECORATION_FILENAME)"
|
||||
find "$1" -type f -name "$DECORATION_FILENAME" -print0 |
|
||||
xargs -0 -P 4 $JQ -r '.releaseid+"\t"+input_filename' |
|
||||
tee "$LOCALDATA_RELEASES" |
|
||||
cut -d "$(printf '\t')" -f 1 >"$tmpreleases"
|
||||
@@ -122,6 +128,107 @@ load_local() {
|
||||
__batch_load_missing "$TYPE_RELEASEGROUP" "$LOCALDATA_RELEASEGROUPS"
|
||||
__batch_load_missing "$TYPE_ARTIST" "$LOCALDATA_ARTISTS"
|
||||
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
|
||||
|
@@ -23,8 +23,8 @@ AV_GROUP="${AV_GROUP:-"🧑🤝🧑 $CARTIST<<name>>$OFF"}"
|
||||
AV_DISAMBIGUATION="${AV_DISAMBIGUATION:-"$CDISAMB(<<disambiguation>>)$OFF"}"
|
||||
|
||||
# Release group view
|
||||
RGV_RELEASE="${RGV_RELEASE:-"${CTITLE}<<title>>"}"
|
||||
RGV_RELEASE_W_ARTIST="${RGV_RELEASE_W_ARTIST:-"${CTITLE}<<title>> — ${CARTIST}<<artist>>"}"
|
||||
RGV_RELEASE="${RGV_RELEASE:-"${CTITLE}<<title>>$OFF"}"
|
||||
RGV_RELEASE_W_ARTIST="${RGV_RELEASE_W_ARTIST:-"${CTITLE}<<title>>$OFF — ${CARTIST}<<artist>>$OFF"}"
|
||||
RGV_YEAR="${RGV_YEAR:-"${CYEAR}(<<year>>)$OFF"}"
|
||||
|
||||
# Types
|
||||
@@ -34,7 +34,7 @@ FORMAT_TYPE_SINGLE="${FORMAT_TYPE_SINGLE:-"SI 🎶"}"
|
||||
FORMAT_TYPE_BROADCAST="${FORMAT_TYPE_BROADCAST:-"BR 📻"}"
|
||||
FORMAT_TYPE_OTHER="${FORMAT_TYPE_OTHER:-"OT ❔"}"
|
||||
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_SOUNDTRACK="${FORMAT_TYPE_SECONDARY_SOUNDTRACK:-"🎬 soundtrack"}"
|
||||
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"}"
|
||||
|
||||
# Release view
|
||||
RV_FORMAT="<<status>>\t${CXXX}<<tracks>> tracks\t<<media>>\t${CYEAR}<<year>>\t<<country>>\t${CARTIST}<<label>>$OFF"
|
||||
RV_TITLE_ARTIST="${FAINT}as ${CTITLE}<<title>> by ${FAINT}${CARTIST}<<artist>>$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>>$OFF by ${FAINT}${CARTIST}<<artist>>$OFF"
|
||||
RV_TITLE="${FAINT}as ${CTITLE}<<title>>$OFF"
|
||||
RV_ARTIST="${FAINT}by ${CARTIST}<<artist>>$OFF"
|
||||
|
||||
# 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"
|
||||
|
@@ -21,3 +21,19 @@ else
|
||||
exit 1
|
||||
fi
|
||||
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
|
||||
|
Reference in New Issue
Block a user