Compare commits

...

55 Commits
5.0.2 ... 5.2.2

Author SHA1 Message Date
6ef055a369 base: Update version to 5.2.2
- Various minor build process cleanups
2023-04-04 15:13:15 -04:00
a4ee9c03ea base: Remove unneeded include directories
Asio and WebSocket++ are no longer added as submodules.
They are now included in obs-deps.
2023-04-04 12:15:33 -04:00
9912c9963c base: Remove unnecessary entries in .gitignore
the commit 21886adb3 moves the destination of the generated files into
the build directory so that it is unnecessary to hide the generated
files by .gitignore.
2023-04-04 12:14:11 -04:00
21886adb32 base: Fix generated header inclusion 2023-03-27 12:59:23 -04:00
c85d9143a9 Update translations from Crowdin 2023-03-27 13:39:01 +00:00
7ca8d5fc2b base: Update version to 5.2.0
- Fixed a crash caused if `authentication` payload field was not a
string
- Allow empty vendor request data
- Minor documentation fixes
- Replace submodules with obs-deps or system versions where possible
  - asio
  - websocketpp
  - nlohmann/json
- Refactor CMake to allow uplift to new obs-studio CMake
2023-03-26 19:30:00 -04:00
db2c251189 base: Re-add version CMake variables
Make sure that non-legacy builds have these version variables populated.
2023-03-26 19:09:51 -04:00
dd248faecb cmake: Add changes for CMake build framework 3.0
New code path only taken if OBS_CMAKE_VERSION is set to 3.0.0 or
greater, old functionality remains unchanged.
2023-03-26 18:21:05 -04:00
68d79b22af base: Disable Qt RCC timestamps only on Windows 2023-03-24 12:29:19 -04:00
b06da5fa63 base: Disable Qt RCC timestamps 2023-03-23 18:20:34 -04:00
78a1b54a47 base,deps: Replace submodules by prefix/system install
nlohmann JSON, WebSocket++ and Asio are moved from sudmodules to
prefix (obs-deps) or system-wide install (Linux).
2023-03-23 17:37:51 -04:00
bf277011f9 base: Refactor CMake Qt properties
- Allow obs-deps to be used by not changing CMAKE_PREFIX_PATH.
- Move Qt AUTO properties to the target.
2023-03-23 17:37:51 -04:00
96032e0e8c requesthandler: Allow empty vendor request data 2023-02-08 10:10:44 -08:00
ddd139255b Update translations from Crowdin 2023-01-08 04:10:35 +00:00
edf29e828c docs(ci): Update generated docs - 079ab31 [skip ci] 2022-12-31 22:55:24 +00:00
079ab31f88 docs: Fix small typo in introduction.md
- Corrected 'compatability' to 'compatibility' in docs/docs/partials/introduction.md
2022-12-31 14:55:04 -08:00
e797a3fb34 websocketserver: Validate data type of authentication payload field
Can cause crash if field is not a string

Reported by @tyami94
2022-12-31 14:54:11 -08:00
a792c59699 docs(ci): Update generated docs - 31f9845 [skip ci] 2022-11-18 10:29:29 +00:00
31f9845b61 base: Update version to 5.1.0
- Renamed the tools menu button title to `WebSocket Server Settings`
- WebSocket session disconnects are now logged with the close code and
reason
- Fixed a few UI formatting issues
- Fixed the `ObsOutputState` enum not being shown in protocol.md
- Implemented new reconnect output states to the stream output
  - `OBS_WEBSOCKET_OUTPUT_RECONNECTING`
  - `OBS_WEBSOCKET_OUTPUT_RECONNECTED`
- Added the `ScreenshotSaved` event for the screenshot hotkey
- Fixed a bug where `GetLastReplayBufferFileName` could return an empty
string
- Documented `CustomEvent`
- Various other documentation fixes
- Added the following new software and libraries to the README:
  - Macro Deck
  - Bitfocus Companion
  - Kruiz Control
  - Aitum
  - OBS Blade
  - Deckboard
  - Streamer.bot
  - OBS-web
  - obws (Rust)
  - goobs
  - obsws-python
2022-11-18 02:29:10 -08:00
cb6f0b8986 docs(ci): Update generated docs - 9959acb [skip ci] 2022-11-18 10:10:12 +00:00
9959acb0e8 forms: Various UI improvements 2022-11-18 02:09:48 -08:00
8b1ef17c25 docs: Fix initial version for reconnect enum fields 2022-11-18 02:09:48 -08:00
a254172c12 eventhandler: Add reconnecting and reconnected stream output states
Closes #1050
2022-11-18 02:09:48 -08:00
57a9e23f16 docs: Document ObsOutputState enum 2022-11-18 02:09:48 -08:00
4c3660c08d docs: Enable ObsMediaInputAction enum documentation
It should now show up in protocol.md
2022-11-18 02:09:48 -08:00
323b5d0b5d eventhandler, utils: Implement missing output states 2022-11-18 02:09:48 -08:00
23f883d906 eventhandler: Split some handling code into multi handlers
Code cleanup
2022-11-18 02:09:48 -08:00
60dbcc1b66 docs(ci): Update generated docs - 8cabe24 [skip ci] 2022-11-18 06:20:26 +00:00
8cabe24b77 eventhandler: Add ScreenshotSaved event
No, this does not trigger with `Get/SaveScreenshot`. I've tried to make
that super clear in the docs. Hopefully people don't get too confused.
2022-11-17 22:19:12 -08:00
9cfca3c7d1 utils: Use new method to get last replay
Uses the newer obs-frontend-api function instead of our original
method. It was cool, but is no longer necessary.
2022-11-17 22:18:18 -08:00
cfa0b4363e utils: Add function to get last screenshot file name 2022-11-17 22:16:59 -08:00
815d47e2ff README: Add Macro Deck software link 2022-11-17 18:40:27 -08:00
9bdf560bf8 utils: Fix use-after-free in GetLastReplayBufferFileName 2022-11-17 18:36:25 -08:00
47f9beb095 docs(ci): Update generated docs - 32d0834 [skip ci] 2022-11-13 00:00:45 +00:00
32d0834c3f docs: Fix description of "mul" volume notation 2022-11-12 16:00:28 -08:00
9722ed3df4 Add CustomEvent docs entry
Resolves #1031
2022-11-12 15:56:03 -08:00
9f72852588 doc: Update README to add Java library 2022-11-12 15:51:05 -08:00
6e0220ac7b Update translations from Crowdin 2022-10-25 22:32:12 +00:00
6d4b7c786e docs(ci): Update generated docs - 290e042 [skip ci] 2022-10-22 22:22:39 +00:00
290e042612 fix: Sleep request fields are exclusive so both optional fixes #1042 2022-10-22 15:22:20 -07:00
7e4c9529eb docs(ci): Update generated docs - bc18401 [skip ci] 2022-10-18 20:11:17 +00:00
bc18401fb0 docs: Fix ouputPaused typo 2022-10-18 13:10:58 -07:00
265899f76f docs(ci): Update generated docs - 9e1a41f [skip ci] 2022-09-19 01:02:32 +00:00
9e1a41f219 docs: Clarify that nested scenes are recommended instead of groups
Seems like it would be obvious, but apparently not
2022-09-18 18:02:13 -07:00
7893ae5caa docs: Add top-level headings to main TOC
It may be worth having the entire TOC up here, but this way, at least
it's possible to jump to the other TOCs.
2022-09-16 04:54:42 -07:00
a715639302 docs(ci): Update generated docs - 6038fe9 [skip ci] 2022-09-07 19:43:58 +00:00
6038fe9a0a docs: Start list of known propertyName values for common buttons 2022-09-07 12:43:29 -07:00
6fba48929a README: Add second contributor to obsws-python 2022-09-05 15:33:30 -07:00
7eb4eb101c README: Add Bitfocus Companion to client software 2022-09-05 15:32:51 -07:00
f2e595e1ab README: Add Kruiz Control and obsws-python to list 2022-09-04 17:11:30 -07:00
c1ffbf0111 README: Add Aitum 2022-09-03 15:16:30 -07:00
f08d3225ad README: Add OBS Blade to supported client software 2022-09-03 07:06:10 -07:00
84542e1ed5 README: Add deckboard to supported client software list 2022-09-03 06:53:41 -07:00
bb9371b0dc locale: Rename plugin settings title to match other plugins
Closes obsproject/obs-studio#7231
2022-09-02 00:11:59 -07:00
ab918faea8 README: Add streamer.bot to list of supported client software 2022-09-01 03:12:56 -07:00
87 changed files with 1364 additions and 343 deletions

View File

@ -1,13 +1,46 @@
{ {
"additional_commands": { "format": {
"find_qt": { "line_width": 120,
"flags": [], "tab_size": 2,
"kwargs": { "enable_sort": true,
"COMPONENTS": "+", "autosort": true
"COMPONENTS_WIN": "+", },
"COMPONENTS_MACOS": "+", "additional_commands": {
"COMPONENTS_LINUX": "+" "find_qt": {
"flags": [],
"kwargs": {
"COMPONENTS": "+",
"COMPONENTS_WIN": "+",
"COMPONENTS_MACOS": "+",
"COMPONENTS_LINUX": "+"
}
},
"set_target_properties_obs": {
"pargs": 1,
"flags": [],
"kwargs": {
"PROPERTIES": {
"kwargs": {
"PREFIX": 1,
"OUTPUT_NAME": 1,
"FOLDER": 1,
"VERSION": 1,
"SOVERSION": 1,
"FRAMEWORK": 1,
"BUNDLE": 1,
"AUTOMOC": 1,
"AUTOUIC": 1,
"AUTORCC": 1,
"AUTOUIC_SEARCH_PATHS": 1,
"BUILD_RPATH": 1,
"INSTALL_RPATH": 1,
"XCODE_ATTRIBUTE_CLANG_ENABLE_OBJC_ARC": 1,
"XCODE_ATTRIBUTE_CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION": 1,
"XCODE_ATTRIBUTE_GCC_WARN_SHADOW":1 ,
"LIBRARY_OUTPUT_DIRECTORY": 1
}
} }
} }
} }
}
} }

View File

@ -28,10 +28,8 @@ body:
- macOS 10.14 - macOS 10.14
- macOS 10.13 - macOS 10.13
- Ubuntu 22.04 LTS - Ubuntu 22.04 LTS
- Ubuntu 21.04
- Ubuntu 20.10 - Ubuntu 20.10
- Ubuntu 20.04 LTS - Ubuntu 20.04 LTS
- Ubuntu 18.04 LTS
- Other - Other
validations: validations:
required: true required: true
@ -49,16 +47,10 @@ body:
label: OBS Studio Version label: OBS Studio Version
description: What version of OBS Studio are you using? description: What version of OBS Studio are you using?
options: options:
- 28.0.0 - 29.0.x
- 28.1.x
- 28.0.x
- 27.2.4 - 27.2.4
- 27.2.3
- 27.2.2
- 27.2.1
- 27.2.0
- 27.1.3
- 27.1.1
- 27.1.0
- 27.0.1
- Git - Git
- Other - Other
validations: validations:
@ -76,9 +68,9 @@ body:
label: obs-websocket Version label: obs-websocket Version
description: What version of obs-websocket are you using? description: What version of obs-websocket are you using?
options: options:
- 5.1.0
- 5.0.1 - 5.0.1
- 5.0.0 - 5.0.0
- 5.0.0-beta1
- Git - Git
validations: validations:
required: true required: true

2
.gitignore vendored
View File

@ -2,7 +2,6 @@
.DS_Store .DS_Store
.idea .idea
.vscode .vscode
**.generated.h
/build/ /build/
/build32/ /build32/
/build64/ /build64/
@ -10,5 +9,4 @@
/package/ /package/
/installer/Output/ /installer/Output/
/docs/node_modules/ /docs/node_modules/
/installer/installer-windows.generated.iss
/cmake-build-debug/ /cmake-build-debug/

9
.gitmodules vendored
View File

@ -1,12 +1,3 @@
[submodule "deps/websocketpp"]
path = deps/websocketpp
url = https://github.com/zaphoyd/websocketpp.git
[submodule "deps/asio"]
path = deps/asio
url = https://github.com/chriskohlhoff/asio.git
[submodule "deps/json"]
path = deps/json
url = https://github.com/nlohmann/json.git
[submodule "deps/qr"] [submodule "deps/qr"]
path = deps/qr path = deps/qr
url = https://github.com/nayuki/QR-Code-generator.git url = https://github.com/nayuki/QR-Code-generator.git

View File

@ -1,52 +1,38 @@
project(obs-websocket VERSION 5.0.1) cmake_minimum_required(VERSION 3.16...3.25)
legacy_check()
set(obs-websocket_VERSION 5.2.2)
set(OBS_WEBSOCKET_RPC_VERSION 1) set(OBS_WEBSOCKET_RPC_VERSION 1)
option(ENABLE_WEBSOCKET "Enable building OBS with websocket plugin" ON) option(ENABLE_WEBSOCKET "Enable building OBS with websocket plugin" ON)
if(NOT ENABLE_WEBSOCKET)
if(NOT ENABLE_WEBSOCKET OR NOT ENABLE_UI) target_disable(obs-websocket)
message(STATUS "OBS: DISABLED obs-websocket")
return() return()
endif() endif()
# Submodule deps check # Submodule deps check
if(NOT if(NOT EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/deps/qr/cpp/QrCode.hpp")
(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/deps/json/CMakeLists.txt message(FATAL_ERROR "obs-websocket submodule deps not available.")
AND EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/deps/websocketpp/CMakeLists.txt
AND EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/deps/qr/cpp/QrCode.hpp
AND EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/deps/asio/asio/include/asio.hpp))
obs_status(FATAL_ERROR "obs-websocket submodule deps not available.")
endif() endif()
# Plugin tests flag
option(PLUGIN_TESTS "Enable plugin runtime tests" OFF)
# Qt build stuff
set(CMAKE_PREFIX_PATH "${QTDIR}")
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTORCC ON) # For resources.qrc
# Find Qt # Find Qt
find_qt(COMPONENTS Core Widgets Svg Network) find_qt(COMPONENTS Core Widgets Svg Network)
# Find nlohmann # Find nlohmann JSON
set(JSON_BuildTests find_package(nlohmann_json 3 REQUIRED)
OFF
CACHE INTERNAL "")
add_subdirectory(deps/json)
# Tell websocketpp not to use system boost # Find WebSocket++
add_definitions(-DASIO_STANDALONE) find_package(Websocketpp 0.8 REQUIRED)
# Configure files # Find Asio
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/src/plugin-macros.h.in find_package(Asio 1.12.1 REQUIRED)
${CMAKE_CURRENT_SOURCE_DIR}/src/plugin-macros.generated.h)
# Setup target
add_library(obs-websocket MODULE) add_library(obs-websocket MODULE)
add_library(OBS::websocket ALIAS obs-websocket) add_library(OBS::websocket ALIAS obs-websocket)
target_sources(obs-websocket PRIVATE)
target_sources( target_sources(
obs-websocket obs-websocket
PRIVATE src/obs-websocket.cpp PRIVATE src/obs-websocket.cpp
@ -54,50 +40,59 @@ target_sources(
src/Config.cpp src/Config.cpp
src/Config.h src/Config.h
lib/obs-websocket-api.h lib/obs-websocket-api.h
src/forms/SettingsDialog.cpp
src/forms/SettingsDialog.h
src/forms/ConnectInfo.cpp src/forms/ConnectInfo.cpp
src/forms/ConnectInfo.h src/forms/ConnectInfo.h
src/forms/resources.qrc src/forms/resources.qrc
src/forms/SettingsDialog.cpp
src/forms/SettingsDialog.h
src/WebSocketApi.cpp src/WebSocketApi.cpp
src/WebSocketApi.h src/WebSocketApi.h)
src/websocketserver/WebSocketServer.cpp
target_sources(
obs-websocket
PRIVATE src/websocketserver/WebSocketServer.cpp
src/websocketserver/WebSocketServer_Protocol.cpp src/websocketserver/WebSocketServer_Protocol.cpp
src/websocketserver/WebSocketServer.h src/websocketserver/WebSocketServer.h
src/websocketserver/rpc/WebSocketSession.cpp src/websocketserver/rpc/WebSocketSession.cpp
src/websocketserver/rpc/WebSocketSession.h src/websocketserver/rpc/WebSocketSession.h
src/websocketserver/types/WebSocketCloseCode.h src/websocketserver/types/WebSocketCloseCode.h
src/websocketserver/types/WebSocketOpCode.h src/websocketserver/types/WebSocketOpCode.h)
src/eventhandler/EventHandler.cpp
src/eventhandler/EventHandler_General.cpp target_sources(
src/eventhandler/EventHandler_Config.cpp obs-websocket
src/eventhandler/EventHandler_Scenes.cpp PRIVATE src/eventhandler/EventHandler.cpp
src/eventhandler/EventHandler_Inputs.cpp
src/eventhandler/EventHandler_Transitions.cpp
src/eventhandler/EventHandler_Filters.cpp
src/eventhandler/EventHandler_Outputs.cpp
src/eventhandler/EventHandler_SceneItems.cpp
src/eventhandler/EventHandler_MediaInputs.cpp
src/eventhandler/EventHandler_Ui.cpp
src/eventhandler/EventHandler.h src/eventhandler/EventHandler.h
src/eventhandler/types/EventSubscription.h src/eventhandler/EventHandler_Config.cpp
src/requesthandler/RequestHandler.cpp src/eventhandler/EventHandler_General.cpp
src/requesthandler/RequestHandler_General.cpp src/eventhandler/EventHandler_Filters.cpp
src/requesthandler/RequestHandler_Config.cpp src/eventhandler/EventHandler_Inputs.cpp
src/requesthandler/RequestHandler_Sources.cpp src/eventhandler/EventHandler_MediaInputs.cpp
src/requesthandler/RequestHandler_Scenes.cpp src/eventhandler/EventHandler_Outputs.cpp
src/requesthandler/RequestHandler_Inputs.cpp src/eventhandler/EventHandler_Scenes.cpp
src/requesthandler/RequestHandler_Transitions.cpp src/eventhandler/EventHandler_SceneItems.cpp
src/requesthandler/RequestHandler_Filters.cpp src/eventhandler/EventHandler_Transitions.cpp
src/requesthandler/RequestHandler_SceneItems.cpp src/eventhandler/EventHandler_Ui.cpp
src/requesthandler/RequestHandler_Outputs.cpp src/eventhandler/types/EventSubscription.h)
src/requesthandler/RequestHandler_Stream.cpp
src/requesthandler/RequestHandler_Record.cpp target_sources(
src/requesthandler/RequestHandler_MediaInputs.cpp obs-websocket
src/requesthandler/RequestHandler_Ui.cpp PRIVATE src/requesthandler/RequestBatchHandler.cpp
src/requesthandler/RequestHandler.h
src/requesthandler/RequestBatchHandler.cpp
src/requesthandler/RequestBatchHandler.h src/requesthandler/RequestBatchHandler.h
src/requesthandler/RequestHandler.cpp
src/requesthandler/RequestHandler.h
src/requesthandler/RequestHandler_Config.cpp
src/requesthandler/RequestHandler_Filters.cpp
src/requesthandler/RequestHandler_General.cpp
src/requesthandler/RequestHandler_Inputs.cpp
src/requesthandler/RequestHandler_MediaInputs.cpp
src/requesthandler/RequestHandler_Outputs.cpp
src/requesthandler/RequestHandler_Sources.cpp
src/requesthandler/RequestHandler_Record.cpp
src/requesthandler/RequestHandler_Scenes.cpp
src/requesthandler/RequestHandler_SceneItems.cpp
src/requesthandler/RequestHandler_Stream.cpp
src/requesthandler/RequestHandler_Transitions.cpp
src/requesthandler/RequestHandler_Ui.cpp
src/requesthandler/rpc/Request.cpp src/requesthandler/rpc/Request.cpp
src/requesthandler/rpc/Request.h src/requesthandler/rpc/Request.h
src/requesthandler/rpc/RequestBatchRequest.cpp src/requesthandler/rpc/RequestBatchRequest.cpp
@ -105,34 +100,50 @@ target_sources(
src/requesthandler/rpc/RequestResult.cpp src/requesthandler/rpc/RequestResult.cpp
src/requesthandler/rpc/RequestResult.h src/requesthandler/rpc/RequestResult.h
src/requesthandler/types/RequestStatus.h src/requesthandler/types/RequestStatus.h
src/requesthandler/types/RequestBatchExecutionType.h src/requesthandler/types/RequestBatchExecutionType.h)
target_sources(
obs-websocket
PRIVATE src/utils/Compat.cpp
src/utils/Compat.h
src/utils/Crypto.cpp src/utils/Crypto.cpp
src/utils/Crypto.h src/utils/Crypto.h
src/utils/Json.cpp src/utils/Json.cpp
src/utils/Json.h src/utils/Json.h
src/utils/Obs.cpp src/utils/Obs.cpp
src/utils/Obs_StringHelper.cpp
src/utils/Obs_NumberHelper.cpp
src/utils/Obs_ArrayHelper.cpp
src/utils/Obs_ObjectHelper.cpp
src/utils/Obs_SearchHelper.cpp
src/utils/Obs_ActionHelper.cpp
src/utils/Obs.h src/utils/Obs.h
src/utils/Obs_ActionHelper.cpp
src/utils/Obs_ArrayHelper.cpp
src/utils/Obs_NumberHelper.cpp
src/utils/Obs_ObjectHelper.cpp
src/utils/Obs_StringHelper.cpp
src/utils/Obs_SearchHelper.cpp
src/utils/Obs_VolumeMeter.cpp src/utils/Obs_VolumeMeter.cpp
src/utils/Obs_VolumeMeter.h src/utils/Obs_VolumeMeter.h
src/utils/Obs_VolumeMeter_Helpers.h src/utils/Obs_VolumeMeter_Helpers.h
src/utils/Platform.cpp src/utils/Platform.cpp
src/utils/Platform.h src/utils/Platform.h
src/utils/Compat.cpp src/utils/Utils.h)
src/utils/Compat.h
src/utils/Utils.h
deps/qr/cpp/QrCode.cpp
deps/qr/cpp/QrCode.hpp)
target_include_directories( target_sources(obs-websocket PRIVATE deps/qr/cpp/QrCode.cpp deps/qr/cpp/QrCode.hpp)
configure_file(src/plugin-macros.h.in plugin-macros.generated.h)
target_sources(obs-websocket PRIVATE plugin-macros.generated.h)
target_compile_definitions(
obs-websocket PRIVATE ASIO_STANDALONE $<$<BOOL:PLUGIN_TESTS>:PLUGIN_TESTS>
$<$<PLATFORM_ID:Windows>:_WEBSOCKETPP_CPP11_STL_> $<$<PLATFORM_ID:Windows>:_WIN32_WINNT=0x0603>)
target_compile_options(
obs-websocket obs-websocket
PRIVATE ${Qt5Core_INCLUDES} ${Qt5Widgets_INCLUDES} ${Qt5Svg_INCLUDES} PRIVATE
${Qt5Network_INCLUDES} "deps/asio/asio/include" "deps/websocketpp") $<$<PLATFORM_ID:Windows>:/wd4267>
$<$<PLATFORM_ID:Windows>:/wd4996>
$<$<PLATFORM_ID:Darwin,Linux,FreeBSD>:-Wall>
$<$<COMPILE_LANG_AND_ID:CXX,GNU,AppleClang,Clang>:-Wno-error=float-conversion;-Wno-error=shadow>
$<$<COMPILE_LANG_AND_ID:CXX,GNU>:-Wno-error=format-overflow;-Wno-error=int-conversion;-Wno-error=comment>
$<$<COMPILE_LANG_AND_ID:CXX,AppleClang,Clang>:-Wno-error=null-pointer-subtraction;-Wno-error=deprecated-declarations;-Wno-error=implicit-int-conversion;-Wno-error=shorten-64-to-32>
)
target_link_libraries( target_link_libraries(
obs-websocket obs-websocket
@ -142,33 +153,21 @@ target_link_libraries(
Qt::Widgets Qt::Widgets
Qt::Svg Qt::Svg
Qt::Network Qt::Network
nlohmann_json::nlohmann_json) nlohmann_json::nlohmann_json
Websocketpp::Websocketpp
Asio::Asio)
target_compile_features(obs-websocket PRIVATE cxx_std_17) set_target_properties_obs(
obs-websocket
PROPERTIES FOLDER plugins
PREFIX ""
AUTOMOC ON
AUTOUIC ON
AUTORCC ON)
set_target_properties(obs-websocket PROPERTIES FOLDER "plugins/obs-websocket") if(OS_WINDOWS)
set_property(
if(PLUGIN_TESTS) TARGET obs-websocket
target_compile_definitions(obs-websocket PRIVATE PLUGIN_TESTS) APPEND
PROPERTY AUTORCC_OPTIONS --format-version 1)
endif() endif()
# Random other things
if(WIN32)
add_definitions(-D_WEBSOCKETPP_CPP11_STL_)
endif()
if(MSVC)
target_compile_options(obs-websocket PRIVATE /wd4267 /wd4996)
else()
target_compile_options(
obs-websocket
PRIVATE
-Wall
"$<$<COMPILE_LANG_AND_ID:CXX,GNU>:-Wno-error=format-overflow>"
"$<$<COMPILE_LANG_AND_ID:CXX,AppleClang,Clang>:-Wno-error=null-pointer-subtraction;-Wno-error=deprecated-declarations>"
)
endif()
# Final CMake helpers
setup_plugin_target(obs-websocket)
setup_target_resources(obs-websocket "obs-plugins/obs-websocket")

View File

@ -31,21 +31,30 @@ It is **highly recommended** to keep obs-websocket protected with a password aga
### Client software ### Client software
- [Macro Deck](https://www.macrodeck.org/)
- [Touch Portal](https://www.touch-portal.com/) - [Touch Portal](https://www.touch-portal.com/)
- [Twitchat](https://twitchat.fr/) - [Twitchat](https://twitchat.fr/)
- [OBS-web](https://github.com/Niek/obs-web) - hosted client at [obs-web.niek.tv/](http://obs-web.niek.tv/) - [OBS-web](https://github.com/Niek/obs-web) - hosted client at [obs-web.niek.tv/](http://obs-web.niek.tv/)
- [Streamer.bot](https://streamer.bot/)
- [Deckboard](https://deckboard.app/)
- [OBS Blade](https://github.com/Kounex/obs_blade)
- [Aitum](https://aitum.tv/)
- [Kruiz Control](https://github.com/Kruiser8/Kruiz-Control)
- [Bitfocus Companion Module](https://bitfocus.io/companion/)
### Client libraries (for developers) ### Client libraries (for developers)
Here's a list of available language APIs for obs-websocket: Here's a list of available language APIs for obs-websocket:
- Python 3.7+ (Asyncio): [simpleobsws](https://github.com/IRLToolkit/simpleobsws/tree/master) by IRLToolkit - Python 3.7+ (Asyncio): [simpleobsws](https://github.com/IRLToolkit/simpleobsws/tree/master) by IRLToolkit
- Python 3.10+ (Non-Asyncio): [obsws-python](https://pypi.org/project/obsws-python) by aatikturk and onyx-and-iris
- Rust: [obws](https://github.com/dnaka91/obws) by dnaka91 - Rust: [obws](https://github.com/dnaka91/obws) by dnaka91
- Godot 3.4.x: [obs-websocket-gd](https://github.com/you-win/obs-websocket-gd) by you-win - Godot 3.4.x: [obs-websocket-gd](https://github.com/you-win/obs-websocket-gd) by you-win
- Javascript (Node and web): [obs-websocket-js](https://github.com/obs-websocket-community-projects/obs-websocket-js) by OBS Websocket Community - Javascript (Node and web): [obs-websocket-js](https://github.com/obs-websocket-community-projects/obs-websocket-js) by OBS Websocket Community
- C (uses obs-websocket-js): [v8-libwebsocket-obs-websocket](https://github.com/dgatwood/v8-libwebsocket-obs-websocket) - C (uses obs-websocket-js): [v8-libwebsocket-obs-websocket](https://github.com/dgatwood/v8-libwebsocket-obs-websocket)
- Go: [goobs](https://github.com/andreykaipov/goobs) by andreykaipov - Go: [goobs](https://github.com/andreykaipov/goobs) by andreykaipov
- Dart/Flutter (can target all supported platforms): [obs_websocket](https://github.com/faithoflifedev/obs_websocket) by faithoflifedev - Dart/Flutter (can target all supported platforms): [obs_websocket](https://github.com/faithoflifedev/obs_websocket) by faithoflifedev
- Java: [obs-websocket-java](https://github.com/obs-websocket-community-projects/obs-websocket-java) by OBS Websocket Community
The 5.x server is a typical WebSocket server running by default on port 4455 (the port number can be changed in the Settings dialog under `Tools`). The 5.x server is a typical WebSocket server running by default on port 4455 (the port number can be changed in the Settings dialog under `Tools`).
The protocol we use is documented in [PROTOCOL.md](docs/generated/protocol.md). The protocol we use is documented in [PROTOCOL.md](docs/generated/protocol.md).

174
cmake/legacy.cmake Normal file
View File

@ -0,0 +1,174 @@
project(obs-websocket VERSION 5.2.2)
set(OBS_WEBSOCKET_RPC_VERSION 1)
option(ENABLE_WEBSOCKET "Enable building OBS with websocket plugin" ON)
if(NOT ENABLE_WEBSOCKET OR NOT ENABLE_UI)
message(STATUS "OBS: DISABLED obs-websocket")
return()
endif()
# Submodule deps check
if(NOT EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/deps/qr/cpp/QrCode.hpp)
obs_status(FATAL_ERROR "obs-websocket submodule deps not available.")
endif()
# Plugin tests flag
option(PLUGIN_TESTS "Enable plugin runtime tests" OFF)
# Find Qt
find_qt(COMPONENTS Core Widgets Svg Network)
# Find nlohmann JSON
find_package(nlohmann_json 3 REQUIRED)
# Find WebSocket++
find_package(Websocketpp 0.8 REQUIRED)
# Find Asio
find_package(Asio 1.12.1 REQUIRED)
# Tell websocketpp not to use system boost
add_definitions(-DASIO_STANDALONE)
# Configure files
configure_file(src/plugin-macros.h.in plugin-macros.generated.h)
# Setup target
add_library(obs-websocket MODULE)
add_library(OBS::websocket ALIAS obs-websocket)
set_target_properties(
obs-websocket
PROPERTIES AUTOMOC ON
AUTOUIC ON
AUTORCC ON)
if(_QT_VERSION EQUAL 6 AND OS_WINDOWS)
set_target_properties(obs-websocket PROPERTIES AUTORCC_OPTIONS "--format-version;1")
endif()
target_include_directories(obs-websocket PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
target_sources(
obs-websocket
PRIVATE src/obs-websocket.cpp
src/obs-websocket.h
src/Config.cpp
src/Config.h
lib/obs-websocket-api.h
src/forms/SettingsDialog.cpp
src/forms/SettingsDialog.h
src/forms/ConnectInfo.cpp
src/forms/ConnectInfo.h
src/forms/resources.qrc
src/WebSocketApi.cpp
src/WebSocketApi.h
src/websocketserver/WebSocketServer.cpp
src/websocketserver/WebSocketServer_Protocol.cpp
src/websocketserver/WebSocketServer.h
src/websocketserver/rpc/WebSocketSession.cpp
src/websocketserver/rpc/WebSocketSession.h
src/websocketserver/types/WebSocketCloseCode.h
src/websocketserver/types/WebSocketOpCode.h
src/eventhandler/EventHandler.cpp
src/eventhandler/EventHandler_General.cpp
src/eventhandler/EventHandler_Config.cpp
src/eventhandler/EventHandler_Scenes.cpp
src/eventhandler/EventHandler_Inputs.cpp
src/eventhandler/EventHandler_Transitions.cpp
src/eventhandler/EventHandler_Filters.cpp
src/eventhandler/EventHandler_Outputs.cpp
src/eventhandler/EventHandler_SceneItems.cpp
src/eventhandler/EventHandler_MediaInputs.cpp
src/eventhandler/EventHandler_Ui.cpp
src/eventhandler/EventHandler.h
src/eventhandler/types/EventSubscription.h
src/requesthandler/RequestHandler.cpp
src/requesthandler/RequestHandler_General.cpp
src/requesthandler/RequestHandler_Config.cpp
src/requesthandler/RequestHandler_Sources.cpp
src/requesthandler/RequestHandler_Scenes.cpp
src/requesthandler/RequestHandler_Inputs.cpp
src/requesthandler/RequestHandler_Transitions.cpp
src/requesthandler/RequestHandler_Filters.cpp
src/requesthandler/RequestHandler_SceneItems.cpp
src/requesthandler/RequestHandler_Outputs.cpp
src/requesthandler/RequestHandler_Stream.cpp
src/requesthandler/RequestHandler_Record.cpp
src/requesthandler/RequestHandler_MediaInputs.cpp
src/requesthandler/RequestHandler_Ui.cpp
src/requesthandler/RequestHandler.h
src/requesthandler/RequestBatchHandler.cpp
src/requesthandler/RequestBatchHandler.h
src/requesthandler/rpc/Request.cpp
src/requesthandler/rpc/Request.h
src/requesthandler/rpc/RequestBatchRequest.cpp
src/requesthandler/rpc/RequestBatchRequest.h
src/requesthandler/rpc/RequestResult.cpp
src/requesthandler/rpc/RequestResult.h
src/requesthandler/types/RequestStatus.h
src/requesthandler/types/RequestBatchExecutionType.h
src/utils/Crypto.cpp
src/utils/Crypto.h
src/utils/Json.cpp
src/utils/Json.h
src/utils/Obs.cpp
src/utils/Obs_StringHelper.cpp
src/utils/Obs_NumberHelper.cpp
src/utils/Obs_ArrayHelper.cpp
src/utils/Obs_ObjectHelper.cpp
src/utils/Obs_SearchHelper.cpp
src/utils/Obs_ActionHelper.cpp
src/utils/Obs.h
src/utils/Obs_VolumeMeter.cpp
src/utils/Obs_VolumeMeter.h
src/utils/Obs_VolumeMeter_Helpers.h
src/utils/Platform.cpp
src/utils/Platform.h
src/utils/Compat.cpp
src/utils/Compat.h
src/utils/Utils.h
deps/qr/cpp/QrCode.cpp
deps/qr/cpp/QrCode.hpp)
target_link_libraries(
obs-websocket
PRIVATE OBS::libobs
OBS::frontend-api
Qt::Core
Qt::Widgets
Qt::Svg
Qt::Network
nlohmann_json::nlohmann_json
Websocketpp::Websocketpp
Asio::Asio)
target_compile_features(obs-websocket PRIVATE cxx_std_17)
set_target_properties(obs-websocket PROPERTIES FOLDER "plugins/obs-websocket")
if(PLUGIN_TESTS)
target_compile_definitions(obs-websocket PRIVATE PLUGIN_TESTS)
endif()
# Random other things
if(WIN32)
add_definitions(-D_WEBSOCKETPP_CPP11_STL_)
endif()
if(MSVC)
target_compile_options(obs-websocket PRIVATE /wd4267 /wd4996)
else()
target_compile_options(
obs-websocket
PRIVATE
-Wall
"$<$<COMPILE_LANG_AND_ID:CXX,GNU>:-Wno-error=format-overflow>"
"$<$<COMPILE_LANG_AND_ID:CXX,AppleClang,Clang>:-Wno-error=null-pointer-subtraction;-Wno-error=deprecated-declarations>"
)
endif()
# Final CMake helpers
setup_plugin_target(obs-websocket)
setup_target_resources(obs-websocket "obs-plugins/obs-websocket")

28
cmake/macos/Info.plist.in Normal file
View File

@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleName</key>
<string>obs-websocket</string>
<key>CFBundleIdentifier</key>
<string>com.obsproject.obs-websocket</string>
<key>CFBundleVersion</key>
<string>${MACOSX_BUNDLE_BUNDLE_VERSION}</string>
<key>CFBundleShortVersionString</key>
<string>${MACOSX_BUNDLE_SHORT_VERSION_STRING}</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleExecutable</key>
<string>obs-websocket</string>
<key>CFBundlePackageType</key>
<string>BNDL</string>
<key>CFBundleSupportedPlatforms</key>
<array>
<string>MacOSX</string>
</array>
<key>LSMinimumSystemVersion</key>
<string>${CMAKE_OSX_DEPLOYMENT_TARGET}</string>
<key>NSHumanReadableCopyright</key>
<string>(c) 2016-${CURRENT_YEAR} Stéphane Lepin, Kyle Manning</string>
</dict>
</plist>

View File

@ -1,5 +1,5 @@
OBSWebSocket.Plugin.Description="التحكم عن بعد في استوديو OBS من خلال WebSocket" OBSWebSocket.Plugin.Description="التحكم عن بعد في استوديو OBS من خلال WebSocket"
OBSWebSocket.Settings.DialogTitle="إعدادات obs-websocket" OBSWebSocket.Settings.DialogTitle="إعدادات خادم WebSocket"
OBSWebSocket.Settings.PluginSettingsTitle="إعدادات الإضافات" OBSWebSocket.Settings.PluginSettingsTitle="إعدادات الإضافات"
OBSWebSocket.Settings.ServerEnable="تمكين خادم WebSocket" OBSWebSocket.Settings.ServerEnable="تمكين خادم WebSocket"
OBSWebSocket.Settings.AlertsEnable="تمكين تنبيهات شريط النظام" OBSWebSocket.Settings.AlertsEnable="تمكين تنبيهات شريط النظام"

View File

@ -1,5 +1,5 @@
OBSWebSocket.Plugin.Description="Control remot de l'OBS Studio mitjançant un servidor web" OBSWebSocket.Plugin.Description="Control remot de l'OBS Studio mitjançant un servidor web"
OBSWebSocket.Settings.DialogTitle="Configuració del servidor web de l'OBS" OBSWebSocket.Settings.DialogTitle="Configuració del servidor WebSocket"
OBSWebSocket.Settings.PluginSettingsTitle="Configuració del complement" OBSWebSocket.Settings.PluginSettingsTitle="Configuració del complement"
OBSWebSocket.Settings.ServerEnable="Habilita el servidor web" OBSWebSocket.Settings.ServerEnable="Habilita el servidor web"
OBSWebSocket.Settings.AlertsEnable="Habilita les notificacions a la barra de tasques" OBSWebSocket.Settings.AlertsEnable="Habilita les notificacions a la barra de tasques"

View File

@ -1,5 +1,5 @@
OBSWebSocket.Plugin.Description="Vzdálené ovládání OBS Studia přes WebSocket" OBSWebSocket.Plugin.Description="Vzdálené ovládání OBS Studia přes WebSocket"
OBSWebSocket.Settings.DialogTitle="Nastavení obs-websocket" OBSWebSocket.Settings.DialogTitle="Nastavení WebSocket serveru"
OBSWebSocket.Settings.PluginSettingsTitle="Nastavení pluginu" OBSWebSocket.Settings.PluginSettingsTitle="Nastavení pluginu"
OBSWebSocket.Settings.ServerEnable="Povolit WebSocketový server" OBSWebSocket.Settings.ServerEnable="Povolit WebSocketový server"
OBSWebSocket.Settings.AlertsEnable="Povolit upozornění v systémové liště" OBSWebSocket.Settings.AlertsEnable="Povolit upozornění v systémové liště"

View File

@ -1,5 +1,4 @@
OBSWebSocket.Plugin.Description="Fjernstyring af OBS Studio via WebSocket" OBSWebSocket.Plugin.Description="Fjernstyring af OBS Studio via WebSocket"
OBSWebSocket.Settings.DialogTitle="obs-websocket Indstillinger"
OBSWebSocket.Settings.PluginSettingsTitle="Plugin-indstillinger" OBSWebSocket.Settings.PluginSettingsTitle="Plugin-indstillinger"
OBSWebSocket.Settings.ServerEnable="Aktivér WebSocket-server" OBSWebSocket.Settings.ServerEnable="Aktivér WebSocket-server"
OBSWebSocket.Settings.AlertsEnable="Aktivér Systembakke Alarmer" OBSWebSocket.Settings.AlertsEnable="Aktivér Systembakke Alarmer"

View File

@ -1,5 +1,5 @@
OBSWebSocket.Plugin.Description="OBS Studio per WebSocket fernsteuern" OBSWebSocket.Plugin.Description="OBS Studio per WebSocket fernsteuern"
OBSWebSocket.Settings.DialogTitle="obs-websocket-Einstellungen" OBSWebSocket.Settings.DialogTitle="WebSocket-Servereinstellungen"
OBSWebSocket.Settings.PluginSettingsTitle="Plugineinstellungen" OBSWebSocket.Settings.PluginSettingsTitle="Plugineinstellungen"
OBSWebSocket.Settings.ServerEnable="WebSocket-Server aktivieren" OBSWebSocket.Settings.ServerEnable="WebSocket-Server aktivieren"
OBSWebSocket.Settings.AlertsEnable="Warnungen im Infobereich aktivieren" OBSWebSocket.Settings.AlertsEnable="Warnungen im Infobereich aktivieren"

42
data/locale/el-GR.ini Normal file
View File

@ -0,0 +1,42 @@
OBSWebSocket.Plugin.Description="Απομακρυσμένος έλεγχος του OBS Studio μέσω WebSocket"
OBSWebSocket.Settings.PluginSettingsTitle="Ρυθμίσεις Προσθέτων"
OBSWebSocket.Settings.ServerEnable="Ενεργοποίηση διακομιστή WebSocket"
OBSWebSocket.Settings.AlertsEnable="Ενεργοποίηση Ειδοποιήσεων στο System Tray"
OBSWebSocket.Settings.DebugEnable="Ενεργοποίηση καταγραφής σφαλμάτων"
OBSWebSocket.Settings.DebugEnableHoverText="Ενεργοποιεί την καταγραφή σφαλμάτων για την τρέχουσα εικόνα του OBS. Δεν επιμένει κατά τη φόρτωση.\nΧρησιμοποίησε το --websocket_debug για να ενεργοποιηθεί κατά τη φόρτωση."
OBSWebSocket.Settings.ServerSettingsTitle="Ρυθμίσεις Διακομιστή"
OBSWebSocket.Settings.AuthRequired="Ενεργοποίηση Επαλήθευσης Στοιχείων"
OBSWebSocket.Settings.Password="Κωδικός Διακομιστή"
OBSWebSocket.Settings.GeneratePassword="Δημιουργία Κωδικού"
OBSWebSocket.Settings.ServerPort="Θύρα Διακομιστή"
OBSWebSocket.Settings.ShowConnectInfo="Εμφάνιση Πληροφοριών Σύνδεσης"
OBSWebSocket.Settings.ShowConnectInfoWarningTitle="Προειδοποίηση: Ενεργό επί του Παρόντος"
OBSWebSocket.Settings.ShowConnectInfoWarningMessage="Φαίνεται ότι μια έξοδος (ροή, εγγραφή, κλπ.) είναι ενεργή αυτή τη στιγμή."
OBSWebSocket.Settings.ShowConnectInfoWarningInfoText="Είστε βέβαιοι ότι θέλετε να εμφανιστούν οι πληροφορίες σύνδεσης σας?"
OBSWebSocket.Settings.Save.UserPasswordWarningTitle="Προειδοποίηση: Πιθανό Πρόβλημα Ασφαλείας"
OBSWebSocket.Settings.Save.UserPasswordWarningMessage="Το obs-websocket αποθηκεύει τον κωδικό πρόσβασης του διακομιστή ως απλό κείμενο. Χρησιμοποιώντας έναν κωδικό πρόσβασης που δημιουργείται από το obs-websocket συνιστάται ιδιαίτερα."
OBSWebSocket.Settings.Save.UserPasswordWarningInfoText="Είστε βέβαιοι ότι θέλετε να χρησιμοποιήσετε το δικό σας κωδικό πρόσβασης?"
OBSWebSocket.Settings.Save.PasswordInvalidErrorTitle="Σφάλμα: Μη Έγκυρη Ρύθμιση"
OBSWebSocket.Settings.Save.PasswordInvalidErrorMessage="Πρέπει να χρησιμοποιήσετε έναν κωδικό πρόσβασης με 6 ή περισσότερους χαρακτήρες."
OBSWebSocket.SessionTable.Title="Συνδεδεμένες Συνεδρίες WebSocket"
OBSWebSocket.SessionTable.RemoteAddressColumnTitle="Απομακρυσμένη Διεύθυνση"
OBSWebSocket.SessionTable.SessionDurationColumnTitle="Διάρκεια Συνεδρίας"
OBSWebSocket.SessionTable.MessagesInOutColumnTitle="Εισερχόμενα/Εξερχόμενα Μηνύματα"
OBSWebSocket.SessionTable.IdentifiedTitle="Ταυτοποιήθηκε"
OBSWebSocket.SessionTable.KickButtonColumnTitle="Διακοπή?"
OBSWebSocket.SessionTable.KickButtonText="Διακοπή"
OBSWebSocket.ConnectInfo.DialogTitle="Πληροφορίες Σύνδεσης WebSocket"
OBSWebSocket.ConnectInfo.CopyText="Αντιγραφή"
OBSWebSocket.ConnectInfo.ServerIp="IP Διακομιστή (Βέλτιστη Εκτίμηση)"
OBSWebSocket.ConnectInfo.ServerPort="Θύρα Διακομιστή"
OBSWebSocket.ConnectInfo.ServerPassword="Κωδικός Διακομιστή"
OBSWebSocket.ConnectInfo.ServerPasswordPlaceholderText="[Ταυτοποίηση Απενεργοποιημένη]"
OBSWebSocket.ConnectInfo.QrTitle="Σύνδεση με QR"
OBSWebSocket.TrayNotification.Identified.Title="Νέα Σύνδεση WebSocket"
OBSWebSocket.TrayNotification.Identified.Body="Ο πελάτης %1 ταυτοποιήθηκε."
OBSWebSocket.TrayNotification.AuthenticationFailed.Title="Αποτυχία Ταυτοποίησης WebSocket"
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Αποτυχία ταυτοποίησης του πελάτη %1."
OBSWebSocket.TrayNotification.Disconnected.Title="Αποσυνδέθηκε ο Πελάτης του WebSocket"
OBSWebSocket.TrayNotification.Disconnected.Body="Ο πελάτης %1 αποσυνδέθηκε."
OBSWebSocket.Server.StartFailed.Title="Αποτυχία Διακομιστή WebSocket"
OBSWebSocket.Server.StartFailed.Message="Ο διακομιστής WebSocket απέτυχε να ξεκινήσει. Η θύρα %1 TCP μπορεί ήδη να χρησιμοποιείται από μια άλλη εφαρμογή σε αυτό το σύστημα. Δοκιμάστε να ορίσετε μια διαφορετική θύρα TCP στις ρυθμίσεις διακομιστή WebSocket ή να σταματήσετε οποιαδήποτε εφαρμογή που θα μπορούσε να χρησιμοποιήσει αυτή τη θύρα.\n Μήνυμα σφάλματος: %2"

View File

@ -1,6 +1,6 @@
OBSWebSocket.Plugin.Description="Remote-control of OBS Studio through WebSocket" OBSWebSocket.Plugin.Description="Remote-control of OBS Studio through WebSocket"
OBSWebSocket.Settings.DialogTitle="obs-websocket Settings" OBSWebSocket.Settings.DialogTitle="WebSocket Server Settings"
OBSWebSocket.Settings.PluginSettingsTitle="Plugin Settings" OBSWebSocket.Settings.PluginSettingsTitle="Plugin Settings"
OBSWebSocket.Settings.ServerEnable="Enable WebSocket server" OBSWebSocket.Settings.ServerEnable="Enable WebSocket server"

View File

@ -1,5 +1,5 @@
OBSWebSocket.Plugin.Description="Control remoto de OBS Studio a través de WebSocket" OBSWebSocket.Plugin.Description="Control remoto de OBS Studio a través de WebSocket"
OBSWebSocket.Settings.DialogTitle="Ajustes de obs-websocket" OBSWebSocket.Settings.DialogTitle="Ajustes del servidor WebSocket"
OBSWebSocket.Settings.PluginSettingsTitle="Ajustes del plugin" OBSWebSocket.Settings.PluginSettingsTitle="Ajustes del plugin"
OBSWebSocket.Settings.ServerEnable="Habilitar servidor WebSocket" OBSWebSocket.Settings.ServerEnable="Habilitar servidor WebSocket"
OBSWebSocket.Settings.AlertsEnable="Habilitar alertas en la bandeja del sistema" OBSWebSocket.Settings.AlertsEnable="Habilitar alertas en la bandeja del sistema"

View File

@ -1,5 +1,5 @@
OBSWebSocket.Plugin.Description="OBS Studio kaugjuhtimine WebSocketi kaudu" OBSWebSocket.Plugin.Description="OBS Studio kaugjuhtimine WebSocketi kaudu"
OBSWebSocket.Settings.DialogTitle="obs-websocket seaded" OBSWebSocket.Settings.DialogTitle="WebSocket serveri seaded"
OBSWebSocket.Settings.PluginSettingsTitle="Plugina seaded" OBSWebSocket.Settings.PluginSettingsTitle="Plugina seaded"
OBSWebSocket.Settings.ServerEnable="Luba WebSocket server" OBSWebSocket.Settings.ServerEnable="Luba WebSocket server"
OBSWebSocket.Settings.AlertsEnable="Luba hoiatused tegumireal" OBSWebSocket.Settings.AlertsEnable="Luba hoiatused tegumireal"

42
data/locale/eu-ES.ini Normal file
View File

@ -0,0 +1,42 @@
OBSWebSocket.Plugin.Description="OBS Studioren urruneko kontrolatzailea WebSocket-en bidez"
OBSWebSocket.Settings.PluginSettingsTitle="Plugin Ezarpenak"
OBSWebSocket.Settings.ServerEnable="WebSocket zerbitzaria gaitu"
OBSWebSocket.Settings.AlertsEnable="Aktibatu sistema-erretiluko alertak"
OBSWebSocket.Settings.DebugEnable="Gaitu arazketa erregistroa"
OBSWebSocket.Settings.DebugEnableHoverText="OBSren uneko instantzian arazketa erregistroa gaitzen du. Berriro irekitzerakoan ez da mantenduko . \nErabili --websocket_debug kargatzerakoan gaitzeko."
OBSWebSocket.Settings.ServerSettingsTitle="Zerbitzariaren Ezarpenak"
OBSWebSocket.Settings.AuthRequired="Autentifikazioa aktibatu"
OBSWebSocket.Settings.Password="Zerbitzari pasahitza"
OBSWebSocket.Settings.GeneratePassword="Pasahitza sortu"
OBSWebSocket.Settings.ServerPort="Zerbitzari portua"
OBSWebSocket.Settings.ShowConnectInfo="Konexio-informazioa erakutsi"
OBSWebSocket.Settings.ShowConnectInfoWarningTitle="Adi: Zuzenean zaude"
OBSWebSocket.Settings.ShowConnectInfoWarningMessage="Irteera bat (stream, grabazioa, etab.) aktibo dagoela badirudi."
OBSWebSocket.Settings.ShowConnectInfoWarningInfoText="Ziur zaude konexio-informazioa erakutsi nahi duzula?"
OBSWebSocket.Settings.Save.UserPasswordWarningTitle="Adi: Segurtasun arazo potentziala"
OBSWebSocket.Settings.Save.UserPasswordWarningMessage="obs-websocket-ek zerbitzariaren pasahitza testu sinple gisa gordetzen du. obs-websocket bidez sortutako pasahitza erabiltzea gomendatzen da."
OBSWebSocket.Settings.Save.UserPasswordWarningInfoText="Ziur zaude zure pasahitza erabili nahi duzula?"
OBSWebSocket.Settings.Save.PasswordInvalidErrorTitle="Errorea: konfigurazio baliogabea"
OBSWebSocket.Settings.Save.PasswordInvalidErrorMessage="6 karaktere edo gehiagoko pasahitza erabili behar duzu."
OBSWebSocket.SessionTable.Title="Konektatutako WebSocket saioak"
OBSWebSocket.SessionTable.RemoteAddressColumnTitle="Urruneko helbidea"
OBSWebSocket.SessionTable.SessionDurationColumnTitle="Saioaren iraupena"
OBSWebSocket.SessionTable.MessagesInOutColumnTitle="Sarrera-/irteera-mezuak"
OBSWebSocket.SessionTable.IdentifiedTitle="Identifikatuta"
OBSWebSocket.SessionTable.KickButtonColumnTitle="Kanporatu?"
OBSWebSocket.SessionTable.KickButtonText="Kanporatu"
OBSWebSocket.ConnectInfo.DialogTitle="WebSocket konexio-informazioa"
OBSWebSocket.ConnectInfo.CopyText="Kopiatu"
OBSWebSocket.ConnectInfo.ServerIp="Zerbitzariaren IP-a (proposamen hoberena)"
OBSWebSocket.ConnectInfo.ServerPort="Zerbitzari portua"
OBSWebSocket.ConnectInfo.ServerPassword="Zerbitzari pasahitza"
OBSWebSocket.ConnectInfo.ServerPasswordPlaceholderText="[Autorizazioa desgaituta]"
OBSWebSocket.ConnectInfo.QrTitle="Konexioaren QR kodea"
OBSWebSocket.TrayNotification.Identified.Title="WebSocket konexio berria"
OBSWebSocket.TrayNotification.Identified.Body="%1 bezeroa identifikatuta."
OBSWebSocket.TrayNotification.AuthenticationFailed.Title="WebSocket Autentikazioan hutsegitea"
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="%1 bezeroak autentifikatzen huts egin du."
OBSWebSocket.TrayNotification.Disconnected.Title="WebSocket Bezeroa deskonektatu da"
OBSWebSocket.TrayNotification.Disconnected.Body="%1 bezeroa deskonektatu da."
OBSWebSocket.Server.StartFailed.Title="WebSocket Zerbitzari hutsegitea"
OBSWebSocket.Server.StartFailed.Message="WebSocket zerbitzaria ez da hasi. %1 TCP portua agian dagoeneko beste aplikazio batek erabiltzen ari du sistema honetan. Saiatu beste TCP portu bat konfiguratzen WebSocket zerbitzariaren konfigurazioan, edo portu hori erabiltzen ari den edozein aplikazio geldiarazi.\nErrore-mezua: %2"

View File

@ -1,3 +1,43 @@
OBSWebSocket.Plugin.Description="کنترل از راه دور OBS Studio از طریق WebSocket"
OBSWebSocket.Settings.DialogTitle="تنظیمات سرور سوکت وب"
OBSWebSocket.Settings.PluginSettingsTitle="تنظیمات پلاگین"
OBSWebSocket.Settings.ServerEnable="سرور سوکت وب را فعال کنید"
OBSWebSocket.Settings.AlertsEnable="هشدارهای سینی سیستم را فعال کنید"
OBSWebSocket.Settings.DebugEnable="فعال کردن گزارش اشکال زدایی"
OBSWebSocket.Settings.DebugEnableHoverText="ثبت اشکال زدایی را برای نمونه فعلی OBS فعال می کند. در بارگذاری ادامه نمی‌یابد.\n برای فعال کردن در بارگذاری از --websocket_debug استفاده کنید."
OBSWebSocket.Settings.ServerSettingsTitle="تنظیمات سرور"
OBSWebSocket.Settings.AuthRequired="فعال کردن احراز هویت"
OBSWebSocket.Settings.Password="رمز سرور"
OBSWebSocket.Settings.GeneratePassword="ایجاد رمز عبور"
OBSWebSocket.Settings.ServerPort="پورت سرور"
OBSWebSocket.Settings.ShowConnectInfo="نمایش اطلاعات اتصال"
OBSWebSocket.Settings.ShowConnectInfoWarningTitle="هشدار: در حال حاضر زنده است"
OBSWebSocket.Settings.ShowConnectInfoWarningMessage="به نظر می رسد که یک خروجی (جریان، ضبط و غیره) در حال حاضر فعال است."
OBSWebSocket.Settings.ShowConnectInfoWarningInfoText="آیا مطمئن هستید که می خواهید اطلاعات اتصال خود را نشان دهید؟"
OBSWebSocket.Settings.Save.UserPasswordWarningTitle="هشدار: مشکل امنیتی احتمالی"
OBSWebSocket.Settings.Save.UserPasswordWarningMessage="obs-websocket رمز عبور سرور را به صورت متن ساده ذخیره می کند. استفاده از رمز عبور تولید شده توسط obs-websocket بسیار توصیه می شود."
OBSWebSocket.Settings.Save.UserPasswordWarningInfoText="آیا مطمئن هستید که می خواهید از رمز عبور خود استفاده کنید؟"
OBSWebSocket.Settings.Save.PasswordInvalidErrorTitle="خطا: پیکربندی نامعتبر است"
OBSWebSocket.Settings.Save.PasswordInvalidErrorMessage="باید از رمز عبور 6 کاراکتر یا بیشتر استفاده کنید."
OBSWebSocket.SessionTable.Title="جلسات سوکت وب متصل"
OBSWebSocket.SessionTable.RemoteAddressColumnTitle="آدرس از راه دور"
OBSWebSocket.SessionTable.SessionDurationColumnTitle="مدت زمان جلسه"
OBSWebSocket.SessionTable.MessagesInOutColumnTitle="پیام های ورودی/خارجی"
OBSWebSocket.SessionTable.IdentifiedTitle="تایید هویت شده"
OBSWebSocket.SessionTable.KickButtonColumnTitle="لگد زدن؟" OBSWebSocket.SessionTable.KickButtonColumnTitle="لگد زدن؟"
OBSWebSocket.SessionTable.KickButtonText="اخراج" OBSWebSocket.SessionTable.KickButtonText="اخراج"
OBSWebSocket.ConnectInfo.DialogTitle="اطلاعات اتصال سوکت وب"
OBSWebSocket.ConnectInfo.CopyText="رونوشت‌" OBSWebSocket.ConnectInfo.CopyText="رونوشت‌"
OBSWebSocket.ConnectInfo.ServerIp="IP سرور (بهترین حدس)"
OBSWebSocket.ConnectInfo.ServerPort="پورت سرور"
OBSWebSocket.ConnectInfo.ServerPassword="رمز سرور"
OBSWebSocket.ConnectInfo.ServerPasswordPlaceholderText="[احراز غیر فعال]"
OBSWebSocket.ConnectInfo.QrTitle="QR را وصل کنید"
OBSWebSocket.TrayNotification.Identified.Title="اتصال سوکت وب جدید"
OBSWebSocket.TrayNotification.Identified.Body="سرویس گیرنده %1 شناسایی شد."
OBSWebSocket.TrayNotification.AuthenticationFailed.Title="خرابی تأیید اعتبار سوکت وب"
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="سرویس گیرنده %1 احراز هویت نشد."
OBSWebSocket.TrayNotification.Disconnected.Title="سرویس گیرنده سوکت وب قطع شد"
OBSWebSocket.TrayNotification.Disconnected.Body="سرویس گیرنده %1 قطع شد."
OBSWebSocket.Server.StartFailed.Title="خرابی سرور سوکت وب"
OBSWebSocket.Server.StartFailed.Message="سرور WebSocket راه‌اندازی نشد. درگاه TCP % 1 ممکن است قبلاً در جای دیگری در این سیستم توسط برنامه دیگری استفاده شده باشد. یک پورت TCP دیگر را در تنظیمات سرور WebSocket تنظیم کنید، یا هر برنامه‌ای را که می‌تواند از این پورت استفاده کند متوقف کنید.\n پیام خطا: %2"

View File

@ -1,5 +1,5 @@
OBSWebSocket.Plugin.Description="OBS Studion etähallinta WebSocketin kautta" OBSWebSocket.Plugin.Description="OBS Studion etähallinta WebSocketin kautta"
OBSWebSocket.Settings.DialogTitle="obs-websocketin asetukset" OBSWebSocket.Settings.DialogTitle="WebSocket-palvelimen asetukset"
OBSWebSocket.Settings.PluginSettingsTitle="Liitännäisen asetukset" OBSWebSocket.Settings.PluginSettingsTitle="Liitännäisen asetukset"
OBSWebSocket.Settings.ServerEnable="Ota WebSocket-palvelin käyttöön" OBSWebSocket.Settings.ServerEnable="Ota WebSocket-palvelin käyttöön"
OBSWebSocket.Settings.AlertsEnable="Ota ilmoitusalueen ilmoitukset käyttöön" OBSWebSocket.Settings.AlertsEnable="Ota ilmoitusalueen ilmoitukset käyttöön"

39
data/locale/fil-PH.ini Normal file
View File

@ -0,0 +1,39 @@
OBSWebSocket.Plugin.Description="Remote-control ng OBS Studio sa pamamagitan ng WebSocket"
OBSWebSocket.Settings.DialogTitle="Mga Setting Ng WebSocket Server"
OBSWebSocket.Settings.PluginSettingsTitle="Mga Setting ng Plugin"
OBSWebSocket.Settings.ServerEnable="Paganahin ang WebSocket server"
OBSWebSocket.Settings.AlertsEnable="Paganahin ang System Tray Alerto"
OBSWebSocket.Settings.DebugEnable="Paganahin ang Debug Log"
OBSWebSocket.Settings.DebugEnableHoverText="Paganahin ang debug log para sa kasalukuyang instance ng OBS. Hindi nagpapatuloy sa pag-load.\nGumamit ng --websocket_debug upang paganahin ang pag-load."
OBSWebSocket.Settings.ServerSettingsTitle="Mga setting ng Server"
OBSWebSocket.Settings.AuthRequired="Paggamit ng Pagpapatunay"
OBSWebSocket.Settings.Password="Password ng server"
OBSWebSocket.Settings.GeneratePassword="Mag-Generate ng Password"
OBSWebSocket.Settings.ShowConnectInfo="Ipakita ang Impormasyon sa Pagkonekta"
OBSWebSocket.Settings.ShowConnectInfoWarningTitle="Babala: Kasalukuyang nakalive"
OBSWebSocket.Settings.ShowConnectInfoWarningMessage="Lumalabas na kasalukuyang aktibo ang isang output (stream, recording, atbp.)."
OBSWebSocket.Settings.ShowConnectInfoWarningInfoText="Sigurado ka bang gusto mong ipakita ang iyong impormasyon sa pagkonekta?"
OBSWebSocket.Settings.Save.UserPasswordWarningTitle="Babala: Potensyal na Isyu sa Seguridad"
OBSWebSocket.Settings.Save.UserPasswordWarningMessage="Iniimbak ng obs-websocket ang password ng server bilang plain text. Ang paggamit ng password na nabuo ng obs-websocket ay lubos na inirerekomenda."
OBSWebSocket.Settings.Save.UserPasswordWarningInfoText="Sigurado ka bang gusto mong gamitin ang iyong sariling password?"
OBSWebSocket.Settings.Save.PasswordInvalidErrorTitle="Error: Di-wastong Configuration"
OBSWebSocket.Settings.Save.PasswordInvalidErrorMessage="Dapat kang gumamit ng password na 6 o higit pang mga character."
OBSWebSocket.SessionTable.Title="Nakakonektang WebSocket Session"
OBSWebSocket.SessionTable.SessionDurationColumnTitle="Tagal ng Session"
OBSWebSocket.SessionTable.MessagesInOutColumnTitle="Mga Mensahe In/Out"
OBSWebSocket.SessionTable.IdentifiedTitle="Kilalanin."
OBSWebSocket.SessionTable.KickButtonColumnTitle="Sipa?"
OBSWebSocket.SessionTable.KickButtonText="Sipa"
OBSWebSocket.ConnectInfo.DialogTitle="Impormasyon ng WebSocket Connect"
OBSWebSocket.ConnectInfo.CopyText="Kopyahin"
OBSWebSocket.ConnectInfo.ServerPassword="Password ng server"
OBSWebSocket.ConnectInfo.ServerPasswordPlaceholderText="[Naka-disable ang Auth]"
OBSWebSocket.ConnectInfo.QrTitle="Ikonekta ang QR"
OBSWebSocket.TrayNotification.Identified.Title="Bagong Koneksyon sa WebSocket"
OBSWebSocket.TrayNotification.Identified.Body="Natukoy ang %1 ng kliyente."
OBSWebSocket.TrayNotification.AuthenticationFailed.Title="Nabigo sa Pagpapatunay ang WebSocket"
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Nabigo ang kliyenteng %1 na patotohanan."
OBSWebSocket.TrayNotification.Disconnected.Title="Nadiskonekta ang WebSocket Client"
OBSWebSocket.TrayNotification.Disconnected.Body="Nadiskonekta ang kliyenteng %1."
OBSWebSocket.Server.StartFailed.Title="Nabigo ng WebSocket Server"
OBSWebSocket.Server.StartFailed.Message="Nabigong magsimula ang WebSocket server. Ang TCP port %1 ay maaaring ginagamit na sa ibang lugar sa system na ito ng isa pang application. Subukang magtakda ng ibang TCP port sa mga setting ng WebSocket server, o ihinto ang anumang application na maaaring gumagamit ng port na ito.\n Mensahe ng error: %2"

View File

@ -1,5 +1,5 @@
OBSWebSocket.Plugin.Description="Contrôle à distance d'OBS Studio via WebSocket" OBSWebSocket.Plugin.Description="Contrôle à distance d'OBS Studio via WebSocket"
OBSWebSocket.Settings.DialogTitle="Paramètre du websocket obs" OBSWebSocket.Settings.DialogTitle="Paramètres du serveur WebSocket"
OBSWebSocket.Settings.PluginSettingsTitle="Paramètres du plugin" OBSWebSocket.Settings.PluginSettingsTitle="Paramètres du plugin"
OBSWebSocket.Settings.ServerEnable="Activer le serveur WebSocket" OBSWebSocket.Settings.ServerEnable="Activer le serveur WebSocket"
OBSWebSocket.Settings.AlertsEnable="Activer les alertes de la zone de notification" OBSWebSocket.Settings.AlertsEnable="Activer les alertes de la zone de notification"

6
data/locale/gl-ES.ini Normal file
View File

@ -0,0 +1,6 @@
OBSWebSocket.Settings.ServerSettingsTitle="Configuración do servidor"
OBSWebSocket.ConnectInfo.CopyText="Copiar"
OBSWebSocket.ConnectInfo.ServerPort="Porto do Servidor"
OBSWebSocket.ConnectInfo.ServerPassword="Contrasinal do Servidor"
OBSWebSocket.TrayNotification.Identified.Body="Cliente %1 identificado."
OBSWebSocket.TrayNotification.Disconnected.Body="Cliente %1 desconectado."

View File

@ -1,5 +1,5 @@
OBSWebSocket.Plugin.Description="שליטה מרחוק על OBS Studio באמצעות WebSocket" OBSWebSocket.Plugin.Description="שליטה מרחוק על OBS Studio באמצעות WebSocket"
OBSWebSocket.Settings.DialogTitle="הגדרות obs-websocket" OBSWebSocket.Settings.DialogTitle="הגדרות שרת WebSocket"
OBSWebSocket.Settings.PluginSettingsTitle="הגדרות תוסף" OBSWebSocket.Settings.PluginSettingsTitle="הגדרות תוסף"
OBSWebSocket.Settings.ServerEnable="הפעלת שרת WebSocket" OBSWebSocket.Settings.ServerEnable="הפעלת שרת WebSocket"
OBSWebSocket.Settings.AlertsEnable="הפעלת התראות במגש המערכת" OBSWebSocket.Settings.AlertsEnable="הפעלת התראות במגש המערכת"

View File

@ -1,5 +1,5 @@
OBSWebSocket.Plugin.Description="WebSocket के माध्यम से OBS स्टूडियो का रिमोट-कंट्रोल" OBSWebSocket.Plugin.Description="WebSocket के माध्यम से OBS स्टूडियो का रिमोट-कंट्रोल"
OBSWebSocket.Settings.DialogTitle="obs-websocket सेटिंग्स" OBSWebSocket.Settings.DialogTitle="वेबसॉकेट सर्वर सेटिंग्स"
OBSWebSocket.Settings.PluginSettingsTitle="प्लगइन सेटिंग्स" OBSWebSocket.Settings.PluginSettingsTitle="प्लगइन सेटिंग्स"
OBSWebSocket.Settings.ServerEnable="WebSocket सर्वर सक्षम करें" OBSWebSocket.Settings.ServerEnable="WebSocket सर्वर सक्षम करें"
OBSWebSocket.Settings.AlertsEnable="सिस्टम ट्रे अलर्ट सक्षम करें" OBSWebSocket.Settings.AlertsEnable="सिस्टम ट्रे अलर्ट सक्षम करें"

1
data/locale/hr-HR.ini Normal file
View File

@ -0,0 +1 @@
OBSWebSocket.Settings.DialogTitle="Postavke servera WebSocket"

View File

@ -1,5 +1,5 @@
OBSWebSocket.Plugin.Description="Az OBS Studio távvezérlése WebSocketen keresztül" OBSWebSocket.Plugin.Description="Az OBS Studio távvezérlése WebSocketen keresztül"
OBSWebSocket.Settings.DialogTitle="Az obs-websocket beállításai" OBSWebSocket.Settings.DialogTitle="WebSocket-kiszolgáló beállításai"
OBSWebSocket.Settings.PluginSettingsTitle="Bővítménybeállítások" OBSWebSocket.Settings.PluginSettingsTitle="Bővítménybeállítások"
OBSWebSocket.Settings.ServerEnable="WebSocket-kiszolgáló engedélyezése" OBSWebSocket.Settings.ServerEnable="WebSocket-kiszolgáló engedélyezése"
OBSWebSocket.Settings.AlertsEnable="Rendszertálca-riasztások bekapcsolása" OBSWebSocket.Settings.AlertsEnable="Rendszertálca-riasztások bekapcsolása"

View File

@ -1,5 +1,5 @@
OBSWebSocket.Plugin.Description="OBS Studio-ի հեռակառավարումը WebSocket-ի միջոցով" OBSWebSocket.Plugin.Description="OBS Studio-ի հեռակառավարումը WebSocket-ի միջոցով"
OBSWebSocket.Settings.DialogTitle="obs-websocket կարգավորումներ" OBSWebSocket.Settings.DialogTitle="WebSocket Սպասարկչի Կարգավորումները"
OBSWebSocket.Settings.PluginSettingsTitle="Միացնիչի կարգավորումներ" OBSWebSocket.Settings.PluginSettingsTitle="Միացնիչի կարգավորումներ"
OBSWebSocket.Settings.ServerEnable="Միացնել WebSocket սերվերը" OBSWebSocket.Settings.ServerEnable="Միացնել WebSocket սերվերը"
OBSWebSocket.Settings.AlertsEnable="Միացնել սկուտեղի ծանուցումները" OBSWebSocket.Settings.AlertsEnable="Միացնել սկուտեղի ծանուցումները"

View File

@ -1,5 +1,5 @@
OBSWebSocket.Plugin.Description="Kendali jarak jauh OBS Studio melalui WebSocket" OBSWebSocket.Plugin.Description="Kendali jarak jauh OBS Studio melalui WebSocket"
OBSWebSocket.Settings.DialogTitle="Pengaturan obs-websocket" OBSWebSocket.Settings.DialogTitle="Pengaturan Server WebSocket"
OBSWebSocket.Settings.PluginSettingsTitle="Pengaturan Plugin" OBSWebSocket.Settings.PluginSettingsTitle="Pengaturan Plugin"
OBSWebSocket.Settings.ServerEnable="Aktifkan server WebSocket" OBSWebSocket.Settings.ServerEnable="Aktifkan server WebSocket"
OBSWebSocket.Settings.AlertsEnable="Aktifkan Peringatan Baki Sistem" OBSWebSocket.Settings.AlertsEnable="Aktifkan Peringatan Baki Sistem"

View File

@ -1,5 +1,5 @@
OBSWebSocket.Plugin.Description="Controllo remoto di OBS Studio tramite WebSocket" OBSWebSocket.Plugin.Description="Controllo remoto di OBS Studio tramite WebSocket"
OBSWebSocket.Settings.DialogTitle="Impostazioni obs-websocket" OBSWebSocket.Settings.DialogTitle="Impostazioni server WebSocket"
OBSWebSocket.Settings.PluginSettingsTitle="Impostazioni del plugin" OBSWebSocket.Settings.PluginSettingsTitle="Impostazioni del plugin"
OBSWebSocket.Settings.ServerEnable="Abilita il server WebSocket" OBSWebSocket.Settings.ServerEnable="Abilita il server WebSocket"
OBSWebSocket.Settings.AlertsEnable="Abilita avvisi sulla barra delle applicazioni" OBSWebSocket.Settings.AlertsEnable="Abilita avvisi sulla barra delle applicazioni"

View File

@ -1,5 +1,5 @@
OBSWebSocket.Plugin.Description="WebSocketを介したOBS Studioのリモートコントロール" OBSWebSocket.Plugin.Description="WebSocketを介したOBS Studioのリモートコントロール"
OBSWebSocket.Settings.DialogTitle="obs-websocket設定" OBSWebSocket.Settings.DialogTitle="WebSocket サーバー設定"
OBSWebSocket.Settings.PluginSettingsTitle="プラグイン設定" OBSWebSocket.Settings.PluginSettingsTitle="プラグイン設定"
OBSWebSocket.Settings.ServerEnable="WebSocketサーバーを有効にする" OBSWebSocket.Settings.ServerEnable="WebSocketサーバーを有効にする"
OBSWebSocket.Settings.AlertsEnable="システムトレイアラートを有効にする" OBSWebSocket.Settings.AlertsEnable="システムトレイアラートを有効にする"

View File

@ -1,5 +1,5 @@
OBSWebSocket.Plugin.Description="OBS Studio-ს დაშორებულად მართვა WebSocket-ით" OBSWebSocket.Plugin.Description="OBS Studio-ს დაშორებულად მართვა WebSocket-ით"
OBSWebSocket.Settings.DialogTitle="obs-websocket-პარამეტრები" OBSWebSocket.Settings.DialogTitle="WebSocket-სერვერის პარამეტრები"
OBSWebSocket.Settings.PluginSettingsTitle="მოდულის პარამეტრები" OBSWebSocket.Settings.PluginSettingsTitle="მოდულის პარამეტრები"
OBSWebSocket.Settings.ServerEnable="WebSocket-სერვერის ჩართვა" OBSWebSocket.Settings.ServerEnable="WebSocket-სერვერის ჩართვა"
OBSWebSocket.Settings.AlertsEnable="სისტემური არეში ცნობების ჩართვა" OBSWebSocket.Settings.AlertsEnable="სისტემური არეში ცნობების ჩართვა"
@ -14,7 +14,7 @@ OBSWebSocket.Settings.ShowConnectInfo="კავშირის შესახ
OBSWebSocket.Settings.ShowConnectInfoWarningTitle="გაფრთხილება: პირდაპირ ეთერშია" OBSWebSocket.Settings.ShowConnectInfoWarningTitle="გაფრთხილება: პირდაპირ ეთერშია"
OBSWebSocket.Settings.ShowConnectInfoWarningMessage="როგორც ჩანს, გამოტანა (ნაკადის, ჩანაწერის და სხვ.) ეთერში გადის." OBSWebSocket.Settings.ShowConnectInfoWarningMessage="როგორც ჩანს, გამოტანა (ნაკადის, ჩანაწერის და სხვ.) ეთერში გადის."
OBSWebSocket.Settings.ShowConnectInfoWarningInfoText="ნამდვილად გსურთ კავშირის მონაცემების გამოჩენა?" OBSWebSocket.Settings.ShowConnectInfoWarningInfoText="ნამდვილად გსურთ კავშირის მონაცემების გამოჩენა?"
OBSWebSocket.Settings.Save.UserPasswordWarningTitle="ყურადღება: უსაფრთხოების შესაძლო სისუსტე" OBSWebSocket.Settings.Save.UserPasswordWarningTitle="ყურადღება: სავარაუდო საფრთხე"
OBSWebSocket.Settings.Save.UserPasswordWarningMessage="obs-websocket სერვერის პაროლს ტექსტის სახით. დაჟინებით გირჩევთ, გამოიყენოთ obs-websocket-ით შედგენილი პაროლი." OBSWebSocket.Settings.Save.UserPasswordWarningMessage="obs-websocket სერვერის პაროლს ტექსტის სახით. დაჟინებით გირჩევთ, გამოიყენოთ obs-websocket-ით შედგენილი პაროლი."
OBSWebSocket.Settings.Save.UserPasswordWarningInfoText="ნამდვილად გსურთ საკუთარი პაროლის გამოყენება?" OBSWebSocket.Settings.Save.UserPasswordWarningInfoText="ნამდვილად გსურთ საკუთარი პაროლის გამოყენება?"
OBSWebSocket.Settings.Save.PasswordInvalidErrorTitle="შეცდომა: არასწორი გამართვა" OBSWebSocket.Settings.Save.PasswordInvalidErrorTitle="შეცდომა: არასწორი გამართვა"

View File

@ -1,5 +1,5 @@
OBSWebSocket.Plugin.Description="Rêveberina ji dûr ve ya OBS Studio bi riya WebSocket" OBSWebSocket.Plugin.Description="Rêveberina ji dûr ve ya OBS Studio bi riya WebSocket"
OBSWebSocket.Settings.DialogTitle="Sazkariyên obs-websocket" OBSWebSocket.Settings.DialogTitle="Sazkariyên rajekar a WebSocket"
OBSWebSocket.Settings.PluginSettingsTitle="Sazkariyên pêvekê" OBSWebSocket.Settings.PluginSettingsTitle="Sazkariyên pêvekê"
OBSWebSocket.Settings.ServerEnable="Rajekarê WebSocket çalak bike" OBSWebSocket.Settings.ServerEnable="Rajekarê WebSocket çalak bike"
OBSWebSocket.Settings.AlertsEnable="Hişyariyên darika pergalê çalak bike" OBSWebSocket.Settings.AlertsEnable="Hişyariyên darika pergalê çalak bike"

View File

@ -1,5 +1,5 @@
OBSWebSocket.Plugin.Description="WebSocket으로 OBS Studio를 원격 제어" OBSWebSocket.Plugin.Description="WebSocket으로 OBS Studio를 원격 제어"
OBSWebSocket.Settings.DialogTitle="obs-websocket 설정" OBSWebSocket.Settings.DialogTitle="WebSocket 서버 설정"
OBSWebSocket.Settings.PluginSettingsTitle="플러그인 설정" OBSWebSocket.Settings.PluginSettingsTitle="플러그인 설정"
OBSWebSocket.Settings.ServerEnable="WebSocket 서버 사용" OBSWebSocket.Settings.ServerEnable="WebSocket 서버 사용"
OBSWebSocket.Settings.AlertsEnable="시스템 트레이 알림 사용" OBSWebSocket.Settings.AlertsEnable="시스템 트레이 알림 사용"

View File

@ -1,5 +1,4 @@
OBSWebSocket.Plugin.Description="Kawalan-jauh OBS Studio melalui WebSocket" OBSWebSocket.Plugin.Description="Kawalan-jauh OBS Studio melalui WebSocket"
OBSWebSocket.Settings.DialogTitle="Tetapan obs-websocket"
OBSWebSocket.Settings.PluginSettingsTitle="Tetapan Pemalam" OBSWebSocket.Settings.PluginSettingsTitle="Tetapan Pemalam"
OBSWebSocket.Settings.ServerEnable="Benarkan pelayan WebSocket" OBSWebSocket.Settings.ServerEnable="Benarkan pelayan WebSocket"
OBSWebSocket.Settings.AlertsEnable="Benarkan Amaran Talam Sistem" OBSWebSocket.Settings.AlertsEnable="Benarkan Amaran Talam Sistem"

View File

@ -1,5 +1,5 @@
OBSWebSocket.Plugin.Description="Op afstand bediening van OBS Studio via WebSocket" OBSWebSocket.Plugin.Description="Op afstand bediening van OBS Studio via WebSocket"
OBSWebSocket.Settings.DialogTitle="obs-websocket Instellingen" OBSWebSocket.Settings.DialogTitle="WebSocket Server Instellingen"
OBSWebSocket.Settings.PluginSettingsTitle="Plugin instellingen" OBSWebSocket.Settings.PluginSettingsTitle="Plugin instellingen"
OBSWebSocket.Settings.ServerEnable="WebSocket server inschakelen" OBSWebSocket.Settings.ServerEnable="WebSocket server inschakelen"
OBSWebSocket.Settings.AlertsEnable="Systeemtray meldingen inschakelen" OBSWebSocket.Settings.AlertsEnable="Systeemtray meldingen inschakelen"
@ -30,6 +30,7 @@ OBSWebSocket.ConnectInfo.DialogTitle="WebSocket verbindingsinformatie"
OBSWebSocket.ConnectInfo.CopyText="Kopiëren" OBSWebSocket.ConnectInfo.CopyText="Kopiëren"
OBSWebSocket.ConnectInfo.ServerIp="Server IP (Beste inschatting)" OBSWebSocket.ConnectInfo.ServerIp="Server IP (Beste inschatting)"
OBSWebSocket.ConnectInfo.ServerPort="Serverpoort" OBSWebSocket.ConnectInfo.ServerPort="Serverpoort"
OBSWebSocket.ConnectInfo.ServerPassword="Serverwachtwoord"
OBSWebSocket.ConnectInfo.ServerPasswordPlaceholderText="[Authenticatie Uitgeschakeld]" OBSWebSocket.ConnectInfo.ServerPasswordPlaceholderText="[Authenticatie Uitgeschakeld]"
OBSWebSocket.ConnectInfo.QrTitle="QR koppelen" OBSWebSocket.ConnectInfo.QrTitle="QR koppelen"
OBSWebSocket.TrayNotification.Identified.Title="Nieuwe WebSocket verbinding" OBSWebSocket.TrayNotification.Identified.Title="Nieuwe WebSocket verbinding"

View File

@ -1,5 +1,5 @@
OBSWebSocket.Plugin.Description="Zdalna kontrola OBS Studio przez WebSocket" OBSWebSocket.Plugin.Description="Zdalna kontrola OBS Studio przez WebSocket"
OBSWebSocket.Settings.DialogTitle="Ustawienia obs-websocket" OBSWebSocket.Settings.DialogTitle="Ustawienia serwera WebSocket"
OBSWebSocket.Settings.PluginSettingsTitle="Ustawienia wtyczki" OBSWebSocket.Settings.PluginSettingsTitle="Ustawienia wtyczki"
OBSWebSocket.Settings.ServerEnable="Włącz serwer WebSocket" OBSWebSocket.Settings.ServerEnable="Włącz serwer WebSocket"
OBSWebSocket.Settings.AlertsEnable="Włącz powiadomienia w zasobniku systemowym" OBSWebSocket.Settings.AlertsEnable="Włącz powiadomienia w zasobniku systemowym"

View File

@ -1,5 +1,5 @@
OBSWebSocket.Plugin.Description="Controle remoto do OBS Studio através de WebSocket" OBSWebSocket.Plugin.Description="Controle remoto do OBS Studio através de WebSocket"
OBSWebSocket.Settings.DialogTitle="Configurações OBS-WebSocket" OBSWebSocket.Settings.DialogTitle="Configurações do servidor WebSocket"
OBSWebSocket.Settings.PluginSettingsTitle="Configurações de Plugin" OBSWebSocket.Settings.PluginSettingsTitle="Configurações de Plugin"
OBSWebSocket.Settings.ServerEnable="Ativar servidor WebSocket" OBSWebSocket.Settings.ServerEnable="Ativar servidor WebSocket"
OBSWebSocket.Settings.AlertsEnable="Ativar Alertas da Bandeja do Sistema" OBSWebSocket.Settings.AlertsEnable="Ativar Alertas da Bandeja do Sistema"
@ -22,7 +22,7 @@ OBSWebSocket.Settings.Save.PasswordInvalidErrorMessage="Você deve usar uma senh
OBSWebSocket.SessionTable.Title="Sessões WebSocket Conectadas" OBSWebSocket.SessionTable.Title="Sessões WebSocket Conectadas"
OBSWebSocket.SessionTable.RemoteAddressColumnTitle="Endereço Remoto" OBSWebSocket.SessionTable.RemoteAddressColumnTitle="Endereço Remoto"
OBSWebSocket.SessionTable.SessionDurationColumnTitle="Duração de Sessão" OBSWebSocket.SessionTable.SessionDurationColumnTitle="Duração de Sessão"
OBSWebSocket.SessionTable.MessagesInOutColumnTitle="Mengsagens de Entrada/Saída" OBSWebSocket.SessionTable.MessagesInOutColumnTitle="Mensagens"
OBSWebSocket.SessionTable.IdentifiedTitle="Identificada" OBSWebSocket.SessionTable.IdentifiedTitle="Identificada"
OBSWebSocket.SessionTable.KickButtonColumnTitle="Expulsar?" OBSWebSocket.SessionTable.KickButtonColumnTitle="Expulsar?"
OBSWebSocket.SessionTable.KickButtonText="Expulsar" OBSWebSocket.SessionTable.KickButtonText="Expulsar"

View File

@ -1,5 +1,5 @@
OBSWebSocket.Plugin.Description="Controlo remoto do OBS Studio através de WebSocket" OBSWebSocket.Plugin.Description="Controlo remoto do OBS Studio através de WebSocket"
OBSWebSocket.Settings.DialogTitle="Configurações obs-websocket" OBSWebSocket.Settings.DialogTitle="Definições do servidor WebSocket"
OBSWebSocket.Settings.PluginSettingsTitle="Configurações do plugin" OBSWebSocket.Settings.PluginSettingsTitle="Configurações do plugin"
OBSWebSocket.Settings.ServerEnable="Ativar servidor WebSocket" OBSWebSocket.Settings.ServerEnable="Ativar servidor WebSocket"
OBSWebSocket.Settings.AlertsEnable="Ativar alertas da bandeja do sistema" OBSWebSocket.Settings.AlertsEnable="Ativar alertas da bandeja do sistema"

View File

@ -1,10 +1,10 @@
OBSWebSocket.Plugin.Description="Control de la distanță pentru OBS Studio prin WebSocket" OBSWebSocket.Plugin.Description="Control de la distanță pentru OBS Studio prin WebSocket"
OBSWebSocket.Settings.DialogTitle="Setări obs-websocket" OBSWebSocket.Settings.DialogTitle="Setări ale server-ului WebSocket"
OBSWebSocket.Settings.PluginSettingsTitle="Setări ale plugin-ului" OBSWebSocket.Settings.PluginSettingsTitle="Setări pentru plugin"
OBSWebSocket.Settings.ServerEnable="Activează serverul WebSocket" OBSWebSocket.Settings.ServerEnable="Activează serverul WebSocket"
OBSWebSocket.Settings.AlertsEnable="Activați alertele din bara de sistem" OBSWebSocket.Settings.AlertsEnable="Activează alertele din bara de sistem"
OBSWebSocket.Settings.DebugEnable="Activează jurnalizarea de depanare" OBSWebSocket.Settings.DebugEnable="Activează jurnalizarea de depanare"
OBSWebSocket.Settings.DebugEnableHoverText="Activează jurnalizarea de depanare pentru instanța curentă de OBS. Nu persistă la încărcare.\nUtilizați --websocket_debug pentru a activa la încărcare." OBSWebSocket.Settings.DebugEnableHoverText="Activează jurnalizarea de depanare pentru instanța actuală de OBS. Nu persistă la încărcare.\nFolosește --websocket_debug pentru a activa la încărcare."
OBSWebSocket.Settings.ServerSettingsTitle="Setări server" OBSWebSocket.Settings.ServerSettingsTitle="Setări server"
OBSWebSocket.Settings.AuthRequired="Activează autentificarea" OBSWebSocket.Settings.AuthRequired="Activează autentificarea"
OBSWebSocket.Settings.Password="Parola serverului" OBSWebSocket.Settings.Password="Parola serverului"
@ -12,11 +12,11 @@ OBSWebSocket.Settings.GeneratePassword="Generează parola"
OBSWebSocket.Settings.ServerPort="Portul serverului" OBSWebSocket.Settings.ServerPort="Portul serverului"
OBSWebSocket.Settings.ShowConnectInfo="Afișează informațiile de conectare" OBSWebSocket.Settings.ShowConnectInfo="Afișează informațiile de conectare"
OBSWebSocket.Settings.ShowConnectInfoWarningTitle="Avertisment: În prezent în direct" OBSWebSocket.Settings.ShowConnectInfoWarningTitle="Avertisment: În prezent în direct"
OBSWebSocket.Settings.ShowConnectInfoWarningMessage="Se pare că o ieșire (flux, înregistrare etc.) este activă în prezent." OBSWebSocket.Settings.ShowConnectInfoWarningMessage="Se pare că un output (transmisiune, înregistrare etc.) este activ în prezent."
OBSWebSocket.Settings.ShowConnectInfoWarningInfoText="Ești sigur vrei să-ți arăți informațiile de conectare?" OBSWebSocket.Settings.ShowConnectInfoWarningInfoText="Sigur vrei să afișezi informațiile de conectare?"
OBSWebSocket.Settings.Save.UserPasswordWarningTitle="Avertisment: Potențială problemă de securitate" OBSWebSocket.Settings.Save.UserPasswordWarningTitle="Avertisment: Potențială problemă de securitate"
OBSWebSocket.Settings.Save.UserPasswordWarningMessage="obs-websocket stochează parola serverului ca text simplu. Este foarte recomandat să folosiți o parolă generată de obs-websocket." OBSWebSocket.Settings.Save.UserPasswordWarningMessage="obs-websocket stochează parola serverului ca text simplu. Este foarte recomandat să folosiți o parolă generată de obs-websocket."
OBSWebSocket.Settings.Save.UserPasswordWarningInfoText="Ești sigur vrei să-ți folosești propria parolă?" OBSWebSocket.Settings.Save.UserPasswordWarningInfoText="Sigur vrei să-ți folosești propria parolă?"
OBSWebSocket.Settings.Save.PasswordInvalidErrorTitle="Eroare: Configurație invalidă" OBSWebSocket.Settings.Save.PasswordInvalidErrorTitle="Eroare: Configurație invalidă"
OBSWebSocket.Settings.Save.PasswordInvalidErrorMessage="Trebuie să folosești o parolă care să aibă 6 sau mai multe caractere." OBSWebSocket.Settings.Save.PasswordInvalidErrorMessage="Trebuie să folosești o parolă care să aibă 6 sau mai multe caractere."
OBSWebSocket.SessionTable.Title="Sesiuni WebSocket conectate" OBSWebSocket.SessionTable.Title="Sesiuni WebSocket conectate"

View File

@ -1,5 +1,5 @@
OBSWebSocket.Plugin.Description="Удалённое управление OBS Studio по WebSocket" OBSWebSocket.Plugin.Description="Удалённое управление OBS Studio по WebSocket"
OBSWebSocket.Settings.DialogTitle="Настройки obs-websocket" OBSWebSocket.Settings.DialogTitle="Настройки сервера WebSocket"
OBSWebSocket.Settings.PluginSettingsTitle="Настройки плагина" OBSWebSocket.Settings.PluginSettingsTitle="Настройки плагина"
OBSWebSocket.Settings.ServerEnable="Включить сервер WebSocket" OBSWebSocket.Settings.ServerEnable="Включить сервер WebSocket"
OBSWebSocket.Settings.AlertsEnable="Включить оповещения в трее" OBSWebSocket.Settings.AlertsEnable="Включить оповещения в трее"

View File

@ -1,5 +1,5 @@
OBSWebSocket.Plugin.Description="Vzdialené ovládanie OBS Štúdia cez WebSocket" OBSWebSocket.Plugin.Description="Vzdialené ovládanie OBS Štúdia cez WebSocket"
OBSWebSocket.Settings.DialogTitle="Nastavenia obs-websocket" OBSWebSocket.Settings.DialogTitle="Serverové nastavenia WebSocket"
OBSWebSocket.Settings.PluginSettingsTitle="Nastavenia pluginu" OBSWebSocket.Settings.PluginSettingsTitle="Nastavenia pluginu"
OBSWebSocket.Settings.ServerEnable="Zapnúť WebSocket server" OBSWebSocket.Settings.ServerEnable="Zapnúť WebSocket server"
OBSWebSocket.Settings.AlertsEnable="Zapnúť notifikácie zo systémovej lišty" OBSWebSocket.Settings.AlertsEnable="Zapnúť notifikácie zo systémovej lišty"

View File

@ -1,5 +1,5 @@
OBSWebSocket.Plugin.Description="Oddaljeni nadzor OBS Studia prek WebSocketa" OBSWebSocket.Plugin.Description="Oddaljeni nadzor OBS Studia prek WebSocketa"
OBSWebSocket.Settings.DialogTitle="Nastavitve obs-websocket" OBSWebSocket.Settings.DialogTitle="Nastavitve strežnika WebSocket"
OBSWebSocket.Settings.PluginSettingsTitle="Nastavitve vtičnika" OBSWebSocket.Settings.PluginSettingsTitle="Nastavitve vtičnika"
OBSWebSocket.Settings.ServerEnable="Omogoči strežnik WebSocket" OBSWebSocket.Settings.ServerEnable="Omogoči strežnik WebSocket"
OBSWebSocket.Settings.AlertsEnable="Omogoči opozorila v sistemskem pladnju" OBSWebSocket.Settings.AlertsEnable="Omogoči opozorila v sistemskem pladnju"

View File

@ -1,5 +1,5 @@
OBSWebSocket.Plugin.Description="Fjärrkontroll av OBS Studio via WebSocket" OBSWebSocket.Plugin.Description="Fjärrkontroll av OBS Studio via WebSocket"
OBSWebSocket.Settings.DialogTitle="Inställningar för obs-websocket" OBSWebSocket.Settings.DialogTitle="WebSocket-serverinställningar"
OBSWebSocket.Settings.PluginSettingsTitle="Insticksmodulsinställningar" OBSWebSocket.Settings.PluginSettingsTitle="Insticksmodulsinställningar"
OBSWebSocket.Settings.ServerEnable="Aktivera WebSocket-server" OBSWebSocket.Settings.ServerEnable="Aktivera WebSocket-server"
OBSWebSocket.Settings.AlertsEnable="Aktivera systemfältsmeddelanden" OBSWebSocket.Settings.AlertsEnable="Aktivera systemfältsmeddelanden"

View File

@ -1,5 +1,5 @@
OBSWebSocket.Plugin.Description="WebSocket aracılığıyla uzaktan OBS Studio" OBSWebSocket.Plugin.Description="WebSocket aracılığıyla uzaktan OBS Studio"
OBSWebSocket.Settings.DialogTitle="obs-websocket Ayarları" OBSWebSocket.Settings.DialogTitle="WebSocket Suncusu Ayarları"
OBSWebSocket.Settings.PluginSettingsTitle="Eklenti Ayarları" OBSWebSocket.Settings.PluginSettingsTitle="Eklenti Ayarları"
OBSWebSocket.Settings.ServerEnable="WebSocket sunucuyu etkinleştir" OBSWebSocket.Settings.ServerEnable="WebSocket sunucuyu etkinleştir"
OBSWebSocket.Settings.AlertsEnable="Sistem Tepsi Uyarılarını Etkinleştir" OBSWebSocket.Settings.AlertsEnable="Sistem Tepsi Uyarılarını Etkinleştir"

View File

@ -1,5 +1,5 @@
OBSWebSocket.Plugin.Description="Віддалене керування OBS Studio через WebSocket" OBSWebSocket.Plugin.Description="Віддалене керування OBS Studio через WebSocket"
OBSWebSocket.Settings.DialogTitle="Налаштування obs-websocket" OBSWebSocket.Settings.DialogTitle="Налаштування WebSocket сервера"
OBSWebSocket.Settings.PluginSettingsTitle="Налаштування плагіна" OBSWebSocket.Settings.PluginSettingsTitle="Налаштування плагіна"
OBSWebSocket.Settings.ServerEnable="Увімкнути сервер WebSocket" OBSWebSocket.Settings.ServerEnable="Увімкнути сервер WebSocket"
OBSWebSocket.Settings.AlertsEnable="Увімкнути сповіщення у системному лотку" OBSWebSocket.Settings.AlertsEnable="Увімкнути сповіщення у системному лотку"

13
data/locale/vi-VN.ini Normal file
View File

@ -0,0 +1,13 @@
OBSWebSocket.Settings.PluginSettingsTitle="Thiết đặt trình cắm"
OBSWebSocket.Settings.ServerEnable="Bật máy chủ WebSocket"
OBSWebSocket.Settings.ServerSettingsTitle="Thiết đặt máy chủ"
OBSWebSocket.Settings.Password="Mật khẩu máy chủ"
OBSWebSocket.Settings.GeneratePassword="Tạo mật khẩu"
OBSWebSocket.Settings.ServerPort="Cổng máy chủ"
OBSWebSocket.Settings.ShowConnectInfo="Hiện thông tin kết nối"
OBSWebSocket.SessionTable.IdentifiedTitle="Định dạng"
OBSWebSocket.ConnectInfo.ServerIp="IP Máy chủ (Gợi ý tốt nhất)"
OBSWebSocket.ConnectInfo.ServerPort="Cổng máy chủ"
OBSWebSocket.ConnectInfo.ServerPassword="Mật khẩu máy chủ"
OBSWebSocket.ConnectInfo.QrTitle="Kết nối bằng mã QR"
OBSWebSocket.TrayNotification.Identified.Title="Tạo cổng kết nối WebSocket mới"

View File

@ -1,10 +1,10 @@
OBSWebSocket.Plugin.Description="通过 WebSocket 远程控制 OBS Studio" OBSWebSocket.Plugin.Description="通过 WebSocket 远程控制 OBS Studio"
OBSWebSocket.Settings.DialogTitle="obs-websocket 设置" OBSWebSocket.Settings.DialogTitle="WebSocket 服务器设置"
OBSWebSocket.Settings.PluginSettingsTitle="插件设置" OBSWebSocket.Settings.PluginSettingsTitle="插件设置"
OBSWebSocket.Settings.ServerEnable="开启 WebSocket 服务器" OBSWebSocket.Settings.ServerEnable="开启 WebSocket 服务器"
OBSWebSocket.Settings.AlertsEnable="开启系统托盘提醒" OBSWebSocket.Settings.AlertsEnable="开启系统托盘提醒"
OBSWebSocket.Settings.DebugEnable="开启调试日志" OBSWebSocket.Settings.DebugEnable="开启调试日志"
OBSWebSocket.Settings.DebugEnableHoverText="启当前 OBS 实例的调试日志。下次启动时需重新设置。\n使用 --websocket_debug 在启动 OBS 时启日志。" OBSWebSocket.Settings.DebugEnableHoverText="启当前 OBS 实例的调试日志。下次启动时需重新设置。\n使用 --websocket_debug 在启动 OBS 时启日志。"
OBSWebSocket.Settings.ServerSettingsTitle="服务器设置" OBSWebSocket.Settings.ServerSettingsTitle="服务器设置"
OBSWebSocket.Settings.AuthRequired="开启鉴权" OBSWebSocket.Settings.AuthRequired="开启鉴权"
OBSWebSocket.Settings.Password="服务器密码" OBSWebSocket.Settings.Password="服务器密码"

View File

@ -1,5 +1,5 @@
OBSWebSocket.Plugin.Description="透過 WebSocket 遠端控制 OBS Studio" OBSWebSocket.Plugin.Description="透過 WebSocket 遠端控制 OBS Studio"
OBSWebSocket.Settings.DialogTitle="obs-websocket 設定" OBSWebSocket.Settings.DialogTitle="WebSocket 伺服器設定"
OBSWebSocket.Settings.PluginSettingsTitle="外掛程式設定" OBSWebSocket.Settings.PluginSettingsTitle="外掛程式設定"
OBSWebSocket.Settings.ServerEnable="啟用 WebSocket 伺服器" OBSWebSocket.Settings.ServerEnable="啟用 WebSocket 伺服器"
OBSWebSocket.Settings.AlertsEnable="啟用系統匣通知" OBSWebSocket.Settings.AlertsEnable="啟用系統匣通知"

1
deps/asio vendored

Submodule deps/asio deleted from b73dc1d2c0

1
deps/json vendored

Submodule deps/json deleted from a34e011e24

1
deps/websocketpp vendored

Submodule deps/websocketpp deleted from 56123c8759

View File

@ -9,7 +9,9 @@ enumTypeOrder = [
'WebSocketCloseCode', 'WebSocketCloseCode',
'RequestBatchExecutionType', 'RequestBatchExecutionType',
'RequestStatus', 'RequestStatus',
'EventSubscription' 'EventSubscription',
'ObsMediaInputAction',
'ObsOutputState'
] ]
categoryOrder = [ categoryOrder = [

View File

@ -1,5 +1,5 @@
# obs-websocket 5.0.1 Protocol # obs-websocket 5.1.0 Protocol
## Main Table of Contents ## Main Table of Contents
@ -19,6 +19,9 @@
- [RequestResponse (OpCode 7)](#requestresponse-opcode-7) - [RequestResponse (OpCode 7)](#requestresponse-opcode-7)
- [RequestBatch (OpCode 8)](#requestbatch-opcode-8) - [RequestBatch (OpCode 8)](#requestbatch-opcode-8)
- [RequestBatchResponse (OpCode 9)](#requestbatchresponse-opcode-9) - [RequestBatchResponse (OpCode 9)](#requestbatchresponse-opcode-9)
- [Enumerations](#enums)
- [Events](#events)
- [Requests](#requests)
## General Intro ## General Intro
@ -58,7 +61,7 @@ These steps should be followed precisely. Failure to connect to the server as in
- The server receives and processes the `Identify` sent by the client. - The server receives and processes the `Identify` sent by the client.
- If authentication is required and the `Identify` message data does not contain an `authentication` string, or the string is not correct, the connection is closed with `WebSocketCloseCode::AuthenticationFailed` - If authentication is required and the `Identify` message data does not contain an `authentication` string, or the string is not correct, the connection is closed with `WebSocketCloseCode::AuthenticationFailed`
- If the client has requested an `rpcVersion` which the server cannot use, the connection is closed with `WebSocketCloseCode::UnsupportedRpcVersion`. This system allows both the server and client to have seamless backwards compatability. - If the client has requested an `rpcVersion` which the server cannot use, the connection is closed with `WebSocketCloseCode::UnsupportedRpcVersion`. This system allows both the server and client to have seamless backwards compatibility.
- If any other parameters are malformed (invalid type, etc), the connection is closed with an appropriate close code. - If any other parameters are malformed (invalid type, etc), the connection is closed with an appropriate close code.
- Once identification is processed on the server, the server responds to the client with an [OpCode 2 `Identified`](#identified-opcode-2). - Once identification is processed on the server, the server responds to the client with an [OpCode 2 `Identified`](#identified-opcode-2).
@ -143,7 +146,7 @@ Authentication is required
{ {
"op": 0, "op": 0,
"d": { "d": {
"obsWebSocketVersion": "5.0.1", "obsWebSocketVersion": "5.1.0",
"rpcVersion": 1, "rpcVersion": 1,
"authentication": { "authentication": {
"challenge": "+IxH4CnCiqpX1rM9scsNynZzbOe4KhDeYcTNS3PDaeY=", "challenge": "+IxH4CnCiqpX1rM9scsNynZzbOe4KhDeYcTNS3PDaeY=",
@ -159,7 +162,7 @@ Authentication is not required
{ {
"op": 0, "op": 0,
"d": { "d": {
"obsWebSocketVersion": "5.0.1", "obsWebSocketVersion": "5.1.0",
"rpcVersion": 1 "rpcVersion": 1
} }
} }

View File

@ -447,6 +447,83 @@
} }
] ]
}, },
{
"enumType": "ObsOutputState",
"enumIdentifiers": [
{
"description": "Unknown state.",
"enumIdentifier": "OBS_WEBSOCKET_OUTPUT_UNKNOWN",
"rpcVersion": 1,
"deprecated": true,
"initialVersion": "5.0.0",
"enumValue": "OBS_WEBSOCKET_OUTPUT_UNKNOWN"
},
{
"description": "The output is starting.",
"enumIdentifier": "OBS_WEBSOCKET_OUTPUT_STARTING",
"rpcVersion": 1,
"deprecated": true,
"initialVersion": "5.0.0",
"enumValue": "OBS_WEBSOCKET_OUTPUT_STARTING"
},
{
"description": "The input has started.",
"enumIdentifier": "OBS_WEBSOCKET_OUTPUT_STARTED",
"rpcVersion": 1,
"deprecated": true,
"initialVersion": "5.0.0",
"enumValue": "OBS_WEBSOCKET_OUTPUT_STARTED"
},
{
"description": "The output is stopping.",
"enumIdentifier": "OBS_WEBSOCKET_OUTPUT_STOPPING",
"rpcVersion": 1,
"deprecated": true,
"initialVersion": "5.0.0",
"enumValue": "OBS_WEBSOCKET_OUTPUT_STOPPING"
},
{
"description": "The output has stopped.",
"enumIdentifier": "OBS_WEBSOCKET_OUTPUT_STOPPED",
"rpcVersion": 1,
"deprecated": true,
"initialVersion": "5.0.0",
"enumValue": "OBS_WEBSOCKET_OUTPUT_STOPPED"
},
{
"description": "The output has disconnected and is reconnecting.",
"enumIdentifier": "OBS_WEBSOCKET_OUTPUT_RECONNECTING",
"rpcVersion": 1,
"deprecated": true,
"initialVersion": "5.0.0",
"enumValue": "OBS_WEBSOCKET_OUTPUT_RECONNECTING"
},
{
"description": "The output has reconnected successfully.",
"enumIdentifier": "OBS_WEBSOCKET_OUTPUT_RECONNECTED",
"rpcVersion": 1,
"deprecated": true,
"initialVersion": "5.1.0",
"enumValue": "OBS_WEBSOCKET_OUTPUT_RECONNECTED"
},
{
"description": "The output is now paused.",
"enumIdentifier": "OBS_WEBSOCKET_OUTPUT_PAUSED",
"rpcVersion": 1,
"deprecated": true,
"initialVersion": "5.1.0",
"enumValue": "OBS_WEBSOCKET_OUTPUT_PAUSED"
},
{
"description": "The output has been resumed (unpaused).",
"enumIdentifier": "OBS_WEBSOCKET_OUTPUT_RESUMED",
"rpcVersion": 1,
"deprecated": true,
"initialVersion": "5.0.0",
"enumValue": "OBS_WEBSOCKET_OUTPUT_RESUMED"
}
]
},
{ {
"enumType": "ObsMediaInputAction", "enumType": "ObsMediaInputAction",
"enumIdentifiers": [ "enumIdentifiers": [
@ -1776,16 +1853,16 @@
"valueType": "Number", "valueType": "Number",
"valueDescription": "Number of milliseconds to sleep for (if `SERIAL_REALTIME` mode)", "valueDescription": "Number of milliseconds to sleep for (if `SERIAL_REALTIME` mode)",
"valueRestrictions": ">= 0, <= 50000", "valueRestrictions": ">= 0, <= 50000",
"valueOptional": false, "valueOptional": true,
"valueOptionalBehavior": null "valueOptionalBehavior": "Unknown"
}, },
{ {
"valueName": "sleepFrames", "valueName": "sleepFrames",
"valueType": "Number", "valueType": "Number",
"valueDescription": "Number of frames to sleep for (if `SERIAL_FRAME` mode)", "valueDescription": "Number of frames to sleep for (if `SERIAL_FRAME` mode)",
"valueRestrictions": ">= 0, <= 10000", "valueRestrictions": ">= 0, <= 10000",
"valueOptional": false, "valueOptional": true,
"valueOptionalBehavior": null "valueOptionalBehavior": "Unknown"
} }
], ],
"responseFields": [] "responseFields": []
@ -2481,7 +2558,7 @@
] ]
}, },
{ {
"description": "Presses a button in the properties of an input.\n\nNote: Use this in cases where there is a button in the properties of an input that cannot be accessed in any other way. For example, browser sources, where there is a refresh button.", "description": "Presses a button in the properties of an input.\n\nSome known `propertyName` values are:\n\n- `refreshnocache` - Browser source reload button\n\nNote: Use this in cases where there is a button in the properties of an input that cannot be accessed in any other way. For example, browser sources, where there is a refresh button.",
"requestType": "PressInputPropertiesButton", "requestType": "PressInputPropertiesButton",
"complexity": 4, "complexity": 4,
"rpcVersion": "1", "rpcVersion": "1",
@ -2777,7 +2854,13 @@
"initialVersion": "5.0.0", "initialVersion": "5.0.0",
"category": "outputs", "category": "outputs",
"requestFields": [], "requestFields": [],
"responseFields": [] "responseFields": [
{
"valueName": "outputs",
"valueType": "Array<Object>",
"valueDescription": "Array of outputs"
}
]
}, },
{ {
"description": "Gets the status of an output.", "description": "Gets the status of an output.",
@ -2976,7 +3059,7 @@
"valueDescription": "Whether the output is active" "valueDescription": "Whether the output is active"
}, },
{ {
"valueName": "ouputPaused", "valueName": "outputPaused",
"valueType": "Boolean", "valueType": "Boolean",
"valueDescription": "Whether the output is paused" "valueDescription": "Whether the output is paused"
}, },
@ -3096,7 +3179,7 @@
] ]
}, },
{ {
"description": "Basically GetSceneItemList, but for groups.\n\nUsing groups at all in OBS is discouraged, as they are very broken under the hood.\n\nGroups only", "description": "Basically GetSceneItemList, but for groups.\n\nUsing groups at all in OBS is discouraged, as they are very broken under the hood. Please use nested scenes instead.\n\nGroups only",
"requestType": "GetGroupSceneItemList", "requestType": "GetGroupSceneItemList",
"complexity": 3, "complexity": 3,
"rpcVersion": "1", "rpcVersion": "1",
@ -4955,7 +5038,7 @@
{ {
"valueName": "inputVolumeMul", "valueName": "inputVolumeMul",
"valueType": "Number", "valueType": "Number",
"valueDescription": "New volume level in multimap" "valueDescription": "New volume level multiplier"
}, },
{ {
"valueName": "inputVolumeDb", "valueName": "inputVolumeDb",
@ -5638,6 +5721,23 @@
} }
] ]
}, },
{
"description": "A screenshot has been saved.\n\nNote: Triggered for the screenshot feature available in `Settings -> Hotkeys -> Screenshot Output` ONLY.\nApplications using `Get/SaveSourceScreenshot` should implement a `CustomEvent` if this kind of inter-client\ncommunication is desired.",
"eventType": "ScreenshotSaved",
"eventSubscription": "Ui",
"complexity": 2,
"rpcVersion": "1",
"deprecated": false,
"initialVersion": "5.1.0",
"category": "ui",
"dataFields": [
{
"valueName": "savedScreenshotPath",
"valueType": "String",
"valueDescription": "Path of the saved image file"
}
]
},
{ {
"description": "An event has been emitted from a vendor.\n\nA vendor is a unique name registered by a third-party plugin or script, which allows for custom requests and events to be added to obs-websocket.\nIf a plugin or script implements vendor requests or events, documentation is expected to be provided with them.", "description": "An event has been emitted from a vendor.\n\nA vendor is a unique name registered by a third-party plugin or script, which allows for custom requests and events to be added to obs-websocket.\nIf a plugin or script implements vendor requests or events, documentation is expected to be provided with them.",
"eventType": "VendorEvent", "eventType": "VendorEvent",
@ -5664,6 +5764,23 @@
"valueDescription": "Vendor-provided event data. {} if event does not provide any data" "valueDescription": "Vendor-provided event data. {} if event does not provide any data"
} }
] ]
},
{
"description": "Custom event emitted by `BroadcastCustomEvent`.",
"eventType": "CustomEvent",
"eventSubscription": "General",
"complexity": 1,
"rpcVersion": "1",
"deprecated": false,
"initialVersion": "5.0.0",
"category": "general",
"dataFields": [
{
"valueName": "eventData",
"valueType": "Object",
"valueDescription": "Custom event data"
}
]
} }
] ]
} }

View File

@ -1,7 +1,7 @@
<!-- This file was automatically generated. Do not edit directly! --> <!-- This file was automatically generated. Do not edit directly! -->
<!-- markdownlint-disable no-bare-urls --> <!-- markdownlint-disable no-bare-urls -->
# obs-websocket 5.0.1 Protocol # obs-websocket 5.1.0 Protocol
## Main Table of Contents ## Main Table of Contents
@ -21,6 +21,9 @@
- [RequestResponse (OpCode 7)](#requestresponse-opcode-7) - [RequestResponse (OpCode 7)](#requestresponse-opcode-7)
- [RequestBatch (OpCode 8)](#requestbatch-opcode-8) - [RequestBatch (OpCode 8)](#requestbatch-opcode-8)
- [RequestBatchResponse (OpCode 9)](#requestbatchresponse-opcode-9) - [RequestBatchResponse (OpCode 9)](#requestbatchresponse-opcode-9)
- [Enumerations](#enums)
- [Events](#events)
- [Requests](#requests)
## General Intro ## General Intro
@ -60,7 +63,7 @@ These steps should be followed precisely. Failure to connect to the server as in
- The server receives and processes the `Identify` sent by the client. - The server receives and processes the `Identify` sent by the client.
- If authentication is required and the `Identify` message data does not contain an `authentication` string, or the string is not correct, the connection is closed with `WebSocketCloseCode::AuthenticationFailed` - If authentication is required and the `Identify` message data does not contain an `authentication` string, or the string is not correct, the connection is closed with `WebSocketCloseCode::AuthenticationFailed`
- If the client has requested an `rpcVersion` which the server cannot use, the connection is closed with `WebSocketCloseCode::UnsupportedRpcVersion`. This system allows both the server and client to have seamless backwards compatability. - If the client has requested an `rpcVersion` which the server cannot use, the connection is closed with `WebSocketCloseCode::UnsupportedRpcVersion`. This system allows both the server and client to have seamless backwards compatibility.
- If any other parameters are malformed (invalid type, etc), the connection is closed with an appropriate close code. - If any other parameters are malformed (invalid type, etc), the connection is closed with an appropriate close code.
- Once identification is processed on the server, the server responds to the client with an [OpCode 2 `Identified`](#identified-opcode-2). - Once identification is processed on the server, the server responds to the client with an [OpCode 2 `Identified`](#identified-opcode-2).
@ -145,7 +148,7 @@ Authentication is required
{ {
"op": 0, "op": 0,
"d": { "d": {
"obsWebSocketVersion": "5.0.1", "obsWebSocketVersion": "5.1.0",
"rpcVersion": 1, "rpcVersion": 1,
"authentication": { "authentication": {
"challenge": "+IxH4CnCiqpX1rM9scsNynZzbOe4KhDeYcTNS3PDaeY=", "challenge": "+IxH4CnCiqpX1rM9scsNynZzbOe4KhDeYcTNS3PDaeY=",
@ -161,7 +164,7 @@ Authentication is not required
{ {
"op": 0, "op": 0,
"d": { "d": {
"obsWebSocketVersion": "5.0.1", "obsWebSocketVersion": "5.1.0",
"rpcVersion": 1 "rpcVersion": 1
} }
} }
@ -512,6 +515,24 @@ These are enumeration declarations, which are referenced throughout obs-websocke
- [EventSubscription::InputActiveStateChanged](#eventsubscriptioninputactivestatechanged) - [EventSubscription::InputActiveStateChanged](#eventsubscriptioninputactivestatechanged)
- [EventSubscription::InputShowStateChanged](#eventsubscriptioninputshowstatechanged) - [EventSubscription::InputShowStateChanged](#eventsubscriptioninputshowstatechanged)
- [EventSubscription::SceneItemTransformChanged](#eventsubscriptionsceneitemtransformchanged) - [EventSubscription::SceneItemTransformChanged](#eventsubscriptionsceneitemtransformchanged)
- [ObsMediaInputAction](#obsmediainputaction)
- [ObsMediaInputAction::OBS_WEBSOCKET_MEDIA_INPUT_ACTION_NONE](#obsmediainputactionobs_websocket_media_input_action_none)
- [ObsMediaInputAction::OBS_WEBSOCKET_MEDIA_INPUT_ACTION_PLAY](#obsmediainputactionobs_websocket_media_input_action_play)
- [ObsMediaInputAction::OBS_WEBSOCKET_MEDIA_INPUT_ACTION_PAUSE](#obsmediainputactionobs_websocket_media_input_action_pause)
- [ObsMediaInputAction::OBS_WEBSOCKET_MEDIA_INPUT_ACTION_STOP](#obsmediainputactionobs_websocket_media_input_action_stop)
- [ObsMediaInputAction::OBS_WEBSOCKET_MEDIA_INPUT_ACTION_RESTART](#obsmediainputactionobs_websocket_media_input_action_restart)
- [ObsMediaInputAction::OBS_WEBSOCKET_MEDIA_INPUT_ACTION_NEXT](#obsmediainputactionobs_websocket_media_input_action_next)
- [ObsMediaInputAction::OBS_WEBSOCKET_MEDIA_INPUT_ACTION_PREVIOUS](#obsmediainputactionobs_websocket_media_input_action_previous)
- [ObsOutputState](#obsoutputstate)
- [ObsOutputState::OBS_WEBSOCKET_OUTPUT_UNKNOWN](#obsoutputstateobs_websocket_output_unknown)
- [ObsOutputState::OBS_WEBSOCKET_OUTPUT_STARTING](#obsoutputstateobs_websocket_output_starting)
- [ObsOutputState::OBS_WEBSOCKET_OUTPUT_STARTED](#obsoutputstateobs_websocket_output_started)
- [ObsOutputState::OBS_WEBSOCKET_OUTPUT_STOPPING](#obsoutputstateobs_websocket_output_stopping)
- [ObsOutputState::OBS_WEBSOCKET_OUTPUT_STOPPED](#obsoutputstateobs_websocket_output_stopped)
- [ObsOutputState::OBS_WEBSOCKET_OUTPUT_RECONNECTING](#obsoutputstateobs_websocket_output_reconnecting)
- [ObsOutputState::OBS_WEBSOCKET_OUTPUT_RECONNECTED](#obsoutputstateobs_websocket_output_reconnected)
- [ObsOutputState::OBS_WEBSOCKET_OUTPUT_PAUSED](#obsoutputstateobs_websocket_output_paused)
- [ObsOutputState::OBS_WEBSOCKET_OUTPUT_RESUMED](#obsoutputstateobs_websocket_output_resumed)
## WebSocketOpCode ## WebSocketOpCode
@ -1294,6 +1315,182 @@ Subscription value to receive the `SceneItemTransformChanged` high-volume event.
- Latest Supported RPC Version: `1` - Latest Supported RPC Version: `1`
- Added in v5.0.0 - Added in v5.0.0
## ObsMediaInputAction
### ObsMediaInputAction::OBS_WEBSOCKET_MEDIA_INPUT_ACTION_NONE
No action.
- Identifier Value: `OBS_WEBSOCKET_MEDIA_INPUT_ACTION_NONE`
- Latest Supported RPC Version: `1`
- **⚠️ Deprecated. ⚠️**
- Added in v5.0.0
---
### ObsMediaInputAction::OBS_WEBSOCKET_MEDIA_INPUT_ACTION_PLAY
Play the media input.
- Identifier Value: `OBS_WEBSOCKET_MEDIA_INPUT_ACTION_PLAY`
- Latest Supported RPC Version: `1`
- **⚠️ Deprecated. ⚠️**
- Added in v5.0.0
---
### ObsMediaInputAction::OBS_WEBSOCKET_MEDIA_INPUT_ACTION_PAUSE
Pause the media input.
- Identifier Value: `OBS_WEBSOCKET_MEDIA_INPUT_ACTION_PAUSE`
- Latest Supported RPC Version: `1`
- **⚠️ Deprecated. ⚠️**
- Added in v5.0.0
---
### ObsMediaInputAction::OBS_WEBSOCKET_MEDIA_INPUT_ACTION_STOP
Stop the media input.
- Identifier Value: `OBS_WEBSOCKET_MEDIA_INPUT_ACTION_STOP`
- Latest Supported RPC Version: `1`
- **⚠️ Deprecated. ⚠️**
- Added in v5.0.0
---
### ObsMediaInputAction::OBS_WEBSOCKET_MEDIA_INPUT_ACTION_RESTART
Restart the media input.
- Identifier Value: `OBS_WEBSOCKET_MEDIA_INPUT_ACTION_RESTART`
- Latest Supported RPC Version: `1`
- **⚠️ Deprecated. ⚠️**
- Added in v5.0.0
---
### ObsMediaInputAction::OBS_WEBSOCKET_MEDIA_INPUT_ACTION_NEXT
Go to the next playlist item.
- Identifier Value: `OBS_WEBSOCKET_MEDIA_INPUT_ACTION_NEXT`
- Latest Supported RPC Version: `1`
- **⚠️ Deprecated. ⚠️**
- Added in v5.0.0
---
### ObsMediaInputAction::OBS_WEBSOCKET_MEDIA_INPUT_ACTION_PREVIOUS
Go to the previous playlist item.
- Identifier Value: `OBS_WEBSOCKET_MEDIA_INPUT_ACTION_PREVIOUS`
- Latest Supported RPC Version: `1`
- **⚠️ Deprecated. ⚠️**
- Added in v5.0.0
## ObsOutputState
### ObsOutputState::OBS_WEBSOCKET_OUTPUT_UNKNOWN
Unknown state.
- Identifier Value: `OBS_WEBSOCKET_OUTPUT_UNKNOWN`
- Latest Supported RPC Version: `1`
- **⚠️ Deprecated. ⚠️**
- Added in v5.0.0
---
### ObsOutputState::OBS_WEBSOCKET_OUTPUT_STARTING
The output is starting.
- Identifier Value: `OBS_WEBSOCKET_OUTPUT_STARTING`
- Latest Supported RPC Version: `1`
- **⚠️ Deprecated. ⚠️**
- Added in v5.0.0
---
### ObsOutputState::OBS_WEBSOCKET_OUTPUT_STARTED
The input has started.
- Identifier Value: `OBS_WEBSOCKET_OUTPUT_STARTED`
- Latest Supported RPC Version: `1`
- **⚠️ Deprecated. ⚠️**
- Added in v5.0.0
---
### ObsOutputState::OBS_WEBSOCKET_OUTPUT_STOPPING
The output is stopping.
- Identifier Value: `OBS_WEBSOCKET_OUTPUT_STOPPING`
- Latest Supported RPC Version: `1`
- **⚠️ Deprecated. ⚠️**
- Added in v5.0.0
---
### ObsOutputState::OBS_WEBSOCKET_OUTPUT_STOPPED
The output has stopped.
- Identifier Value: `OBS_WEBSOCKET_OUTPUT_STOPPED`
- Latest Supported RPC Version: `1`
- **⚠️ Deprecated. ⚠️**
- Added in v5.0.0
---
### ObsOutputState::OBS_WEBSOCKET_OUTPUT_RECONNECTING
The output has disconnected and is reconnecting.
- Identifier Value: `OBS_WEBSOCKET_OUTPUT_RECONNECTING`
- Latest Supported RPC Version: `1`
- **⚠️ Deprecated. ⚠️**
- Added in v5.0.0
---
### ObsOutputState::OBS_WEBSOCKET_OUTPUT_RECONNECTED
The output has reconnected successfully.
- Identifier Value: `OBS_WEBSOCKET_OUTPUT_RECONNECTED`
- Latest Supported RPC Version: `1`
- **⚠️ Deprecated. ⚠️**
- Added in v5.1.0
---
### ObsOutputState::OBS_WEBSOCKET_OUTPUT_PAUSED
The output is now paused.
- Identifier Value: `OBS_WEBSOCKET_OUTPUT_PAUSED`
- Latest Supported RPC Version: `1`
- **⚠️ Deprecated. ⚠️**
- Added in v5.1.0
---
### ObsOutputState::OBS_WEBSOCKET_OUTPUT_RESUMED
The output has been resumed (unpaused).
- Identifier Value: `OBS_WEBSOCKET_OUTPUT_RESUMED`
- Latest Supported RPC Version: `1`
- **⚠️ Deprecated. ⚠️**
- Added in v5.0.0
# Events # Events
## Events Table of Contents ## Events Table of Contents
@ -1301,6 +1498,7 @@ Subscription value to receive the `SceneItemTransformChanged` high-volume event.
- [General Events](#general-events) - [General Events](#general-events)
- [ExitStarted](#exitstarted) - [ExitStarted](#exitstarted)
- [VendorEvent](#vendorevent) - [VendorEvent](#vendorevent)
- [CustomEvent](#customevent)
- [Config Events](#config-events) - [Config Events](#config-events)
- [CurrentSceneCollectionChanging](#currentscenecollectionchanging) - [CurrentSceneCollectionChanging](#currentscenecollectionchanging)
- [CurrentSceneCollectionChanged](#currentscenecollectionchanged) - [CurrentSceneCollectionChanged](#currentscenecollectionchanged)
@ -1360,6 +1558,7 @@ Subscription value to receive the `SceneItemTransformChanged` high-volume event.
- [MediaInputActionTriggered](#mediainputactiontriggered) - [MediaInputActionTriggered](#mediainputactiontriggered)
- [Ui Events](#ui-events) - [Ui Events](#ui-events)
- [StudioModeStateChanged](#studiomodestatechanged) - [StudioModeStateChanged](#studiomodestatechanged)
- [ScreenshotSaved](#screenshotsaved)
## General Events ## General Events
@ -1392,6 +1591,22 @@ If a plugin or script implements vendor requests or events, documentation is exp
| eventType | String | Vendor-provided event typedef | | eventType | String | Vendor-provided event typedef |
| eventData | Object | Vendor-provided event data. {} if event does not provide any data | | eventData | Object | Vendor-provided event data. {} if event does not provide any data |
---
### CustomEvent
Custom event emitted by `BroadcastCustomEvent`.
- Complexity Rating: `1/5`
- Latest Supported RPC Version: `1`
- Added in v5.0.0
**Data Fields:**
| Name | Type | Description |
| ---- | :---: | ----------- |
| eventData | Object | Custom event data |
## Config Events ## Config Events
### CurrentSceneCollectionChanging ### CurrentSceneCollectionChanging
@ -1717,7 +1932,7 @@ An input's volume level has changed.
| Name | Type | Description | | Name | Type | Description |
| ---- | :---: | ----------- | | ---- | :---: | ----------- |
| inputName | String | Name of the input | | inputName | String | Name of the input |
| inputVolumeMul | Number | New volume level in multimap | | inputVolumeMul | Number | New volume level multiplier |
| inputVolumeDb | Number | New volume level in dB | | inputVolumeDb | Number | New volume level in dB |
--- ---
@ -2265,6 +2480,26 @@ Studio mode has been enabled or disabled.
| ---- | :---: | ----------- | | ---- | :---: | ----------- |
| studioModeEnabled | Boolean | True == Enabled, False == Disabled | | studioModeEnabled | Boolean | True == Enabled, False == Disabled |
---
### ScreenshotSaved
A screenshot has been saved.
Note: Triggered for the screenshot feature available in `Settings -> Hotkeys -> Screenshot Output` ONLY.
Applications using `Get/SaveSourceScreenshot` should implement a `CustomEvent` if this kind of inter-client
communication is desired.
- Complexity Rating: `2/5`
- Latest Supported RPC Version: `1`
- Added in v5.1.0
**Data Fields:**
| Name | Type | Description |
| ---- | :---: | ----------- |
| savedScreenshotPath | String | Path of the saved image file |
# Requests # Requests
## Requests Table of Contents ## Requests Table of Contents
@ -2580,8 +2815,8 @@ Sleeps for a time duration or number of frames. Only available in request batche
| Name | Type | Description | Value Restrictions | ?Default Behavior | | Name | Type | Description | Value Restrictions | ?Default Behavior |
| ---- | :---: | ----------- | :----------------: | ----------------- | | ---- | :---: | ----------- | :----------------: | ----------------- |
| sleepMillis | Number | Number of milliseconds to sleep for (if `SERIAL_REALTIME` mode) | >= 0, <= 50000 | N/A | | ?sleepMillis | Number | Number of milliseconds to sleep for (if `SERIAL_REALTIME` mode) | >= 0, <= 50000 | Unknown |
| sleepFrames | Number | Number of frames to sleep for (if `SERIAL_FRAME` mode) | >= 0, <= 10000 | N/A | | ?sleepFrames | Number | Number of frames to sleep for (if `SERIAL_FRAME` mode) | >= 0, <= 10000 | Unknown |
## Config Requests ## Config Requests
@ -3652,6 +3887,10 @@ Note: Use this in cases where an input provides a dynamic, selectable list of it
Presses a button in the properties of an input. Presses a button in the properties of an input.
Some known `propertyName` values are:
- `refreshnocache` - Browser source reload button
Note: Use this in cases where there is a button in the properties of an input that cannot be accessed in any other way. For example, browser sources, where there is a refresh button. Note: Use this in cases where there is a button in the properties of an input that cannot be accessed in any other way. For example, browser sources, where there is a refresh button.
- Complexity Rating: `4/5` - Complexity Rating: `4/5`
@ -4029,7 +4268,7 @@ Scenes only
Basically GetSceneItemList, but for groups. Basically GetSceneItemList, but for groups.
Using groups at all in OBS is discouraged, as they are very broken under the hood. Using groups at all in OBS is discouraged, as they are very broken under the hood. Please use nested scenes instead.
Groups only Groups only
@ -4521,6 +4760,12 @@ Gets the list of available outputs.
- Latest Supported RPC Version: `1` - Latest Supported RPC Version: `1`
- Added in v5.0.0 - Added in v5.0.0
**Response Fields:**
| Name | Type | Description |
| ---- | :---: | ----------- |
| outputs | Array&lt;Object&gt; | Array of outputs |
--- ---
### GetOutputStatus ### GetOutputStatus
@ -4733,7 +4978,7 @@ Gets the status of the record output.
| Name | Type | Description | | Name | Type | Description |
| ---- | :---: | ----------- | | ---- | :---: | ----------- |
| outputActive | Boolean | Whether the output is active | | outputActive | Boolean | Whether the output is active |
| ouputPaused | Boolean | Whether the output is paused | | outputPaused | Boolean | Whether the output is paused |
| outputTimecode | String | Current formatted timecode string for the output | | outputTimecode | String | Current formatted timecode string for the output |
| outputDuration | Number | Current duration in milliseconds for the output | | outputDuration | Number | Current duration in milliseconds for the output |
| outputBytes | Number | Number of bytes sent by the output | | outputBytes | Number | Number of bytes sent by the output |

View File

@ -267,97 +267,10 @@ void EventHandler::OnFrontendEvent(enum obs_frontend_event event, void *private_
switch (event) { switch (event) {
// General // General
case OBS_FRONTEND_EVENT_FINISHED_LOADING: case OBS_FRONTEND_EVENT_FINISHED_LOADING:
blog_debug( eventHandler->FrontendFinishedLoadingMultiHandler();
"[EventHandler::OnFrontendEvent] OBS has finished loading. Connecting final handlers and enabling events...");
// Connect source signals and enable events only after OBS has fully loaded (to reduce extra logging).
eventHandler->_obsLoaded.store(true);
// In the case that plugins become hotloadable, this will have to go back into `EventHandler::EventHandler()`
// Enumerate inputs and connect each one
{
auto enumInputs = [](void *param, obs_source_t *source) {
auto eventHandler = static_cast<EventHandler *>(param);
eventHandler->ConnectSourceSignals(source);
return true;
};
obs_enum_sources(enumInputs, private_data);
}
// Enumerate scenes and connect each one
{
auto enumScenes = [](void *param, obs_source_t *source) {
auto eventHandler = static_cast<EventHandler *>(param);
eventHandler->ConnectSourceSignals(source);
return true;
};
obs_enum_scenes(enumScenes, private_data);
}
// Enumerate all scene transitions and connect each one
{
obs_frontend_source_list transitions = {};
obs_frontend_get_transitions(&transitions);
for (size_t i = 0; i < transitions.sources.num; i++) {
obs_source_t *transition = transitions.sources.array[i];
eventHandler->ConnectSourceSignals(transition);
}
obs_frontend_source_list_free(&transitions);
}
blog_debug("[EventHandler::OnFrontendEvent] Finished.");
if (eventHandler->_obsLoadedCallback)
eventHandler->_obsLoadedCallback();
break; break;
case OBS_FRONTEND_EVENT_EXIT: case OBS_FRONTEND_EVENT_EXIT:
eventHandler->HandleExitStarted(); eventHandler->FrontendExitMultiHandler();
blog_debug("[EventHandler::OnFrontendEvent] OBS is unloading. Disabling events...");
// Disconnect source signals and disable events when OBS starts unloading (to reduce extra logging).
eventHandler->_obsLoaded.store(false);
// In the case that plugins become hotloadable, this will have to go back into `EventHandler::~EventHandler()`
// Enumerate inputs and disconnect each one
{
auto enumInputs = [](void *param, obs_source_t *source) {
auto eventHandler = static_cast<EventHandler *>(param);
eventHandler->DisconnectSourceSignals(source);
return true;
};
obs_enum_sources(enumInputs, private_data);
}
// Enumerate scenes and disconnect each one
{
auto enumScenes = [](void *param, obs_source_t *source) {
auto eventHandler = static_cast<EventHandler *>(param);
eventHandler->DisconnectSourceSignals(source);
return true;
};
obs_enum_scenes(enumScenes, private_data);
}
// Enumerate all scene transitions and disconnect each one
{
obs_frontend_source_list transitions = {};
obs_frontend_get_transitions(&transitions);
for (size_t i = 0; i < transitions.sources.num; i++) {
obs_source_t *transition = transitions.sources.array[i];
eventHandler->DisconnectSourceSignals(transition);
}
obs_frontend_source_list_free(&transitions);
}
blog_debug("[EventHandler::OnFrontendEvent] Finished.");
break;
case OBS_FRONTEND_EVENT_STUDIO_MODE_ENABLED:
eventHandler->HandleStudioModeStateChanged(true);
break;
case OBS_FRONTEND_EVENT_STUDIO_MODE_DISABLED:
eventHandler->HandleStudioModeStateChanged(false);
break; break;
// Config // Config
@ -427,12 +340,31 @@ void EventHandler::OnFrontendEvent(enum obs_frontend_event event, void *private_
// Outputs // Outputs
case OBS_FRONTEND_EVENT_STREAMING_STARTING: case OBS_FRONTEND_EVENT_STREAMING_STARTING:
eventHandler->HandleStreamStateChanged(OBS_WEBSOCKET_OUTPUT_STARTING); eventHandler->HandleStreamStateChanged(OBS_WEBSOCKET_OUTPUT_STARTING);
{
// Connect signals for stream output reconnects (hacky)
OBSOutputAutoRelease streamOutput = obs_frontend_get_streaming_output();
if (streamOutput) {
signal_handler_t *sh = obs_output_get_signal_handler(streamOutput);
signal_handler_connect(sh, "reconnect", StreamOutputReconnectHandler, private_data);
signal_handler_connect(sh, "reconnect_success", StreamOutputReconnectSuccessHandler, private_data);
}
}
break; break;
case OBS_FRONTEND_EVENT_STREAMING_STARTED: case OBS_FRONTEND_EVENT_STREAMING_STARTED:
eventHandler->HandleStreamStateChanged(OBS_WEBSOCKET_OUTPUT_STARTED); eventHandler->HandleStreamStateChanged(OBS_WEBSOCKET_OUTPUT_STARTED);
break; break;
case OBS_FRONTEND_EVENT_STREAMING_STOPPING: case OBS_FRONTEND_EVENT_STREAMING_STOPPING:
eventHandler->HandleStreamStateChanged(OBS_WEBSOCKET_OUTPUT_STOPPING); eventHandler->HandleStreamStateChanged(OBS_WEBSOCKET_OUTPUT_STOPPING);
{
// Disconnect signals for stream output reconnects
OBSOutputAutoRelease streamOutput = obs_frontend_get_streaming_output();
if (streamOutput) {
signal_handler_t *sh = obs_output_get_signal_handler(streamOutput);
signal_handler_disconnect(sh, "reconnect", StreamOutputReconnectHandler, private_data);
signal_handler_disconnect(sh, "reconnect_success", StreamOutputReconnectSuccessHandler,
private_data);
}
}
break; break;
case OBS_FRONTEND_EVENT_STREAMING_STOPPED: case OBS_FRONTEND_EVENT_STREAMING_STOPPED:
eventHandler->HandleStreamStateChanged(OBS_WEBSOCKET_OUTPUT_STOPPED); eventHandler->HandleStreamStateChanged(OBS_WEBSOCKET_OUTPUT_STOPPED);
@ -477,11 +409,112 @@ void EventHandler::OnFrontendEvent(enum obs_frontend_event event, void *private_
eventHandler->HandleReplayBufferSaved(); eventHandler->HandleReplayBufferSaved();
break; break;
// Ui
case OBS_FRONTEND_EVENT_STUDIO_MODE_ENABLED:
eventHandler->HandleStudioModeStateChanged(true);
break;
case OBS_FRONTEND_EVENT_STUDIO_MODE_DISABLED:
eventHandler->HandleStudioModeStateChanged(false);
break;
case OBS_FRONTEND_EVENT_SCREENSHOT_TAKEN:
eventHandler->HandleScreenshotSaved();
break;
default: default:
break; break;
} }
} }
void EventHandler::FrontendFinishedLoadingMultiHandler()
{
blog_debug(
"[EventHandler::FrontendFinishedLoadingMultiHandler] OBS has finished loading. Connecting final handlers and enabling events...");
// Connect source signals and enable events only after OBS has fully loaded (to reduce extra logging).
_obsLoaded.store(true);
// In the case that plugins become hotloadable, this will have to go back into `EventHandler::EventHandler()`
// Enumerate inputs and connect each one
{
auto enumInputs = [](void *param, obs_source_t *source) {
auto eventHandler = static_cast<EventHandler *>(param);
eventHandler->ConnectSourceSignals(source);
return true;
};
obs_enum_sources(enumInputs, this);
}
// Enumerate scenes and connect each one
{
auto enumScenes = [](void *param, obs_source_t *source) {
auto eventHandler = static_cast<EventHandler *>(param);
eventHandler->ConnectSourceSignals(source);
return true;
};
obs_enum_scenes(enumScenes, this);
}
// Enumerate all scene transitions and connect each one
{
obs_frontend_source_list transitions = {};
obs_frontend_get_transitions(&transitions);
for (size_t i = 0; i < transitions.sources.num; i++) {
obs_source_t *transition = transitions.sources.array[i];
ConnectSourceSignals(transition);
}
obs_frontend_source_list_free(&transitions);
}
blog_debug("[EventHandler::FrontendFinishedLoadingMultiHandler] Finished.");
if (_obsLoadedCallback)
_obsLoadedCallback();
}
void EventHandler::FrontendExitMultiHandler()
{
HandleExitStarted();
blog_debug("[EventHandler::FrontendExitMultiHandler] OBS is unloading. Disabling events...");
// Disconnect source signals and disable events when OBS starts unloading (to reduce extra logging).
_obsLoaded.store(false);
// In the case that plugins become hotloadable, this will have to go back into `EventHandler::~EventHandler()`
// Enumerate inputs and disconnect each one
{
auto enumInputs = [](void *param, obs_source_t *source) {
auto eventHandler = static_cast<EventHandler *>(param);
eventHandler->DisconnectSourceSignals(source);
return true;
};
obs_enum_sources(enumInputs, this);
}
// Enumerate scenes and disconnect each one
{
auto enumScenes = [](void *param, obs_source_t *source) {
auto eventHandler = static_cast<EventHandler *>(param);
eventHandler->DisconnectSourceSignals(source);
return true;
};
obs_enum_scenes(enumScenes, this);
}
// Enumerate all scene transitions and disconnect each one
{
obs_frontend_source_list transitions = {};
obs_frontend_get_transitions(&transitions);
for (size_t i = 0; i < transitions.sources.num; i++) {
obs_source_t *transition = transitions.sources.array[i];
DisconnectSourceSignals(transition);
}
obs_frontend_source_list_free(&transitions);
}
blog_debug("[EventHandler::FrontendExitMultiHandler] Finished.");
}
// Only called for creation of a public source // Only called for creation of a public source
void EventHandler::SourceCreatedMultiHandler(void *param, calldata_t *data) void EventHandler::SourceCreatedMultiHandler(void *param, calldata_t *data)
{ {
@ -597,3 +630,17 @@ void EventHandler::SourceRenamedMultiHandler(void *param, calldata_t *data)
break; break;
} }
} }
void EventHandler::StreamOutputReconnectHandler(void *param, calldata_t *)
{
auto eventHandler = static_cast<EventHandler *>(param);
eventHandler->HandleStreamStateChanged(OBS_WEBSOCKET_OUTPUT_RECONNECTING);
}
void EventHandler::StreamOutputReconnectSuccessHandler(void *param, calldata_t *)
{
auto eventHandler = static_cast<EventHandler *>(param);
eventHandler->HandleStreamStateChanged(OBS_WEBSOCKET_OUTPUT_RECONNECTED);
}

View File

@ -27,7 +27,7 @@ with this program. If not, see <https://www.gnu.org/licenses/>
#include "../obs-websocket.h" #include "../obs-websocket.h"
#include "../utils/Obs.h" #include "../utils/Obs.h"
#include "../utils/Obs_VolumeMeter.h" #include "../utils/Obs_VolumeMeter.h"
#include "../plugin-macros.generated.h" #include "plugin-macros.generated.h"
class EventHandler { class EventHandler {
public: public:
@ -61,6 +61,8 @@ private:
// Signal handler: frontend // Signal handler: frontend
static void OnFrontendEvent(enum obs_frontend_event event, void *private_data); static void OnFrontendEvent(enum obs_frontend_event event, void *private_data);
void FrontendFinishedLoadingMultiHandler();
void FrontendExitMultiHandler();
// Signal handler: libobs // Signal handler: libobs
static void SourceCreatedMultiHandler(void *param, calldata_t *data); static void SourceCreatedMultiHandler(void *param, calldata_t *data);
@ -76,9 +78,12 @@ private:
static void SourceMediaNextMultiHandler(void *param, calldata_t *data); static void SourceMediaNextMultiHandler(void *param, calldata_t *data);
static void SourceMediaPreviousMultiHandler(void *param, calldata_t *data); static void SourceMediaPreviousMultiHandler(void *param, calldata_t *data);
// Signal handler: output
static void StreamOutputReconnectHandler(void *param, calldata_t *data);
static void StreamOutputReconnectSuccessHandler(void *param, calldata_t *data);
// General // General
void HandleExitStarted(); void HandleExitStarted();
void HandleStudioModeStateChanged(bool enabled);
// Config // Config
void HandleCurrentSceneCollectionChanging(); void HandleCurrentSceneCollectionChanging();
@ -170,4 +175,8 @@ private:
static void HandleMediaInputPlaybackEnded(void *param, static void HandleMediaInputPlaybackEnded(void *param,
calldata_t *data); // Direct callback calldata_t *data); // Direct callback
void HandleMediaInputActionTriggered(obs_source_t *source, ObsMediaInputAction action); void HandleMediaInputActionTriggered(obs_source_t *source, ObsMediaInputAction action);
// Ui
void HandleStudioModeStateChanged(bool enabled);
void HandleScreenshotSaved();
}; };

View File

@ -200,7 +200,7 @@ void EventHandler::HandleInputMuteStateChanged(void *param, calldata_t *data)
* An input's volume level has changed. * An input's volume level has changed.
* *
* @dataField inputName | String | Name of the input * @dataField inputName | String | Name of the input
* @dataField inputVolumeMul | Number | New volume level in multimap * @dataField inputVolumeMul | Number | New volume level multiplier
* @dataField inputVolumeDb | Number | New volume level in dB * @dataField inputVolumeDb | Number | New volume level in dB
* *
* @eventType InputVolumeChanged * @eventType InputVolumeChanged

View File

@ -24,10 +24,12 @@ static bool GetOutputStateActive(ObsOutputState state)
switch (state) { switch (state) {
case OBS_WEBSOCKET_OUTPUT_STARTED: case OBS_WEBSOCKET_OUTPUT_STARTED:
case OBS_WEBSOCKET_OUTPUT_RESUMED: case OBS_WEBSOCKET_OUTPUT_RESUMED:
case OBS_WEBSOCKET_OUTPUT_RECONNECTED:
return true; return true;
case OBS_WEBSOCKET_OUTPUT_STARTING: case OBS_WEBSOCKET_OUTPUT_STARTING:
case OBS_WEBSOCKET_OUTPUT_STOPPING: case OBS_WEBSOCKET_OUTPUT_STOPPING:
case OBS_WEBSOCKET_OUTPUT_STOPPED: case OBS_WEBSOCKET_OUTPUT_STOPPED:
case OBS_WEBSOCKET_OUTPUT_RECONNECTING:
case OBS_WEBSOCKET_OUTPUT_PAUSED: case OBS_WEBSOCKET_OUTPUT_PAUSED:
return false; return false;
default: default:

View File

@ -38,3 +38,27 @@ void EventHandler::HandleStudioModeStateChanged(bool enabled)
eventData["studioModeEnabled"] = enabled; eventData["studioModeEnabled"] = enabled;
BroadcastEvent(EventSubscription::Ui, "StudioModeStateChanged", eventData); BroadcastEvent(EventSubscription::Ui, "StudioModeStateChanged", eventData);
} }
/**
* A screenshot has been saved.
*
* Note: Triggered for the screenshot feature available in `Settings -> Hotkeys -> Screenshot Output` ONLY.
* Applications using `Get/SaveSourceScreenshot` should implement a `CustomEvent` if this kind of inter-client
* communication is desired.
*
* @dataField savedScreenshotPath | String | Path of the saved image file
*
* @eventType ScreenshotSaved
* @eventSubscription Ui
* @complexity 2
* @rpcVersion -1
* @initialVersion 5.1.0
* @api events
* @category ui
*/
void EventHandler::HandleScreenshotSaved()
{
json eventData;
eventData["savedScreenshotPath"] = Utils::Obs::StringHelper::GetLastScreenshotFileName();
BroadcastEvent(EventSubscription::Ui, "ScreenshotSaved", eventData);
}

View File

@ -105,7 +105,7 @@ void ConnectInfo::SetClipboardText(QString text)
void ConnectInfo::DrawQr(QString qrText) void ConnectInfo::DrawQr(QString qrText)
{ {
QPixmap map(230, 230); QPixmap map(236, 236);
map.fill(Qt::white); map.fill(Qt::white);
QPainter painter(&map); QPainter painter(&map);

View File

@ -21,7 +21,7 @@ with this program. If not, see <https://www.gnu.org/licenses/>
#include <QtWidgets/QDialog> #include <QtWidgets/QDialog>
#include "../plugin-macros.generated.h" #include "plugin-macros.generated.h"
#include "ui_ConnectInfo.h" #include "ui_ConnectInfo.h"

View File

@ -7,7 +7,7 @@
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>451</width> <width>451</width>
<height>412</height> <height>432</height>
</rect> </rect>
</property> </property>
<property name="minimumSize"> <property name="minimumSize">
@ -19,7 +19,7 @@
<property name="maximumSize"> <property name="maximumSize">
<size> <size>
<width>451</width> <width>451</width>
<height>412</height> <height>432</height>
</size> </size>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
@ -31,12 +31,21 @@
<x>10</x> <x>10</x>
<y>10</y> <y>10</y>
<width>431</width> <width>431</width>
<height>101</height> <height>121</height>
</rect> </rect>
</property> </property>
<layout class="QFormLayout" name="formLayout"> <layout class="QFormLayout" name="formLayout">
<property name="formAlignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
</property>
<item row="0" column="0"> <item row="0" column="0">
<widget class="QLabel" name="serverIpLabel"> <widget class="QLabel" name="serverIpLabel">
<property name="maximumSize">
<size>
<width>200</width>
<height>16777215</height>
</size>
</property>
<property name="text"> <property name="text">
<string>OBSWebSocket.ConnectInfo.ServerIp</string> <string>OBSWebSocket.ConnectInfo.ServerIp</string>
</property> </property>
@ -46,6 +55,12 @@
<layout class="QHBoxLayout" name="horizontalLayout"> <layout class="QHBoxLayout" name="horizontalLayout">
<item> <item>
<widget class="QLineEdit" name="serverIpLineEdit"> <widget class="QLineEdit" name="serverIpLineEdit">
<property name="focusPolicy">
<enum>Qt::NoFocus</enum>
</property>
<property name="alignment">
<set>Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft</set>
</property>
<property name="readOnly"> <property name="readOnly">
<bool>true</bool> <bool>true</bool>
</property> </property>
@ -53,6 +68,12 @@
</item> </item>
<item> <item>
<widget class="QPushButton" name="copyServerIpButton"> <widget class="QPushButton" name="copyServerIpButton">
<property name="maximumSize">
<size>
<width>75</width>
<height>16777215</height>
</size>
</property>
<property name="text"> <property name="text">
<string>OBSWebSocket.ConnectInfo.CopyText</string> <string>OBSWebSocket.ConnectInfo.CopyText</string>
</property> </property>
@ -62,6 +83,12 @@
</item> </item>
<item row="1" column="0"> <item row="1" column="0">
<widget class="QLabel" name="serverPortLabel"> <widget class="QLabel" name="serverPortLabel">
<property name="maximumSize">
<size>
<width>200</width>
<height>16777215</height>
</size>
</property>
<property name="text"> <property name="text">
<string>OBSWebSocket.ConnectInfo.ServerPort</string> <string>OBSWebSocket.ConnectInfo.ServerPort</string>
</property> </property>
@ -71,6 +98,12 @@
<layout class="QHBoxLayout" name="horizontalLayout_2"> <layout class="QHBoxLayout" name="horizontalLayout_2">
<item> <item>
<widget class="QLineEdit" name="serverPortLineEdit"> <widget class="QLineEdit" name="serverPortLineEdit">
<property name="focusPolicy">
<enum>Qt::NoFocus</enum>
</property>
<property name="alignment">
<set>Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft</set>
</property>
<property name="readOnly"> <property name="readOnly">
<bool>true</bool> <bool>true</bool>
</property> </property>
@ -78,6 +111,12 @@
</item> </item>
<item> <item>
<widget class="QPushButton" name="copyServerPortButton"> <widget class="QPushButton" name="copyServerPortButton">
<property name="maximumSize">
<size>
<width>75</width>
<height>16777215</height>
</size>
</property>
<property name="text"> <property name="text">
<string>OBSWebSocket.ConnectInfo.CopyText</string> <string>OBSWebSocket.ConnectInfo.CopyText</string>
</property> </property>
@ -87,6 +126,12 @@
</item> </item>
<item row="2" column="0"> <item row="2" column="0">
<widget class="QLabel" name="serverPasswordLabel"> <widget class="QLabel" name="serverPasswordLabel">
<property name="maximumSize">
<size>
<width>200</width>
<height>16777215</height>
</size>
</property>
<property name="text"> <property name="text">
<string>OBSWebSocket.ConnectInfo.ServerPassword</string> <string>OBSWebSocket.ConnectInfo.ServerPassword</string>
</property> </property>
@ -96,9 +141,15 @@
<layout class="QHBoxLayout" name="horizontalLayout_3"> <layout class="QHBoxLayout" name="horizontalLayout_3">
<item> <item>
<widget class="QLineEdit" name="serverPasswordLineEdit"> <widget class="QLineEdit" name="serverPasswordLineEdit">
<property name="focusPolicy">
<enum>Qt::NoFocus</enum>
</property>
<property name="text"> <property name="text">
<string>OBSWebSocket.ConnectInfo.ServerPasswordPlaceholderText</string> <string>OBSWebSocket.ConnectInfo.ServerPasswordPlaceholderText</string>
</property> </property>
<property name="alignment">
<set>Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft</set>
</property>
<property name="readOnly"> <property name="readOnly">
<bool>true</bool> <bool>true</bool>
</property> </property>
@ -106,6 +157,12 @@
</item> </item>
<item> <item>
<widget class="QPushButton" name="copyServerPasswordButton"> <widget class="QPushButton" name="copyServerPasswordButton">
<property name="maximumSize">
<size>
<width>75</width>
<height>16777215</height>
</size>
</property>
<property name="text"> <property name="text">
<string>OBSWebSocket.ConnectInfo.CopyText</string> <string>OBSWebSocket.ConnectInfo.CopyText</string>
</property> </property>
@ -119,7 +176,7 @@
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>10</x> <x>10</x>
<y>120</y> <y>140</y>
<width>431</width> <width>431</width>
<height>281</height> <height>281</height>
</rect> </rect>
@ -131,9 +188,9 @@
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>100</x> <x>100</x>
<y>40</y> <y>30</y>
<width>230</width> <width>236</width>
<height>230</height> <height>236</height>
</rect> </rect>
</property> </property>
<property name="text"> <property name="text">

View File

@ -23,7 +23,7 @@ with this program. If not, see <https://www.gnu.org/licenses/>
#include <QTimer> #include <QTimer>
#include "ConnectInfo.h" #include "ConnectInfo.h"
#include "../plugin-macros.generated.h" #include "plugin-macros.generated.h"
#include "ui_SettingsDialog.h" #include "ui_SettingsDialog.h"

View File

@ -80,7 +80,7 @@
<item row="3" column="1"> <item row="3" column="1">
<layout class="QHBoxLayout" name="horizontalLayout_2"> <layout class="QHBoxLayout" name="horizontalLayout_2">
<property name="spacing"> <property name="spacing">
<number>0</number> <number>2</number>
</property> </property>
<item> <item>
<widget class="QCheckBox" name="enableDebugLoggingCheckBox"> <widget class="QCheckBox" name="enableDebugLoggingCheckBox">
@ -97,6 +97,12 @@
<property name="toolTip"> <property name="toolTip">
<string>OBSWebSocket.Settings.DebugEnableHoverText</string> <string>OBSWebSocket.Settings.DebugEnableHoverText</string>
</property> </property>
<property name="scaledContents">
<bool>true</bool>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget> </widget>
</item> </item>
<item> <item>

View File

@ -30,7 +30,7 @@ with this program. If not, see <https://www.gnu.org/licenses/>
#include "../websocketserver/rpc/WebSocketSession.h" #include "../websocketserver/rpc/WebSocketSession.h"
#include "../obs-websocket.h" #include "../obs-websocket.h"
#include "../utils/Obs.h" #include "../utils/Obs.h"
#include "../plugin-macros.generated.h" #include "plugin-macros.generated.h"
class RequestHandler; class RequestHandler;
typedef RequestResult (RequestHandler::*RequestMethodHandler)(const Request &); typedef RequestResult (RequestHandler::*RequestMethodHandler)(const Request &);

View File

@ -102,6 +102,20 @@ RequestResult RequestHandler::GetStats(const Request &)
return RequestResult::Success(responseData); return RequestResult::Success(responseData);
} }
/**
* Custom event emitted by `BroadcastCustomEvent`.
*
* @dataField eventData | Object | Custom event data
*
* @eventType CustomEvent
* @eventSubscription General
* @complexity 1
* @rpcVersion -1
* @initialVersion 5.0.0
* @category general
* @api events
*/
/** /**
* Broadcasts a `CustomEvent` to all WebSocket clients. Receivers are clients which are identified and subscribed. * Broadcasts a `CustomEvent` to all WebSocket clients. Receivers are clients which are identified and subscribed.
* *
@ -164,7 +178,7 @@ RequestResult RequestHandler::CallVendorRequest(const Request &request)
OBSDataAutoRelease requestData = obs_data_create(); OBSDataAutoRelease requestData = obs_data_create();
if (request.Contains("requestData")) { if (request.Contains("requestData")) {
if (!request.ValidateOptionalObject("requestData", statusCode, comment)) if (!request.ValidateOptionalObject("requestData", statusCode, comment, true))
return RequestResult::Error(statusCode, comment); return RequestResult::Error(statusCode, comment);
requestData = Utils::Json::JsonToObsData(request.RequestData["requestData"]); requestData = Utils::Json::JsonToObsData(request.RequestData["requestData"]);
@ -311,8 +325,8 @@ RequestResult RequestHandler::TriggerHotkeyByKeySequence(const Request &request)
/** /**
* Sleeps for a time duration or number of frames. Only available in request batches with types `SERIAL_REALTIME` or `SERIAL_FRAME`. * Sleeps for a time duration or number of frames. Only available in request batches with types `SERIAL_REALTIME` or `SERIAL_FRAME`.
* *
* @requestField sleepMillis | Number | Number of milliseconds to sleep for (if `SERIAL_REALTIME` mode) | >= 0, <= 50000 * @requestField ?sleepMillis | Number | Number of milliseconds to sleep for (if `SERIAL_REALTIME` mode) | >= 0, <= 50000
* @requestField sleepFrames | Number | Number of frames to sleep for (if `SERIAL_FRAME` mode) | >= 0, <= 10000 * @requestField ?sleepFrames | Number | Number of frames to sleep for (if `SERIAL_FRAME` mode) | >= 0, <= 10000
* *
* @requestType Sleep * @requestType Sleep
* @complexity 2 * @complexity 2

View File

@ -889,6 +889,10 @@ RequestResult RequestHandler::GetInputPropertiesListPropertyItems(const Request
/** /**
* Presses a button in the properties of an input. * Presses a button in the properties of an input.
* *
* Some known `propertyName` values are:
*
* - `refreshnocache` - Browser source reload button
*
* Note: Use this in cases where there is a button in the properties of an input that cannot be accessed in any other way. For example, browser sources, where there is a refresh button. * Note: Use this in cases where there is a button in the properties of an input that cannot be accessed in any other way. For example, browser sources, where there is a refresh button.
* *
* @requestField inputName | String | Name of the input * @requestField inputName | String | Name of the input

View File

@ -279,6 +279,8 @@ RequestResult RequestHandler::GetLastReplayBufferReplay(const Request &)
/** /**
* Gets the list of available outputs. * Gets the list of available outputs.
* *
* @responseField outputs | Array<Object> | Array of outputs
*
* @requestType GetOutputList * @requestType GetOutputList
* @complexity 4 * @complexity 4
* @rpcVersion -1 * @rpcVersion -1

View File

@ -23,7 +23,7 @@ with this program. If not, see <https://www.gnu.org/licenses/>
* Gets the status of the record output. * Gets the status of the record output.
* *
* @responseField outputActive | Boolean | Whether the output is active * @responseField outputActive | Boolean | Whether the output is active
* @responseField ouputPaused | Boolean | Whether the output is paused * @responseField outputPaused | Boolean | Whether the output is paused
* @responseField outputTimecode | String | Current formatted timecode string for the output * @responseField outputTimecode | String | Current formatted timecode string for the output
* @responseField outputDuration | Number | Current duration in milliseconds for the output * @responseField outputDuration | Number | Current duration in milliseconds for the output
* @responseField outputBytes | Number | Number of bytes sent by the output * @responseField outputBytes | Number | Number of bytes sent by the output

View File

@ -52,7 +52,7 @@ RequestResult RequestHandler::GetSceneItemList(const Request &request)
/** /**
* Basically GetSceneItemList, but for groups. * Basically GetSceneItemList, but for groups.
* *
* Using groups at all in OBS is discouraged, as they are very broken under the hood. * Using groups at all in OBS is discouraged, as they are very broken under the hood. Please use nested scenes instead.
* *
* Groups only * Groups only
* *

View File

@ -22,7 +22,7 @@ with this program. If not, see <https://www.gnu.org/licenses/>
#include <QRandomGenerator> #include <QRandomGenerator>
#include "Crypto.h" #include "Crypto.h"
#include "../plugin-macros.generated.h" #include "plugin-macros.generated.h"
static const char allowedChars[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; static const char allowedChars[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
static const int allowedCharsCount = static_cast<int>(sizeof(allowedChars) - 1); static const int allowedCharsCount = static_cast<int>(sizeof(allowedChars) - 1);

View File

@ -19,7 +19,7 @@ with this program. If not, see <https://www.gnu.org/licenses/>
#include "Json.h" #include "Json.h"
#include "Platform.h" #include "Platform.h"
#include "../plugin-macros.generated.h" #include "plugin-macros.generated.h"
bool Utils::Json::JsonArrayIsValidObsArray(const json &j) bool Utils::Json::JsonArrayIsValidObsArray(const json &j)
{ {

View File

@ -18,4 +18,4 @@ with this program. If not, see <https://www.gnu.org/licenses/>
*/ */
#include "Obs.h" #include "Obs.h"
#include "../plugin-macros.generated.h" #include "plugin-macros.generated.h"

View File

@ -67,22 +67,105 @@ template<typename T> T *GetCalldataPointer(const calldata_t *data, const char *n
} }
enum ObsOutputState { enum ObsOutputState {
/**
* Unknown state.
*
* @enumIdentifier OBS_WEBSOCKET_OUTPUT_UNKNOWN
* @enumType ObsOutputState
* @rpcVersion 1
* @initialVersion 5.0.0
* @api enums
*/
OBS_WEBSOCKET_OUTPUT_UNKNOWN, OBS_WEBSOCKET_OUTPUT_UNKNOWN,
/**
* The output is starting.
*
* @enumIdentifier OBS_WEBSOCKET_OUTPUT_STARTING
* @enumType ObsOutputState
* @rpcVersion 1
* @initialVersion 5.0.0
* @api enums
*/
OBS_WEBSOCKET_OUTPUT_STARTING, OBS_WEBSOCKET_OUTPUT_STARTING,
/**
* The input has started.
*
* @enumIdentifier OBS_WEBSOCKET_OUTPUT_STARTED
* @enumType ObsOutputState
* @rpcVersion 1
* @initialVersion 5.0.0
* @api enums
*/
OBS_WEBSOCKET_OUTPUT_STARTED, OBS_WEBSOCKET_OUTPUT_STARTED,
/**
* The output is stopping.
*
* @enumIdentifier OBS_WEBSOCKET_OUTPUT_STOPPING
* @enumType ObsOutputState
* @rpcVersion 1
* @initialVersion 5.0.0
* @api enums
*/
OBS_WEBSOCKET_OUTPUT_STOPPING, OBS_WEBSOCKET_OUTPUT_STOPPING,
/**
* The output has stopped.
*
* @enumIdentifier OBS_WEBSOCKET_OUTPUT_STOPPED
* @enumType ObsOutputState
* @rpcVersion 1
* @initialVersion 5.0.0
* @api enums
*/
OBS_WEBSOCKET_OUTPUT_STOPPED, OBS_WEBSOCKET_OUTPUT_STOPPED,
/**
* The output has disconnected and is reconnecting.
*
* @enumIdentifier OBS_WEBSOCKET_OUTPUT_RECONNECTING
* @enumType ObsOutputState
* @rpcVersion 1
* @initialVersion 5.0.0
* @api enums
*/
OBS_WEBSOCKET_OUTPUT_RECONNECTING, OBS_WEBSOCKET_OUTPUT_RECONNECTING,
/**
* The output has reconnected successfully.
*
* @enumIdentifier OBS_WEBSOCKET_OUTPUT_RECONNECTED
* @enumType ObsOutputState
* @rpcVersion 1
* @initialVersion 5.1.0
* @api enums
*/
OBS_WEBSOCKET_OUTPUT_RECONNECTED,
/**
* The output is now paused.
*
* @enumIdentifier OBS_WEBSOCKET_OUTPUT_PAUSED
* @enumType ObsOutputState
* @rpcVersion 1
* @initialVersion 5.1.0
* @api enums
*/
OBS_WEBSOCKET_OUTPUT_PAUSED, OBS_WEBSOCKET_OUTPUT_PAUSED,
/**
* The output has been resumed (unpaused).
*
* @enumIdentifier OBS_WEBSOCKET_OUTPUT_RESUMED
* @enumType ObsOutputState
* @rpcVersion 1
* @initialVersion 5.0.0
* @api enums
*/
OBS_WEBSOCKET_OUTPUT_RESUMED, OBS_WEBSOCKET_OUTPUT_RESUMED,
}; };
NLOHMANN_JSON_SERIALIZE_ENUM(ObsOutputState, { NLOHMANN_JSON_SERIALIZE_ENUM(ObsOutputState, {
{OBS_WEBSOCKET_OUTPUT_UNKNOWN, "OBS_WEBSOCKET_OUTPUT_UNKNOWN"}, {OBS_WEBSOCKET_OUTPUT_UNKNOWN, "OBS_WEBSOCKET_OUTPUT_UNKNOWN"},
{OBS_WEBSOCKET_OUTPUT_STARTING, "OBS_WEBSOCKET_OUTPUT_STARTING"}, {OBS_WEBSOCKET_OUTPUT_STARTING, "OBS_WEBSOCKET_OUTPUT_STARTING"},
{OBS_WEBSOCKET_OUTPUT_STARTED, "OBS_WEBSOCKET_OUTPUT_STARTED"}, {OBS_WEBSOCKET_OUTPUT_STARTED, "OBS_WEBSOCKET_OUTPUT_STARTED"},
{OBS_WEBSOCKET_OUTPUT_STOPPING, "OBS_WEBSOCKET_OUTPUT_STOPPING"}, {OBS_WEBSOCKET_OUTPUT_STOPPING, "OBS_WEBSOCKET_OUTPUT_STOPPING"},
{OBS_WEBSOCKET_OUTPUT_STOPPED, "OBS_WEBSOCKET_OUTPUT_STOPPED"}, {OBS_WEBSOCKET_OUTPUT_STOPPED, "OBS_WEBSOCKET_OUTPUT_STOPPED"},
{OBS_WEBSOCKET_OUTPUT_RECONNECTING, "OBS_WEBSOCKET_OUTPUT_RECONNECTING"},
{OBS_WEBSOCKET_OUTPUT_RECONNECTED, "OBS_WEBSOCKET_OUTPUT_RECONNECTED"},
{OBS_WEBSOCKET_OUTPUT_PAUSED, "OBS_WEBSOCKET_OUTPUT_PAUSED"}, {OBS_WEBSOCKET_OUTPUT_PAUSED, "OBS_WEBSOCKET_OUTPUT_PAUSED"},
{OBS_WEBSOCKET_OUTPUT_RESUMED, "OBS_WEBSOCKET_OUTPUT_RESUMED"}, {OBS_WEBSOCKET_OUTPUT_RESUMED, "OBS_WEBSOCKET_OUTPUT_RESUMED"},
}) })
@ -159,7 +242,6 @@ enum ObsMediaInputAction {
*/ */
OBS_WEBSOCKET_MEDIA_INPUT_ACTION_PREVIOUS, OBS_WEBSOCKET_MEDIA_INPUT_ACTION_PREVIOUS,
}; };
NLOHMANN_JSON_SERIALIZE_ENUM(ObsMediaInputAction, NLOHMANN_JSON_SERIALIZE_ENUM(ObsMediaInputAction,
{ {
{OBS_WEBSOCKET_MEDIA_INPUT_ACTION_NONE, "OBS_WEBSOCKET_MEDIA_INPUT_ACTION_NONE"}, {OBS_WEBSOCKET_MEDIA_INPUT_ACTION_NONE, "OBS_WEBSOCKET_MEDIA_INPUT_ACTION_NONE"},
@ -181,6 +263,7 @@ namespace Utils {
std::string GetCurrentRecordOutputPath(); std::string GetCurrentRecordOutputPath();
std::string GetLastRecordFileName(); std::string GetLastRecordFileName();
std::string GetLastReplayBufferFileName(); std::string GetLastReplayBufferFileName();
std::string GetLastScreenshotFileName();
std::string DurationToTimecode(uint64_t); std::string DurationToTimecode(uint64_t);
} }

View File

@ -17,7 +17,7 @@ with this program. If not, see <https://www.gnu.org/licenses/>
*/ */
#include "Obs.h" #include "Obs.h"
#include "../plugin-macros.generated.h" #include "plugin-macros.generated.h"
struct CreateSceneItemData { struct CreateSceneItemData {
obs_source_t *source; // In obs_source_t *source; // In

View File

@ -20,7 +20,7 @@ with this program. If not, see <https://www.gnu.org/licenses/>
#include <algorithm> #include <algorithm>
#include "Obs.h" #include "Obs.h"
#include "../plugin-macros.generated.h" #include "plugin-macros.generated.h"
static std::vector<std::string> ConvertStringArray(char **array) static std::vector<std::string> ConvertStringArray(char **array)
{ {

View File

@ -21,7 +21,7 @@ with this program. If not, see <https://www.gnu.org/licenses/>
#include <util/util_uint64.h> #include <util/util_uint64.h>
#include "Obs.h" #include "Obs.h"
#include "../plugin-macros.generated.h" #include "plugin-macros.generated.h"
uint64_t Utils::Obs::NumberHelper::GetOutputDuration(obs_output_t *output) uint64_t Utils::Obs::NumberHelper::GetOutputDuration(obs_output_t *output)
{ {

View File

@ -21,7 +21,7 @@ with this program. If not, see <https://www.gnu.org/licenses/>
#include "Obs.h" #include "Obs.h"
#include "../obs-websocket.h" #include "../obs-websocket.h"
#include "../plugin-macros.generated.h" #include "plugin-macros.generated.h"
json Utils::Obs::ObjectHelper::GetStats() json Utils::Obs::ObjectHelper::GetStats()
{ {

View File

@ -17,7 +17,7 @@ with this program. If not, see <https://www.gnu.org/licenses/>
*/ */
#include "Obs.h" #include "Obs.h"
#include "../plugin-macros.generated.h" #include "plugin-macros.generated.h"
obs_hotkey_t *Utils::Obs::SearchHelper::GetHotkeyByName(std::string name) obs_hotkey_t *Utils::Obs::SearchHelper::GetHotkeyByName(std::string name)
{ {

View File

@ -21,7 +21,7 @@ with this program. If not, see <https://www.gnu.org/licenses/>
#include <QString> #include <QString>
#include "Obs.h" #include "Obs.h"
#include "../plugin-macros.generated.h" #include "plugin-macros.generated.h"
#define CASE(x) \ #define CASE(x) \
case x: \ case x: \
@ -94,20 +94,18 @@ std::string Utils::Obs::StringHelper::GetLastRecordFileName()
std::string Utils::Obs::StringHelper::GetLastReplayBufferFileName() std::string Utils::Obs::StringHelper::GetLastReplayBufferFileName()
{ {
OBSOutputAutoRelease output = obs_frontend_get_replay_buffer_output(); char *replayBufferPath = obs_frontend_get_last_replay();
if (!output) std::string ret = replayBufferPath;
return ""; bfree(replayBufferPath);
return ret;
}
calldata_t cd = {0}; std::string Utils::Obs::StringHelper::GetLastScreenshotFileName()
proc_handler_t *ph = obs_output_get_proc_handler(output); {
proc_handler_call(ph, "get_last_replay", &cd); char *screenshotPath = obs_frontend_get_last_screenshot();
const char *savedReplayPath = calldata_string(&cd, "path"); std::string ret = screenshotPath;
calldata_free(&cd); bfree(screenshotPath);
return ret;
if (!savedReplayPath)
return "";
return savedReplayPath;
} }
std::string Utils::Obs::StringHelper::DurationToTimecode(uint64_t ms) std::string Utils::Obs::StringHelper::DurationToTimecode(uint64_t ms)

View File

@ -25,7 +25,7 @@ with this program. If not, see <https://www.gnu.org/licenses/>
#include <obs-frontend-api.h> #include <obs-frontend-api.h>
#include "Platform.h" #include "Platform.h"
#include "../plugin-macros.generated.h" #include "plugin-macros.generated.h"
std::string Utils::Platform::GetLocalAddress() std::string Utils::Platform::GetLocalAddress()
{ {

View File

@ -32,7 +32,7 @@ with this program. If not, see <https://www.gnu.org/licenses/>
#include "types/WebSocketOpCode.h" #include "types/WebSocketOpCode.h"
#include "../utils/Json.h" #include "../utils/Json.h"
#include "../requesthandler/rpc/Request.h" #include "../requesthandler/rpc/Request.h"
#include "../plugin-macros.generated.h" #include "plugin-macros.generated.h"
class WebSocketServer : QObject { class WebSocketServer : QObject {
Q_OBJECT Q_OBJECT

View File

@ -104,6 +104,11 @@ void WebSocketServer::ProcessMessage(SessionPtr session, WebSocketServer::Proces
"Your payload's data is missing an `authentication` string, however authentication is required."; "Your payload's data is missing an `authentication` string, however authentication is required.";
return; return;
} }
if (!payloadData["authentication"].is_string()) {
ret.closeCode = WebSocketCloseCode::AuthenticationFailed;
ret.closeReason = "Your `authentication` field is not a string.";
return;
}
if (!Utils::Crypto::CheckAuthenticationString(session->Secret(), session->Challenge(), if (!Utils::Crypto::CheckAuthenticationString(session->Secret(), session->Challenge(),
payloadData["authentication"])) { payloadData["authentication"])) {
auto conf = GetConfig(); auto conf = GetConfig();

View File

@ -24,7 +24,7 @@ with this program. If not, see <https://www.gnu.org/licenses/>
#include <atomic> #include <atomic>
#include <memory> #include <memory>
#include "../../plugin-macros.generated.h" #include "plugin-macros.generated.h"
class WebSocketSession; class WebSocketSession;
typedef std::shared_ptr<WebSocketSession> SessionPtr; typedef std::shared_ptr<WebSocketSession> SessionPtr;