#!/usr/bin/env bash PLAYLIST="$1" set -e SONGS="$(find $HOME/Music -type f)" SONG_COUNT="$(echo "$SONGS" | wc -l)" function pick_song() { num=$(( 1 + $RANDOM % $SONG_COUNT )) echo "$SONGS" | sed "${num}q;d" } function get_flags() { path="$1" meuadata="flac" genre="$(ffmpeg -i "${path}" 2>&1 | grep GENRE | sed -e 's/^.*: //')" if [[ "$(echo "${path}" | sed -e 's/^.*\.\([^\.]*\)$/\1/')" == "mp3" ]] then metadata="mp3" genre="$(id3v2 -l "${path}" | grep '^TCON' | sed -e 's/^.*: //')" fi echo $genre } function in_playlist() { flags="$1" playlist="$2" playlists=" ALL:(HE|ME|LE) HE:HE MHE:(ME|HE) ME:ME LME:(LE|ME) LO:LO LOFI:LOFI LE_LOFI:(LE|LOFI) " query="$(echo "$playlists" | grep --ignore-case " ${playlist}:" | sed 's/^.*://')" if [[ "$(echo "$flags" | grep -E --no-ignore-case "$query")" != "" ]] then echo true else echo false fi } function get_like_level() { flags="$1" level="$(echo "$flags" | sed -e 's/^.*L\([0-3]\).*$/\1/')" if [[ "$level" == "$(echo "$level" | tr -dc '0-3')" ]] then echo $level fi } function shuffle() { playlist="$1" song="$(pick_song)" flags="$(get_flags "$song")" in_list=$(in_playlist "$flags" "$playlist") like=$(get_like_level "$flags") like_min=$(( 1 + $RANDOM % 3 )) if [[ "$in_list" == "false" || "$like" -lt "$like_min" ]] then shuffle "$playlist" else mpd_song="$(echo "$song" | sed -e 's|.*/Music/||')" echo "$mpd_song" mpc add "$mpd_song" fi } echo "$(shuffle $PLAYLIST)"