env-ansible/files/scripts/compress_audio.sh
Chad 7519f23a81
Fixes and Enhancements (#48)
* Fix metasplot install if /usr/local/bin is not active in path yet. Also use variables.

* Use plocate on openSUSE. Supposed to be faster. Cannot have both m and p installed at the same time and p comes with the base system.

* Include wheel group for user as well.

* Finalize GNOME settings, go with RC commands instead of dconf module.

* Add hostname to report files.

* Add TBD for shared home situation.

* Fix cron service for Fedora.

* Disable the power button.

* Fix Fedora ffmpeg issues. Move package modules from flatpak playbook. Uninstall firefox from package manager.

* Enhance update function to handle shared home between multiple distributions.

* Allow keeping local backups of files.

* Replace flatpak repair check with accept flag instead of battery so that any automated update runs do the cleanup.

* Begin hoarding settings files.

* Start building out a FireFox profile.

* Fix extra comment command in comment.

* Add an All option to completely compress the entire directory.

* Codium is still broken on all tested systems, hide from Favorites.

* Add scipt to handle audio files. Also can convert to 432Hz.

* Use cut instead of awk to get rid of first parameter. Fixes bugs when spaces are allowed in the filenames.

* Enhancements and bugfix for "$freq".

* Add playbook for desktop VPN clients. Start with Mullvad.

* Add website to the seeded projects.

* Add firmware updates to the update function.

* Allow `fwupdmgr` to fail and have `update` still continue.

* Shorten lines.

* Uninstall DeltaChat.

* Separate the firmware update into its own function.

* Add alias for cloning one folder to another without using rm/cp.

* Fix typo in rsync.

* Go ahead and add extra options.

* Make the files human readable size descriptions.

* Remove unnecessary v, P does good enough.
2024-01-23 09:43:42 -07:00

217 lines
5.9 KiB
Bash
Executable File

#!/bin/bash
# 2023-12-04 Hyperling
# Lower resolution of audio and convert to mp3. Also
# Also see: compress-video.sh
## Setup ##
DIR="$(dirname -- "${BASH_SOURCE[0]}")"
PROG="$(basename -- "${BASH_SOURCE[0]}")"
echo "Running '$DIR/$PROG'."
# Integers
typeset -i status
# Strings
typeset -l quality
quality="256k"
mp3="mp3"
tag="shrunk"
date_YYYYMMDD="`date "+%Y%m%d"`"
location="."
search="ls"
large_extension="DoNotUse-LargerThanOriginal"
large_created=".$PROG.large_created.true"
## Functions ##
function usage() {
# Hit the user with knowledge on how to use this program.
# Parameters:
# 1) The exit status to use.
status=$1
echo -n "Usage: $PROG [-q QUALITY] [-l LOCATION] " >&2
echo "[-A | [-r] [-f] [-d] [-c] [-z]] [-h] [-x]" >&2
cat <<- EOF
Compress audio to mp3. Can handle folders and work recursively.
Parameters:
-q QUALITY : Integer for the maximum length of either media dimension.
-l LOCATION : The specific media or folder which needs compressed.
-r : Recursively shrink media based on the location passed.
-f : Force the media to be shrunk even if a file already exists for it.
-d : Delete the original media if the compressed media is smaller.
-c : Clean the filename of underscores, dashes, 'IMG', etc.
-z : Convert from 440 to 432 Hz
-A : Resursively Force, Delete, and Clean.
-h : Display this usage text.
-x : Enable BASH debugging.
EOF
exit $status
}
## Parameters ##
while getopts ":q:l:rfdczAhx" opt; do
case $opt in
q) quality="$OPTARG" ;;
l) location="$OPTARG" ;;
r) recurse="Y" && search="find" ;;
f) force="Y" ;;
d) delete="Y" ;;
c) clean="Y" ;;
z) frequency="Y" ;;
A) recurse="Y" &&
search="find" &&
force="Y" &&
delete="Y" &&
clean="Y" &&
frequency="Y" ;;
h) usage 0 ;;
x) set -x ;;
*) echo "ERROR: Option $OPTARG not recognized." >&2 && usage 1 ;;
esac
done
## Validations ##
convert_exe="`which ffmpeg`"
if [[ "$convert_exe" == "" ]]; then
echo "ERROR: 'ffmpeg' command could not be found, "
echo "please install 'ffmpeg'."
usage 2
fi
## Main ##
# If using ls, make sure full path is passed to the loop by adding '/*'.
if [[ -z "$recurse" && -d "$location" && "$location" != *'/*' ]]; then
if [[ "$location" != *'/' ]]; then
location="${location}/"
fi
fi
settings="-ab $quality"
if [[ $frequency == "Y" ]]; then
settings="$settings -af asetrate=44100*432/440,aresample=44100,atempo=440/432"
fi
$search "$location" | sort | while read media; do
# Avoid processing directories no matter the name.
[ -d "$media" ] && continue
# Avoid processing files previously shrunk.
[[ "$media" == *"$tag"* ]] && continue
echo -e "\n$media"
# Only look through mp3, m4a, flac, wav for now.
typeset -l extension
extension="${media##*.}"
if [[ "$extension" != *"mp3"
&& "$extension" != *"m4a"
&& "$extension" != *"flac"
&& "$extension" != *"wav" ]]
then
echo " SKIP: Sorry, currently only mp3, m4a, flac, and wav are supported."
continue
fi
new_media="${media//.$extension/}.$tag-$date_YYYYMMDD.$mp3"
# Clean the filename of extra junk so that they can be chronological order.
new_media_clean="$new_media"
new_media_clean="${new_media_clean//_/ }"
###new_media_clean="${new_media_clean//-/}"
# Delete the existing shrunk media if we are forcing a new compression.
if [[ -n "$force" && (-e "$new_media" || -e "$new_media_clean") ]]; then
echo -n " FORCE: "
rm -v "$new_media" "$new_media_clean" 2>/dev/null
fi
# Skip if a compressed media was already created today.
if [[ -e "$new_media" || -e "$new_media_clean" ]]; then
echo " SKIP: Media has already been shrunk previously, moving on."
continue
fi
# Whether or not to use the cleaned version or the normal version.
if [[ -n "$clean" ]]; then
new_media="$new_media_clean"
fi
### TBD Instead of this, only alter the file names, and set a dirname var?
# Create a new directory if the directory names were altered.
mkdir -pv "`dirname "$new_media"`"
# This modifies the media to be $size at its longest end, not be a square.
$convert_exe -nostdin -hide_banner -loglevel quiet \
-i "$media" $settings "$new_media"
status="$?"
if [[ "$status" != 0 ]]; then
echo " SKIP: '$convert_exe' returned a status of '$status'."
continue
fi
# Check file sizes and if the new one is larger then flag it as large.
echo " Checking file sizes:"
ls -sh "$media" "$new_media" | sort -hr | while read line; do
echo " $line"
done
smaller_file=`
ls -sh "$media" "$new_media" | sort -h | cut -f 2- -d ' ' | head -n 1
`
if [[ "$smaller_file" == "$media" ]]; then
echo -n " WARNING: Conversion caused growth, original was likely lesser "
echo "quality. Adding a suffix to the file to signify that it may be bad."
echo -n " "
mv -v "$new_media" "$new_media.$large_extension"
touch "$large_created"
continue
fi
if [[ -e "$new_media" ]]; then
echo " SUCCESS: Conversion succeeded, file has been compressed."
else
echo " ERROR: New media '$new_media' could not be found. Aborting."
break;
fi
if [[ -n "$delete" ]]; then
echo -n " DELETE: "
if [[ -d ~/TRASH ]]; then
mv -v "$media" ~/TRASH/
else
rm -v "$media"
fi
fi
done
# If large files do end up being created, allow the user to bulk delete them.
if [[ -e "$large_created" ]]; then
echo -e "\n*********************************************************"
echo -e "WARNING: The files below are larger than their originals!\n"
find "$location" -name "*"$large_extension
echo -e "*********************************************************"
echo -en "\nWould you like to delete them? (Y/n): "
typeset -u confirm_delete
read confirm_delete
if [[ -z "$confirm_delete" || "$confirm_delete" == "Y"* ]]; then
echo ""
find "$location" -name "*"$large_extension -exec rm -v {} \;
else
echo -e "\nKeeping files. Please use this if you change your mind:"
echo " find \"$location\" -name \"*\"$large_extension -exec rm -v {} \;"
fi
rm "$large_created"
fi
echo -e "\nDone!"
exit 0