summaryrefslogtreecommitdiff
path: root/voctocore/lib/commands.py
diff options
context:
space:
mode:
Diffstat (limited to 'voctocore/lib/commands.py')
-rw-r--r--voctocore/lib/commands.py67
1 files changed, 67 insertions, 0 deletions
diff --git a/voctocore/lib/commands.py b/voctocore/lib/commands.py
index bfe3168..92db70e 100644
--- a/voctocore/lib/commands.py
+++ b/voctocore/lib/commands.py
@@ -1,5 +1,6 @@
import logging
import json
+import inspect
from lib.config import Config
from lib.videomix import CompositeModes
@@ -60,8 +61,54 @@ class ControlServerCommands(object):
# exceptions, they will be turned into messages outside.
def message(self, *args):
+ """sends a message through the control-server, which can be received by
+ user-defined scripts. does not change the state of the voctocore."""
return NotifyResponse('message', *args)
+ def help(self):
+ helplines = []
+
+ helplines.append("Commands:")
+ for name, func in ControlServerCommands.__dict__.items():
+ if name[0] == '_':
+ continue
+
+ if not func.__code__:
+ continue
+
+ params = inspect.signature(func).parameters
+ params = [str(info) for name, info in params.items()]
+ params = ', '.join(params[1:])
+
+ command_sig = '\t' + name
+
+ if params:
+ command_sig += ': '+params
+
+ if func.__doc__:
+ command_sig += '\n'+'\n'.join(
+ ['\t\t'+line.strip() for line in func.__doc__.splitlines()])+'\n'
+
+ helplines.append(command_sig)
+
+ helplines.append('\t'+'quit')
+
+ helplines.append("\n")
+ helplines.append("Source-Names:")
+ for source in self.sources:
+ helplines.append("\t"+source)
+
+ helplines.append("\n")
+ helplines.append("Stream-Blanker Sources-Names:")
+ for source in self.blankerSources:
+ helplines.append("\t"+source)
+
+ helplines.append("\n")
+ helplines.append("Composition-Modes:")
+ for mode in CompositeModes:
+ helplines.append("\t"+mode.name)
+
+ return OkResponse("\n".join(helplines))
def _get_video_status(self):
a = encodeName( self.sources, self.pipeline.vmix.getVideoSourceA() )
@@ -69,10 +116,15 @@ class ControlServerCommands(object):
return [a, b]
def get_video(self):
+ """gets the current video-status, consisting of the name of
+ video-source A and video-source B"""
status = self._get_video_status()
return OkResponse('video_status', *status)
def set_video_a(self, src_name_or_id):
+ """sets the video-source A to the supplied source-name or source-id,
+ swapping A and B if the supplied source is currently used as
+ video-source B"""
src_id = decodeName(self.sources, src_name_or_id)
self.pipeline.vmix.setVideoSourceA(src_id)
@@ -80,6 +132,9 @@ class ControlServerCommands(object):
return NotifyResponse('video_status', *status)
def set_video_b(self, src_name_or_id):
+ """sets the video-source B to the supplied source-name or source-id,
+ swapping A and B if the supplied source is currently used as
+ video-source A"""
src_id = decodeName(self.sources, src_name_or_id)
self.pipeline.vmix.setVideoSourceB(src_id)
@@ -92,10 +147,12 @@ class ControlServerCommands(object):
return encodeName(self.sources, src_id)
def get_audio(self):
+ """gets the name of the current audio-source"""
status = self._get_audio_status()
return OkResponse('audio_status', status)
def set_audio(self, src_name_or_id):
+ """sets the audio-source to the supplied source-name or source-id"""
src_id = decodeName(self.sources, src_name_or_id)
self.pipeline.amix.setAudioSource(src_id)
@@ -108,10 +165,12 @@ class ControlServerCommands(object):
return encodeEnumName(CompositeModes, mode)
def get_composite_mode(self):
+ """gets the name of the current composite-mode"""
status = self._get_composite_status()
return OkResponse('composite_mode', status)
def set_composite_mode(self, mode_name_or_id):
+ """sets the name of the id of the composite-mode"""
mode = decodeEnumName(CompositeModes, mode_name_or_id)
self.pipeline.vmix.setCompositeMode(mode)
@@ -122,7 +181,10 @@ class ControlServerCommands(object):
NotifyResponse('video_status', *video_status)
]
+
def set_videos_and_composite(self, src_a_name_or_id, src_b_name_or_id, mode_name_or_id):
+ """sets the A- and the B-source synchronously with the composition-mode
+ all parametets can be set to "*" which will leave them unchanged."""
if src_a_name_or_id != '*':
src_a_id = decodeName(self.sources, src_a_name_or_id)
self.pipeline.vmix.setVideoSourceA(src_a_id)
@@ -152,10 +214,13 @@ class ControlServerCommands(object):
return 'blank', encodeName(self.blankerSources, blankSource)
def get_stream_status(self):
+ """gets the current streamblanker-status"""
status = self._get_stream_status()
return OkResponse('stream_status', *status)
def set_stream_blank(self, source_name_or_id):
+ """sets the streamblanker-status to blank with the specified
+ blanker-source-name or -id"""
src_id = decodeName(self.blankerSources, source_name_or_id)
self.pipeline.streamblanker.setBlankSource(src_id)
@@ -163,6 +228,7 @@ class ControlServerCommands(object):
return NotifyResponse('stream_status', *status)
def set_stream_live(self):
+ """sets the streamblanker-status to live"""
self.pipeline.streamblanker.setBlankSource(None)
status = self._get_stream_status()
@@ -170,5 +236,6 @@ class ControlServerCommands(object):
def get_config(self):
+ """returns the parsed server-config"""
confdict = {header: dict(section) for header, section in dict(Config).items()}
return OkResponse('server_config', json.dumps(confdict))