Compare commits
5 Commits
34628fc9b0
...
1d0ae4b5b2
Author | SHA1 | Date | |
---|---|---|---|
1d0ae4b5b2 | |||
4a8f42cdd5 | |||
8bfa2d7483 | |||
f2383c3803 | |||
28f6dc67ba |
@@ -16,5 +16,5 @@ BEGIN {
|
|||||||
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 l, name, $1
|
print l, name, "0", $1
|
||||||
}
|
}
|
||||||
|
@@ -4,18 +4,20 @@ BEGIN {
|
|||||||
delete local_recordings[0]
|
delete local_recordings[0]
|
||||||
if (file_local_recordings) {
|
if (file_local_recordings) {
|
||||||
while ((getline < file_local_recordings) == 1)
|
while ((getline < file_local_recordings) == 1)
|
||||||
local_recordings[$1] = $2
|
local_recordings[$1] = 1
|
||||||
close(file_local_recordings)
|
close(file_local_recordings)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
gsub("&", "\\\\&")
|
gsub("&", "\\\\&")
|
||||||
id = $1
|
parentid = $1
|
||||||
med = $2
|
id = $2
|
||||||
nr = $3
|
med = $3
|
||||||
dur = $4
|
nr = $4
|
||||||
title = $5
|
dur = $5
|
||||||
artist = $6
|
title = $6
|
||||||
|
artist = $7
|
||||||
|
deco = local_recordings[id] ? $8 : ""
|
||||||
# Parse duration
|
# Parse duration
|
||||||
if (dur) {
|
if (dur) {
|
||||||
dur = int(dur / 1000)
|
dur = int(dur / 1000)
|
||||||
@@ -36,6 +38,7 @@ BEGIN {
|
|||||||
sub("<<artist>>", artist, line)
|
sub("<<artist>>", artist, line)
|
||||||
sub("<<duration>>", dur, line)
|
sub("<<duration>>", dur, line)
|
||||||
l = local_recordings[id] ? format_local : ""
|
l = local_recordings[id] ? format_local : ""
|
||||||
|
c = id == current_id ? format_current : ""
|
||||||
sortk = med" "nr
|
sortk = med" "nr
|
||||||
print sortk, l, line, id ":" local_recordings[id]
|
print sortk, l, c, line, parentid, id ":" deco
|
||||||
}
|
}
|
||||||
|
@@ -58,5 +58,5 @@ BEGIN {
|
|||||||
line_year = year ? format_year : ""
|
line_year = year ? format_year : ""
|
||||||
sub("<<year>>", year, line_year)
|
sub("<<year>>", year, line_year)
|
||||||
sortk = year ? year : 0
|
sortk = year ? year : 0
|
||||||
print sortk, l, line_type, line_release, line_year, line_sectype, id
|
print sortk, l, line_type, line_release, line_year, line_sectype, "0", id
|
||||||
}
|
}
|
||||||
|
@@ -9,17 +9,18 @@ BEGIN {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
id = $1
|
parentid = $1
|
||||||
status = $2
|
id = $2
|
||||||
year = substr($3, 1, 4) + 0
|
status = $3
|
||||||
|
year = substr($4, 1, 4) + 0
|
||||||
year = year == 0 ? "" : year
|
year = year == 0 ? "" : year
|
||||||
covercount = $4
|
covercount = $5
|
||||||
label = $5
|
label = $6
|
||||||
trackcnt = $6
|
trackcnt = $7
|
||||||
media = $7
|
media = $8
|
||||||
country = $8
|
country = $9
|
||||||
title = $9
|
title = $10
|
||||||
artist = $10
|
artist = $11
|
||||||
switch (status) {
|
switch (status) {
|
||||||
case "Official": line_status = release_official; break
|
case "Official": line_status = release_official; break
|
||||||
case "Promotion": line_status = release_promotion; break
|
case "Promotion": line_status = release_promotion; break
|
||||||
@@ -53,5 +54,5 @@ BEGIN {
|
|||||||
sub("<<country>>", country, line)
|
sub("<<country>>", country, line)
|
||||||
sortk = year ? year : 0
|
sortk = year ? year : 0
|
||||||
l = local_releases[id] ? format_local : ""
|
l = local_releases[id] ? format_local : ""
|
||||||
print sortk, l, line, id ":" local_releases[id]
|
print sortk, l, line, parentid, id ":" local_releases[id]
|
||||||
}
|
}
|
||||||
|
109
src/main.sh
109
src/main.sh
@@ -26,6 +26,9 @@ set -eu
|
|||||||
# Load MusicBrainz and Discogs methods
|
# Load MusicBrainz and Discogs methods
|
||||||
. "sh/api.sh"
|
. "sh/api.sh"
|
||||||
|
|
||||||
|
# Load mpv methods
|
||||||
|
. "sh/mpv.sh"
|
||||||
|
|
||||||
# Load preview methods
|
# Load preview methods
|
||||||
. "sh/preview.sh"
|
. "sh/preview.sh"
|
||||||
|
|
||||||
@@ -79,6 +82,7 @@ if [ "${1:-}" = "--fzf-load" ]; then
|
|||||||
$JQ -r '.title')"
|
$JQ -r '.title')"
|
||||||
artist="$(mb_releasegroup "$args" |
|
artist="$(mb_releasegroup "$args" |
|
||||||
$JQ -r '."artist-credit" | map(([.name, .joinphrase]|join(""))) | join("")')"
|
$JQ -r '."artist-credit" | map(([.name, .joinphrase]|join(""))) | join("")')"
|
||||||
|
QUERY="$(printf "%s " "$FORMAT_STATUS_OFFICIAL")"
|
||||||
PROMPT=$(printf "$FULL_PROMPT" "$artist" "$title")
|
PROMPT=$(printf "$FULL_PROMPT" "$artist" "$title")
|
||||||
;;
|
;;
|
||||||
"$MODE_RELEASE")
|
"$MODE_RELEASE")
|
||||||
@@ -148,7 +152,7 @@ if [ "${1:-}" = "--fzf-change-reload" ]; then
|
|||||||
done
|
done
|
||||||
# Show results
|
# Show results
|
||||||
column -t -s "$(printf '\t')" "$RESULTS" |
|
column -t -s "$(printf '\t')" "$RESULTS" |
|
||||||
sed 's| \+\([0-9a-f-]\+\)$|\t\1|'
|
sed 's| \+\([0-9a-f-]\+\) \+\([0-9a-f-]\+\)$|\t\1\t\2|'
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -231,9 +235,9 @@ if [ "${1:-}" = "--fzf-change" ]; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
if [ "${1:-}" = "--fzf-key" ]; then
|
if [ "${1:-}" = "--fzf-key" ]; then
|
||||||
foo "KEY: $*; FZF_KEY=$FZF_KEY"
|
parentmbid="${2:-}"
|
||||||
mbid="${2:-}"
|
mbid="${3:-}"
|
||||||
path="${3:-}"
|
path="${4:-}"
|
||||||
mode=$(cut -d "#" -f 1 "$MODEFILE")
|
mode=$(cut -d "#" -f 1 "$MODEFILE")
|
||||||
args=$(cut -d "#" -f 2- "$MODEFILE")
|
args=$(cut -d "#" -f 2- "$MODEFILE")
|
||||||
|
|
||||||
@@ -242,29 +246,34 @@ if [ "${1:-}" = "--fzf-key" ]; then
|
|||||||
[ "$path" ] || exit 0
|
[ "$path" ] || exit 0
|
||||||
case "$mode" in
|
case "$mode" in
|
||||||
"$MODE_RELEASEGROUP")
|
"$MODE_RELEASEGROUP")
|
||||||
tmplist=$(mktemp)
|
generate_playlist "$mbid" "$path" | mpv_play_list >/dev/null
|
||||||
generate_playlist "$mbid" "$path" >"$tmplist"
|
|
||||||
mpv_play_list "$tmplist" >/dev/null
|
|
||||||
rm -f "$tmplist"
|
|
||||||
;;
|
;;
|
||||||
"$MODE_RELEASE")
|
"$MODE_RELEASE")
|
||||||
mpv_play_file "$path" >/dev/null
|
generate_playlist "$parentmbid" "$path" "$mbid" | mpv_play_list >/dev/null
|
||||||
|
;;
|
||||||
|
"$MODE_PLAYLIST")
|
||||||
|
generate_playlist "$parentmbid" "$path" "$mbid" | mpv_play_list >/dev/null
|
||||||
|
MODE_NEXT="$MODE_PLAYLIST"
|
||||||
|
ACCEPT=1
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
case ",$KEYS_QUEUE," in
|
case ",$KEYS_QUEUE," in
|
||||||
*",$FZF_KEY,"*)
|
*",$FZF_KEY,"*)
|
||||||
|
foo "queue key pressed"
|
||||||
[ "$path" ] || exit 0
|
[ "$path" ] || exit 0
|
||||||
case "$mode" in
|
case "$mode" in
|
||||||
"$MODE_RELEASEGROUP")
|
"$MODE_RELEASEGROUP")
|
||||||
tmplist=$(mktemp)
|
generate_playlist "$mbid" "$path" | mpv_queue_list >/dev/null
|
||||||
generate_playlist "$mbid" "$path" >"$tmplist"
|
|
||||||
mpv_queue_list "$tmplist" >/dev/null
|
|
||||||
rm -f "$tmplist"
|
|
||||||
;;
|
;;
|
||||||
"$MODE_RELEASE")
|
"$MODE_RELEASE")
|
||||||
mpv_play_file "$path" >/dev/null
|
generate_playlist "$parentmbid" "$path" "$mbid" | mpv_queue_list >/dev/null
|
||||||
|
;;
|
||||||
|
"$MODE_PLAYLIST")
|
||||||
|
generate_playlist "$parentmbid" "$path" "$mbid" | mpv_queue_list >/dev/null
|
||||||
|
MODE_NEXT="$MODE_PLAYLIST"
|
||||||
|
ACCEPT=1
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
;;
|
;;
|
||||||
@@ -273,10 +282,16 @@ if [ "${1:-}" = "--fzf-key" ]; then
|
|||||||
*",$FZF_KEY,"*) mpv_toggle_pause >/dev/null ;;
|
*",$FZF_KEY,"*) mpv_toggle_pause >/dev/null ;;
|
||||||
esac
|
esac
|
||||||
case ",$KEYS_PLAY_NEXT," in
|
case ",$KEYS_PLAY_NEXT," in
|
||||||
*",$FZF_KEY,"*) mpv_next >/dev/null ;;
|
*",$FZF_KEY,"*)
|
||||||
|
mpv_next >/dev/null
|
||||||
|
[ "$mode" = "$MODE_PLAYLIST" ] && MODE_NEXT="$MODE_PLAYLIST" && ACCEPT=1
|
||||||
|
;;
|
||||||
esac
|
esac
|
||||||
case ",$KEYS_PLAY_PREV," in
|
case ",$KEYS_PLAY_PREV," in
|
||||||
*",$FZF_KEY,"*) mpv_prev >/dev/null ;;
|
*",$FZF_KEY,"*)
|
||||||
|
mpv_prev >/dev/null
|
||||||
|
[ "$mode" = "$MODE_PLAYLIST" ] && MODE_NEXT="$MODE_PLAYLIST" && ACCEPT=1
|
||||||
|
;;
|
||||||
esac
|
esac
|
||||||
case ",$KEYS_SEEK_FORWARD," in
|
case ",$KEYS_SEEK_FORWARD," in
|
||||||
*",$FZF_KEY,"*) mpv_seek_forward >/dev/null ;;
|
*",$FZF_KEY,"*) mpv_seek_forward >/dev/null ;;
|
||||||
@@ -325,9 +340,9 @@ if [ "${1:-}" = "--fzf-key" ]; then
|
|||||||
"$MODE_SEARCH_ARTIST" | "$MODE_LIST_ARTISTS") urltype="artist" ;;
|
"$MODE_SEARCH_ARTIST" | "$MODE_LIST_ARTISTS") urltype="artist" ;;
|
||||||
"$MODE_ARTIST") urltype="release-group" ;;
|
"$MODE_ARTIST") urltype="release-group" ;;
|
||||||
"$MODE_RELEASEGROUP") urltype="release" ;;
|
"$MODE_RELEASEGROUP") urltype="release" ;;
|
||||||
"$MODE_RELEASE") urltype="track" ;;
|
"$MODE_RELEASE" | "$MODE_PLAYLIST") urltype="track" ;;
|
||||||
esac
|
esac
|
||||||
printf "execute-silent(xdg-open \"https://musicbrainz.org/%s/%s\" &)" "$urltype" "$mbid"
|
[ "${urltype:-}" ] && printf "execute-silent(xdg-open \"https://musicbrainz.org/%s/%s\" &)" "$urltype" "$mbid"
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
case ",$KEYS_OUT," in
|
case ",$KEYS_OUT," in
|
||||||
@@ -345,6 +360,11 @@ if [ "${1:-}" = "--fzf-key" ]; then
|
|||||||
MODE_NEXT="$MODE_RELEASEGROUP"
|
MODE_NEXT="$MODE_RELEASEGROUP"
|
||||||
MODE_NEXT_ARGS="$(mb_release "$args" | $JQ -r --compact-output '."release-group".id')"
|
MODE_NEXT_ARGS="$(mb_release "$args" | $JQ -r --compact-output '."release-group".id')"
|
||||||
;;
|
;;
|
||||||
|
"$MODE_PLAYLIST")
|
||||||
|
MODE_NEXT="$MODE_RELEASE"
|
||||||
|
MODE_NEXT_ARGS="$parentmbid"
|
||||||
|
ACCEPT=1
|
||||||
|
;;
|
||||||
esac
|
esac
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
@@ -517,10 +537,10 @@ case "${1:-}" in
|
|||||||
printf "%s#%s" "$MODE_SEARCH_ALBUM" "${2:-}" >"$MODEFILE"
|
printf "%s#%s" "$MODE_SEARCH_ALBUM" "${2:-}" >"$MODEFILE"
|
||||||
;;
|
;;
|
||||||
"--artists" | "")
|
"--artists" | "")
|
||||||
printf "%s" "$MODE_LIST_ARTISTS" >"$MODEFILE"
|
printf "%s#" "$MODE_LIST_ARTISTS" >"$MODEFILE"
|
||||||
;;
|
;;
|
||||||
"--albums")
|
"--albums")
|
||||||
printf "%s" "$MODE_LIST_ALBUMS" >"$MODEFILE"
|
printf "%s#" "$MODE_LIST_ALBUMS" >"$MODEFILE"
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
err "Unknown option $1 (see --help)"
|
err "Unknown option $1 (see --help)"
|
||||||
@@ -539,21 +559,11 @@ while true; do
|
|||||||
"$MODE_SELECT_ARTIST")
|
"$MODE_SELECT_ARTIST")
|
||||||
sel=$(
|
sel=$(
|
||||||
echo "$args" |
|
echo "$args" |
|
||||||
$JQ -r 'map([.artist.id, .artist.type, .name] | join("\t")) | join("\n")' |
|
list_artists_from_json |
|
||||||
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 \
|
||||||
--bind="$KEYS_HALFPAGE_DOWN,$KEYS_HALFPAGE_UP,\
|
--bind="$KEYS_HALFPAGE_DOWN,$KEYS_HALFPAGE_UP,\
|
||||||
$KEYS_BROWSE,\
|
$KEYS_BROWSE,\
|
||||||
$KEYS_FILTER_LOCAL:transform:$0 --fzf-key {2} {3}" \
|
$KEYS_FILTER_LOCAL:transform:$0 --fzf-key {2} {3} {4}" \
|
||||||
-1 \
|
-1 \
|
||||||
--border="bold" \
|
--border="bold" \
|
||||||
--border-label="Select artist" \
|
--border-label="Select artist" \
|
||||||
@@ -561,24 +571,29 @@ $KEYS_FILTER_LOCAL:transform:$0 --fzf-key {2} {3}" \
|
|||||||
--prompt="$SEARCH_PROMPT" \
|
--prompt="$SEARCH_PROMPT" \
|
||||||
--margin="5%,20%" \
|
--margin="5%,20%" \
|
||||||
--bind="$KEYS_FILTER_LOCAL:change-query($FORMAT_LOCAL )" \
|
--bind="$KEYS_FILTER_LOCAL:change-query($FORMAT_LOCAL )" \
|
||||||
--accept-nth="{2}" \
|
--accept-nth="{3}" \
|
||||||
--with-nth="{1}"
|
--with-nth="{1}"
|
||||||
)
|
)
|
||||||
printf "%s#%s" "$MODE_ARTIST" "$sel" >"$MODEFILE"
|
printf "%s#%s" "$MODE_ARTIST" "$sel" >"$MODEFILE"
|
||||||
;;
|
;;
|
||||||
"$MODE_PLAYLIST")
|
"$MODE_PLAYLIST")
|
||||||
count=$(mpv_playlist_count)
|
list_playlist |
|
||||||
foo "Playlist: count=$count"
|
$FZF \
|
||||||
# --bind="$KEYS_HALFPAGE_DOWN,$KEYS_HALFPAGE_UP,\
|
--reverse \
|
||||||
#$KEYS_BROWSE,\
|
--no-sort \
|
||||||
#$KEYS_IN,$KEYS_OUT,\
|
--border=double \
|
||||||
#$KEYS_SELECT_ARTIST,\
|
--border-label=" Playlist " \
|
||||||
#$KEYS_FILTER_LOCAL,$KEYS_FILTER_PRIMARY,$KEYS_FILTER_SECONDARY,\
|
--no-input \
|
||||||
#$KEYS_SWITCH_ARTIST_ALBUM,$KEYS_SWITCH_LOCAL_REMOTE,\
|
--margin="2%,10%" \
|
||||||
#$KEYS_PLAY,$KEYS_QUEUE,$KEYS_TOGGLE_PLAY_PAUSE,\
|
--bind="$KEYS_HALFPAGE_DOWN,$KEYS_HALFPAGE_UP,\
|
||||||
#$KEYS_PLAY_NEXT,$KEYS_PLAY_PREV,\
|
$KEYS_BROWSE,\
|
||||||
#$KEYS_SEEK_FORWARD,$KEYS_SEEK_BACKWARD:transform:$0 --fzf-key {2} {3}" \
|
$KEYS_OUT,\
|
||||||
printf "%s#%s" "$MODE_LIST_ARTISTS" "" >"$MODEFILE"
|
$KEYS_SELECT_ARTIST,\
|
||||||
|
$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} {4}" \
|
||||||
|
--delimiter="\t" \
|
||||||
|
--with-nth="{1}" >/dev/null
|
||||||
;;
|
;;
|
||||||
*) # Main instance
|
*) # Main instance
|
||||||
$FZF \
|
$FZF \
|
||||||
@@ -593,11 +608,11 @@ $KEYS_SELECT_ARTIST,\
|
|||||||
$KEYS_FILTER_LOCAL,$KEYS_FILTER_PRIMARY,$KEYS_FILTER_SECONDARY,\
|
$KEYS_FILTER_LOCAL,$KEYS_FILTER_PRIMARY,$KEYS_FILTER_SECONDARY,\
|
||||||
$KEYS_SWITCH_ARTIST_ALBUM,$KEYS_SWITCH_LOCAL_REMOTE,\
|
$KEYS_SWITCH_ARTIST_ALBUM,$KEYS_SWITCH_LOCAL_REMOTE,\
|
||||||
$KEYS_PLAY,$KEYS_QUEUE,\
|
$KEYS_PLAY,$KEYS_QUEUE,\
|
||||||
$KEYS_SHOW_PLAYLIST:transform:$0 --fzf-key {2} {3}" \
|
$KEYS_SHOW_PLAYLIST:transform:$0 --fzf-key {2} {3} {4}" \
|
||||||
--info="inline-right" \
|
--info="inline-right" \
|
||||||
--info-command="$0 --fzf-info" \
|
--info-command="$0 --fzf-info" \
|
||||||
--preview-window="right,25%,border-left,wrap,<30(hidden)" \
|
--preview-window="right,25%,border-left,wrap,<30(hidden)" \
|
||||||
--preview="$0 --internal-preview-artist {2}" \
|
--preview="$0 --internal-preview-artist {3}" \
|
||||||
--delimiter="\t" \
|
--delimiter="\t" \
|
||||||
--with-nth="{1}" >/dev/null
|
--with-nth="{1}" >/dev/null
|
||||||
;;
|
;;
|
||||||
|
@@ -4,76 +4,6 @@ USER_AGENT="$APP_NAME/$APP_VERSION ($APP_WEBSITE)"
|
|||||||
SLEEP_ON_ERROR=1
|
SLEEP_ON_ERROR=1
|
||||||
export MB_BROWSE_STEPS
|
export MB_BROWSE_STEPS
|
||||||
|
|
||||||
__mpv_command() {
|
|
||||||
printf "{ \"command\": [\"%s\"] }\n" "$1" | $SOCAT - "$MPV_SOCKET"
|
|
||||||
}
|
|
||||||
|
|
||||||
__mpv_command_with_arg() {
|
|
||||||
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() {
|
__api_mb() {
|
||||||
tmpout=$(mktemp)
|
tmpout=$(mktemp)
|
||||||
for _ in $(seq "$MB_MAX_RETRIES"); do
|
for _ in $(seq "$MB_MAX_RETRIES"); do
|
||||||
|
@@ -10,7 +10,7 @@ KEYS_FILTER_SECONDARY="${KEYS_FILTER_SECONDARY:-"alt-2"}"
|
|||||||
KEYS_SWITCH_ARTIST_ALBUM="${KEYS_SWITCH_ARTIST_ALBUM:-"tab"}"
|
KEYS_SWITCH_ARTIST_ALBUM="${KEYS_SWITCH_ARTIST_ALBUM:-"tab"}"
|
||||||
KEYS_SWITCH_LOCAL_REMOTE="${KEYS_SWITCH_LOCAL_REMOTE:-"ctrl-/"}"
|
KEYS_SWITCH_LOCAL_REMOTE="${KEYS_SWITCH_LOCAL_REMOTE:-"ctrl-/"}"
|
||||||
KEYS_PLAY="${KEYS_PLAY:-"enter"}"
|
KEYS_PLAY="${KEYS_PLAY:-"enter"}"
|
||||||
KEYS_QUEUE="${KEYS_QUEUE:-"alt-enter"}"
|
KEYS_QUEUE="${KEYS_QUEUE:-"ctrl-alt-m"}"
|
||||||
KEYS_TOGGLE_PLAY_PAUSE="${KEYS_TOGGLE_PLAY_PAUSE:-"space"}"
|
KEYS_TOGGLE_PLAY_PAUSE="${KEYS_TOGGLE_PLAY_PAUSE:-"space"}"
|
||||||
KEYS_PLAY_NEXT="${KEYS_PLAY_NEXT:-"l,right"}"
|
KEYS_PLAY_NEXT="${KEYS_PLAY_NEXT:-"l,right"}"
|
||||||
KEYS_PLAY_PREV="${KEYS_PLAY_PREV:-"h,left"}"
|
KEYS_PLAY_PREV="${KEYS_PLAY_PREV:-"h,left"}"
|
||||||
|
139
src/sh/lists.sh
139
src/sh/lists.sh
@@ -42,7 +42,7 @@ list_releasegroups() {
|
|||||||
sort -n -r |
|
sort -n -r |
|
||||||
cut -d "$(printf '\t')" -f 2- |
|
cut -d "$(printf '\t')" -f 2- |
|
||||||
column -t -s "$(printf '\t')" |
|
column -t -s "$(printf '\t')" |
|
||||||
sed 's| \+\([0-9a-f-]\+\)$|\t\1|'
|
sed 's| \+\([0-9a-f-]\+\) \+\([0-9a-f-]\+\)$|\t\1\t\2|'
|
||||||
}
|
}
|
||||||
|
|
||||||
# List releases in given relese group
|
# List releases in given relese group
|
||||||
@@ -53,7 +53,8 @@ list_releases() {
|
|||||||
artist="$(mb_releasegroup "$1" |
|
artist="$(mb_releasegroup "$1" |
|
||||||
$JQ -r '."artist-credit" | map(([.name, .joinphrase]|join(""))) | join("")')"
|
$JQ -r '."artist-credit" | map(([.name, .joinphrase]|join(""))) | join("")')"
|
||||||
mb_releasegroup_releases "$1" |
|
mb_releasegroup_releases "$1" |
|
||||||
$JQ -r '."releases"[] | [
|
$JQ -r --arg rid "$1" '."releases"[] | [
|
||||||
|
$rid,
|
||||||
.id,
|
.id,
|
||||||
.status,
|
.status,
|
||||||
.date,
|
.date,
|
||||||
@@ -86,7 +87,7 @@ list_releases() {
|
|||||||
sort -n -r |
|
sort -n -r |
|
||||||
cut -d "$(printf '\t')" -f 2- |
|
cut -d "$(printf '\t')" -f 2- |
|
||||||
column -t -s "$(printf '\t')" |
|
column -t -s "$(printf '\t')" |
|
||||||
sed 's| \+\([0-9a-f-]\+\):\(.*$\)$|\t\1\t\2|'
|
sed 's| \+\([0-9a-f-]\+\) \+\([0-9a-f-]\+\):\(.*$\)$|\t\1\t\2\t\3|'
|
||||||
}
|
}
|
||||||
|
|
||||||
# List recordings of given release
|
# List recordings of given release
|
||||||
@@ -94,22 +95,26 @@ list_releases() {
|
|||||||
list_recordings() {
|
list_recordings() {
|
||||||
deco="$(grep "$1" "$LOCALDATA_RELEASES" | cut -d "$(printf '\t')" -f 2)"
|
deco="$(grep "$1" "$LOCALDATA_RELEASES" | cut -d "$(printf '\t')" -f 2)"
|
||||||
if [ "$deco" ]; then
|
if [ "$deco" ]; then
|
||||||
base="$(dirname "$deco")"
|
|
||||||
rectmp=$(mktemp)
|
rectmp=$(mktemp)
|
||||||
$JQ -r --arg base "$base/" '.tracks | to_entries | map(.key + "\t" + $base + .value) | join("\n")' "$deco" >"$rectmp"
|
$JQ -r '.tracks | keys | join("\n")' "$deco" >"$rectmp"
|
||||||
fi
|
fi
|
||||||
mb_release "$1" |
|
mb_release "$1" |
|
||||||
$JQ -r '.media[] |
|
$JQ -r \
|
||||||
.position as $pos |
|
--arg rid "$1" \
|
||||||
.tracks[] | [
|
--arg deco "$deco" \
|
||||||
.id,
|
'.media[] |
|
||||||
$pos,
|
.position as $pos |
|
||||||
.number,
|
.tracks[] | [
|
||||||
.length,
|
$rid,
|
||||||
.recording.title,
|
.id,
|
||||||
(.recording."artist-credit" | map([.name, .joinphrase] | join("")) | join(""))
|
$pos,
|
||||||
] |
|
.number,
|
||||||
join("\t")' |
|
.length,
|
||||||
|
.recording.title,
|
||||||
|
(.recording."artist-credit" | map([.name, .joinphrase] | join("")) | join("")),
|
||||||
|
$deco
|
||||||
|
] |
|
||||||
|
join("\t")' |
|
||||||
awk \
|
awk \
|
||||||
-F "\t" \
|
-F "\t" \
|
||||||
-v file_local_recordings="${rectmp:-}" \
|
-v file_local_recordings="${rectmp:-}" \
|
||||||
@@ -118,8 +123,8 @@ list_recordings() {
|
|||||||
"$AWK_RECORDINGS" |
|
"$AWK_RECORDINGS" |
|
||||||
sort -k1,1n -k2,2g |
|
sort -k1,1n -k2,2g |
|
||||||
cut -d "$(printf '\t')" -f 2- |
|
cut -d "$(printf '\t')" -f 2- |
|
||||||
column -t -s "$(printf '\t')" -R 2,3,6 |
|
column -t -s "$(printf '\t')" -R 3,4,7 |
|
||||||
sed 's| \+\([0-9a-f-]\+\):\(.*$\)$|\t\1\t\2|'
|
sed 's| \+\([0-9a-f-]\+\) \+\([0-9a-f-]\+\):\(.*$\)$|\t\1\t\2\t\3|'
|
||||||
if [ "${rectmp:-}" ] && [ -f "$rectmp" ]; then
|
if [ "${rectmp:-}" ] && [ -f "$rectmp" ]; then
|
||||||
rm -f "$rectmp"
|
rm -f "$rectmp"
|
||||||
fi
|
fi
|
||||||
@@ -143,25 +148,87 @@ list_local_releases() {
|
|||||||
# Generate playlist from MB release ID and path to decoration
|
# Generate playlist from MB release ID and path to decoration
|
||||||
# @argument $1: MusicBrainz Release ID
|
# @argument $1: MusicBrainz Release ID
|
||||||
# @argument $2: Path to decoration file
|
# @argument $2: Path to decoration file
|
||||||
|
# @argument $3: MusicBrainz Track ID to select (optional)
|
||||||
generate_playlist() {
|
generate_playlist() {
|
||||||
|
printf "#EXTM3U\n"
|
||||||
dir="$(dirname "$2")"
|
dir="$(dirname "$2")"
|
||||||
mb_release "$1" |
|
mb_release "$1" |
|
||||||
$JQ -r --slurpfile deco "$2" --arg base "$dir" '$deco[].tracks as $filenames |
|
$JQ -r \
|
||||||
.media[] |
|
--slurpfile decofile "$2" \
|
||||||
.position as $pos |
|
--arg base "$dir" \
|
||||||
.tracks |
|
--arg deco "$2" \
|
||||||
map({
|
--arg tid "${3:-}" \
|
||||||
$pos,
|
'$decofile[].tracks as $filenames |
|
||||||
number: .number,
|
. |
|
||||||
file: $filenames[.id]
|
.id as $rid |
|
||||||
}) |
|
.media[] |
|
||||||
map(
|
.position as $pos |
|
||||||
if(.number | type == "string" and test("^[0-9]+$")) then
|
.tracks |
|
||||||
.number |= tonumber
|
if ($tid == "") then . else map(select(.id == $tid)) end |
|
||||||
else
|
map({
|
||||||
.
|
t: [
|
||||||
end
|
$rid,
|
||||||
) |
|
.id,
|
||||||
sort_by([.pos, .number]) |
|
$pos,
|
||||||
map($base + "/" + .file)[]'
|
.number,
|
||||||
|
.length,
|
||||||
|
.title,
|
||||||
|
(."artist-credit" | map([.name, .joinphrase] | join("")) | join("")),
|
||||||
|
$deco
|
||||||
|
] | join("\t"),
|
||||||
|
length: (.length / 1000 | round | tostring),
|
||||||
|
$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("#EXTINF:" + .length + "," + .t + "\n" + $base + "/" + .file)[]'
|
||||||
|
}
|
||||||
|
|
||||||
|
# Generate artist list from JSON
|
||||||
|
list_artists_from_json() {
|
||||||
|
cat |
|
||||||
|
$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-]\+\) \+\([0-9a-f-]\+\)$|\t\1\t\2|'
|
||||||
|
}
|
||||||
|
|
||||||
|
# Generate playlist view
|
||||||
|
list_playlist() {
|
||||||
|
count=$(mpv_playlist_count)
|
||||||
|
[ "$count" -eq 0 ] && return 0
|
||||||
|
mpvquery=""
|
||||||
|
for i in $(seq 0 $((count - 1))); do
|
||||||
|
mpvquery="$mpvquery\${playlist/$i/current}\t\${playlist/$i/title}\n"
|
||||||
|
done
|
||||||
|
mpvtmp=$(mktemp)
|
||||||
|
# Get playlist information from mpv
|
||||||
|
__mpv_get "$mpvquery" | grep '.' >"$mpvtmp"
|
||||||
|
# Get MusicBrainz Track ID of current recording
|
||||||
|
current_id=$(grep "^yes" "$mpvtmp" | cut -d "$(printf '\t')" -f 3)
|
||||||
|
# Get file to be used in file_local_recordings
|
||||||
|
rectmp=$(mktemp)
|
||||||
|
cut -d "$(printf '\t')" -f 3 "$mpvtmp" >"$rectmp"
|
||||||
|
# Get list
|
||||||
|
cut -d "$(printf '\t')" -f 2- "$mpvtmp" |
|
||||||
|
awk \
|
||||||
|
-F "\t" \
|
||||||
|
-v file_local_recordings="${rectmp:-}" \
|
||||||
|
-v format="$REC_FORMAT_NO_NUMBER" \
|
||||||
|
-v format_current="$FORMAT_CURRENT" \
|
||||||
|
-v current_id="$current_id" \
|
||||||
|
"$AWK_RECORDINGS" |
|
||||||
|
cut -d "$(printf '\t')" -f 2- |
|
||||||
|
column -t -s "$(printf '\t')" -R 5 |
|
||||||
|
sed 's| \+\([0-9a-f-]\+\) \+\([0-9a-f-]\+\):\(.*$\)$|\t\1\t\2\t\3|'
|
||||||
|
rm -f "$rectmp" "$mpvtmp"
|
||||||
}
|
}
|
||||||
|
@@ -150,7 +150,7 @@ load_local() {
|
|||||||
"$AWK_ARTISTS" |
|
"$AWK_ARTISTS" |
|
||||||
sort |
|
sort |
|
||||||
column -t -s "$(printf '\t')" |
|
column -t -s "$(printf '\t')" |
|
||||||
sed 's| \+\([0-9a-f-]\+\)$|\t\1|' >"$LOCALDATA_ARTISTS_VIEW"
|
sed 's| \+\([0-9a-f-]\+\) \+\([0-9a-f-]\+\)$|\t\1\t\2|' >"$LOCALDATA_ARTISTS_VIEW"
|
||||||
info "Precomputing releasegroup view"
|
info "Precomputing releasegroup view"
|
||||||
while IFS= read -r rgid; do
|
while IFS= read -r rgid; do
|
||||||
mb_releasegroup "$rgid" | $JQ -r '[
|
mb_releasegroup "$rgid" | $JQ -r '[
|
||||||
@@ -192,11 +192,12 @@ load_local() {
|
|||||||
sort -n -r |
|
sort -n -r |
|
||||||
cut -d "$(printf '\t')" -f 2- |
|
cut -d "$(printf '\t')" -f 2- |
|
||||||
column -t -s "$(printf '\t')" |
|
column -t -s "$(printf '\t')" |
|
||||||
sed 's| \+\([0-9a-f-]\+\)$|\t\1|' >"$LOCALDATA_RELEASEGROUPS_VIEW"
|
sed 's| \+\([0-9a-f-]\+\) \+\([0-9a-f-]\+\)$|\t\1\t\2|' >"$LOCALDATA_RELEASEGROUPS_VIEW"
|
||||||
info "Precomputing release view"
|
info "Precomputing release view"
|
||||||
cut -d "$(printf '\t')" -f 1 "$LOCALDATA_RELEASES" |
|
cut -d "$(printf '\t')" -f 1 "$LOCALDATA_RELEASES" |
|
||||||
while IFS= read -r rid; do
|
while IFS= read -r rid; do
|
||||||
mb_release "$rid" | $JQ -r '[
|
mb_release "$rid" | $JQ -r '[
|
||||||
|
"0",
|
||||||
.id,
|
.id,
|
||||||
.status,
|
.status,
|
||||||
.date,
|
.date,
|
||||||
@@ -228,5 +229,5 @@ load_local() {
|
|||||||
sort -n -r |
|
sort -n -r |
|
||||||
cut -d "$(printf '\t')" -f 2- |
|
cut -d "$(printf '\t')" -f 2- |
|
||||||
column -t -s "$(printf '\t')" |
|
column -t -s "$(printf '\t')" |
|
||||||
sed 's| \+\([0-9a-f-]\+\):\(.*$\)$|\t\1\t\2|' >"$LOCALDATA_RELEASES_VIEW"
|
sed 's| \+\([0-9a-f-]\+\) \+\([0-9a-f-]\+\):\(.*$\)$|\t\1\t\2\t\3|' >"$LOCALDATA_RELEASES_VIEW"
|
||||||
}
|
}
|
||||||
|
68
src/sh/mpv.sh
Normal file
68
src/sh/mpv.sh
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
__mpv_command() {
|
||||||
|
printf "{ \"command\": [\"%s\"] }\n" "$1" | $SOCAT - "$MPV_SOCKET"
|
||||||
|
}
|
||||||
|
|
||||||
|
__mpv_command_with_arg() {
|
||||||
|
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_list() {
|
||||||
|
t=$(mktemp)
|
||||||
|
cat >"$t"
|
||||||
|
__mpv_command_with_arg "loadlist" "$t"
|
||||||
|
rm -f "$t"
|
||||||
|
}
|
||||||
|
|
||||||
|
mpv_queue_list() {
|
||||||
|
foo "mpv_queue_list"
|
||||||
|
t=$(mktemp)
|
||||||
|
cat >"$t"
|
||||||
|
__mpv_command_with_args2 "loadlist" "$t" "append-play"
|
||||||
|
rm -f "$t"
|
||||||
|
}
|
||||||
|
|
||||||
|
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"
|
||||||
|
}
|
@@ -12,6 +12,7 @@ OFF="\033[m"
|
|||||||
|
|
||||||
FORMAT_LOCAL="${FORMAT_LOCAL:-"🔆"}"
|
FORMAT_LOCAL="${FORMAT_LOCAL:-"🔆"}"
|
||||||
export FORMAT_LOCAL
|
export FORMAT_LOCAL
|
||||||
|
FORMAT_CURRENT="${FORMAT_CURRENT:-"👉"}"
|
||||||
|
|
||||||
# Prompts
|
# Prompts
|
||||||
SEARCH_PROMPT=${SEARCH_PROMPT:-"🔎 〉"}
|
SEARCH_PROMPT=${SEARCH_PROMPT:-"🔎 〉"}
|
||||||
@@ -74,3 +75,4 @@ RV_ARTIST="${FAINT}by ${CARTIST}<<artist>>$OFF"
|
|||||||
|
|
||||||
# Recording view
|
# Recording view
|
||||||
REC_FORMAT="${CNOTE}${FAINT}<<med>>\t${CNOTE}<<nr>>$OFF\t${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"
|
||||||
|
REC_FORMAT_NO_NUMBER="${CTITLE}<<title>>\t${CARTIST}<<artist>>\t${CXXX}<<duration>>$OFF"
|
||||||
|
Reference in New Issue
Block a user