0.9.0-1 Version Check

This commit is contained in:
2026-03-14 08:07:49 +00:00
parent 466e7a7a3d
commit ba91f83722
11 changed files with 205 additions and 12 deletions

3
.gitignore vendored
View File

@@ -81,3 +81,6 @@ Thumbs.db
# ---------------------------- # ----------------------------
deploy-ripster.sh deploy-ripster.sh
build-handbrake-nvdec.sh build-handbrake-nvdec.sh
gitea-setup.sh
gitea_install.sh
/scripts/

View File

@@ -1,12 +1,12 @@
{ {
"name": "ripster-backend", "name": "ripster-backend",
"version": "1.0.0", "version": "0.9.0-1",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "ripster-backend", "name": "ripster-backend",
"version": "1.0.0", "version": "0.9.0-1",
"dependencies": { "dependencies": {
"cors": "^2.8.5", "cors": "^2.8.5",
"dotenv": "^16.4.7", "dotenv": "^16.4.7",

View File

@@ -1,6 +1,6 @@
{ {
"name": "ripster-backend", "name": "ripster-backend",
"version": "1.0.0", "version": "0.9.0-1",
"private": true, "private": true,
"type": "commonjs", "type": "commonjs",
"scripts": { "scripts": {

View File

@@ -1,12 +1,12 @@
{ {
"name": "ripster-frontend", "name": "ripster-frontend",
"version": "1.0.0", "version": "0.9.0-1",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "ripster-frontend", "name": "ripster-frontend",
"version": "1.0.0", "version": "0.9.0-1",
"dependencies": { "dependencies": {
"primeicons": "^7.0.0", "primeicons": "^7.0.0",
"primereact": "^10.9.2", "primereact": "^10.9.2",

View File

@@ -1,6 +1,6 @@
{ {
"name": "ripster-frontend", "name": "ripster-frontend",
"version": "1.0.0", "version": "0.9.0-1",
"private": true, "private": true,
"type": "module", "type": "module",
"scripts": { "scripts": {

View File

@@ -9,6 +9,7 @@ import HistoryPage from './pages/HistoryPage';
import DatabasePage from './pages/DatabasePage'; import DatabasePage from './pages/DatabasePage';
function App() { function App() {
const appVersion = __APP_VERSION__;
const [pipeline, setPipeline] = useState({ state: 'IDLE', progress: 0, context: {} }); const [pipeline, setPipeline] = useState({ state: 'IDLE', progress: 0, context: {} });
const [hardwareMonitoring, setHardwareMonitoring] = useState(null); const [hardwareMonitoring, setHardwareMonitoring] = useState(null);
const [lastDiscEvent, setLastDiscEvent] = useState(null); const [lastDiscEvent, setLastDiscEvent] = useState(null);
@@ -115,7 +116,12 @@ function App() {
<img src="/logo.png" alt="Ripster Logo" className="brand-logo" /> <img src="/logo.png" alt="Ripster Logo" className="brand-logo" />
<div className="brand-copy"> <div className="brand-copy">
<h1>Ripster</h1> <h1>Ripster</h1>
<p>Disc Ripping Control Center</p> <div className="brand-meta">
<p>Disc Ripping Control Center</p>
<span className="app-version" aria-label={`Version ${appVersion}`}>
v{appVersion}
</span>
</div>
</div> </div>
</div> </div>
<div className="nav-buttons"> <div className="nav-buttons">

View File

@@ -142,6 +142,28 @@ body {
letter-spacing: 0.02em; letter-spacing: 0.02em;
} }
.brand-meta {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 0.45rem;
}
.app-version {
display: inline-flex;
align-items: center;
min-height: 1.35rem;
padding: 0.1rem 0.45rem;
border: 1px solid rgba(58, 29, 18, 0.18);
border-radius: 999px;
background: rgba(255, 250, 240, 0.45);
color: rgba(58, 29, 18, 0.72);
font-size: 0.72rem;
font-weight: 600;
letter-spacing: 0.03em;
white-space: nowrap;
}
.nav-buttons { .nav-buttons {
display: flex; display: flex;
gap: 0.5rem; gap: 0.5rem;
@@ -2530,6 +2552,10 @@ body {
font-size: 0.82rem; font-size: 0.82rem;
} }
.app-version {
font-size: 0.68rem;
}
.metadata-grid, .metadata-grid,
.device-meta, .device-meta,
.hardware-monitor-grid, .hardware-monitor-grid,

View File

@@ -1,6 +1,8 @@
import { readFileSync } from 'node:fs';
import { defineConfig } from 'vite'; import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react'; import react from '@vitejs/plugin-react';
const appPackage = JSON.parse(readFileSync(new URL('../package.json', import.meta.url), 'utf8'));
const publicOrigin = (process.env.VITE_PUBLIC_ORIGIN || '').trim(); const publicOrigin = (process.env.VITE_PUBLIC_ORIGIN || '').trim();
const parsedAllowedHosts = (process.env.VITE_ALLOWED_HOSTS || '') const parsedAllowedHosts = (process.env.VITE_ALLOWED_HOSTS || '')
.split(',') .split(',')
@@ -24,6 +26,9 @@ if (publicOrigin) {
export default defineConfig({ export default defineConfig({
plugins: [react()], plugins: [react()],
define: {
__APP_VERSION__: JSON.stringify(appPackage.version)
},
server: { server: {
host: '0.0.0.0', host: '0.0.0.0',
port: 5173, port: 5173,

152
gitea_setup.sh Executable file
View File

@@ -0,0 +1,152 @@
#!/usr/bin/env bash
set -euo pipefail
GITEA_BASE="https://git.d-razz.de"
REPO_OWNER="michael"
REPO_NAME="ripster"
BRANCHES_API_URL="${GITEA_BASE}/api/v1/repos/${REPO_OWNER}/${REPO_NAME}/branches?limit=50"
usage() {
cat <<'EOF'
Verwendung:
bash setup.sh [Optionen]
Optionen (wie install.sh):
--branch <branch> Branch direkt setzen (ohne Auswahlmenue)
--dir <pfad> Installationsverzeichnis
--user <benutzer> Systembenutzer fuer den Dienst
--port <port> Backend-Port
--host <hostname> Hostname/IP fuer die Weboberflaeche
--no-makemkv MakeMKV-Installation ueberspringen
--no-handbrake HandBrake-Installation ueberspringen
--no-nginx Nginx-Einrichtung ueberspringen
--reinstall Vorhandene Installation aktualisieren
-h, --help Hilfe anzeigen
EOF
}
SELECTED_BRANCH=""
FORWARDED_ARGS=()
while [[ $# -gt 0 ]]; do
case "$1" in
--branch)
[[ $# -ge 2 ]] || { echo "Fehlender Wert fuer --branch" >&2; exit 1; }
SELECTED_BRANCH="$2"
shift 2
;;
--dir|--user|--port|--host)
[[ $# -ge 2 ]] || { echo "Fehlender Wert fuer $1" >&2; exit 1; }
FORWARDED_ARGS+=("$1" "$2")
shift 2
;;
--no-makemkv|--no-handbrake|--no-nginx|--reinstall)
FORWARDED_ARGS+=("$1")
shift
;;
-h|--help)
usage
exit 0
;;
*)
echo "Unbekannter Parameter: $1" >&2
usage >&2
exit 1
;;
esac
done
fetch_url() {
local url="$1"
if command -v curl >/dev/null 2>&1; then
curl -fsSL "$url"
return
fi
if command -v wget >/dev/null 2>&1; then
wget -qO- "$url"
return
fi
echo "Weder curl noch wget gefunden. Bitte eines davon installieren." >&2
exit 1
}
download_file() {
local url="$1"
local target="$2"
fetch_url "$url" > "$target"
}
select_branch() {
local branches_json
local -a branches
local selection
branches_json="$(fetch_url "$BRANCHES_API_URL")"
mapfile -t branches < <(
printf '%s\n' "$branches_json" \
| grep -oE '"name"[[:space:]]*:[[:space:]]*"[^"]+"' \
| sed -E 's/"name"[[:space:]]*:[[:space:]]*"([^"]+)"/\1/'
)
if [[ ${#branches[@]} -eq 0 ]]; then
echo "Keine Branches gefunden oder API-Antwort ungültig." >&2
exit 1
fi
if [[ -n "$SELECTED_BRANCH" ]]; then
local found=false
for branch in "${branches[@]}"; do
if [[ "$branch" == "$SELECTED_BRANCH" ]]; then
found=true
break
fi
done
if [[ "$found" == false ]]; then
echo "Branch '$SELECTED_BRANCH' nicht gefunden." >&2
exit 1
fi
return
fi
if [[ ! -t 0 ]]; then
echo "Kein interaktives Terminal für die Branch-Auswahl verfügbar." >&2
exit 1
fi
echo "Verfügbare Branches:"
for i in "${!branches[@]}"; do
printf " %2d) %s\n" "$((i + 1))" "${branches[$i]}"
done
while true; do
read -r -p "Bitte Branch auswählen [1-${#branches[@]}]: " selection
if [[ "$selection" =~ ^[0-9]+$ ]] && (( selection >= 1 && selection <= ${#branches[@]} )); then
SELECTED_BRANCH="${branches[$((selection - 1))]}"
return
fi
echo "Ungültige Auswahl."
done
}
select_branch
SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd -P)"
INSTALL_SCRIPT="${SCRIPT_DIR}/gitea_install.sh"
if [[ ! -f "$INSTALL_SCRIPT" ]]; then
echo "gitea_install.sh nicht gefunden in $SCRIPT_DIR" >&2
exit 1
fi
if [[ $EUID -eq 0 ]]; then
bash "$INSTALL_SCRIPT" --branch "$SELECTED_BRANCH" "${FORWARDED_ARGS[@]}"
else
if ! command -v sudo >/dev/null 2>&1; then
echo "sudo nicht gefunden. Bitte als root ausführen." >&2
exit 1
fi
sudo bash "$INSTALL_SCRIPT" --branch "$SELECTED_BRANCH" "${FORWARDED_ARGS[@]}"
fi

4
package-lock.json generated
View File

@@ -1,12 +1,12 @@
{ {
"name": "ripster", "name": "ripster",
"version": "1.0.0", "version": "0.9.0-1",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "ripster", "name": "ripster",
"version": "1.0.0", "version": "0.9.0-1",
"devDependencies": { "devDependencies": {
"concurrently": "^9.1.2" "concurrently": "^9.1.2"
} }

View File

@@ -1,13 +1,14 @@
{ {
"name": "ripster", "name": "ripster",
"private": true, "private": true,
"version": "1.0.0", "version": "0.9.0-1",
"scripts": { "scripts": {
"dev": "concurrently \"npm run dev --prefix backend\" \"npm run dev --prefix frontend\"", "dev": "concurrently \"npm run dev --prefix backend\" \"npm run dev --prefix frontend\"",
"dev:backend": "npm run dev --prefix backend", "dev:backend": "npm run dev --prefix backend",
"dev:frontend": "npm run dev --prefix frontend", "dev:frontend": "npm run dev --prefix frontend",
"start": "npm run start --prefix backend", "start": "npm run start --prefix backend",
"build:frontend": "npm run build --prefix frontend" "build:frontend": "npm run build --prefix frontend",
"release:interactive": "bash ./scripts/release.sh"
}, },
"devDependencies": { "devDependencies": {
"concurrently": "^9.1.2" "concurrently": "^9.1.2"