# Notes: # - Please keep this file working for both BASH and ZSH. :) ## Variables ## # Environment Usability # export PATH="$PATH:~/bin-shared:~/.bin-shared" # PS1 Colors # export PURPLE="`tput setaf 55`" export ORANGE="`tput setaf 208`" export GREEN="`tput setaf 34`" export RED="`tput setaf 196`" export SCARLET="`tput setaf 160`" export YELLOW="`tput setaf 226`" export GRAY="`tput setaf 243`" export RESET="`tput sgr0`" export BOLD="`tput bold`" ## Aliases ## # Quickies # alias reload-bash="source ~/.bashrc" alias bash-reload="reload-bash" alias shell-reload="reload-bash" alias reload-shell="reload-bash" alias reload="reload-bash" alias l='ls ' alias ll='ls -alh ' alias lh='ls -ash ' function cl { if [[ -d /sdcard ]]; then cd /sdcard/Library/Clones else cd $HOME/Clones fi } alias clones="cl" alias cdl="cl" alias cdc="cl" # Networking # alias scan="nmap -A -p- --script=vuln " ## Functions ## # Related specifically to this project. # branch="$BRANCH" if [[ -z "$branch" ]]; then branch="$PROD_GIT_BRANCH" fi if [[ -z "$branch" ]]; then branch="dev" fi function update-shared { log "`date` - Reloading the '~/.rc_shared' file from env-shared.\n" if [[ -n "$1" ]]; then branch="$1" fi dir="shared-rc-deleteme" git clone https://git.hyperling.com/me/env-shared \ $dir --branch=$branch mv -v $dir/rc_shared.sh ~/.rc_shared local_bin="$HOME/bin" remote_bin="shared-rc-deleteme/bin-shared" if [[ -d "$local_bin" ]]; then log "\n`date` - Found '$local_bin', adding scripts.\n" mv -v $remote_bin/*.sh "$local_bin"/ refactor_script="refactor_music_library.sh" wget -O "$refactor_script" \ https://git.hyperling.com/me/shell-music-refactor-library/src/branch/main/refactor_music_library.sh mv -v $refactor_script "$local_bin"/ chmod 755 -Rv "$local_bin" else echo "Did not find '$local_bin', did not copy scripts." fi log "\n`date` - Done! Removing git clone.\n" mv -v $dir ~/TRASH/"$dir-`date "+%Y%m%d-%H%M%S"`" log "\n`date` - Complete!" } alias shared-update="update-shared" alias reload-shared="update-shared" alias shared-reload="update-shared" project="$HOME/.env-shared" function update-shared2 { if [[ -d $project ]]; then log "`date` - Updating '$project'.\n" git -C "$project" switch "$branch" git -C "$project" pull --recurse-submodules || \ ( echo "Failed to pull project, exiting." && return 1 ) else log "`date` - Downloading '$project'.\n" git clone https://git.hyperling.com/me/env-shared \ "$project" --branch=$branch fi local_bin="$HOME/bin" remote_bin="$project/bin-shared" if [[ -d "$local_bin" ]]; then log "\n`date` - Found '$local_bin', adding scripts.\n" cp -v $remote_bin/*.sh "$local_bin"/ refactor_script="refactor_music_library.sh" wget -O "$refactor_script" \ https://git.hyperling.com/me/shell-music-refactor-library/src/branch/main/refactor_music_library.sh mv -v $refactor_script "$local_bin"/ chmod 755 -Rv "$local_bin" else echo "Did not find '$local_bin', did not copy scripts." fi log "\n`date` - Complete!" } alias shared-update2="update-shared2" alias reload-shared2="update-shared2" alias shared-reload2="update-shared2" # Shortcuts # function send-master { send_master.sh; } alias push-master="send-master" alias sync-master="send-master" function pull-clone { pull_clone.sh; } alias get-clone="pull-clone" alias sync-clone="pull-clone" alias send-sync="send-master" alias push-sync="send-master" alias pull-sync="pull-clone" alias get-sync="pull-clone" function sync-sync { cat <<- EOF Command not implemented, too dangerous guessing the state of the folder. Please use push-sync and pull-sync in the correct order for its current state. EOF } function goodbye { update -y; bye; } function clone { rsync -auPhz --delete --exclude '.gradle' --exclude 'app/build' "$@" } function now { date "+%Y%m%d-%H%M%S"; } function today { date "+%Y%m%d"; } function log { echo -e "$1"; } function blog { echo -e "\n\n$1\n\n"; } function pull { if [[ -d .git ]]; then git pull --recurse-submodules else pull-clone fi } function push { if [[ -d .git ]]; then git push && load-stage && load-prod else send-master fi } # Enhance Bin Scripts # # MASTER and CLONE folders. function send-masters { echo -e "`date` - Looping through MASTER directories." ls | grep "\-MASTER" | while read dir; do echo -e "\n`date` - Found '$dir'..." cd $dir send-master cd .. done echo -e "\n`date` - Done checking for MASTER directories." } alias push-masters="send-masters" alias sync-masters="send-masters" function pull-clones { echo -e "`date` - Looping through clone directories." ls | grep "\-clone" | while read dir; do echo -e "\n`date` - Found '$dir'..." cd $dir pull-clone cd .. done echo -e "\n`date` - Done checking for clone directories." } alias get-clones="pull-clones" alias sync-clones="pull-clones" function sync-all { push-masters echo -e "\n" pull-clones echo -e "\n`date` - Skipping SYNC folders! Please do their loads separately." ls | grep "\-SYNC" | while read dir; do echo "- $dir" done echo -e "`date` - Done.\n" } function sync-all-loop { typeset -i sleep_time if [[ "$1" ]]; then sleep_time="$1" fi if [[ -z "$sleep_time" || "$sleep_time" == 0 ]]; then sleep_time="300" fi log "`date` - Sleep timer set for '$sleep_time' seconds." while true; do sync-all echo -e "\n\n*** Sleeping... ***\n\n" sleep 300 done } # SYNC folders. function send-syncs { echo -e "`date` - Looping through SYNC directories." ls | grep "\-SYNC" | while read dir; do echo -e "\n`date` - Found '$dir'..." cd $dir send-master cd .. done echo -e "\n`date` - Done checking for SYNC directories." } alias push-syncs="send-syncs" function pull-syncs { echo -e "`date` - Looping through SYNC directories." ls | grep "\-SYNC" | while read dir; do echo -e "\n`date` - Found '$dir'..." cd $dir pull-clone cd .. done echo -e "\n`date` - Done checking for SYNC directories." } alias get-syncs="pull-syncs" function sync-syncs { cat <<- EOF Command not implemented, too dangerous guessing the state of the folder. Please use push-syncs and pull-syncs in the correct order for its current state. EOF } # Audio # # Video # # Optimize the bitrate and audio levels for an edited video. function process-video-usage { echo "USAGE: process-video oldFile newFile [videoBitrate] [audioBitrate] [sizeRating] [numPasses] [forceBitrate]" echo -n "Purpose: Call ffmpeg with preferred video posting settings. " echo -n "Bitrates default to 2000k and 192k, size is 720, passes is 1, and force is N." echo "These work well on Odysee and are fairly small as backups." echo "Examples:" echo "- Create a small file for quick streaming." echo " process-video youcut.mp4 20240210.mp4 1200k 128k 480" echo "- Create a larger file for something like YouTube." echo " process-video youcut.mp4 20240210_1080p.mp4 5000k 256k 1080" } function process-video { # Parameters file="$1" newfile="$2" video="$3" audio="$4" size="$5" passes="$6" force="$7" # Validations if [[ -z $file || ! -e $file ]]; then echo "ERROR: Original file '$file' does not exist." >&2 process-video-usage return 1 fi if [[ -z $newfile ]]; then echo "ERROR: New file's name must be provided." >&2 process-video-usage return 1 elif [[ -e $newfile ]]; then echo "ERROR: New file '$newfile' already exists." >&2 du -h "$newfile" process-video-usage return 1 fi echo "`date` - Converting '$file' to '$newfile'." if [[ -z $video ]]; then video="2000k" fi if [[ $force == "Y" ]]; then video="-b:v $video" else video="-b:v $video -minrate 0 -maxrate $video -bufsize $video" fi if [[ -z $audio ]]; then audio="192k" fi audio="-b:a $audio" if [[ -z $size ]]; then size="720" fi size="-filter:v scale=-1:$size" if [[ -z $passes ]]; then passes=1 fi pass="" if [[ $passes != 1 ]]; then passes=2 pass="-pass 2" fi ## Main ## # More information on two-pass processing with ffmpeg # https://cinelerra-gg.org/download/CinelerraGG_Manual/Two_pass_Encoding_with_FFmp.html if [[ $passes == 2 ]]; then set -x ffmpeg -nostdin -hide_banner -loglevel quiet \ -i "$file" $size $video $audio \ -filter:a "dynaudnorm=f=33:g=65:p=0.66:m=33.3" \ -vcodec libx264 -movflags +faststart \ -pass 1 -f mp4 /dev/null -y status=$? set +x echo "`date` - Done with the first pass." if [[ $status != 0 ]]; then echo "Received unsuccessful status, exiting." return 1 fi fi set -x && ffmpeg -nostdin -hide_banner -loglevel quiet \ -i "$file" $size $video $audio \ -filter:a "dynaudnorm=f=33:g=65:p=0.66:m=33.3" \ -vcodec libx264 -movflags +faststart \ $pass "$newfile" status="$?" set +x echo "`date` - Done with the final pass." if [[ $passes == 2 && $status == 0 ]]; then mv -v ffmpeg2pass*.log* ~/TRASH/ fi echo "`date` - Syncing data." sync sleep 10 sync if [[ -s $newfile ]]; then echo "`date` - Getting file sizes." du -h "$file" du -h "$newfile" else echo "ERROR: New file not created or has a 0 size." >&2 fi echo -e "\n`date` - Finished with status '$status'." return $status } alias pv="process-video" alias qpv="pv ./raw/YouCut*.mp4 `basename $(pwd)`.mp4" # Allow converting video to audio and other smaller # tasks than what process-video is intended to do. function basic-process-usage { echo "basic-process INPUT OUTPUT NORMALIZE [EXTRA]" echo -n "Pass a file through ffmpeg with the option" echo "to easily normalize the audio with a Y." echo "Examples:" echo "- Normalize audio on a video." echo " basic-process video.mp4 normalized.mp4 Y" echo "- Convert a video to audio at 192k." echo " basic-process video.mp4 audio.mp3 N '-b:a 192k'" } function basic-process { # Parameters input="$1" output="$2" typeset -u normalize normalize="$3" extra="$4" echo "`date` - Starting basic-process" # Validations if [[ -z $input || ! -e $input ]]; then echo "ERROR: Input file '$input' does not exist." >&2 basic-process-usage return 1 fi if [[ -z $output ]]; then echo "ERROR: Output file's name must be provided." >&2 basic-process-usage return 1 elif [[ -e $output ]]; then echo "ERROR: Output file '$output' already exists." >&2 du -h "$output" basic-process-usage return 1 fi if [[ $normalize == "Y" ]]; then echo "Normalize set to TRUE." normal="-filter:a dynaudnorm=f=33:g=65:p=0.66:m=33.3" else echo "No audio normalization is being done." fi # Main echo "`date` - Converting '$input' to '$output'." set -x ffmpeg -nostdin -hide_banner -loglevel quiet \ -i "$input" $extra $normal "$output" status=$? set +x if [[ $status != 0 ]]; then echo "`date` - WARNING: ffmpeg exited with status '$status'." >&2 fi # Finish if [[ ! -s $output ]]; then echo "`date` - ERROR: Output '$output' not created or has 0 size." >&2 return 1 fi sync echo "`date` - '$output' has been created successfully." sleep 3 du -h "$input" du -h "$output" echo "`date` - Finished basic-process" return 0 } alias bp="basic-process" alias bv="bp" # Function to automatically append the Y. function fix-audio { basic-process "$1" "$2" Y; } function eq { fix-audio "$1" "$2"; } # Function to easily turn a video to audio without typing the audio name. function convert-to-audio { video="$1" audio="$2" if [[ -z "$2" || "$2" == "Y" ]]; then audio="${1//mp4/mp3}" fi volume="" if [[ ( "$2" == "Y" && -z "$3" ) || "$3" == "Y" ]]; then $volume="Y" fi basic-process "$video" "$audio" $volume } alias v2a="convert-to-audio" alias vta="v2a" alias pull-audio="v2a" alias pa="v2a" # Export all functions! # eval "$(declare -F | grep -v _ | sed 's/-f /-fx /')" # Run update checker in background. ( if [[ -d "$project" ]]; then git -C "$project" fetch >/dev/null 2>&1 && git -C "$project" status | grep "is behind" \ | while read status; do log "\n\n`date` - Updates to env-shared are available via 'update-shared2'." log " '$status'" done fi & ) ## Complete! ## [[ $(whoami) != "root" ]] && echo "`date` - Shared RC Config - Complete!"