Skip to content

Commit f040050

Browse files
michaelblaessclaude
andcommitted
feat: Verschluesselte Musik, GitHub Actions Deploy, base-path fuer Pages
MP3s mit AES-256-CBC verschluesselt unter assets/music/ (gehashte Namen). Decrypt-Script und GitHub Actions Workflow fuer automatisches Build & Deploy auf GitHub Pages. music.ts auf gehashte Dateinamen umgestellt. Vite base-path und PWA scope auf /halma/ gesetzt. ThemeSelect TS-Fehler behoben. Naechster Schritt: MUSIC_KEY als GitHub Secret anlegen. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent cad5c09 commit f040050

10 files changed

Lines changed: 108 additions & 23 deletions

File tree

.github/workflows/deploy.yml

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
name: Build & Deploy to GitHub Pages
2+
3+
on:
4+
push:
5+
branches: [main]
6+
workflow_dispatch:
7+
8+
permissions:
9+
contents: read
10+
pages: write
11+
id-token: write
12+
13+
concurrency:
14+
group: pages
15+
cancel-in-progress: true
16+
17+
jobs:
18+
build:
19+
runs-on: ubuntu-latest
20+
steps:
21+
- uses: actions/checkout@v4
22+
23+
- uses: actions/setup-node@v4
24+
with:
25+
node-version: 22
26+
cache: npm
27+
28+
- name: Install dependencies
29+
run: npm ci
30+
31+
- name: Decrypt music
32+
run: bash scripts/decrypt-music.sh
33+
env:
34+
MUSIC_KEY: ${{ secrets.MUSIC_KEY }}
35+
36+
- name: Build
37+
run: npm run build
38+
39+
- name: Upload artifact
40+
uses: actions/upload-pages-artifact@v3
41+
with:
42+
path: dist
43+
44+
deploy:
45+
needs: build
46+
runs-on: ubuntu-latest
47+
environment:
48+
name: github-pages
49+
url: ${{ steps.deployment.outputs.page_url }}
50+
steps:
51+
- name: Deploy to GitHub Pages
52+
id: deployment
53+
uses: actions/deploy-pages@v4

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ dist
1212
dist-ssr
1313
*.local
1414

15-
# Lizenzierte Musik (nicht im Repo, siehe public/music/README.md)
15+
# Entschluesselte Musik (nur lokal, nicht im Repo)
1616
public/music/*.mp3
1717

1818
# Editor directories and files

assets/music/1e6b41f0261e.enc

5.85 MB
Binary file not shown.

assets/music/9685818f508c.enc

2.84 MB
Binary file not shown.

assets/music/a07b560519d9.enc

4.1 MB
Binary file not shown.

public/music/README.md

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,11 @@
11
# Hintergrundmusik
22

3-
Dieses Verzeichnis enthaelt die lizenzierten Hintergrundmusik-Tracks fuer das Spiel.
4-
Die MP3-Dateien sind **nicht im Repository enthalten**, da sie ueber kommerzielle
5-
Lizenzen (AudioJungle / Envato Market — Music Standard License) bezogen wurden.
3+
Die MP3-Dateien werden beim Build automatisch aus den verschluesselten Dateien
4+
in `assets/music/` erzeugt (siehe `scripts/decrypt-music.sh`).
65

7-
## Erwartete Dateien
8-
9-
| Dateiname | Track | Autor | AudioJungle Item ID |
10-
|---|---|---|---|
11-
| `cyberpunk.mp3` | Cyberpunk | Pchelaudio | 20906388 |
12-
| `epic-short.mp3` | Epic | (aus ZIP) | 22602282 |
13-
| `epicness-middle.mp3` | Epicness | Alive_Tunes | 20777340 |
6+
Lokal: `MUSIC_KEY=... bash scripts/decrypt-music.sh`
147

158
## Ohne Musik spielen
169

1710
Das Spiel funktioniert auch ohne diese Dateien — der Musik-Toggle bleibt dann
1811
wirkungslos. Alle anderen Features (KI, Themes, Sound-Effekte) sind davon nicht betroffen.
19-
20-
## Eigene Musik verwenden
21-
22-
Du kannst eigene MP3-Dateien mit den obigen Dateinamen in dieses Verzeichnis legen.
23-
Alternativ kannst du die Track-Liste in `src/audio/music.ts` anpassen.

scripts/decrypt-music.sh

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
#!/usr/bin/env bash
2+
# Entschluesselt die Musik-Dateien fuer den Build.
3+
# Erwartet MUSIC_KEY als Umgebungsvariable.
4+
set -euo pipefail
5+
6+
if [ -z "${MUSIC_KEY:-}" ]; then
7+
echo "MUSIC_KEY nicht gesetzt — Musik wird uebersprungen."
8+
exit 0
9+
fi
10+
11+
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
12+
ROOT_DIR="$(dirname "$SCRIPT_DIR")"
13+
SRC_DIR="$ROOT_DIR/assets/music"
14+
DEST_DIR="$ROOT_DIR/public/music"
15+
16+
mkdir -p "$DEST_DIR"
17+
18+
# Mapping: hash → entschluesselte Datei
19+
declare -A TRACKS=(
20+
["1e6b41f0261e"]="1e6b41f0261e"
21+
["9685818f508c"]="9685818f508c"
22+
["a07b560519d9"]="a07b560519d9"
23+
)
24+
25+
for hash in "${!TRACKS[@]}"; do
26+
enc_file="$SRC_DIR/${hash}.enc"
27+
out_file="$DEST_DIR/${TRACKS[$hash]}.mp3"
28+
29+
if [ ! -f "$enc_file" ]; then
30+
echo "WARNUNG: $enc_file nicht gefunden, ueberspringe."
31+
continue
32+
fi
33+
34+
openssl enc -aes-256-cbc -d -salt -pbkdf2 \
35+
-in "$enc_file" \
36+
-out "$out_file" \
37+
-pass "pass:$MUSIC_KEY"
38+
39+
echo "Entschluesselt: ${TRACKS[$hash]}.mp3"
40+
done
41+
42+
echo "Musik bereit."

src/audio/music.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
// Background music player — shuffled playlist, loops forever
22

3+
// Hashed filenames — Mapping siehe scripts/decrypt-music.sh
34
const TRACKS = [
4-
'/music/cyberpunk.mp3',
5-
'/music/epic-short.mp3',
6-
'/music/epicness-middle.mp3',
5+
'/music/1e6b41f0261e.mp3',
6+
'/music/9685818f508c.mp3',
7+
'/music/a07b560519d9.mp3',
78
];
89

910
let audio: HTMLAudioElement | null = null;

src/components/ThemeSelect.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { useTheme } from '../theme/ThemeContext';
33
import { THEME_IDS, THEME_LABELS } from '../theme/themes';
44

55
// TODO: Kosmos, Neon, Eleganz werden noch überarbeitet — vorerst ausgeblendet
6-
const HIDDEN_THEMES = new Set(['kosmos', 'neon', 'eleganz'] as const);
6+
const HIDDEN_THEMES: Set<string> = new Set(['kosmos', 'neon', 'eleganz']);
77
const VISIBLE = THEME_IDS.filter((id) => !HIDDEN_THEMES.has(id));
88
const ROW1 = VISIBLE.slice(0, 4); // Standard, Holz, Kontrast, Hell
99
const ROW2 = VISIBLE.slice(4);

vite.config.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,14 @@ import { VitePWA } from 'vite-plugin-pwa'
44

55
// https://vite.dev/config/
66
export default defineConfig({
7+
base: '/halma/',
78
plugins: [
89
react(),
910
VitePWA({
1011
registerType: 'autoUpdate',
1112
includeAssets: ['icon.svg', 'music/*.mp3', 'HIGHSCORE.md', 'og-image.png'],
1213
manifest: {
13-
id: '/',
14+
id: '/halma/',
1415
name: 'Halma',
1516
short_name: 'Halma',
1617
description: 'Sternhalma gegen die KI — schnell, taktisch, offline spielbar.',
@@ -19,8 +20,8 @@ export default defineConfig({
1920
display: 'standalone',
2021
orientation: 'any',
2122
lang: 'de',
22-
start_url: '/',
23-
scope: '/',
23+
start_url: '/halma/',
24+
scope: '/halma/',
2425
icons: [
2526
{ src: 'icons/icon-192.png', sizes: '192x192', type: 'image/png' },
2627
{ src: 'icons/icon-512.png', sizes: '512x512', type: 'image/png' },

0 commit comments

Comments
 (0)