dotfiles/private_dot_local/bin/executable_shuffle

82 lines
1.5 KiB
Bash

#!/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)"