This will convert all webp in a directory to jpg or mp4 if animated. It will utilize all cores with gnu parallel. It will also handle an error with ffmpeg that happens if animated webp pixel width or height is an odd number by padding 1 pixel if necessary

cat convertwebp

#!/usr/bin/env bash
# Convert webp to jpg if static or gif/mp4 if animated
# Pads animated webp to avoid "libx264 not divisible by 2 error"
# Deps imagemagick libwebp parallel

# Usage assuming saved as convertwebp
# convertwebp             # Will convert all webp in current dir to jpeg or mp4 and gif if animated
# convertwebp /some/dir/  # Same but on specified dir
# convertwebp /some/file  # Same but on specified file

######### Set jpg quality. There will be 2 outputs one of each quality setting
#          0-100 percent
export     QUALITY_ONE=35
export     QUALITY_TWO=75

find_args=(-maxdepth 1 -type f -regextype posix-extended -iregex '.*\.(webp)$' -print0)

dir="$PWD"
if [[ -d "$@" ]]; then
    dir="$@"
    echo "Dir $@"
else
    if [[ -f "$@" ]]; then
        dir="$@"
        echo "File $@"
    fi
fi

mkdir -p "$MY_DWEBP_OUTDIR"

find "$dir" "${find_args[@]}" | parallel -0 -j+0 --eta --bar '
jpg_out_quality_one=$(echo {/.}_"$QUALITY_ONE"_percent.jpg)
jpg_out_quality_two=$(echo {/.}_"$QUALITY_TWO"_percent.jpg)
png_out=$(echo {/.}.ffmpeg.png)
gif_out=$(echo {/.}.gif)
mp4_out=$(echo {/.}.mp4)
isanimated="$(webpmux -info {} | grep animation)"
if [[ "$isanimated" == "Features present: animation transparency" ]]; then
    convert '{}' "$gif_out"
    # Begin mp4 conversion handler to pad geometry 1 pixel to x and y if either are odd to avoid "libx264 not divisible by 2 error"
    geometry_x=$(webpmux -info '{}' | head -n 1 | tr "[:space:]" "\n" | tail -3 | head -n 1)
    geometry_y=$(webpmux -info '{}' | head -n 1 | tr "[:space:]" "\n" | tail -3 | tail -1)
    if [ $(( $geometry_x  % 2)) -ne 0 ] | [ $(( $geometry_y  % 2)) -ne 0 ]; then
        if [ $(( $geometry_x  % 2)) -ne 0 ] && [ $(( $geometry_y  % 2)) -ne 0 ]; then
            splice_geometry="1x1"
            gravity_direction="northeast"
            convert -splice $splice_geometry -gravity $gravity_direction '{}' "$mp4_out"
        else 
            if [ $(( $geometry_x  % 2)) -ne 0 ]; then
                splice_geometry="1x0"
                gravity_direction="east"
                convert -splice $splice_geometry -gravity $gravity_direction '{}' "$mp4_out"
            else
                if [ $(( $geometry_y  % 2)) -ne 0 ]; then
                    splice_geometry="0x1"
                    gravity_direction="north"
                    convert -splice $splice_geometry -gravity $gravity_direction '{}' "$mp4_out"
                fi
            fi
        fi
    else
        convert '{}' "$mp4_out"
    fi
    # End mp4 conversion handler to pad geometry 1 pixel to x and y if either are odd to avoid "libx264 not divisible by 2 error"
    else
        dwebp '{}' -o - | convert - -quality $QUALITY_ONE% "$jpg_out_quality_one"    # pipe to convert for filesize reduction
        dwebp '{}' -o - | convert - -quality $QUALITY_TWO% "$jpg_out_quality_two"    # pipe to convert for filesize reduction
fi
'
unset QUALITY_ONE
unset QUALITY_TWO
No comments yet!

Bash

!bash@lemmy.ml

Create post

Talk about the Bash Shell and Bash scripting

Community stats

  • 11

    Monthly active users

  • 31

    Posts

  • 26

    Comments

Community moderators