#!/usr/bin/env bash
-# Desc: Copies random music
+# Desc: Copies random audio files
# Usage: bk-copy-rand-music.sh [dir SOURCE] [dir DEST] [int DURATION]
+# Version: 0.0.3
declare -Ag appRollCall # Associative array for storing app status
declare -Ag fileRollCall # Associative array for storing file status
# Adjustable parameters
music_codecs=("vorbis" "aac" "mp3" "flac" "opus"); # whitelist of valid codec_names ffprobe might return
-max_loops=1000000; # max number of files to test whether are audio or not
+max_loops="1000000"; # max number of files to test whether are audio or not
+max_filename_length="255"; # max output filename length
+min_file_duration="10"; # minimum duration per music file
yell() { echo "$0: $*" >&2; } # print script path and all args to stderr
die() { yell "$*"; exit 111; } # same as yell() but non-zero exit status
cat <<'EOF'
DESCRIPTION:
- This script may be used to copy a random selection of files from
- SOURCE to DEST.
+ This script may be used to copy a random selection of files containing
+ audio tracks from SOURCE to DEST.
USAGE:
bk-copy-rand-music [dir SOURCE] [dir DEST] [int DURATION]
dur_cand="$(get_media_length "$path_candfile")";
dur_cand="${dur_cand%%.*}"; # convert float to int
if ! checkInt "$dur_cand"; then continue; fi; # reject
+ if [[ "$dur_cand" -lt "$min_file_duration" ]]; then continue; fi; # reject
### Add/update candfile to list_copy assoc. array (key=path; value=duration)
#yell "DEBUG:Adding $path_candfile";
if [[ $n -gt $max_loops ]]; then die "ERROR:Too many loops:$n"; fi;
done;
+ n=0; # Initialize loop counter
# Copy files in list_copy to dir_dest;
for key in "${!list_copy[@]}"; do
value="${list_copy[$key]}";
## Get 16-character b2sum fingerprint (for different files that share basename)
fingerprint="$(b2sum -l64 "$key" | cut -d' ' -f1)";
+ ## Form output filename
+ file_name="$fingerprint".."$file_basename";
+ file_name="${file_name:0:$max_filename_length}"; # Limit filename length (e.g. Windows has max of 255 characters)
+
## Form output path
- path_output="$dir_dest"/"$fingerprint".."$file_basename";
+ path_output="$dir_dest"/"$file_name";
## Copy
try cp "$key" "$path_output" && yell "NOTICE:Copied ($value seconds): $key ";
#yell "DEBUG:Copied $file_basename to $dur_dest.";
+ ## Append log
+ path_log_output="$dir_dest"/COPY.log;
+ if [[ $n -le 0 ]]; then
+ echo "fingerprint","duration","original_path" >> "$path_log_output";
+ else
+ echo "$fingerprint","$value","$key" >> "$path_log_output";
+ fi;
+
+ ((n++));
unset file_basename path_output
done;