From 6a9f363771ab0fb902a9785a009d57424cccdf98 Mon Sep 17 00:00:00 2001 From: Chad Date: Sat, 23 Mar 2024 19:03:39 -0700 Subject: [PATCH] General Release (#1) * Add two new location shorcuts and a fix for ffmpeg. * Add comments and a quick commit function. * More fixes and enhancements. * Enhance ffmpeg command with resolution changing. * Try fixing the test function. * Prevent situations such as possibly deleting a home directory. * Use dev branch for testing. Add man to software. * Always accept. * Do not cd as part of bashrc. * Try fixing path issue. * Try fixing PROG from just saying bash. * More path and PROG fixes. * Final cleanups. Seems good now. * test-termux works great now! * Add aliases for reloading the Termux config project (this Git repo). * Add missing slash. * Fix double flagging bitrates. * Show the ffmpeg command. Print file sizes. Planning to come back later with a laptop and clean up tabs vs spaces. Difficult to manage on a phone. * Move input to be before options. * Fix filter parameters. * Remove single quotes. * Fix typos. * Add more shortcut aliases. * Add more packages. * Update instructions and mention shortcut aliases. * Fix extra period. * Add more aliases. * Add extra detail to final instruction. * Better formatting on new text. * Add aliases, fix spaces to tabs. * Change order of parameters so that size is first. * Add wget to default packages. * Add two-pass processing. * More changes for 2-pass. * Add ability to still do 1 pass. Add sync before filesize check. Clean 2-pass files. * Add better chance of getting correct filesize with a sleep. Make ffmpeg 2 pass file name more explicit. * Change to maxrate from b:v so that ffmpeg can determine the best rate per frame. * First attempt at adding basic-process for a more flexible ffmpeg experience. * Multiple bugfixes and enhancements for video functions. * Only remove first pass files if everything succeeded. Sleep before doing IF for file size. --- README.md | 10 +- bashrc.sh | 272 +++++++++++++++++++++++++++++++++++++++++++--------- env.example | 3 +- setup.sh | 46 +++++---- 4 files changed, 264 insertions(+), 67 deletions(-) diff --git a/README.md b/README.md index 058b5a6..72a88fa 100644 --- a/README.md +++ b/README.md @@ -22,8 +22,8 @@ Hyperling's scripts for a productive Termux environment. chmod 755 *.sh ``` -1. Make any modifications to the env.example file - - Only if you do not already have a ~/.env file +1. Make any modifications to the env.example file. + - Only if you do not already have ~/.env already. 1. Run the deployment script. @@ -31,12 +31,14 @@ Hyperling's scripts for a productive Termux environment. ./setup.sh ``` -1. All done! +1. All done. Be sure to source your new `.bashrc`! # Updates Each program is developed to be run numerous times, so all that needs done is following the Install instructions again. +Shortcuts for this exist after the initial install, such as running `termux-reload` then `bash-reload`. + # Development Since the project self-destructs, it is recommended to copy the folder for each run, then execute the copied files. @@ -47,3 +49,5 @@ cd ~/termux-copy chmod 755 *.sh ./setup.sh ``` + +Or use the `test-termux` command if the project is already loaded. diff --git a/bashrc.sh b/bashrc.sh index 6f4f8eb..4124612 100644 --- a/bashrc.sh +++ b/bashrc.sh @@ -14,73 +14,257 @@ else alias prod="echo 'ERROR: .env not set up properly, please fix and reload RC.'" fi -# Easily get to storage device. -export SS="~/storage/shared/" +# Quickies +alias reload-bash="source ~/.bashrc" +alias bash-reload="reload-bash" +alias reload="reload-bash" + +# Easily get to storage devices. +export SS="~/storage/shared" alias ss="cd $SS" alias sd="ss" alias storage="ss" alias home="ss" -# Help Prevent Mistakes +# Shortcut to media. +export DCIM="$SS/DCIM/Camera" +alias dcim="cd $DCIM" + +# Shortcut to Code +export CODE="$SS/Code" +alias code="cd $CODE" + +# Shortcuts for TRASH. +export TRASH="$SS/TRASH" +alias trash="cd $TRASH" +alias clean-trash="bash -c 'rm -rfv $TRASH/*'" +alias trash-clean="clean-trash" +alias check-trash="du -h $TRASH" +alias trash-check="check-trash" + +# Help prevent mistakes. alias cp="cp -v" alias mv="mv -v" alias rm="echo 'Move to ~/storage/shared/TRASH/ instead!'" +# Quickies +alias update="pkg update && pkg upgrade" +alias bye="exit" +alias goodbye="update -y && bye" +alias install="pkg install" + ## Functions ## +# Optimize the bitrate and audio levels for an edited video. function process-video-usage { - echo "USAGE: process-video oldFile newFile [videoBitrate] [audioBitrate]" - echo "Call ffmpeg with preferred video posting settings." + echo "USAGE: process-video oldFile newFile [videoBitrate] [audioBitrate] [sizeRating]" + echo -n "Purpose: Call ffmpeg with preferred video posting settings. " + echo -n "Bitrates default to 2000k and 192k, size is 720. " + 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" - - # 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 || -e $newfile ]]; then - echo "ERROR: New file '$newfile' already exists." >&2 - process-video-usage - elif [[ -e $newfile ]]; then - echo "ERROR: New file '$newfile' already exists." >&2 + # Parameters + file="$1" + newfile="$2" + video="$3" + audio="$4" + size="$5" + passes="$6" + + # Validations + if [[ -z $file || ! -e $file ]]; then + echo "ERROR: Original file '$file' does not exist." >&2 process-video-usage return 1 - fi + fi - if [[ -z $video ]]; then - video="-b:v 2000k" - else - video="-b:v $video" - 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 $audio ]]; then - audio="-b:a 192k" - else - audio="-b:a $audio" - fi + if [[ -z $video ]]; then + video="2000k" + fi + video="-maxrate $video" - echo "`date` - Converting '$file' to '$newfile' using '$video $audio'" - - # Main - ffmpeg -nostdin -hide_banner -loglevel quiet \ - $video $audio -movflags +faststart \ - -af "dynaudnorm=f=33:g=65:p=0.66:m=33." \ - -i "$file" "$newfile" + 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 [[ $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 && + set +x && + echo "`date` - Done with the first pass." || + return 1 + 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 + + sync + sleep 5 + 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" -cd ~/storage/shared/ +# Quickly commit code to a repo. +function commit { + message="$1" + if [[ -z $message ]]; then + echo "ERROR: A message is required." >&2 + echo 'USAGE: commit "My commit message."' >&2 + return 1 + fi + git add . && git commit -m "$message" && git push +} -echo "'$0' completed!" \ No newline at end of file +# Easily test this project after committing changes. +# Otherwise can just source this file unless testing setup.sh. +function test-termux { + sh -c "rm -rf ~/termux-deleteme ~/TRASH/termux-deleteme" 2>/dev/null + git clone https://github.com/Hyperling/Termux ~/termux-deleteme --branch=dev + chmod 755 ~/termux-deleteme/*.sh + ~/termux-deleteme/setup.sh +} +alias reload-termux="test-termux" +alias termux-test="test-termux" +alias termux-reload="reload-termux" + +# Allow converting video to audio ad 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 v2a="basic-process" +alias vta="v2a" +alias va="v2a" +alias pa="v2a" +alias fix-audio="basic-process" + +# Go to normal storage. DISABLED, use shortcut aliases instead. +#cd ~/storage/shared/ + +PROG="$(basename -- "${BASH_SOURCE[0]}")" +echo "'$PROG' completed!" diff --git a/env.example b/env.example index 8823143..c8ad693 100644 --- a/env.example +++ b/env.example @@ -5,4 +5,5 @@ PROD_USER=username PROD_NAME=example.com PROD_PORT=2222 -echo "'$0' completed!" +PROG="$(basename -- "${BASH_SOURCE[0]}")" +echo "'$PROG' completed!" diff --git a/setup.sh b/setup.sh index 7b5c83c..9bfd4ca 100644 --- a/setup.sh +++ b/setup.sh @@ -1,40 +1,43 @@ # No Shebang For Termux # 2024-02-10 Hyperling -echo "`date` - Starting Hyperling's Termux Setup" +PROG="$(basename -- "${BASH_SOURCE[0]}")" +echo "`date` - Starting $PROG" -DIR="`dirname $0`" +DIR="$(dirname -- "${BASH_SOURCE[0]}")" cd $DIR DIR="`pwd`" +echo "Working in '$DIR'." echo -e "\n`date` - Upgrade Package Repos" pkg update && - pkg upgrade + pkg upgrade -y echo -e "\n`date` - Check Storage Permission" if [[ ! -e ~/storage/shared ]]; then - sleep 3 - termux-setup-storage - if [[ -e ~/storage/shared/ ]]; then - echo "~/storage/shared/ now exists. :)" + sleep 3 + termux-setup-storage + if [[ -e ~/storage/shared/ ]]; then + echo "~/storage/shared/ now exists. :)" else - echo "ERROR: Something ain't right, Jim! Abort!" >&2 + echo "ERROR: Something ain't right, Jim! Abort!" >&2 exit 1 fi else - echo "Everything looks good already, pal." + echo "Everything looks good already, pal." fi echo -e "\n`date` - Install Software" -pkg install \ - openssh tsu vim htop git cronie \ - nmap traceroute \ - ffmpeg +pkg install -y \ + openssh tsu vim htop git cronie man \ + nmap traceroute wget \ + ffmpeg imagemagick \ + kotlin php nodejs python libllvm echo -e "\n`date` - BASH Environment" if [[ ! -e ~/.env ]]; then if [[ -e env.example ]]; then - mv -v env.example ~/.env + mv -v env.example ~/.env else echo "ERROR: Neither .env or env.example found." >&2 fi @@ -46,7 +49,7 @@ fi if [[ -e bashrc.sh ]]; then mv -v bashrc.sh ~/.bashrc else - echo "ERROR: bashrc.sh not found, skipping." >&2 + echo "ERROR: bashrc.sh not found, skipping." >&2 fi echo -e "\n`date` - Cleanup" @@ -58,16 +61,21 @@ if [[ ! -e ~/storage/shared/TRASH ]]; then fi ln -s ~/storage/shared/TRASH ~/TRASH -cd .. -if [[ -n $DIR && $DIR != "/" ]]; then +if [[ -n $DIR && $DIR != "/" && -d .git ]]; then + echo "We are in a git clone, remove the project." + cd .. mv -v $DIR ~/TRASH/termux-"`date +'%Y%m%d%H%M%S'`" | grep -v '/.git/' +else + echo "File was used individually, remove it." + mv "$PROG" ~/TRASH/ fi echo -e "\n*******" echo "Don't forget to reload your environment!" -echo " source .bashrc" +echo " source ~/.bashrc" echo "*******" -echo -e "\n`date` - Finished Hyperling's Termux Setup" +PROG="$(basename -- "${BASH_SOURCE[0]}")" +echo -e "\n`date` - Finished $PROG" exit 0