2024-02-10 13:00:17 -07:00
|
|
|
# 2024-02-10 Hyperling
|
|
|
|
|
|
|
|
if [[ -e ~/.env ]]; then
|
|
|
|
source ~/.env
|
|
|
|
fi
|
|
|
|
|
|
|
|
## Aliases ##
|
|
|
|
|
|
|
|
# Quickly log onto production server.
|
|
|
|
# Setting up ssh-keygen and ssh-copy-id make this even faster!
|
|
|
|
if [[ -n $PROD_PORT && -n $PROD_USER && -n $PROD_NAME ]]; then
|
|
|
|
alias prod="ssh -p $PROD_PORT $PROD_USER@$PROD_NAME"
|
|
|
|
else
|
|
|
|
alias prod="echo 'ERROR: .env not set up properly, please fix and reload RC.'"
|
|
|
|
fi
|
|
|
|
|
2024-03-23 19:03:39 -07:00
|
|
|
# Quickies
|
|
|
|
alias reload-bash="source ~/.bashrc"
|
|
|
|
alias bash-reload="reload-bash"
|
|
|
|
alias reload="reload-bash"
|
|
|
|
|
|
|
|
# Easily get to storage devices.
|
|
|
|
export SS="~/storage/shared"
|
2024-02-10 13:00:17 -07:00
|
|
|
alias ss="cd $SS"
|
|
|
|
alias sd="ss"
|
|
|
|
alias storage="ss"
|
|
|
|
alias home="ss"
|
|
|
|
|
2024-03-23 19:03:39 -07:00
|
|
|
# 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.
|
2024-02-10 13:00:17 -07:00
|
|
|
alias cp="cp -v"
|
|
|
|
alias mv="mv -v"
|
|
|
|
alias rm="echo 'Move to ~/storage/shared/TRASH/ instead!'"
|
|
|
|
|
2024-03-23 19:03:39 -07:00
|
|
|
# Quickies
|
|
|
|
alias update="pkg update && pkg upgrade"
|
|
|
|
alias bye="exit"
|
|
|
|
alias goodbye="update -y && bye"
|
|
|
|
alias install="pkg install"
|
|
|
|
|
2024-02-10 13:00:17 -07:00
|
|
|
## Functions ##
|
|
|
|
|
2024-03-23 19:03:39 -07:00
|
|
|
# Optimize the bitrate and audio levels for an edited video.
|
2024-02-10 13:00:17 -07:00
|
|
|
function process-video-usage {
|
2024-07-03 18:28:37 -07:00
|
|
|
echo "USAGE: process-video oldFile newFile [videoBitrate] [audioBitrate] [sizeRating] [numPasses] [forceBitrate]"
|
2024-03-23 19:03:39 -07:00
|
|
|
echo -n "Purpose: Call ffmpeg with preferred video posting settings. "
|
2024-07-03 18:28:37 -07:00
|
|
|
echo -n "Bitrates default to 2000k and 192k, size is 720, passes is 1, and force is N."
|
2024-03-23 19:03:39 -07:00
|
|
|
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"
|
2024-02-10 13:00:17 -07:00
|
|
|
}
|
|
|
|
function process-video {
|
2024-03-23 19:03:39 -07:00
|
|
|
# Parameters
|
|
|
|
file="$1"
|
|
|
|
newfile="$2"
|
|
|
|
video="$3"
|
|
|
|
audio="$4"
|
|
|
|
size="$5"
|
|
|
|
passes="$6"
|
2024-07-03 18:28:37 -07:00
|
|
|
force="$7"
|
2024-03-23 19:03:39 -07:00
|
|
|
|
|
|
|
# Validations
|
|
|
|
if [[ -z $file || ! -e $file ]]; then
|
|
|
|
echo "ERROR: Original file '$file' does not exist." >&2
|
|
|
|
process-video-usage
|
2024-02-10 13:00:17 -07:00
|
|
|
return 1
|
2024-03-23 19:03:39 -07:00
|
|
|
fi
|
|
|
|
|
|
|
|
if [[ -z $newfile ]]; then
|
|
|
|
echo "ERROR: New file's name must be provided." >&2
|
2024-02-10 13:00:17 -07:00
|
|
|
process-video-usage
|
|
|
|
return 1
|
2024-03-23 19:03:39 -07:00
|
|
|
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
|
2024-07-05 12:31:17 -07:00
|
|
|
if [[ $force == "Y" ]]; then
|
|
|
|
video="-b:v $video"
|
|
|
|
else
|
|
|
|
video="-b:v $video -minrate 0 -maxrate $video -bufsize $video"
|
|
|
|
fi
|
2024-03-23 19:03:39 -07:00
|
|
|
|
|
|
|
if [[ -z $audio ]]; then
|
|
|
|
audio="192k"
|
|
|
|
fi
|
|
|
|
audio="-b:a $audio"
|
|
|
|
|
|
|
|
if [[ -z $size ]]; then
|
|
|
|
size="720"
|
|
|
|
fi
|
|
|
|
size="-filter:v scale=-1:$size"
|
|
|
|
|
2024-05-16 10:02:53 -07:00
|
|
|
if [[ -z $passes ]]; then
|
|
|
|
passes=1
|
|
|
|
fi
|
|
|
|
pass=""
|
2024-03-23 19:03:39 -07:00
|
|
|
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 \
|
2024-05-16 10:02:53 -07:00
|
|
|
-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
|
2024-03-23 19:03:39 -07:00
|
|
|
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"
|
2024-02-10 13:00:17 -07:00
|
|
|
status="$?"
|
2024-03-23 19:03:39 -07:00
|
|
|
set +x
|
|
|
|
echo "`date` - Done with the final pass."
|
|
|
|
|
|
|
|
if [[ $passes == 2 && $status == 0 ]]; then
|
|
|
|
mv -v ffmpeg2pass*.log* ~/TRASH/
|
|
|
|
fi
|
|
|
|
|
|
|
|
sync
|
2024-05-16 10:02:53 -07:00
|
|
|
sleep 10
|
|
|
|
sync
|
2024-03-23 19:03:39 -07:00
|
|
|
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
|
2024-02-10 13:00:17 -07:00
|
|
|
|
|
|
|
echo -e "\n`date` - Finished with status '$status'."
|
|
|
|
return $status
|
|
|
|
}
|
2024-03-23 19:03:39 -07:00
|
|
|
alias pv="process-video"
|
|
|
|
|
|
|
|
# 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
|
|
|
|
}
|
|
|
|
|
|
|
|
# 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
|
|
|
|
}
|
2024-05-16 10:02:53 -07:00
|
|
|
alias bp="basic-process"
|
|
|
|
alias bv="bp"
|
|
|
|
|
|
|
|
# Function to automatically append tbe Y.
|
|
|
|
function fix-audio {
|
|
|
|
basic-process "$1" Y
|
|
|
|
}
|
|
|
|
|
|
|
|
# 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"
|
2024-03-23 19:03:39 -07:00
|
|
|
alias vta="v2a"
|
|
|
|
alias va="v2a"
|
|
|
|
alias pa="v2a"
|
2024-02-10 13:00:17 -07:00
|
|
|
|
2024-03-23 19:03:39 -07:00
|
|
|
# Go to normal storage. DISABLED, use shortcut aliases instead.
|
|
|
|
#cd ~/storage/shared/
|
2024-02-10 13:00:17 -07:00
|
|
|
|
2024-03-23 19:03:39 -07:00
|
|
|
PROG="$(basename -- "${BASH_SOURCE[0]}")"
|
|
|
|
echo "'$PROG' completed!"
|