183 lines
5.8 KiB
Nix
183 lines
5.8 KiB
Nix
{
|
|
config,
|
|
lib,
|
|
pkgs,
|
|
namespace,
|
|
...
|
|
}:
|
|
let
|
|
cfg = config.${namespace}.desktop.hyprland;
|
|
|
|
# The script to use based on the selected wallpaper source
|
|
wallpaper-command = if cfg.wallpaperSource == "nasa" then "nasa-wallpaper" else "bing-wallpaper";
|
|
|
|
# System activation script to ensure wallpaper is available early in boot
|
|
wallpaper-activation-script = ''
|
|
# Create wallpaper directory if it doesn't exist
|
|
mkdir -p ${cfg.wallpaperDir}
|
|
|
|
# Copy default wallpaper as fallback if it doesn't exist
|
|
if [ ! -f ${cfg.wallpaperDir}/fallback.jpg ]; then
|
|
cp ${cfg.defaultWallpaper} ${cfg.wallpaperDir}/fallback.jpg
|
|
fi
|
|
|
|
# If no current wallpaper exists, use the fallback
|
|
if [ ! -f ${cfg.wallpaperDir}/current.jpg ]; then
|
|
cp ${cfg.wallpaperDir}/fallback.jpg ${cfg.wallpaperDir}/current.jpg
|
|
fi
|
|
|
|
# Create symlink for Plymouth and SDDM
|
|
ln -sf ${cfg.wallpaperDir}/current.jpg /run/wallpaper.jpg
|
|
'';
|
|
|
|
bing-wallpaper = pkgs.writeScriptBin "bing-wallpaper" ''
|
|
# Directory to store wallpapers
|
|
WALLPAPER_DIR="${cfg.wallpaperDir}"
|
|
IMG_PATH="$WALLPAPER_DIR/current.jpg"
|
|
FALLBACK_PATH="$WALLPAPER_DIR/fallback.jpg"
|
|
|
|
# Ensure directory exists
|
|
mkdir -p "$WALLPAPER_DIR"
|
|
|
|
# Copy to the standard location for other services
|
|
ln -sf "$IMG_PATH" /run/wallpaper.jpg
|
|
|
|
# Try to download new wallpaper
|
|
if ${lib.getExe pkgs.curl} -s --connect-timeout 5 --max-time 10 "https://www.bing.com" > /dev/null; then
|
|
URL=$(${lib.getExe pkgs.curl} -s "https://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1" | \
|
|
${lib.getExe pkgs.jq} -r '.images[0].url')
|
|
FULL_URL="https://www.bing.com$URL"
|
|
if ${lib.getExe pkgs.curl} -s -o "$IMG_PATH.tmp" "$FULL_URL"; then
|
|
mv "$IMG_PATH.tmp" "$IMG_PATH"
|
|
echo "Downloaded $FULL_URL to $IMG_PATH successfully"
|
|
else
|
|
echo "Failed to download Bing wallpaper, using previous or fallback"
|
|
# If current doesn't exist, use fallback
|
|
if [ ! -f "$IMG_PATH" ] && [ -f "$FALLBACK_PATH" ]; then
|
|
cp "$FALLBACK_PATH" "$IMG_PATH"
|
|
fi
|
|
fi
|
|
else
|
|
echo "Network unavailable, using previous or fallback wallpaper"
|
|
# If current doesn't exist, use fallback
|
|
if [ ! -f "$IMG_PATH" ] && [ -f "$FALLBACK_PATH" ]; then
|
|
cp "$FALLBACK_PATH" "$IMG_PATH"
|
|
fi
|
|
fi
|
|
'';
|
|
|
|
nasa-wallpaper = pkgs.writeScriptBin "nasa-wallpaper" ''
|
|
# Directory to store wallpapers
|
|
WALLPAPER_DIR="${cfg.wallpaperDir}"
|
|
IMG_PATH="$WALLPAPER_DIR/current.jpg"
|
|
FALLBACK_PATH="$WALLPAPER_DIR/fallback.jpg"
|
|
|
|
# Ensure directory exists
|
|
mkdir -p "$WALLPAPER_DIR"
|
|
|
|
# Copy to the standard location for other services
|
|
ln -sf "$IMG_PATH" /run/wallpaper.jpg
|
|
|
|
# Try to download new wallpaper
|
|
if ${lib.getExe pkgs.curl} -s --connect-timeout 5 --max-time 10 "https://api.nasa.gov" > /dev/null; then
|
|
APOD_URL="https://api.nasa.gov/planetary/apod?api_key=DEMO_KEY"
|
|
IMAGE_URL=$(${lib.getExe pkgs.curl} -s "$APOD_URL" | ${lib.getExe pkgs.jq} -r '.hdurl // .url')
|
|
if ${lib.getExe pkgs.curl} -s -o "$IMG_PATH.tmp" "$IMAGE_URL"; then
|
|
mv "$IMG_PATH.tmp" "$IMG_PATH"
|
|
echo "Downloaded $IMAGE_URL to $IMG_PATH successfully"
|
|
else
|
|
echo "Failed to download NASA wallpaper, using previous or fallback"
|
|
# If current doesn't exist, use fallback
|
|
if [ ! -f "$IMG_PATH" ] && [ -f "$FALLBACK_PATH" ]; then
|
|
cp "$FALLBACK_PATH" "$IMG_PATH"
|
|
fi
|
|
fi
|
|
else
|
|
echo "Network unavailable, using previous or fallback wallpaper"
|
|
# If current doesn't exist, use fallback
|
|
if [ ! -f "$IMG_PATH" ] && [ -f "$FALLBACK_PATH" ]; then
|
|
cp "$FALLBACK_PATH" "$IMG_PATH"
|
|
fi
|
|
fi
|
|
'';
|
|
in
|
|
{
|
|
imports = [ ../options.nix ];
|
|
|
|
config = lib.mkIf cfg.enable {
|
|
environment.systemPackages = [
|
|
bing-wallpaper
|
|
nasa-wallpaper
|
|
];
|
|
|
|
# Add system activation script to ensure wallpaper is available early
|
|
system.activationScripts.wallpaper = wallpaper-activation-script;
|
|
|
|
systemd = {
|
|
services = {
|
|
preload-wallpaper = {
|
|
enable = true;
|
|
wants = [ "network-online.target" ];
|
|
after = [ "network-online.target" ];
|
|
before = [ "display-manager.service" ];
|
|
requiredBy = [
|
|
"plymouth-quit-wait.service"
|
|
"display-manager.service"
|
|
];
|
|
wantedBy = [ "display-manager.service" ];
|
|
path = [
|
|
pkgs.bash
|
|
pkgs.jq
|
|
pkgs.curl
|
|
bing-wallpaper
|
|
nasa-wallpaper
|
|
];
|
|
script = ''
|
|
${wallpaper-command}
|
|
'';
|
|
serviceConfig = {
|
|
Type = "oneshot";
|
|
TimeoutSec = "10s"; # Limit how long we wait for network
|
|
};
|
|
};
|
|
};
|
|
user = {
|
|
services = {
|
|
reload-wallpaper = {
|
|
enable = true;
|
|
path = [
|
|
pkgs.bash
|
|
pkgs.jq
|
|
pkgs.curl
|
|
pkgs.hyprland
|
|
bing-wallpaper
|
|
nasa-wallpaper
|
|
];
|
|
script = ''
|
|
${wallpaper-command}
|
|
${lib.getExe' pkgs.hyprland "hyprctl"} hyprpaper reload ,${cfg.wallpaper}
|
|
'';
|
|
serviceConfig = {
|
|
Type = "oneshot";
|
|
};
|
|
};
|
|
};
|
|
# Create a timer to run the service periodically
|
|
timers = {
|
|
reload-wallpaper = {
|
|
description = "Timer for reload-wallpaper";
|
|
wantedBy = [ "timers.target" ];
|
|
|
|
# Timer configuration
|
|
timerConfig = {
|
|
OnCalendar = "daily"; # Check every day
|
|
Persistent = true; # Run immediately if last run was missed
|
|
Unit = "reload-wallpaper.service";
|
|
};
|
|
};
|
|
};
|
|
};
|
|
};
|
|
};
|
|
}
|