111 lines
3.4 KiB
Nix
111 lines
3.4 KiB
Nix
|
{pkgs, ...}:
|
||
|
with pkgs; {
|
||
|
boot.binfmt.registrations.appimage = {
|
||
|
wrapInterpreterInShell = false;
|
||
|
interpreter = "${appimage-run}/bin/appimage-run";
|
||
|
recognitionType = "magic";
|
||
|
offset = 0;
|
||
|
mask = ''\xff\xff\xff\xff\x00\x00\x00\x00\xff\xff\xff'';
|
||
|
magicOrExtension = ''\x7fELF....AI\x02'';
|
||
|
};
|
||
|
|
||
|
systemd.user.services.appimage-menu-updater = let
|
||
|
appimage-menu-update = writeShellScript "appimage-menu-updater.sh" ''
|
||
|
shopt -s nullglob
|
||
|
|
||
|
remove_old_files () {
|
||
|
for path in "$HOME"/.local/share/applications/appimage-menu-updater*; do
|
||
|
rm "$path"
|
||
|
done
|
||
|
for path in "$HOME"/.local/share/icons/hicolor/appimage-menu-updater*; do
|
||
|
rm "$path"
|
||
|
done
|
||
|
}
|
||
|
|
||
|
update_each () {
|
||
|
path="$1"
|
||
|
file="$2"
|
||
|
|
||
|
echo "found $file"
|
||
|
|
||
|
desktop_source=$(${p7zip.outPath}/bin/7z l -ba -slt "$path" | grep '\.desktop$' | head -n1 | sed --expression 's/Path = //')
|
||
|
desktop_target="$HOME/.local/share/applications/appimage-menu-updater-$file.desktop"
|
||
|
${p7zip.outPath}/bin/7z e "$path" "$desktop_source" -y -so > "$desktop_target"
|
||
|
sed -i "s@Exec=.*@Exec=${appimage-run.outPath}/bin/appimage-run $path@" "$desktop_target"
|
||
|
|
||
|
update_icon "$path" "$desktop_target"
|
||
|
}
|
||
|
|
||
|
update_icon () {
|
||
|
path="$1"
|
||
|
desktop_target="$2"
|
||
|
|
||
|
echo "updating icon"
|
||
|
|
||
|
icon_link_proto_source=$(grep Icon= "$desktop_target" | head -n1 | sed 's/Icon=//')
|
||
|
icon_link_source=$(${p7zip.outPath}/bin/7z l -ba -slt "$path" | grep -e "Path = $icon_link_proto_source.\(png\|svg\)" | head -n1 | sed 's/Path = //')
|
||
|
if [[ "$icon_link_source" ]]; then
|
||
|
tempdir=$(mktemp -d)
|
||
|
${p7zip.outPath}/bin/7z x "$path" "$icon_link_source" -o"$tempdir" >/dev/null
|
||
|
|
||
|
icon_temp_maybe_link=$(find "$tempdir"/* | head -n1)
|
||
|
if [[ -L "$icon_temp_maybe_link" ]]; then
|
||
|
icon_source=$(readlink "$icon_temp_maybe_link")
|
||
|
|
||
|
if [[ "$icon_source" ]]; then
|
||
|
${p7zip.outPath}/bin/7z x "$path" "$icon_source" -y -o"$tempdir"
|
||
|
if [[ -f "$tempdir/$icon_source" ]]; then
|
||
|
icon_temp_source=$tempdir/$icon_source
|
||
|
else
|
||
|
echo 'icon link target does not exists'
|
||
|
fi
|
||
|
else
|
||
|
echo 'icon link is invalid'
|
||
|
fi
|
||
|
|
||
|
else
|
||
|
icon_temp_source=$icon_temp_maybe_link
|
||
|
fi
|
||
|
|
||
|
if [[ "$icon_temp_source" ]]; then
|
||
|
icon_target="$HOME/.local/share/icons/hicolor/appimage-menu-updater-"$(basename "$icon_temp_source")
|
||
|
mv "$icon_temp_source" "$icon_target"
|
||
|
sed -i "s@Icon=.*@Icon=$icon_target@" "$desktop_target"
|
||
|
fi
|
||
|
|
||
|
rm -Rf "$tempdir"
|
||
|
else
|
||
|
echo 'icon file not found'
|
||
|
fi
|
||
|
}
|
||
|
|
||
|
update () {
|
||
|
echo 'updating...'
|
||
|
|
||
|
remove_old_files
|
||
|
|
||
|
for path in "$HOME"/Applications/*.AppImage; do
|
||
|
update_each "$path" $(basename "$path")
|
||
|
done
|
||
|
}
|
||
|
|
||
|
mkdir -p "$HOME/Applications"
|
||
|
|
||
|
update
|
||
|
while ${inotify-tools.outPath}/bin/inotifywait -e modify,delete,moved_to,moved_from "$HOME"/Applications; do
|
||
|
update
|
||
|
done
|
||
|
'';
|
||
|
in {
|
||
|
enable = true;
|
||
|
description = "AppImage Menu Updater";
|
||
|
unitConfig = {
|
||
|
Type = "simple";
|
||
|
};
|
||
|
serviceConfig = {
|
||
|
ExecStart = "/bin/sh -c 'HOME=%h ${appimage-menu-update}'";
|
||
|
};
|
||
|
wantedBy = ["default.target"];
|
||
|
};
|
||
|
}
|