diff --git a/.gitignore b/.gitignore index 8319981..22979bd 100644 --- a/.gitignore +++ b/.gitignore @@ -21,3 +21,6 @@ tiles/build/ *.mbtiles tiles/build.log tiles/.DS_Store + +# Album-Build: Zwischendateien (ZIPs + Thumbnail werden committet) +tools/album-build/dist/ diff --git a/Makefile b/Makefile index 7fc461a..1906455 100644 --- a/Makefile +++ b/Makefile @@ -28,7 +28,7 @@ TAR_EXCLUDE := --exclude='.git' \ --exclude='./.DS_Store' .PHONY: help deploy deploy-clean staging release sync push restart build stop status \ - logs logs-f shell db dev clean-cache check-ssh reports bump test tiles tiles-deploy + logs logs-f shell db dev clean-cache check-ssh reports bump test tiles tiles-deploy album # ---------------------------------------------------------- # SSH-Prüfung — Abhängigkeit aller DS-Befehle @@ -343,6 +343,13 @@ bump: sed -i.bak -E "s/\?v=[0-9]+/?v=$$NEW/g" backend/static/landing.html && rm -f backend/static/landing.html.bak; \ echo " ✓ APP_VER $$CUR → $$NEW (VERSION, sw.js, app.js, index.html, landing.html aktualisiert)" +# ---------------------------------------------------------- +# ALBUM — die zwei Download-ZIPs (DE+EN) neu bauen (Cover, ID3-Tags, Liner Notes) +# Nur nötig, wenn sich Songs/Cover/Beschreibung ändern. Braucht ImageMagick + ffmpeg. +# ---------------------------------------------------------- +album: + @bash tools/album-build/build.sh + # ---------------------------------------------------------- # TEST — Smoke-Tests gegen isolierte Test-DB (kein Docker, kein DS) # ---------------------------------------------------------- diff --git a/VERSION b/VERSION index 568efca..93bf02c 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1301 \ No newline at end of file +1302 \ No newline at end of file diff --git a/backend/main.py b/backend/main.py index 21a5069..13da5cf 100644 --- a/backend/main.py +++ b/backend/main.py @@ -375,6 +375,8 @@ app.mount("/js", StaticFiles(directory=f"{STATIC_DIR}/js"), name="js") app.mount("/icons", StaticFiles(directory=f"{STATIC_DIR}/icons"), name="icons") app.mount("/img", StaticFiles(directory=f"{STATIC_DIR}/img"), name="img") app.mount("/sounds", StaticFiles(directory=f"{STATIC_DIR}/sounds"), name="sounds") # Yaro-Navi-Sounds +os.makedirs(f"{STATIC_DIR}/downloads", exist_ok=True) # Album-ZIPs (vom Build-Skript erzeugt) +app.mount("/downloads", StaticFiles(directory=f"{STATIC_DIR}/downloads"), name="downloads") # Selbst-gehostete Vektor-Tiles (.pmtiles) — liegen im data-Volume, NICHT im Image. # WICHTIG: Starlettes StaticFiles/FileResponse liefert hinter unserer BaseHTTPMiddleware diff --git a/backend/static/downloads/ban-yaro-album-de.zip b/backend/static/downloads/ban-yaro-album-de.zip new file mode 100644 index 0000000..8529725 Binary files /dev/null and b/backend/static/downloads/ban-yaro-album-de.zip differ diff --git a/backend/static/downloads/ban-yaro-album-en.zip b/backend/static/downloads/ban-yaro-album-en.zip new file mode 100644 index 0000000..015b034 Binary files /dev/null and b/backend/static/downloads/ban-yaro-album-en.zip differ diff --git a/backend/static/img/banyaro/album-thumb.jpg b/backend/static/img/banyaro/album-thumb.jpg new file mode 100644 index 0000000..bbf38d8 Binary files /dev/null and b/backend/static/img/banyaro/album-thumb.jpg differ diff --git a/backend/static/index.html b/backend/static/index.html index dd33421..0905b1c 100644 --- a/backend/static/index.html +++ b/backend/static/index.html @@ -86,14 +86,14 @@ Ban Yaro - + - - - - - + + + + + @@ -624,12 +624,12 @@ - - - - - - + + + + + + @@ -639,7 +639,7 @@ - + diff --git a/backend/static/js/app.js b/backend/static/js/app.js index 1b8fc75..7651572 100644 --- a/backend/static/js/app.js +++ b/backend/static/js/app.js @@ -3,7 +3,7 @@ Router, State-Management, Navigation, Initialisierung. ============================================================ */ -const APP_VER = '1301'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen +const APP_VER = '1302'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen const APP_VERSION = '1.6.0'; // ← semantische Version, wird bei make release gesetzt window.APP_VER = APP_VER; // global verfügbar für andere Module (z.B. offline-indicator) window.APP_VERSION = APP_VERSION; diff --git a/backend/static/js/pages/settings.js b/backend/static/js/pages/settings.js index 4e21eae..d31203b 100644 --- a/backend/static/js/pages/settings.js +++ b/backend/static/js/pages/settings.js @@ -877,6 +877,35 @@ window.Page_settings = (() => { + +
+
Ban Yaro — das Album
+
+ Ban Yaro — Album-Cover +
+
7 Songs zum Behalten 🎸
+
+ Das ganze Album als Download — auf Deutsch oder Englisch. + Behalten & teilen ausdrücklich erwünscht. +
+
+
+
+ + ${UI.icon('download-simple')} Deutsch · 33 MB + + + ${UI.icon('download-simple')} English · 36 MB + +
+
+
diff --git a/backend/static/landing.html b/backend/static/landing.html index 3a4af0c..0b4cf3a 100644 --- a/backend/static/landing.html +++ b/backend/static/landing.html @@ -4,7 +4,7 @@ - + Ban Yaro — Die Hunde-App für Deutschland, Österreich & Schweiz diff --git a/backend/static/sw.js b/backend/static/sw.js index 5aa9323..660af2e 100644 --- a/backend/static/sw.js +++ b/backend/static/sw.js @@ -4,7 +4,7 @@ ============================================================ */ // ← EINZIGE Stelle für die Version — STATIC_ASSETS und CACHE_VERSION leiten sich ab -const VER = '1301'; +const VER = '1302'; const CACHE_VERSION = `by-v${VER}`; const CACHE_STATIC = `${CACHE_VERSION}-static`; const CACHE_TILES = 'ban-yaro-tiles-v1'; // bleibt über SW-Updates erhalten diff --git a/tools/album-build/build.sh b/tools/album-build/build.sh new file mode 100755 index 0000000..d177f15 --- /dev/null +++ b/tools/album-build/build.sh @@ -0,0 +1,86 @@ +#!/usr/bin/env bash +# Baut die zwei Album-Downloads (DE + EN) reproduzierbar: +# Cover (Foto quadr. + Wortmarke) → ID3-Tags + eingebettetes Cover → ZIP mit Liner Notes. +# Quelle: die committeten MP3s in backend/static/sounds/ + ein Hi-Res-Foto. +# Ausgabe: backend/static/downloads/ban-yaro-album-{de,en}.zip + img/banyaro/album-thumb.jpg +# Benötigt: ImageMagick (magick), ffmpeg, zip. Aufruf: make album (oder bash tools/album-build/build.sh) +set -euo pipefail + +ROOT="$(cd "$(dirname "$0")/../.." && pwd)" +SND="$ROOT/backend/static/sounds" +PHOTO="$ROOT/backend/static/img/banyaro/hires/banyaro_fruehling_playdate_hires.jpg" +FONT="/System/Library/Fonts/Supplemental/Arial Bold.ttf" +BUILD="$ROOT/tools/album-build" +DIST="$BUILD/dist" +DL="$ROOT/backend/static/downloads" +IMG="$ROOT/backend/static/img/banyaro" + +rm -rf "$DIST"; mkdir -p "$DIST" "$DL" "$IMG" + +# --- 1) Cover (quadratischer Crop auf die Hunde + Verlauf unten + Wortmarke) --- +make_cover() { # $1=subtitle $2=outfile + magick "$PHOTO" -auto-orient -crop 2648x2648+551+0 +repage -resize 2000x2000 \ + \( -size 2000x950 gradient:none-'rgba(0,0,0,0.80)' \) -gravity south -compose over -composite \ + -gravity south -font "$FONT" -kerning 10 \ + -fill 'rgba(0,0,0,0.55)' -pointsize 168 -annotate +4+254 "BAN YARO" \ + -fill white -pointsize 168 -annotate +0+250 "BAN YARO" \ + -kerning 7 -fill 'rgba(255,255,255,0.92)' -pointsize 60 -annotate +0+160 "$1" \ + -quality 90 "$2" +} +make_cover "DAS ALBUM · 7 SONGS" "$DIST/cover-de.jpg" +make_cover "THE ALBUM · 7 SONGS" "$DIST/cover-en.jpg" +# Eingebettetes Albumart kleiner halten (sonst blähen sich die MP3s auf) +magick "$DIST/cover-de.jpg" -resize 800x800 -quality 85 "$DIST/art-de.jpg" +magick "$DIST/cover-en.jpg" -resize 800x800 -quality 85 "$DIST/art-en.jpg" +# Neutrales Thumbnail (ohne Text) für die Profil-Karte — der Titel steht dort im HTML +magick "$PHOTO" -auto-orient -crop 2648x2648+551+0 +repage -resize 600x600 -quality 85 "$IMG/album-thumb.jpg" + +# --- 2)+3) pro Sprache: taggen + zippen --- +# Zeilenformat: "quelldatei(ohne .mp3)|Titel|Untertitel" +DE_TRACKS=( + "ban-yaro-blues|Ban Yaro Blues|Die Hymne" + "ban-yaro-mobil|Ban Yaro Mobil|Erste Fahrt im Anhänger" + "amy|Amy|Eine Liebesromanze" + "beim-friseur|Beim Friseur|Halbes Fell, Energie pur" + "leckerli-paradies|Leckerli-Paradies|Voller Napf, volles Glück" + "platsch|Platsch!|Ab ins kühle Nass" + "bester-freund|Bester Freund|Du und ich" +) +EN_TRACKS=( + "ban-yaro-blues-en|Ban Yaro Blues|The anthem" + "ban-yaro-mobil-en|Ban Yaro Mobile|First ride in the trailer" + "amy-en|Amy|A love duet" + "at-the-groomers-en|At the Groomer's|Half the fur, all the energy" + "treat-paradise-en|Treat Paradise|Full bowl, full heart" + "splash-en|Splash!|Into the cool water" + "best-friend-en|Best Friend|You and me" +) + +zip_album() { # $1=lang $2=AlbumName(ID3, Em-Dash ok) $3=Ordner(ASCII) $4=art $5=liner shift 5; rest=tracks + local lang="$1" album="$2" fname="$3" art="$4" liner="$5"; shift 5 + local folder="$DIST/$fname"; rm -rf "$folder"; mkdir -p "$folder" + if [ "$lang" = "de" ]; then cp "$liner" "$folder/LIESMICH.txt"; else cp "$liner" "$folder/README.txt"; fi + cp "$art" "$folder/cover.jpg" + local n=0 line src title sub nn + for line in "$@"; do + n=$((n+1)); nn=$(printf "%02d" "$n") + IFS='|' read -r src title sub <<<"$line" + ffmpeg -y -loglevel error -i "$SND/$src.mp3" -i "$art" \ + -map 0:a -map 1:v -c copy -id3v2_version 3 \ + -metadata title="$title" -metadata artist="Ban Yaro" \ + -metadata album="$album" -metadata album_artist="Ban Yaro" \ + -metadata track="$n/7" -metadata date="2026" -metadata genre="Blues" \ + -metadata comment="$sub" -disposition:v:0 attached_pic \ + "$folder/$nn $title.mp3" + done + ( cd "$DIST" && rm -f "$DL/ban-yaro-album-$lang.zip" && zip -r -X -q "$DL/ban-yaro-album-$lang.zip" "$fname" ) + echo " ✓ $fname → ban-yaro-album-$lang.zip ($(du -h "$DL/ban-yaro-album-$lang.zip" | cut -f1))" +} + +# LIESMICH.txt für DE, README.txt für EN +cp "$BUILD/liner-de.txt" "$DIST/_liner-de.txt" +cp "$BUILD/liner-en.txt" "$DIST/_liner-en.txt" +zip_album "de" "Ban Yaro — Das Album" "Ban Yaro - Das Album" "$DIST/art-de.jpg" "$DIST/_liner-de.txt" "${DE_TRACKS[@]}" +zip_album "en" "Ban Yaro — The Album" "Ban Yaro - The Album" "$DIST/art-en.jpg" "$DIST/_liner-en.txt" "${EN_TRACKS[@]}" + +echo "Fertig. Downloads in backend/static/downloads/, Thumbnail in img/banyaro/album-thumb.jpg" diff --git a/tools/album-build/liner-de.txt b/tools/album-build/liner-de.txt new file mode 100644 index 0000000..9be5798 --- /dev/null +++ b/tools/album-build/liner-de.txt @@ -0,0 +1,34 @@ +================================================== + BAN YARO — DAS ALBUM + 7 Songs +================================================== + +Sieben Lieder über einen Hund namens Ban Yaro: +übers Gassigehen bei jedem Wetter, die erste Fahrt +im Anhänger, die große Liebe, den Friseur, den +vollen Napf, das kühle Wasser — und den besten +Freund, den ein Mensch haben kann. + +Selbst gemacht, mit viel Herz. Aus der Ban-Yaro-App. + +-------------------------------------------------- +TRACKLIST +-------------------------------------------------- + 1. Ban Yaro Blues Die Hymne + 2. Ban Yaro Mobil Erste Fahrt im Anhänger + 3. Amy Eine Liebesromanze + 4. Beim Friseur Halbes Fell, Energie pur + 5. Leckerli-Paradies Voller Napf, volles Glück + 6. Platsch! Ab ins kühle Nass + 7. Bester Freund Du und ich + +-------------------------------------------------- +Ein Ban-Yaro-Original · banyaro.app +(c) 2026 Ban Yaro + +Diese Aufnahmen sind ein kleines Geschenk: +behalten und teilen ausdrucklich erwunscht — +nur bitte nicht kommerziell verwenden. + +Viel Freude beim Horen und einen schonen +Gassi-Gang! Wuff. 🐾 diff --git a/tools/album-build/liner-en.txt b/tools/album-build/liner-en.txt new file mode 100644 index 0000000..daefbf0 --- /dev/null +++ b/tools/album-build/liner-en.txt @@ -0,0 +1,34 @@ +================================================== + BAN YARO — THE ALBUM + 7 Songs +================================================== + +Seven songs about a dog named Ban Yaro: +about walks in every kind of weather, the first +ride in the trailer, falling in love, the groomer, +a full bowl, cool water — and the best friend a +human could ever ask for. + +Homemade, with all our heart. From the Ban Yaro app. + +-------------------------------------------------- +TRACKLIST +-------------------------------------------------- + 1. Ban Yaro Blues The anthem + 2. Ban Yaro Mobile First ride in the trailer + 3. Amy A love duet + 4. At the Groomer's Half the fur, all the energy + 5. Treat Paradise Full bowl, full heart + 6. Splash! Into the cool water + 7. Best Friend You and me + +-------------------------------------------------- +A Ban Yaro original · banyaro.app +(c) 2026 Ban Yaro + +These recordings are a little gift: +keep them and share them freely — +just please don't use them commercially. + +Enjoy the music, and have a wonderful walk! +Woof. 🐾