Compare commits

...

5 Commits

Author SHA1 Message Date
1d0ae4b5b2 fixed queue and movements 2025-08-28 16:14:56 +02:00
4a8f42cdd5 bugfix: single file play 2025-08-28 15:48:50 +02:00
8bfa2d7483 show playlist (buggy) 2025-08-28 15:16:00 +02:00
f2383c3803 extended awk scripts to return partentid 2025-08-28 13:26:47 +02:00
28f6dc67ba imprv: code ref 2025-08-28 10:30:57 +02:00
11 changed files with 265 additions and 178 deletions

View File

@@ -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
} }

View File

@@ -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
} }

View File

@@ -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
} }

View File

@@ -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]
} }

View File

@@ -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
;; ;;

View File

@@ -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

View File

@@ -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"}"

View File

@@ -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,20 +95,24 @@ 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 \
--arg rid "$1" \
--arg deco "$deco" \
'.media[] |
.position as $pos | .position as $pos |
.tracks[] | [ .tracks[] | [
$rid,
.id, .id,
$pos, $pos,
.number, .number,
.length, .length,
.recording.title, .recording.title,
(.recording."artist-credit" | map([.name, .joinphrase] | join("")) | join("")) (.recording."artist-credit" | map([.name, .joinphrase] | join("")) | join("")),
$deco
] | ] |
join("\t")' | join("\t")' |
awk \ awk \
@@ -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 \
--slurpfile decofile "$2" \
--arg base "$dir" \
--arg deco "$2" \
--arg tid "${3:-}" \
'$decofile[].tracks as $filenames |
. |
.id as $rid |
.media[] | .media[] |
.position as $pos | .position as $pos |
.tracks | .tracks |
if ($tid == "") then . else map(select(.id == $tid)) end |
map({ map({
t: [
$rid,
.id,
$pos,
.number,
.length,
.title,
(."artist-credit" | map([.name, .joinphrase] | join("")) | join("")),
$deco
] | join("\t"),
length: (.length / 1000 | round | tostring),
$pos, $pos,
number: .number, number: .number,
file: $filenames[.id] file: $filenames[.id]
}) | }) |
map( map(if(.number | type == "string" and test("^[0-9]+$")) then .number |= tonumber else . end) |
if(.number | type == "string" and test("^[0-9]+$")) then
.number |= tonumber
else
.
end
) |
sort_by([.pos, .number]) | sort_by([.pos, .number]) |
map($base + "/" + .file)[]' 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"
} }

View File

@@ -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
View 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"
}

View File

@@ -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"