diff --git a/policy.xml b/policy.xml deleted file mode 100644 index 25f583c..0000000 --- a/policy.xml +++ /dev/null @@ -1,74 +0,0 @@ - - - - - - - - -]> - - - - - - - - - - - - - - - diff --git a/th.sh b/th.sh deleted file mode 100644 index 1044e15..0000000 --- a/th.sh +++ /dev/null @@ -1,72 +0,0 @@ -#!/bin/bash -# -# -# Dependencies/Requirements: -# 1. ffmpeg -# 2. ImageMagick with modified policy.xml (avaliable on this git) -# -# Usage: -# . th.sh COLUMNS ROWS SIZE INPUT -# -# COLUMNS means number of columns; -# ROWS means nubler of rows; -# SIZE is the length of the longer side of the output, e.g., 1920 if you want -# to get an 1920*1080 output image; -# INPUT is the path to the input file; -# -# Example: -# . th.sh 3 14 1920 video.mp4 -if [[ $# != 4 ]]; then - echo "wrong number of arguments - -Usage: -. th.sh COLUMNS ROWS SIZE INPUT -COLUMNS means number of columns;TILE is in the form 'MxN' (where M * N should match NFRAMES), e.g., 4x4; -ROWS means nubler of rows; -SIZE is the length of the longer side of the output, e.g., 1920 if you want -to get an 1920*1080 output image; -INPUT is the path to the input file; -OUTPUT is the path to the output file (make sure intermediate directories -exist). - -Example: -. th.sh 3 14 1920 video.mp4 -" - return 1 -fi -NFRAMES=$(echo "scale=0;$1*$2" | bc) -TILE=$(echo "$1x$2") -SIZE=$3 -INPUT=$4 -DURX=$(ffmpeg -i "$4" 2>&1 | grep Duration | awk '{print $2}' | tr -d ,) -DURATION=$(ffmpeg -i "$4" 2>&1 | grep "Duration"| cut -d ' ' -f 4 | sed s/,// | sed 's@\..*@@g' | awk '{ split($1, A, ":"); split(A[3], B, "."); print 3600*A[1] + 60*A[2] + B[1] }') -RES=$(ffmpeg -i "$4" 2>&1 | grep -oP 'Stream .*, \K[0-9]+x[0-9]+') -FILESIZE=$(du -sm "$4" | awk '{print $1}') -TMPDIR=/tmp/thumbnails-${RANDOM}/ -mkdir $TMPDIR -for (( VARIABLE=0; VARIABLE>${TMPDIR}myfile.txt -echo $RES >>${TMPDIR}myfile.txt -echo "$FILESIZE Mb" >>${TMPDIR}myfile.txt -echo $DURX >>${TMPDIR}myfile.txt -convert -size ${SIZE}x150 -fill black -interline-spacing 10 -background white -pointsize 20 -gravity west caption:@${TMPDIR}myfile.txt ${TMPDIR}text1.jpg -convert ${TMPDIR}output.jpg -resize ${SIZE}x${SIZE} ${TMPDIR}th.jpg -thewidth=$(identify -ping -format %w ${TMPDIR}th.jpg) -convert ${TMPDIR}text1.jpg -crop ${thewidth}x150+0+0 ${TMPDIR}text.jpg -montage ${TMPDIR}text.jpg ${TMPDIR}th.jpg -background white -geometry +0+0 -tile 1x2 thumbnails-${RANDOM}.jpg diff --git a/thumbgen.sh b/thumbgen.sh index 1a4252d..39f7c06 100644 --- a/thumbgen.sh +++ b/thumbgen.sh @@ -1,52 +1,38 @@ #!/bin/bash -# -# -# Dependencies/Requirements: -# 1. ffmpeg -# ImageMagick dependence is REMOVED -# -# Usage: -# . th.sh COLUMNS ROWS SIZE INPUT -# -# COLUMNS means number of columns; -# ROWS means nubler of rows; -# SIZE is the length of the longer side of the output, e.g., 1920 if you want -# to get an 1920*1080 output image; -# INPUT is the path to the input file; -# -# Example: -# . th.sh 3 14 1920 video.mp4 -if [[ $# != 4 ]]; then - echo "wrong number of arguments -Usage: -. th.sh COLUMNS ROWS SIZE INPUT -COLUMNS means number of columns;TILE is in the form 'MxN' (where M * N should match NFRAMES), e.g., 4x4; -ROWS means nubler of rows; -SIZE is the length of the longer side of the output, e.g., 1920 if you want -to get an 1920*1080 output image; -INPUT is the path to the input file; -OUTPUT is the path to the output file (make sure intermediate directories -exist). - -Example: -. th.sh 3 14 1920 video.mp4 -" - return 1 +if [ -z "$1" ]; then + echo "usage: ./thumbgen.sh INPUT [COLUMNS=5] [ROWS=5] [SIZE=1600]" + exit fi -NFRAMES=$(echo "scale=0;$1*$2" | bc) -TILE=$(echo "$1x$2") -SIZE=$3 -INPUT=$4 -DURX=$(ffmpeg -i "$4" 2>&1 | grep Duration | awk '{print $2}' | tr -d ,) -DURATION=$(ffmpeg -i "$4" 2>&1 | grep "Duration"| cut -d ' ' -f 4 | sed s/,// | sed 's@\..*@@g' | awk '{ split($1, A, ":"); split(A[3], B, "."); print 3600*A[1] + 60*A[2] + B[1] }') -RES=$(ffmpeg -i "$4" 2>&1 | grep -oP 'Stream .*, \K[0-9]+x[0-9]+') -FILESIZE=$(du -sm "$4" | awk '{print $1}') -TMPDIR=/tmp/thumbnails-${RANDOM}/ + +# Define variables +INPUT=$1 +COLUMNS=$2 +if [ -z "$COLUMNS" ]; then + COLUMNS=5 +fi +ROWS=$3 +if [ -z "$ROWS" ]; then + ROWS=5 +fi +SIZE=$4 +if [ -z "$SIZE" ]; then + SIZE=1600 +fi +NFRAMES=$(echo "scale=0;$COLUMNS*$ROWS" | bc) +DURX=$(ffmpeg -i "$INPUT" 2>&1 | grep Duration | awk '{print $2}' | tr -d ,) +DURATION=$(ffmpeg -i "$INPUT" 2>&1 | grep "Duration"| cut -d ' ' -f 4 | sed s/,// | sed 's@\..*@@g' | awk '{ split($1, A, ":"); split(A[3], B, "."); print 3600*A[1] + 60*A[2] + B[1] }') +RES=$(ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of csv=s=x:p=0 "$INPUT") +FILESIZE=$(du -sm "$INPUT" | awk '{print $1}') +FONT="/System/Library/Fonts/Supplemental/PTMono.ttc" +METADATA_PX=90 +TMPDIR="/tmp/thumbnails-${RANDOM}/" mkdir $TMPDIR + for (( VARIABLE=0; VARIABLE>${TMPDIR}myfile.txt -echo " $RES" >>${TMPDIR}myfile.txt -echo " $FILESIZE Mb" >>${TMPDIR}myfile.txt -echo " $DURX" >>${TMPDIR}myfile.txt -thewidth=$(ffmpeg -i ${TMPDIR}output.jpg 2>&1 |grep Video|awk '{ split( $8, pieces, /[x,]/ ) ; print pieces[1] }') -theheight=$(ffmpeg -i ${TMPDIR}output.jpg 2>&1 |grep Video|awk '{ split( $8, pieces, /[x,]/ ) ; print pieces[2] }') -theheight=$(echo "scale=0;$theheight*$SIZE/$thewidth" | bc) -ffmpeg -i ${TMPDIR}output.jpg -vf scale=${SIZE}x${theheight} -vframes 1 ${TMPDIR}th.jpg -theheight=$(echo "$theheight+150" | bc) -ffmpeg -f lavfi -i color=white:${SIZE}x${theheight} -i ${TMPDIR}th.jpg -filter_complex "[0:v][1:v] overlay=0:150,drawtext=fontfile=/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf:fontsize=20:fontcolor=black:x=30:y=20:textfile=${TMPDIR}myfile.txt" -vframes 1 th${RANDOM}.jpg + +# Merge thumbnails into tile image +ffmpeg -pattern_type glob -i "${TMPDIR}*.png" -filter_complex tile=${COLUMNS}x${COLUMNS}:margin=4:padding=4:color=white ${TMPDIR}output.png + +# Output metadata to file +echo "Filename: $INPUT" >>${TMPDIR}metadata.txt +echo "Resolution: $RES" >>${TMPDIR}metadata.txt +echo "Filesize: $FILESIZE Mb" >>${TMPDIR}metadata.txt +echo "Duration: $DURX" >>${TMPDIR}metadata.txt + +# Get dimensions of tile image +thewidth=$(ffmpeg -i ${TMPDIR}output.png 2>&1 |grep Video|awk '{ split( $6, pieces, /[x,]/ ) ; print pieces[1] }') +theheight=$(ffmpeg -i ${TMPDIR}output.png 2>&1 |grep Video|awk '{ split( $6, pieces, /[x,]/ ) ; print pieces[2] }') + +# Redefine height & scale (according to $SIZE) +scaledheight=$(echo "scale=0;$theheight*$SIZE/$thewidth" | bc) +ffmpeg -i ${TMPDIR}output.png -vf scale=${SIZE}x${scaledheight} -vframes 1 ${TMPDIR}th.png + +# Add space to the top of the image +finalheight=$(echo "$scaledheight+$METADATA_PX" | bc) + +# Add Metadata +ffmpeg -f lavfi -i color=black:${SIZE}x${finalheight} -i ${TMPDIR}th.png \ +-filter_complex "[0:v][1:v] overlay=0:$METADATA_PX,drawtext=fontfile=$FONT:fontsize=20:fontcolor=white:x=10:y=10:textfile=${TMPDIR}metadata.txt" \ +-vframes 1 th${RANDOM}.png diff --git a/thumbnails-5455.jpg b/thumbnails-5455.jpg deleted file mode 100644 index 80e9d93..0000000 Binary files a/thumbnails-5455.jpg and /dev/null differ