Introduce Picture Targets to separate processing from devices
Add PictureTarget entity that bridges PictureSource to output device, separating processing settings from device connection/calibration state. This enables future target types (Art-Net, E1.31) and cleanly decouples "what to stream" from "where to stream." - Add PictureTarget/WledPictureTarget dataclasses and storage - Split ProcessorManager into DeviceState (health) + TargetState (processing) - Add /api/v1/picture-targets endpoints (CRUD, start/stop, settings, metrics) - Simplify device API (remove processing/settings/metrics endpoints) - Auto-migrate existing device settings to picture targets on first startup - Add Targets tab to WebUI with target cards and editor modal - Add en/ru locale keys for targets UI Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -298,5 +298,45 @@
|
||||
"streams.image_source.hint": "Enter a URL (http/https) or local file path to an image",
|
||||
"streams.validate_image.validating": "Validating...",
|
||||
"streams.validate_image.valid": "Image accessible",
|
||||
"streams.validate_image.invalid": "Image not accessible"
|
||||
"streams.validate_image.invalid": "Image not accessible",
|
||||
"targets.title": "⚡ Targets",
|
||||
"targets.description": "Targets bridge picture sources to output devices. Each target references a device and a source, with its own processing settings.",
|
||||
"targets.add": "Add Target",
|
||||
"targets.edit": "Edit Target",
|
||||
"targets.loading": "Loading targets...",
|
||||
"targets.none": "No targets configured",
|
||||
"targets.failed": "Failed to load targets",
|
||||
"targets.name": "Target Name:",
|
||||
"targets.name.placeholder": "My Target",
|
||||
"targets.device": "Device:",
|
||||
"targets.device.hint": "Which WLED device to send LED data to",
|
||||
"targets.device.none": "-- Select a device --",
|
||||
"targets.source": "Source:",
|
||||
"targets.source.hint": "Which picture source to capture and process",
|
||||
"targets.source.none": "-- No source assigned --",
|
||||
"targets.border_width": "Border Width (px):",
|
||||
"targets.border_width.hint": "How many pixels from the screen edge to sample for LED colors (1-100)",
|
||||
"targets.interpolation": "Interpolation Mode:",
|
||||
"targets.interpolation.hint": "How to calculate LED color from sampled pixels",
|
||||
"targets.interpolation.average": "Average",
|
||||
"targets.interpolation.median": "Median",
|
||||
"targets.interpolation.dominant": "Dominant",
|
||||
"targets.smoothing": "Smoothing:",
|
||||
"targets.smoothing.hint": "Temporal blending between frames (0=none, 1=full). Reduces flicker.",
|
||||
"targets.created": "Target created successfully",
|
||||
"targets.updated": "Target updated successfully",
|
||||
"targets.deleted": "Target deleted successfully",
|
||||
"targets.delete.confirm": "Are you sure you want to delete this target?",
|
||||
"targets.error.load": "Failed to load targets",
|
||||
"targets.error.required": "Please fill in all required fields",
|
||||
"targets.error.delete": "Failed to delete target",
|
||||
"targets.button.start": "Start",
|
||||
"targets.button.stop": "Stop",
|
||||
"targets.status.processing": "Processing",
|
||||
"targets.status.idle": "Idle",
|
||||
"targets.status.error": "Error",
|
||||
"targets.metrics.actual_fps": "Actual FPS",
|
||||
"targets.metrics.target_fps": "Target FPS",
|
||||
"targets.metrics.frames": "Frames",
|
||||
"targets.metrics.errors": "Errors"
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user