From 4d7dade94cc343dcdb5674a54f49a02d70d62cd8 Mon Sep 17 00:00:00 2001 From: ath3 Date: Thu, 27 Jun 2019 02:19:55 +0200 Subject: [PATCH] Add shuffle to mocplay --- plugins/mocplay | 70 ++++++++++++++++++++++++++++++++++--------------- 1 file changed, 49 insertions(+), 21 deletions(-) diff --git a/plugins/mocplay b/plugins/mocplay index 8e0f92ae..9057827b 100755 --- a/plugins/mocplay +++ b/plugins/mocplay @@ -5,40 +5,68 @@ # Notes: # - if selection is available, plays it, else plays the current file or directory # - appends tracks and exits is MOC is running, else clears playlist and adds tracks +# - to randomize the order of files appended to the playlist, set SHUFFLE=1 +# if you add a directory with many files when SHUFFLE=1 is set, it might take a very long time to finish! # # Shell: POSIX compliant -# Author: Arun Prakash Jana +# Author: Arun Prakash Jana, ath3 +IFS="$(printf '\n\r')" selection=${XDG_CONFIG_HOME:-$HOME/.config}/nnn/.selection cmd=$(pgrep -x mocp 2>/dev/null) ret=$cmd -if [ -s "$selection" ]; then - # try selection first - if [ -z "$ret" ]; then - # mocp not running - mocp -S +SHUFFLE=0 + +mocp_add() { + if [ $SHUFFLE = 1 ]; then + if [ -s "$selection" ]; then + arr=$(tr '\0' '\n' < "$selection") + elif [ -n "$1" ]; then + arr="$1" + fi + + for entry in $arr + do + if [ -d "$entry" ]; then + arr2=$arr2$(find "$entry" -type f) + else + arr2=$(printf "%s\n%s" "$entry" "$arr2") + fi + done + + arr2=$(echo "$arr2" | awk 'BEGIN{srand();}{print rand()"\t"$0}' | sort -k1 -n | cut -f2-) + for entry in $arr2 + do + if [ -f "$entry" ] && [ "$(echo "$entry" | grep -v '\.m3u$\|\.pls$')" ]; then + mocp -a "$entry" + fi + done - # clear selection and play - cat "$selection" | xargs -0 mocp -acp else - # mocp running, just append - cat "$selection" | xargs -0 mocp -a - fi -else - # ensure a file/dir is passed - if ! [ -z "$1" ]; then - if [ -z "$ret" ]; then - # mocp not running - mocp -S - - # clear selection and play - mocp -acp "$1" + if [ -s "$selection" ]; then + xargs < "$selection" -0 mocp -a else - # mocp running, just append mocp -a "$1" fi fi +} + +if [ ! -s "$selection" ] && [ -z "$1" ]; then + exit +fi + +if [ -z "$ret" ]; then + # mocp not running + mocp -S + + # clear selection and play + mocp -c + mocp_add "$1" + mocp -p +else + # mocp running, just append + mocp_add "$1" fi # uncomment the line below to show mocp interface after appending