Allow images and videos in new deface filter. - annna - Annna the nice friendly bot. HTML git clone git://bitreich.org/annna/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/annna/ DIR Log DIR Files DIR Refs DIR Tags DIR README --- DIR commit a7b6271d25d1e871de322f700ab5fc352b87b4ed DIR parent 8178121cf184328ccf2dbd37f7ff2b97d1cfd08c HTML Author: Annna Robert-Houdin <annna@bitreich.org> Date: Sun, 7 Aug 2022 01:00:32 +0200 Allow images and videos in new deface filter. Diffstat: M annna-message-common | 44 ++++++++++++++++++++++--------- M ffmpeg-effect | 207 ++++++++++++++++++------------- 2 files changed, 149 insertions(+), 102 deletions(-) --- DIR diff --git a/annna-message-common b/annna-message-common @@ -889,6 +889,28 @@ case "${text}" in [ ! -f "${inpath}" ] && exit 0 + # outfile and outpath filtering for the cache. + case "${filter}" in + antidepressant) + outfile="${outfile%.*}.jpg" + outpath="${outpath%.*}.jpg" + ;; + putin) + outfile="${outfile%.*}.jpg" + outpath="${outpath%.*}.jpg" + ;; + wat|smith|zucc) + mimetype="$(file --mime-type "$inpath" | cut -d':' -f 2 | cut -c 2-)" + # Only allow images to be free. + case "$mimetype" in + image/*) + outfile="${outfile%.*}.${origext}" + outpath="${outpath%.*}.${origext}" + ;; + esac + esac + + # Cleanup if outpath file is empty. [ -f "${outpath}" -a ! -s "${outpath}" ] && rm "${outpath}" if [ -s "${outpath}" ]; @@ -898,19 +920,15 @@ case "${text}" in fi case "${filter}" in - antidepressant) - outfile="${outfile%.*}.jpg" - outpath="${outpath%.*}.jpg" - antidepressant "${inpath}" "${outpath}" 2>&1 >/dev/null - ;; - putin) - outfile="${outfile%.*}.jpg" - outpath="${outpath%.*}.jpg" - putin-os "${inpath}" "${outpath}" 2>&1 >/dev/null - ;; - *) - ffmpeg-effect "${filter}" "${inpath}" "${outpath}" 2>&1 >/dev/null - ;; + antidepressant) + antidepressant "${inpath}" "${outpath}" 2>&1 >/dev/null + ;; + putin) + putin-os "${inpath}" "${outpath}" 2>&1 >/dev/null + ;; + *) + ffmpeg-effect "${filter}" "${inpath}" "${outpath}" 2>&1 >/dev/null + ;; esac if [ "${recipient}" != "${text}" ]; DIR diff --git a/ffmpeg-effect b/ffmpeg-effect @@ -12,6 +12,17 @@ usage() { exit 1 } +is_image() { + mimetype="$(file --mime-type "$1" | cut -d':' -f 2 | cut -c 2-)" + case "${mimetype}" in + image/*) + return 0 + ;; + esac + + return 1 +} + has_audio() { ffprobe "$1" 2>&1 | grep -qE 'Stream .* Audio: ' } @@ -63,13 +74,19 @@ mix_audio_video() { } replace_face() { + set -x + face_replacement="$1" input="$2" output="$3" - #ext="$(printf '%s' "$input" | awk -F. '{print $NF}')" - #tmp=/tmp/replace_face_$$.$ext - tmp="/tmp/replace_face_$$.mkv" + if is_image $input; + then + ext="$(printf '%s' "$input" | awk -F. '{print $NF}')" + tmp=/tmp/replace_face_$$.$ext + else + tmp="/tmp/replace_face_$$.mkv" + fi $HOME/.local/bin/deface "$input" --replacewith img \ --replaceimg "$face_replacement" -o "$tmp" >/dev/null 2>&1 @@ -80,9 +97,27 @@ replace_face() { else mv "$tmp" "$output" fi + + set +x } process_filter() { + # Filters which do not require image2mkv. + case "$1" in + wat) + replace_face "${mediadir}/wat.png" "$2" "$3" + return 0 + ;; + smith) + replace_face "${mediadir}/smith.png" "$2" "$3" + return 0 + ;; + zucc) + replace_face "${mediadir}/zucc.png" "$2" "$3" + return 0 + ;; + esac + # extend duration if less than a second or image dur="$($ffprobe_common -show_entries format=duration "$2")" if test "$dur" = "N/A" || test "${dur%.*}" -lt 1; then @@ -93,92 +128,86 @@ process_filter() { fi case "$1" in - amplify) - $ffmpeg_common -i "$2" -filter:a "volume=10" "$3";; - banjo) - replace_audio "${mediadir}/banjo.mp3" "$2" "$3";; - bounce) - $ffmpeg_common -i "$2" \ - -filter_complex "[0]reverse[r];[0][r]concat,loop=${repeats}:250,setpts=N/25/TB" -an \ - "$3" </dev/null;; - celtify) - mix_audio "${mediadir}/broceliande.ogg" "$2" "$3";; - concatenate) - mix_audio "${mediadir}/concatenate.mp3" "$2" "$3";; - daybowbow) - replace_audio "${mediadir}/day-bow-bow.ogg" "$2" "$3";; - dontdoit) - mix_audio "${mediadir}/dontdoit.mp3" "$2" "$3";; - doomify) - mix_audio "${mediadir}/doom.mp3" "$2" "$3";; - dutchapprove) - mix_audio_video "${mediadir}/krul.mkv" "$2" "$3" 524 480;; - imam) - mix_audio "${mediadir}/imam.mp3" "$2" "$3";; - loop) - i=0 - input="" - while test $i -lt $repeats; do - input="$input -i $2" - i=$((i + 1)) - done - $ffmpeg_common $input \ - -filter_complex "concat=n=${repeats}:v=1:a=1 [v] [a]" -map "[v]" -map "[a]" \ - "$3" </dev/null;; - mow) - mix_audio "${mediadir}/lawn-mower.mp3" "$2" "$3";; - reverse) - $ffmpeg_common -i "$2" \ - -vf reverse -af areverse \ - "$3" </dev/null;; - science) - replace_audio "${mediadir}/accelerating-science.mp3" "$2" "$3";; - scrollify) - mix_audio "${mediadir}/elder_scrolls.mp3" "$2" "$3";; - sendtohell|amsterdamify) - mix_audio_video "${mediadir}/hell.mkv" "$2" "$3" 1920 1080;; - sexify) - mix_audio "${mediadir}/careless_whisper.mp3" "$2" "$3";; - slavify) - replace_audio "${mediadir}/remove-kebab.opus" "$2" "$3";; - slowdown) - $ffmpeg_common -i "$2" \ - -filter_complex "[0:v]setpts=2.0*PTS[v];[0:a]atempo=0.5[a]" -map "[v]" -map "[a]" \ - "$3" </dev/null;; - smith) - replace_face "${mediadir}/smith.png" "$2" "$3";; - speedup) - $ffmpeg_common -i "$2" \ - -filter_complex "[0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a]" -map "[v]" -map "[a]" \ - "$3" </dev/null;; - techno) - replace_audio "${mediadir}/techno.mp3" "$2" "$3";; - technodrugs) - $ffmpeg_common -i "${mediadir}/techno.mp3" -i "$2" \ - -filter:v "tmix=frames=9:weights='0.2 0.4 0.6 0.8 1 0.8 0.6 0.4 0.2'" \ - -map 1:v:0 -map 0:a:0 -shortest \ - "$3" </dev/null;; - thin) - $ffmpeg_common -i "$2" \ - -vf "scale=iw/4:ih,setsar=1" \ - "$3" </dev/null;; - torture) - side_by_side "${mediadir}/clockworkorange.mkv" "$2" "$3";; - trumpapprove) - mix_audio "${mediadir}/trump-approves.opus" "$2" "$3";; - wat) - replace_face "${mediadir}/wat.png" "$2" "$3";; - wide|widen) - $ffmpeg_common -i "$2" \ - -vf "scale=iw*4:ih,crop=iw/4:ih:iw/4:ih,setsar=1" \ - "$3" </dev/null;; - ww1) - mix_audio "${mediadir}/ww1.mp3" "$2" "$3";; - yellow) - mix_audio "${mediadir}/yellow.opus" "$2" "$3";; - zucc) - replace_face "${mediadir}/zucc.png" "$2" "$3";; - *) usage;; + amplify) + $ffmpeg_common -i "$2" -filter:a "volume=10" "$3";; + banjo) + replace_audio "${mediadir}/banjo.mp3" "$2" "$3";; + bounce) + $ffmpeg_common -i "$2" \ + -filter_complex "[0]reverse[r];[0][r]concat,loop=${repeats}:250,setpts=N/25/TB" -an \ + "$3" </dev/null;; + celtify) + mix_audio "${mediadir}/broceliande.ogg" "$2" "$3";; + concatenate) + mix_audio "${mediadir}/concatenate.mp3" "$2" "$3";; + daybowbow) + replace_audio "${mediadir}/day-bow-bow.ogg" "$2" "$3";; + dontdoit) + mix_audio "${mediadir}/dontdoit.mp3" "$2" "$3";; + doomify) + mix_audio "${mediadir}/doom.mp3" "$2" "$3";; + dutchapprove) + mix_audio_video "${mediadir}/krul.mkv" "$2" "$3" 524 480;; + imam) + mix_audio "${mediadir}/imam.mp3" "$2" "$3";; + loop) + i=0 + input="" + while test $i -lt $repeats; do + input="$input -i $2" + i=$((i + 1)) + done + $ffmpeg_common $input \ + -filter_complex "concat=n=${repeats}:v=1:a=1 [v] [a]" -map "[v]" -map "[a]" \ + "$3" </dev/null;; + mow) + mix_audio "${mediadir}/lawn-mower.mp3" "$2" "$3";; + reverse) + $ffmpeg_common -i "$2" \ + -vf reverse -af areverse \ + "$3" </dev/null;; + science) + replace_audio "${mediadir}/accelerating-science.mp3" "$2" "$3";; + scrollify) + mix_audio "${mediadir}/elder_scrolls.mp3" "$2" "$3";; + sendtohell|amsterdamify) + mix_audio_video "${mediadir}/hell.mkv" "$2" "$3" 1920 1080;; + sexify) + mix_audio "${mediadir}/careless_whisper.mp3" "$2" "$3";; + slavify) + replace_audio "${mediadir}/remove-kebab.opus" "$2" "$3";; + slowdown) + $ffmpeg_common -i "$2" \ + -filter_complex "[0:v]setpts=2.0*PTS[v];[0:a]atempo=0.5[a]" -map "[v]" -map "[a]" \ + "$3" </dev/null;; + speedup) + $ffmpeg_common -i "$2" \ + -filter_complex "[0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a]" -map "[v]" -map "[a]" \ + "$3" </dev/null;; + techno) + replace_audio "${mediadir}/techno.mp3" "$2" "$3";; + technodrugs) + $ffmpeg_common -i "${mediadir}/techno.mp3" -i "$2" \ + -filter:v "tmix=frames=9:weights='0.2 0.4 0.6 0.8 1 0.8 0.6 0.4 0.2'" \ + -map 1:v:0 -map 0:a:0 -shortest \ + "$3" </dev/null;; + thin) + $ffmpeg_common -i "$2" \ + -vf "scale=iw/4:ih,setsar=1" \ + "$3" </dev/null;; + torture) + side_by_side "${mediadir}/clockworkorange.mkv" "$2" "$3";; + trumpapprove) + mix_audio "${mediadir}/trump-approves.opus" "$2" "$3";; + wide|widen) + $ffmpeg_common -i "$2" \ + -vf "scale=iw*4:ih,crop=iw/4:ih:iw/4:ih,setsar=1" \ + "$3" </dev/null;; + ww1) + mix_audio "${mediadir}/ww1.mp3" "$2" "$3";; + yellow) + mix_audio "${mediadir}/yellow.opus" "$2" "$3";; + *) usage;; esac }