5778ac4645
Ampel / ampel (push) Successful in 29s
Zwei bewiesene Bug-Fixes:
- SMB-Mount 'Unable to apply new capability set': mount.cifs hebt
CAP_DAC_READ_SEARCH an, die in Dockers Default-Caps fehlt (auf der VM
reproduziert: Bounding-Set a82425fb ohne Bit 2; mit der Capability
verschwindet der Fehler). Fix: cap_add DAC_READ_SEARCH fuer den
api-Container.
- TMDB fiel still aus: Client konnte nur v4-Bearer-Tokens, der uebliche
32-Hex-v3-Key bekam 401 und die Suche lieferte nur OMDb. Jetzt beide
Key-Arten (ist_v4_token + api_key-Query-Param lt.
developer.themoviedb.org, mit Tests) — damit kommen auch die deutschen
Texte an (language=de-DE war ueberall schon gesetzt). Neu:
GET /metadata/status + 'Verbindung pruefen' in Einstellungen -> APIs
(Live-Check am Cache vorbei).
Features aus dem Commander-Feedback:
- 4K UHD als eigener Disc-Typ: classify >= 55 GiB (BD-66/BD-100; BD-50
bleibt bluray), beide detection.py + Tests, eigene Badge-Farbe in
Dashboard/Laufwerken, Prescan-Label '4K UHD'. UHD-Rip-Fehler 'Failed to
open disc' (Code 11) bekommt Klartext: LibreDrive-Firmware noetig.
- Vollautomatik (Setting autoRipStart): Disc erkannt -> Rip startet ohne
Popup in den Schnellwahl-Ordner (Serie->Serien, sonst Filme, CD->Musik).
- Job-Verwaltung: 'Neu komprimieren' nur noch mit can_retry (Rohdaten
liegen wirklich da), DELETE /jobs/{id} + 'Erledigte aufraeumen'
(Dateien bleiben immer), 'Alle herunterladen' im Job-Detail
(gestaffelte Einzel-Downloads statt Server-Zip von 40-GB-Dateien).
- Worker zuordenbar: WORKER_NAME-Env als stabiler Anzeigename (fixt auch
die Offline-Leichen nach Rebuilds), info.hostname/ip gemeldet,
Online-Abgleich ueber hostname, DELETE /workers/{name} + Papierkorb im
UI, Quelle-Anzeige an der Disc-Karte ('Quelle: TMDB - 99 % sicher').
- Ripping-Tab nach Medium gegliedert (Video/Audio-CD/Allgemein) +
Untertitel-Klartext (--all-audio/--all-subtitles bleiben komplett),
CD -> Musik-Vorauswahl im Ziel-Dialog, Ordner-Verwaltung beschriftet
und standardmaessig eingeklappt.
- Docs: SAVEPOINT v3.3, ROADMAP Etappe 14 + Ideen (nativer
Windows-Worker, deutsche OMDb-Texte via TMDB-Find), README.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
61 lines
1.7 KiB
Python
61 lines
1.7 KiB
Python
import os
|
|
import socket
|
|
|
|
from celery import Celery
|
|
from celery.signals import worker_ready
|
|
|
|
REDIS_URL = os.getenv("REDIS_URL", "redis://localhost:6379/0")
|
|
|
|
celery_app = Celery(
|
|
"rippy_worker",
|
|
broker=REDIS_URL,
|
|
backend=REDIS_URL,
|
|
include=["tasks"]
|
|
)
|
|
|
|
celery_app.conf.update(
|
|
task_serializer="json",
|
|
accept_content=["json"],
|
|
result_serializer="json",
|
|
timezone="UTC",
|
|
enable_utc=True,
|
|
broker_connection_retry_on_startup=True,
|
|
)
|
|
|
|
|
|
# Import auf Modulebene: im worker_ready-Signal ist /app nicht mehr
|
|
# zuverlässig im sys.path (ModuleNotFoundError 'caps', Deploy 23.07.).
|
|
import caps # noqa: E402
|
|
import db # noqa: E402
|
|
|
|
|
|
@worker_ready.connect
|
|
def melde_faehigkeiten(**kwargs):
|
|
"""Beim Start + minütlich: Encoder-Fähigkeiten und Lebenszeichen melden.
|
|
|
|
last_seen ist die Basis der Erreichbarkeits-Anzeige im UI — ein Worker,
|
|
der sich 2 Minuten nicht meldet, gilt als offline.
|
|
"""
|
|
import threading
|
|
import time
|
|
|
|
# Anzeigename: WORKER_NAME (compose/.env) macht die Maschine im UI
|
|
# zuordenbar UND stabil — der Container-Hostname wechselt bei jedem
|
|
# Rebuild und hinterließ Offline-Leichen in der Worker-Liste.
|
|
anzeigename = os.getenv("WORKER_NAME") or socket.gethostname()
|
|
|
|
def herzschlag():
|
|
while True:
|
|
try:
|
|
db.init_db()
|
|
db.save_worker(
|
|
anzeigename,
|
|
caps.erkenne_encoder(),
|
|
caps.werkzeug_versionen(),
|
|
)
|
|
except Exception as e: # DB weg → weiterversuchen, nicht sterben
|
|
print(f"Fähigkeiten-Meldung fehlgeschlagen: {e}")
|
|
time.sleep(60)
|
|
|
|
threading.Thread(target=herzschlag, daemon=True, name="worker-herzschlag").start()
|