export AUDIO="$DATA/audio" MUSIC_RAW="$AUDIO/songs/_raw" alias scbra='scpr zebra "/srv/funkwhale/data/music${PWD/$MUSIC}"' findsongs() { find -regextype posix-extended -maxdepth 1 -type f \ -iregex "${1:-.*\.(mp3|flac|wav|m4a)}" -printf "%P\n" } addtopl() { pl=$1 shift playlists=$MUSIC/Playlists realpath --relative-to $playlists "$@" | tee -a $playlists/$pl* } addmix() { mv -v "$1.cue" "$AUDIO/recordings/cues" addsong "$1.flac" Mixes } addsong() { test "$1" = "-q" && shift && quick="true" local raw="${1%.*}" local isflac=$(case "$1" in *.flac) echo "true";; esac) test "$isflac" || (echo "Converting to flac..." && flac "$1" --totally-silent) test "$quick" || (echo "Press ENTER when the metadata of the flac file is correct..." && read) echo "Converting to mp3..." lame -V0 "$1" --silent mkdir -p "$MUSIC/$2" mkdir -p "$MUSIC_RAW/$2" local destination="$MUSIC/$2/$raw.mp3" echo "Moving mp3 with metadata to $destination" ffmpeg -i "$raw.mp3" -i "$raw.flac" -c copy -map_metadata 1 "$destination" -v warning "${@:3}" && rm "$raw.mp3" test ! "$PWD" -ef "$MUSIC_RAW/$2" && mv -v "$raw.flac" "$MUSIC_RAW/$2" && (test "$isflac" || rm -v "$1") } addalbum() { mkdir -p "$MUSIC/$1" mkdir -p "$MUSIC_RAW/$1" f1 -regextype posix-extended -type f -iregex "\./(cover|folder)\.(png|jpg|jpeg)" | while read cover; do foundcover="true" cp -v "$cover" "$MUSIC/$1" && mv -v "$cover" "$MUSIC_RAW/$1" done test "$foundcover" || f1 -regextype posix-extended -type f -iregex ".*\.(png|jpg|jpeg)" | while read cover; do cp -v "$cover" "$MUSIC/$1" && mv -v "$cover" "$MUSIC_RAW/$1" done IFS=$'\n' for s in $(findsongs ".*\.(flac|wav)"); do highlight "$s" addsong -q "$s" "$1" "${@:2}" done unset IFS } formatsongs() { ( find -mindepth 1 -maxdepth 1 -type d -printf '%f\n' | formatin find "$@" "$PWD" -type d | while read d; do builtin cd "$d" && findsongs | formatin done ) # fd --no-ignore-vcs --type f --extension opus --exec opusdec --quiet "{}" "{.}.wav" \; ".*" "$@" find "$@" -type f -iname "*.wav" -exec sh -c ' f="{}" && echo "Converting $f to ${f%.*}.flac" && ffmpeg -i "$f" "${f%.*}.flac" -v warning && mv -v "$f" /tmp' \; } # Normalize filenames for files given from stdin formatin() { while read song; do new="$(formatsong "$song")" if test "$new" && test "$new" != "$song" then mkdir -p "$(dirname "$new")" && mv -iv "$song" "$new" fi done } # Normalize the given filename formatsong() { # Qobuz folders /^[A-z0-9_-]\+$/{s|_| |g;s|-|/|g}; echo "$1" | sed -e ' s/\b\(ft\|Ft\|Feat\|featuring\)\([ .]\)/feat\2/; s/\bfeat /feat. /; s/)(/) (/g; s/ [[(]\(None\|Free Download\|Original Mix\|Original\|Full Stream\|NCS Release\)[])]//i; s/ (\(Acoustic\|Live|.* Remix\))/ [\1]/i; s/ \[\(feat.*\)\]/ (\1)/i; s/^\([A-z]\+\) The \([^-]\+\)$/\1, the \2/g; s/ \(\..\{2,4\}\)$/\1/; s/---/ - /; s/-LLS\././; s/^[0-9]\{6\}_//; s/\([^/]\)_/\1 /g; s/ \././g; s/ / /g; s/\(\w\)+\(\w\)/\1 \2/g' - }