TRACKS OUT copies to Woonsocket too (ready.locations AB, SC, WS); config synced from NA (Resi event times set on the settings page); tests pin their own Resi times

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-27 11:32:18 -04:00
co-authored by Claude Opus 5.5
parent b3e4d77180
commit caeee9179b
3 changed files with 243 additions and 239 deletions
+1 -1
View File
@@ -163,7 +163,7 @@ everything on the page at once.
| BKGDS | every song has at least one slide with a background | looks again | | BKGDS | every song has at least one slide with a background | looks again |
| LED CROSS | every Resolume column Sunday's playlist calls up has content: each slide's macro (read from the ProPresenter Mac's `Macros` and `.pro` files) sends RossTalk `CC page/row/col` to Companion, that button (and the buttons it presses, e.g. page 17 → page 6 "Arena") sends `/composition/columns/N/connect`; **COL 11 EMPTY** names the column and the items that use it. Also: Resolume on the **Service** deck. | selects the Service deck, then looks again (an empty column is filled in Resolume) | | LED CROSS | every Resolume column Sunday's playlist calls up has content: each slide's macro (read from the ProPresenter Mac's `Macros` and `.pro` files) sends RossTalk `CC page/row/col` to Companion, that button (and the buttons it presses, e.g. page 17 → page 6 "Arena") sends `/composition/columns/N/connect`; **COL 11 EMPTY** names the column and the items that use it. Also: Resolume on the **Service** deck. | selects the Service deck, then looks again (an empty column is filled in Resolume) |
| LINEUP TV | ProdDash's Band Lineup shows this plan, nobody who is not on it or who declined, and everyone on the Band and Communication teams | re-syncs the board from Planning Center | | LINEUP TV | ProdDash's Band Lineup shows this plan, nobody who is not on it or who declined, and everyone on the Band and Communication teams | re-syncs the board from Planning Center |
| TRACKS OUT | every location in `"locations"` (AB, SC) has this weekend's project folder | copies NA's project to the locations that have none (as `261018 AB Project`, without `Backup/`). It is copied under a temporary name and renamed at the end, so a half-finished copy never looks sent. It never overwrites a folder that is already there and never runs by itself. | | TRACKS OUT | every location in `"locations"` (AB, SC, WS) has this weekend's project folder | copies NA's project to the locations that have none (as `261018 AB Project`, without `Backup/`). It is copied under a temporary name and renamed at the end, so a half-finished copy never looks sent. It never overwrites a folder that is already there and never runs by itself. |
| PROP OUT | a `.probundle` is in this weekend's folder of the Chronicles share (`/Volumes/Location Assets/261025`, read on the ProPresenter Mac). **SHARE NOT MOUNTED**: the share itself is not mounted there (2026-10-22: it had dropped off and the key said NOT IN 261025 although the bundle was there). The ProP Mac keeps it mounted by itself: a LaunchAgent (`org.waterschurch.keep-mounted.location-assets`, from `remote-access/mac-keep-mounted.sh`) looks every minute and at login, mounts it again with the Chronicles login saved in the Keychain, and unmounts and remounts it when it hangs after sleep or a network drop (log: `~/Library/Logs/keep-mounted-location-assets.log` on the ProP Mac). | starts that agent now and waits for the share (about 6 s), then looks again. Also an auto-fix. | | PROP OUT | a `.probundle` is in this weekend's folder of the Chronicles share (`/Volumes/Location Assets/261025`, read on the ProPresenter Mac). **SHARE NOT MOUNTED**: the share itself is not mounted there (2026-10-22: it had dropped off and the key said NOT IN 261025 although the bundle was there). The ProP Mac keeps it mounted by itself: a LaunchAgent (`org.waterschurch.keep-mounted.location-assets`, from `remote-access/mac-keep-mounted.sh`) looks every minute and at login, mounts it again with the Chronicles login saved in the Keychain, and unmounts and remounts it when it hangs after sleep or a network drop (log: `~/Library/Logs/keep-mounted-location-assets.log` on the ProP Mac). | starts that agent now and waits for the share (about 6 s), then looks again. Also an auto-fix. |
| RESI VOX | the Resi song (PCO description says RESI, else the last song before the message) goes to the locations with its lead singer's mic: the lead from the description ("Genesis lead"), their VOX from the lineup screen ("[VOX 4] MIX 4"; PCO team positions if the lineup has none), against what the Resi AJA's `5 - Lead Vocal` channel (21) really receives, read from the card with Dante's own query (UDP 4440, read only). **RESI V2 NOT VOX 4** (red). Two leads ("Mike and DJ lead"): the song's Audio note in PCO says whose mic goes out ("V3" or a name); without one it is flagged, never switched: **2 LEADS: MIKE DJ**. Also only flagged: **JOSH NOT ON LINEUP**, **LEAD ON VOX 5: NO BUTTON**. The lineup is what counts: a PCO Audio note naming another VOX is only mentioned in the details. | presses that VOX's AJA button (Companion page 13, row 3, col 1-4: AJA ch 21 <- BOH-AD4Q-A ch n), then reads the AJA back. Also an auto-fix (any time, never while a deck records: the READY page is not looked at then). | | RESI VOX | the Resi song (PCO description says RESI, else the last song before the message) goes to the locations with its lead singer's mic: the lead from the description ("Genesis lead"), their VOX from the lineup screen ("[VOX 4] MIX 4"; PCO team positions if the lineup has none), against what the Resi AJA's `5 - Lead Vocal` channel (21) really receives, read from the card with Dante's own query (UDP 4440, read only). **RESI V2 NOT VOX 4** (red). Two leads ("Mike and DJ lead"): the song's Audio note in PCO says whose mic goes out ("V3" or a name); without one it is flagged, never switched: **2 LEADS: MIKE DJ**. Also only flagged: **JOSH NOT ON LINEUP**, **LEAD ON VOX 5: NO BUTTON**. The lineup is what counts: a PCO Audio note naming another VOX is only mentioned in the details. | presses that VOX's AJA button (Companion page 13, row 3, col 1-4: AJA ch 21 <- BOH-AD4Q-A ch n), then reads the AJA back. Also an auto-fix (any time, never while a deck records: the READY page is not looked at then). |
| START | every service Planning Center lists this week (this location's Sunday and every special service: First / Together Tuesday, Morning Worship, ...) has its Ableton set. **NO SET SUN 11/1** (red when due): hold START. While it builds the key shows what it is doing (**SAVING JEHOVAH**, **COPYING 40/120**). **CONSOLIDATE THE LORD IS**: the saved set still has clips of that song transposed and not consolidated (read from the set file, so it goes once the set is saved consolidated). After a build, for a day: **NEW SONG GRACE** (not in Finished Songs: build it by hand, page 3 of the workflow PDF). See *START* below. | builds the missing sets (on the Tracks Mac, in the background), then consolidates every transposed clip in Live (step 9 below). Never runs by itself. | | START | every service Planning Center lists this week (this location's Sunday and every special service: First / Together Tuesday, Morning Worship, ...) has its Ableton set. **NO SET SUN 11/1** (red when due): hold START. While it builds the key shows what it is doing (**SAVING JEHOVAH**, **COPYING 40/120**). **CONSOLIDATE THE LORD IS**: the saved set still has clips of that song transposed and not consolidated (read from the set file, so it goes once the set is saved consolidated). After a build, for a day: **NEW SONG GRACE** (not in Finished Songs: build it by hand, page 3 of the workflow PDF). See *START* below. | builds the missing sets (on the Tracks Mac, in the background), then consolidates every transposed clip in Live (step 9 below). Never runs by itself. |
+239 -238
View File
@@ -5,13 +5,13 @@
"library": "~/Library/Application Support/companion/modules/bmd-atem-*/node_modules/atem-connection", "library": "~/Library/Application Support/companion/modules/bmd-atem-*/node_modules/atem-connection",
"node": "/Applications/Companion [0-9]*.app/Contents/Resources/node-runtimes/node22/bin/node", "node": "/Applications/Companion [0-9]*.app/Contents/Resources/node-runtimes/node22/bin/node",
"reference": "atem-reference.xml", "reference": "atem-reference.xml",
"source_folder": "~/Library/CloudStorage/GoogleDrive-media@waterschurch.org/Shared drives/Waters Creative/Production Team/Backup/NA/ATEM",
"silence": { "silence": {
"inputs": { "inputs": {
"16": "Resi - RX1" "16": "Resi - RX1"
}, },
"seconds": 30 "seconds": 30
} },
"source_folder": "~/Library/CloudStorage/GoogleDrive-media@waterschurch.org/Shared drives/Waters Creative/Production Team/Backup/NA/ATEM"
}, },
"auto_fix": { "auto_fix": {
"after_seconds": 20, "after_seconds": 20,
@@ -90,6 +90,20 @@
] ]
}, },
"fixes": { "fixes": {
"ableset": {
"host": "tracks",
"kind": "ssh",
"label": "start AbleSet on the Tracks Mac if it is not running (minimized, for ProdDash)",
"params": {
"app": "AbleSet",
"host": "tracks",
"minimized": true,
"process": "AbleSet"
},
"run": "pgrep -xq AbleSet || { open -g -a AbleSet; i=0; while [ $i -lt 20 ]; do sleep 1; i=$((i+1)); n=$(osascript -e 'tell application \"System Events\" to count windows of process \"AbleSet\"' 2>/dev/null); if [ \"${n:-0}\" -gt 0 ]; then osascript -e 'tell application \"System Events\" to tell process \"AbleSet\" to set value of attribute \"AXMinimized\" of every window to true' >/dev/null 2>&1; break; fi; done; }",
"short": "ABLESET",
"template": "mac_start"
},
"ableton": { "ableton": {
"host": "tracks", "host": "tracks",
"kind": "ssh", "kind": "ssh",
@@ -338,9 +352,15 @@
"process": "ProPresenter", "process": "ProPresenter",
"wait_seconds": 10 "wait_seconds": 10
}, },
"run": "APP=$(for a in /Applications/ProPresenter*.app; do [ -d \"$a\" ] && printf '%s|%s\\n' \"$(defaults read \"$a/Contents/Info\" CFBundleShortVersionString 2>/dev/null)\" \"$a\"; done | sort -t '|' -k1,1V | tail -1 | cut -d '|' -f2-); pkill -TERM -x ProPresenter; i=0; while pgrep -xq ProPresenter && [ $i -lt 20 ]; do sleep 0.5; i=$((i+1)); done; pgrep -xq ProPresenter && pkill -KILL -x ProPresenter; sleep 1; open \"$APP\"",
"short": "PROPRES", "short": "PROPRES",
"template": "mac_restart", "template": "mac_restart"
"run": "APP=$(for a in /Applications/ProPresenter*.app; do [ -d \"$a\" ] && printf '%s|%s\\n' \"$(defaults read \"$a/Contents/Info\" CFBundleShortVersionString 2>/dev/null)\" \"$a\"; done | sort -t '|' -k1,1V | tail -1 | cut -d '|' -f2-); pkill -TERM -x ProPresenter; i=0; while pgrep -xq ProPresenter && [ $i -lt 20 ]; do sleep 0.5; i=$((i+1)); done; pgrep -xq ProPresenter && pkill -KILL -x ProPresenter; sleep 1; open \"$APP\"" },
"ready_ableton_mix": {
"action": "ableton_mix",
"kind": "ready",
"label": "put Ableton's stems back where the routing template says and their in-ear send (A) to 0 dB",
"short": "MIX"
}, },
"ready_copy_tracks": { "ready_copy_tracks": {
"action": "copy_tracks", "action": "copy_tracks",
@@ -355,6 +375,13 @@
"label": "put Resolume back on the Service deck, then look at the columns again", "label": "put Resolume back on the Service deck, then look at the columns again",
"short": "CROSS" "short": "CROSS"
}, },
"ready_light_timing": {
"action": "light_timing",
"kind": "ready",
"label": "move the lighting cues that are off onto the drum hit in the open Ableton set (then save the set)",
"never_auto": true,
"short": "CUES"
},
"ready_lineup": { "ready_lineup": {
"action": "lineup_sync", "action": "lineup_sync",
"kind": "ready", "kind": "ready",
@@ -368,12 +395,32 @@
"label": "write each song's timecode from the tracks into its LTC note in Planning Center", "label": "write each song's timecode from the tracks into its LTC note in Planning Center",
"short": "LTC" "short": "LTC"
}, },
"ready_mount_share": {
"action": "mount_share",
"kind": "ready",
"label": "mount Location Assets again on the ProPresenter Mac (its keep-mounted agent), then look for the bundle again",
"short": "MOUNT"
},
"ready_recheck": { "ready_recheck": {
"action": "recheck", "action": "recheck",
"kind": "ready", "kind": "ready",
"label": "look at this weekend's checklist again now", "label": "look at this weekend's checklist again now",
"short": "CHECK" "short": "CHECK"
}, },
"ready_resi_vox": {
"action": "resi_vox",
"anytime": true,
"kind": "ready",
"label": "send the Resi song's lead singer's mic over Resi: press their VOX AJA button on page 13 (from PCO's lead and the lineup screen)",
"short": "RESI VOX"
},
"ready_start": {
"action": "start_week",
"kind": "ready",
"label": "build this week's Ableton sets (Sunday and special services) from Planning Center",
"never_auto": true,
"short": "START"
},
"rtpmidi_start": { "rtpmidi_start": {
"host": "lighting", "host": "lighting",
"kind": "ssh", "kind": "ssh",
@@ -506,53 +553,6 @@
"run": "tasklist /NH /FI \"IMAGENAME eq Vista.exe\" | find /I \"Vista.exe\" >nul || (schtasks /Run /TN \"\\StatusPanel\\Start Vista\" >nul && ping -n 9 127.0.0.1 >nul && tasklist /NH /FI \"IMAGENAME eq Vista.exe\" | find /I \"Vista.exe\" >nul)", "run": "tasklist /NH /FI \"IMAGENAME eq Vista.exe\" | find /I \"Vista.exe\" >nul || (schtasks /Run /TN \"\\StatusPanel\\Start Vista\" >nul && ping -n 9 127.0.0.1 >nul && tasklist /NH /FI \"IMAGENAME eq Vista.exe\" | find /I \"Vista.exe\" >nul)",
"short": "VISTA", "short": "VISTA",
"template": "win_start" "template": "win_start"
},
"ready_ableton_mix": {
"action": "ableton_mix",
"kind": "ready",
"label": "put Ableton's stems back where the routing template says and their in-ear send (A) to 0 dB",
"short": "MIX"
},
"ready_light_timing": {
"action": "light_timing",
"kind": "ready",
"never_auto": true,
"short": "CUES",
"label": "move the lighting cues that are off onto the drum hit in the open Ableton set (then save the set)"
},
"ready_mount_share": {
"action": "mount_share",
"kind": "ready",
"short": "MOUNT",
"label": "mount Location Assets again on the ProPresenter Mac (its keep-mounted agent), then look for the bundle again"
},
"ready_start": {
"action": "start_week",
"kind": "ready",
"label": "build this week's Ableton sets (Sunday and special services) from Planning Center",
"never_auto": true,
"short": "START"
},
"ableset": {
"host": "tracks",
"kind": "ssh",
"label": "start AbleSet on the Tracks Mac if it is not running (minimized, for ProdDash)",
"params": {
"host": "tracks",
"process": "AbleSet",
"app": "AbleSet",
"minimized": true
},
"run": "pgrep -xq AbleSet || { open -g -a AbleSet; i=0; while [ $i -lt 20 ]; do sleep 1; i=$((i+1)); n=$(osascript -e 'tell application \"System Events\" to count windows of process \"AbleSet\"' 2>/dev/null); if [ \"${n:-0}\" -gt 0 ]; then osascript -e 'tell application \"System Events\" to tell process \"AbleSet\" to set value of attribute \"AXMinimized\" of every window to true' >/dev/null 2>&1; break; fi; done; }",
"short": "ABLESET",
"template": "mac_start"
},
"ready_resi_vox": {
"action": "resi_vox",
"kind": "ready",
"anytime": true,
"short": "RESI VOX",
"label": "send the Resi song's lead singer's mic over Resi: press their VOX AJA button on page 13 (from PCO's lead and the lineup screen)"
} }
}, },
"flap": { "flap": {
@@ -912,10 +912,17 @@
"ssh": "studio@10.1.7.39" "ssh": "studio@10.1.7.39"
} }
}, },
"nav_hold_more": [
{
"ms": 3000,
"page": 98
}
],
"nav_hold_ms": 2000, "nav_hold_ms": 2000,
"nav_keys": [ "nav_keys": [
"pagenum" "pagenum"
], ],
"nav_locations_band": true,
"nav_tap_page": 1, "nav_tap_page": 1,
"network": { "network": {
"burst_connections": 4, "burst_connections": 4,
@@ -929,6 +936,7 @@
"page_hold_ms": 2000, "page_hold_ms": 2000,
"page_name": "19\\nStatus", "page_name": "19\\nStatus",
"ready": { "ready": {
"ableton_osc": true,
"due": [ "due": [
{ {
"days": [ "days": [
@@ -952,8 +960,18 @@
"start": "05:00" "start": "05:00"
} }
], ],
"ears_send": 0,
"ears_skip_groups": [
"RESI TRACKS",
"MIDI GROUP"
],
"finished_folders": [
"~/Library/CloudStorage/GoogleDrive-media@waterschurch.org/Shared drives/Waters Creative/Ableton/Finished Songs",
"~/Library/CloudStorage/GoogleDrive-media@waterschurch.org/Shared drives/Waters Creative/Ableton/Finished Custom Songs"
],
"folder_format": "{date} {loc} Project", "folder_format": "{date} {loc} Project",
"interval_seconds": 120, "interval_seconds": 120,
"light_library": "~/Library/CloudStorage/GoogleDrive-media@waterschurch.org/Shared drives/Waters Creative/Ableton/LIGHTING CUES MIDI",
"lighting_track": "LIGHTING CUES", "lighting_track": "LIGHTING CUES",
"lineup_skip_positions": [], "lineup_skip_positions": [],
"lineup_teams": [ "lineup_teams": [
@@ -963,7 +981,8 @@
"lineup_url": "http://127.0.0.1:24500/api/modules/band-lineup", "lineup_url": "http://127.0.0.1:24500/api/modules/band-lineup",
"locations": [ "locations": [
"AB", "AB",
"SC" "SC",
"WS"
], ],
"ltc_campuses": [ "ltc_campuses": [
{ {
@@ -1016,26 +1035,35 @@
"prop_url": "http://10.1.14.225:1025", "prop_url": "http://10.1.14.225:1025",
"remote_timeout": 90, "remote_timeout": 90,
"reset_day": "mon", "reset_day": "mon",
"resi_vox": {
"aja": "STUDIO-A-Resi-AJA-SDI",
"buttons": {
"1": [
13,
3,
1
],
"2": [
13,
3,
2
],
"3": [
13,
3,
3
],
"4": [
13,
3,
4
]
},
"channel": 21,
"mics": "BOH-AD4Q-A"
},
"resolume_deck": "Service", "resolume_deck": "Service",
"resolume_url": "http://10.1.10.206:8080", "resolume_url": "http://10.1.10.206:8080",
"site_folder": "NA",
"skip_songs": [],
"tracks_host": "tracks",
"vocal_positions": [
"Vocalist",
"[Leader]"
],
"finished_folders": [
"~/Library/CloudStorage/GoogleDrive-media@waterschurch.org/Shared drives/Waters Creative/Ableton/Finished Songs",
"~/Library/CloudStorage/GoogleDrive-media@waterschurch.org/Shared drives/Waters Creative/Ableton/Finished Custom Songs"
],
"tune_library": "~/Library/CloudStorage/GoogleDrive-media@waterschurch.org/Shared drives/Waters Creative/Ableton/Waves Tune - midi Program Change",
"ableton_osc": true,
"ears_send": 0,
"ears_skip_groups": [
"RESI TRACKS",
"MIDI GROUP"
],
"routing": { "routing": {
"+GUIDE": [ "+GUIDE": [
"Ext. Out", "Ext. Out",
@@ -1230,34 +1258,14 @@
"11/12 VOX" "11/12 VOX"
] ]
}, },
"light_library": "~/Library/CloudStorage/GoogleDrive-media@waterschurch.org/Shared drives/Waters Creative/Ableton/LIGHTING CUES MIDI", "site_folder": "NA",
"resi_vox": { "skip_songs": [],
"aja": "STUDIO-A-Resi-AJA-SDI", "tracks_host": "tracks",
"channel": 21, "tune_library": "~/Library/CloudStorage/GoogleDrive-media@waterschurch.org/Shared drives/Waters Creative/Ableton/Waves Tune - midi Program Change",
"mics": "BOH-AD4Q-A", "vocal_positions": [
"buttons": { "Vocalist",
"1": [ "[Leader]"
13, ]
3,
1
],
"2": [
13,
3,
2
],
"3": [
13,
3,
3
],
"4": [
13,
3,
4
]
}
}
}, },
"ready_page": { "ready_page": {
"back_pos": [ "back_pos": [
@@ -1479,78 +1487,78 @@
] ]
}, },
{ {
"checks": [
{
"fix": "ready_light_timing",
"item": "light_timing",
"type": "ready"
}
],
"id": "rd_light_time", "id": "rd_light_time",
"label": "LIGHT TIMING", "label": "LIGHT TIMING",
"pos": [ "pos": [
1, 1,
5 5
],
"checks": [
{
"type": "ready",
"item": "light_timing",
"fix": "ready_light_timing"
}
] ]
}, },
{ {
"checks": [
{
"fix": "ready_recheck",
"item": "keys",
"type": "ready"
}
],
"id": "rd_keys", "id": "rd_keys",
"label": "SONG KEYS", "label": "SONG KEYS",
"pos": [ "pos": [
0, 0,
6 6
],
"checks": [
{
"type": "ready",
"item": "keys",
"fix": "ready_recheck"
}
] ]
}, },
{ {
"checks": [
{
"fix": "ready_recheck",
"item": "tune",
"type": "ready"
}
],
"id": "rd_tune", "id": "rd_tune",
"label": "W TUNE", "label": "W TUNE",
"pos": [ "pos": [
0, 0,
7 7
],
"checks": [
{
"type": "ready",
"item": "tune",
"fix": "ready_recheck"
}
] ]
}, },
{ {
"checks": [
{
"fix": "ready_ableton_mix",
"item": "routing",
"type": "ready"
}
],
"id": "rd_routing", "id": "rd_routing",
"label": "ROUTING", "label": "ROUTING",
"pos": [ "pos": [
2, 2,
2 2
],
"checks": [
{
"type": "ready",
"item": "routing",
"fix": "ready_ableton_mix"
}
] ]
}, },
{ {
"checks": [
{
"fix": "ready_ableton_mix",
"item": "ears",
"type": "ready"
}
],
"id": "rd_ears", "id": "rd_ears",
"label": "IN EARS", "label": "IN EARS",
"pos": [ "pos": [
2, 2,
3 3
],
"checks": [
{
"type": "ready",
"item": "ears",
"fix": "ready_ableton_mix"
}
] ]
}, },
{ {
@@ -1563,39 +1571,80 @@
] ]
}, },
{ {
"checks": [
{
"fix": "ready_start",
"item": "start",
"type": "ready"
}
],
"id": "rd_start", "id": "rd_start",
"label": "START", "label": "START",
"pos": [ "pos": [
3, 3,
3 3
],
"checks": [
{
"type": "ready",
"item": "start",
"fix": "ready_start"
}
] ]
}, },
{ {
"checks": [
{
"fix": "ready_resi_vox",
"item": "resi_vox",
"type": "ready"
}
],
"id": "rd_resi_vox", "id": "rd_resi_vox",
"label": "RESI VOX", "label": "RESI VOX",
"pos": [ "pos": [
2, 2,
4 4
],
"checks": [
{
"type": "ready",
"item": "resi_vox",
"fix": "ready_resi_vox"
}
] ]
} }
], ],
"page": 21, "page": 21,
"page_name": "21\\nReady" "page_name": "21\\nReady"
}, },
"resi_events": {
"margin_minutes": 10,
"pco_specials": true,
"weekly": [
{
"days": [
"mon"
],
"end": "10:00",
"start": "09:00"
},
{
"days": [
"wed"
],
"end": "22:00",
"start": "16:30"
},
{
"days": [
"sun"
],
"end": "09:45",
"start": "08:00"
},
{
"days": [
"sun"
],
"end": "11:45",
"start": "09:50"
},
{
"days": [
"sun"
],
"end": "13:50",
"start": "11:50"
}
]
},
"restart_page": { "restart_page": {
"back_pos": [ "back_pos": [
2, 2,
@@ -1737,9 +1786,9 @@
] ]
}, },
{ {
"fix": "arena",
"id": "rs_arena", "id": "rs_arena",
"label": "ARENA", "label": "ARENA",
"fix": "arena",
"pos": [ "pos": [
1, 1,
5 5
@@ -1749,14 +1798,14 @@
] ]
}, },
{ {
"fix": "ableset",
"id": "rs_ableset", "id": "rs_ableset",
"label": "ABLESET", "label": "ABLESET",
"fix": "ableset",
"toggle": "ableset",
"pos": [ "pos": [
1, 1,
6 6
] ],
"toggle": "ableset"
} }
], ],
"page": 20, "page": 20,
@@ -1778,6 +1827,12 @@
} }
], ],
"site": { "site": {
"admin_ips": [
"10.6.7.38"
],
"admin_keys": [
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPKCGDLncJQfNPpoZUy/5BQWGNtyaU1/xKXwHQWx3ETa christian-laptop@waters"
],
"editing_code": "7381", "editing_code": "7381",
"id": "na", "id": "na",
"ingest_hostname": "na-ingest.local", "ingest_hostname": "na-ingest.local",
@@ -1787,13 +1842,7 @@
], ],
"ingest_name": "NA Ingest", "ingest_name": "NA Ingest",
"live_services": [], "live_services": [],
"name": "North Attleboro", "name": "North Attleboro"
"admin_ips": [
"10.6.7.38"
],
"admin_keys": [
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPKCGDLncJQfNPpoZUy/5BQWGNtyaU1/xKXwHQWx3ETa christian-laptop@waters"
]
}, },
"spotify": { "spotify": {
"name": "Christian EDM 2026", "name": "Christian EDM 2026",
@@ -2214,10 +2263,10 @@
"type": "mdns" "type": "mdns"
}, },
{ {
"debounce_seconds": 120,
"instance": "NA Tracks", "instance": "NA Tracks",
"name": "TRACKS MIDI", "name": "TRACKS MIDI",
"type": "mdns", "type": "mdns"
"debounce_seconds": 120
}, },
{ {
"name": "TRACKS IN", "name": "TRACKS IN",
@@ -2232,9 +2281,9 @@
"type": "midi_wired" "type": "midi_wired"
}, },
{ {
"type": "tune_rx",
"host": "studiob", "host": "studiob",
"name": "STUDIO B" "name": "STUDIO B",
"type": "tune_rx"
} }
], ],
"id": "midi", "id": "midi",
@@ -2417,11 +2466,11 @@
"type": "atem" "type": "atem"
}, },
{ {
"type": "atem",
"part": "silence",
"msg": "RESI AUDIO SILENT",
"fix": "atem_audio", "fix": "atem_audio",
"quiet": "resi_events" "msg": "RESI AUDIO SILENT",
"part": "silence",
"quiet": "resi_events",
"type": "atem"
}, },
{ {
"fix": "atem_camera", "fix": "atem_camera",
@@ -2465,9 +2514,9 @@
"checks": [ "checks": [
{ {
"conn": "RESI_Decoder", "conn": "RESI_Decoder",
"quiet": "resi_events",
"tag": "DECODER", "tag": "DECODER",
"type": "conn", "type": "conn"
"quiet": "resi_events"
}, },
{ {
"host": "10.1.10.203", "host": "10.1.10.203",
@@ -2486,16 +2535,16 @@
"url": "http://10.1.10.202/" "url": "http://10.1.10.202/"
}, },
{ {
"conn": "resi-studio-cues",
"type": "conn",
"amber": true, "amber": true,
"quiet": "resi_events" "conn": "resi-studio-cues",
"quiet": "resi_events",
"type": "conn"
}, },
{ {
"name": "CLOUD", "name": "CLOUD",
"quiet": "resi_events",
"type": "http", "type": "http",
"url": "https://central.resi.io/", "url": "https://central.resi.io/"
"quiet": "resi_events"
} }
], ],
"id": "resi", "id": "resi",
@@ -2713,41 +2762,41 @@
}, },
{ {
"id": "autofix", "id": "autofix",
"label": "AUTO-FIX",
"kind": "autofix", "kind": "autofix",
"label": "AUTO-FIX",
"pos": [ "pos": [
3, 3,
7 7
] ]
}, },
{ {
"id": "ableset",
"label": "ABLESET",
"kind": "bypass",
"bypass": { "bypass": {
"fixes": [ "fixes": [
"ableset" "ableset"
], ],
"on_text": "AUTO-OPEN\nOFF", "off_text": "AUTO-OPEN\nON",
"off_text": "AUTO-OPEN\nON" "on_text": "AUTO-OPEN\nOFF"
} },
"id": "ableset",
"kind": "bypass",
"label": "ABLESET"
}, },
{ {
"id": "trk_ingest_off",
"label": "TRK INGEST",
"kind": "bypass",
"bypass": { "bypass": {
"peers": [ "auto": "autofix_hours",
"NA Ingest"
],
"hosts": [ "hosts": [
"tracks" "tracks"
], ],
"auto": "autofix_hours", "names_only": true,
"on_text": "OFF IN\nAUTO-FIX HOURS",
"off_text": "ALLOWED", "off_text": "ALLOWED",
"names_only": true "on_text": "OFF IN\nAUTO-FIX HOURS",
} "peers": [
"NA Ingest"
]
},
"id": "trk_ingest_off",
"kind": "bypass",
"label": "TRK INGEST"
} }
], ],
"timing": { "timing": {
@@ -2758,53 +2807,5 @@
"command": "sp_cmd", "command": "sp_cmd",
"heartbeat": "sp_hb", "heartbeat": "sp_hb",
"state": "sp_state" "state": "sp_state"
},
"nav_locations_band": true,
"nav_hold_more": [
{
"ms": 3000,
"page": 98
}
],
"resi_events": {
"weekly": [
{
"days": [
"sun"
],
"start": "07:30",
"end": "09:15"
},
{
"days": [
"sun"
],
"start": "09:30",
"end": "11:15"
},
{
"days": [
"sun"
],
"start": "11:30",
"end": "13:15"
},
{
"days": [
"mon"
],
"start": "09:00",
"end": "10:00"
},
{
"days": [
"wed"
],
"start": "16:30",
"end": "22:00"
}
],
"margin_minutes": 10,
"pco_specials": true
} }
} }
+3
View File
@@ -36,6 +36,9 @@ CONFIG["auto_fix"]["log_dir"] = tempfile.mkdtemp(prefix="sp-autolog-") # never
# ...and their own auto-fix hours, so the location can change its own on the settings page. # ...and their own auto-fix hours, so the location can change its own on the settings page.
CONFIG["auto_fix"]["windows"] = [{"days": ["wed"], "start": "16:00", "end": "21:00"}, {"days": ["sun"], "start": "06:30", "end": "13:30"}] CONFIG["auto_fix"]["windows"] = [{"days": ["wed"], "start": "16:00", "end": "21:00"}, {"days": ["sun"], "start": "06:30", "end": "13:30"}]
WEDNESDAY = datetime(2026, 10, 7, 15, 0).timestamp() WEDNESDAY = datetime(2026, 10, 7, 15, 0).timestamp()
# ...and their own Resi event times (the settings page moves NA's).
CONFIG["resi_events"]["weekly"] = [{"days": ["sun"], "start": s, "end": e} for s, e in (("07:30", "09:15"), ("09:30", "11:15"), ("11:30", "13:15"))] + \
[{"days": ["mon"], "start": "09:00", "end": "10:00"}, {"days": ["wed"], "start": "16:30", "end": "22:00"}]
def healthy_snapshot(now): def healthy_snapshot(now):