Compare commits
58 Commits
6731d47b49
...
34628fc9b0
Author | SHA1 | Date | |
---|---|---|---|
34628fc9b0 | |||
1463d292f2 | |||
ea9ff0501d | |||
a1ae20fa82 | |||
9aa1413a51 | |||
f4594ca492 | |||
3395f8e068 | |||
210cfd01f7 | |||
30765b7347 | |||
053b594608 | |||
30b3a44a98 | |||
0db4b7069c | |||
c46cd9a57f | |||
6549c3f022 | |||
91343b4b9f | |||
fac25108a6 | |||
58930c75e1 | |||
b56d691041 | |||
dd1b15e925 | |||
7826cb471c | |||
38c7ccea48 | |||
6fef0dcbae | |||
fc39a9a25d | |||
232877b241 | |||
5335332ab0 | |||
a48a92ca58 | |||
f93b85b55e | |||
54934f1eab | |||
c29d36a56e | |||
6776d817a4 | |||
d8b152146b | |||
5f91dbc2bb | |||
d525342187 | |||
bf3a26a4fd | |||
be23ea461e | |||
deaeb23a92 | |||
723fa58763 | |||
eae83d801f | |||
bde3e5a48b | |||
7f94ab9646 | |||
828a69d65e | |||
be32c2e2d6 | |||
7381d2432f | |||
d8a01e1079 | |||
c5c0e96942 | |||
d0e9ac3cd2 | |||
935c9b3b52 | |||
fcc9f5d252 | |||
e6b485e5ee | |||
eba10d6322 | |||
7eb9d6633f | |||
64afff2110 | |||
3e3622b5be | |||
8bbc57ffb2 | |||
5bfb76fadb | |||
5bc17bccc9 | |||
7b83b55f69 | |||
a70d0cd5fe |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1 +1,2 @@
|
|||||||
|
demo
|
||||||
muf
|
muf
|
||||||
|
@@ -1,11 +1,20 @@
|
|||||||
BEGIN { OFS="\t" }
|
BEGIN {
|
||||||
$2 == "Group" { name = format_group }
|
OFS="\t"
|
||||||
$2 != "Group" { name = format_person }
|
local_artists[0] = 0
|
||||||
|
delete local_artists[0]
|
||||||
|
if (file_local_artists) {
|
||||||
|
while ((getline < file_local_artists) == 1)
|
||||||
|
local_artists[$1] = 1
|
||||||
|
close(file_local_artists)
|
||||||
|
}
|
||||||
|
}
|
||||||
{
|
{
|
||||||
gsub("&", "\\\\&")
|
gsub("&", "\\\\&")
|
||||||
|
name = $2 == "Group" ? format_group : format_person
|
||||||
|
l = local_artists[$1] ? format_local : ""
|
||||||
if ($4)
|
if ($4)
|
||||||
name = name " " format_disambiguation
|
name = name " " format_disambiguation
|
||||||
sub("<<disambiguation>>", $4, name)
|
sub("<<disambiguation>>", $4, name)
|
||||||
sub("<<name>>", $3, name)
|
sub("<<name>>", $3, name)
|
||||||
print $1, name
|
print l, name, $1
|
||||||
}
|
}
|
||||||
|
41
src/awk/recordings.awk
Normal file
41
src/awk/recordings.awk
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
BEGIN {
|
||||||
|
OFS="\t"
|
||||||
|
local_recordings[0] = 0
|
||||||
|
delete local_recordings[0]
|
||||||
|
if (file_local_recordings) {
|
||||||
|
while ((getline < file_local_recordings) == 1)
|
||||||
|
local_recordings[$1] = $2
|
||||||
|
close(file_local_recordings)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
{
|
||||||
|
gsub("&", "\\\\&")
|
||||||
|
id = $1
|
||||||
|
med = $2
|
||||||
|
nr = $3
|
||||||
|
dur = $4
|
||||||
|
title = $5
|
||||||
|
artist = $6
|
||||||
|
# Parse duration
|
||||||
|
if (dur) {
|
||||||
|
dur = int(dur / 1000)
|
||||||
|
dh = int(dur / 3600)
|
||||||
|
dur = dur % 3600
|
||||||
|
dm = int(dur / 60)
|
||||||
|
ds = dur % 60
|
||||||
|
if (ds <= 9)
|
||||||
|
ds = "0"ds
|
||||||
|
dur = dh ? dh":"dm":"ds : dm":"ds
|
||||||
|
} else {
|
||||||
|
dur = "??:??"
|
||||||
|
}
|
||||||
|
line = format
|
||||||
|
sub("<<med>>", med, line)
|
||||||
|
sub("<<nr>>", nr, line)
|
||||||
|
sub("<<title>>", title, line)
|
||||||
|
sub("<<artist>>", artist, line)
|
||||||
|
sub("<<duration>>", dur, line)
|
||||||
|
l = local_recordings[id] ? format_local : ""
|
||||||
|
sortk = med" "nr
|
||||||
|
print sortk, l, line, id ":" local_recordings[id]
|
||||||
|
}
|
@@ -1,5 +1,13 @@
|
|||||||
BEGIN { OFS="\t" }
|
BEGIN {
|
||||||
|
OFS="\t"
|
||||||
|
local_releasegroups[0] = 0
|
||||||
|
delete local_releasegroups[0]
|
||||||
|
if (file_local_releasegroups) {
|
||||||
|
while ((getline < file_local_releasegroups) == 1)
|
||||||
|
local_releasegroups[$1] = 1
|
||||||
|
close(file_local_releasegroups)
|
||||||
|
}
|
||||||
|
}
|
||||||
{
|
{
|
||||||
line_type=""
|
line_type=""
|
||||||
line_sectype=""
|
line_sectype=""
|
||||||
@@ -12,6 +20,7 @@ BEGIN { OFS="\t" }
|
|||||||
title = $5
|
title = $5
|
||||||
artistcredit = $6
|
artistcredit = $6
|
||||||
line_release = artist == artistcredit ? format_release : format_release_w_artist
|
line_release = artist == artistcredit ? format_release : format_release_w_artist
|
||||||
|
l = local_releasegroups[$1] ? format_local : ""
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case "Single": line_type=format_single; break
|
case "Single": line_type=format_single; break
|
||||||
case "Album": line_type=format_album; break
|
case "Album": line_type=format_album; break
|
||||||
@@ -48,6 +57,6 @@ BEGIN { OFS="\t" }
|
|||||||
sub("<<artist>>", artistcredit, line_release)
|
sub("<<artist>>", artistcredit, line_release)
|
||||||
line_year = year ? format_year : ""
|
line_year = year ? format_year : ""
|
||||||
sub("<<year>>", year, line_year)
|
sub("<<year>>", year, line_year)
|
||||||
sort = year ? year : 0
|
sortk = year ? year : 0
|
||||||
print line_type, line_release, line_year, line_sectype, sort, id
|
print sortk, l, line_type, line_release, line_year, line_sectype, id
|
||||||
}
|
}
|
||||||
|
@@ -1,57 +1,57 @@
|
|||||||
BEGIN {
|
BEGIN {
|
||||||
OFS="\t"
|
OFS="\t"
|
||||||
year[0] = 0; del year[0]
|
local_releases[0] = 0
|
||||||
title[0] = 0; del title[0]
|
delete local_releases[0]
|
||||||
type[0] = 0; del type[0]
|
if (file_local_releases) {
|
||||||
id[0] = 0; del id[0]
|
while ((getline < file_local_releases) == 1)
|
||||||
score[0] = 0; del score[0]
|
local_releases[$1] = $2
|
||||||
|
close(file_local_releases)
|
||||||
}
|
}
|
||||||
|
|
||||||
function get_score(rgdt, rgti, dt, ti, qy, res) {
|
|
||||||
res = 0
|
|
||||||
if (rgdt == dt)
|
|
||||||
res = res + 5
|
|
||||||
if (rgti == ti)
|
|
||||||
res = res + 5
|
|
||||||
if (qy == "normal" || qy == "unknown")
|
|
||||||
res = res + 1
|
|
||||||
if (qy == "high")
|
|
||||||
res = res + 2
|
|
||||||
return res
|
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
gsub("&", "\\\\&")
|
id = $1
|
||||||
rgmi = $1 # Release Group ID
|
status = $2
|
||||||
rgty = $2 # Release Group Type
|
year = substr($3, 1, 4) + 0
|
||||||
rgdt = substr($3, 1, 4) + 0 # Release Group Year
|
year = year == 0 ? "" : year
|
||||||
rgti = $4 # Release Group Title
|
covercount = $4
|
||||||
mi = $5 # MusicBrainz Release ID
|
label = $5
|
||||||
qy = $6 # Release Quality
|
trackcnt = $6
|
||||||
dt = substr($7, 1, 4) + 0 # Release Year
|
media = $7
|
||||||
ti = $8 # Release Title
|
country = $8
|
||||||
s = get_score(rgdt, rgti, dt, ti, qy)
|
title = $9
|
||||||
if (score[rgmi] < s) {
|
artist = $10
|
||||||
score[rgmi] = s
|
switch (status) {
|
||||||
year[rgmi] = dt
|
case "Official": line_status = release_official; break
|
||||||
title[rgmi] = ti
|
case "Promotion": line_status = release_promotion; break
|
||||||
type[rgmi] = rgty
|
case "Bootleg": line_status = release_bootleg; break
|
||||||
id[rgmi] = mi
|
case "Pseudo-release": line_status = release_pseudo; break
|
||||||
|
case "Withdrawn": line_status = release_withdrawn; break
|
||||||
|
case "Expunged": line_status = release_expunged; break
|
||||||
|
case "Cancelled": line_status = release_cancelled; break
|
||||||
|
default: line_status = ""
|
||||||
}
|
}
|
||||||
}
|
line = release_format
|
||||||
|
if (artist != rg_artist && title != rg_title)
|
||||||
END {
|
line = line "\t" release_format_title_artist
|
||||||
for (rgmi in id) {
|
else if (artist != rg_artist && title == rg_title)
|
||||||
if (type[rgmi] == "Single")
|
line = line "\t" release_format_artist
|
||||||
line = format_single
|
else if (artist == rg_artist && title != rg_title)
|
||||||
else if (type[rgmi] == "Album")
|
line = line "\t" release_format_title
|
||||||
line = format_album
|
|
||||||
else if (type[rgmi] == "EP")
|
|
||||||
line = format_ep
|
|
||||||
else
|
else
|
||||||
line = format_album
|
line = line "\t"
|
||||||
sub("<<year>>", dt, line)
|
|
||||||
sub("<<title>>", ti, line)
|
sub("<<status>>", line_status, line)
|
||||||
print mi, line
|
sub("<<year>>", year, line)
|
||||||
}
|
sub("<<tracks>>", trackcnt, line)
|
||||||
|
sub("<<media>>", media, line)
|
||||||
|
gsub("&", "\\\\&", label)
|
||||||
|
sub("<<label>>", label, line)
|
||||||
|
gsub("&", "\\\\&", titel)
|
||||||
|
sub("<<title>>", title, line)
|
||||||
|
gsub("&", "\\\\&", artist)
|
||||||
|
sub("<<artist>>", artist, line)
|
||||||
|
sub("<<country>>", country, line)
|
||||||
|
sortk = year ? year : 0
|
||||||
|
l = local_releases[id] ? format_local : ""
|
||||||
|
print sortk, l, line, id ":" local_releases[id]
|
||||||
}
|
}
|
||||||
|
564
src/main.sh
564
src/main.sh
@@ -8,9 +8,15 @@ set -eu
|
|||||||
# Load helper methods
|
# Load helper methods
|
||||||
. "sh/helper.sh"
|
. "sh/helper.sh"
|
||||||
|
|
||||||
|
# Load configuration
|
||||||
|
. "sh/config.sh"
|
||||||
|
|
||||||
# Load theme
|
# Load theme
|
||||||
. "sh/theme.sh"
|
. "sh/theme.sh"
|
||||||
|
|
||||||
|
# Load keys
|
||||||
|
. "sh/keys.sh"
|
||||||
|
|
||||||
# Load AWK scripts
|
# Load AWK scripts
|
||||||
. "sh/awk.sh"
|
. "sh/awk.sh"
|
||||||
|
|
||||||
@@ -29,33 +35,139 @@ set -eu
|
|||||||
# Load MusicBrainz wrappers
|
# Load MusicBrainz wrappers
|
||||||
. "sh/mb.sh"
|
. "sh/mb.sh"
|
||||||
|
|
||||||
if [ "${1:-}" = "--internal-preview-artist" ]; then
|
# Load local file handling
|
||||||
__preview_artist "$2"
|
. "sh/local.sh"
|
||||||
|
|
||||||
|
# Load list-generating methods
|
||||||
|
. "sh/lists.sh"
|
||||||
|
|
||||||
|
if [ "${1:-}" = "--fzf-reload" ]; then
|
||||||
|
mode=$(cut -d "#" -f 1 "$MODEFILE")
|
||||||
|
args=$(cut -d "#" -f 2- "$MODEFILE")
|
||||||
|
case "$mode" in
|
||||||
|
"$MODE_ARTIST")
|
||||||
|
list_releasegroups "$args"
|
||||||
|
;;
|
||||||
|
"$MODE_RELEASEGROUP")
|
||||||
|
list_releases "$args"
|
||||||
|
;;
|
||||||
|
"$MODE_RELEASE")
|
||||||
|
list_recordings "$args"
|
||||||
|
;;
|
||||||
|
"$MODE_LIST_ARTISTS")
|
||||||
|
list_local_artists
|
||||||
|
;;
|
||||||
|
"$MODE_LIST_ALBUMS")
|
||||||
|
list_local_releasegroups
|
||||||
|
;;
|
||||||
|
esac
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ "${1:-}" = "--internal-reload" ]; then
|
if [ "${1:-}" = "--fzf-load" ]; then
|
||||||
|
mode=$(cut -d "#" -f 1 "$MODEFILE")
|
||||||
|
args=$(cut -d "#" -f 2- "$MODEFILE")
|
||||||
|
case "$mode" in
|
||||||
|
"$MODE_ARTIST")
|
||||||
|
secsymb="$(printf "$FORMAT_TYPE_HAS_SECONDARY" "")"
|
||||||
|
QUERY="$(printf "!%s " "$secsymb")"
|
||||||
|
name="$(mb_artist "$args" | $JQ -r '.name')"
|
||||||
|
PROMPT=$(printf "$ARTIST_PROMPT" "$name")
|
||||||
|
;;
|
||||||
|
"$MODE_RELEASEGROUP")
|
||||||
|
title="$(mb_releasegroup "$args" |
|
||||||
|
$JQ -r '.title')"
|
||||||
|
artist="$(mb_releasegroup "$args" |
|
||||||
|
$JQ -r '."artist-credit" | map(([.name, .joinphrase]|join(""))) | join("")')"
|
||||||
|
PROMPT=$(printf "$FULL_PROMPT" "$artist" "$title")
|
||||||
|
;;
|
||||||
|
"$MODE_RELEASE")
|
||||||
|
title="$(mb_release "$args" |
|
||||||
|
$JQ -r '.title')"
|
||||||
|
artist="$(mb_release "$args" |
|
||||||
|
$JQ -r '."artist-credit" | map(([.name, .joinphrase]|join(""))) | join("")')"
|
||||||
|
PROMPT=$(printf "$FULL_PROMPT" "$artist" "$title")
|
||||||
|
;;
|
||||||
|
"$MODE_SEARCH_ARTIST")
|
||||||
|
ENABLE_CHANGE=1
|
||||||
|
DISABLE_SEARCH=1
|
||||||
|
SHOW_PREVIEW=1
|
||||||
|
;;
|
||||||
|
"$MODE_SEARCH_ALBUM")
|
||||||
|
ENABLE_CHANGE=1
|
||||||
|
DISABLE_SEARCH=1
|
||||||
|
;;
|
||||||
|
"$MODE_LIST_ARTISTS")
|
||||||
|
SHOW_PREVIEW=1
|
||||||
|
;;
|
||||||
|
"$MODE_LIST_ALBUMS") ;;
|
||||||
|
esac
|
||||||
|
printf "+change-query(%s)" "${QUERY:-}"
|
||||||
|
printf "+change-prompt(%s)" "${PROMPT:-"$SEARCH_PROMPT"}"
|
||||||
|
[ "${DISABLE_SEARCH:-}" ] && printf "+disable-search" || printf "+enable-search"
|
||||||
|
[ "${SHOW_PREVIEW:-}" ] && printf "+show-preview" || printf "+hide-preview"
|
||||||
|
[ "${ENABLE_CHANGE:-}" ] && printf "+rebind(change)" || printf "+unbind(change)"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "${1:-}" = "--fzf-info" ]; then
|
||||||
|
mode=$(cut -d "#" -f 1 "$MODEFILE")
|
||||||
|
args=$(cut -d "#" -f 2- "$MODEFILE")
|
||||||
|
case "$mode" in
|
||||||
|
"$MODE_SEARCH_ARTIST")
|
||||||
|
echo "Search music artist on MusicBrainz"
|
||||||
|
;;
|
||||||
|
"$MODE_SEARCH_ALBUM")
|
||||||
|
echo "Search album on MusicBrainz"
|
||||||
|
;;
|
||||||
|
"$MODE_LIST_ARTISTS")
|
||||||
|
echo "Search artists"
|
||||||
|
;;
|
||||||
|
"$MODE_LIST_ALBUMS")
|
||||||
|
echo "Search albums"
|
||||||
|
;;
|
||||||
|
"$MODE_SELECT_ARTIST")
|
||||||
|
echo "Select artist (WE SHOULDNT SEE THIS; THIS IS A BUG!)"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
if [ "$FZF_KEY" ]; then
|
||||||
|
printf "[last key: %s] %s/%s" "$FZF_KEY" "$FZF_MATCH_COUNT" "$FZF_TOTAL_COUNT"
|
||||||
|
else
|
||||||
|
printf "%s/%s" "$FZF_MATCH_COUNT" "$FZF_TOTAL_COUNT"
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "${1:-}" = "--fzf-change-reload" ]; then
|
||||||
|
# Wait for async. process to terminate
|
||||||
sleep 1
|
sleep 1
|
||||||
while [ -f "$LOCKFILE" ]; do
|
while [ -f "$LOCKFILE" ]; do
|
||||||
sleep 1
|
sleep 1
|
||||||
done
|
done
|
||||||
cat "$RESULTS"
|
# Show results
|
||||||
|
column -t -s "$(printf '\t')" "$RESULTS" |
|
||||||
|
sed 's| \+\([0-9a-f-]\+\)$|\t\1|'
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ "${1:-}" = "--internal-search" ]; then
|
if [ "${1:-}" = "--fzf-change" ]; then
|
||||||
printf "" >"$RESULTS"
|
# Kill any running search
|
||||||
if [ -f "$PIDFILE" ]; then
|
if [ -f "$PIDFILE" ]; then
|
||||||
pid=$(cat "$PIDFILE")
|
pid=$(cat "$PIDFILE")
|
||||||
rm -f "$PIDFILE"
|
rm -f "$PIDFILE"
|
||||||
kill -9 "$pid" >/dev/null 2>&1 || true
|
kill -9 "$pid" >/dev/null 2>&1 || true
|
||||||
fi
|
fi
|
||||||
[ ! "${2}" ] && exit 0
|
# Stop, if no search string is given
|
||||||
# Save current pid
|
[ "$FZF_QUERY" ] || exit 0
|
||||||
|
# Store PID of current process
|
||||||
echo "$$" >"$PIDFILE"
|
echo "$$" >"$PIDFILE"
|
||||||
touch "$LOCKFILE"
|
touch "$LOCKFILE"
|
||||||
sleep 1
|
sleep 1
|
||||||
__api_mb_search_artists "$2" |
|
mode=$(cut -d "#" -f 1 "$MODEFILE")
|
||||||
|
if [ "$mode" = "$MODE_SEARCH_ARTIST" ]; then
|
||||||
|
api_mb_search_artist "$FZF_QUERY" |
|
||||||
$JQ -r '.artists[] | [
|
$JQ -r '.artists[] | [
|
||||||
.id,
|
.id,
|
||||||
.type,
|
.type,
|
||||||
@@ -66,41 +178,29 @@ if [ "${1:-}" = "--internal-search" ]; then
|
|||||||
] | join("\t")' |
|
] | join("\t")' |
|
||||||
awk \
|
awk \
|
||||||
-F "\t" \
|
-F "\t" \
|
||||||
-v format_person="$FORMAT_PERSON" \
|
-v file_local_artists="${LOCALDATA_ARTISTS:-}" \
|
||||||
-v format_group="$FORMAT_GROUP" \
|
-v format_person="$AV_PERSON" \
|
||||||
-v format_disambiguation="$FORMAT_DISAMBIGUATION" \
|
-v format_group="$AV_GROUP" \
|
||||||
"$AWK_ARTISTS" |
|
-v format_disambiguation="$AV_DISAMBIGUATION" \
|
||||||
tee "$RESULTS" ||
|
-v format_local="$FORMAT_LOCAL" \
|
||||||
|
"$AWK_ARTISTS" >"$RESULTS" ||
|
||||||
true
|
true
|
||||||
rm -f "$LOCKFILE" "$PIDFILE"
|
else
|
||||||
exit 0
|
api_mb_search_releasegroup "$FZF_QUERY" |
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "${1:-}" = "--internal-list-releases-fresh" ]; then
|
|
||||||
artistid="$2"
|
|
||||||
cache_delete_artist "$artistid"
|
|
||||||
shift 2
|
|
||||||
set -- "--internal-list-releases" "$artistid"
|
|
||||||
mb_artist "$artistid" >/dev/null
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "${1:-}" = "--internal-list-releases" ]; then
|
|
||||||
name=$(mb_artist "$2" | $JQ -r '.name')
|
|
||||||
mb_artist_releasegroups "$2" |
|
|
||||||
$JQ -r '."release-groups"[] | [
|
$JQ -r '."release-groups"[] | [
|
||||||
.id,
|
.id,
|
||||||
."primary-type",
|
."primary-type",
|
||||||
(."secondary-types"|join(";")),
|
(."secondary-types" // []|join(";")),
|
||||||
."first-release-date",
|
."first-release-date",
|
||||||
.title,
|
.title,
|
||||||
(."artist-credit" | map(([.name, .joinphrase]|join(""))) | join(""))
|
(."artist-credit" | map(([.name, .joinphrase]|join(""))) | join(""))
|
||||||
] | join("\t")' |
|
] | join("\t")' |
|
||||||
awk \
|
awk \
|
||||||
-F "\t" \
|
-F "\t" \
|
||||||
-v artist="$name" \
|
-v file_local_releasegroups="${LOCALDATA_RELEASEGROUPS:-}" \
|
||||||
-v format_release="$FORMAT_RELEASE" \
|
-v format_release="$RGV_RELEASE" \
|
||||||
-v format_release_w_artist="$FORMAT_RELEASE_W_ARTIST" \
|
-v format_release_w_artist="$RGV_RELEASE_W_ARTIST" \
|
||||||
-v format_year="$FORMAT_YEAR" \
|
-v format_year="$RGV_YEAR" \
|
||||||
-v format_album="$FORMAT_TYPE_ALBUM" \
|
-v format_album="$FORMAT_TYPE_ALBUM" \
|
||||||
-v format_single="$FORMAT_TYPE_SINGLE" \
|
-v format_single="$FORMAT_TYPE_SINGLE" \
|
||||||
-v format_ep="$FORMAT_TYPE_EP" \
|
-v format_ep="$FORMAT_TYPE_EP" \
|
||||||
@@ -120,21 +220,243 @@ if [ "${1:-}" = "--internal-list-releases" ]; then
|
|||||||
-v format_mixtape="$FORMAT_TYPE_SECONDARY_MIXTAPE" \
|
-v format_mixtape="$FORMAT_TYPE_SECONDARY_MIXTAPE" \
|
||||||
-v format_demo="$FORMAT_TYPE_SECONDARY_DEMO" \
|
-v format_demo="$FORMAT_TYPE_SECONDARY_DEMO" \
|
||||||
-v format_fieldrec="$FORMAT_TYPE_SECONDARY_FIELDREC" \
|
-v format_fieldrec="$FORMAT_TYPE_SECONDARY_FIELDREC" \
|
||||||
|
-v format_local="$FORMAT_LOCAL" \
|
||||||
"$AWK_RELEASEGROUPS" |
|
"$AWK_RELEASEGROUPS" |
|
||||||
sort |
|
cut -d "$(printf '\t')" -f 2- >"$RESULTS" ||
|
||||||
sort -t "$(printf '\t')" -k 4 -n -r |
|
true
|
||||||
column -t -s "$(printf '\t')" |
|
fi
|
||||||
sed 's| \+[0-9]\+ \+\([0-9a-f-]\+\)$|\t\1|'
|
# Process ends now: Display and quit
|
||||||
|
rm -f "$LOCKFILE" "$PIDFILE"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "${1:-}" = "--fzf-key" ]; then
|
||||||
|
foo "KEY: $*; FZF_KEY=$FZF_KEY"
|
||||||
|
mbid="${2:-}"
|
||||||
|
path="${3:-}"
|
||||||
|
mode=$(cut -d "#" -f 1 "$MODEFILE")
|
||||||
|
args=$(cut -d "#" -f 2- "$MODEFILE")
|
||||||
|
|
||||||
|
case ",$KEYS_PLAY," in
|
||||||
|
*",$FZF_KEY,"*)
|
||||||
|
[ "$path" ] || exit 0
|
||||||
|
case "$mode" in
|
||||||
|
"$MODE_RELEASEGROUP")
|
||||||
|
tmplist=$(mktemp)
|
||||||
|
generate_playlist "$mbid" "$path" >"$tmplist"
|
||||||
|
mpv_play_list "$tmplist" >/dev/null
|
||||||
|
rm -f "$tmplist"
|
||||||
|
;;
|
||||||
|
"$MODE_RELEASE")
|
||||||
|
mpv_play_file "$path" >/dev/null
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
case ",$KEYS_QUEUE," in
|
||||||
|
*",$FZF_KEY,"*)
|
||||||
|
[ "$path" ] || exit 0
|
||||||
|
case "$mode" in
|
||||||
|
"$MODE_RELEASEGROUP")
|
||||||
|
tmplist=$(mktemp)
|
||||||
|
generate_playlist "$mbid" "$path" >"$tmplist"
|
||||||
|
mpv_queue_list "$tmplist" >/dev/null
|
||||||
|
rm -f "$tmplist"
|
||||||
|
;;
|
||||||
|
"$MODE_RELEASE")
|
||||||
|
mpv_play_file "$path" >/dev/null
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
case ",$KEYS_TOGGLE_PLAY_PAUSE," in
|
||||||
|
*",$FZF_KEY,"*) mpv_toggle_pause >/dev/null ;;
|
||||||
|
esac
|
||||||
|
case ",$KEYS_PLAY_NEXT," in
|
||||||
|
*",$FZF_KEY,"*) mpv_next >/dev/null ;;
|
||||||
|
esac
|
||||||
|
case ",$KEYS_PLAY_PREV," in
|
||||||
|
*",$FZF_KEY,"*) mpv_prev >/dev/null ;;
|
||||||
|
esac
|
||||||
|
case ",$KEYS_SEEK_FORWARD," in
|
||||||
|
*",$FZF_KEY,"*) mpv_seek_forward >/dev/null ;;
|
||||||
|
esac
|
||||||
|
case ",$KEYS_SEEK_BACKWARD," in
|
||||||
|
*",$FZF_KEY,"*) mpv_seek_backward >/dev/null ;;
|
||||||
|
esac
|
||||||
|
case ",$KEYS_HALFPAGE_DOWN," in
|
||||||
|
*",$FZF_KEY,"*) printf "half-page-down" ;;
|
||||||
|
esac
|
||||||
|
case ",$KEYS_HALFPAGE_UP," in
|
||||||
|
*",$FZF_KEY,"*) printf "half-page-up" ;;
|
||||||
|
esac
|
||||||
|
case ",$KEYS_FILTER_LOCAL," in
|
||||||
|
*",$FZF_KEY,"*)
|
||||||
|
case "$mode" in
|
||||||
|
"$MODE_SEARCH_ARTIST" | "$MODE_SEARCH_ALBUM") ;;
|
||||||
|
*) QUERY="$FORMAT_LOCAL " ;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
case ",$KEYS_SWITCH_ARTIST_ALBUM," in
|
||||||
|
*",$FZF_KEY,"*)
|
||||||
|
case "$mode" in
|
||||||
|
"$MODE_SEARCH_ARTIST") MODE_NEXT="$MODE_SEARCH_ALBUM" ;;
|
||||||
|
"$MODE_SEARCH_ALBUM") MODE_NEXT="$MODE_SEARCH_ARTIST" ;;
|
||||||
|
"$MODE_LIST_ARTISTS") MODE_NEXT="$MODE_LIST_ALBUMS" ;;
|
||||||
|
"$MODE_LIST_ALBUMS") MODE_NEXT="$MODE_LIST_ARTISTS" ;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
case ",$KEYS_SWITCH_LOCAL_REMOTE," in
|
||||||
|
*",$FZF_KEY,"*)
|
||||||
|
case "$mode" in
|
||||||
|
"$MODE_SEARCH_ARTIST") MODE_NEXT="$MODE_LIST_ARTISTS" ;;
|
||||||
|
"$MODE_SEARCH_ALBUM") MODE_NEXT="$MODE_LIST_ALBUMS" ;;
|
||||||
|
"$MODE_LIST_ARTISTS") MODE_NEXT="$MODE_SEARCH_ARTIST" ;;
|
||||||
|
"$MODE_LIST_ALBUMS") MODE_NEXT="$MODE_SEARCH_ALBUM" ;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
case ",$KEYS_BROWSE," in
|
||||||
|
*",$FZF_KEY,"*)
|
||||||
|
[ "$mbid" ] || exit 0
|
||||||
|
case "$mode" in
|
||||||
|
"$MODE_SEARCH_ARTIST" | "$MODE_LIST_ARTISTS") urltype="artist" ;;
|
||||||
|
"$MODE_ARTIST") urltype="release-group" ;;
|
||||||
|
"$MODE_RELEASEGROUP") urltype="release" ;;
|
||||||
|
"$MODE_RELEASE") urltype="track" ;;
|
||||||
|
esac
|
||||||
|
printf "execute-silent(xdg-open \"https://musicbrainz.org/%s/%s\" &)" "$urltype" "$mbid"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
case ",$KEYS_OUT," in
|
||||||
|
*",$FZF_KEY,"*)
|
||||||
|
case "$mode" in
|
||||||
|
"$MODE_ARTIST")
|
||||||
|
MODE_NEXT="$MODE_LIST_ARTISTS"
|
||||||
|
;;
|
||||||
|
"$MODE_RELEASEGROUP")
|
||||||
|
MODE_NEXT="$MODE_SELECT_ARTIST"
|
||||||
|
MODE_NEXT_ARGS="$(mb_releasegroup "$args" | $JQ -r --compact-output '."artist-credit"')"
|
||||||
|
ACCEPT=1
|
||||||
|
;;
|
||||||
|
"$MODE_RELEASE")
|
||||||
|
MODE_NEXT="$MODE_RELEASEGROUP"
|
||||||
|
MODE_NEXT_ARGS="$(mb_release "$args" | $JQ -r --compact-output '."release-group".id')"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
case ",$KEYS_IN," in
|
||||||
|
*",$FZF_KEY,"*)
|
||||||
|
[ "$mbid" ] || exit 0
|
||||||
|
MODE_NEXT_ARGS="$mbid"
|
||||||
|
case "$mode" in
|
||||||
|
"$MODE_LIST_ARTISTS" | "$MODE_SEARCH_ARTIST")
|
||||||
|
MODE_NEXT="$MODE_ARTIST"
|
||||||
|
;;
|
||||||
|
"$MODE_ARTIST")
|
||||||
|
MODE_NEXT="$MODE_RELEASEGROUP"
|
||||||
|
;;
|
||||||
|
"$MODE_RELEASEGROUP" | "$MODE_LIST_ALBUMS" | "$MODE_SEARCH_ALBUM")
|
||||||
|
MODE_NEXT="$MODE_RELEASE"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
case ",$KEYS_SELECT_ARTIST," in
|
||||||
|
*",$FZF_KEY,"*)
|
||||||
|
[ "$mbid" ] || exit 0
|
||||||
|
case "$mode" in
|
||||||
|
"$MODE_ARTIST" | "$MODE_SEARCH_ARTIST" | "$MODE_LIST_ARTISTS")
|
||||||
|
MODE_NEXT_ARGS="$(mb_releasegroup "$mbid" | $JQ -r --compact-output '."artist-credit"')"
|
||||||
|
ACCEPT=1
|
||||||
|
;;
|
||||||
|
"$MODE_RELEASEGROUP" | "$MODE_SEARCH_ALBUM" | "$MODE_LIST_ALBUMS")
|
||||||
|
MODE_NEXT_ARGS="$(mb_release "$mbid" | $JQ -r --compact-output '."artist-credit"')"
|
||||||
|
ACCEPT=1
|
||||||
|
;;
|
||||||
|
"$MODE_RELEASE")
|
||||||
|
MODE_NEXT_ARGS="$(mb_release "$args" | $JQ -r --compact-output '."artist-credit"')"
|
||||||
|
ACCEPT=1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
[ "$MODE_NEXT_ARGS" ] && MODE_NEXT="$MODE_SELECT_ARTIST"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
case ",$KEYS_FILTER_PRIMARY," in
|
||||||
|
*",$FZF_KEY,"*)
|
||||||
|
[ "$mode" = "$MODE_ARTIST" ] || exit 0
|
||||||
|
secsymb="$(printf "$FORMAT_TYPE_HAS_SECONDARY" "")"
|
||||||
|
QUERY="!$secsymb "
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
case ",$KEYS_FILTER_SECONDARY," in
|
||||||
|
*",$FZF_KEY,"*)
|
||||||
|
[ "$mode" = "$MODE_ARTIST" ] || exit 0
|
||||||
|
secsymb="$(printf "$FORMAT_TYPE_HAS_SECONDARY" "")"
|
||||||
|
QUERY="$secsymb "
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
case ",$KEYS_SHOW_PLAYLIST," in
|
||||||
|
*",$FZF_KEY,"*)
|
||||||
|
MODE_NEXT="$MODE_PLAYLIST"
|
||||||
|
ACCEPT=1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
[ "${QUERY:-}" ] && printf "+change-query(%s)" "$QUERY"
|
||||||
|
if [ "$MODE_NEXT" ]; then
|
||||||
|
printf "%s#%s" "$MODE_NEXT" "${MODE_NEXT_ARGS:-}" >"$MODEFILE"
|
||||||
|
[ "${ACCEPT:-}" ] && printf "+accept" || printf "+reload:%s" "$0 --fzf-reload"
|
||||||
|
fi
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Support of local music files
|
||||||
|
if [ "${1:-}" = "--decorate" ]; then
|
||||||
|
[ ! "${2:-}" ] && err "You did not specify a directory." && exit 1
|
||||||
|
[ ! -d "$2" ] && err "Path $2 does not point to a directory." && exit 1
|
||||||
|
if ! decorate "$2"; then
|
||||||
|
err "Something went wrong. Are you're files tagged correctly?"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
if [ "${1:-}" = "--internal-preview-artist" ]; then
|
||||||
|
__preview_artist "$2"
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ "${1:-}" = "--help" ]; then
|
if [ "${1:-}" = "--help" ]; then
|
||||||
$CAT <<EOF
|
cat <<EOF
|
||||||
Usage: \`$0\` [ \`--help\` | \`--show-artist\` \`<mbid>\` ]
|
Usage: $0 [OPTION]
|
||||||
|
|
||||||
Options:
|
GENERAL OPTIONS:
|
||||||
\`--help\`: Show this help and exit.
|
--help Show this help and exit.
|
||||||
\`--show-artist\` \`<mbid>\`: Show releaes of the artist given by the MusicBrainz ID \`<mbid>\`.
|
--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 da$KEYS_SWITCH_ARTIST_ALBUMase with decorated local music from <path>
|
||||||
EOF
|
EOF
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
@@ -147,57 +469,137 @@ tmpdir=$(mktemp -d)
|
|||||||
LOCKFILE="$tmpdir/lock"
|
LOCKFILE="$tmpdir/lock"
|
||||||
RESULTS="$tmpdir/results"
|
RESULTS="$tmpdir/results"
|
||||||
PIDFILE="$tmpdir/pid"
|
PIDFILE="$tmpdir/pid"
|
||||||
|
MODEFILE="$tmpdir/mode"
|
||||||
trap 'rm -rf "$tmpdir"' EXIT INT
|
trap 'rm -rf "$tmpdir"' EXIT INT
|
||||||
export LOCKFILE RESULTS PIDFILE
|
export LOCKFILE RESULTS PIDFILE MODEFILE
|
||||||
|
|
||||||
if [ "${1:-}" = "--search" ]; then
|
if [ "${1:-}" = "--ni-search-artist" ]; then
|
||||||
$0 --internal-search "$2"
|
$0 --internal-search "artist" "$2"
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
while true; do
|
if [ "${1:-}" = "--ni-search-album" ]; then
|
||||||
|
$0 --internal-search "releasegroup" "$2"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Modes
|
||||||
|
MODE_ARTIST="artist"
|
||||||
|
MODE_RELEASEGROUP="rg"
|
||||||
|
MODE_RELEASE="release"
|
||||||
|
MODE_SEARCH_ARTIST="search-artist"
|
||||||
|
MODE_SEARCH_ALBUM="search-album"
|
||||||
|
MODE_LIST_ARTISTS="list-artists"
|
||||||
|
MODE_LIST_ALBUMS="list-albums"
|
||||||
|
MODE_SELECT_ARTIST="select-artist"
|
||||||
|
MODE_PLAYLIST="playlist"
|
||||||
|
export MODE_ARTIST MODE_RELEASEGROUP MODE_RELEASE MODE_SEARCH_ARTIST \
|
||||||
|
MODE_SEARCH_ALBUM MODE_LIST_ARTISTS MODE_LIST_ALBUMS MODE_SELECT_ARTIST \
|
||||||
|
MODE_PLAYLIST
|
||||||
|
|
||||||
case "${1:-}" in
|
case "${1:-}" in
|
||||||
"--show-artist")
|
"--artist")
|
||||||
name=$(mb_artist "$2" | $JQ -r '.name')
|
[ ! "${2:-}" ] && err "MusicBrainz Artist ID not specified (see --help)" && exit 1
|
||||||
secsymb=$(printf "$FORMAT_TYPE_HAS_SECONDARY" "")
|
printf "%s#%s" "$MODE_ARTIST" "$2" >"$MODEFILE"
|
||||||
sel=$(
|
;;
|
||||||
$0 --internal-list-releases "$2" |
|
"--releasegroup")
|
||||||
$FZF \
|
[ ! "${2:-}" ] && err "MusicBrainz Release-Group ID not specified (see --help)" && exit 1
|
||||||
--ansi \
|
printf "%s#%s" "$MODE_RELEASEGROUP" "$2" >"$MODEFILE"
|
||||||
--reverse \
|
;;
|
||||||
--cycle \
|
"--release")
|
||||||
--query="!$secsymb " \
|
[ ! "${2:-}" ] && err "MusicBrainz Release ID not specified (see --help)" && exit 1
|
||||||
--delimiter="\t" \
|
printf "%s#%s" "$MODE_RELEASE" "$2" >"$MODEFILE"
|
||||||
--prompt="$(printf "$ARTIST_PROMPT" "$name")" \
|
;;
|
||||||
--accept-nth="{2}" \
|
"--search-artist")
|
||||||
--with-nth="{1}" \
|
printf "%s#%s" "$MODE_SEARCH_ARTIST" "${2:-}" >"$MODEFILE"
|
||||||
--bind="alt-1:change-query(!$secsymb ),alt-2:change-query($secsymb )" \
|
;;
|
||||||
--bind="ctrl-d:half-page-down,ctrl-u:half-page-up" \
|
"--search-album")
|
||||||
--bind="ctrl-r:reload:$0 --internal-list-releases-fresh \"$2\""
|
printf "%s#%s" "$MODE_SEARCH_ALBUM" "${2:-}" >"$MODEFILE"
|
||||||
)
|
;;
|
||||||
[ "$sel" ] && set -- "--show-release" "$sel"
|
"--artists" | "")
|
||||||
|
printf "%s" "$MODE_LIST_ARTISTS" >"$MODEFILE"
|
||||||
|
;;
|
||||||
|
"--albums")
|
||||||
|
printf "%s" "$MODE_LIST_ALBUMS" >"$MODEFILE"
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
|
err "Unknown option $1 (see --help)"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# Start mpv
|
||||||
|
mpv_start
|
||||||
|
|
||||||
|
# $KEYS_PLAY main loop
|
||||||
|
while true; do
|
||||||
|
mode=$(cut -d "#" -f 1 "$MODEFILE")
|
||||||
|
args=$(cut -d "#" -f 2- "$MODEFILE")
|
||||||
|
case "$mode" in
|
||||||
|
"$MODE_SELECT_ARTIST")
|
||||||
sel=$(
|
sel=$(
|
||||||
printf "" |
|
echo "$args" |
|
||||||
|
$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 \
|
$FZF \
|
||||||
--ansi \
|
--bind="$KEYS_HALFPAGE_DOWN,$KEYS_HALFPAGE_UP,\
|
||||||
--reverse \
|
$KEYS_BROWSE,\
|
||||||
--no-sort \
|
$KEYS_FILTER_LOCAL:transform:$0 --fzf-key {2} {3}" \
|
||||||
--disabled \
|
-1 \
|
||||||
--cycle \
|
--border="bold" \
|
||||||
|
--border-label="Select artist" \
|
||||||
--delimiter="\t" \
|
--delimiter="\t" \
|
||||||
--prompt="$SEARCH_PROMPT" \
|
--prompt="$SEARCH_PROMPT" \
|
||||||
--info="inline-right" \
|
--margin="5%,20%" \
|
||||||
--info-command="echo \"Search music artist\"" \
|
--bind="$KEYS_FILTER_LOCAL:change-query($FORMAT_LOCAL )" \
|
||||||
--accept-nth="{1}" \
|
--accept-nth="{2}" \
|
||||||
--with-nth="{2}" \
|
--with-nth="{1}"
|
||||||
--preview-window="wrap" \
|
|
||||||
--preview="$0 --internal-preview-artist {1}" \
|
|
||||||
--bind="ctrl-d:half-page-down,ctrl-u:half-page-up" \
|
|
||||||
--bind="change:execute-silent($0 --internal-search \$FZF_QUERY &)+reload($0 --internal-reload)"
|
|
||||||
)
|
)
|
||||||
[ "$sel" ] && set -- "--show-artist" "$sel"
|
printf "%s#%s" "$MODE_ARTIST" "$sel" >"$MODEFILE"
|
||||||
|
;;
|
||||||
|
"$MODE_PLAYLIST")
|
||||||
|
count=$(mpv_playlist_count)
|
||||||
|
foo "Playlist: count=$count"
|
||||||
|
# --bind="$KEYS_HALFPAGE_DOWN,$KEYS_HALFPAGE_UP,\
|
||||||
|
#$KEYS_BROWSE,\
|
||||||
|
#$KEYS_IN,$KEYS_OUT,\
|
||||||
|
#$KEYS_SELECT_ARTIST,\
|
||||||
|
#$KEYS_FILTER_LOCAL,$KEYS_FILTER_PRIMARY,$KEYS_FILTER_SECONDARY,\
|
||||||
|
#$KEYS_SWITCH_ARTIST_ALBUM,$KEYS_SWITCH_LOCAL_REMOTE,\
|
||||||
|
#$KEYS_PLAY,$KEYS_QUEUE,$KEYS_TOGGLE_PLAY_PAUSE,\
|
||||||
|
#$KEYS_PLAY_NEXT,$KEYS_PLAY_PREV,\
|
||||||
|
#$KEYS_SEEK_FORWARD,$KEYS_SEEK_BACKWARD:transform:$0 --fzf-key {2} {3}" \
|
||||||
|
printf "%s#%s" "$MODE_LIST_ARTISTS" "" >"$MODEFILE"
|
||||||
|
;;
|
||||||
|
*) # Main instance
|
||||||
|
$FZF \
|
||||||
|
--reverse \
|
||||||
|
--bind="start:reload:$0 --fzf-reload" \
|
||||||
|
--bind="load:transform:$0 --fzf-load" \
|
||||||
|
--bind="change:execute-silent($0 --fzf-change &)+reload:$0 --fzf-change-reload" \
|
||||||
|
--bind="$KEYS_HALFPAGE_DOWN,$KEYS_HALFPAGE_UP,\
|
||||||
|
$KEYS_BROWSE,\
|
||||||
|
$KEYS_IN,$KEYS_OUT,\
|
||||||
|
$KEYS_SELECT_ARTIST,\
|
||||||
|
$KEYS_FILTER_LOCAL,$KEYS_FILTER_PRIMARY,$KEYS_FILTER_SECONDARY,\
|
||||||
|
$KEYS_SWITCH_ARTIST_ALBUM,$KEYS_SWITCH_LOCAL_REMOTE,\
|
||||||
|
$KEYS_PLAY,$KEYS_QUEUE,\
|
||||||
|
$KEYS_SHOW_PLAYLIST:transform:$0 --fzf-key {2} {3}" \
|
||||||
|
--info="inline-right" \
|
||||||
|
--info-command="$0 --fzf-info" \
|
||||||
|
--preview-window="right,25%,border-left,wrap,<30(hidden)" \
|
||||||
|
--preview="$0 --internal-preview-artist {2}" \
|
||||||
|
--delimiter="\t" \
|
||||||
|
--with-nth="{1}" >/dev/null
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
done
|
done
|
||||||
|
219
src/sh/api.sh
219
src/sh/api.sh
@@ -1,70 +1,213 @@
|
|||||||
|
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
|
||||||
|
|
||||||
# Argument: MB Artist ID
|
__mpv_command() {
|
||||||
__api_mb_browse_releases() {
|
printf "{ \"command\": [\"%s\"] }\n" "$1" | $SOCAT - "$MPV_SOCKET"
|
||||||
$CURL \
|
|
||||||
--get \
|
|
||||||
--data fmt=json \
|
|
||||||
--data inc=release-groups \
|
|
||||||
--data-urlencode artist="$1" \
|
|
||||||
-A "$APP_NAME/$APP_VERSION ($APP_WEBSITE)" \
|
|
||||||
"https://musicbrainz.org/ws/2/release"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# Argument: MB Artist ID
|
__mpv_command_with_arg() {
|
||||||
__api_mb_browse_release_groups() {
|
printf "{ \"command\": [\"%s\", \"%s\"] }\n" "$1" "$2" | $SOCAT - "$MPV_SOCKET"
|
||||||
|
}
|
||||||
|
|
||||||
|
__mpv_command_with_args2() {
|
||||||
|
printf "{ \"command\": [\"%s\", \"%s\", \"%s\"] }\n" "$1" "$2" "$3" | $SOCAT - "$MPV_SOCKET"
|
||||||
|
}
|
||||||
|
|
||||||
|
__mpv_get() {
|
||||||
|
__mpv_command_with_arg "expand-text" "$1" | $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 >/dev/null; 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 \
|
||||||
|
--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 \
|
--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-urlencode 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")
|
||||||
|
$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() {
|
||||||
|
__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_artists() {
|
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"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# Argument: MB Artist ID
|
api_mb_search_releasegroup() {
|
||||||
__api_mb_get_artist() {
|
__api_mb "search-releasegroup" "$1"
|
||||||
$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"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# Argument: Discogs id
|
api_discogs_artist() {
|
||||||
__api_discogs_get_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"
|
||||||
}
|
}
|
||||||
|
|
||||||
# Argument: wikidata id
|
api_wikidata_sitelinks() {
|
||||||
__api_wikidata_get_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"
|
||||||
}
|
}
|
||||||
|
|
||||||
# Argument: Wikipedia name (last part of URL)
|
api_wikipedia_en_summary() {
|
||||||
__api_wikipedia_en_get_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"
|
||||||
}
|
}
|
||||||
|
@@ -18,3 +18,10 @@ AWK_RELEASEGROUPS=$(
|
|||||||
EOF
|
EOF
|
||||||
)
|
)
|
||||||
export AWK_RELEASEGROUPS
|
export AWK_RELEASEGROUPS
|
||||||
|
|
||||||
|
AWK_RECORDINGS=$(
|
||||||
|
cat <<'EOF'
|
||||||
|
@@include awk/recordings.awk
|
||||||
|
EOF
|
||||||
|
)
|
||||||
|
export AWK_RECORDINGS
|
||||||
|
166
src/sh/cache.sh
166
src/sh/cache.sh
@@ -1,103 +1,161 @@
|
|||||||
|
# Caching structure
|
||||||
|
#
|
||||||
|
# ./artist/radix(uuid)/musicbrainz.json # Artist information
|
||||||
|
# ./artist/radix(uuid)/releasegroups.json # List of all release groups
|
||||||
|
# ./artist/radix(uuid)/... # Any other artist information
|
||||||
|
# ./releasegroup/radix(uuid)/musicbrainz.json # Release group information
|
||||||
|
# ./releasegroup/radix(uuid)/releases.json # List of all releases in release group
|
||||||
|
# ./release/radix(uuid)/musicbrainz.json # Release information with tracklist etc.
|
||||||
CACHEDIR="$HOME/.cache/$APP_NAME"
|
CACHEDIR="$HOME/.cache/$APP_NAME"
|
||||||
[ -d "$CACHEDIR" ] || mkdir "$CACHEDIR"
|
TYPE_ARTIST="artist"
|
||||||
|
TYPE_RELEASEGROUP="releasegroup"
|
||||||
|
TYPE_RELEASE="release"
|
||||||
|
|
||||||
artist_mb_filename="musicbrainz.json"
|
artist_filename="musicbrainz.json"
|
||||||
artist_mb_releasegroups_filename="releasegroups.json"
|
artist_releasegroups_filename="releasegroups.json"
|
||||||
artist_discogs_filename="discogs.json"
|
artist_discogs_filename="discogs.json"
|
||||||
artist_wikidata_filename="wikidata.json"
|
artist_wikidata_filename="wikidata.json"
|
||||||
artist_enwikipedia_filename="enwikipedia.json"
|
artist_enwikipedia_filename="enwikipedia.json"
|
||||||
|
releasegroup_filename="musicbrainz.json"
|
||||||
|
releasegroup_releases_filename="releases.json"
|
||||||
|
release_filename="musicbrainz.json"
|
||||||
|
|
||||||
|
# Radix transform directory name
|
||||||
|
__radix() {
|
||||||
|
echo "$1" | awk -F "" '{ print $1$2$3$4"/"$5$6$7$8"/"$0 }'
|
||||||
|
}
|
||||||
|
|
||||||
# Super wrapper
|
# Super wrapper
|
||||||
# argument $1: MusicBrainz Artist ID
|
# argument $1: type
|
||||||
# argument $2: Filename of json file
|
# argument $2: MusicBrainz ID
|
||||||
__get_artist_json() {
|
# argument $3: Filename of json file
|
||||||
f="$CACHEDIR/$1/$2"
|
__get_json() {
|
||||||
|
f="$CACHEDIR/$1/$(__radix "$2")/$3"
|
||||||
[ -f "$f" ] || return
|
[ -f "$f" ] || return
|
||||||
cat "$f"
|
cat "$f"
|
||||||
}
|
}
|
||||||
|
|
||||||
# Super wrapper
|
# Super wrapper
|
||||||
# argument $1: MusicBrainz Artist ID
|
# argument $1: type
|
||||||
# argument $2: Filename of json file
|
# argument $2: MusicBrainz ID
|
||||||
__put_artist_json() {
|
# argument $3: Filename of json file
|
||||||
artistdir="$CACHEDIR/$1"
|
__put_json() {
|
||||||
[ -d "$artistdir" ] || mkdir "$artistdir"
|
dir="$CACHEDIR/$1/$(__radix "$2")"
|
||||||
f="$artistdir/$2"
|
[ -d "$dir" ] || mkdir -p "$dir"
|
||||||
|
f="$dir/$3"
|
||||||
tmpf=$(mktemp)
|
tmpf=$(mktemp)
|
||||||
cat >"$tmpf"
|
cat >"$tmpf"
|
||||||
[ -s "$tmpf" ] && mv "$tmpf" "$f" || printf "{}" >"$f"
|
[ -s "$tmpf" ] && mv "$tmpf" "$f" || printf "{}" >"$f"
|
||||||
}
|
}
|
||||||
|
|
||||||
# Delete all cache associated to the given artist
|
## Artist
|
||||||
# argument $1: MusicBrainz Artist ID
|
cache_get_artist() {
|
||||||
cache_delete_artist() {
|
__get_json "$TYPE_ARTIST" "$1" "$artist_filename"
|
||||||
artistdir="$CACHEDIR/$1"
|
|
||||||
rm -rf "$artistdir"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# Returns the cached MusicBrainz data for the artist given by the MusicBrainz
|
cache_get_artist_releasegroups() {
|
||||||
# Artist ID in $1
|
__get_json "$TYPE_ARTIST" "$1" "$artist_releasegroups_filename"
|
||||||
cache_get_artist_mb() {
|
|
||||||
__get_artist_json "$1" "$artist_mb_filename"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# Returns the cached MusicBrainz release-group data for the artist given by the
|
|
||||||
# MusicBrainz Artist ID in $1
|
|
||||||
cache_get_artist_mb_releasegroups() {
|
|
||||||
__get_artist_json "$1" "$artist_mb_releasegroups_filename"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Returns the cached Discogs data for the artist given by the MusicBrainz
|
|
||||||
# Artist ID in $1
|
|
||||||
cache_get_artist_discogs() {
|
cache_get_artist_discogs() {
|
||||||
__get_artist_json "$1" "$artist_discogs_filename"
|
__get_json "$TYPE_ARTIST" "$1" "$artist_discogs_filename"
|
||||||
}
|
}
|
||||||
|
|
||||||
# Returns the cached Wikipedia (English) data for the artist given by the
|
|
||||||
# MusicBrainz Artist ID in $1
|
|
||||||
cache_get_artist_enwikipedia() {
|
cache_get_artist_enwikipedia() {
|
||||||
__get_artist_json "$1" "$artist_enwikipedia_filename"
|
__get_json "$TYPE_ARTIST" "$1" "$artist_enwikipedia_filename"
|
||||||
}
|
}
|
||||||
|
|
||||||
cache_get_artist_wikidata() {
|
cache_get_artist_wikidata() {
|
||||||
__get_artist_json "$1" "$artist_wikidata_filename"
|
__get_json "$TYPE_ARTIST" "$1" "$artist_wikidata_filename"
|
||||||
}
|
}
|
||||||
|
|
||||||
# Read from stdin the MusicBrainz data for the artist given by the MusicBrainz
|
cache_put_artist() {
|
||||||
# Artist ID in $1, and cache it.
|
cat | __put_json "$TYPE_ARTIST" "$1" "$artist_filename"
|
||||||
cache_put_artist_mb() {
|
|
||||||
cat | __put_artist_json "$1" "$artist_mb_filename"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# Read from stdin the MusicBrainz release-group data for the artist given by
|
cache_put_artist_releasegroups() {
|
||||||
# the MusicBrainz Artist ID in $1, and cache it.
|
cat | __put_json "$TYPE_ARTIST" "$1" "$artist_releasegroups_filename"
|
||||||
cache_put_artist_mb_releasegroups() {
|
|
||||||
cat | __put_artist_json "$1" "$artist_mb_releasegroups_filename"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# Read from stdin the MusicBrainz release-group data for the artist given by
|
cache_append_artist_releasegroups() {
|
||||||
# the MusicBrainz Artist ID in $1, and append it to the current cache.
|
|
||||||
cache_append_artist_mb_releasegroups() {
|
|
||||||
tmpf=$(mktemp)
|
tmpf=$(mktemp)
|
||||||
cat >"$tmpf"
|
cat >"$tmpf"
|
||||||
updated=$(mktemp)
|
updated=$(mktemp)
|
||||||
f="$CACHEDIR/$1/$artist_mb_releasegroups_filename"
|
f="$CACHEDIR/$TYPE_ARTIST/$(__radix "$1")/$artist_releasegroups_filename"
|
||||||
$JQ -r --slurpfile n "$tmpf" '."release-groups" += ($n[0]|."release-groups")' "$f" >"$updated" && mv "$updated" "$f"
|
$JQ -r --slurpfile n "$tmpf" '."release-groups" += ($n[0]|."release-groups")' "$f" >"$updated" && mv "$updated" "$f"
|
||||||
rm -f "$tmpf"
|
rm -f "$tmpf"
|
||||||
}
|
}
|
||||||
|
|
||||||
# Read from stdin the Discogs data for the artist given by the MusicBrainz
|
|
||||||
# Artist ID in $1, and cache it.
|
|
||||||
cache_put_artist_discogs() {
|
cache_put_artist_discogs() {
|
||||||
cat | __put_artist_json "$1" "$artist_discogs_filename"
|
cat | __put_json "$TYPE_ARTIST" "$1" "$artist_discogs_filename"
|
||||||
}
|
}
|
||||||
|
|
||||||
# Read from stdin the Wikipedia data (English) for the artist given by the
|
|
||||||
# MusicBrainz Artist ID in $1, and cache it.
|
|
||||||
cache_put_artist_enwikipedia() {
|
cache_put_artist_enwikipedia() {
|
||||||
cat | __put_artist_json "$1" "$artist_enwikipedia_filename"
|
cat | __put_json "$TYPE_ARTIST" "$1" "$artist_enwikipedia_filename"
|
||||||
}
|
}
|
||||||
|
|
||||||
cache_put_artist_wikidata() {
|
cache_put_artist_wikidata() {
|
||||||
cat | __put_artist_json "$1" "$artist_wikidata_filename"
|
cat | __put_json "$TYPE_ARTIST" "$1" "$artist_wikidata_filename"
|
||||||
|
}
|
||||||
|
|
||||||
|
## Release group
|
||||||
|
cache_get_releasegroup() {
|
||||||
|
__get_json "$TYPE_RELEASEGROUP" "$1" "$releasegroup_filename"
|
||||||
|
}
|
||||||
|
|
||||||
|
cache_get_releasegroup_releases() {
|
||||||
|
__get_json "$TYPE_RELEASEGROUP" "$1" "$releasegroup_releases_filename"
|
||||||
|
}
|
||||||
|
|
||||||
|
cache_put_releasegroup() {
|
||||||
|
cat | __put_json "$TYPE_RELEASEGROUP" "$1" "$releasegroup_filename"
|
||||||
|
}
|
||||||
|
|
||||||
|
cache_put_releasegroup_releases() {
|
||||||
|
cat | __put_json "$TYPE_RELEASEGROUP" "$1" "$releasegroup_releases_filename"
|
||||||
|
}
|
||||||
|
|
||||||
|
cache_append_releasegroup_releases() {
|
||||||
|
tmpf=$(mktemp)
|
||||||
|
cat >"$tmpf"
|
||||||
|
updated=$(mktemp)
|
||||||
|
f="$CACHEDIR/$TYPE_RELEASEGROUP/$(__radix "$1")/$releasegroup_releases_filename"
|
||||||
|
$JQ -r --slurpfile n "$tmpf" '."releases" += ($n[0]|."releases")' "$f" >"$updated" && mv "$updated" "$f"
|
||||||
|
rm -f "$tmpf"
|
||||||
|
}
|
||||||
|
|
||||||
|
## Release
|
||||||
|
cache_get_release() {
|
||||||
|
__get_json "$TYPE_RELEASE" "$1" "$release_filename"
|
||||||
|
}
|
||||||
|
|
||||||
|
cache_put_release() {
|
||||||
|
cat | __put_json "$TYPE_RELEASE" "$1" "$release_filename"
|
||||||
|
}
|
||||||
|
|
||||||
|
## Cache deletion
|
||||||
|
cache_delete_artist() {
|
||||||
|
# Get release groups
|
||||||
|
echo "NOT IMPLEMENTED" >/dev/stderr
|
||||||
|
}
|
||||||
|
|
||||||
|
# Check if main items are in cache
|
||||||
|
# argument $1: type
|
||||||
|
# argument $2: MusicBrainz ID
|
||||||
|
in_cache() {
|
||||||
|
case "$1" in
|
||||||
|
"$TYPE_ARTIST")
|
||||||
|
fn="$artist_filename"
|
||||||
|
;;
|
||||||
|
"$TYPE_RELEASEGROUP")
|
||||||
|
fn="$releasegroup_filename"
|
||||||
|
;;
|
||||||
|
"$TYPE_RELEASE")
|
||||||
|
fn="$release_filename"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
return 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
[ "$(__get_json "$1" "$2" "$fn")" ] && return 0 || return 1
|
||||||
}
|
}
|
||||||
|
4
src/sh/config.sh
Normal file
4
src/sh/config.sh
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
if [ "${CONFIGFILE:-}" ]; then
|
||||||
|
[ ! -f "$CONFIGFILE" ] && err "Configuration $CONFIGFILE not found." && exit 1
|
||||||
|
. "$CONFIGFLIE"
|
||||||
|
fi
|
@@ -1,3 +1,19 @@
|
|||||||
|
ERR="\033[38;5;196m"
|
||||||
|
INFO="\033[38;5;75m"
|
||||||
|
DBG=$ERR
|
||||||
|
OFF="\033[m"
|
||||||
err() {
|
err() {
|
||||||
echo "ERROR: ${1:-}"
|
echo "${ERR}ERROR:${OFF} ${1:-}" >/dev/stderr
|
||||||
|
}
|
||||||
|
|
||||||
|
info() {
|
||||||
|
echo "${INFO}Info:${OFF} ${1:-}" >/dev/stderr
|
||||||
|
}
|
||||||
|
|
||||||
|
debug() {
|
||||||
|
echo "${DBG}DEBUG${OFF} ${INFO}$(date)${OFF}: $*" >/dev/stderr
|
||||||
|
}
|
||||||
|
|
||||||
|
foo() {
|
||||||
|
echo "${DBG}DEBUG${OFF} ${INFO} [$$] $(date)${OFF}: $*" >>/tmp/foo
|
||||||
}
|
}
|
||||||
|
25
src/sh/keys.sh
Normal file
25
src/sh/keys.sh
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
KEYS_HALFPAGE_DOWN="${KEYS_HALFPAGE_DOWN:-"ctrl-d"}"
|
||||||
|
KEYS_HALFPAGE_UP="${KEYS_HALFPAGE_UP:-"ctrl-u"}"
|
||||||
|
KEYS_BROWSE="${KEYS_BROWSE:-"alt-b"}"
|
||||||
|
KEYS_OUT="${KEYS_OUT:-"ctrl-h"}"
|
||||||
|
KEYS_IN="${KEYS_IN:-"ctrl-l"}"
|
||||||
|
KEYS_SELECT_ARTIST="${KEYS_SELECT_ARTIST:-"ctrl-a"}"
|
||||||
|
KEYS_FILTER_LOCAL="${KEYS_FILTER_LOCAL:-"alt-l"}"
|
||||||
|
KEYS_FILTER_PRIMARY="${KEYS_FILTER_PRIMARY:-"alt-1"}"
|
||||||
|
KEYS_FILTER_SECONDARY="${KEYS_FILTER_SECONDARY:-"alt-2"}"
|
||||||
|
KEYS_SWITCH_ARTIST_ALBUM="${KEYS_SWITCH_ARTIST_ALBUM:-"tab"}"
|
||||||
|
KEYS_SWITCH_LOCAL_REMOTE="${KEYS_SWITCH_LOCAL_REMOTE:-"ctrl-/"}"
|
||||||
|
KEYS_PLAY="${KEYS_PLAY:-"enter"}"
|
||||||
|
KEYS_QUEUE="${KEYS_QUEUE:-"alt-enter"}"
|
||||||
|
KEYS_TOGGLE_PLAY_PAUSE="${KEYS_TOGGLE_PLAY_PAUSE:-"space"}"
|
||||||
|
KEYS_PLAY_NEXT="${KEYS_PLAY_NEXT:-"l,right"}"
|
||||||
|
KEYS_PLAY_PREV="${KEYS_PLAY_PREV:-"h,left"}"
|
||||||
|
KEYS_SEEK_FORWARD="${KEYS_SEEK_FORWARD:-"L,shift-right"}"
|
||||||
|
KEYS_SEEK_BACKWARD="${KEYS_SEEK_BACKWARD:-"H,shift-left"}"
|
||||||
|
KEYS_SHOW_PLAYLIST="${KEYS_SHOW_PLAYLIST:-"ctrl-p"}"
|
||||||
|
|
||||||
|
export KEYS_HALFPAGE_DOWN KEYS_HALFPAGE_UP KEYS_BROWSE KEYS_OUT KEYS_IN \
|
||||||
|
KEYS_SELECT_ARTIST KEYS_FILTER_LOCAL KEYS_FILTER_PRIMARY KEYS_FILTER_SECONDARY \
|
||||||
|
KEYS_SWITCH_ARTIST_ALBUM KEYS_SWITCH_LOCAL_REMOTE KEYS_PLAY KEYS_QUEUE \
|
||||||
|
KEYS_TOGGLE_PLAY_PAUSE KEYS_PLAY_NEXT KEYS_PLAY_PREV KEYS_SEEK_FORWARD \
|
||||||
|
KEYS_SEEK_BACKWARD KEYS_SHOW_PLAYLIST
|
167
src/sh/lists.sh
Normal file
167
src/sh/lists.sh
Normal file
@@ -0,0 +1,167 @@
|
|||||||
|
# List release groups of given artist
|
||||||
|
# argument $1: MB artist id
|
||||||
|
list_releasegroups() {
|
||||||
|
name=$(mb_artist "$1" | $JQ -r '.name')
|
||||||
|
mb_artist_releasegroups "$1" |
|
||||||
|
$JQ -r '."release-groups"[] | [
|
||||||
|
.id,
|
||||||
|
."primary-type",
|
||||||
|
(."secondary-types" // []|join(";")),
|
||||||
|
."first-release-date",
|
||||||
|
.title,
|
||||||
|
(."artist-credit" | map(([.name, .joinphrase]|join(""))) | join(""))
|
||||||
|
] | join("\t")' |
|
||||||
|
awk \
|
||||||
|
-F "\t" \
|
||||||
|
-v artist="$name" \
|
||||||
|
-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|'
|
||||||
|
}
|
||||||
|
|
||||||
|
# List releases in given relese group
|
||||||
|
# argument $1: MB release-group id
|
||||||
|
list_releases() {
|
||||||
|
title="$(mb_releasegroup "$1" |
|
||||||
|
$JQ -r '.title')"
|
||||||
|
artist="$(mb_releasegroup "$1" |
|
||||||
|
$JQ -r '."artist-credit" | map(([.name, .joinphrase]|join(""))) | join("")')"
|
||||||
|
mb_releasegroup_releases "$1" |
|
||||||
|
$JQ -r '."releases"[] | [
|
||||||
|
.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")' |
|
||||||
|
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 rg_artist="$artist" \
|
||||||
|
-v rg_title="$title" \
|
||||||
|
-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|'
|
||||||
|
}
|
||||||
|
|
||||||
|
# List recordings of given release
|
||||||
|
# argument $1: MB release id
|
||||||
|
list_recordings() {
|
||||||
|
deco="$(grep "$1" "$LOCALDATA_RELEASES" | cut -d "$(printf '\t')" -f 2)"
|
||||||
|
if [ "$deco" ]; then
|
||||||
|
base="$(dirname "$deco")"
|
||||||
|
rectmp=$(mktemp)
|
||||||
|
$JQ -r --arg base "$base/" '.tracks | to_entries | map(.key + "\t" + $base + .value) | join("\n")' "$deco" >"$rectmp"
|
||||||
|
fi
|
||||||
|
mb_release "$1" |
|
||||||
|
$JQ -r '.media[] |
|
||||||
|
.position as $pos |
|
||||||
|
.tracks[] | [
|
||||||
|
.id,
|
||||||
|
$pos,
|
||||||
|
.number,
|
||||||
|
.length,
|
||||||
|
.recording.title,
|
||||||
|
(.recording."artist-credit" | map([.name, .joinphrase] | join("")) | join(""))
|
||||||
|
] |
|
||||||
|
join("\t")' |
|
||||||
|
awk \
|
||||||
|
-F "\t" \
|
||||||
|
-v file_local_recordings="${rectmp:-}" \
|
||||||
|
-v format="$REC_FORMAT" \
|
||||||
|
-v format_local="$FORMAT_LOCAL" \
|
||||||
|
"$AWK_RECORDINGS" |
|
||||||
|
sort -k1,1n -k2,2g |
|
||||||
|
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 [ "${rectmp:-}" ] && [ -f "$rectmp" ]; then
|
||||||
|
rm -f "$rectmp"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# List artists (local)
|
||||||
|
list_local_artists() {
|
||||||
|
cat "$LOCALDATA_ARTISTS_VIEW" 2>/dev/null
|
||||||
|
}
|
||||||
|
|
||||||
|
# List release groups (local)
|
||||||
|
list_local_releasegroups() {
|
||||||
|
cat "$LOCALDATA_RELEASEGROUPS_VIEW" 2>/dev/null
|
||||||
|
}
|
||||||
|
|
||||||
|
# List releases (local)
|
||||||
|
list_local_releases() {
|
||||||
|
cat "$LOCALDATA_RELEASES_VIEW" 2>/dev/null
|
||||||
|
}
|
||||||
|
|
||||||
|
# Generate playlist from MB release ID and path to decoration
|
||||||
|
# @argument $1: MusicBrainz Release ID
|
||||||
|
# @argument $2: Path to decoration file
|
||||||
|
generate_playlist() {
|
||||||
|
dir="$(dirname "$2")"
|
||||||
|
mb_release "$1" |
|
||||||
|
$JQ -r --slurpfile deco "$2" --arg base "$dir" '$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)[]'
|
||||||
|
}
|
232
src/sh/local.sh
Normal file
232
src/sh/local.sh
Normal file
@@ -0,0 +1,232 @@
|
|||||||
|
gettags() {
|
||||||
|
ffprobe -v error -show_entries format_tags -print_format json "$1" |
|
||||||
|
$JQ -r --compact-output '.format.tags | {
|
||||||
|
trackid: (."MusicBrainz Release Track Id" // ."MUSICBRAINZ_RELEASETRACKID" // ."MusicBrainz/Release Track Id" // ""),
|
||||||
|
releaseid: (."MusicBrainz Album Id" // ."MUSICBRAINZ_ALBUMID" // ."MusicBrainz/Album Id" // "")
|
||||||
|
}'
|
||||||
|
}
|
||||||
|
|
||||||
|
# Read music files in specified directory and create json file that points to
|
||||||
|
# all relevant MusicBrainz IDs.
|
||||||
|
# @input $1: Path to directory with album
|
||||||
|
decorate() {
|
||||||
|
if [ -f "$1/$DECORATION_FILENAME" ]; then
|
||||||
|
info "Directory $1 has already been decorated (skipping)"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
decoration=$($JQ -n '.tracks = {}')
|
||||||
|
tmpf=$(mktemp)
|
||||||
|
(cd "$1" && find . -type f -iname '*.mp3' -o -iname '*.mp4' -o -iname '*.flac' -o -iname '*.m4a') >"$tmpf"
|
||||||
|
while IFS= read -r f; do
|
||||||
|
mbid=$(gettags "$1/$f")
|
||||||
|
rid=$(echo "$mbid" | $JQ -r '.releaseid')
|
||||||
|
tid=$(echo "$mbid" | $JQ -r '.trackid')
|
||||||
|
if [ ! "$rid" ] || [ ! "$tid" ]; then
|
||||||
|
err "File $f: Seems not tagged"
|
||||||
|
releaseid=""
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
if [ "${releaseid:-}" ]; then
|
||||||
|
if [ "$releaseid" != "$rid" ]; then
|
||||||
|
err "Directory $1 contains files of different releases"
|
||||||
|
releaseid=""
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
info "Decorating $1 as release $rid"
|
||||||
|
releaseid="$rid"
|
||||||
|
fi
|
||||||
|
decoration=$(echo "$decoration" | $JQ ".tracks += {\"$tid\": \"$f\"}")
|
||||||
|
done <"$tmpf"
|
||||||
|
rm -f "$tmpf"
|
||||||
|
if [ "$releaseid" ]; then
|
||||||
|
echo "$decoration" | $JQ --compact-output ".releaseid = \"$releaseid\"" >"$1/$DECORATION_FILENAME"
|
||||||
|
else
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Load missing cache entries (batch mode)
|
||||||
|
# argument $1: type
|
||||||
|
# argument $2: File with one ID per line
|
||||||
|
__batch_load_missing() {
|
||||||
|
tmpf=$(mktemp)
|
||||||
|
while IFS= read -r mbid; do
|
||||||
|
if ! in_cache "$1" "$mbid"; then
|
||||||
|
echo "$mbid" >>"$tmpf"
|
||||||
|
fi
|
||||||
|
done <"$2"
|
||||||
|
if [ -s "$tmpf" ]; then
|
||||||
|
lines=$(wc -l "$tmpf" | cut -d ' ' -f 1)
|
||||||
|
if [ "$lines" -gt 0 ]; then
|
||||||
|
case "$1" in
|
||||||
|
"$TYPE_ARTIST")
|
||||||
|
tt="artists"
|
||||||
|
;;
|
||||||
|
"$TYPE_RELEASEGROUP")
|
||||||
|
tt="release groups"
|
||||||
|
;;
|
||||||
|
"$TYPE_RELEASE")
|
||||||
|
tt="releases"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
info "Fetching $lines missing $tt"
|
||||||
|
cnt=0
|
||||||
|
while IFS= read -r mbid; do
|
||||||
|
case "$1" in
|
||||||
|
"$TYPE_ARTIST")
|
||||||
|
name=$(mb_artist "$mbid" | $JQ -r ".name")
|
||||||
|
;;
|
||||||
|
"$TYPE_RELEASEGROUP")
|
||||||
|
name=$(mb_releasegroup "$mbid" | $JQ -r ".title")
|
||||||
|
;;
|
||||||
|
"$TYPE_RELEASE")
|
||||||
|
name=$(mb_release "$mbid" | $JQ -r ".title")
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
cnt=$((cnt + 1))
|
||||||
|
printf "\033[2K\r%d/%d (%s: %s)" "$cnt" "$lines" "$mbid" "$name"
|
||||||
|
sleep 1
|
||||||
|
done <"$tmpf"
|
||||||
|
printf "\n"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
rm -f "$tmpf"
|
||||||
|
}
|
||||||
|
|
||||||
|
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
|
||||||
|
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"
|
||||||
|
__batch_load_missing "$TYPE_RELEASE" "$tmpreleases"
|
||||||
|
# Get release groups and album artists
|
||||||
|
while IFS= read -r rid; do
|
||||||
|
mb=$(mb_release "$rid")
|
||||||
|
echo "$mb" | $JQ -r '."release-group".id' >>"$LOCALDATA_RELEASEGROUPS"
|
||||||
|
echo "$mb" | $JQ -r '."release-group"."artist-credit" | map(.artist.id) | join("\n")' >>"$LOCALDATA_ARTISTS"
|
||||||
|
done <"$tmpreleases"
|
||||||
|
tf=$(mktemp)
|
||||||
|
sort "$LOCALDATA_RELEASEGROUPS" | uniq >"$tf" && mv "$tf" "$LOCALDATA_RELEASEGROUPS"
|
||||||
|
sort "$LOCALDATA_ARTISTS" | uniq >"$tf" && mv "$tf" "$LOCALDATA_ARTISTS"
|
||||||
|
# Populate cache with missing data
|
||||||
|
__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"
|
||||||
|
cut -d "$(printf '\t')" -f 1 "$LOCALDATA_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"
|
||||||
|
}
|
78
src/sh/mb.sh
78
src/sh/mb.sh
@@ -3,25 +3,55 @@
|
|||||||
# Helper methods to retrieve from cache, if it exists, and otherwise populate
|
# Helper methods to retrieve from cache, if it exists, and otherwise populate
|
||||||
# cache and retrieve
|
# cache and retrieve
|
||||||
__mb_artist_cache_or_fetch() {
|
__mb_artist_cache_or_fetch() {
|
||||||
if ! cache_get_artist_mb "$1"; then
|
if ! cache_get_artist "$1"; then
|
||||||
__api_mb_get_artist "$1" | cache_put_artist_mb "$1"
|
api_mb_artist "$1" | cache_put_artist "$1"
|
||||||
cache_get_artist_mb "$1"
|
cache_get_artist "$1"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
__mb_releasegroup_cache_or_fetch() {
|
||||||
|
if ! cache_get_releasegroup "$1"; then
|
||||||
|
api_mb_releasegroup "$1" | cache_put_releasegroup "$1"
|
||||||
|
cache_get_releasegroup "$1"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
__mb_release_cache_or_fetch() {
|
||||||
|
if ! cache_get_release "$1"; then
|
||||||
|
api_mb_release "$1" | cache_put_release "$1"
|
||||||
|
cache_get_release "$1"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
__mb_artist_cache_or_fetch_releasegroups() {
|
__mb_artist_cache_or_fetch_releasegroups() {
|
||||||
if ! cache_get_artist_mb_releasegroups "$1"; then
|
if ! cache_get_artist_releasegroups "$1"; then
|
||||||
__api_mb_browse_release_groups "$1" | cache_put_artist_mb_releasegroups "$1"
|
api_mb_browse_artist_releasegroups "$1" | cache_put_artist_releasegroups "$1"
|
||||||
rg="$(cache_get_artist_mb_releasegroups "$1")"
|
rg="$(cache_get_artist_releasegroups "$1")"
|
||||||
total=$(printf "%s" "$rg" | $JQ -r '."release-group-count"')
|
total=$(printf "%s" "$rg" | $JQ -r '."release-group-count"')
|
||||||
seen=$MB_BROWSE_STEPS
|
seen=$MB_BROWSE_STEPS
|
||||||
while [ "$total" -gt "$seen" ]; do
|
while [ "$total" -gt "$seen" ]; do
|
||||||
# Fetch remaning release groups, and append to cache
|
# Fetch remaning release groups, and append to cache
|
||||||
sleep 1 # Make sure we don't get blocked (we prefer not to handle failed requests...)
|
sleep 1 # Make sure we don't get blocked (we prefer not to handle failed requests...)
|
||||||
__api_mb_browse_release_groups "$1" "$seen" | cache_append_artist_mb_releasegroups "$1"
|
api_mb_browse_artist_releasegroups "$1" "$seen" | cache_append_artist_releasegroups "$1"
|
||||||
seen=$((seen + MB_BROWSE_STEPS))
|
seen=$((seen + MB_BROWSE_STEPS))
|
||||||
done
|
done
|
||||||
cache_get_artist_mb_releasegroups "$1"
|
cache_get_artist_releasegroups "$1"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
__mb_releasegroup_cache_or_fetch_releases() {
|
||||||
|
if ! cache_get_releasegroup_releases "$1"; then
|
||||||
|
api_mb_browse_releasegroup_releases "$1" | cache_put_releasegroup_releases "$1"
|
||||||
|
releases="$(cache_get_releasegroup_releases "$1")"
|
||||||
|
total=$(printf "%s" "$releases" | $JQ -r '."release-count"')
|
||||||
|
seen=$MB_BROWSE_STEPS
|
||||||
|
while [ "$total" -gt "$seen" ]; do
|
||||||
|
# Fetch remaning releases, and append to cache
|
||||||
|
sleep 1 # Make sure we don't get blocked (we prefer not to handle failed requests...)
|
||||||
|
api_mb_browse_releasegroup_releases "$1" "$seen" | cache_append_releasegroup_releases "$1"
|
||||||
|
seen=$((seen + MB_BROWSE_STEPS))
|
||||||
|
done
|
||||||
|
cache_get_releasegroup_releases "$1"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -38,10 +68,10 @@ mb_artist_wikidata() {
|
|||||||
wikidataid=$(mb_artist "$1" |
|
wikidataid=$(mb_artist "$1" |
|
||||||
$JQ -r '.relations |
|
$JQ -r '.relations |
|
||||||
map(select(.type=="wikidata")) |
|
map(select(.type=="wikidata")) |
|
||||||
.[0].url.resource' |
|
.[0].url.resource // ""' |
|
||||||
awk -F "/" '{print $NF}')
|
awk -F "/" '{print $NF}')
|
||||||
[ ! "$wikidataid" ] && return || [ "$wikidataid" = "null" ] && return
|
[ ! "$wikidataid" ] && return
|
||||||
__api_wikidata_get_sitelinks "$wikidataid" | cache_put_artist_wikidata "$1"
|
api_wikidata_sitelinks "$wikidataid" | cache_put_artist_wikidata "$1"
|
||||||
cache_get_artist_wikidata "$1"
|
cache_get_artist_wikidata "$1"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
@@ -59,10 +89,10 @@ mb_artist_enwikipedia() {
|
|||||||
# take the second route.
|
# take the second route.
|
||||||
wikidata=$(mb_artist_wikidata "$1" || true)
|
wikidata=$(mb_artist_wikidata "$1" || true)
|
||||||
wikiid=$(printf "%s" "$wikidata" |
|
wikiid=$(printf "%s" "$wikidata" |
|
||||||
$JQ -r '.enwiki.url' |
|
$JQ -r '.enwiki.url // ""' |
|
||||||
awk -F "/" '{print $NF}')
|
awk -F "/" '{print $NF}')
|
||||||
[ ! "$wikiid" ] && return || [ "$wikiid" = "null" ] && return
|
[ ! "$wikiid" ] && return
|
||||||
__api_wikipedia_en_get_summary "$wikiid" | cache_put_artist_enwikipedia "$1"
|
api_wikipedia_en_summary "$wikiid" | cache_put_artist_enwikipedia "$1"
|
||||||
cache_get_artist_enwikipedia "$1"
|
cache_get_artist_enwikipedia "$1"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
@@ -74,10 +104,10 @@ mb_artist_discogs() {
|
|||||||
discogsid=$(mb_artist "$1" |
|
discogsid=$(mb_artist "$1" |
|
||||||
$JQ -r '.relations |
|
$JQ -r '.relations |
|
||||||
map(select(.type=="discogs")) |
|
map(select(.type=="discogs")) |
|
||||||
.[0].url.resource' |
|
.[0].url.resource // ""' |
|
||||||
awk -F "/" '{print $NF}')
|
awk -F "/" '{print $NF}')
|
||||||
[ ! "$discogsid" ] && return || [ "$discogsid" = "null" ] && return
|
[ ! "$discogsid" ] && return
|
||||||
__api_discogs_get_artist "$discogsid" | cache_put_artist_discogs "$1"
|
api_discogs_artist "$discogsid" | cache_put_artist_discogs "$1"
|
||||||
cache_get_artist_discogs "$1"
|
cache_get_artist_discogs "$1"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
@@ -87,3 +117,17 @@ mb_artist_discogs() {
|
|||||||
mb_artist_releasegroups() {
|
mb_artist_releasegroups() {
|
||||||
__mb_artist_cache_or_fetch_releasegroups "$1"
|
__mb_artist_cache_or_fetch_releasegroups "$1"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Get MusicBrainz json for release group
|
||||||
|
# @argument $1: MusicBrainz Release-Group ID
|
||||||
|
mb_releasegroup() {
|
||||||
|
__mb_releasegroup_cache_or_fetch "$1"
|
||||||
|
}
|
||||||
|
|
||||||
|
mb_releasegroup_releases() {
|
||||||
|
__mb_releasegroup_cache_or_fetch_releases "$1"
|
||||||
|
}
|
||||||
|
|
||||||
|
mb_release() {
|
||||||
|
__mb_release_cache_or_fetch "$1"
|
||||||
|
}
|
||||||
|
@@ -1,9 +1,39 @@
|
|||||||
|
__shape() {
|
||||||
|
cat | tr -d '\r' | fold -s -w "$((FZF_PREVIEW_COLUMNS - 4))" | awk '{print " "$0" "}'
|
||||||
|
}
|
||||||
|
|
||||||
# Print preview of artist
|
# Print preview of artist
|
||||||
# @input $1: MusicBrainz Artist ID
|
# @input $1: MusicBrainz Artist ID
|
||||||
__preview_artist() {
|
__preview_artist() {
|
||||||
desc=$(mb_artist_enwikipedia "$1" | $JQ -r '.extract')
|
desc=$(mb_artist_enwikipedia "$1" | $JQ -r '.extract' | __shape)
|
||||||
if [ ! "$desc" ]; then
|
[ "$desc" ] || desc=$(mb_artist_discogs "$1" | $JQ -r '.profile' | sed 's/\[a=\([^]]*\)\]/\1/g' | __shape)
|
||||||
desc=$(mb_artist_discogs "$1" | $JQ -r '.profile' | sed 's/\[a=\([^]]*\)\]/\1/g')
|
if [ "$(mb_artist "$1" | $JQ -r '.type')" = "Person" ]; then
|
||||||
|
# Show birth place and death place of person
|
||||||
|
lsb=$(mb_artist "$1" | $JQ -r '."life-span".begin // ""' | head -c 4)
|
||||||
|
lse=$(mb_artist "$1" | $JQ -r '."life-span".end // ""' | head -c 4)
|
||||||
|
ab=$(mb_artist "$1" | $JQ -r '."begin-area".name // ""')
|
||||||
|
ae=$(mb_artist "$1" | $JQ -r '."end-area".name // ""')
|
||||||
|
if [ "$lsb" ] && [ "$ab" ]; then
|
||||||
|
begin=$(printf "$APV_DATEPLACE" "$lsb" "$ab")
|
||||||
|
elif [ "$lsb" ]; then
|
||||||
|
begin=$(printf "$APV_DATE" "$lsb")
|
||||||
|
elif [ "$ab" ]; then
|
||||||
|
begin=$(printf "$APV_PLACE" "$ab")
|
||||||
|
else
|
||||||
|
begin=""
|
||||||
fi
|
fi
|
||||||
echo "$desc" | fold -s -w "$FZF_PREVIEW_COLUMNS" | $CAT
|
if [ "$lse" ] && [ "$ae" ]; then
|
||||||
|
end=$(printf "$APV_DATEPLACE" "$lse" "$ae")
|
||||||
|
elif [ "$lse" ]; then
|
||||||
|
end=$(printf "$APV_DATE" "$lse")
|
||||||
|
elif [ "$ae" ]; then
|
||||||
|
end=$(printf "$APV_PLACE" "$ae")
|
||||||
|
else
|
||||||
|
end=""
|
||||||
|
fi
|
||||||
|
[ "$begin" ] && lifespan="$(printf "$APV_BORN" "$begin")"
|
||||||
|
[ "$end" ] && lifespan="$(printf "%s\n$APV_DIED" "$lifespan" "$end")"
|
||||||
|
fi
|
||||||
|
#link=$(printf "More info:\033]8;;%s\033\\ %s\033]8;;\033\\" "https://musicbrainz.org/" "[MusicBrainz]")
|
||||||
|
printf "$APV_FORMAT" "$desc" "${lifespan:-}"
|
||||||
}
|
}
|
||||||
|
@@ -1,23 +1,41 @@
|
|||||||
COLOR_ARTIST="\033[38;5;227m"
|
# Colors (local)
|
||||||
COLOR_DISAMBIGUATION="\033[38;5;110m"
|
FAINT="\033[2m"
|
||||||
COLOR_RESET="\033[m"
|
CARTIST="\033[38;5;209m"
|
||||||
FORMAT_PERSON="${FORMAT_PERSON:-👤 $COLOR_ARTIST<<name>>$COLOR_RESET}"
|
CTITLE="\033[38;5;229m"
|
||||||
FORMAT_GROUP="${FORMAT_GROUP:-👥 $COLOR_ARTIST<<name>>$COLOR_RESET}"
|
CYEAR="\033[38;5;179m"
|
||||||
FORMAT_DISAMBIGUATION="${FORMAT_DISAMBIGUATION:-$COLOR_DISAMBIGUATION(<<disambiguation>>)$COLOR_RESET}"
|
CDISAMB="$FAINT\033[38;5;172m"
|
||||||
COLOR_TYPE_SECONDARY="\033[38;5;242m"
|
CNOTE="\033[38;5;242m"
|
||||||
COLOR_RELEASE_TITLE="\033[38;5;229m"
|
CXXX="\033[38;5;109m"
|
||||||
COLOR_RELEASE_ARTIST="\033[38;5;219m"
|
CDESC="\033[38;5;254m"
|
||||||
COLOR_RELEASE_YEAR="\033[38;5;179m"
|
CLIFE="\033[38;5;251m"
|
||||||
FORMAT_RELEASE="${FORMAT_RELEASE:-"${COLOR_RELEASE_TITLE}<<title>>$COLOR_RESET"}"
|
OFF="\033[m"
|
||||||
FORMAT_RELEASE_W_ARTIST="${FORMAT_RELEASE_W_ARTIST:-"${COLOR_RELEASE_TITLE}<<title>>$COLOR_RESET — ${COLOR_RELEASE_ARTIST}<<artist>>$COLOR_RESET"}"
|
|
||||||
FORMAT_YEAR="${FORMAT_YEAR:-"${COLOR_RELEASE_YEAR}(<<year>>)${COLOR_RESET}"}"
|
FORMAT_LOCAL="${FORMAT_LOCAL:-"🔆"}"
|
||||||
|
export FORMAT_LOCAL
|
||||||
|
|
||||||
|
# Prompts
|
||||||
|
SEARCH_PROMPT=${SEARCH_PROMPT:-"🔎 〉"}
|
||||||
|
ARTIST_PROMPT="${ARTIST_PROMPT:-"🎤 ${CARTIST}%s$OFF 〉"}"
|
||||||
|
FULL_PROMPT="${FULL_PROMPT:-"🎤 ${CARTIST}%s$OFF 》${CTITLE}%s$OFF 〉"}"
|
||||||
|
|
||||||
|
# Artist view
|
||||||
|
AV_PERSON="${AV_PERSON:-"🧑🎤 $CARTIST<<name>>$OFF"}"
|
||||||
|
AV_GROUP="${AV_GROUP:-"🧑🤝🧑 $CARTIST<<name>>$OFF"}"
|
||||||
|
AV_DISAMBIGUATION="${AV_DISAMBIGUATION:-"$CDISAMB(<<disambiguation>>)$OFF"}"
|
||||||
|
|
||||||
|
# Release group view
|
||||||
|
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
|
||||||
FORMAT_TYPE_ALBUM="${FORMAT_TYPE_ALBUM:-"LP 💽"}"
|
FORMAT_TYPE_ALBUM="${FORMAT_TYPE_ALBUM:-"LP 💽"}"
|
||||||
FORMAT_TYPE_EP="${FORMAT_TYPE_EP:-"EP 📀"}"
|
FORMAT_TYPE_EP="${FORMAT_TYPE_EP:-"EP 📀"}"
|
||||||
FORMAT_TYPE_SINGLE="${FORMAT_TYPE_SINGLE:-"SI 🎶"}"
|
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:-"${COLOR_TYPE_SECONDARY}[☼: %s]$COLOR_RESET"}"
|
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"}"
|
||||||
@@ -31,11 +49,28 @@ FORMAT_TYPE_SECONDARY_MIXTAPE="${FORMAT_TYPE_SECONDARY_MIXTAPE:-"📼 mixtape"}"
|
|||||||
FORMAT_TYPE_SECONDARY_DEMO="${FORMAT_TYPE_SECONDARY_DEMO:-"🧪 demo"}"
|
FORMAT_TYPE_SECONDARY_DEMO="${FORMAT_TYPE_SECONDARY_DEMO:-"🧪 demo"}"
|
||||||
FORMAT_TYPE_SECONDARY_FIELDREC="${FORMAT_TYPE_SECONDARY_FIELDREC:-"🌿 field recording"}"
|
FORMAT_TYPE_SECONDARY_FIELDREC="${FORMAT_TYPE_SECONDARY_FIELDREC:-"🌿 field recording"}"
|
||||||
|
|
||||||
SEARCH_PROMPT=${SEARCH_PROMPT:-"🔎 〉"}
|
# Artist Preview
|
||||||
ARTIST_PROMPT="${ARTIST_PROMPT:-"🎤 ${COLOR_ARTIST}%s$COLOR_RESET 〉"}"
|
APV_FORMAT="${APV_FORMAT:-"\n\n${CDESC}%s${OFF}\n\n${CLIFE}%s${OFF}"}"
|
||||||
#BROWSE_PROMPT_ROOT="${BROWSE_PROMPT_ROOT:-"$SEARCH_PROMPT"}"
|
APV_DATE="${APV_DATE:-"%s"}"
|
||||||
#BROWSE_PROMPT_ARTIST="${BROWSE_PROMPT_ARTIST:-"$AFMT 〉"}"
|
APV_PLACE="${APV_PLACE:-"%s"}"
|
||||||
#BROWSE_PROMPT_RELEASE="${BROWSE_PROMPT_RELEASE:-"$AFMT 》 $RFMT 〉"}"
|
APV_DATEPLACE="${APV_DATEPLACE:-"$APV_DATE, $APV_PLACE"}"
|
||||||
#AFMT="${AFMT:-"🎤 ${ARTIST_COLOR}%s${OFF}"}"
|
APV_BORN="${APV_BORN:-"🍼 Born: %s"}"
|
||||||
#RFMT="${RFMT:-"💽 ${RELEASE_COLOR}%s${OFF}"}"
|
APV_DIED="${APV_DIED:-"🕯️ Died: %s"}"
|
||||||
#TFMT="${TFMT:-"🎵 ${TRACK_COLOR}%s${OFF}"}"
|
|
||||||
|
# Status
|
||||||
|
FORMAT_STATUS_OFFICIAL="${FORMAT_STATUS_OFFICIAL:-"🟢 official"}"
|
||||||
|
FORMAT_STATUS_PROMO="${FORMAT_STATUS_PROMO:-"📣 promo"}"
|
||||||
|
FORMAT_STATUS_BOOTLEG="${FORMAT_STATUS_BOOTLEG:-"💣 bootleg"}"
|
||||||
|
FORMAT_STATUS_PSEUDO="${FORMAT_STATUS_PSEUDO:-"🌀 pseudo"}"
|
||||||
|
FORMAT_STATUS_WITHDRAWN="${FORMAT_STATUS_WITHDRAWN:-"🔙 withdrawn"}"
|
||||||
|
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>>$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>>$OFF\t${CTITLE}<<title>>\t${CARTIST}<<artist>>\t${CXXX}<<duration>>$OFF"
|
||||||
|
@@ -1,20 +1,11 @@
|
|||||||
if command -v "fzf" >/dev/null; then
|
if command -v "fzf" >/dev/null; then
|
||||||
FZF="fzf --black"
|
FZF="fzf --black --ansi --cycle"
|
||||||
else
|
else
|
||||||
err "Did not find the command-line fuzzy finder fzf."
|
err "Did not find the command-line fuzzy finder fzf."
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
export FZF
|
export FZF
|
||||||
|
|
||||||
if command -v "bat" >/dev/null; then
|
|
||||||
CAT="bat"
|
|
||||||
elif command -v "batcat" >/dev/null; then
|
|
||||||
CAT="batcat"
|
|
||||||
fi
|
|
||||||
CAT=${CAT:+$CAT --color=always --style=plain --language=md}
|
|
||||||
CAT=${CAT:-cat}
|
|
||||||
export CAT
|
|
||||||
|
|
||||||
if command -v "curl" >/dev/null; then
|
if command -v "curl" >/dev/null; then
|
||||||
CURL="curl --silent"
|
CURL="curl --silent"
|
||||||
else
|
else
|
||||||
@@ -30,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
|
||||||
|
Reference in New Issue
Block a user