]> zdv2.bktei.com Git - BK-2020-03.git/commitdiff
Merge branch 'develop' of https://zdv2.bktei.com/gitweb/BK-2020-03 into develop
authorSteven Baltakatei Sandoval <baltakatei@gmail.com>
Tue, 1 Apr 2025 00:36:13 +0000 (00:36 +0000)
committerSteven Baltakatei Sandoval <baltakatei@gmail.com>
Tue, 1 Apr 2025 00:36:13 +0000 (00:36 +0000)
unitproc/bkt-replace_apos
user/bkmpv2
user/rand_media_pl.sh

index 1e0cfd33ac365fbc99dec44c127c6c650ced0670..70f84bd4488552d69293f9464168e0d1f49efb47 100644 (file)
@@ -2,6 +2,7 @@
 
 function replace_apos() {
     # Desc: Replace ' with ʼ in text
+    # Usage: source bkt-replace_apos; replace_apos [FILE]
     # Note: In UTF-8 text file, replaces U+0027
     #   APOSTROPHE with U+02BC MODIFIER LETTER APOSTROPHE
     # Input: stdin
@@ -9,6 +10,7 @@ function replace_apos() {
     # Output: stdout
     # Version: 1.2.0 (BK-2020-03)
     # Depends: GNU sed 4.8
+    # Version: 0.2.0
 
     # Check input
     if [[ "$#" -gt 1 ]]; then
@@ -28,84 +30,84 @@ function replace_apos() {
     ## Note: See https://en.wiktionary.org/wiki/Category:English_contractions
     ## Note: Order of replacements sorted most-specific first.
     sed -E \
-        -e "s/(you|You|YOU)'(ren|REN|ven|VEN)'(t|T)/\1ʼ\2ʼ\3/g" \
-        -e "s/(you|You|YOU)'(dn|DN)'(t|T)'(ve|VE)/\1ʼ\2ʼ\3ʼ\4/g" \
-        -e "s/(you|You|YOU)'(d|D|ll|LL)'(ve|VE)/\1ʼ\2ʼ\3/g" \
-        -e "s/(you|You|YOU)'(d|D|ll|LL|re|RE|ve|VE)/\1ʼ\2/g" \
-        -e "s/(y|Y)'(all|ALL)'(dn|DN)'(t|T)'(ve|VE)/\1ʼ\2ʼ\3ʼ\4ʼ\5/g" \
-        -e "s/(y|Y)'(all|ALL)'(d|D)'(nt|NT)'(ve|VE)/\1ʼ\2ʼ\3ʼ\4ʼ\5/g" \
-        -e "s/(y|Y)'(all|ALL)'(d|D)'(ve|VE)/\1ʼ\2ʼ\3ʼ\4/g" \
-        -e "s/(y|Y)'(all|ALL)'(d|D|ll|LL|re|RE|ve|VE)/\1ʼ\2ʼ\3/g" \
-        -e "s/(y|Y)'(all|ALL)/\1ʼ\2/g" \
-        -e "s/(y|Y)'(ain|AIN)'(t|T)/\1ʼ\2ʼ\3/g" \
-        -e "s/(wouldn|Wouldn|WOULDN)'(t|T)'(ve|VE)/\1ʼ\2ʼ\3/g" \
-        -e "s/(wouldn|Wouldn|WOULDN)'(t|T)/\1ʼ\2/g" \
-        -e "s/(won|Won|WON)'(t|T)'(ve|VE)/\1ʼ\2ʼ\3/g" \
-        -e "s/(won|Won|WON)'(t|T)/\1ʼ\2/g" \
-        -e "s/(who|Who|WHO)'(d|D|ll|LL)'(ve|VE)/\1ʼ\2ʼ\3/g" \
-        -e "s/(who|Who|WHO)'(d|D|ll|LL|re|RE|s|S|ve|VE)/\1ʼ\2/g" \
-        -e "s/(where|Where|WHERE)'(d|D|s|S)/\1ʼ\2/g" \
-        -e "s/(what|What|WHAT)'(ll|LL|re|RE|s|S|ve|VE)/\1ʼ\2/g" \
-        -e "s/(weren|Weren|WEREN)'(t|T)/\1ʼ\2/g" \
-        -e "s/(we|We|WE)'(ven|VEN)'(t|T)/\1ʼ\2ʼ\3/g" \
-        -e "s/(we|We|WE)'(ren|REN)'(t|T)/\1ʼ\2ʼ\3/g" \
-        -e "s/(we|We|WE)'(d|D|ll|LL)'(ve|VE)/\1ʼ\2ʼ\3/g" \
-        -e "s/(we|We|WE)'(d|D|ll|LL|re|RE|ve|VE)/\1ʼ\2/g" \
-        -e "s/(wasn|Wasn|WASN)'(t|T)/\1ʼ\2/g" \
-        -e "s/(they|They|THEY)'(d|D|ll|LL)'(ve|VE)/\1ʼ\2ʼ\3/g" \
-        -e "s/(they|They|THEY)'(d|D|ll|LL|re|RE|ve|VE)/\1ʼ\2/g" \
-        -e "s/(there|There|THERE)'(ll|LL)'(ve|VE)/\1ʼ\2ʼ\3/g" \
-        -e "s/(there|There|THERE)'(s|S|ve|VE)/\1ʼ\2/g" \
-        -e "s/(that|That|THAT)'(d|D|ll|LL)'(ve|VE)/\1ʼ\2ʼ\3/g" \
-        -e "s/(that|That|THAT)'(d|D|ll|LL|s|S)/\1ʼ\2/g" \
-        -e "s/(shouldn|Shouldn|SHOULDN)'(t|T)'(ve|VE)/\1ʼ\2ʼ\3/g" \
-        -e "s/(shouldn|Shouldn|SHOULDN)'(t|T)/\1ʼ\2/g" \
-        -e "s/(she|She|SHE)'(d|D|ll|LL)'(ve|VE)/\1ʼ\2ʼ\3/g" \
-        -e "s/(she|She|SHE)'(d|D|ll|LL|s|S)/\1ʼ\2/g" \
-        -e "s/(shan|Shan|SHAN)'(t|T)/\1ʼ\2/g" \
-        -e "s/'(s|S)\b/ʼ\1/g" \
-        -e "s/(s|S)'( |,|.|$)/\1ʼ\2/g" \
-        -e "s/(oughtn|Oughtn|OUGHTN)'(t|T)'(ve|VE)/\1ʼ\2ʼ\3/g" \
-        -e "s/(oughtn|Oughtn|OUGHTN)'(t|T)/\1ʼ\2/g" \
-        -e "s/(o|O)'(clock|CLOCK)/\1ʼ\2/g" \
-        -e "s/(mustn|Mustn|MUSTN)'(t|T)/\1ʼ\2/g" \
-        -e "s/(mustn|Mustn|MUSTN)'(t|T)'(ve|VE)/\1ʼ\2ʼ\3/g" \
-        -e "s/(mustn|Mustn|MUSTN)'(t|T)/\1ʼ\2/g" \
-        -e "s/(mightn|Mightn|MIGHTN)'(t|T)'(ve|VE)/\1ʼ\2ʼ\3/g" \
-        -e "s/(mightn|Mightn|MIGHTN)'(t|T)/\1ʼ\2/g" \
-        -e "s/(might|Might|MIGHT)'(ve|VE)/\1ʼ\2/g" \
-        -e "s/(let|Let|LET)'(s|S)/\1ʼ\2/g" \
-        -e "s/(it|It|IT)'(d|D|ll|LL)'(ve|VE)/\1ʼ\2ʼ\3/g" \
-        -e "s/(it|It|IT)'(d|D|ll|LL|s|S)/\1ʼ\2/g" \
-        -e "s/(isn|Isn|ISN)'(t|T)/\1ʼ\2/g" \
-        -e "s/(I|i)'(dn|DN)'(t|T)'(ve|VE)/\1ʼ\2ʼ\3ʼ\4/g" \
-        -e "s/(I|i)'(d|D|ll|LL)'(ve|VE)/\1ʼ\2ʼ\3/g" \
-        -e "s/(I|i)'(d|D|ll|LL|m|M|ve|VE)/\1ʼ\2/g" \
-        -e "s/(how|How|HOW)'(d|D)/\1ʼ\2/g" \
-        -e "s/(he|He|HE)'(d|D|ll|LL)'(ve|VE)/\1ʼ\2ʼ\3/g" \
-        -e "s/(he|He|HE)'(d|D|ll|LL|s|S)/\1ʼ\2/g" \
-        -e "s/(haven|Haven|HAVEN)'(t|T)/\1ʼ\2/g" \
-        -e "s/(hasn|Hasn|HASN)'(t|T)/\1ʼ\2/g" \
-        -e "s/(hadn|Hadn|HADN)'(t|T)'(ve|VE)/\1ʼ\2ʼ\3/g" \
-        -e "s/(hadn|Hadn|HADN)'(t|T)/\1ʼ\2/g" \
-        -e "s/'(em\b)/ʼ\1/g" \
-        -e "s/(d|D)'(ya|YA|you|YOU)/\1ʼ\2/g" \
-        -e "s/([[:alnum:]])'(d|D)/\1ʼ\2/g" \
-        -e "s/(don|Don|DON)'(t|T)/\1ʼ\2/g" \
-        -e "s/(doesn|Doesn|DOESN)'(t|T)/\1ʼ\2/g" \
-        -e "s/(didn|Didn|DIDN)'(t|T)/\1ʼ\2/g" \
-        -e "s/(could|Could|COULD)'(ve|VE)/\1ʼ\2/g" \
-        -e "s/(couldn|Couldn|COULDN)'(t|T)'(ve|VE)/\1ʼ\2ʼ\3/g" \
-        -e "s/(couldn|Couldn|COULDN)'(t|T)/\1ʼ\2/g" \
-        -e "s/(c|C)'(mere|MERE)/\1ʼ\2/g" \
-        -e "s/(can|Can|CAN)'(t|T)'(ve|VE)/\1ʼ\2ʼ\3/g" \
-        -e "s/(can|Can|CAN)'(t|T)/\1ʼ\2/g" \
-        -e "s/'(cause|Cause|CAUSE)/ʼ\1/g" \
-        -e "s/'(bout|Bout|BOUT)/ʼ\1/g" \
-        -e "s/(aren|Aren|AREN)'(t|T)/\1ʼ\2/g" \
-        -e "s/(ate|Ate|ATE)'(nt|NT)/\1ʼ\2/g" \
-        -e "s/(ain|Ain|AIN)'(t|T)/\1ʼ\2/g" \
-        -e "s/([[:alpha:]])'([[:alpha:]])/\1ʼ\2/g" \
+        -e "s/(you|You|YOU)['’](ren|REN|ven|VEN)['’](t|T)/\1ʼ\2ʼ\3/g" \
+        -e "s/(you|You|YOU)['’](dn|DN)['’](t|T)['’](ve|VE)/\1ʼ\2ʼ\3ʼ\4/g" \
+        -e "s/(you|You|YOU)['’](d|D|ll|LL)['’](ve|VE)/\1ʼ\2ʼ\3/g" \
+        -e "s/(you|You|YOU)['’](d|D|ll|LL|re|RE|ve|VE)/\1ʼ\2/g" \
+        -e "s/(y|Y)['’](all|ALL)['’](dn|DN)['’](t|T)['’](ve|VE)/\1ʼ\2ʼ\3ʼ\4ʼ\5/g" \
+        -e "s/(y|Y)['’](all|ALL)['’](d|D)['’](nt|NT)['’](ve|VE)/\1ʼ\2ʼ\3ʼ\4ʼ\5/g" \
+        -e "s/(y|Y)['’](all|ALL)['’](d|D)['’](ve|VE)/\1ʼ\2ʼ\3ʼ\4/g" \
+        -e "s/(y|Y)['’](all|ALL)['’](d|D|ll|LL|re|RE|ve|VE)/\1ʼ\2ʼ\3/g" \
+        -e "s/(y|Y)['’](all|ALL)/\1ʼ\2/g" \
+        -e "s/(y|Y)['’](ain|AIN)['’](t|T)/\1ʼ\2ʼ\3/g" \
+        -e "s/(wouldn|Wouldn|WOULDN)['’](t|T)['’](ve|VE)/\1ʼ\2ʼ\3/g" \
+        -e "s/(wouldn|Wouldn|WOULDN)['’](t|T)/\1ʼ\2/g" \
+        -e "s/(won|Won|WON)['’](t|T)['’](ve|VE)/\1ʼ\2ʼ\3/g" \
+        -e "s/(won|Won|WON)['’](t|T)/\1ʼ\2/g" \
+        -e "s/(who|Who|WHO)['’](d|D|ll|LL)['’](ve|VE)/\1ʼ\2ʼ\3/g" \
+        -e "s/(who|Who|WHO)['’](d|D|ll|LL|re|RE|s|S|ve|VE)/\1ʼ\2/g" \
+        -e "s/(where|Where|WHERE)['’](d|D|s|S)/\1ʼ\2/g" \
+        -e "s/(what|What|WHAT)['’](ll|LL|re|RE|s|S|ve|VE)/\1ʼ\2/g" \
+        -e "s/(weren|Weren|WEREN)['’](t|T)/\1ʼ\2/g" \
+        -e "s/(we|We|WE)['’](ven|VEN)['’](t|T)/\1ʼ\2ʼ\3/g" \
+        -e "s/(we|We|WE)['’](ren|REN)['’](t|T)/\1ʼ\2ʼ\3/g" \
+        -e "s/(we|We|WE)['’](d|D|ll|LL)['’](ve|VE)/\1ʼ\2ʼ\3/g" \
+        -e "s/(we|We|WE)['’](d|D|ll|LL|re|RE|ve|VE)/\1ʼ\2/g" \
+        -e "s/(wasn|Wasn|WASN)['’](t|T)/\1ʼ\2/g" \
+        -e "s/(they|They|THEY)['’](d|D|ll|LL)['’](ve|VE)/\1ʼ\2ʼ\3/g" \
+        -e "s/(they|They|THEY)['’](d|D|ll|LL|re|RE|ve|VE)/\1ʼ\2/g" \
+        -e "s/(there|There|THERE)['’](ll|LL)['’](ve|VE)/\1ʼ\2ʼ\3/g" \
+        -e "s/(there|There|THERE)['’](s|S|ve|VE)/\1ʼ\2/g" \
+        -e "s/(that|That|THAT)['’](d|D|ll|LL)['’](ve|VE)/\1ʼ\2ʼ\3/g" \
+        -e "s/(that|That|THAT)['’](d|D|ll|LL|s|S)/\1ʼ\2/g" \
+        -e "s/(shouldn|Shouldn|SHOULDN)['’](t|T)['’](ve|VE)/\1ʼ\2ʼ\3/g" \
+        -e "s/(shouldn|Shouldn|SHOULDN)['’](t|T)/\1ʼ\2/g" \
+        -e "s/(she|She|SHE)['’](d|D|ll|LL)['’](ve|VE)/\1ʼ\2ʼ\3/g" \
+        -e "s/(she|She|SHE)['’](d|D|ll|LL|s|S)/\1ʼ\2/g" \
+        -e "s/(shan|Shan|SHAN)['’](t|T)/\1ʼ\2/g" \
+        -e "s/['’](s|S)\b/ʼ\1/g" \
+        -e "s/(s|S)['’]( |,|.|$)/\1ʼ\2/g" \
+        -e "s/(oughtn|Oughtn|OUGHTN)['’](t|T)['’](ve|VE)/\1ʼ\2ʼ\3/g" \
+        -e "s/(oughtn|Oughtn|OUGHTN)['’](t|T)/\1ʼ\2/g" \
+        -e "s/(o|O)['’](clock|CLOCK)/\1ʼ\2/g" \
+        -e "s/(mustn|Mustn|MUSTN)['’](t|T)/\1ʼ\2/g" \
+        -e "s/(mustn|Mustn|MUSTN)['’](t|T)['’](ve|VE)/\1ʼ\2ʼ\3/g" \
+        -e "s/(mustn|Mustn|MUSTN)['’](t|T)/\1ʼ\2/g" \
+        -e "s/(mightn|Mightn|MIGHTN)['’](t|T)['’](ve|VE)/\1ʼ\2ʼ\3/g" \
+        -e "s/(mightn|Mightn|MIGHTN)['’](t|T)/\1ʼ\2/g" \
+        -e "s/(might|Might|MIGHT)['’](ve|VE)/\1ʼ\2/g" \
+        -e "s/(let|Let|LET)['’](s|S)/\1ʼ\2/g" \
+        -e "s/(it|It|IT)['’](d|D|ll|LL)['’](ve|VE)/\1ʼ\2ʼ\3/g" \
+        -e "s/(it|It|IT)['’](d|D|ll|LL|s|S)/\1ʼ\2/g" \
+        -e "s/(isn|Isn|ISN)['’](t|T)/\1ʼ\2/g" \
+        -e "s/(I|i)['’](dn|DN)['’](t|T)['’](ve|VE)/\1ʼ\2ʼ\3ʼ\4/g" \
+        -e "s/(I|i)['’](d|D|ll|LL)['’](ve|VE)/\1ʼ\2ʼ\3/g" \
+        -e "s/(I|i)['’](d|D|ll|LL|m|M|ve|VE)/\1ʼ\2/g" \
+        -e "s/(how|How|HOW)['’](d|D)/\1ʼ\2/g" \
+        -e "s/(he|He|HE)['’](d|D|ll|LL)['’](ve|VE)/\1ʼ\2ʼ\3/g" \
+        -e "s/(he|He|HE)['’](d|D|ll|LL|s|S)/\1ʼ\2/g" \
+        -e "s/(haven|Haven|HAVEN)['’](t|T)/\1ʼ\2/g" \
+        -e "s/(hasn|Hasn|HASN)['’](t|T)/\1ʼ\2/g" \
+        -e "s/(hadn|Hadn|HADN)['’](t|T)['’](ve|VE)/\1ʼ\2ʼ\3/g" \
+        -e "s/(hadn|Hadn|HADN)['’](t|T)/\1ʼ\2/g" \
+        -e "s/['’](em\b)/ʼ\1/g" \
+        -e "s/(d|D)['’](ya|YA|you|YOU)/\1ʼ\2/g" \
+        -e "s/([[:alnum:]])['’](d|D)/\1ʼ\2/g" \
+        -e "s/(don|Don|DON)['’](t|T)/\1ʼ\2/g" \
+        -e "s/(doesn|Doesn|DOESN)['’](t|T)/\1ʼ\2/g" \
+        -e "s/(didn|Didn|DIDN)['’](t|T)/\1ʼ\2/g" \
+        -e "s/(could|Could|COULD)['’](ve|VE)/\1ʼ\2/g" \
+        -e "s/(couldn|Couldn|COULDN)['’](t|T)['’](ve|VE)/\1ʼ\2ʼ\3/g" \
+        -e "s/(couldn|Couldn|COULDN)['’](t|T)/\1ʼ\2/g" \
+        -e "s/(c|C)['’](mere|MERE)/\1ʼ\2/g" \
+        -e "s/(can|Can|CAN)['’](t|T)['’](ve|VE)/\1ʼ\2ʼ\3/g" \
+        -e "s/(can|Can|CAN)['’](t|T)/\1ʼ\2/g" \
+        -e "s/['’](cause|Cause|CAUSE)/ʼ\1/g" \
+        -e "s/['’](bout|Bout|BOUT)/ʼ\1/g" \
+        -e "s/(aren|Aren|AREN)['’](t|T)/\1ʼ\2/g" \
+        -e "s/(ate|Ate|ATE)['’](nt|NT)/\1ʼ\2/g" \
+        -e "s/(ain|Ain|AIN)['’](t|T)/\1ʼ\2/g" \
+        -e "s/([[:alpha:]])['’]([[:alpha:]])/\1ʼ\2/g" \
         "$input"
 }; # replace ' with ʼ
 
index 36453db8c73e012bc94dce48990b5018b917b1b2..7e51cc11b2faf205a0de63ace7c5869c3c7227be 100755 (executable)
@@ -1,7 +1,7 @@
 #!/usr/bin/env bash
 # Desc: Wrapper for mpv that accepts directory or file paths via posargs or stdin lines
 # Usage: bkmpv2 [DIR]
-# Version: 0.2.1
+# Version: 0.2.2
 # Depends: GNU Parallel, GNU Bash v5.1.16, mpv v0.34.1, bc v1.07.1
 # Ref/Attrib: [1] Tange, Ole. GNU Parallel with Bash Array. 2019-03-24. https://unix.stackexchange.com/a/508365/411854
 # Example: find $HOME/Music -type d | bkmpv2
@@ -10,8 +10,8 @@
 # Note: Does not follow symlinks
 
 # Find settings
-firegex=".+\(aac\|aif\|aiff\|flac\|m4a\|mp3\|mp4\|ogg\|opus\|wav\)$"; # POSIX regex for find. Update according to `find . -type f | grep -Eo "\.([[:alnum:]])+$" | sort -u`
-file_regex=".+(aac|aif|aiff|flac|m4a|mp3|mp4|ogg|opus|wav)$"; # extended regex for Bash.
+firegex=".+\(aac\|aif\|aiff\|flac\|m4a\|mp3\|mp4\|ogg\|opus\|wav\|webm\)$"; # POSIX regex for find. Update according to `find . -type f | grep -Eo "\.([[:alnum:]])+$" | sort -u`
+file_regex=".+(aac|aif|aiff|flac|m4a|mp3|mp4|ogg|opus|wav|webm)$"; # extended regex for Bash.
 fsize="10k"; # default: minimum "10k"
 fdepth_posarg="10"; # find depth for positional arguments
 fdepth_stdin="1";  # find depth for stdin
@@ -301,12 +301,14 @@ main() {
         # Check if dir and not dotfile
         if [[ -d "$line" ]] && [[ ! "$line_bn" =~ $re_dotfile ]]; then
             dirs_stdin+=("$line");
+            yell "DEBUG:Is a dir:${line}"; # debug
             continue;
         fi;
 
         # Check if file
         if [[ -f "$line" ]]; then
             files_stdin+=("$line");
+            yell "DEBUG:Is a file:${line}"; # debug
             continue;
         fi;
 
@@ -316,7 +318,9 @@ main() {
     yell "STATUS:$SECONDS:Read stdin and psargs.";
 
     # Apply the $file_regex to $files_stdin array
+    declare -p files_stdin;
     check_files;
+    declare -p files_stdin;
 
     # Catch all arrays empty
     if [[ "${#dirs_stdin[@]}" -le 0 ]] && \
index eaa3dc1638781e2ffa8c2d750678fee1898ee878..abe7766fd9685a0dae81e66145f118cdaf9d7327 100755 (executable)
@@ -7,8 +7,8 @@
 #   - Prompts the user whether to use the cached data or regenerate it.
 #   - Uses an EDL file to specify the starting offset for the first file.
 # Usage: rand_media_pl.sh [DIR]
-# Version: 0.0.5
-# Dependencies: Bash 4, ffprobe, mpv, bc, shuf
+# Version: 0.1.0
+# Dependencies: Bash 4, ffprobe, mpv, bc, shuf, GNU Parallel
 
 yell() { echo "$0: $*" >&2; } # Print script path and all args to stderr
 die() { yell "$*"; exit 111; } # Same as yell() but exits with code 111
@@ -72,7 +72,7 @@ generate_playlist_cache() {
         else
             yell "WARNING: Invalid duration '$duration' for file '$file', skipping." 1>&2;
         fi;
-    done < <(find_media_files | sort; );
+    done < <(find_media_files | parallel readlink -f '{}' | sort -u; );
 
     total_duration_s="$(printf "%.1f" "$total_duration"; )";
     total_duration_h="$(echo "scale=1; $total_duration / 3600" | bc -l; )";