diff --git a/resources/js/admin/i18n/locales/de/management.json b/resources/js/admin/i18n/locales/de/management.json
index 758e79a..f58126c 100644
--- a/resources/js/admin/i18n/locales/de/management.json
+++ b/resources/js/admin/i18n/locales/de/management.json
@@ -1205,6 +1205,13 @@
"uploader": {
"hint": "POST mit Mediendatei oder base64-Feld \"media\"; die App nutzt diese Zugangsdaten."
},
+ "uploaderDownload": {
+ "title": "Fotospiel Uploader App",
+ "description": "Die Fotospiel Uploader App wird benötigt, damit Uploads stabil laufen, die Zugangsdaten geschützt bleiben und keine Dateien verloren gehen.",
+ "actionWindows": "Uploader herunterladen (Windows)",
+ "actionMac": "Uploader herunterladen (macOS)",
+ "actionLinux": "Uploader herunterladen (Linux)"
+ },
"actions": {
"enable": "Photobooth aktivieren",
"disable": "Deaktivieren",
diff --git a/resources/js/admin/i18n/locales/en/management.json b/resources/js/admin/i18n/locales/en/management.json
index c1edce6..dcd18b5 100644
--- a/resources/js/admin/i18n/locales/en/management.json
+++ b/resources/js/admin/i18n/locales/en/management.json
@@ -918,6 +918,13 @@
"uploader": {
"hint": "POST with media file or base64 \"media\" field; app uses these credentials."
},
+ "uploaderDownload": {
+ "title": "Fotospiel Uploader App",
+ "description": "The Fotospiel Uploader App is required so uploads stay stable, credentials remain protected, and no files are lost.",
+ "actionWindows": "Download uploader (Windows)",
+ "actionMac": "Download uploader (macOS)",
+ "actionLinux": "Download uploader (Linux)"
+ },
"actions": {
"enable": "Activate photobooth",
"disable": "Disable",
diff --git a/resources/js/admin/mobile/EventPhotoboothPage.tsx b/resources/js/admin/mobile/EventPhotoboothPage.tsx
index 5283db5..8987ee5 100644
--- a/resources/js/admin/mobile/EventPhotoboothPage.tsx
+++ b/resources/js/admin/mobile/EventPhotoboothPage.tsx
@@ -250,6 +250,41 @@ export default function MobileEventPhotoboothPage() {
+
+
+ {t('photobooth.uploaderDownload.title', 'Fotospiel Uploader App')}
+
+
+ {t(
+ 'photobooth.uploaderDownload.description',
+ 'Die Fotospiel Uploader App ist verpflichtend, damit Uploads stabil laufen, die Zugangsdaten geschützt bleiben und keine Dateien verloren gehen.'
+ )}
+
+ {
+ const url = new URL('/downloads/PhotoboothUploader-win-x64.exe', window.location.origin).toString();
+ window.open(url, '_blank', 'noopener,noreferrer');
+ }}
+ />
+ {
+ const url = new URL('/downloads/PhotoboothUploader-macos-x64', window.location.origin).toString();
+ window.open(url, '_blank', 'noopener,noreferrer');
+ }}
+ />
+ {
+ const url = new URL('/downloads/PhotoboothUploader-linux-x64', window.location.origin).toString();
+ window.open(url, '_blank', 'noopener,noreferrer');
+ }}
+ />
+
+
diff --git a/scripts/build-photobooth-uploader.sh b/scripts/build-photobooth-uploader.sh
index af595dc..e413e7b 100644
--- a/scripts/build-photobooth-uploader.sh
+++ b/scripts/build-photobooth-uploader.sh
@@ -4,7 +4,9 @@ set -euo pipefail
WORKDIR=${WORKDIR:-/var/www/html}
SRC_DIR="${WORKDIR}/clients/photobooth-uploader/PhotoboothUploader"
OUT_DIR="${WORKDIR}/public/downloads"
-OUT_FILE="${OUT_DIR}/PhotoboothUploader.exe"
+WIN_FILE="${OUT_DIR}/PhotoboothUploader-win-x64.exe"
+MAC_FILE="${OUT_DIR}/PhotoboothUploader-macos-x64"
+LINUX_FILE="${OUT_DIR}/PhotoboothUploader-linux-x64"
STAMP_FILE="${OUT_DIR}/photobooth-uploader.hash"
if [[ ! -d "$SRC_DIR" ]]; then
@@ -27,7 +29,7 @@ compute_hash() {
HASH=$(compute_hash)
-if [[ -f "$OUT_FILE" && -f "$STAMP_FILE" ]]; then
+if [[ -f "$WIN_FILE" && -f "$MAC_FILE" && -f "$LINUX_FILE" && -f "$STAMP_FILE" ]]; then
CURRENT_HASH=$(cat "$STAMP_FILE" || true)
if [[ "$CURRENT_HASH" == "$HASH" ]]; then
echo "[photobooth-uploader] Up to date, skipping publish."
@@ -35,14 +37,33 @@ if [[ -f "$OUT_FILE" && -f "$STAMP_FILE" ]]; then
fi
fi
-echo "[photobooth-uploader] Publishing uploader exe..."
-dotnet publish "${SRC_DIR}/PhotoboothUploader.csproj" \
- -c Release \
- -r win-x64 \
- --self-contained true \
- /p:PublishSingleFile=true \
- /p:IncludeNativeLibrariesForSelfExtract=true \
- -o "$OUT_DIR"
+publish_target() {
+ local rid="$1"
+ local output_file="$2"
+ local temp_dir
+ temp_dir=$(mktemp -d)
+
+ dotnet publish "${SRC_DIR}/PhotoboothUploader.csproj" \
+ -c Release \
+ -r "$rid" \
+ --self-contained true \
+ /p:PublishSingleFile=true \
+ /p:IncludeNativeLibrariesForSelfExtract=true \
+ -o "$temp_dir"
+
+ if [[ "$rid" == "win-x64" ]]; then
+ mv -f "$temp_dir/PhotoboothUploader.exe" "$output_file"
+ else
+ mv -f "$temp_dir/PhotoboothUploader" "$output_file"
+ fi
+
+ rm -rf "$temp_dir"
+}
+
+echo "[photobooth-uploader] Publishing uploader binaries..."
+publish_target "win-x64" "$WIN_FILE"
+publish_target "osx-x64" "$MAC_FILE"
+publish_target "linux-x64" "$LINUX_FILE"
echo "$HASH" > "$STAMP_FILE"
-echo "[photobooth-uploader] Published to ${OUT_FILE}"
+echo "[photobooth-uploader] Published to ${OUT_DIR}"