feat(user/bkfeh):Use unique names for sample files
[BK-2020-03.git] / user / bk-copy-rand-music.sh
old mode 100644 (file)
new mode 100755 (executable)
index c326e41..ea384fe
@@ -1,6 +1,7 @@
 #!/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
@@ -9,7 +10,9 @@ declare -a music_codecs # Array for storing valid codec names (e.g. "aac" "mp3")
 
 # 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
@@ -178,8 +181,8 @@ showUsage() {
     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]
@@ -431,6 +434,7 @@ main() {
        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";
@@ -448,6 +452,7 @@ main() {
        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]}";
@@ -457,13 +462,26 @@ main() {
        ## 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;