-
Notifications
You must be signed in to change notification settings - Fork 2
/
vmix_output.py
68 lines (56 loc) · 2.35 KB
/
vmix_output.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
import requests
from text_detection_target import TextDetectionTargetWithResult
from sc_logging import logger
from storage import subscribe_to_data, fetch_data
from urllib.parse import urlencode
class VMixAPI:
def __init__(self, host, port, input_number, field_mapping):
self.host = host
self.port = port
self.input_number = input_number
self.field_mapping = field_mapping
self.running = False
self.update_same = fetch_data("scoresight.json", "vmix_send_same", False)
subscribe_to_data("scoresight.json", "vmix_send_same", self.set_update_same)
def set_update_same(self, update_same):
self.update_same = update_same
def set_field_mapping(self, field_mapping):
self.field_mapping = field_mapping
def update_vmix(self, detection: list[TextDetectionTargetWithResult]):
if not self.running:
return
if not self.field_mapping:
logger.debug("Field mapping is not set")
return
look_in = [TextDetectionTargetWithResult.ResultState.Success]
if self.update_same:
# If we want to send the same values as well
look_in.append(TextDetectionTargetWithResult.ResultState.SameNoChange)
# Prepare the data to send
data = {}
for target in detection:
if target.result_state in look_in:
if target.name in self.field_mapping:
data[self.field_mapping[target.name]] = target.result
if data == {}:
logger.debug("No data to send")
return
for key, value in data.items():
# Prepare the URL
query = {
"Function": "SetText",
"Input": self.input_number,
"SelectedName": key,
"Value": value,
}
url = f"http://{self.host}:{self.port}/api/?{urlencode(query)}"
try:
# Send the request
response = requests.post(url, data=data)
# Check the response
if response.status_code != 200:
logger.error(
f"Failed to send data, status code: {response.status_code}"
)
except requests.exceptions.RequestException as e:
logger.error(f"Failed to send data to {url}: {e}")