diff options
-rw-r--r-- | krebs/3modules/realwallpaper.nix | 185 | ||||
-rw-r--r-- | krebs/5pkgs/simple/realwallpaper/default.nix | 185 |
2 files changed, 186 insertions, 184 deletions
diff --git a/krebs/3modules/realwallpaper.nix b/krebs/3modules/realwallpaper.nix index c09bb008d..a83758ccd 100644 --- a/krebs/3modules/realwallpaper.nix +++ b/krebs/3modules/realwallpaper.nix @@ -77,190 +77,7 @@ let serviceConfig = { Type = "simple"; - ExecStart = pkgs.writeDash "generate-wallpaper" '' - set -euf - - # usage: getimg FILENAME URL - fetch() { - echo "fetch $1" - curl -LsS -z "$1" -o "$1" "$2" - } - - # usage: check_type FILENAME TYPE - check_type() { - if ! file -ib "$1" | grep -q "^$2/"; then - echo "$1 is not of type $2" >&2 - rm "$1" - return 1 - fi - } - - # usage: image_size FILENAME - image_size() { - identify "$1" | awk '{print$3}' - } - - # usage: make_mask DST SRC MASK - make_layer() { - if needs_rebuild "$@"; then - echo "make $1 (apply mask)" >&2 - convert "$2" "$3" -alpha off -compose copy_opacity -composite "$1" - fi - } - - # usage: flatten DST HILAYER LOLAYER - flatten() { - if needs_rebuild "$@"; then - echo "make $1 (flatten)" >&2 - composite "$2" "$3" "$1" - fi - } - - # usage: needs_rebuild DST SRC... - needs_rebuild() { - a="$1" - shift - if ! test -e "$a"; then - #echo " $a does not exist" >&2 - result=0 - else - result=1 - for b; do - if test "$b" -nt "$a"; then - #echo " $b is newer than $a" >&2 - result=0 - fi - done - fi - #case $result in - # 0) echo "$a needs rebuild" >&2;; - #esac - return $result - } - - main() { - cd ${cfg.workingDir} - - # fetch source images in parallel - fetch nightmap-raw.jpg \ - ${cfg.nightmap} & - fetch daymap-raw.png \ - ${cfg.daymap} & - fetch clouds-raw.jpg \ - ${cfg.cloudmap} & - fetch marker.json \ - ${cfg.marker} & - wait - - check_type nightmap-raw.jpg image - check_type daymap-raw.png image - check_type clouds-raw.jpg image - - in_size=2048x1024 - xplanet_out_size=1466x1200 - out_geometry=1366x768+100+160 - - nightsnow_color='#0c1a49' # nightmap - - for raw in \ - nightmap-raw.jpg \ - daymap-raw.png \ - clouds-raw.jpg \ - ; - do - normal=''${raw%-raw.*}.png - if needs_rebuild $normal $raw; then - echo "make $normal; normalize $raw" >&2 - convert $raw -scale $in_size $normal - fi - done - - # create nightmap-fullsnow - if needs_rebuild nightmap-fullsnow.png; then - convert -size $in_size xc:$nightsnow_color nightmap-fullsnow.png - fi - - # extract daymap-snowmask from daymap-final - if needs_rebuild daymap-snowmask.png daymap.png; then - convert daymap.png -threshold 95% daymap-snowmask.png - fi - - # extract nightmap-lightmask from nightmap - if needs_rebuild nightmap-lightmask.png nightmap.png; then - convert nightmap.png -threshold 25% nightmap-lightmask.png - fi - - # create layers - make_layer nightmap-snowlayer.png nightmap-fullsnow.png daymap-snowmask.png - make_layer nightmap-lightlayer.png nightmap.png nightmap-lightmask.png - - # apply layers - flatten nightmap-lightsnowlayer.png \ - nightmap-lightlayer.png \ - nightmap-snowlayer.png - - flatten nightmap-final.png \ - nightmap-lightsnowlayer.png \ - nightmap.png - - # create marker file from json - if [ -s marker.json ]; then - jq -r 'to_entries[] | @json "\(.value.latitude) \(.value.longitude)"' marker.json > marker_file - fi - - # make all unmodified files as final - for normal in \ - daymap.png \ - clouds.png \ - ; - do - final=''${normal%.png}-final.png - needs_rebuild $final && - ln $normal $final - done - - # rebuild every time to update shadow - xplanet --num_times 1 --geometry $xplanet_out_size \ - --output xplanet-output.png --projection merc \ - -config ${pkgs.writeText "xplanet.config" '' - [earth] - "Earth" - map=daymap-final.png - night_map=nightmap-final.png - cloud_map=clouds-final.png - cloud_threshold=10 - shade=15 - ''} - - xplanet --num_times 1 --geometry $xplanet_out_size \ - --output xplanet-krebs-output.png --projection merc \ - -config ${pkgs.writeText "xplanet-krebs.config" '' - [earth] - "Earth" - map=daymap-final.png - night_map=nightmap-final.png - cloud_map=clouds-final.png - cloud_threshold=10 - marker_file=marker_file - shade=15 - ''} - - # trim xplanet output - if needs_rebuild realwallpaper.png xplanet-output.png; then - convert xplanet-output.png -crop $out_geometry \ - realwallpaper-tmp.png - mv realwallpaper-tmp.png realwallpaper.png - fi - - if needs_rebuild realwallpaper-krebs.png xplanet-krebs-output.png; then - convert xplanet-krebs-output.png -crop $out_geometry \ - realwallpaper-krebs-tmp.png - mv realwallpaper-krebs-tmp.png realwallpaper-krebs.png - fi - } - - main "$@" - ''; + ExecStart = "${pkgs.realwallpaper}/bin/generate-wallpaper"; User = "realwallpaper"; }; }; diff --git a/krebs/5pkgs/simple/realwallpaper/default.nix b/krebs/5pkgs/simple/realwallpaper/default.nix new file mode 100644 index 000000000..ef83d2e59 --- /dev/null +++ b/krebs/5pkgs/simple/realwallpaper/default.nix @@ -0,0 +1,185 @@ +{ pkgs, ... }: +pkgs.writeDashBin "generate-wallpaper" '' + set -euf + + # usage: getimg FILENAME URL + fetch() { + echo "fetch $1" + curl -LsS -z "$1" -o "$1" "$2" + } + + # usage: check_type FILENAME TYPE + check_type() { + if ! file -ib "$1" | grep -q "^$2/"; then + echo "$1 is not of type $2" >&2 + rm "$1" + return 1 + fi + } + + # usage: image_size FILENAME + image_size() { + identify "$1" | awk '{print$3}' + } + + # usage: make_mask DST SRC MASK + make_layer() { + if needs_rebuild "$@"; then + echo "make $1 (apply mask)" >&2 + convert "$2" "$3" -alpha off -compose copy_opacity -composite "$1" + fi + } + + # usage: flatten DST HILAYER LOLAYER + flatten() { + if needs_rebuild "$@"; then + echo "make $1 (flatten)" >&2 + composite "$2" "$3" "$1" + fi + } + + # usage: needs_rebuild DST SRC... + needs_rebuild() { + a="$1" + shift + if ! test -e "$a"; then + #echo " $a does not exist" >&2 + result=0 + else + result=1 + for b; do + if test "$b" -nt "$a"; then + #echo " $b is newer than $a" >&2 + result=0 + fi + done + fi + #case $result in + # 0) echo "$a needs rebuild" >&2;; + #esac + return $result + } + + main() { + cd "$working_dir" + + # fetch source images in parallel + fetch nightmap-raw.jpg \ + "$nightmap_url" & + fetch daymap-raw.png \ + "$daymap_url" & + fetch clouds-raw.jpg \ + "$cloudmap_url" & + fetch marker.json \ + "$marker_url" & + wait + + check_type nightmap-raw.jpg image + check_type daymap-raw.png image + check_type clouds-raw.jpg image + + in_size=2048x1024 + xplanet_out_size=1466x1200 + out_geometry=1366x768+100+160 + + nightsnow_color='#0c1a49' # nightmap + + for raw in \ + nightmap-raw.jpg \ + daymap-raw.png \ + clouds-raw.jpg \ + ; + do + normal=''${raw%-raw.*}.png + if needs_rebuild $normal $raw; then + echo "make $normal; normalize $raw" >&2 + convert $raw -scale $in_size $normal + fi + done + + # create nightmap-fullsnow + if needs_rebuild nightmap-fullsnow.png; then + convert -size $in_size xc:$nightsnow_color nightmap-fullsnow.png + fi + + # extract daymap-snowmask from daymap-final + if needs_rebuild daymap-snowmask.png daymap.png; then + convert daymap.png -threshold 95% daymap-snowmask.png + fi + + # extract nightmap-lightmask from nightmap + if needs_rebuild nightmap-lightmask.png nightmap.png; then + convert nightmap.png -threshold 25% nightmap-lightmask.png + fi + + # create layers + make_layer nightmap-snowlayer.png nightmap-fullsnow.png daymap-snowmask.png + make_layer nightmap-lightlayer.png nightmap.png nightmap-lightmask.png + + # apply layers + flatten nightmap-lightsnowlayer.png \ + nightmap-lightlayer.png \ + nightmap-snowlayer.png + + flatten nightmap-final.png \ + nightmap-lightsnowlayer.png \ + nightmap.png + + # create marker file from json + if [ -s marker.json ]; then + jq -r 'to_entries[] | @json "\(.value.latitude) \(.value.longitude)"' marker.json > marker_file + fi + + # make all unmodified files as final + for normal in \ + daymap.png \ + clouds.png \ + ; + do + final=''${normal%.png}-final.png + needs_rebuild $final && + ln $normal $final + done + + # rebuild every time to update shadow + xplanet --num_times 1 --geometry $xplanet_out_size \ + --output xplanet-output.png --projection merc \ + -config ${pkgs.writeText "xplanet.config" '' + [earth] + "Earth" + map=daymap-final.png + night_map=nightmap-final.png + cloud_map=clouds-final.png + cloud_threshold=10 + shade=15 + ''} + + xplanet --num_times 1 --geometry $xplanet_out_size \ + --output xplanet-krebs-output.png --projection merc \ + -config ${pkgs.writeText "xplanet-krebs.config" '' + [earth] + "Earth" + map=daymap-final.png + night_map=nightmap-final.png + cloud_map=clouds-final.png + cloud_threshold=10 + marker_file=marker_file + shade=15 + ''} + + # trim xplanet output + if needs_rebuild realwallpaper.png xplanet-output.png; then + convert xplanet-output.png -crop $out_geometry \ + realwallpaper-tmp.png + mv realwallpaper-tmp.png realwallpaper.png + fi + + if needs_rebuild realwallpaper-krebs.png xplanet-krebs-output.png; then + convert xplanet-krebs-output.png -crop $out_geometry \ + realwallpaper-krebs-tmp.png + mv realwallpaper-krebs-tmp.png realwallpaper-krebs.png + fi + } + + main "$@" +'' |