From c35499cbe623d1094c78fa33f8f7927bf01d5aa9 Mon Sep 17 00:00:00 2001 From: Mario Steele Date: Sun, 12 May 2024 02:46:27 -0500 Subject: [PATCH] New Action -> ToggleStream (#1) Added Icons stream_active, stream_inactive and stream_reconnecting Added functionality to backend to use OBSController for functions needed for Toggling of Stream Added Translations for German and English. Updated main.py to implement new Actions. --- actions/ToggleStream/ToggleStream.py | 94 +++++++++++++++++++++++++++ assets/stream_active.png | Bin 0 -> 21739 bytes assets/stream_inactive.png | Bin 0 -> 20495 bytes assets/stream_reconnecting.png | Bin 0 -> 24552 bytes backend/backend.py | 21 ++++++ locales/de_DE.json | 1 + locales/en_US.json | 1 + main.py | 9 +++ 8 files changed, 126 insertions(+) create mode 100644 actions/ToggleStream/ToggleStream.py create mode 100644 assets/stream_active.png create mode 100644 assets/stream_inactive.png create mode 100644 assets/stream_reconnecting.png diff --git a/actions/ToggleStream/ToggleStream.py b/actions/ToggleStream/ToggleStream.py new file mode 100644 index 0000000..4a7d6b1 --- /dev/null +++ b/actions/ToggleStream/ToggleStream.py @@ -0,0 +1,94 @@ +# from ...OBSActionbase import OBSActionBase +import threading +from plugins.com_core447_OBSPlugin.OBSActionBase import OBSActionBase +from src.backend.DeckManagement.DeckController import DeckController +from src.backend.PageManagement.Page import Page +from src.backend.PluginManager.PluginBase import PluginBase + +import os +class ToggleStream(OBSActionBase): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.current_state = -1 + + def on_ready(self): + self.current_state = -1 + if self.plugin_base.backend is None: + if not self.plugin_base.get_connected(): + self.reconnect_obs() + + threading.Thread(target=self.show_current_stream_status, daemon=True, name="show_current_stream_status").start() + + def show_current_stream_status(self, new_paused = False): + if self.plugin_base.backend is None: + self.current_state = -1 + self.show_error() + return + if not self.plugin_base.backend.get_connected(): + self.current_state = -1 + self.show_error() + return + status = self.plugin_base.backend.get_stream_status() + if status is None: + self.current_state = -1 + self.show_error() + return + if status["active"]: + if status["reconnecting"]: + self.show_for_state(2) + else: + self.show_for_state(1) + else: + self.show_for_state(0) + + def show_for_state(self, state: int): + """ + 0: Not Streaming + 1: Streaming Connected + 2: Streaming Reconnecting + """ + if state in [1, 2]: + self.show_stream_time() + + if state == self.current_state: + return + + self.current_state = state + image = "stream_inactive.png" + if state == 0: + self.set_bottom_label(None) + elif state == 1: + image = "stream_active.png" + elif state == 2: + image = "stream_reconnecting.png" + + self.set_media(media_path=os.path.join(self.plugin_base.PATH, "assets", image)) + + def on_key_down(self): + if self.plugin_base.backend is None: + self.current_state = -1 + self.show_error() + return + if not self.plugin_base.backend.get_connected(): + self.current_state = -1 + self.show_error() + return + self.plugin_base.backend.toggle_stream() + self.on_tick() + + def on_tick(self): + self.show_current_stream_status() + + def show_stream_time(self): + if not self.plugin_base.backend.get_connected(): + self.set_media(media_path=os.path.join(self.plugin_base.PATH, "assets", "error.png")) + return + status = self.plugin_base.backend.get_stream_status() + if status is None: + self.set_media(media_path=os.path.join(self.plugin_base.PATH, "assets", "error.png")) + return + + if not status["active"]: + self.set_bottom_label(None) + return + self.set_bottom_label(status["timecode"][:-4]) \ No newline at end of file diff --git a/assets/stream_active.png b/assets/stream_active.png new file mode 100644 index 0000000000000000000000000000000000000000..9c9c702bf10dd5c2261986530509cfc7b8784d07 GIT binary patch literal 21739 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 literal 0 HcmV?d00001 diff --git a/assets/stream_inactive.png b/assets/stream_inactive.png new file mode 100644 index 0000000000000000000000000000000000000000..81b5ffeaeb9955bea8ec702c9c9b0d7c41d12d3a GIT binary patch literal 20495 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 literal 0 HcmV?d00001 diff --git a/assets/stream_reconnecting.png b/assets/stream_reconnecting.png new file mode 100644 index 0000000000000000000000000000000000000000..9bd2d2c08df5077348bdb94b93728ecd76008cb0 GIT binary patch literal 24552 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]wy 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 E00WH2 dict: + status = self.OBSController.get_stream_status() + if status is None: + return + return { + "active": status.datain["outputActive"], + "reconnecting": status.datain["outputReconnecting"], + "timecode": status.datain["outputTimecode"], + "duration": status.datain["outputDuration"], + "congestion": status.datain["outputCongestion"], + "bytes": status.datain["outputBytes"], + "skipped_frames": status.datain["outputSkippedFrames"], + "total_frames": status.datain["outputTotalFrames"] + } def get_connected(self) -> bool: return self.OBSController.connected + + def toggle_stream(self): + status = self.OBSController.toggle_stream() + if status is None: + return False + return status.datain["outputActive"] def toggle_record(self): self.OBSController.toggle_record() diff --git a/locales/de_DE.json b/locales/de_DE.json index e7233d9..a3e81ab 100644 --- a/locales/de_DE.json +++ b/locales/de_DE.json @@ -1,6 +1,7 @@ { "plugin.name": "OBS", "actions.toggle-record.name": "Aufnahme pausieren", + "actions.toggle-stream.name": "Streaming umschalten", "actions.rec-play-pause.name": "Play/Pause Aufnahme", "actions.base.status.no-connection": "Es konnte keine Verbindung zu OBS hergestellt werden.", "actions.base.ip.label": "IP:", diff --git a/locales/en_US.json b/locales/en_US.json index 372a40d..520c871 100644 --- a/locales/en_US.json +++ b/locales/en_US.json @@ -1,6 +1,7 @@ { "plugin.name": "OBS", "actions.toggle-record.name": "Toggle Recording", + "actions.toggle-stream.name": "Toggle Steaming", "actions.rec-play-pause.name": "Play/Pause Recording", "actions.base.status.no-connection": "Could not connect to OBS.", "actions.base.status.connected": "Successfully connected to OBS.", diff --git a/main.py b/main.py index 30f3503..2e3a7f1 100644 --- a/main.py +++ b/main.py @@ -20,6 +20,7 @@ sys.path.append(os.path.dirname(__file__)) from OBSActionBase import OBSActionBase from actions.ToggleRecord.ToggleRecord import ToggleRecord +from actions.ToggleStream.ToggleStream import ToggleStream from actions.RecPlayPause.RecPlayPause import RecPlayPause from actions.SwitchScene.SwitchScene import SwitchScene @@ -51,6 +52,14 @@ class OBS(PluginBase): ) self.add_action_holder(toggle_record_action_holder) + toggle_stream_action_holder = ActionHolder( + plugin_base=self, + action_base=ToggleStream, + action_id="com_core447_OBSPlugin::ToggleStream", + action_name=self.lm.get("actions.toggle-stream.name") + ) + self.add_action_holder(toggle_stream_action_holder) + rec_play_pause_action_holder = ActionHolder( plugin_base=self, action_base=RecPlayPause,