From 8bfa2d74832f17a05dbe426b2144ca4c858e3bf6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=84min=20Baumeler?= Date: Thu, 28 Aug 2025 15:16:00 +0200 Subject: [PATCH] show playlist (buggy) --- src/awk/recordings.awk | 3 +- src/main.sh | 32 ++++++++++++++------- src/sh/lists.sh | 65 ++++++++++++++++++++++++------------------ src/sh/mpv.sh | 22 +++++++------- src/sh/theme.sh | 2 ++ 5 files changed, 76 insertions(+), 48 deletions(-) diff --git a/src/awk/recordings.awk b/src/awk/recordings.awk index 5118884..bb165ca 100644 --- a/src/awk/recordings.awk +++ b/src/awk/recordings.awk @@ -37,6 +37,7 @@ BEGIN { sub("<>", artist, line) sub("<>", dur, line) l = local_recordings[id] ? format_local : "" + c = id == current_id ? format_current : "" sortk = med" "nr - print sortk, l, line, parentid, id ":" local_recordings[id] + print sortk, l, c, line, parentid, id ":" local_recordings[id] } diff --git a/src/main.sh b/src/main.sh index e049354..51ad517 100755 --- a/src/main.sh +++ b/src/main.sh @@ -246,13 +246,10 @@ if [ "${1:-}" = "--fzf-key" ]; then [ "$path" ] || exit 0 case "$mode" in "$MODE_RELEASEGROUP") - tmplist=$(mktemp) - generate_playlist "$mbid" "$path" >"$tmplist" - mpv_play_list "$tmplist" >/dev/null - rm -f "$tmplist" + generate_playlist "$mbid" "$path" | mpv_play_list >/dev/null ;; "$MODE_RELEASE") - mpv_play_file "$path" >/dev/null + generate_playlist "$parentmbid" "$path" "$mbid" | mpv_play_list >/dev/null ;; esac ;; @@ -262,13 +259,10 @@ if [ "${1:-}" = "--fzf-key" ]; then [ "$path" ] || exit 0 case "$mode" in "$MODE_RELEASEGROUP") - tmplist=$(mktemp) - generate_playlist "$mbid" "$path" >"$tmplist" - mpv_queue_list "$tmplist" >/dev/null - rm -f "$tmplist" + generate_playlist "$mbid" "$path" | mpv_queue_list >/dev/null ;; "$MODE_RELEASE") - mpv_play_file "$path" >/dev/null + generate_playlist "$parentmbid" "$path" "$mbid" | mpv_queue_list >/dev/null ;; esac ;; @@ -563,6 +557,24 @@ $KEYS_FILTER_LOCAL:transform:$0 --fzf-key {2} {3} {4}" \ "$MODE_PLAYLIST") count=$(mpv_playlist_count) foo "Playlist: count=$count" + list_playlist | + $FZF \ + --reverse \ + --no-sort \ + --border=double \ + --border-label=" Playlist " \ + --no-input \ + --margin="2%,10%" \ + --bind="$KEYS_HALFPAGE_DOWN,$KEYS_HALFPAGE_UP,\ +$KEYS_BROWSE,\ +$KEYS_OUT,\ +$KEYS_SELECT_ARTIST,\ +$KEYS_PLAY,$KEYS_QUEUE,\ +$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 # --bind="$KEYS_HALFPAGE_DOWN,$KEYS_HALFPAGE_UP,\ #$KEYS_BROWSE,\ #$KEYS_IN,$KEYS_OUT,\ diff --git a/src/sh/lists.sh b/src/sh/lists.sh index 20c90e0..c0dbc21 100644 --- a/src/sh/lists.sh +++ b/src/sh/lists.sh @@ -120,7 +120,7 @@ list_recordings() { "$AWK_RECORDINGS" | sort -k1,1n -k2,2g | 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-]\+\) \+\([0-9a-f-]\+\):\(.*$\)$|\t\1\t\2\t\3|' if [ "${rectmp:-}" ] && [ -f "$rectmp" ]; then rm -f "$rectmp" @@ -144,9 +144,10 @@ list_local_releases() { # Generate playlist from MB release ID and path to decoration # @argument $1: MusicBrainz Release ID -# @argument $2: Path to decoration file +# @argument $2: Path to decoration file / path to audio file # @argument $3: MusicBrainz Track ID to select (optional) generate_playlist() { + foo "generate_playlist: releaseid(1)=$1; path(2)=$2; trackid(3)=$3" printf "#EXTM3U\n" dir="$(dirname "$2")" mb_release "$1" | @@ -159,10 +160,13 @@ generate_playlist() { if ($tid == "") then . else map(select(.id == $tid)) end | map({ t: [ - .title, - (."artist-credit" | map([.name, .joinphrase] | join("")) | join("")), + $rid, .id, - $rid + $pos, + .number, + .length, + .title, + (."artist-credit" | map([.name, .joinphrase] | join("")) | join("")) ] | join("\t"), length: (.length / 1000 | round | tostring), $pos, @@ -193,26 +197,33 @@ list_artists_from_json() { # Generate playlist view list_playlist() { count=$(mpv_playlist_count) - # 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|' + [ "$count" -eq 0 ] && return 0 + mpvquery="" + for i in $(seq 0 $((count - 1))); do + mpvquery="$mpvquery\${playlist/$i/current}\t\${playlist/$i/title}\t\${playlist/$i/filename}\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,9 "$mpvtmp" >"$rectmp" + # Get list + foo "current_id=$current_id" + foo "rectmp=$(cat "$rectmp")" + 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" | + sort -k1,1n -k2,2g | + 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" } diff --git a/src/sh/mpv.sh b/src/sh/mpv.sh index 64be3fa..d23238f 100644 --- a/src/sh/mpv.sh +++ b/src/sh/mpv.sh @@ -11,6 +11,8 @@ __mpv_command_with_args2() { } __mpv_get() { + foo "__mpv_get argument=$1" + foo "__mpv_get answer=$(__mpv_command_with_arg "expand-text" "$1" | $JQ -C)" __mpv_command_with_arg "expand-text" "$1" | $JQ -r '.data' } @@ -32,20 +34,20 @@ mpv_start() { $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" + t=$(mktemp) + cat >"$t" + foo "$(cat "$t")" + __mpv_command_with_arg "loadlist" "$t" + rm -f "$t" } mpv_queue_list() { - __mpv_command_with_arg "loadlist" "$1" "append-play" + t=$(mktemp) + cat >"$t" + foo "$(cat "$t")" + __mpv_command_with_arg "loadlist" "$t" "append-play" + rm -f "$t" } mpv_next() { diff --git a/src/sh/theme.sh b/src/sh/theme.sh index 4d6a016..fb6a1e3 100644 --- a/src/sh/theme.sh +++ b/src/sh/theme.sh @@ -12,6 +12,7 @@ OFF="\033[m" FORMAT_LOCAL="${FORMAT_LOCAL:-"🔆"}" export FORMAT_LOCAL +FORMAT_CURRENT="${FORMAT_CURRENT:-"👉"}" # Prompts SEARCH_PROMPT=${SEARCH_PROMPT:-"🔎 〉"} @@ -74,3 +75,4 @@ RV_ARTIST="${FAINT}by ${CARTIST}<>$OFF" # Recording view REC_FORMAT="${CNOTE}${FAINT}<>\t${CNOTE}<>$OFF\t${CTITLE}<>\t${CARTIST}<<artist>>\t${CXXX}<<duration>>$OFF" +REC_FORMAT_NO_NUMBER="${CTITLE}<<title>>\t${CARTIST}<<artist>>\t${CXXX}<<duration>>$OFF"