some playlist controls

This commit is contained in:
2025-09-05 16:18:02 +02:00
parent e9fafe278f
commit 4cb9c8c46f
4 changed files with 104 additions and 15 deletions

View File

@@ -36,6 +36,9 @@ MODE_INSERT="show"
# Load playback helper # Load playback helper
. "sh/playback.sh" . "sh/playback.sh"
# Load playlist tools
. "sh/playlist.sh"
# Load AWK scripts # Load AWK scripts
. "sh/awk.sh" . "sh/awk.sh"
@@ -97,7 +100,6 @@ case "${1:-}" in
mbid_current="${3:-}" mbid_current="${3:-}"
mbid="${4:-}" mbid="${4:-}"
path="${5:-}" path="${5:-}"
debug "call to $*"
pbcmd=$(playback_cmd_from_key "$FZF_KEY") pbcmd=$(playback_cmd_from_key "$FZF_KEY")
case "$pbcmd" in case "$pbcmd" in
"$PLAYBACK_CMD_PLAY") "$PLAYBACK_CMD_PLAY")
@@ -106,7 +108,7 @@ case "${1:-}" in
"$VIEW_ARTIST" | "$VIEW_SEARCH_ARTIST" | "$VIEW_SEARCH_ALBUM" | "$VIEW_LIST_ARTISTS" | "$VIEW_LIST_ALBUMS") debug "not implemented" ;; "$VIEW_ARTIST" | "$VIEW_SEARCH_ARTIST" | "$VIEW_SEARCH_ALBUM" | "$VIEW_LIST_ARTISTS" | "$VIEW_LIST_ALBUMS") debug "not implemented" ;;
"$VIEW_RELEASEGROUP") generate_playlist "$mbid" "$path" | mpv_play_list >/dev/null ;; "$VIEW_RELEASEGROUP") generate_playlist "$mbid" "$path" | mpv_play_list >/dev/null ;;
"$VIEW_RELEASE") generate_playlist "$mbid_current" "$path" "$mbid" | mpv_play_list >/dev/null ;; "$VIEW_RELEASE") generate_playlist "$mbid_current" "$path" "$mbid" | mpv_play_list >/dev/null ;;
"$VIEW_PLAYLIST") generate_playlist "$mbid_current" "$path" "$mbid" | mpv_play_list >/dev/null ;; "$VIEW_PLAYLIST") mpv_play_index $((FZF_POS - 1)) >/dev/null ;;
esac esac
;; ;;
"$PLAYBACK_CMD_QUEUE") "$PLAYBACK_CMD_QUEUE")
@@ -152,9 +154,13 @@ case "${1:-}" in
case "$view" in case "$view" in
"$VIEW_ARTIST" | "$VIEW_SEARCH_ALBUM" | "$VIEW_LIST_ALBUMS") j="$(mb_releasegroup "$mbid" | $JQ -r --compact-output '."artist-credit"')" ;; "$VIEW_ARTIST" | "$VIEW_SEARCH_ALBUM" | "$VIEW_LIST_ALBUMS") j="$(mb_releasegroup "$mbid" | $JQ -r --compact-output '."artist-credit"')" ;;
"$VIEW_RELEASEGROUP") j="$(mb_release "$mbid" | $JQ -r --compact-output '."artist-credit"')" ;; "$VIEW_RELEASEGROUP") j="$(mb_release "$mbid" | $JQ -r --compact-output '."artist-credit"')" ;;
"$VIEW_RELEASE") j="$(mb_release "$mbid_cur" | $JQ -r --compact-output ".media | map(.tracks) | flatten[] | select(.id == \"$mbid\") | .\"artist-credit\"")" ;; "$VIEW_RELEASE" | "$VIEW_PLAYLIST") j="$(mb_release "$mbid_cur" | $JQ -r --compact-output ".media | map(.tracks) | flatten[] | select(.id == \"$mbid\") | .\"artist-credit\"")" ;;
"$VIEW_SEARCH_ARTIST" | "$VIEW_LIST_ARTISTS") aid="$mbid" ;; "$VIEW_SEARCH_ARTIST" | "$VIEW_LIST_ARTISTS") aid="$mbid" ;;
esac esac
if [ "$view" = "$VIEW_PLAYLIST" ]; then
printf "print(%s)+print(%s)+accept" "$VIEW_SELECT_ARTIST" "$j"
exit 0
fi
if [ "${j:-}" ]; then if [ "${j:-}" ]; then
cnt=$(echo "$j" | $JQ 'length') cnt=$(echo "$j" | $JQ 'length')
[ "$cnt" -eq 1 ] && aid="$(echo "$j" | $JQ -r '.[0].artist.id')" [ "$cnt" -eq 1 ] && aid="$(echo "$j" | $JQ -r '.[0].artist.id')"
@@ -163,7 +169,6 @@ case "${1:-}" in
exit 0 exit 0
;; ;;
"--draw") "--draw")
debug "call to $*"
# Generate fzf command to draw screen. # Generate fzf command to draw screen.
# #
# @argument $2: mode (default `normal`) # @argument $2: mode (default `normal`)
@@ -304,6 +309,27 @@ case "${1:-}" in
__preview_artist "$2" __preview_artist "$2"
exit 0 exit 0
;; ;;
"--playlistcmd")
case "$2" in
"$PLAYLIST_CMD_REMOVE") mpv_rm_index $((FZF_POS - 1)) ;;
"$PLAYLIST_CMD_UP") mpv_playlist_move $((FZF_POS - 1)) $((FZF_POS - 2)) ;;
"$PLAYLIST_CMD_DOWN") mpv_playlist_move $((FZF_POS - 0)) $((FZF_POS - 1)) ;;
"$PLAYLIST_CMD_CLEAR") mpv_playlist_clear ;;
"$PLAYLIST_CMD_CLEAR_ABOVE")
for i in $(seq "$FZF_POS"); do
mpv_rm_index 0
done
;;
"$PLAYLIST_CMD_CLEAR_BELOW")
cnt=$(mpv_playlist_count)
rem=$((cnt - FZF_POS + 1))
for i in $(seq "$rem"); do
mpv_rm_index $((FZF_POS - 1))
done
;;
esac
exit 0
;;
"--playlist") "--playlist")
list_playlist list_playlist
exit 0 exit 0
@@ -457,19 +483,42 @@ $KEYS_FILTER_LOCAL:transform:$0 --fzf-key {2} {3} {4}" \
MBID="$sel" MBID="$sel"
;; ;;
"$VIEW_PLAYLIST") "$VIEW_PLAYLIST")
list_playlist | sel=$(
$FZF \ list_playlist | $FZF \
--reverse \ --reverse \
--no-sort \ --no-sort \
--border=double \ --border=double \
--border-label=" Playlist " \ --border-label=" Playlist " \
--no-input \ --no-input \
--margin="2%,10%" \ --margin="2%,10%" \
--bind="r,ctrl-r:reload:$0 --playlist" \ --bind="$KEYS_DOWN,$KEYS_N_DOWN:down" \
--bind="q:accept" \ --bind="$KEYS_UP,$KEYS_N_UP:up" \
--bind="$KEYS_HALFPAGE_DOWN:half-page-down" \
--bind="$KEYS_HALFPAGE_UP:half-page-up" \
--bind="$KEYS_N_BOT:last" \
--bind="$KEYS_N_TOP:first" \
--bind="$KEYS_SELECT_ARTIST:transform:$0 --jumpto-artist $MODE_NORMAL $VIEW_PLAYLIST {2} {3}" \
--bind="$KEYS_LIST_ARTISTS:print($VIEW_LIST_ARTISTS)+accept" \
--bind="$KEYS_LIST_ALBUMS:print($VIEW_LIST_ALBUMS)+accept" \
--bind="$KEYS_SEARCH_ARTIST:print($VIEW_SEARCH_ARTIST)+accept" \
--bind="$KEYS_SEARCH_ALBUM:print($VIEW_SEARCH_ALBUM)+accept" \
--bind="$KEYS_BROWSE:execute-silent:open \"https://musicbrainz.org/\track/{r3}\"" \
--bind="$KEYS_OPEN:execute-silent:open \"\$(dirname {4})\"" \
--bind="$KEYS_PLAYBACK,$KEYS_N_PLAYBACK:transform($0 --playback $VIEW_PLAYLIST {2} {3} {4})+reload:$0 --playlist" \
--bind="$KEYS_PLAYLIST_RELOAD:reload:$0 --playlist" \
--bind="$KEYS_PLAYLIST_REMOVE:execute-silent($0 --playlistcmd $PLAYLIST_CMD_REMOVE)+reload:$0 --playlist" \
--bind="$KEYS_PLAYLIST_UP:execute-silent($0 --playlistcmd $PLAYLIST_CMD_UP)+up+reload:$0 --playlist" \
--bind="$KEYS_PLAYLIST_DOWN:execute-silent($0 --playlistcmd $PLAYLIST_CMD_DOWN)+down+reload:$0 --playlist" \
--bind="$KEYS_PLAYLIST_CLEAR:execute-silent($0 --playlistcmd $PLAYLIST_CMD_CLEAR)+reload:$0 --playlist" \
--bind="$KEYS_PLAYLIST_CLEAR_ABOVE:execute-silent($0 --playlistcmd $PLAYLIST_CMD_CLEAR_ABOVE)+reload:$0 --playlist" \
--bind="$KEYS_PLAYLIST_CLEAR_BELOW:execute-silent($0 --playlistcmd $PLAYLIST_CMD_CLEAR_BELOW)+reload:$0 --playlist" \
--bind="$KEYS_PLAYLIST_QUIT:print($VIEW_LIST_ARTISTS)+accept" \
--delimiter="\t" \ --delimiter="\t" \
--with-nth="{1}" >/dev/null --with-nth="{1}" || true
VIEW="" )
VIEW="$(echo "$sel" | head -1)"
ARGS="$(echo "$sel" | head -2 | tail -1)"
debug "playlist terminated: view=$VIEW, ARGS=$ARGS"
;; ;;
"$VIEW_QUIT") "$VIEW_QUIT")
debug "Quitting..." debug "Quitting..."

View File

@@ -64,7 +64,18 @@
# - KEYS_N_SEEK_FORWARD: Seek forward # - KEYS_N_SEEK_FORWARD: Seek forward
# - KEYS_N_SEEK_BACKWARD: Seek backward # - KEYS_N_SEEK_BACKWARD: Seek backward
# #
# Playlist: # Playlist (in the playlist, there is no `insert` mode):
# - KEYS_PLAYLIST_RELOAD: Manually reload playlist
# - KEYS_PLAYLIST_REMOVE: Remove item from playlist
# - KEYS_PLAYLIST_UP: Move item one position up
# - KEYS_PLAYLIST_DOWN: Move item one position down
# - KEYS_PLAYLIST_CLEAR: Clear playlist
# - KEYS_PLAYLIST_CLEAR_ABOVE: Remove all items above incl. the selected one
# - KEYS_PLAYLIST_CLEAR_BELOW: Remove all items below incl. the selected one
# - KEYS_PLAYLIST_GOTO_RELEASE: Jump to release or seleted enry
# - KEYS_PLAYLIST_STORE: Store current playlist as file
# - KEYS_PLAYLIST_LOAD: Load playlist from file
# - KEYS_PLAYLIST_QUIT: Quit playlist view
# #
# Mode selection: # Mode selection:
@@ -135,6 +146,19 @@ KEYS_N_SEEK_FORWARD="${KEYS_N_SEEK_FORWARD:-"N,f"}"
KEYS_N_SEEK_BACKWARD="${KEYS_N_SEEK_BACKWARD:-"P,b"}" KEYS_N_SEEK_BACKWARD="${KEYS_N_SEEK_BACKWARD:-"P,b"}"
KEYS_N_PLAYBACK="$KEYS_N_PLAY,$KEYS_N_QUEUE,$KEYS_N_QUEUE_NEXT,$KEYS_N_TOGGLE_PLAYBACK,$KEYS_N_PLAY_NEXT,$KEYS_N_PLAY_PREV,$KEYS_N_SEEK_FORWARD,$KEYS_N_SEEK_BACKWARD" KEYS_N_PLAYBACK="$KEYS_N_PLAY,$KEYS_N_QUEUE,$KEYS_N_QUEUE_NEXT,$KEYS_N_TOGGLE_PLAYBACK,$KEYS_N_PLAY_NEXT,$KEYS_N_PLAY_PREV,$KEYS_N_SEEK_FORWARD,$KEYS_N_SEEK_BACKWARD"
# Playlist (in the playlist, there is no `insert` mode):
KEYS_PLAYLIST_RELOAD="${KEYS_PLAYLIST_RELOAD:-"r,ctrl-r"}"
KEYS_PLAYLIST_REMOVE="${KEYS_PLAYLIST_REMOVE:-"x,delete"}"
KEYS_PLAYLIST_UP="${KEYS_PLAYLIST_UP:-"u"}"
KEYS_PLAYLIST_DOWN="${KEYS_PLAYLIST_DOWN:-"d"}"
KEYS_PLAYLIST_CLEAR="${KEYS_PLAYLIST_CLEAR:-"C"}"
KEYS_PLAYLIST_CLEAR_ABOVE="${KEYS_PLAYLIST_CLEAR_ABOVE:-"U"}"
KEYS_PLAYLIST_CLEAR_BELOW="${KEYS_PLAYLIST_CLEAR_BELOW:-"D"}"
KEYS_PLAYLIST_GOTO_RELEASE="${KEYS_PLAYLIST_GOTO_RELEASE:-"ctrl-g"}"
KEYS_PLAYLIST_STORE="${KEYS_PLAYLIST_STORE:-"ctrl-s"}"
KEYS_PLAYLIST_LOAD="${KEYS_PLAYLIST_LOAD:-"ctrl-o"}"
KEYS_PLAYLIST_QUIT="${KEYS_PLAYLIST_QUIT:-"q,ctrl-c,esc"}"
## Not yet characterized ## Not yet characterized
########################## ##########################

View File

@@ -23,8 +23,11 @@ mpv_playlist_position() {
} }
mpv_playlist_move() { mpv_playlist_move() {
debug "moving $1 -> $2" __mpv_command_with_args2 "playlist-move" "$1" "$2" >>/tmp/foo
__mpv_command_with_args2 "playlist-move" "$1" "$2" >>/tmp/foo 2>/dev/stdout }
mpv_playlist_clear() {
__mpv_command "playlist-clear"
} }
mpv_quit() { mpv_quit() {
@@ -37,10 +40,17 @@ mpv_start() {
$MPV --no-config --no-terminal --input-ipc-server="$MPV_SOCKET" --idle --no-osc --no-input-default-bindings & $MPV --no-config --no-terminal --input-ipc-server="$MPV_SOCKET" --idle --no-osc --no-input-default-bindings &
} }
mpv_play_index() {
__mpv_command_with_arg "playlist-play-index" "$1"
}
mpv_rm_index() {
__mpv_command_with_arg "playlist-remove" "$1"
}
mpv_play_list() { mpv_play_list() {
t=$(mktemp) t=$(mktemp)
cat >"$t" cat >"$t"
debug "Playing $(cat "$t")"
__mpv_command_with_arg "loadlist" "$t" __mpv_command_with_arg "loadlist" "$t"
rm -f "$t" rm -f "$t"
} }

6
src/sh/playlist.sh Normal file
View File

@@ -0,0 +1,6 @@
PLAYLIST_CMD_REMOVE="rm"
PLAYLIST_CMD_UP="up"
PLAYLIST_CMD_DOWN="down"
PLAYLIST_CMD_CLEAR="clear"
PLAYLIST_CMD_CLEAR_ABOVE="clear-above"
PLAYLIST_CMD_CLEAR_BELOW="clear-below"