summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--krebs/3modules/realwallpaper.nix185
-rw-r--r--krebs/5pkgs/simple/realwallpaper/default.nix185
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 "$@"
+''