Release: v3.1.0
Build Release Docker Image / build-amd64 (release) Successful in 6s
Build Release Docker Image / build-arm64 (release) Successful in 10s
Build Release Docker Image / publish-release-manifest (release) Successful in 6s

This commit is contained in:
Patrick Asmus
2026-09-16 20:22:34 +02:00
parent ce1ccb91bb
commit a9a9a89cba
26 changed files with 552 additions and 332 deletions
+22 -19
View File
@@ -17,6 +17,8 @@ from models import init_db, get_session, Job, Station, Recording as RecordingMod
from recorder import RecordingManager, format_elapsed
from scheduler import StreamScheduler
APP_VERSION = "3.0.0"
DATA_DIR = os.environ.get("DATA_DIR", "/app/data")
STATIC_DIR = os.environ.get("STATIC_DIR", "/app/frontend/static")
@@ -37,7 +39,7 @@ async def lifespan(app):
scheduler.stop()
app = FastAPI(title="stream-recorder", version="3.0.0", lifespan=lifespan)
app = FastAPI(title="stream-recorder", version=APP_VERSION, lifespan=lifespan)
app.add_middleware(
CORSMiddleware,
@@ -78,7 +80,7 @@ async def auth_middleware(request: Request, call_next):
@app.get("/api/health")
async def health():
return {"status": "ok", "version": "3.0.0"}
return {"status": "ok", "version": APP_VERSION}
# --- Jobs CRUD ---
@@ -198,14 +200,13 @@ class JobCreate(BaseModel):
schedule_start: str = ""
schedule_stop: str = ""
schedule_end_date: str = ""
pre_buffer: int = 0
post_buffer: int = 0
description: str = ""
ntfy_enabled: bool = False
plik_enabled: bool = False
delete_after_upload: bool = False
metadata_monitor_enabled: bool = False
metadata_pattern: str = ""
metadata_grace_period: int = 300
metadata_poll_interval: int = 30
station_id: Optional[int] = None
class JobUpdate(JobCreate):
@@ -217,6 +218,13 @@ async def list_jobs():
session = get_session()
try:
jobs = session.query(Job).order_by(Job.id).all()
station_ids = {j.station_id for j in jobs if j.station_id}
station_names = {}
if station_ids:
for s in session.query(Station).filter(Station.id.in_(station_ids)).all():
station_names[s.id] = s.name
result = []
for j in jobs:
is_recording = session.query(
@@ -239,14 +247,14 @@ async def list_jobs():
"schedule_start": j.schedule_start,
"schedule_stop": j.schedule_stop,
"schedule_end_date": j.schedule_end_date,
"pre_buffer": j.pre_buffer or 0,
"post_buffer": j.post_buffer or 0,
"description": j.description,
"ntfy_enabled": j.ntfy_enabled,
"plik_enabled": j.plik_enabled,
"delete_after_upload": j.delete_after_upload,
"metadata_monitor_enabled": j.metadata_monitor_enabled,
"metadata_pattern": j.metadata_pattern,
"metadata_grace_period": j.metadata_grace_period,
"metadata_poll_interval": j.metadata_poll_interval,
"station_id": j.station_id,
"station_name": station_names.get(j.station_id) if j.station_id else None,
"is_recording": is_recording,
"created_at": j.created_at.isoformat() if j.created_at else None,
})
@@ -282,13 +290,12 @@ async def get_job(job_id: int):
"schedule_enabled": job.schedule_enabled, "schedule_once": job.schedule_once,
"schedule_date": job.schedule_date, "schedule_days": job.schedule_days,
"schedule_start": job.schedule_start, "schedule_stop": job.schedule_stop,
"schedule_end_date": job.schedule_end_date, "description": job.description,
"schedule_end_date": job.schedule_end_date,
"pre_buffer": job.pre_buffer or 0, "post_buffer": job.post_buffer or 0,
"description": job.description,
"ntfy_enabled": job.ntfy_enabled,
"plik_enabled": job.plik_enabled, "delete_after_upload": job.delete_after_upload,
"metadata_monitor_enabled": job.metadata_monitor_enabled,
"metadata_pattern": job.metadata_pattern,
"metadata_grace_period": job.metadata_grace_period,
"metadata_poll_interval": job.metadata_poll_interval,
"station_id": job.station_id,
}
finally:
session.close()
@@ -354,10 +361,6 @@ async def start_job_recording(job_id: int):
"max_duration": duration, "extra_ffmpeg_args": job.extra_ffmpeg_args,
"segment_duration": job.segment_duration,
"description": job.description,
"metadata_monitor_enabled": job.metadata_monitor_enabled,
"metadata_pattern": job.metadata_pattern,
"metadata_grace_period": job.metadata_grace_period or 300,
"metadata_poll_interval": job.metadata_poll_interval or 30,
"ntfy_enabled": job.ntfy_enabled,
"plik_enabled": job.plik_enabled,
"delete_after_upload": job.delete_after_upload,