generated from pavel.muhortov/template-bash
209 lines
4.9 KiB
Bash
209 lines
4.9 KiB
Bash
#! /bin/bash
|
|
|
|
# DESCRIPTION:
|
|
# Converting JPEG collection to MP4.
|
|
# This is only a local "proof of conept" for testing and debugging.
|
|
#
|
|
# DEPENDENCIES:
|
|
# - ffmpeg
|
|
#
|
|
# PARAMETERS:
|
|
# 1: "qn" - execution without pauses
|
|
# 2: custom configuration file path
|
|
# 3: periods: '' - today | '-d' - yesterday | '-w' - last week | '-m' - last month | '-y' - last year
|
|
#
|
|
# FUNCTIONS:
|
|
#
|
|
|
|
#######################################
|
|
# Print message and add to log.
|
|
# Globals:
|
|
# logs
|
|
# Arguments:
|
|
# 1: message to print and logging
|
|
#######################################
|
|
addtologs() {
|
|
echo "$(date +'%Y.%m.%d-%H:%M:%S') $1" | tee -a "${logs}"
|
|
}
|
|
|
|
#######################################
|
|
# Waiting for press [ENTER].
|
|
# Globals:
|
|
# None
|
|
# Arguments:
|
|
# None
|
|
#######################################
|
|
execpause() {
|
|
read -r -p "Press [ENTER] to continue... "
|
|
}
|
|
|
|
#######################################
|
|
# Exit procedure.
|
|
# Globals:
|
|
# show
|
|
# Arguments:
|
|
# None
|
|
#######################################
|
|
execquite() {
|
|
addtologs "execution time is $(($(date +%s)-time)) seconds, exit"
|
|
if [ "${show}" != "qn" ]; then
|
|
execpause
|
|
fi
|
|
exit
|
|
}
|
|
|
|
#######################################
|
|
# Error exit procedure with Telegram notification.
|
|
# Globals:
|
|
# telegramapiurl
|
|
# telegramchatid
|
|
# Arguments:
|
|
# 1: message to print and logging
|
|
#######################################
|
|
execerror() {
|
|
addtologs "error: $1"
|
|
curl -s -X POST "${telegramapiurl}/sendMessage" \
|
|
-d "chat_id=${telegramchatid}" \
|
|
-d "text=$(basename -s .sh "$0") error: $1" \
|
|
>> /dev/null 2>&1
|
|
execquite
|
|
}
|
|
|
|
#######################################
|
|
# Parsing config file and creating global vars.
|
|
# Globals:
|
|
# None
|
|
# Arguments:
|
|
# None
|
|
#######################################
|
|
getconfig() {
|
|
logs=$(grep "logs=" "${conf}" | cut -d= -f2)
|
|
list=$(grep "list=" "${conf}" | cut -d= -f2)
|
|
imgroot=$(grep "imgroot=" "${conf}" | cut -d= -f2)
|
|
IFS=" " read -r -a imgnames <<< "$(grep "imgnames=" "${conf}" | cut -d= -f2)"
|
|
xscale=$(grep "xscale=" "${conf}" | cut -d= -f2)
|
|
yscale=$(grep "yscale=" "${conf}" | cut -d= -f2)
|
|
mp4fps=$(grep "mp4fps=" "${conf}" | cut -d= -f2)
|
|
telegramapiurl=$(grep "telegramapiurl=" "${conf}" | cut -d= -f2)
|
|
telegramchatid=$(grep "telegramchatid=" "${conf}" | cut -d= -f2)
|
|
}
|
|
|
|
#
|
|
# VARIABLES:
|
|
#
|
|
|
|
show=$1
|
|
conf=$2
|
|
if [ -z "${conf}" ] || [ "${conf}" == "-" ]; then
|
|
conf="$(dirname "$(realpath "$0")")/$(basename -s .sh "$0").conf"
|
|
fi
|
|
when=$3
|
|
if [ -z "${when}" ]; then
|
|
d=$(date +"%d")
|
|
w=$(date +"%V")
|
|
m=$(date +"%m")
|
|
y=$(date +"%Y")
|
|
duration=1
|
|
imgpath="${y}/${m}/${w}/${d}"
|
|
imgname="${y}.${m}.${d}"
|
|
fi
|
|
if [ "${when}" == "-d" ]; then
|
|
d=$(date -d "-1 day" +"%d")
|
|
m=$(date +"%m")
|
|
if [ "$(date -d '-1 day' +'%m')" != "$(date +'%m')" ]; then
|
|
m=$(date -d '-1 day' +'%m')
|
|
fi
|
|
y=$(date +"%Y")
|
|
if [ "$(date -d '-1 day' +'%Y')" != "$(date +'%Y')" ]; then
|
|
y=$(date -d '-1 day' +'%Y')
|
|
fi
|
|
w=$(date +"%V")
|
|
if [ "$(date +'%w')" == "1" ]; then
|
|
w=$(date -d "-1 week" +"%V")
|
|
fi
|
|
duration=1
|
|
imgpath="${y}/${m}/${w}/${d}"
|
|
imgname="${y}.${m}.${d}"
|
|
fi
|
|
if [ "${when}" == "-w" ]; then
|
|
w=$(date -d "-1 week" +"%V")
|
|
m=$(date +"%m")
|
|
if [ "$(date -d '-1 week' +'%m')" != "$(date +'%m')" ]; then
|
|
m=$(date -d '-1 week' +'%m')
|
|
fi
|
|
y=$(date +"%Y")
|
|
if [ "$(date -d '-1 week' +'%Y')" != "$(date +'%Y')" ]; then
|
|
y=$(date -d '-1 week' +'%Y')
|
|
fi
|
|
duration=7
|
|
imgpath="${y}/*/${w}"
|
|
imgname="${y}-w${w}"
|
|
fi
|
|
if [ "${when}" == "-m" ]; then
|
|
m=$(date -d "-1 month" +"%m")
|
|
y=$(date +"%Y")
|
|
if [ "$(date -d '-1 month' +'%Y')" != "$(date +'%Y')" ]; then
|
|
y=$(date -d '-1 month' +'%Y')
|
|
fi
|
|
duration=30
|
|
imgpath="${y}/${m}"
|
|
imgname="${y}.${m}"
|
|
fi
|
|
if [ "${when}" == "-y" ]; then
|
|
y=$(date -d "-1 year" +"%Y")
|
|
duration=360
|
|
imgpath="${y}"
|
|
imgname="${y}"
|
|
fi
|
|
|
|
time=$(date +%s)
|
|
cd "$(dirname "$(realpath "$0")")" || execerror
|
|
if [ ! -e "${conf}" ]; then
|
|
execerror "Not found config file: ${conf}"
|
|
else
|
|
getconfig
|
|
fi
|
|
if [ -z "${logs}" ];then
|
|
logs=/dev/null
|
|
elif [ ! -e "${logs}" ];then
|
|
touch "${logs}"
|
|
fi
|
|
if [ -z "${list}" ];then
|
|
list="$(dirname "$(realpath "$0")")/$(basename -s .sh "$0").list"
|
|
fi
|
|
if [ ! -e "${list}" ];then
|
|
touch "${list}"
|
|
fi
|
|
if ! command -v ffmpeg &> /dev/null; then
|
|
execerror "Not found dependencies"
|
|
fi
|
|
|
|
#
|
|
# MAIN:
|
|
#
|
|
|
|
for name in "${imgnames[@]}"; do
|
|
imgmatch="*${name}*.jpeg"
|
|
imgarray=()
|
|
while read -r FILE; do
|
|
imgarray+=("${FILE}")
|
|
done < <(find "${imgroot}/${imgpath}" -name "${imgmatch}" | sort)
|
|
imgcount=${#imgarray[*]}
|
|
|
|
echo '' > "${list}"
|
|
for item in "${imgarray[@]}"; do
|
|
echo file \'"${item}"\' >> "${list}"
|
|
done
|
|
|
|
imgdest="${imgroot}/${name}_${imgname}.mp4"
|
|
echo "${imgdest}"
|
|
if ffmpeg -r "${imgcount}/${duration}" -f concat -safe 0 -i "${list}" \
|
|
-c:v libx264 -vf "scale=${xscale}:${yscale},fps=${mp4fps},format=yuv420p" \
|
|
"${imgdest}" -y; then
|
|
addtologs "converted ${imgcount} images to ${imgdest} with duration ${duration}"
|
|
else
|
|
execerror "converted ${imgcount} images to ${imgdest} with duration ${duration}"
|
|
fi
|
|
done
|
|
execquite
|