From 911121e4631e8fd0ab02c275c8bc063bd6d65bd2 Mon Sep 17 00:00:00 2001 From: Ian Gulliver Date: Fri, 20 Feb 2026 21:14:50 -0700 Subject: [PATCH] Scene-based cue naming in mock show generator, stub validation for untimed blocks --- cmd/qrunproxy/mockshow.go | 89 ++++++++++++++++++++++----------------- cmd/qrunproxy/show.go | 6 +++ 2 files changed, 56 insertions(+), 39 deletions(-) diff --git a/cmd/qrunproxy/mockshow.go b/cmd/qrunproxy/mockshow.go index 4c6f7ad..693d8eb 100644 --- a/cmd/qrunproxy/mockshow.go +++ b/cmd/qrunproxy/mockshow.go @@ -79,62 +79,73 @@ func GenerateMockShow(numTracks, numCues, numBlocks int) *Show { placed := 0 cueIdx := 0 + scene := 0 for placed < numBlocks && cueIdx < numCues { - cue := &Block{ - ID: fmt.Sprintf("q%d", cueIdx*10), - Type: "cue", - Name: fmt.Sprintf("Q%d", cueIdx*10), - } - show.Blocks = append(show.Blocks, cue) - cueIdx++ + scene++ + cuesInScene := 2 + rng.IntN(3) - tracksThisCue := numTracks - rng.IntN(2) - perm := rng.Perm(numTracks) - - cueTargets := []TriggerTarget{} - for _, trackIdx := range perm[:tracksThisCue] { - if placed >= numBlocks { + for intra := 1; intra <= cuesInScene; intra++ { + if placed >= numBlocks || cueIdx >= numCues { break } - block := randBlock(trackIdx) - show.Blocks = append(show.Blocks, block) - cueTargets = append(cueTargets, TriggerTarget{Block: block.ID, Hook: "START"}) - placed++ - prev := block - chainLen := rng.IntN(3) - for range chainLen { + cue := &Block{ + ID: fmt.Sprintf("q%d", cueIdx), + Type: "cue", + Name: fmt.Sprintf("S%d Q%d", scene, intra), + } + show.Blocks = append(show.Blocks, cue) + cueIdx++ + + tracksThisCue := numTracks - rng.IntN(2) + perm := rng.Perm(numTracks) + + cueTargets := []TriggerTarget{} + for _, trackIdx := range perm[:tracksThisCue] { if placed >= numBlocks { break } - if !prev.hasDefinedTiming() { - break - } - next := randBlock(trackIdx) - show.Blocks = append(show.Blocks, next) - show.Triggers = append(show.Triggers, &Trigger{ - Source: TriggerSource{Block: prev.ID, Signal: "END"}, - Targets: []TriggerTarget{{Block: next.ID, Hook: "START"}}, - }) - prev = next + block := randBlock(trackIdx) + show.Blocks = append(show.Blocks, block) + cueTargets = append(cueTargets, TriggerTarget{Block: block.ID, Hook: "START"}) placed++ - } - } - if len(cueTargets) > 0 { - show.Triggers = append(show.Triggers, &Trigger{ - Source: TriggerSource{Block: cue.ID, Signal: "GO"}, - Targets: cueTargets, - }) + prev := block + chainLen := rng.IntN(3) + for range chainLen { + if placed >= numBlocks { + break + } + if !prev.hasDefinedTiming() { + break + } + next := randBlock(trackIdx) + show.Blocks = append(show.Blocks, next) + show.Triggers = append(show.Triggers, &Trigger{ + Source: TriggerSource{Block: prev.ID, Signal: "END"}, + Targets: []TriggerTarget{{Block: next.ID, Hook: "START"}}, + }) + prev = next + placed++ + } + } + + if len(cueTargets) > 0 { + show.Triggers = append(show.Triggers, &Trigger{ + Source: TriggerSource{Block: cue.ID, Signal: "GO"}, + Targets: cueTargets, + }) + } } } for cueIdx < numCues { + scene++ cue := &Block{ - ID: fmt.Sprintf("q%d", cueIdx*10), + ID: fmt.Sprintf("q%d", cueIdx), Type: "cue", - Name: fmt.Sprintf("Q%d", cueIdx*10), + Name: fmt.Sprintf("S%d Q1", scene), } show.Blocks = append(show.Blocks, cue) cueIdx++ diff --git a/cmd/qrunproxy/show.go b/cmd/qrunproxy/show.go index 9d5ddd1..a7f19f4 100644 --- a/cmd/qrunproxy/show.go +++ b/cmd/qrunproxy/show.go @@ -122,6 +122,12 @@ func (show *Show) Validate() error { if !startTargeted[block.ID] { return fmt.Errorf("block %q has no trigger for its START", block.ID) } + /* + TODO: Put this back when mock is fixed + if !block.hasDefinedTiming() && !hookTargeted[blockEvent{block.ID, "FADE_OUT"}] && !hookTargeted[blockEvent{block.ID, "END"}] { + return fmt.Errorf("block %q has no defined timing and nothing triggers its FADE_OUT or END", block.ID) + } + */ } for _, trigger := range show.Triggers {