aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar ath3 <ha05190@protonmail.com>2019-06-27 02:19:55 +0200
committerGravatar ath3 <ha05190@protonmail.com>2019-06-27 02:19:55 +0200
commit4d7dade94cc343dcdb5674a54f49a02d70d62cd8 (patch)
treeb3eb5ee84884059745375e0a1dc26776764b8817
parent900ffbebc7c73942be779d1bc10b40df3c27cebb (diff)
downloadnnn-4d7dade94cc343dcdb5674a54f49a02d70d62cd8.tar.gz
Add shuffle to mocplay
-rwxr-xr-xplugins/mocplay70
1 files changed, 49 insertions, 21 deletions
diff --git a/plugins/mocplay b/plugins/mocplay
index 8e0f92a..9057827 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