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:
Kent 2026-10-08 15:42:36 +02:00
parent 3f37b0a7fb
commit f191fb2b90
6 changed files with 51 additions and 42 deletions

View file

@ -1,9 +1,9 @@
#!/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
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

View file

@ -3,7 +3,7 @@
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>SG Announcer</title>
<title>Announcer</title>
<style>
:root {
--bg: #0e1116; --panel: #171c24; --panel2: #1f2631; --line: #2a3340;
@ -62,7 +62,7 @@
</head>
<body>
<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>
<div class="card" id="pinbox">

View file

@ -1,8 +1,8 @@
#!/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
# cd sg-announcer && ./install.sh
# git clone https://git.1x1.no/kent/announcer.git
# cd announcer && ./install.sh
#
# Kjør som vanlig bruker (ikke sudo); skriptet spør om passord der det trengs.
# Valgfritt: ANNOUNCER_PIN=1234 ./install.sh -> sida krever PIN
@ -15,11 +15,13 @@ if [[ $EUID -eq 0 ]]; then
exit 1
fi
APP="announcer"
OLD_APP="sg-announcer" # het dette før; enheten ryddes bort nedenfor
REPO_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PORT="${ANNOUNCER_PORT:-8090}"
PIN="${ANNOUNCER_PIN:-}"
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' "$*"; }
@ -49,12 +51,22 @@ mkdir -p cache chimes voices
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()"
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"
mkdir -p "$UNIT_DIR"
{
cat <<UNIT
[Unit]
Description=SG Announcer – TTS-utrop på høyttaleranlegget
Description=Announcer – TTS-utrop på høyttaleranlegget
After=pipewire.service pulseaudio.service
[Service]
@ -76,9 +88,10 @@ RestartSec=3
WantedBy=default.target
UNIT
} > "$UNIT"
chmod 600 "$UNIT" # PIN står i klartekst her
systemctl --user daemon-reload
systemctl --user enable --now sg-announcer
systemctl --user restart sg-announcer
systemctl --user enable --now "$APP"
systemctl --user restart "$APP"
step "Brannmur"
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 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 "$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 --force enable
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 " sudo ufw allow from <lan-subnett> to any port $PORT proto tcp"
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
echo "ufw er ikke aktiv, ingen regel nødvendig."
fi
@ -102,7 +115,7 @@ fi
sleep 2
IP="$(hostname -I 2>/dev/null | awk '{print $1}')"
step "Ferdig"
systemctl --user --no-pager status sg-announcer | head -5 || true
systemctl --user --no-pager status "$APP" | head -5 || true
cat <<MSG
Å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:
sudo sed -i 's/^#\?HandleLidSwitch=.*/HandleLidSwitch=ignore/' /etc/systemd/logind.conf
sudo systemctl restart systemd-logind
- Logg: journalctl --user -u sg-announcer -f
- Logg: journalctl --user -u $APP -f
MSG

View file

@ -1,7 +1,7 @@
[project]
name = "sg-announcer"
name = "announcer"
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"
dependencies = [
"edge-tts>=7.2.8",
@ -9,9 +9,7 @@ dependencies = [
"piper-tts>=1.8.0",
]
[project.scripts]
sg-announcer = "sg_announcer:main"
[build-system]
requires = ["uv_build>=0.12.17,<0.13.0"]
build-backend = "uv_build"
[tool.uv]
# 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.
package = false

View file

@ -1,2 +0,0 @@
def main() -> None:
print("Hello from sg-announcer!")

34
uv.lock generated
View file

@ -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" },
]
[[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]]
name = "attrs"
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" },
]
[[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]]
name = "tabulate"
version = "0.10.0"