поправлены способ передачи таймеров в vMix

This commit is contained in:
2026-08-20 15:33:03 +03:00
parent 8790a1e113
commit cd9476d167
6 changed files with 420 additions and 117 deletions

View File

@@ -11,7 +11,7 @@ from typing import Any
DEFAULT_CONFIG: dict[str, Any] = {
"version": 21,
"version": 22,
"project_name": "Новый интерфейс",
"data_source": "golf",
"canvas": {
@@ -68,12 +68,15 @@ class UIBuilderManager:
except (OSError, json.JSONDecodeError, TypeError):
return deepcopy(DEFAULT_CONFIG)
had_legacy_shortcuts = self._has_legacy_hockey_component_shortcuts(raw)
try:
source_version = int(raw.get("version") or 0) if isinstance(raw, dict) else 0
except (TypeError, ValueError):
source_version = 0
normalized = self._normalize(raw)
if had_legacy_shortcuts:
# Build61 migration: remove old hidden component-level Space/Ctrl+R
# bindings from the persisted draft/published JSON. Shortcut Sequences
# are intentionally untouched, so an explicitly configured Space
# sequence remains available in the visible shortcut editor.
if had_legacy_shortcuts or source_version < 22:
# Build61: remove old hidden component-level Space/Ctrl+R bindings.
# BUILD90: persist the one-time v21 -> v22 native-countdown migration
# so old Text mirror timer steps stop producing per-second SetText traffic.
self.save(normalized, create_backup=False)
return normalized
@@ -159,7 +162,12 @@ class UIBuilderManager:
if not isinstance(config, dict):
return result
result["version"] = 21
source_version_raw = config.get("version", 0)
try:
source_version = int(source_version_raw or 0)
except (TypeError, ValueError):
source_version = 0
result["version"] = 22
result["project_name"] = str(config.get("project_name") or result["project_name"])
result["data_source"] = str(config.get("data_source") or result["data_source"])
@@ -426,8 +434,18 @@ class UIBuilderManager:
"scoreboard_alternate_selected_name": str(step.get("scoreboard_alternate_selected_name") or ""),
"game_timer_action_id": str(step.get("game_timer_action_id") or "hockey_game_timer"),
"hockey_timer_command": str(step.get("hockey_timer_command") or "toggle") if str(step.get("hockey_timer_command") or "toggle") in {"toggle", "start", "pause", "resume"} else "toggle",
"game_vmix_mode": str(step.get("game_vmix_mode") or "text") if str(step.get("game_vmix_mode") or "text") in {"countdown", "text"} else "text",
"penalty_vmix_mode": str(step.get("penalty_vmix_mode") or "text") if str(step.get("penalty_vmix_mode") or "text") in {"countdown", "text"} else "text",
# BUILD90: configs created before v22 used Text mirror as the default,
# which pushed timer text every second. Migrate those hockey timer
# sync steps once to native vMix countdown transport. From v22 onward
# an explicitly selected legacy Text mirror remains available.
"game_vmix_mode": (
"countdown" if source_version < 22 and step_type == "hockey_vmix_timers_start"
else (str(step.get("game_vmix_mode") or "countdown") if str(step.get("game_vmix_mode") or "countdown") in {"countdown", "text"} else "countdown")
),
"penalty_vmix_mode": (
"countdown" if source_version < 22 and step_type == "hockey_vmix_timers_start"
else (str(step.get("penalty_vmix_mode") or "countdown") if str(step.get("penalty_vmix_mode") or "countdown") in {"countdown", "text"} else "countdown")
),
"penalty_display_mode": "all" if str(step.get("penalty_display_mode") or "soonest") == "all" else "soonest",
"game_vmix_input": str(step.get("game_vmix_input") or ""),
"game_vmix_selected_name": str(step.get("game_vmix_selected_name") or ""),