Durchsicht: Robustheit bei Neuinstallationen
- auth.py: .env auch in schreibgeschütztem Ordner aktualisieren (Server-Login) - Controller: ohne Spotify-Login warten statt abstürzen; Playlist darf fehlen; nicht abspielbare Wünsche überspringen statt hängen zu bleiben - install-server.sh: alle SSH-Ports freigeben (kein Aussperren), curl und python3-systemd (fail2ban) installieren - install-player.sh: Bluetooth per rfkill entsperren und Dienst starten Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
+28
-4
@@ -14,7 +14,7 @@ Ist der Server nicht erreichbar, läuft einfach die Grund-Playlist weiter.
|
||||
Bedienung über die Spotify-App bleibt möglich: Fremde Titel werden erkannt und
|
||||
geduldet, eine Pause durch den Besitzer (App oder Admin-Bereich) wird respektiert.
|
||||
|
||||
Aufruf: .venv/bin/python controller.py
|
||||
Aufruf: .venv/bin/python controller.py --env /opt/audiofy/config/.env
|
||||
"""
|
||||
|
||||
import argparse
|
||||
@@ -247,7 +247,7 @@ class Controller:
|
||||
|
||||
def naechster_eintrag(self) -> Eintrag:
|
||||
wunsch = self.server.naechster_wunsch() if self.server else None
|
||||
if wunsch and (wunsch.priority or self.seit_wunsch >= self.n - 1):
|
||||
if wunsch and (wunsch.priority or self.seit_wunsch >= self.n - 1) and self._abspielbar(wunsch):
|
||||
eintrag = Eintrag(wunsch.uri, "owner" if wunsch.priority else "wish", wunsch)
|
||||
else:
|
||||
# kein (fälliger) Wunsch → Playlist weiter, Zähler bleibt "fällig"
|
||||
@@ -265,6 +265,21 @@ class Controller:
|
||||
log.warning("Metadaten für %s nicht abrufbar (%s) – Vergleich nur per URI", eintrag.uri, e)
|
||||
return eintrag
|
||||
|
||||
def _abspielbar(self, wunsch: Wunsch) -> bool:
|
||||
"""Ein bei Spotify nicht (mehr) abspielbarer Wunsch würde den Controller blockieren → überspringen."""
|
||||
try:
|
||||
titel = self.sp.titel(wunsch.uri)
|
||||
except SpotifyFehler as e:
|
||||
if e.status not in (400, 404):
|
||||
return True # vorübergehender Fehler – Wunsch nicht verwerfen
|
||||
titel = {"is_playable": False}
|
||||
if titel.get("is_playable", True):
|
||||
return True
|
||||
log.warning("Wunsch %s ist bei Spotify nicht abspielbar – wird übersprungen", wunsch.uri)
|
||||
if self.server:
|
||||
self.server.wunsch_gespielt(wunsch) # aus der Warteschlange nehmen
|
||||
return False
|
||||
|
||||
def geraet_id(self) -> str | None:
|
||||
for geraet in self.sp.geraete():
|
||||
if geraet.get("name") == self.geraetename:
|
||||
@@ -703,7 +718,15 @@ def main() -> None:
|
||||
format="%(levelname)-7s %(message)s" if unter_systemd else "%(asctime)s %(levelname)-7s %(message)s")
|
||||
logging.getLogger("httpx").setLevel(logging.WARNING) # keine Request-URLs im Log
|
||||
|
||||
env = env_lesen(args.env)
|
||||
# Ohne Spotify-Zugang nicht abstürzen (systemd würde endlos neu starten), sondern warten
|
||||
while True:
|
||||
env = env_lesen(args.env)
|
||||
fehlend = [k for k in ("SPOTIFY_CLIENT_ID", "SPOTIFY_CLIENT_SECRET", "SPOTIFY_REFRESH_TOKEN") if not env.get(k)]
|
||||
if not fehlend:
|
||||
break
|
||||
log.error("In %s fehlt %s – Spotify-Login nachholen: auth.py --profil player --env %s "
|
||||
"(siehe README). Neuer Versuch in 60 s.", args.env, ", ".join(fehlend), args.env)
|
||||
time.sleep(60)
|
||||
sp = SpotifyClient(env["SPOTIFY_CLIENT_ID"], env["SPOTIFY_CLIENT_SECRET"], env["SPOTIFY_REFRESH_TOKEN"],
|
||||
neuer_refresh_token=lambda t: env_setzen(args.env, "SPOTIFY_REFRESH_TOKEN", t))
|
||||
# alte Namen (VPS_URL, PI_API_TOKEN) weiter akzeptieren
|
||||
@@ -714,7 +737,8 @@ def main() -> None:
|
||||
log.warning("SERVER_URL/PLAYER_API_TOKEN fehlen – nur Grund-Playlist, keine Wünsche")
|
||||
controller = Controller(
|
||||
sp,
|
||||
Playlist(sp, env["SPOTIFY_PLAYLIST_ID"], int(env.get("PLAYLIST_REPEAT_PERCENT") or 50)),
|
||||
# Playlist darf fehlen, wenn sie vom Server kommt
|
||||
Playlist(sp, env.get("SPOTIFY_PLAYLIST_ID", ""), int(env.get("PLAYLIST_REPEAT_PERCENT") or 50)),
|
||||
server,
|
||||
n=int(env.get("WISH_EVERY_N") or 3),
|
||||
geraetename=env.get("DEVICE_NAME") or "Audiofy",
|
||||
|
||||
Reference in New Issue
Block a user