cctv-scheduler/archive/0.2/converter.sh

209 lines
4.9 KiB
Bash
Raw Permalink Normal View History

#! /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