Døp om sg-announcer til announcer
Appen var navngitt etter Sauda Gathering, men det er ingenting arrangementsspesifikt i selve koden. Navnet står igjen i tjenesten, install.sh og pyproject. - install.sh skriver nå announcer.service, og rydder bort en gammel sg-announcer.service først. Uten det slåss to enheter om port 8090 når skriptet kjøres på en maskin som har den gamle. - Enhetsfila får chmod 600; PIN-en står i klartekst i den. - src/sg_announcer/ er slettet. Det var en uv-init-stub som bare printet «Hello from sg-announcer!», pekt på av [project.scripts], og som ingen har kalt noen gang. - [tool.uv] package = false: appen er løse .py-filer som kjøres på plass, ikke en pakke. Uten den vil uv sync bygge et wheel og klage på at announcer/__init__.py mangler. Repoet i Forgejo og mappa er døpt om tilsvarende. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
3f37b0a7fb
commit
f191fb2b90
6 changed files with 51 additions and 42 deletions
|
|
@ -1,9 +1,9 @@
|
||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
"""SG Announcer – tekst inn, forhåndslytt i nettleseren, les ut på PC-ens lydutgang.
|
"""Announcer – tekst inn, forhåndslytt i nettleseren, les ut på PC-ens lydutgang.
|
||||||
|
|
||||||
Kjøres på PC-en som er koblet til høyttaleranlegget. Alle på nettet kan åpne
|
Kjøres på PC-en som er koblet til høyttaleranlegget. Alle på nettet kan åpne
|
||||||
sida og sende meldinger; selve avspillingen skjer alltid lokalt på denne
|
sida og sende meldinger; selve avspillingen skjer alltid lokalt på denne
|
||||||
maskinen via pw-play (PipeWire).
|
maskinen via pw-play (PipeWire) eller paplay.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
<title>SG Announcer</title>
|
<title>Announcer</title>
|
||||||
<style>
|
<style>
|
||||||
:root {
|
:root {
|
||||||
--bg: #0e1116; --panel: #171c24; --panel2: #1f2631; --line: #2a3340;
|
--bg: #0e1116; --panel: #171c24; --panel2: #1f2631; --line: #2a3340;
|
||||||
|
|
@ -62,7 +62,7 @@
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<main>
|
<main>
|
||||||
<h1>SG <span>Announcer</span></h1>
|
<h1><span>Announcer</span></h1>
|
||||||
<p class="sub">Skriv meldingen, forhåndslytt, og send den ut på anlegget.</p>
|
<p class="sub">Skriv meldingen, forhåndslytt, og send den ut på anlegget.</p>
|
||||||
|
|
||||||
<div class="card" id="pinbox">
|
<div class="card" id="pinbox">
|
||||||
|
|
|
||||||
35
install.sh
35
install.sh
|
|
@ -1,8 +1,8 @@
|
||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
# Installerer SG Announcer på en Debian/Ubuntu-maskin (testet mot Linux Mint).
|
# Installerer Announcer på en Debian/Ubuntu-maskin (testet mot Linux Mint).
|
||||||
#
|
#
|
||||||
# git clone https://git.1x1.no/kent/sg-announcer.git
|
# git clone https://git.1x1.no/kent/announcer.git
|
||||||
# cd sg-announcer && ./install.sh
|
# cd announcer && ./install.sh
|
||||||
#
|
#
|
||||||
# Kjør som vanlig bruker (ikke sudo); skriptet spør om passord der det trengs.
|
# Kjør som vanlig bruker (ikke sudo); skriptet spør om passord der det trengs.
|
||||||
# Valgfritt: ANNOUNCER_PIN=1234 ./install.sh -> sida krever PIN
|
# Valgfritt: ANNOUNCER_PIN=1234 ./install.sh -> sida krever PIN
|
||||||
|
|
@ -15,11 +15,13 @@ if [[ $EUID -eq 0 ]]; then
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
APP="announcer"
|
||||||
|
OLD_APP="sg-announcer" # het dette før; enheten ryddes bort nedenfor
|
||||||
REPO_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
REPO_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
PORT="${ANNOUNCER_PORT:-8090}"
|
PORT="${ANNOUNCER_PORT:-8090}"
|
||||||
PIN="${ANNOUNCER_PIN:-}"
|
PIN="${ANNOUNCER_PIN:-}"
|
||||||
UNIT_DIR="$HOME/.config/systemd/user"
|
UNIT_DIR="$HOME/.config/systemd/user"
|
||||||
UNIT="$UNIT_DIR/sg-announcer.service"
|
UNIT="$UNIT_DIR/$APP.service"
|
||||||
|
|
||||||
step() { printf '\n\033[1m==> %s\033[0m\n' "$*"; }
|
step() { printf '\n\033[1m==> %s\033[0m\n' "$*"; }
|
||||||
|
|
||||||
|
|
@ -49,12 +51,22 @@ mkdir -p cache chimes voices
|
||||||
step "Laster ned Piper-stemmene (lokal reserve, ca. 600 MB, kun første gang)"
|
step "Laster ned Piper-stemmene (lokal reserve, ca. 600 MB, kun første gang)"
|
||||||
"$UV" run python -c "import logging, announcer; logging.basicConfig(level=logging.INFO, format='%(message)s'); announcer.ensure_voices()"
|
"$UV" run python -c "import logging, announcer; logging.basicConfig(level=logging.INFO, format='%(message)s'); announcer.ensure_voices()"
|
||||||
|
|
||||||
|
step "Rydder bort gammel tjeneste"
|
||||||
|
# Tjenesten het sg-announcer før. Uten dette slåss to enheter om porten.
|
||||||
|
if [[ -f "$UNIT_DIR/$OLD_APP.service" ]]; then
|
||||||
|
systemctl --user disable --now "$OLD_APP" >/dev/null 2>&1 || true
|
||||||
|
rm -f "$UNIT_DIR/$OLD_APP.service"
|
||||||
|
echo "fjernet $OLD_APP.service"
|
||||||
|
else
|
||||||
|
echo "ingenting å rydde."
|
||||||
|
fi
|
||||||
|
|
||||||
step "systemd-brukertjeneste"
|
step "systemd-brukertjeneste"
|
||||||
mkdir -p "$UNIT_DIR"
|
mkdir -p "$UNIT_DIR"
|
||||||
{
|
{
|
||||||
cat <<UNIT
|
cat <<UNIT
|
||||||
[Unit]
|
[Unit]
|
||||||
Description=SG Announcer – TTS-utrop på høyttaleranlegget
|
Description=Announcer – TTS-utrop på høyttaleranlegget
|
||||||
After=pipewire.service pulseaudio.service
|
After=pipewire.service pulseaudio.service
|
||||||
|
|
||||||
[Service]
|
[Service]
|
||||||
|
|
@ -76,9 +88,10 @@ RestartSec=3
|
||||||
WantedBy=default.target
|
WantedBy=default.target
|
||||||
UNIT
|
UNIT
|
||||||
} > "$UNIT"
|
} > "$UNIT"
|
||||||
|
chmod 600 "$UNIT" # PIN står i klartekst her
|
||||||
systemctl --user daemon-reload
|
systemctl --user daemon-reload
|
||||||
systemctl --user enable --now sg-announcer
|
systemctl --user enable --now "$APP"
|
||||||
systemctl --user restart sg-announcer
|
systemctl --user restart "$APP"
|
||||||
|
|
||||||
step "Brannmur"
|
step "Brannmur"
|
||||||
if ip link show wt0 >/dev/null 2>&1; then
|
if ip link show wt0 >/dev/null 2>&1; then
|
||||||
|
|
@ -87,14 +100,14 @@ if ip link show wt0 >/dev/null 2>&1; then
|
||||||
sudo ufw default allow outgoing
|
sudo ufw default allow outgoing
|
||||||
sudo ufw allow in on wt0 to any port 22 proto tcp comment "ssh via netbird"
|
sudo ufw allow in on wt0 to any port 22 proto tcp comment "ssh via netbird"
|
||||||
sudo ufw allow in on wt0 to any port 22022 proto tcp comment "netbird ssh-server"
|
sudo ufw allow in on wt0 to any port 22022 proto tcp comment "netbird ssh-server"
|
||||||
sudo ufw allow in on wt0 to any port "$PORT" proto tcp comment "sg-announcer via netbird"
|
sudo ufw allow in on wt0 to any port "$PORT" proto tcp comment "$APP via netbird"
|
||||||
sudo ufw delete allow "$PORT/tcp" >/dev/null 2>&1 || true
|
sudo ufw delete allow "$PORT/tcp" >/dev/null 2>&1 || true
|
||||||
sudo ufw --force enable
|
sudo ufw --force enable
|
||||||
echo "ufw aktiv: port $PORT, 22 og 22022 er åpne kun på wt0 (NetBird)."
|
echo "ufw aktiv: port $PORT, 22 og 22022 er åpne kun på wt0 (NetBird)."
|
||||||
echo "Vil du også nå sida fra lokalt LAN uten VPN:"
|
echo "Vil du også nå sida fra lokalt LAN uten VPN:"
|
||||||
echo " sudo ufw allow from <lan-subnett> to any port $PORT proto tcp"
|
echo " sudo ufw allow from <lan-subnett> to any port $PORT proto tcp"
|
||||||
elif sudo ufw status 2>/dev/null | grep -q "Status: active"; then
|
elif sudo ufw status 2>/dev/null | grep -q "Status: active"; then
|
||||||
sudo ufw allow "$PORT/tcp" comment "sg-announcer"
|
sudo ufw allow "$PORT/tcp" comment "$APP"
|
||||||
else
|
else
|
||||||
echo "ufw er ikke aktiv, ingen regel nødvendig."
|
echo "ufw er ikke aktiv, ingen regel nødvendig."
|
||||||
fi
|
fi
|
||||||
|
|
@ -102,7 +115,7 @@ fi
|
||||||
sleep 2
|
sleep 2
|
||||||
IP="$(hostname -I 2>/dev/null | awk '{print $1}')"
|
IP="$(hostname -I 2>/dev/null | awk '{print $1}')"
|
||||||
step "Ferdig"
|
step "Ferdig"
|
||||||
systemctl --user --no-pager status sg-announcer | head -5 || true
|
systemctl --user --no-pager status "$APP" | head -5 || true
|
||||||
cat <<MSG
|
cat <<MSG
|
||||||
|
|
||||||
Åpne http://${IP:-<denne-maskinens-ip>}:$PORT fra hva som helst på nettet.
|
Åpne http://${IP:-<denne-maskinens-ip>}:$PORT fra hva som helst på nettet.
|
||||||
|
|
@ -113,5 +126,5 @@ Tips for en laptop på arrangementet:
|
||||||
- Hindre at den sover med lokket igjen:
|
- Hindre at den sover med lokket igjen:
|
||||||
sudo sed -i 's/^#\?HandleLidSwitch=.*/HandleLidSwitch=ignore/' /etc/systemd/logind.conf
|
sudo sed -i 's/^#\?HandleLidSwitch=.*/HandleLidSwitch=ignore/' /etc/systemd/logind.conf
|
||||||
sudo systemctl restart systemd-logind
|
sudo systemctl restart systemd-logind
|
||||||
- Logg: journalctl --user -u sg-announcer -f
|
- Logg: journalctl --user -u $APP -f
|
||||||
MSG
|
MSG
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
[project]
|
[project]
|
||||||
name = "sg-announcer"
|
name = "announcer"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
description = "Add your description here"
|
description = "Tekst inn i nettleseren, forhåndslytt, og les meldingen ut på høyttaleranlegget"
|
||||||
requires-python = ">=3.13"
|
requires-python = ">=3.13"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"edge-tts>=7.2.8",
|
"edge-tts>=7.2.8",
|
||||||
|
|
@ -9,9 +9,7 @@ dependencies = [
|
||||||
"piper-tts>=1.8.0",
|
"piper-tts>=1.8.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
[project.scripts]
|
[tool.uv]
|
||||||
sg-announcer = "sg_announcer:main"
|
# Appen er noen løse .py-filer som kjøres på plass, ikke en pakke som skal
|
||||||
|
# bygges og installeres. Da slipper vi også et build-backend.
|
||||||
[build-system]
|
package = false
|
||||||
requires = ["uv_build>=0.12.17,<0.13.0"]
|
|
||||||
build-backend = "uv_build"
|
|
||||||
|
|
|
||||||
|
|
@ -1,2 +0,0 @@
|
||||||
def main() -> None:
|
|
||||||
print("Hello from sg-announcer!")
|
|
||||||
34
uv.lock
generated
34
uv.lock
generated
|
|
@ -146,6 +146,23 @@ wheels = [
|
||||||
{ url = "https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl", hash = "sha256:053243f8b92b990551949e63930a839ff0cf0b0ebbe0597b0f3fb19e1a0fe82e", size = 7490, upload-time = "2025-07-03T22:54:42.156Z" },
|
{ url = "https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl", hash = "sha256:053243f8b92b990551949e63930a839ff0cf0b0ebbe0597b0f3fb19e1a0fe82e", size = 7490, upload-time = "2025-07-03T22:54:42.156Z" },
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "announcer"
|
||||||
|
version = "0.1.0"
|
||||||
|
source = { virtual = "." }
|
||||||
|
dependencies = [
|
||||||
|
{ name = "edge-tts" },
|
||||||
|
{ name = "flask" },
|
||||||
|
{ name = "piper-tts" },
|
||||||
|
]
|
||||||
|
|
||||||
|
[package.metadata]
|
||||||
|
requires-dist = [
|
||||||
|
{ name = "edge-tts", specifier = ">=7.2.8" },
|
||||||
|
{ name = "flask", specifier = ">=3.1.3" },
|
||||||
|
{ name = "piper-tts", specifier = ">=1.8.0" },
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "attrs"
|
name = "attrs"
|
||||||
version = "26.1.0"
|
version = "26.1.0"
|
||||||
|
|
@ -774,23 +791,6 @@ wheels = [
|
||||||
{ url = "https://files.pythonhosted.org/packages/e4/04/d52c7016b04b6c5108f26691f9d33ec82a9b65d041f1a9c771137693d618/protobuf-7.36.2-py3-none-any.whl", hash = "sha256:bdb3a345d48db958e6ce1f18e508beb0cc981d64f24088427549c866cd039f1e", size = 179806, upload-time = "2026-09-17T20:07:58.211Z" },
|
{ url = "https://files.pythonhosted.org/packages/e4/04/d52c7016b04b6c5108f26691f9d33ec82a9b65d041f1a9c771137693d618/protobuf-7.36.2-py3-none-any.whl", hash = "sha256:bdb3a345d48db958e6ce1f18e508beb0cc981d64f24088427549c866cd039f1e", size = 179806, upload-time = "2026-09-17T20:07:58.211Z" },
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "sg-announcer"
|
|
||||||
version = "0.1.0"
|
|
||||||
source = { editable = "." }
|
|
||||||
dependencies = [
|
|
||||||
{ name = "edge-tts" },
|
|
||||||
{ name = "flask" },
|
|
||||||
{ name = "piper-tts" },
|
|
||||||
]
|
|
||||||
|
|
||||||
[package.metadata]
|
|
||||||
requires-dist = [
|
|
||||||
{ name = "edge-tts", specifier = ">=7.2.8" },
|
|
||||||
{ name = "flask", specifier = ">=3.1.3" },
|
|
||||||
{ name = "piper-tts", specifier = ">=1.8.0" },
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tabulate"
|
name = "tabulate"
|
||||||
version = "0.10.0"
|
version = "0.10.0"
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue