123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209 |
- #!/bin/bash
- #
- # (C) 2013 Lauri Kasanen, under the GPLv3
- # (C) 2014-2015 Odd0002, under the GPLv3
- #
- # Script to optimize the data, currently PNG, JPEG, B3DZ.
- # experimental B3D to B3DZ compression added, not enabled by default
- # Run it before making a release, and after adding new data.
- #Takes 30+ minutes, depending on your cpu or compression options.
- # Spaces in filenames are supported.
- #define number of threads
- threads=$(nproc)
- # Start checks
- #if you do not want to use a program, set the variable for it to false here
- jpegtran=true
- advdef=true
- advzip=true
- optipng=true
- convert=true
- #WARNING! SETTING TO TRUE MAY POSSIBLY INCREASE LOAD TIMES ON A SLOW CPU (UNTESTED) OR LEAD TO FILE NOT FOUND ERRORS WHEN RUNNING SUPERTUXKART!
- compress_b3d=false
- #---------------------------------------------------------
- # Begin main code
- #Check for reqired programs; if a program is not available, disable it or quit the program
- #TODO: make awk optional
- if [ ! $(which awk) ]
- then
- echo "Please install awk. It is required by this program. \nQuitting..."
- exit 1
- fi
- #check for jpegtran
- if [ ! $(which jpegtran) ]
- then
- echo "jpegtran not installed, therefore it will not be used. It is included in the package \"libjpeg-progs\"."; jpegtran=false
- sleep 2
- fi
- #check for advdef
- if [ ! $(which advdef) ]
- then
- echo "advdef is not installed, therefore it will not be used. It is included in the package \"advancecomp\"."; advdef=false
- sleep 2
- fi
- #check for advzip
- if [ ! $(which advzip) ]
- then
- echo "advzip is not installed, therefore it will not be used. It is included in the package \"advancecomp\"."; advzip=false
- sleep 2
- fi
- #check for convert
- if [ ! $(which convert) ]
- then
- echo "convert is not installed, therefore it will not be used."; convert=false
- sleep 2
- fi
- #check for optipng
- if [ ! $(which optipng) ]
- then
- echo "optipng is not installed, therefore it will not be used."; optipng=false
- sleep 2
- fi
- # Defines
- #Internal Field Seperator
- IFS="
- "
- export LANG=C
- # Go
- #store disk usage of files beforehand
- BEFORE=`du -sk | awk '{print $1}'`
- #functions for xargs multithreading, used instead of GNU parallel for cross-compatibility
- #TODO: let next set of optimization scripts run if one set is stuck on a single file at the end to decrease total runtime
- #strip ICC information off PNG's
- strippng () {
- for arg; do
- convert "$arg" -strip "$arg"
- done
- }
- export -f strippng
- #optimize PNG's
- optimpng () {
- for arg; do
- optipng -quiet -o3 "$arg"
- #level 3 = 16 trials, which according to http://optipng.sourceforge.net/pngtech/optipng.html (retrieved October 2014) should be satisfactory for all users
- done
- }
- export -f optimpng
- #compress PNG in-stream data
- comprpng () {
- for arg; do
- advdef -z4 "$arg"
- done
- }
- export -f comprpng
- #optimize and recompress jpeg files (losslessly)
- optimjpg () {
- for arg; do
- jpegtran -optimize -copy none -outfile "$arg".$$ "$arg"
- mv "$arg".$$ "$arg"
- done
- }
- export -f optimjpg
- #recompress b3dz files
- recomprb3dz () {
- for arg; do
- advzip -z4 "$arg"
- done
- }
- export -f recomprb3dz
- #END MULTITHREADING FUNCTIONS
- #strip png icc information
- if [ "$convert" = true ]; then
- find . -path .svn -prune -o -name "*.png" -print0 | xargs -0 -n 1 -P "$threads" bash -c 'strippng "$@"' -- #multithread the png stripping
- else echo "convert not installed. Ignoring commands using convert..."; sleep 1
- fi
- #lossless png image optimization
- if [ "$optipng" = true ]; then
- find . -path .svn -prune -o -name "*.png" -print0 | xargs -0 -n 1 -P "$threads" bash -c 'optimpng "$@"' -- #multithread the png optimization
- else echo "optipng not installed. Ignoring commands using optipng..."; sleep 1
- fi
- #in-stream data/png compression
- if [ "$advdef" = true ]; then
- find . -path .svn -prune -o -name "*.png" -print0 | xargs -0 -n 1 -P "$threads" bash -c 'comprpng "$@"' -- #multithread image compression
- else echo "advdef is not installed. Ignoring commands using advdef..."; sleep 1
- fi
- #lossless jpeg optimization/recompression
- if [ "$jpegtran" = true ]; then
- find . -path .svn -prune -o -name "*.jpg" -print0 | xargs -0 -n 1 -P "$threads" bash -c 'optimjpg "$@"' -- #multithread jpg compression and optimization
- else echo "jpegtran not installed. Ignoring commands using jpegtran..."; sleep 1
- fi
- #b3dz to b3dz compression
- #WARNING: BETA, MAY CAUSE MISSING FILE WARNINGS!
- if [ "$compress_b3d" = true ]; then
- for xmls in $(find . -name "*.xml"); do
- sed 's/b3d/b3dz/g' "$xmls" > "$xmls".$$
- mv "$xmls".$$ "$xmls"
- #echo "$xmls"
- sed 's/b3dzz/b3dz/g' "$xmls" > "$xmls".$$
- mv "$xmls".$$ "$xmls"
- sed 's/b3dzz/b3dz/g' "$xmls" > "$xmls".$$
- mv "$xmls".$$ "$xmls"
- done
- find . -name "*.b3d" -execdir zip '{}.zip' '{}' \;
- for b3dzip in $(find -name "*.b3d.zip"); do
- b3dz="${b3dzip%.zip}"
- #echo "$b3dz"
- mv "$b3dzip" "${b3dz}z"
- done
- find . -type d -name "models" -prune -o -name "*.b3d" -print0 | xargs -0 rm
- else echo "b3d to b3dz compression disabled. Ignoring actions..."; sleep 1
- fi
- #b3dz file stream compression
- if [ "$advzip" = true ]; then
- find . -path .svn -prune -o -name "*.b3dz" -print0 | xargs -0 -n 1 -P "$threads" bash -c 'recomprb3dz "$@"' -- #multithread b3dz recompression
- else echo "advzip not installed. Ignoring commands using advzip..."; sleep 1
- fi
- # Add optimizations for other types if necessary
- # get and store new disk usage info
- AFTER=`du -sk | awk '{print $1}'`
- # Print stats out
- echo $BEFORE $AFTER | awk '{print "Size before: " $1/1024 "mb; Size after: " $2/1024 "mb" }'
- echo $BEFORE $AFTER | awk '{print "Saved " (1-($2/$1)) * 100 "%" }'
|