mirror of
https://github.com/Palakis/obs-websocket.git
synced 2024-08-30 18:12:16 +00:00
Compare commits
65 Commits
Author | SHA1 | Date | |
---|---|---|---|
5716577019 | |||
b4a1266cf0 | |||
6527381c91 | |||
fb2abc45cf | |||
54b0dc3781 | |||
0ff90d1687 | |||
62bdbb2e64 | |||
5f8a0122bd | |||
20ea6e3352 | |||
b07dce821a | |||
2f549b82a3 | |||
17243577c5 | |||
c0ba751aaf | |||
eba6c4c6f3 | |||
59e7e3a307 | |||
8bf8995ad8 | |||
2b8dd47a6c | |||
268a45e8dd | |||
e52d5402cf | |||
0db223b148 | |||
420e600864 | |||
190a9551f6 | |||
773f85e0d7 | |||
b5d50c4243 | |||
e3314b3608 | |||
1902d7e1a3 | |||
e0d322d4cc | |||
ecde83a28d | |||
b0167e6296 | |||
16f3ceb997 | |||
2875fc7313 | |||
b9a63603c7 | |||
de40b53d77 | |||
1698b2895b | |||
1d25f97004 | |||
258bfc5689 | |||
35e3e278bf | |||
5341cb5951 | |||
00504a0d52 | |||
ab743c2ee6 | |||
1dd57f6140 | |||
a22a7cf993 | |||
d9026c1791 | |||
2524dc47cf | |||
798eebf638 | |||
9cdfa41113 | |||
aab925c0ed | |||
be1b13f15d | |||
6122fe6ea7 | |||
4201664c7b | |||
3deea2b5da | |||
c3ee52c4fe | |||
f4b72b69ce | |||
5b8fd096d5 | |||
22fee0312d | |||
17292520f2 | |||
711746524c | |||
e04bca0993 | |||
c8d0ed2138 | |||
6deadc25ac | |||
f73e78582b | |||
7b238793d0 | |||
7a09f38a64 | |||
27d21975f0 | |||
60e272e6f0 |
107
.clang-format
Normal file
107
.clang-format
Normal file
@ -0,0 +1,107 @@
|
|||||||
|
# please use clang-format version 8 or later
|
||||||
|
|
||||||
|
Standard: Cpp11
|
||||||
|
AccessModifierOffset: -8
|
||||||
|
AlignAfterOpenBracket: Align
|
||||||
|
AlignConsecutiveAssignments: false
|
||||||
|
AlignConsecutiveDeclarations: false
|
||||||
|
AlignEscapedNewlines: Left
|
||||||
|
AlignOperands: true
|
||||||
|
AlignTrailingComments: true
|
||||||
|
#AllowAllArgumentsOnNextLine: false # requires clang-format 9
|
||||||
|
#AllowAllConstructorInitializersOnNextLine: false # requires clang-format 9
|
||||||
|
AllowAllParametersOfDeclarationOnNextLine: false
|
||||||
|
AllowShortBlocksOnASingleLine: false
|
||||||
|
AllowShortCaseLabelsOnASingleLine: false
|
||||||
|
AllowShortFunctionsOnASingleLine: Inline
|
||||||
|
AllowShortIfStatementsOnASingleLine: false
|
||||||
|
#AllowShortLambdasOnASingleLine: Inline # requires clang-format 9
|
||||||
|
AllowShortLoopsOnASingleLine: false
|
||||||
|
AlwaysBreakAfterDefinitionReturnType: None
|
||||||
|
AlwaysBreakAfterReturnType: None
|
||||||
|
AlwaysBreakBeforeMultilineStrings: false
|
||||||
|
AlwaysBreakTemplateDeclarations: false
|
||||||
|
BinPackArguments: true
|
||||||
|
BinPackParameters: true
|
||||||
|
BraceWrapping:
|
||||||
|
AfterClass: false
|
||||||
|
AfterControlStatement: false
|
||||||
|
AfterEnum: false
|
||||||
|
AfterFunction: true
|
||||||
|
AfterNamespace: false
|
||||||
|
AfterObjCDeclaration: false
|
||||||
|
AfterStruct: false
|
||||||
|
AfterUnion: false
|
||||||
|
AfterExternBlock: false
|
||||||
|
BeforeCatch: false
|
||||||
|
BeforeElse: false
|
||||||
|
IndentBraces: false
|
||||||
|
SplitEmptyFunction: true
|
||||||
|
SplitEmptyRecord: true
|
||||||
|
SplitEmptyNamespace: true
|
||||||
|
BreakBeforeBinaryOperators: None
|
||||||
|
BreakBeforeBraces: Custom
|
||||||
|
BreakBeforeTernaryOperators: true
|
||||||
|
BreakConstructorInitializers: BeforeColon
|
||||||
|
BreakStringLiterals: false # apparently unpredictable
|
||||||
|
ColumnLimit: 132
|
||||||
|
CompactNamespaces: false
|
||||||
|
ConstructorInitializerAllOnOneLineOrOnePerLine: true
|
||||||
|
ConstructorInitializerIndentWidth: 8
|
||||||
|
ContinuationIndentWidth: 8
|
||||||
|
Cpp11BracedListStyle: true
|
||||||
|
DerivePointerAlignment: false
|
||||||
|
DisableFormat: false
|
||||||
|
FixNamespaceComments: false
|
||||||
|
ForEachMacros:
|
||||||
|
- 'json_object_foreach'
|
||||||
|
- 'json_object_foreach_safe'
|
||||||
|
- 'json_array_foreach'
|
||||||
|
IncludeBlocks: Preserve
|
||||||
|
IndentCaseLabels: false
|
||||||
|
IndentPPDirectives: None
|
||||||
|
IndentWidth: 8
|
||||||
|
IndentWrappedFunctionNames: false
|
||||||
|
KeepEmptyLinesAtTheStartOfBlocks: true
|
||||||
|
MaxEmptyLinesToKeep: 1
|
||||||
|
NamespaceIndentation: All
|
||||||
|
#ObjCBinPackProtocolList: Auto # requires clang-format 7
|
||||||
|
ObjCBlockIndentWidth: 8
|
||||||
|
ObjCSpaceAfterProperty: true
|
||||||
|
ObjCSpaceBeforeProtocolList: true
|
||||||
|
|
||||||
|
PenaltyBreakAssignment: 10
|
||||||
|
PenaltyBreakBeforeFirstCallParameter: 30
|
||||||
|
PenaltyBreakComment: 10
|
||||||
|
PenaltyBreakFirstLessLess: 0
|
||||||
|
PenaltyBreakString: 10
|
||||||
|
PenaltyExcessCharacter: 100
|
||||||
|
PenaltyReturnTypeOnItsOwnLine: 60
|
||||||
|
|
||||||
|
PointerAlignment: Right
|
||||||
|
ReflowComments: false
|
||||||
|
SortIncludes: false
|
||||||
|
SortUsingDeclarations: false
|
||||||
|
SpaceAfterCStyleCast: false
|
||||||
|
#SpaceAfterLogicalNot: false # requires clang-format 9
|
||||||
|
SpaceAfterTemplateKeyword: false
|
||||||
|
SpaceBeforeAssignmentOperators: true
|
||||||
|
#SpaceBeforeCtorInitializerColon: true # requires clang-format 7
|
||||||
|
#SpaceBeforeInheritanceColon: true # requires clang-format 7
|
||||||
|
SpaceBeforeParens: ControlStatements
|
||||||
|
#SpaceBeforeRangeBasedForLoopColon: true # requires clang-format 7
|
||||||
|
SpaceInEmptyParentheses: false
|
||||||
|
SpacesBeforeTrailingComments: 1
|
||||||
|
SpacesInAngles: false
|
||||||
|
SpacesInCStyleCastParentheses: false
|
||||||
|
SpacesInContainerLiterals: false
|
||||||
|
SpacesInParentheses: false
|
||||||
|
SpacesInSquareBrackets: false
|
||||||
|
#StatementMacros: # requires clang-format 8
|
||||||
|
# - 'Q_OBJECT'
|
||||||
|
TabWidth: 8
|
||||||
|
#TypenameMacros: # requires clang-format 9
|
||||||
|
# - 'DARRAY'
|
||||||
|
UseTab: ForContinuationAndIndentation
|
||||||
|
---
|
||||||
|
Language: ObjC
|
13
.cmake-format.json
Normal file
13
.cmake-format.json
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"additional_commands": {
|
||||||
|
"find_qt": {
|
||||||
|
"flags": [],
|
||||||
|
"kwargs": {
|
||||||
|
"COMPONENTS": "+",
|
||||||
|
"COMPONENTS_WIN": "+",
|
||||||
|
"COMPONENTS_MACOS": "+",
|
||||||
|
"COMPONENTS_LINUX": "+"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -9,8 +9,16 @@ indent_style = tab
|
|||||||
indent_size = 4
|
indent_size = 4
|
||||||
|
|
||||||
[CMakeLists.txt]
|
[CMakeLists.txt]
|
||||||
indent_style = tab
|
indent_style = space
|
||||||
indent_size = 4
|
indent_size = 2
|
||||||
|
|
||||||
|
[**/CMakeLists.txt]
|
||||||
|
indent_style = space
|
||||||
|
indent_size = 2
|
||||||
|
|
||||||
|
[cmake/**/*.cmake]
|
||||||
|
indent_style = space
|
||||||
|
indent_size = 2
|
||||||
|
|
||||||
[*.{yml,yaml}]
|
[*.{yml,yaml}]
|
||||||
indent_style = space
|
indent_style = space
|
||||||
|
17
.github/ISSUE_TEMPLATE/bug_report.yaml
vendored
17
.github/ISSUE_TEMPLATE/bug_report.yaml
vendored
@ -27,10 +27,11 @@ body:
|
|||||||
- macOS 10.15
|
- macOS 10.15
|
||||||
- macOS 10.14
|
- macOS 10.14
|
||||||
- macOS 10.13
|
- macOS 10.13
|
||||||
|
- Ubuntu 22.04 LTS
|
||||||
- Ubuntu 21.04
|
- Ubuntu 21.04
|
||||||
- Ubuntu 20.10
|
- Ubuntu 20.10
|
||||||
- Ubuntu 20.04
|
- Ubuntu 20.04 LTS
|
||||||
- Ubuntu 18.04
|
- Ubuntu 18.04 LTS
|
||||||
- Other
|
- Other
|
||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
@ -48,6 +49,12 @@ 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
|
||||||
|
- 27.2.4
|
||||||
|
- 27.2.3
|
||||||
|
- 27.2.2
|
||||||
|
- 27.2.1
|
||||||
|
- 27.2.0
|
||||||
- 27.1.3
|
- 27.1.3
|
||||||
- 27.1.1
|
- 27.1.1
|
||||||
- 27.1.0
|
- 27.1.0
|
||||||
@ -69,11 +76,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.0.1
|
||||||
|
- 5.0.0
|
||||||
- 5.0.0-beta1
|
- 5.0.0-beta1
|
||||||
- 5.0.0-alpha3
|
|
||||||
- 5.0.0-alpha2
|
|
||||||
- 4.9.1
|
|
||||||
- 4.9.0
|
|
||||||
- Git
|
- Git
|
||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
|
2
.github/pull_request_template.md
vendored
2
.github/pull_request_template.md
vendored
@ -29,6 +29,6 @@ Tested OS(s):
|
|||||||
<!--- If you're unsure about any of these, don't hesitate to ask. We're here to help! -->
|
<!--- If you're unsure about any of these, don't hesitate to ask. We're here to help! -->
|
||||||
- [ ] I have read the [Contributing Guidelines](https://github.com/obsproject/obs-websocket/wiki/Contributing-Guidelines).
|
- [ ] I have read the [Contributing Guidelines](https://github.com/obsproject/obs-websocket/wiki/Contributing-Guidelines).
|
||||||
- [ ] All commit messages are properly formatted and commits squashed where appropriate.
|
- [ ] All commit messages are properly formatted and commits squashed where appropriate.
|
||||||
- [ ] My code is not on the `master` branch.
|
- [ ] My code is not on `master` or a `release/*` branch.
|
||||||
- [ ] The code has been tested.
|
- [ ] The code has been tested.
|
||||||
- [ ] I have included updates to all appropriate documentation.
|
- [ ] I have included updates to all appropriate documentation.
|
||||||
|
560
.github/workflows/main.yml
vendored
560
.github/workflows/main.yml
vendored
@ -1,560 +0,0 @@
|
|||||||
name: 'CI Multiplatform Build'
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
paths-ignore:
|
|
||||||
- 'docs/**'
|
|
||||||
branches:
|
|
||||||
- master
|
|
||||||
tags:
|
|
||||||
- '[45].[0-9]+.[0-9]+*'
|
|
||||||
pull_request:
|
|
||||||
paths-ignore:
|
|
||||||
- 'docs/**'
|
|
||||||
- '**.md'
|
|
||||||
branches:
|
|
||||||
- master
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
windows:
|
|
||||||
name: 'Windows 32/64-bit'
|
|
||||||
runs-on: [windows-2019]
|
|
||||||
if: contains(github.event.head_commit.message, '[skip ci]') != true
|
|
||||||
env:
|
|
||||||
QT_CACHE_VERSION: '2' # Change whenever updating OBS dependencies URL, in order to force a cache reset
|
|
||||||
QT_VERSION: '5.15.2'
|
|
||||||
WINDOWS_DEPS_CACHE_VERSION: '1' # Change whenever updating Qt dependency URL, in order to force a cache reset
|
|
||||||
WINDOWS_DEPS_VERSION: '2019'
|
|
||||||
CMAKE_GENERATOR: 'Visual Studio 16 2019'
|
|
||||||
CMAKE_SYSTEM_VERSION: '10.0'
|
|
||||||
steps:
|
|
||||||
- name: 'Add msbuild to PATH'
|
|
||||||
uses: microsoft/setup-msbuild@v1.0.2
|
|
||||||
- name: 'Checkout obs-websocket'
|
|
||||||
uses: actions/checkout@v2
|
|
||||||
with:
|
|
||||||
path: ${{ github.workspace }}/obs-websocket
|
|
||||||
submodules: 'recursive'
|
|
||||||
- name: 'Checkout OBS Studio'
|
|
||||||
uses: actions/checkout@v2
|
|
||||||
with:
|
|
||||||
repository: obsproject/obs-studio
|
|
||||||
path: ${{ github.workspace }}/obs-studio
|
|
||||||
submodules: 'recursive'
|
|
||||||
- name: 'Get OBS Studio Git Info'
|
|
||||||
shell: bash
|
|
||||||
working-directory: ${{ github.workspace }}/obs-studio
|
|
||||||
run: |
|
|
||||||
git fetch --prune --unshallow
|
|
||||||
echo "OBS_GIT_HASH=$(git rev-parse --short HEAD)" >> $GITHUB_ENV
|
|
||||||
echo "OBS_GIT_TAG=$(git describe --tags --abbrev=0)" >> $GITHUB_ENV
|
|
||||||
- name: 'Checkout last OBS Studio release (${{ env.OBS_GIT_TAG }})'
|
|
||||||
shell: bash
|
|
||||||
working-directory: ${{ github.workspace }}/obs-studio
|
|
||||||
run: |
|
|
||||||
git checkout ${{ env.OBS_GIT_TAG }}
|
|
||||||
git submodule update
|
|
||||||
- name: 'Get obs-websocket Git Info'
|
|
||||||
shell: bash
|
|
||||||
working-directory: ${{ github.workspace }}/obs-websocket
|
|
||||||
run: |
|
|
||||||
git fetch --prune --unshallow
|
|
||||||
GIT_HASH=$(git rev-parse --short HEAD)
|
|
||||||
echo "GIT_HASH=$GIT_HASH" >> $GITHUB_ENV
|
|
||||||
GIT_TAG=$(git describe --exact-match --tags --abbrev=0) || GIT_TAG=""
|
|
||||||
echo "GIT_TAG=$GIT_TAG" >> $GITHUB_ENV
|
|
||||||
if [ "$GIT_TAG" ] ; then \
|
|
||||||
VERSION="$GIT_TAG" \
|
|
||||||
VERSION_SUFFIX=$(echo "$GIT_TAG" | cut -c6-20) ; \
|
|
||||||
else \
|
|
||||||
VERSION="$GIT_HASH-git" \
|
|
||||||
VERSION_SUFFIX="-$GIT_HASH-git" ; \
|
|
||||||
fi
|
|
||||||
echo "PACKAGE_VERSION=$VERSION" >> $GITHUB_ENV
|
|
||||||
echo "CMAKE_VERSION_SUFFIX=$VERSION_SUFFIX" >> $GITHUB_ENV
|
|
||||||
- name: 'Restore Cached Qt'
|
|
||||||
id: qtcache
|
|
||||||
uses: actions/cache@v2
|
|
||||||
with:
|
|
||||||
path: Qt_${{ env.QT_VERSION }}.7z
|
|
||||||
key: 'qtdep-${{ env.QT_CACHE_VERSION }} | ${{ runner.os }}'
|
|
||||||
- name: 'Download Prerequisite: Qt'
|
|
||||||
if: steps.qtcache.outputs.cache-hit != 'true'
|
|
||||||
run: |
|
|
||||||
curl -kLO https://tt2468.net/dl/Qt_${{ env.QT_VERSION }}.7z -f --retry 5 -C -
|
|
||||||
- name: 'Extract Prerequisite: Qt'
|
|
||||||
run: |
|
|
||||||
7z x Qt_${{ env.QT_VERSION }}.7z -o"${{ github.workspace }}\cmbuild\QT"
|
|
||||||
- name: 'Restore Cached OBS Studio Dependencies'
|
|
||||||
id: obscache
|
|
||||||
uses: actions/cache@v2
|
|
||||||
with:
|
|
||||||
path: ${{ github.workspace }}\cmbuild\deps\**
|
|
||||||
key: 'obsdep-${{ env.WINDOWS_DEPS_CACHE_VERSION }} | ${{ runner.os }}'
|
|
||||||
- name: 'Install Prerequisite: Pre-built OBS Studio dependencies'
|
|
||||||
if: steps.obscache.outputs.cache-hit != 'true'
|
|
||||||
run: |
|
|
||||||
curl -kLO https://cdn-fastly.obsproject.com/downloads/dependencies${{ env.WINDOWS_DEPS_VERSION }}.zip -f --retry 5 -C -
|
|
||||||
7z x dependencies${{ env.WINDOWS_DEPS_VERSION }}.zip -o"${{ github.workspace }}\cmbuild\deps"
|
|
||||||
- name: 'Restore OBS Studio 32-bit Build v${{ env.OBS_GIT_TAG }} from Cache'
|
|
||||||
id: build-cache-obs-32
|
|
||||||
uses: actions/cache@v2
|
|
||||||
env:
|
|
||||||
CACHE_NAME: 'build-cache-obs-32'
|
|
||||||
with:
|
|
||||||
path: ${{ github.workspace }}/obs-studio/build32
|
|
||||||
key: ${{ runner.os }}-${{ env.CACHE_NAME }}-${{ env.OBS_GIT_TAG }}
|
|
||||||
- name: 'Configure OBS Studio 32-bit'
|
|
||||||
if: steps.build-cache-obs-32.outputs.cache-hit != 'true'
|
|
||||||
working-directory: ${{ github.workspace }}/obs-studio
|
|
||||||
run: |
|
|
||||||
if(!(Test-Path -Path ".\build32")){New-Item -ItemType directory -Path .\build32}
|
|
||||||
cd .\build32
|
|
||||||
cmake -G "${{ env.CMAKE_GENERATOR }}" -A Win32 -DCMAKE_SYSTEM_VERSION="${{ env.CMAKE_SYSTEM_VERSION }}" -DQTDIR="${{ github.workspace }}\cmbuild\QT\${{ env.QT_VERSION }}\msvc2019" -DDepsPath="${{ github.workspace }}\cmbuild\deps\win32" -DCOPIED_DEPENDENCIES=NO -DCOPY_DEPENDENCIES=YES -DBUILD_BROWSER=OFF ..
|
|
||||||
- name: 'Build OBS Studio 32-bit'
|
|
||||||
if: steps.build-cache-obs-32.outputs.cache-hit != 'true'
|
|
||||||
working-directory: ${{ github.workspace }}/obs-studio
|
|
||||||
run: |
|
|
||||||
msbuild /m /p:Configuration=RelWithDebInfo .\build32\libobs\libobs.vcxproj
|
|
||||||
msbuild /m /p:Configuration=RelWithDebInfo .\build32\UI\obs-frontend-api\obs-frontend-api.vcxproj
|
|
||||||
- name: 'Restore OBS Studio 64-bit Build v${{ env.OBS_GIT_TAG }} from Cache'
|
|
||||||
id: build-cache-obs-64
|
|
||||||
uses: actions/cache@v1
|
|
||||||
env:
|
|
||||||
CACHE_NAME: 'build-cache-obs-64'
|
|
||||||
with:
|
|
||||||
path: ${{ github.workspace }}/obs-studio/build64
|
|
||||||
key: ${{ runner.os }}-${{ env.CACHE_NAME }}-${{ env.OBS_GIT_TAG }}
|
|
||||||
- name: 'Configure OBS Studio 64-bit'
|
|
||||||
if: steps.build-cache-obs-64.outputs.cache-hit != 'true'
|
|
||||||
working-directory: ${{ github.workspace }}/obs-studio
|
|
||||||
run: |
|
|
||||||
if(!(Test-Path -Path ".\build64")){New-Item -ItemType directory -Path .\build64}
|
|
||||||
cd .\build64
|
|
||||||
cmake -G "${{ env.CMAKE_GENERATOR }}" -A x64 -DCMAKE_SYSTEM_VERSION="${{ env.CMAKE_SYSTEM_VERSION }}" -DQTDIR="${{ github.workspace }}\cmbuild\QT\${{ env.QT_VERSION }}\msvc2019_64" -DDepsPath="${{ github.workspace }}\cmbuild\deps\win64" -DCOPIED_DEPENDENCIES=NO -DCOPY_DEPENDENCIES=YES -DBUILD_BROWSER=OFF ..
|
|
||||||
- name: 'Build OBS Studio 64-bit'
|
|
||||||
if: steps.build-cache-obs-64.outputs.cache-hit != 'true'
|
|
||||||
working-directory: ${{ github.workspace }}/obs-studio
|
|
||||||
run: |
|
|
||||||
msbuild /m /p:Configuration=RelWithDebInfo .\build64\libobs\libobs.vcxproj
|
|
||||||
msbuild /m /p:Configuration=RelWithDebInfo .\build64\UI\obs-frontend-api\obs-frontend-api.vcxproj
|
|
||||||
- name: 'Configure obs-websocket 32-bit'
|
|
||||||
working-directory: ${{ github.workspace }}/obs-websocket
|
|
||||||
run: |
|
|
||||||
mkdir .\build32
|
|
||||||
cd .\build32
|
|
||||||
cmake -G "${{ env.CMAKE_GENERATOR }}" -A Win32 -DCMAKE_SYSTEM_VERSION="${{ env.CMAKE_SYSTEM_VERSION }}" -DQTDIR="${{ github.workspace }}\cmbuild\QT\${{ env.QT_VERSION }}\msvc2019" -DLibObs_DIR="${{ github.workspace }}\obs-studio\build32\libobs" -DLIBOBS_INCLUDE_DIR="${{ github.workspace }}\obs-studio\libobs" -DLIBOBS_LIB="${{ github.workspace }}\obs-studio\build32\libobs\RelWithDebInfo\obs.lib" -DOBS_FRONTEND_LIB="${{ github.workspace }}\obs-studio\build32\UI\obs-frontend-api\RelWithDebInfo\obs-frontend-api.lib" -DOBS_WEBSOCKET_VERSION_SUFFIX="${{ env.CMAKE_VERSION_SUFFIX }}" ..
|
|
||||||
- name: 'Configure obs-websocket 64-bit'
|
|
||||||
working-directory: ${{ github.workspace }}/obs-websocket
|
|
||||||
run: |
|
|
||||||
mkdir .\build64
|
|
||||||
cd .\build64
|
|
||||||
cmake -G "${{ env.CMAKE_GENERATOR }}" -A x64 -DCMAKE_SYSTEM_VERSION="${{ env.CMAKE_SYSTEM_VERSION }}" -DQTDIR="${{ github.workspace }}\cmbuild\QT\${{ env.QT_VERSION }}\msvc2019_64" -DLibObs_DIR="${{ github.workspace }}\obs-studio\build64\libobs" -DLIBOBS_INCLUDE_DIR="${{ github.workspace }}\obs-studio\libobs" -DLIBOBS_LIB="${{ github.workspace }}\obs-studio\build64\libobs\RelWithDebInfo\obs.lib" -DOBS_FRONTEND_LIB="${{ github.workspace }}\obs-studio\build64\UI\obs-frontend-api\RelWithDebInfo\obs-frontend-api.lib" -DOBS_WEBSOCKET_VERSION_SUFFIX="${{ env.CMAKE_VERSION_SUFFIX }}" ..
|
|
||||||
- name: 'Build obs-websocket 32-bit'
|
|
||||||
working-directory: ${{ github.workspace }}/obs-websocket
|
|
||||||
run: msbuild /m /p:Configuration=RelWithDebInfo .\build32\obs-websocket.sln
|
|
||||||
- name: 'Build obs-websocket 64-bit'
|
|
||||||
working-directory: ${{ github.workspace }}/obs-websocket
|
|
||||||
run: msbuild /m /p:Configuration=RelWithDebInfo .\build64\obs-websocket.sln
|
|
||||||
- name: 'Set PR Artifact Filename'
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
echo "WIN_FILENAME=obs-websocket-${{ env.PACKAGE_VERSION }}-Windows" >> $GITHUB_ENV
|
|
||||||
- name: 'Package obs-websocket'
|
|
||||||
working-directory: ${{ github.workspace }}/obs-websocket
|
|
||||||
run: |
|
|
||||||
mkdir package
|
|
||||||
cd package
|
|
||||||
7z a "${{ env.WIN_FILENAME }}.zip" "..\release\*"
|
|
||||||
iscc ..\installer\installer-windows.generated.iss /O. /F"${{ env.WIN_FILENAME }}-Installer"
|
|
||||||
- name: 'Publish ${{ env.WIN_FILENAME }}.zip'
|
|
||||||
if: success()
|
|
||||||
uses: actions/upload-artifact@v2-preview
|
|
||||||
with:
|
|
||||||
name: 'obs-websocket-${{ env.PACKAGE_VERSION }}-Windows'
|
|
||||||
path: ${{ github.workspace }}/obs-websocket/package/*.zip
|
|
||||||
- name: 'Publish ${{ env.WIN_FILENAME }}-Installer.exe'
|
|
||||||
if: success()
|
|
||||||
uses: actions/upload-artifact@v2-preview
|
|
||||||
with:
|
|
||||||
name: 'obs-websocket-${{ env.PACKAGE_VERSION }}-Windows-Installer'
|
|
||||||
path: ${{ github.workspace }}/obs-websocket/package/*.exe
|
|
||||||
ubuntu64:
|
|
||||||
name: 'Linux/Ubuntu 64-bit'
|
|
||||||
runs-on: [ubuntu-latest]
|
|
||||||
if: contains(github.event.head_commit.message, '[skip ci]') != true
|
|
||||||
steps:
|
|
||||||
- name: 'Checkout obs-websocket'
|
|
||||||
uses: actions/checkout@v2
|
|
||||||
with:
|
|
||||||
path: ${{ github.workspace }}/obs-websocket
|
|
||||||
submodules: 'recursive'
|
|
||||||
- name: 'Checkout OBS Studio'
|
|
||||||
uses: actions/checkout@v2
|
|
||||||
with:
|
|
||||||
repository: obsproject/obs-studio
|
|
||||||
path: ${{ github.workspace }}/obs-studio
|
|
||||||
submodules: 'recursive'
|
|
||||||
- name: 'Get OBS Studio Git Info'
|
|
||||||
shell: bash
|
|
||||||
working-directory: ${{ github.workspace }}/obs-studio
|
|
||||||
run: |
|
|
||||||
git fetch --prune --unshallow
|
|
||||||
echo "OBS_GIT_HASH=$(git rev-parse --short HEAD)" >> $GITHUB_ENV
|
|
||||||
echo "OBS_GIT_TAG=$(git describe --tags --abbrev=0)" >> $GITHUB_ENV
|
|
||||||
- name: 'Checkout last OBS Studio release (${{ env.OBS_GIT_TAG }})'
|
|
||||||
shell: bash
|
|
||||||
working-directory: ${{ github.workspace }}/obs-studio
|
|
||||||
run: |
|
|
||||||
git checkout ${{ env.OBS_GIT_TAG }}
|
|
||||||
git submodule update
|
|
||||||
- name: 'Get obs-websocket git info'
|
|
||||||
working-directory: ${{ github.workspace }}/obs-websocket
|
|
||||||
run: |
|
|
||||||
git fetch --prune --unshallow
|
|
||||||
GIT_HASH=$(git rev-parse --short HEAD)
|
|
||||||
echo "GIT_HASH=$GIT_HASH" >> $GITHUB_ENV
|
|
||||||
GIT_TAG=$(git describe --exact-match --tags --abbrev=0) || GIT_TAG=""
|
|
||||||
echo "GIT_TAG=$GIT_TAG" >> $GITHUB_ENV
|
|
||||||
if [ "$GIT_TAG" ] ; then \
|
|
||||||
VERSION="$GIT_TAG" \
|
|
||||||
VERSION_SUFFIX=$(echo "$GIT_TAG" | cut -c6-20) ; \
|
|
||||||
else \
|
|
||||||
VERSION="$GIT_HASH-git" \
|
|
||||||
VERSION_SUFFIX="-$GIT_HASH-git" ; \
|
|
||||||
fi
|
|
||||||
echo "PACKAGE_VERSION=$VERSION" >> $GITHUB_ENV
|
|
||||||
echo "CMAKE_VERSION_SUFFIX=$VERSION_SUFFIX" >> $GITHUB_ENV
|
|
||||||
- name: 'Install prerequisites (Apt)'
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
sudo dpkg --add-architecture amd64
|
|
||||||
sudo apt-get -qq update
|
|
||||||
sudo apt-get install -y \
|
|
||||||
build-essential \
|
|
||||||
checkinstall \
|
|
||||||
cmake \
|
|
||||||
libasound2-dev \
|
|
||||||
libavcodec-dev \
|
|
||||||
libavdevice-dev \
|
|
||||||
libavfilter-dev \
|
|
||||||
libavformat-dev \
|
|
||||||
libavutil-dev \
|
|
||||||
libcurl4-openssl-dev \
|
|
||||||
libfdk-aac-dev \
|
|
||||||
libfontconfig-dev \
|
|
||||||
libfreetype6-dev \
|
|
||||||
libgl1-mesa-dev \
|
|
||||||
libjack-jackd2-dev \
|
|
||||||
libjansson-dev \
|
|
||||||
libluajit-5.1-dev \
|
|
||||||
libpulse-dev \
|
|
||||||
libqt5x11extras5-dev \
|
|
||||||
libspeexdsp-dev \
|
|
||||||
libswresample-dev \
|
|
||||||
libswscale-dev \
|
|
||||||
libudev-dev \
|
|
||||||
libv4l-dev \
|
|
||||||
libva-dev \
|
|
||||||
libvlc-dev \
|
|
||||||
libx11-dev \
|
|
||||||
libx264-dev \
|
|
||||||
libxcb-randr0-dev \
|
|
||||||
libxcb-shm0-dev \
|
|
||||||
libxcb-xinerama0-dev \
|
|
||||||
libxcomposite-dev \
|
|
||||||
libxinerama-dev \
|
|
||||||
libmbedtls-dev \
|
|
||||||
pkg-config \
|
|
||||||
python3-dev \
|
|
||||||
qtbase5-dev \
|
|
||||||
qtbase5-private-dev \
|
|
||||||
libqt5svg5-dev \
|
|
||||||
swig \
|
|
||||||
libxcb-randr0-dev \
|
|
||||||
libxcb-xfixes0-dev \
|
|
||||||
libx11-xcb-dev \
|
|
||||||
libxcb1-dev \
|
|
||||||
libxss-dev \
|
|
||||||
- name: 'Configure OBS Studio'
|
|
||||||
working-directory: ${{ github.workspace }}/obs-studio
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
mkdir ./build
|
|
||||||
cd ./build
|
|
||||||
cmake -DDISABLE_PLUGINS=YES -DENABLE_SCRIPTING=NO -DUNIX_STRUCTURE=YES -DCMAKE_INSTALL_PREFIX=/usr ..
|
|
||||||
- name: 'Build OBS Studio'
|
|
||||||
working-directory: ${{ github.workspace }}/obs-studio
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
set -e
|
|
||||||
cd ./build
|
|
||||||
make -j4 libobs obs-frontend-api
|
|
||||||
- name: 'Install OBS Studio'
|
|
||||||
working-directory: ${{ github.workspace }}/obs-studio
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
cd ./build
|
|
||||||
sudo cp ./libobs/libobs.so /usr/lib
|
|
||||||
sudo cp ./UI/obs-frontend-api/libobs-frontend-api.so /usr/lib
|
|
||||||
sudo mkdir -p /usr/include/obs
|
|
||||||
sudo cp ../UI/obs-frontend-api/obs-frontend-api.h /usr/include/obs/obs-frontend-api.h
|
|
||||||
- name: 'Configure obs-websocket'
|
|
||||||
working-directory: ${{ github.workspace }}/obs-websocket
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
mkdir ./build
|
|
||||||
cd ./build
|
|
||||||
if [ "${{ env.GIT_TAG }}" ] ; then \
|
|
||||||
cmake -DLIBOBS_INCLUDE_DIR=${{ github.workspace }}/obs-studio/libobs -DCMAKE_INSTALL_PREFIX=/usr -DUSE_UBUNTU_FIX=TRUE -DOBS_WEBSOCKET_VERSION_SUFFIX="${{ env.CMAKE_VERSION_SUFFIX }}" -DCMAKE_BUILD_TYPE=Release .. ; \
|
|
||||||
else \
|
|
||||||
cmake -DLIBOBS_INCLUDE_DIR=${{ github.workspace }}/obs-studio/libobs -DCMAKE_INSTALL_PREFIX=/usr -DUSE_UBUNTU_FIX=TRUE -DOBS_WEBSOCKET_VERSION_SUFFIX="${{ env.CMAKE_VERSION_SUFFIX }}" -DPLUGIN_TESTS=TRUE .. ; \
|
|
||||||
fi
|
|
||||||
- name: 'Build obs-websocket'
|
|
||||||
working-directory: ${{ github.workspace }}/obs-websocket
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
set -e
|
|
||||||
cd ./build
|
|
||||||
make -j4
|
|
||||||
- name: 'Set PR Artifact Filename'
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
echo "LINUX_FILENAME=obs-websocket-${{ env.PACKAGE_VERSION }}-Ubuntu64.deb" >> $GITHUB_ENV
|
|
||||||
- name: 'Package ${{ env.LINUX_FILENAME }}'
|
|
||||||
if: success()
|
|
||||||
working-directory: ${{ github.workspace }}/obs-websocket
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
if [ "${{ env.GIT_TAG }}" ] ; then \
|
|
||||||
CHECKINSTALL_VERSION="${{ env.PACKAGE_VERSION }}" ; \
|
|
||||||
else \
|
|
||||||
CHECKINSTALL_VERSION="1-${{ env.PACKAGE_VERSION }}" ; \
|
|
||||||
fi
|
|
||||||
cd ./build
|
|
||||||
sudo checkinstall -y --type=debian --fstrans=no -nodoc \
|
|
||||||
--backup=no --deldoc=yes --install=no --pkgname=obs-websocket --pkgversion="$CHECKINSTALL_VERSION" \
|
|
||||||
--pkglicense="GPLv2.0" --maintainer="${{ github.event.pusher.email }}" --pkggroup="video" \
|
|
||||||
--pkgsource="${{ github.event.repository.html_url }}" \
|
|
||||||
--requires="obs-studio,libqt5network5,libqt5concurrent5,qt5-image-formats-plugins" \
|
|
||||||
--pakdir="../package"
|
|
||||||
sudo chmod ao+r ../package/*
|
|
||||||
sudo mv ../package/* ../package/${{ env.LINUX_FILENAME }}
|
|
||||||
cd -
|
|
||||||
- name: 'Publish ${{ env.LINUX_FILENAME }}'
|
|
||||||
if: success()
|
|
||||||
uses: actions/upload-artifact@v2-preview
|
|
||||||
with:
|
|
||||||
name: 'obs-websocket-${{ env.PACKAGE_VERSION }}-Ubuntu64'
|
|
||||||
path: '${{ github.workspace }}/obs-websocket/package/*.deb'
|
|
||||||
macOS:
|
|
||||||
name: 'macOS 64-bit'
|
|
||||||
runs-on: [macos-latest]
|
|
||||||
if: contains(github.event.head_commit.message, '[skip ci]') != true
|
|
||||||
env:
|
|
||||||
MACOS_DEPS_VERSION: '2022-01-01'
|
|
||||||
MACOS_DEPS_CACHE_VERSION: '2' # Change whenever updating dependencies version, in order to force a cache reset
|
|
||||||
steps:
|
|
||||||
- name: 'Checkout obs-websocket'
|
|
||||||
uses: actions/checkout@v2
|
|
||||||
with:
|
|
||||||
path: ${{ github.workspace }}/obs-websocket
|
|
||||||
submodules: 'recursive'
|
|
||||||
- name: 'Checkout OBS Studio'
|
|
||||||
uses: actions/checkout@v2
|
|
||||||
with:
|
|
||||||
repository: obsproject/obs-studio
|
|
||||||
path: ${{ github.workspace }}/obs-studio
|
|
||||||
submodules: 'recursive'
|
|
||||||
- name: 'Install Prerequisite: Binary Signing Certificate'
|
|
||||||
if: github.event_name != 'pull_request'
|
|
||||||
uses: apple-actions/import-codesign-certs@v1
|
|
||||||
with:
|
|
||||||
p12-file-base64: ${{ secrets.MACOS_SIGNING_CERT }}
|
|
||||||
p12-password: ${{ secrets.MACOS_SIGNING_CERT_PASSWORD }}
|
|
||||||
create-keychain: true
|
|
||||||
keychain-password: ${{ secrets.MACOS_TEMP_CI_KEYCHAIN_PASSWORD }}
|
|
||||||
- name: 'Install Prerequisite: Installer Signing Certificate'
|
|
||||||
if: github.event_name != 'pull_request'
|
|
||||||
uses: apple-actions/import-codesign-certs@v1
|
|
||||||
with:
|
|
||||||
p12-file-base64: ${{ secrets.MACOS_INSTALLER_CERT }}
|
|
||||||
p12-password: ${{ secrets.MACOS_INSTALLER_CERT_PASSWORD }}
|
|
||||||
create-keychain: false
|
|
||||||
keychain-password: ${{ secrets.MACOS_TEMP_CI_KEYCHAIN_PASSWORD }}
|
|
||||||
- name: 'Get OBS Studio Git Info'
|
|
||||||
shell: bash
|
|
||||||
working-directory: ${{ github.workspace }}/obs-studio
|
|
||||||
run: |
|
|
||||||
git fetch --prune --unshallow
|
|
||||||
echo "OBS_GIT_HASH=$(git rev-parse --short HEAD)" >> $GITHUB_ENV
|
|
||||||
echo "OBS_GIT_TAG=$(git describe --tags --abbrev=0)" >> $GITHUB_ENV
|
|
||||||
- name: 'Checkout last OBS Studio release (${{ env.OBS_GIT_TAG }})'
|
|
||||||
shell: bash
|
|
||||||
working-directory: ${{ github.workspace }}/obs-studio
|
|
||||||
run: |
|
|
||||||
git checkout ${{ env.OBS_GIT_TAG }}
|
|
||||||
git submodule update
|
|
||||||
- name: 'Get obs-websocket git info'
|
|
||||||
shell: bash
|
|
||||||
working-directory: ${{ github.workspace }}/obs-websocket
|
|
||||||
run: |
|
|
||||||
git fetch --prune --unshallow
|
|
||||||
GIT_HASH=$(git rev-parse --short HEAD)
|
|
||||||
echo "GIT_HASH=$GIT_HASH" >> $GITHUB_ENV
|
|
||||||
GIT_TAG=$(git describe --exact-match --tags --abbrev=0) || GIT_TAG=""
|
|
||||||
echo "GIT_TAG=$GIT_TAG" >> $GITHUB_ENV
|
|
||||||
if [ "$GIT_TAG" ] ; then \
|
|
||||||
VERSION="$GIT_TAG" \
|
|
||||||
VERSION_SUFFIX=$(echo "$GIT_TAG" | cut -c6-20) ; \
|
|
||||||
else \
|
|
||||||
VERSION="$GIT_HASH-git" \
|
|
||||||
VERSION_SUFFIX="-$GIT_HASH-git" ; \
|
|
||||||
fi
|
|
||||||
echo "PACKAGE_VERSION=$VERSION" >> $GITHUB_ENV
|
|
||||||
echo "CMAKE_VERSION_SUFFIX=$VERSION_SUFFIX" >> $GITHUB_ENV
|
|
||||||
- name: 'Install Packages'
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
curl -L -O http://s.sudre.free.fr/Software/files/Packages.dmg
|
|
||||||
sudo hdiutil attach ./Packages.dmg
|
|
||||||
sudo installer -pkg /Volumes/Packages\ 1.2.10/Install\ Packages.pkg -target /
|
|
||||||
- name: 'Restore Cached Qt & OBS Studio dependencies'
|
|
||||||
id: deps-cache
|
|
||||||
uses: actions/cache@v2
|
|
||||||
with:
|
|
||||||
path: ${{ github.workspace }}/obsdeps/**
|
|
||||||
key: 'deps-cache-${{ env.MACOS_DEPS_CACHE_VERSION }} | ${{ runner.os }}'
|
|
||||||
- name: 'Install Prerequisite: Qt + OBS Studio dependencies'
|
|
||||||
if: steps.deps-cache.outputs.cache-hit != 'true'
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
mkdir -p obsdeps
|
|
||||||
curl -L -O https://github.com/obsproject/obs-deps/releases/download/${{ env.MACOS_DEPS_VERSION }}/macos-deps-qt-${{ env.MACOS_DEPS_VERSION }}-universal.tar.xz
|
|
||||||
tar -xf macos-deps-qt-${{ env.MACOS_DEPS_VERSION }}-universal.tar.xz -C "./obsdeps"
|
|
||||||
curl -L -O https://github.com/obsproject/obs-deps/releases/download/${{ env.MACOS_DEPS_VERSION }}/macos-deps-${{ env.MACOS_DEPS_VERSION }}-universal.tar.xz
|
|
||||||
tar -xf macos-deps-${{ env.MACOS_DEPS_VERSION }}-universal.tar.xz -C "./obsdeps"
|
|
||||||
- run: xattr -r -d com.apple.quarantine ./obsdeps
|
|
||||||
shell: bash
|
|
||||||
- name: 'Configue OBS Studio'
|
|
||||||
if: steps.cache-obs-build.outputs.cache-hit != 'true'
|
|
||||||
working-directory: ${{ github.workspace }}/obs-studio
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
mkdir -p ./build
|
|
||||||
cd ./build
|
|
||||||
cmake .. \
|
|
||||||
-DQTDIR=${{ github.workspace }}/obsdeps \
|
|
||||||
-DDepsPath=${{ github.workspace }}/obsdeps \
|
|
||||||
-DCMAKE_OSX_DEPLOYMENT_TARGET=10.13 \
|
|
||||||
-DDISABLE_PLUGINS=true \
|
|
||||||
-DENABLE_SCRIPTING=0 \
|
|
||||||
-DCMAKE_PREFIX_PATH=${{ github.workspace }}/obsdeps/lib/cmake
|
|
||||||
- name: 'Build OBS Studio'
|
|
||||||
if: steps.cache-obs-build.outputs.cache-hit != 'true'
|
|
||||||
working-directory: ${{ github.workspace }}/obs-studio/build
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
set -e
|
|
||||||
make -j4 libobs obs-frontend-api
|
|
||||||
- name: 'Configure obs-websocket'
|
|
||||||
working-directory: ${{ github.workspace }}/obs-websocket
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
mkdir -p build
|
|
||||||
cd build
|
|
||||||
cmake .. \
|
|
||||||
-DCMAKE_OSX_DEPLOYMENT_TARGET=10.13 \
|
|
||||||
-DQTDIR=${{ github.workspace }}/obsdeps \
|
|
||||||
-DLIBOBS_INCLUDE_DIR=${{ github.workspace }}/obs-studio/libobs \
|
|
||||||
-DLIBOBS_LIB=${{ github.workspace }}/obs-studio/libobs \
|
|
||||||
-DOBS_FRONTEND_LIB="${{ github.workspace }}/obs-studio/build/UI/obs-frontend-api/libobs-frontend-api.dylib" \
|
|
||||||
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
|
|
||||||
-DCMAKE_INSTALL_PREFIX=/usr \
|
|
||||||
-DOBS_WEBSOCKET_VERSION_SUFFIX="${{ env.CMAKE_VERSION_SUFFIX }}"
|
|
||||||
- name: 'Build obs-websocket'
|
|
||||||
working-directory: ${{ github.workspace }}/obs-websocket/build
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
set -e
|
|
||||||
make -j4
|
|
||||||
- name: 'Relink Qt'
|
|
||||||
shell: bash
|
|
||||||
working-directory: ${{ github.workspace }}/obs-websocket/build
|
|
||||||
run: |
|
|
||||||
install_name_tool \
|
|
||||||
-change /tmp/obsdeps/lib/QtWidgets.framework/Versions/5/QtWidgets \
|
|
||||||
@executable_path/../Frameworks/QtWidgets.framework/Versions/5/QtWidgets \
|
|
||||||
-change /tmp/obsdeps/lib/QtGui.framework/Versions/5/QtGui \
|
|
||||||
@executable_path/../Frameworks/QtGui.framework/Versions/5/QtGui \
|
|
||||||
-change /tmp/obsdeps/lib/QtCore.framework/Versions/5/QtCore \
|
|
||||||
@executable_path/../Frameworks/QtCore.framework/Versions/5/QtCore \
|
|
||||||
-change /tmp/obsdeps/lib/QtNetwork.framework/Versions/5/QtNetwork \
|
|
||||||
@executable_path/../Frameworks/QtNetwork.framework/Versions/5/QtNetwork \
|
|
||||||
-change /tmp/obsdeps/lib/QtSvg.framework/Versions/5/QtSvg \
|
|
||||||
@executable_path/../Frameworks/QtSvg.framework/Versions/5/QtSvg \
|
|
||||||
./obs-websocket.so
|
|
||||||
- name: 'Sign plugin binary'
|
|
||||||
if: github.event_name != 'pull_request'
|
|
||||||
shell: bash
|
|
||||||
working-directory: ${{ github.workspace }}/obs-websocket/build
|
|
||||||
run: |
|
|
||||||
codesign --sign "${{ secrets.MACOS_SIGNING_IDENTITY }}" ./obs-websocket.so
|
|
||||||
- name: 'Set PR Artifact Filename'
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
echo "MACOS_FILENAME=obs-websocket-${{ env.PACKAGE_VERSION }}-macOS.pkg" >> $GITHUB_ENV
|
|
||||||
echo "MACOS_FILENAME_UNSIGNED=obs-websocket-${{ env.PACKAGE_VERSION }}-macOS-Unsigned.pkg" >> $GITHUB_ENV
|
|
||||||
- name: 'Package ${{ env.MACOS_FILENAME_UNSIGNED }}'
|
|
||||||
if: success()
|
|
||||||
working-directory: ${{ github.workspace }}/obs-websocket
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
packagesbuild ./CI/macos/obs-websocket.pkgproj
|
|
||||||
mv ./release/obs-websocket.pkg ./release/${{ env.MACOS_FILENAME_UNSIGNED }}
|
|
||||||
- name: 'Sign plugin package'
|
|
||||||
if: ${{ env.GIT_TAG != '' }}
|
|
||||||
shell: bash
|
|
||||||
working-directory: ${{ github.workspace }}/obs-websocket
|
|
||||||
run: |
|
|
||||||
productsign \
|
|
||||||
--sign "${{ secrets.MACOS_INSTALLER_IDENTITY }}" \
|
|
||||||
./release/${{ env.MACOS_FILENAME_UNSIGNED }} \
|
|
||||||
./release/${{ env.MACOS_FILENAME }}
|
|
||||||
rm ./release/${{ env.MACOS_FILENAME_UNSIGNED }}
|
|
||||||
- name: 'Notarize package'
|
|
||||||
if: ${{ env.GIT_TAG != '' }}
|
|
||||||
shell: bash
|
|
||||||
working-directory: ${{ github.workspace }}/obs-websocket
|
|
||||||
run: |
|
|
||||||
zip -r ./release/${{ env.MACOS_FILENAME }}.zip ./release/${{ env.MACOS_FILENAME }}
|
|
||||||
UPLOAD_RESULT=$(xcrun altool --notarize-app \
|
|
||||||
--primary-bundle-id "com.obsproject.obs-websocket" \
|
|
||||||
--username "${{ secrets.MACOS_NOTARIZATION_USERNAME }}" \
|
|
||||||
--password "${{ secrets.MACOS_NOTARIZATION_PASSWORD }}" \
|
|
||||||
--asc-provider "${{ secrets.ASC_PROVIDER_SHORTNAME }}" \
|
|
||||||
--file "./release/${{ env.MACOS_FILENAME }}.zip")
|
|
||||||
|
|
||||||
rm ./release/${{ env.MACOS_FILENAME }}.zip
|
|
||||||
|
|
||||||
REQUEST_UUID=$(echo $UPLOAD_RESULT | awk -F ' = ' '/RequestUUID/ {print $2}')
|
|
||||||
|
|
||||||
# Pieces of code borrowed from rednoah/notarized-app
|
|
||||||
while sleep 30 && date; do
|
|
||||||
CHECK_RESULT=$(xcrun altool \
|
|
||||||
--notarization-info "$REQUEST_UUID" \
|
|
||||||
--username "${{ secrets.MACOS_NOTARIZATION_USERNAME }}" \
|
|
||||||
--password "${{ secrets.MACOS_NOTARIZATION_PASSWORD }}" \
|
|
||||||
--asc-provider "${{ secrets.ASC_PROVIDER_SHORTNAME }}")
|
|
||||||
|
|
||||||
if ! grep -q "Status: in progress" <<< "$CHECK_RESULT"; then
|
|
||||||
xcrun stapler staple ./release/${{ env.MACOS_FILENAME }}
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
- name: 'Publish Packages'
|
|
||||||
if: success()
|
|
||||||
uses: actions/upload-artifact@v2-preview
|
|
||||||
with:
|
|
||||||
name: 'obs-websocket-${{ env.PACKAGE_VERSION }}-macOS'
|
|
||||||
path: '${{ github.workspace }}/obs-websocket/release/*.pkg'
|
|
6
.gitignore
vendored
6
.gitignore
vendored
@ -1,14 +1,14 @@
|
|||||||
*~
|
*~
|
||||||
.DS_Store
|
.DS_Store
|
||||||
|
.idea
|
||||||
|
.vscode
|
||||||
|
**.generated.h
|
||||||
/build/
|
/build/
|
||||||
/build32/
|
/build32/
|
||||||
/build64/
|
/build64/
|
||||||
/release/
|
/release/
|
||||||
/package/
|
/package/
|
||||||
/installer/Output/
|
/installer/Output/
|
||||||
.idea
|
|
||||||
.vscode
|
|
||||||
/docs/node_modules/
|
/docs/node_modules/
|
||||||
/src/plugin-macros.generated.h
|
|
||||||
/installer/installer-windows.generated.iss
|
/installer/installer-windows.generated.iss
|
||||||
/cmake-build-debug/
|
/cmake-build-debug/
|
||||||
|
@ -1,726 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
||||||
<plist version="1.0">
|
|
||||||
<dict>
|
|
||||||
<key>PROJECT</key>
|
|
||||||
<dict>
|
|
||||||
<key>PACKAGE_FILES</key>
|
|
||||||
<dict>
|
|
||||||
<key>DEFAULT_INSTALL_LOCATION</key>
|
|
||||||
<string>/</string>
|
|
||||||
<key>HIERARCHY</key>
|
|
||||||
<dict>
|
|
||||||
<key>CHILDREN</key>
|
|
||||||
<array>
|
|
||||||
<dict>
|
|
||||||
<key>CHILDREN</key>
|
|
||||||
<array>
|
|
||||||
<dict>
|
|
||||||
<key>CHILDREN</key>
|
|
||||||
<array>
|
|
||||||
<dict>
|
|
||||||
<key>CHILDREN</key>
|
|
||||||
<array>
|
|
||||||
<dict>
|
|
||||||
<key>CHILDREN</key>
|
|
||||||
<array>
|
|
||||||
<dict>
|
|
||||||
<key>CHILDREN</key>
|
|
||||||
<array>
|
|
||||||
<dict>
|
|
||||||
<key>CHILDREN</key>
|
|
||||||
<array>
|
|
||||||
<dict>
|
|
||||||
<key>CHILDREN</key>
|
|
||||||
<array/>
|
|
||||||
<key>GID</key>
|
|
||||||
<integer>80</integer>
|
|
||||||
<key>PATH</key>
|
|
||||||
<string>../../build/obs-websocket.so</string>
|
|
||||||
<key>PATH_TYPE</key>
|
|
||||||
<integer>1</integer>
|
|
||||||
<key>PERMISSIONS</key>
|
|
||||||
<integer>493</integer>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>3</integer>
|
|
||||||
<key>UID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
</dict>
|
|
||||||
</array>
|
|
||||||
<key>GID</key>
|
|
||||||
<integer>80</integer>
|
|
||||||
<key>PATH</key>
|
|
||||||
<string>bin</string>
|
|
||||||
<key>PATH_TYPE</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PERMISSIONS</key>
|
|
||||||
<integer>493</integer>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>2</integer>
|
|
||||||
<key>UID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
</dict>
|
|
||||||
<dict>
|
|
||||||
<key>CHILDREN</key>
|
|
||||||
<array/>
|
|
||||||
<key>GID</key>
|
|
||||||
<integer>80</integer>
|
|
||||||
<key>PATH</key>
|
|
||||||
<string>../../data</string>
|
|
||||||
<key>PATH_TYPE</key>
|
|
||||||
<integer>1</integer>
|
|
||||||
<key>PERMISSIONS</key>
|
|
||||||
<integer>493</integer>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>3</integer>
|
|
||||||
<key>UID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
</dict>
|
|
||||||
</array>
|
|
||||||
<key>GID</key>
|
|
||||||
<integer>80</integer>
|
|
||||||
<key>PATH</key>
|
|
||||||
<string>obs-websocket</string>
|
|
||||||
<key>PATH_TYPE</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PERMISSIONS</key>
|
|
||||||
<integer>493</integer>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>2</integer>
|
|
||||||
<key>UID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
</dict>
|
|
||||||
</array>
|
|
||||||
<key>GID</key>
|
|
||||||
<integer>80</integer>
|
|
||||||
<key>PATH</key>
|
|
||||||
<string>plugins</string>
|
|
||||||
<key>PATH_TYPE</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PERMISSIONS</key>
|
|
||||||
<integer>493</integer>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>2</integer>
|
|
||||||
<key>UID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
</dict>
|
|
||||||
</array>
|
|
||||||
<key>GID</key>
|
|
||||||
<integer>80</integer>
|
|
||||||
<key>PATH</key>
|
|
||||||
<string>obs-studio</string>
|
|
||||||
<key>PATH_TYPE</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PERMISSIONS</key>
|
|
||||||
<integer>493</integer>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>2</integer>
|
|
||||||
<key>UID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
</dict>
|
|
||||||
</array>
|
|
||||||
<key>GID</key>
|
|
||||||
<integer>80</integer>
|
|
||||||
<key>PATH</key>
|
|
||||||
<string>Application Support</string>
|
|
||||||
<key>PATH_TYPE</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PERMISSIONS</key>
|
|
||||||
<integer>493</integer>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>1</integer>
|
|
||||||
<key>UID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
</dict>
|
|
||||||
<dict>
|
|
||||||
<key>CHILDREN</key>
|
|
||||||
<array/>
|
|
||||||
<key>GID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PATH</key>
|
|
||||||
<string>Automator</string>
|
|
||||||
<key>PATH_TYPE</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PERMISSIONS</key>
|
|
||||||
<integer>493</integer>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>1</integer>
|
|
||||||
<key>UID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
</dict>
|
|
||||||
<dict>
|
|
||||||
<key>CHILDREN</key>
|
|
||||||
<array/>
|
|
||||||
<key>GID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PATH</key>
|
|
||||||
<string>Documentation</string>
|
|
||||||
<key>PATH_TYPE</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PERMISSIONS</key>
|
|
||||||
<integer>493</integer>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>1</integer>
|
|
||||||
<key>UID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
</dict>
|
|
||||||
<dict>
|
|
||||||
<key>CHILDREN</key>
|
|
||||||
<array/>
|
|
||||||
<key>GID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PATH</key>
|
|
||||||
<string>Extensions</string>
|
|
||||||
<key>PATH_TYPE</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PERMISSIONS</key>
|
|
||||||
<integer>493</integer>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>1</integer>
|
|
||||||
<key>UID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
</dict>
|
|
||||||
<dict>
|
|
||||||
<key>CHILDREN</key>
|
|
||||||
<array/>
|
|
||||||
<key>GID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PATH</key>
|
|
||||||
<string>Filesystems</string>
|
|
||||||
<key>PATH_TYPE</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PERMISSIONS</key>
|
|
||||||
<integer>493</integer>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>1</integer>
|
|
||||||
<key>UID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
</dict>
|
|
||||||
<dict>
|
|
||||||
<key>CHILDREN</key>
|
|
||||||
<array/>
|
|
||||||
<key>GID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PATH</key>
|
|
||||||
<string>Frameworks</string>
|
|
||||||
<key>PATH_TYPE</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PERMISSIONS</key>
|
|
||||||
<integer>493</integer>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>1</integer>
|
|
||||||
<key>UID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
</dict>
|
|
||||||
<dict>
|
|
||||||
<key>CHILDREN</key>
|
|
||||||
<array/>
|
|
||||||
<key>GID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PATH</key>
|
|
||||||
<string>Input Methods</string>
|
|
||||||
<key>PATH_TYPE</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PERMISSIONS</key>
|
|
||||||
<integer>493</integer>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>1</integer>
|
|
||||||
<key>UID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
</dict>
|
|
||||||
<dict>
|
|
||||||
<key>CHILDREN</key>
|
|
||||||
<array/>
|
|
||||||
<key>GID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PATH</key>
|
|
||||||
<string>Internet Plug-Ins</string>
|
|
||||||
<key>PATH_TYPE</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PERMISSIONS</key>
|
|
||||||
<integer>493</integer>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>1</integer>
|
|
||||||
<key>UID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
</dict>
|
|
||||||
<dict>
|
|
||||||
<key>CHILDREN</key>
|
|
||||||
<array/>
|
|
||||||
<key>GID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PATH</key>
|
|
||||||
<string>LaunchAgents</string>
|
|
||||||
<key>PATH_TYPE</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PERMISSIONS</key>
|
|
||||||
<integer>493</integer>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>1</integer>
|
|
||||||
<key>UID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
</dict>
|
|
||||||
<dict>
|
|
||||||
<key>CHILDREN</key>
|
|
||||||
<array/>
|
|
||||||
<key>GID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PATH</key>
|
|
||||||
<string>LaunchDaemons</string>
|
|
||||||
<key>PATH_TYPE</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PERMISSIONS</key>
|
|
||||||
<integer>493</integer>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>1</integer>
|
|
||||||
<key>UID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
</dict>
|
|
||||||
<dict>
|
|
||||||
<key>CHILDREN</key>
|
|
||||||
<array/>
|
|
||||||
<key>GID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PATH</key>
|
|
||||||
<string>PreferencePanes</string>
|
|
||||||
<key>PATH_TYPE</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PERMISSIONS</key>
|
|
||||||
<integer>493</integer>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>1</integer>
|
|
||||||
<key>UID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
</dict>
|
|
||||||
<dict>
|
|
||||||
<key>CHILDREN</key>
|
|
||||||
<array/>
|
|
||||||
<key>GID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PATH</key>
|
|
||||||
<string>Preferences</string>
|
|
||||||
<key>PATH_TYPE</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PERMISSIONS</key>
|
|
||||||
<integer>493</integer>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>1</integer>
|
|
||||||
<key>UID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
</dict>
|
|
||||||
<dict>
|
|
||||||
<key>CHILDREN</key>
|
|
||||||
<array/>
|
|
||||||
<key>GID</key>
|
|
||||||
<integer>80</integer>
|
|
||||||
<key>PATH</key>
|
|
||||||
<string>Printers</string>
|
|
||||||
<key>PATH_TYPE</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PERMISSIONS</key>
|
|
||||||
<integer>493</integer>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>1</integer>
|
|
||||||
<key>UID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
</dict>
|
|
||||||
<dict>
|
|
||||||
<key>CHILDREN</key>
|
|
||||||
<array/>
|
|
||||||
<key>GID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PATH</key>
|
|
||||||
<string>PrivilegedHelperTools</string>
|
|
||||||
<key>PATH_TYPE</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PERMISSIONS</key>
|
|
||||||
<integer>493</integer>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>1</integer>
|
|
||||||
<key>UID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
</dict>
|
|
||||||
<dict>
|
|
||||||
<key>CHILDREN</key>
|
|
||||||
<array/>
|
|
||||||
<key>GID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PATH</key>
|
|
||||||
<string>QuickLook</string>
|
|
||||||
<key>PATH_TYPE</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PERMISSIONS</key>
|
|
||||||
<integer>493</integer>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>1</integer>
|
|
||||||
<key>UID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
</dict>
|
|
||||||
<dict>
|
|
||||||
<key>CHILDREN</key>
|
|
||||||
<array/>
|
|
||||||
<key>GID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PATH</key>
|
|
||||||
<string>QuickTime</string>
|
|
||||||
<key>PATH_TYPE</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PERMISSIONS</key>
|
|
||||||
<integer>493</integer>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>1</integer>
|
|
||||||
<key>UID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
</dict>
|
|
||||||
<dict>
|
|
||||||
<key>CHILDREN</key>
|
|
||||||
<array/>
|
|
||||||
<key>GID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PATH</key>
|
|
||||||
<string>Screen Savers</string>
|
|
||||||
<key>PATH_TYPE</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PERMISSIONS</key>
|
|
||||||
<integer>493</integer>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>1</integer>
|
|
||||||
<key>UID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
</dict>
|
|
||||||
<dict>
|
|
||||||
<key>CHILDREN</key>
|
|
||||||
<array/>
|
|
||||||
<key>GID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PATH</key>
|
|
||||||
<string>Scripts</string>
|
|
||||||
<key>PATH_TYPE</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PERMISSIONS</key>
|
|
||||||
<integer>493</integer>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>1</integer>
|
|
||||||
<key>UID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
</dict>
|
|
||||||
<dict>
|
|
||||||
<key>CHILDREN</key>
|
|
||||||
<array/>
|
|
||||||
<key>GID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PATH</key>
|
|
||||||
<string>Services</string>
|
|
||||||
<key>PATH_TYPE</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PERMISSIONS</key>
|
|
||||||
<integer>493</integer>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>1</integer>
|
|
||||||
<key>UID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
</dict>
|
|
||||||
<dict>
|
|
||||||
<key>CHILDREN</key>
|
|
||||||
<array/>
|
|
||||||
<key>GID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PATH</key>
|
|
||||||
<string>Widgets</string>
|
|
||||||
<key>PATH_TYPE</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PERMISSIONS</key>
|
|
||||||
<integer>493</integer>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>1</integer>
|
|
||||||
<key>UID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
</dict>
|
|
||||||
</array>
|
|
||||||
<key>GID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PATH</key>
|
|
||||||
<string>Library</string>
|
|
||||||
<key>PATH_TYPE</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PERMISSIONS</key>
|
|
||||||
<integer>493</integer>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>1</integer>
|
|
||||||
<key>UID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
</dict>
|
|
||||||
<dict>
|
|
||||||
<key>CHILDREN</key>
|
|
||||||
<array>
|
|
||||||
<dict>
|
|
||||||
<key>CHILDREN</key>
|
|
||||||
<array/>
|
|
||||||
<key>GID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PATH</key>
|
|
||||||
<string>Shared</string>
|
|
||||||
<key>PATH_TYPE</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PERMISSIONS</key>
|
|
||||||
<integer>1023</integer>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>1</integer>
|
|
||||||
<key>UID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
</dict>
|
|
||||||
</array>
|
|
||||||
<key>GID</key>
|
|
||||||
<integer>80</integer>
|
|
||||||
<key>PATH</key>
|
|
||||||
<string>Users</string>
|
|
||||||
<key>PATH_TYPE</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PERMISSIONS</key>
|
|
||||||
<integer>493</integer>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>1</integer>
|
|
||||||
<key>UID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
</dict>
|
|
||||||
</array>
|
|
||||||
<key>GID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PATH</key>
|
|
||||||
<string>/</string>
|
|
||||||
<key>PATH_TYPE</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>PERMISSIONS</key>
|
|
||||||
<integer>493</integer>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>1</integer>
|
|
||||||
<key>UID</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
</dict>
|
|
||||||
<key>PAYLOAD_TYPE</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>VERSION</key>
|
|
||||||
<integer>4</integer>
|
|
||||||
</dict>
|
|
||||||
<key>PACKAGE_SCRIPTS</key>
|
|
||||||
<dict>
|
|
||||||
<key>RESOURCES</key>
|
|
||||||
<array/>
|
|
||||||
</dict>
|
|
||||||
<key>PACKAGE_SETTINGS</key>
|
|
||||||
<dict>
|
|
||||||
<key>AUTHENTICATION</key>
|
|
||||||
<integer>1</integer>
|
|
||||||
<key>CONCLUSION_ACTION</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
<key>IDENTIFIER</key>
|
|
||||||
<string>com.obsproject.obs-websocket</string>
|
|
||||||
<key>OVERWRITE_PERMISSIONS</key>
|
|
||||||
<false/>
|
|
||||||
<key>VERSION</key>
|
|
||||||
<string>5.0.0</string>
|
|
||||||
</dict>
|
|
||||||
<key>PROJECT_COMMENTS</key>
|
|
||||||
<dict>
|
|
||||||
<key>NOTES</key>
|
|
||||||
<data>
|
|
||||||
PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBIVE1M
|
|
||||||
IDQuMDEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQv
|
|
||||||
c3RyaWN0LmR0ZCI+CjxodG1sPgo8aGVhZD4KPG1ldGEgaHR0cC1l
|
|
||||||
cXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7
|
|
||||||
IGNoYXJzZXQ9VVRGLTgiPgo8bWV0YSBodHRwLWVxdWl2PSJDb250
|
|
||||||
ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIj4KPHRp
|
|
||||||
dGxlPjwvdGl0bGU+CjxtZXRhIG5hbWU9IkdlbmVyYXRvciIgY29u
|
|
||||||
dGVudD0iQ29jb2EgSFRNTCBXcml0ZXIiPgo8bWV0YSBuYW1lPSJD
|
|
||||||
b2NvYVZlcnNpb24iIGNvbnRlbnQ9IjE0MDQuMTMiPgo8c3R5bGUg
|
|
||||||
dHlwZT0idGV4dC9jc3MiPgo8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5
|
|
||||||
Pgo8L2JvZHk+CjwvaHRtbD4K
|
|
||||||
</data>
|
|
||||||
</dict>
|
|
||||||
<key>PROJECT_SETTINGS</key>
|
|
||||||
<dict>
|
|
||||||
<key>BUILD_PATH</key>
|
|
||||||
<dict>
|
|
||||||
<key>PATH</key>
|
|
||||||
<string>../../release</string>
|
|
||||||
<key>PATH_TYPE</key>
|
|
||||||
<integer>1</integer>
|
|
||||||
</dict>
|
|
||||||
<key>EXCLUDED_FILES</key>
|
|
||||||
<array>
|
|
||||||
<dict>
|
|
||||||
<key>PATTERNS_ARRAY</key>
|
|
||||||
<array>
|
|
||||||
<dict>
|
|
||||||
<key>REGULAR_EXPRESSION</key>
|
|
||||||
<false/>
|
|
||||||
<key>STRING</key>
|
|
||||||
<string>.DS_Store</string>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
</dict>
|
|
||||||
</array>
|
|
||||||
<key>PROTECTED</key>
|
|
||||||
<true/>
|
|
||||||
<key>PROXY_NAME</key>
|
|
||||||
<string>Remove .DS_Store files</string>
|
|
||||||
<key>PROXY_TOOLTIP</key>
|
|
||||||
<string>Remove ".DS_Store" files created by the Finder.</string>
|
|
||||||
<key>STATE</key>
|
|
||||||
<true/>
|
|
||||||
</dict>
|
|
||||||
<dict>
|
|
||||||
<key>PATTERNS_ARRAY</key>
|
|
||||||
<array>
|
|
||||||
<dict>
|
|
||||||
<key>REGULAR_EXPRESSION</key>
|
|
||||||
<false/>
|
|
||||||
<key>STRING</key>
|
|
||||||
<string>.pbdevelopment</string>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
</dict>
|
|
||||||
</array>
|
|
||||||
<key>PROTECTED</key>
|
|
||||||
<true/>
|
|
||||||
<key>PROXY_NAME</key>
|
|
||||||
<string>Remove .pbdevelopment files</string>
|
|
||||||
<key>PROXY_TOOLTIP</key>
|
|
||||||
<string>Remove ".pbdevelopment" files created by ProjectBuilder or Xcode.</string>
|
|
||||||
<key>STATE</key>
|
|
||||||
<true/>
|
|
||||||
</dict>
|
|
||||||
<dict>
|
|
||||||
<key>PATTERNS_ARRAY</key>
|
|
||||||
<array>
|
|
||||||
<dict>
|
|
||||||
<key>REGULAR_EXPRESSION</key>
|
|
||||||
<false/>
|
|
||||||
<key>STRING</key>
|
|
||||||
<string>CVS</string>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>1</integer>
|
|
||||||
</dict>
|
|
||||||
<dict>
|
|
||||||
<key>REGULAR_EXPRESSION</key>
|
|
||||||
<false/>
|
|
||||||
<key>STRING</key>
|
|
||||||
<string>.cvsignore</string>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
</dict>
|
|
||||||
<dict>
|
|
||||||
<key>REGULAR_EXPRESSION</key>
|
|
||||||
<false/>
|
|
||||||
<key>STRING</key>
|
|
||||||
<string>.cvspass</string>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
</dict>
|
|
||||||
<dict>
|
|
||||||
<key>REGULAR_EXPRESSION</key>
|
|
||||||
<false/>
|
|
||||||
<key>STRING</key>
|
|
||||||
<string>.svn</string>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>1</integer>
|
|
||||||
</dict>
|
|
||||||
<dict>
|
|
||||||
<key>REGULAR_EXPRESSION</key>
|
|
||||||
<false/>
|
|
||||||
<key>STRING</key>
|
|
||||||
<string>.git</string>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>1</integer>
|
|
||||||
</dict>
|
|
||||||
<dict>
|
|
||||||
<key>REGULAR_EXPRESSION</key>
|
|
||||||
<false/>
|
|
||||||
<key>STRING</key>
|
|
||||||
<string>.gitignore</string>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
</dict>
|
|
||||||
</array>
|
|
||||||
<key>PROTECTED</key>
|
|
||||||
<true/>
|
|
||||||
<key>PROXY_NAME</key>
|
|
||||||
<string>Remove SCM metadata</string>
|
|
||||||
<key>PROXY_TOOLTIP</key>
|
|
||||||
<string>Remove helper files and folders used by the CVS, SVN or Git Source Code Management systems.</string>
|
|
||||||
<key>STATE</key>
|
|
||||||
<true/>
|
|
||||||
</dict>
|
|
||||||
<dict>
|
|
||||||
<key>PATTERNS_ARRAY</key>
|
|
||||||
<array>
|
|
||||||
<dict>
|
|
||||||
<key>REGULAR_EXPRESSION</key>
|
|
||||||
<false/>
|
|
||||||
<key>STRING</key>
|
|
||||||
<string>classes.nib</string>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
</dict>
|
|
||||||
<dict>
|
|
||||||
<key>REGULAR_EXPRESSION</key>
|
|
||||||
<false/>
|
|
||||||
<key>STRING</key>
|
|
||||||
<string>designable.db</string>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
</dict>
|
|
||||||
<dict>
|
|
||||||
<key>REGULAR_EXPRESSION</key>
|
|
||||||
<false/>
|
|
||||||
<key>STRING</key>
|
|
||||||
<string>info.nib</string>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
</dict>
|
|
||||||
</array>
|
|
||||||
<key>PROTECTED</key>
|
|
||||||
<true/>
|
|
||||||
<key>PROXY_NAME</key>
|
|
||||||
<string>Optimize nib files</string>
|
|
||||||
<key>PROXY_TOOLTIP</key>
|
|
||||||
<string>Remove "classes.nib", "info.nib" and "designable.nib" files within .nib bundles.</string>
|
|
||||||
<key>STATE</key>
|
|
||||||
<true/>
|
|
||||||
</dict>
|
|
||||||
<dict>
|
|
||||||
<key>PATTERNS_ARRAY</key>
|
|
||||||
<array>
|
|
||||||
<dict>
|
|
||||||
<key>REGULAR_EXPRESSION</key>
|
|
||||||
<false/>
|
|
||||||
<key>STRING</key>
|
|
||||||
<string>Resources Disabled</string>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>1</integer>
|
|
||||||
</dict>
|
|
||||||
</array>
|
|
||||||
<key>PROTECTED</key>
|
|
||||||
<true/>
|
|
||||||
<key>PROXY_NAME</key>
|
|
||||||
<string>Remove Resources Disabled folders</string>
|
|
||||||
<key>PROXY_TOOLTIP</key>
|
|
||||||
<string>Remove "Resources Disabled" folders.</string>
|
|
||||||
<key>STATE</key>
|
|
||||||
<true/>
|
|
||||||
</dict>
|
|
||||||
<dict>
|
|
||||||
<key>SEPARATOR</key>
|
|
||||||
<true/>
|
|
||||||
</dict>
|
|
||||||
</array>
|
|
||||||
<key>NAME</key>
|
|
||||||
<string>obs-websocket</string>
|
|
||||||
</dict>
|
|
||||||
</dict>
|
|
||||||
<key>TYPE</key>
|
|
||||||
<integer>1</integer>
|
|
||||||
<key>VERSION</key>
|
|
||||||
<integer>2</integer>
|
|
||||||
</dict>
|
|
||||||
</plist>
|
|
338
CMakeLists.txt
338
CMakeLists.txt
@ -1,98 +1,73 @@
|
|||||||
cmake_minimum_required(VERSION 3.16...3.20)
|
project(obs-websocket VERSION 5.0.1)
|
||||||
|
|
||||||
# Version variables
|
|
||||||
project(obs-websocket VERSION 5.0.0)
|
|
||||||
set(OBS_WEBSOCKET_RPC_VERSION 1)
|
set(OBS_WEBSOCKET_RPC_VERSION 1)
|
||||||
|
|
||||||
|
option(ENABLE_WEBSOCKET "Enable building OBS with websocket plugin" ON)
|
||||||
|
|
||||||
# Set correct version string
|
if(NOT ENABLE_WEBSOCKET OR NOT ENABLE_UI)
|
||||||
if(DEFINED OBS_WEBSOCKET_VERSION_SUFFIX AND NOT OBS_WEBSOCKET_VERSION_SUFFIX STREQUAL "")
|
message(STATUS "OBS: DISABLED obs-websocket")
|
||||||
set(OBS_WEBSOCKET_VERSION "${CMAKE_PROJECT_VERSION}${OBS_WEBSOCKET_VERSION_SUFFIX}")
|
return()
|
||||||
message(WARNING "-----------------------------------\nVersion Suffix provided. OBS_WEBSOCKET_VERSION is now ${OBS_WEBSOCKET_VERSION}\n-----------------------------------")
|
|
||||||
else()
|
|
||||||
set(OBS_WEBSOCKET_VERSION "${CMAKE_PROJECT_VERSION}")
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
# Submodule deps check
|
||||||
set(CMAKE_CXX_STANDARD 17)
|
if(NOT
|
||||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/deps/json/CMakeLists.txt
|
||||||
|
AND EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/deps/websocketpp/CMakeLists.txt
|
||||||
|
AND EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/deps/qr/cpp/QrCode.hpp
|
||||||
# Prohibit in-source builds
|
AND EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/deps/asio/asio/include/asio.hpp))
|
||||||
file(TO_CMAKE_PATH "${PROJECT_BINARY_DIR}/CMakeLists.txt" _LOC_PATH)
|
obs_status(FATAL_ERROR "obs-websocket submodule deps not available.")
|
||||||
if(EXISTS "${LOC_PATH}")
|
|
||||||
message(FATAL_ERROR "obs-websocket: You cannot build in a source directory (or any directory with "
|
|
||||||
"CMakeLists.txt file). Please make a build subdirectory. Feel free to "
|
|
||||||
"remove CMakeCache.txt and CMakeFiles.")
|
|
||||||
endif()
|
endif()
|
||||||
unset(_LOC_PATH)
|
|
||||||
|
|
||||||
|
|
||||||
# Allow selection of common build types via UI
|
|
||||||
if(NOT CMAKE_BUILD_TYPE)
|
|
||||||
set(CMAKE_BUILD_TYPE "RelWithDebInfo" CACHE STRING
|
|
||||||
"OBS build type [Release, RelWithDebInfo, Debug, MinSizeRel]" FORCE)
|
|
||||||
set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS Release RelWithDebInfo Debug MinSizeRel)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
|
|
||||||
# Plugin tests flag
|
# Plugin tests flag
|
||||||
option(PLUGIN_TESTS "Enable plugin runtime tests" OFF)
|
option(PLUGIN_TESTS "Enable plugin runtime tests" OFF)
|
||||||
|
|
||||||
|
|
||||||
# Qt build stuff
|
# Qt build stuff
|
||||||
set(CMAKE_PREFIX_PATH "${QTDIR}")
|
set(CMAKE_PREFIX_PATH "${QTDIR}")
|
||||||
set(CMAKE_INCLUDE_CURRENT_DIR ON)
|
set(CMAKE_INCLUDE_CURRENT_DIR ON)
|
||||||
set(CMAKE_AUTOMOC ON)
|
set(CMAKE_AUTOMOC ON)
|
||||||
set(CMAKE_AUTOUIC ON)
|
set(CMAKE_AUTOUIC ON)
|
||||||
|
|
||||||
set(CMAKE_AUTORCC ON) # For resources.qrc
|
set(CMAKE_AUTORCC ON) # For resources.qrc
|
||||||
|
|
||||||
|
# Find Qt
|
||||||
|
find_qt(COMPONENTS Core Widgets Svg Network)
|
||||||
|
|
||||||
|
# Find nlohmann
|
||||||
|
set(JSON_BuildTests
|
||||||
|
OFF
|
||||||
|
CACHE INTERNAL "")
|
||||||
|
add_subdirectory(deps/json)
|
||||||
|
|
||||||
# Tell websocketpp not to use system boost
|
# Tell websocketpp not to use system boost
|
||||||
add_definitions(-DASIO_STANDALONE)
|
add_definitions(-DASIO_STANDALONE)
|
||||||
|
|
||||||
|
|
||||||
# Arm build fixes
|
|
||||||
if (${CMAKE_SYSTEM_PROCESSOR} MATCHES "arm")
|
|
||||||
set(CMAKE_CXX_FLAGS "-mfpu=neon")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
|
|
||||||
# Find libobs
|
|
||||||
if (WIN32 OR APPLE)
|
|
||||||
include(cmake/FindLibObs.cmake)
|
|
||||||
endif()
|
|
||||||
find_package(LibObs REQUIRED)
|
|
||||||
|
|
||||||
|
|
||||||
# Find Qt5
|
|
||||||
find_package(Qt5 REQUIRED COMPONENTS Core Widgets Svg Network)
|
|
||||||
|
|
||||||
|
|
||||||
# Find nlohmann
|
|
||||||
set(JSON_BuildTests OFF CACHE INTERNAL "")
|
|
||||||
add_subdirectory(deps/json)
|
|
||||||
|
|
||||||
|
|
||||||
# Configure files
|
# Configure files
|
||||||
configure_file(
|
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/src/plugin-macros.h.in
|
||||||
src/plugin-macros.h.in
|
${CMAKE_CURRENT_SOURCE_DIR}/src/plugin-macros.generated.h)
|
||||||
../src/plugin-macros.generated.h
|
|
||||||
)
|
|
||||||
configure_file(
|
|
||||||
installer/installer-windows.iss.in
|
|
||||||
../installer/installer-windows.generated.iss
|
|
||||||
)
|
|
||||||
|
|
||||||
|
# Setup target
|
||||||
|
add_library(obs-websocket MODULE)
|
||||||
|
add_library(OBS::websocket ALIAS obs-websocket)
|
||||||
|
|
||||||
# Inlude sources
|
target_sources(
|
||||||
set(obs-websocket_SOURCES
|
obs-websocket
|
||||||
src/obs-websocket.cpp
|
PRIVATE src/obs-websocket.cpp
|
||||||
|
src/obs-websocket.h
|
||||||
src/Config.cpp
|
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.cpp
|
||||||
|
src/WebSocketApi.h
|
||||||
src/websocketserver/WebSocketServer.cpp
|
src/websocketserver/WebSocketServer.cpp
|
||||||
src/websocketserver/WebSocketServer_Protocol.cpp
|
src/websocketserver/WebSocketServer_Protocol.cpp
|
||||||
|
src/websocketserver/WebSocketServer.h
|
||||||
src/websocketserver/rpc/WebSocketSession.cpp
|
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.cpp
|
||||||
src/eventhandler/EventHandler_General.cpp
|
src/eventhandler/EventHandler_General.cpp
|
||||||
src/eventhandler/EventHandler_Config.cpp
|
src/eventhandler/EventHandler_Config.cpp
|
||||||
@ -104,8 +79,9 @@ set(obs-websocket_SOURCES
|
|||||||
src/eventhandler/EventHandler_SceneItems.cpp
|
src/eventhandler/EventHandler_SceneItems.cpp
|
||||||
src/eventhandler/EventHandler_MediaInputs.cpp
|
src/eventhandler/EventHandler_MediaInputs.cpp
|
||||||
src/eventhandler/EventHandler_Ui.cpp
|
src/eventhandler/EventHandler_Ui.cpp
|
||||||
|
src/eventhandler/EventHandler.h
|
||||||
|
src/eventhandler/types/EventSubscription.h
|
||||||
src/requesthandler/RequestHandler.cpp
|
src/requesthandler/RequestHandler.cpp
|
||||||
src/requesthandler/RequestBatchHandler.cpp
|
|
||||||
src/requesthandler/RequestHandler_General.cpp
|
src/requesthandler/RequestHandler_General.cpp
|
||||||
src/requesthandler/RequestHandler_Config.cpp
|
src/requesthandler/RequestHandler_Config.cpp
|
||||||
src/requesthandler/RequestHandler_Sources.cpp
|
src/requesthandler/RequestHandler_Sources.cpp
|
||||||
@ -119,222 +95,80 @@ set(obs-websocket_SOURCES
|
|||||||
src/requesthandler/RequestHandler_Record.cpp
|
src/requesthandler/RequestHandler_Record.cpp
|
||||||
src/requesthandler/RequestHandler_MediaInputs.cpp
|
src/requesthandler/RequestHandler_MediaInputs.cpp
|
||||||
src/requesthandler/RequestHandler_Ui.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.cpp
|
||||||
|
src/requesthandler/rpc/Request.h
|
||||||
src/requesthandler/rpc/RequestBatchRequest.cpp
|
src/requesthandler/rpc/RequestBatchRequest.cpp
|
||||||
|
src/requesthandler/rpc/RequestBatchRequest.h
|
||||||
src/requesthandler/rpc/RequestResult.cpp
|
src/requesthandler/rpc/RequestResult.cpp
|
||||||
src/forms/SettingsDialog.cpp
|
src/requesthandler/rpc/RequestResult.h
|
||||||
src/forms/ConnectInfo.cpp
|
src/requesthandler/types/RequestStatus.h
|
||||||
src/forms/resources.qrc
|
src/requesthandler/types/RequestBatchExecutionType.h
|
||||||
src/utils/Crypto.cpp
|
src/utils/Crypto.cpp
|
||||||
|
src/utils/Crypto.h
|
||||||
src/utils/Json.cpp
|
src/utils/Json.cpp
|
||||||
|
src/utils/Json.h
|
||||||
src/utils/Obs.cpp
|
src/utils/Obs.cpp
|
||||||
src/utils/Obs_StringHelper.cpp
|
src/utils/Obs_StringHelper.cpp
|
||||||
src/utils/Obs_EnumHelper.cpp
|
|
||||||
src/utils/Obs_NumberHelper.cpp
|
src/utils/Obs_NumberHelper.cpp
|
||||||
src/utils/Obs_ArrayHelper.cpp
|
src/utils/Obs_ArrayHelper.cpp
|
||||||
src/utils/Obs_ObjectHelper.cpp
|
src/utils/Obs_ObjectHelper.cpp
|
||||||
src/utils/Obs_SearchHelper.cpp
|
src/utils/Obs_SearchHelper.cpp
|
||||||
src/utils/Obs_ActionHelper.cpp
|
src/utils/Obs_ActionHelper.cpp
|
||||||
src/utils/Obs_VolumeMeter.cpp
|
|
||||||
src/utils/Platform.cpp
|
|
||||||
src/utils/Compat.cpp
|
|
||||||
deps/qr/cpp/QrCode.cpp)
|
|
||||||
|
|
||||||
set(obs-websocket_HEADERS
|
|
||||||
src/obs-websocket.h
|
|
||||||
src/Config.h
|
|
||||||
src/WebSocketApi.h
|
|
||||||
src/websocketserver/WebSocketServer.h
|
|
||||||
src/websocketserver/types/WebSocketCloseCode.h
|
|
||||||
src/websocketserver/types/WebSocketOpCode.h
|
|
||||||
src/websocketserver/rpc/WebSocketSession.h
|
|
||||||
src/eventhandler/EventHandler.h
|
|
||||||
src/eventhandler/types/EventSubscription.h
|
|
||||||
src/requesthandler/RequestHandler.h
|
|
||||||
src/requesthandler/RequestBatchHandler.h
|
|
||||||
src/requesthandler/types/RequestStatus.h
|
|
||||||
src/requesthandler/types/RequestBatchExecutionType.h
|
|
||||||
src/requesthandler/rpc/Request.h
|
|
||||||
src/requesthandler/rpc/RequestBatchRequest.h
|
|
||||||
src/requesthandler/rpc/RequestResult.h
|
|
||||||
src/forms/SettingsDialog.h
|
|
||||||
src/forms/ConnectInfo.h
|
|
||||||
src/utils/Crypto.h
|
|
||||||
src/utils/Json.h
|
|
||||||
src/utils/Obs.h
|
src/utils/Obs.h
|
||||||
|
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.h
|
src/utils/Platform.h
|
||||||
|
src/utils/Compat.cpp
|
||||||
src/utils/Compat.h
|
src/utils/Compat.h
|
||||||
src/utils/Utils.h
|
src/utils/Utils.h
|
||||||
lib/obs-websocket-api.h
|
deps/qr/cpp/QrCode.cpp
|
||||||
deps/qr/cpp/QrCode.hpp)
|
deps/qr/cpp/QrCode.hpp)
|
||||||
|
|
||||||
|
target_include_directories(
|
||||||
|
obs-websocket
|
||||||
|
PRIVATE ${Qt5Core_INCLUDES} ${Qt5Widgets_INCLUDES} ${Qt5Svg_INCLUDES}
|
||||||
|
${Qt5Network_INCLUDES} "deps/asio/asio/include" "deps/websocketpp")
|
||||||
|
|
||||||
# Platform-independent build settings
|
target_link_libraries(
|
||||||
add_library(obs-websocket MODULE
|
obs-websocket
|
||||||
${obs-websocket_SOURCES}
|
PRIVATE OBS::libobs
|
||||||
${obs-websocket_HEADERS})
|
OBS::frontend-api
|
||||||
|
Qt::Core
|
||||||
include_directories(
|
Qt::Widgets
|
||||||
"${LIBOBS_INCLUDE_DIR}/../UI/obs-frontend-api"
|
Qt::Svg
|
||||||
${Qt5Core_INCLUDES}
|
Qt::Network
|
||||||
${Qt5Widgets_INCLUDES}
|
|
||||||
${Qt5Svg_INCLUDES}
|
|
||||||
${Qt5Network_INCLUDES}
|
|
||||||
"${CMAKE_SOURCE_DIR}/deps/asio/asio/include"
|
|
||||||
"${CMAKE_SOURCE_DIR}/deps/websocketpp")
|
|
||||||
|
|
||||||
target_link_libraries(obs-websocket
|
|
||||||
libobs
|
|
||||||
Qt5::Core
|
|
||||||
Qt5::Widgets
|
|
||||||
Qt5::Svg
|
|
||||||
Qt5::Network
|
|
||||||
nlohmann_json::nlohmann_json)
|
nlohmann_json::nlohmann_json)
|
||||||
|
|
||||||
|
target_compile_features(obs-websocket PRIVATE cxx_std_17)
|
||||||
|
|
||||||
|
set_target_properties(obs-websocket PROPERTIES FOLDER "plugins/obs-websocket")
|
||||||
|
|
||||||
if(PLUGIN_TESTS)
|
if(PLUGIN_TESTS)
|
||||||
target_compile_definitions(obs-websocket PRIVATE PLUGIN_TESTS)
|
target_compile_definitions(obs-websocket PRIVATE PLUGIN_TESTS)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
# Random other things
|
||||||
# Windows-specific build settings and tasks
|
|
||||||
if(WIN32)
|
if(WIN32)
|
||||||
if(NOT DEFINED OBS_FRONTEND_LIB)
|
add_definitions(-D_WEBSOCKETPP_CPP11_STL_)
|
||||||
set(OBS_FRONTEND_LIB "OBS_FRONTEND_LIB-NOTFOUND" CACHE FILEPATH "OBS frontend library")
|
|
||||||
message(FATAL_ERROR "Could not find OBS Frontend API's library!")
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(MSVC)
|
if(MSVC)
|
||||||
# Enable Multicore Builds and disable FH4 (to not depend on VCRUNTIME140_1.DLL)
|
target_compile_options(obs-websocket PRIVATE /wd4267 /wd4996)
|
||||||
add_definitions(/MP /d2FH4-)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
add_definitions(-D_WEBSOCKETPP_CPP11_STL_)
|
|
||||||
|
|
||||||
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
|
|
||||||
set(ARCH_NAME "64bit")
|
|
||||||
set(OBS_BUILDDIR_ARCH "build64")
|
|
||||||
else()
|
else()
|
||||||
set(ARCH_NAME "32bit")
|
target_compile_options(
|
||||||
set(OBS_BUILDDIR_ARCH "build32")
|
obs-websocket
|
||||||
endif()
|
PRIVATE
|
||||||
|
-Wall
|
||||||
include_directories(
|
"$<$<COMPILE_LANG_AND_ID:CXX,GNU>:-Wno-error=format-overflow>"
|
||||||
"${LIBOBS_INCLUDE_DIR}/../${OBS_BUILDDIR_ARCH}/UI"
|
"$<$<COMPILE_LANG_AND_ID:CXX,AppleClang,Clang>:-Wno-error=null-pointer-subtraction;-Wno-error=deprecated-declarations>"
|
||||||
)
|
|
||||||
|
|
||||||
target_link_libraries(obs-websocket
|
|
||||||
"${OBS_FRONTEND_LIB}")
|
|
||||||
|
|
||||||
# Release package helper
|
|
||||||
# The "release" folder has a structure similar OBS' one on Windows
|
|
||||||
set(RELEASE_DIR "${PROJECT_SOURCE_DIR}/release")
|
|
||||||
|
|
||||||
add_custom_command(TARGET obs-websocket POST_BUILD
|
|
||||||
# If config is Release or RelWithDebInfo, package release files
|
|
||||||
COMMAND if $<OR:$<CONFIG:Release>,$<CONFIG:RelWithDebInfo>>==1 (
|
|
||||||
"${CMAKE_COMMAND}" -E make_directory
|
|
||||||
"${RELEASE_DIR}/obs-plugins/${ARCH_NAME}"
|
|
||||||
)
|
|
||||||
|
|
||||||
COMMAND if $<OR:$<CONFIG:Release>,$<CONFIG:RelWithDebInfo>>==1 (
|
|
||||||
"${CMAKE_COMMAND}" -E copy_directory
|
|
||||||
"${PROJECT_SOURCE_DIR}/data"
|
|
||||||
"${RELEASE_DIR}/data/obs-plugins/obs-websocket"
|
|
||||||
)
|
|
||||||
|
|
||||||
COMMAND if $<OR:$<CONFIG:Release>,$<CONFIG:RelWithDebInfo>>==1 (
|
|
||||||
"${CMAKE_COMMAND}" -E copy
|
|
||||||
"$<TARGET_FILE:obs-websocket>"
|
|
||||||
"${RELEASE_DIR}/obs-plugins/${ARCH_NAME}"
|
|
||||||
)
|
|
||||||
|
|
||||||
# In Release or RelWithDebInfo mode, copy Qt image format plugins
|
|
||||||
COMMAND if $<OR:$<CONFIG:Release>,$<CONFIG:RelWithDebInfo>>==1 (
|
|
||||||
"${CMAKE_COMMAND}" -E make_directory
|
|
||||||
"${RELEASE_DIR}/bin/${ARCH_NAME}/imageformats"
|
|
||||||
)
|
|
||||||
COMMAND if $<OR:$<CONFIG:Release>,$<CONFIG:RelWithDebInfo>>==1 (
|
|
||||||
"${CMAKE_COMMAND}" -E copy
|
|
||||||
"${QTDIR}/plugins/imageformats/qicns.dll"
|
|
||||||
"${QTDIR}/plugins/imageformats/qico.dll"
|
|
||||||
"${QTDIR}/plugins/imageformats/qjpeg.dll"
|
|
||||||
"${QTDIR}/plugins/imageformats/qtiff.dll"
|
|
||||||
"${QTDIR}/plugins/imageformats/qwbmp.dll"
|
|
||||||
"${QTDIR}/plugins/imageformats/qwebp.dll"
|
|
||||||
"${RELEASE_DIR}/bin/${ARCH_NAME}/imageformats"
|
|
||||||
)
|
|
||||||
|
|
||||||
# If config is RelWithDebInfo, package PDB file for target
|
|
||||||
COMMAND if $<CONFIG:RelWithDebInfo>==1 (
|
|
||||||
"${CMAKE_COMMAND}" -E copy
|
|
||||||
"$<TARGET_PDB_FILE:obs-websocket>"
|
|
||||||
"${RELEASE_DIR}/obs-plugins/${ARCH_NAME}"
|
|
||||||
)
|
|
||||||
|
|
||||||
# In the Debug configuration, copy to obs-studio dev environment for immediate testing
|
|
||||||
COMMAND if $<CONFIG:Debug>==1 (
|
|
||||||
"${CMAKE_COMMAND}" -E copy
|
|
||||||
"$<TARGET_FILE:obs-websocket>"
|
|
||||||
"${LIBOBS_INCLUDE_DIR}/../${OBS_BUILDDIR_ARCH}/rundir/$<CONFIG>/obs-plugins/${ARCH_NAME}"
|
|
||||||
)
|
|
||||||
|
|
||||||
COMMAND if $<CONFIG:Debug>==1 (
|
|
||||||
"${CMAKE_COMMAND}" -E copy
|
|
||||||
"$<TARGET_PDB_FILE:obs-websocket>"
|
|
||||||
"${LIBOBS_INCLUDE_DIR}/../${OBS_BUILDDIR_ARCH}/rundir/$<CONFIG>/obs-plugins/${ARCH_NAME}"
|
|
||||||
)
|
|
||||||
|
|
||||||
COMMAND if $<CONFIG:Debug>==1 (
|
|
||||||
"${CMAKE_COMMAND}" -E make_directory
|
|
||||||
"${LIBOBS_INCLUDE_DIR}/../${OBS_BUILDDIR_ARCH}/rundir/$<CONFIG>/data/obs-plugins/obs-websocket"
|
|
||||||
)
|
|
||||||
|
|
||||||
COMMAND if $<CONFIG:Debug>==1 (
|
|
||||||
"${CMAKE_COMMAND}" -E copy_directory
|
|
||||||
"${PROJECT_SOURCE_DIR}/data"
|
|
||||||
"${LIBOBS_INCLUDE_DIR}/../${OBS_BUILDDIR_ARCH}/rundir/$<CONFIG>/data/obs-plugins/obs-websocket"
|
|
||||||
)
|
|
||||||
)
|
)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
# Final CMake helpers
|
||||||
# Linux-specific build settings and tasks
|
setup_plugin_target(obs-websocket)
|
||||||
if(UNIX AND NOT APPLE)
|
setup_target_resources(obs-websocket "obs-plugins/obs-websocket")
|
||||||
include(GNUInstallDirs)
|
|
||||||
|
|
||||||
target_compile_options(obs-websocket PRIVATE -Wall -Wextra -Wpedantic -Werror -Wno-missing-field-initializers)
|
|
||||||
|
|
||||||
set_target_properties(obs-websocket PROPERTIES PREFIX "")
|
|
||||||
target_link_libraries(obs-websocket obs-frontend-api)
|
|
||||||
|
|
||||||
# Manually set permissions for locales
|
|
||||||
file(GLOB locale_files data/locale/*.ini)
|
|
||||||
set(CMAKE_INSTALL_DEFAULT_DIRECTORY_PERMISSIONS
|
|
||||||
OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_WRITE GROUP_EXECUTE WORLD_READ WORLD_EXECUTE)
|
|
||||||
|
|
||||||
# Manually set file permissions for binary
|
|
||||||
install(TARGETS obs-websocket LIBRARY
|
|
||||||
DESTINATION "${CMAKE_INSTALL_FULL_LIBDIR}/obs-plugins"
|
|
||||||
PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ)
|
|
||||||
|
|
||||||
# OBS on Ubuntu installs into a different directory than most linux distros
|
|
||||||
if(${USE_UBUNTU_FIX})
|
|
||||||
install(TARGETS obs-websocket LIBRARY
|
|
||||||
DESTINATION "/usr/lib/obs-plugins"
|
|
||||||
PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
install(FILES ${locale_files}
|
|
||||||
DESTINATION "${CMAKE_INSTALL_FULL_DATAROOTDIR}/obs/obs-plugins/obs-websocket/locale")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# MacOS-specific build settings and tasks
|
|
||||||
if(APPLE)
|
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++ -fvisibility=default")
|
|
||||||
|
|
||||||
set(CMAKE_SKIP_RPATH TRUE)
|
|
||||||
set_target_properties(obs-websocket PROPERTIES PREFIX "")
|
|
||||||
target_link_libraries(obs-websocket "${OBS_FRONTEND_LIB}")
|
|
||||||
endif()
|
|
||||||
|
16
README.md
16
README.md
@ -8,17 +8,18 @@
|
|||||||
|
|
||||||
WebSocket API for OBS Studio.
|
WebSocket API for OBS Studio.
|
||||||
|
|
||||||
[](https://github.com/obsproject/obs-websocket/actions/workflows/main.yml)
|
|
||||||
[](https://discord.gg/WBaSQ3A)
|
[](https://discord.gg/WBaSQ3A)
|
||||||
[](https://opencollective.com/obs-websocket-dev)
|
[](https://opencollective.com/obs-websocket-dev)
|
||||||
|
|
||||||
## Downloads
|
## Downloads
|
||||||
|
|
||||||
Binaries for Windows, MacOS, and Linux are available in the [Releases](https://github.com/obsproject/obs-websocket/releases) section.
|
obs-websocket is now included by default with OBS Studio 28.0.0 and above. As such, **there should be no need to download obs-websocket if you have OBS Studio > 28.0.0.**
|
||||||
|
|
||||||
|
Binaries **for OBS Studio < 28.0.0** on Windows, MacOS, and Linux are available in the [Releases](https://github.com/obsproject/obs-websocket/releases) section.
|
||||||
|
|
||||||
## Using obs-websocket
|
## Using obs-websocket
|
||||||
|
|
||||||
It is **highly recommended** to protect obs-websocket with a password against unauthorized control. To do this, open the "Websocket server settings" dialog under OBS' "Tools" menu. In the settings dialogs, you can enable or disable authentication and set a password for it.
|
It is **highly recommended** to keep obs-websocket protected with a password against unauthorized control. obs-websocket generates a password for you automatically when you load it for the first time. To change this, open the "obs-websocket Settings" dialog under OBS' "Tools" menu. In the settings dialog, you can enable or disable authentication and set a password for it.
|
||||||
|
|
||||||
(Psst. You can use `--websocket_port`(value), `--websocket_password`(value), `--websocket_debug`(flag) and `--websocket_ipv4_only`(flag) on the command line to override the configured values.)
|
(Psst. You can use `--websocket_port`(value), `--websocket_password`(value), `--websocket_debug`(flag) and `--websocket_ipv4_only`(flag) on the command line to override the configured values.)
|
||||||
|
|
||||||
@ -30,16 +31,21 @@ It is **highly recommended** to protect obs-websocket with a password against un
|
|||||||
|
|
||||||
### Client software
|
### Client software
|
||||||
|
|
||||||
- (No known clients supporting 5.0.0 at the moment. Ping us in the Discord if you have one!)
|
- [Touch Portal](https://www.touch-portal.com/)
|
||||||
|
- [Twitchat](https://twitchat.fr/)
|
||||||
|
- [OBS-web](https://github.com/Niek/obs-web) - hosted client at [obs-web.niek.tv/](http://obs-web.niek.tv/)
|
||||||
|
|
||||||
### 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
|
||||||
- Rust: [obws](https://github.com/dnaka91/obws/tree/v5-api) 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)
|
||||||
|
- 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
|
||||||
|
|
||||||
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).
|
||||||
|
@ -1,107 +0,0 @@
|
|||||||
# This module can be copied and used by external plugins for OBS
|
|
||||||
#
|
|
||||||
# Once done these will be defined:
|
|
||||||
#
|
|
||||||
# LIBOBS_FOUND
|
|
||||||
# LIBOBS_INCLUDE_DIRS
|
|
||||||
# LIBOBS_LIBRARIES
|
|
||||||
|
|
||||||
find_package(PkgConfig QUIET)
|
|
||||||
if (PKG_CONFIG_FOUND)
|
|
||||||
pkg_check_modules(_OBS QUIET obs libobs)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
|
|
||||||
set(_lib_suffix 64)
|
|
||||||
else()
|
|
||||||
set(_lib_suffix 32)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(DEFINED CMAKE_BUILD_TYPE)
|
|
||||||
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
|
|
||||||
set(_build_type_base "debug")
|
|
||||||
else()
|
|
||||||
set(_build_type_base "release")
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
find_path(LIBOBS_INCLUDE_DIR
|
|
||||||
NAMES obs.h
|
|
||||||
HINTS
|
|
||||||
ENV obsPath${_lib_suffix}
|
|
||||||
ENV obsPath
|
|
||||||
${obsPath}
|
|
||||||
PATHS
|
|
||||||
/usr/include /usr/local/include /opt/local/include /sw/include
|
|
||||||
PATH_SUFFIXES
|
|
||||||
libobs
|
|
||||||
)
|
|
||||||
|
|
||||||
function(find_obs_lib base_name repo_build_path lib_name)
|
|
||||||
string(TOUPPER "${base_name}" base_name_u)
|
|
||||||
|
|
||||||
if(DEFINED _build_type_base)
|
|
||||||
set(_build_type_${repo_build_path} "${_build_type_base}/${repo_build_path}")
|
|
||||||
set(_build_type_${repo_build_path}${_lib_suffix} "${_build_type_base}${_lib_suffix}/${repo_build_path}")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
find_library(${base_name_u}_LIB
|
|
||||||
NAMES ${_${base_name_u}_LIBRARIES} ${lib_name} lib${lib_name}
|
|
||||||
HINTS
|
|
||||||
ENV obsPath${_lib_suffix}
|
|
||||||
ENV obsPath
|
|
||||||
${obsPath}
|
|
||||||
${_${base_name_u}_LIBRARY_DIRS}
|
|
||||||
PATHS
|
|
||||||
/usr/lib /usr/local/lib /opt/local/lib /sw/lib
|
|
||||||
PATH_SUFFIXES
|
|
||||||
lib${_lib_suffix} lib
|
|
||||||
libs${_lib_suffix} libs
|
|
||||||
bin${_lib_suffix} bin
|
|
||||||
../lib${_lib_suffix} ../lib
|
|
||||||
../libs${_lib_suffix} ../libs
|
|
||||||
../bin${_lib_suffix} ../bin
|
|
||||||
# base repo non-msvc-specific search paths
|
|
||||||
${_build_type_${repo_build_path}}
|
|
||||||
${_build_type_${repo_build_path}${_lib_suffix}}
|
|
||||||
build/${repo_build_path}
|
|
||||||
build${_lib_suffix}/${repo_build_path}
|
|
||||||
# base repo msvc-specific search paths on windows
|
|
||||||
build${_lib_suffix}/${repo_build_path}/Debug
|
|
||||||
build${_lib_suffix}/${repo_build_path}/RelWithDebInfo
|
|
||||||
build/${repo_build_path}/Debug
|
|
||||||
build/${repo_build_path}/RelWithDebInfo
|
|
||||||
)
|
|
||||||
endfunction()
|
|
||||||
|
|
||||||
find_obs_lib(LIBOBS libobs obs)
|
|
||||||
|
|
||||||
if(MSVC)
|
|
||||||
find_obs_lib(W32_PTHREADS deps/w32-pthreads w32-pthreads)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
include(FindPackageHandleStandardArgs)
|
|
||||||
find_package_handle_standard_args(Libobs DEFAULT_MSG LIBOBS_LIB LIBOBS_INCLUDE_DIR)
|
|
||||||
mark_as_advanced(LIBOBS_INCLUDE_DIR LIBOBS_LIB)
|
|
||||||
|
|
||||||
if(LIBOBS_FOUND)
|
|
||||||
if(MSVC)
|
|
||||||
if (NOT DEFINED W32_PTHREADS_LIB)
|
|
||||||
message(FATAL_ERROR "Could not find the w32-pthreads library" )
|
|
||||||
endif()
|
|
||||||
|
|
||||||
set(W32_PTHREADS_INCLUDE_DIR ${LIBOBS_INCLUDE_DIR}/../deps/w32-pthreads)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
set(LIBOBS_INCLUDE_DIRS ${LIBOBS_INCLUDE_DIR} ${W32_PTHREADS_INCLUDE_DIR})
|
|
||||||
set(LIBOBS_LIBRARIES ${LIBOBS_LIB} ${W32_PTHREADS_LIB})
|
|
||||||
include(${LIBOBS_INCLUDE_DIR}/../cmake/external/ObsPluginHelpers.cmake)
|
|
||||||
|
|
||||||
# allows external plugins to easily use/share common dependencies that are often included with libobs (such as FFmpeg)
|
|
||||||
if(NOT DEFINED INCLUDED_LIBOBS_CMAKE_MODULES)
|
|
||||||
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${LIBOBS_INCLUDE_DIR}/../cmake/Modules/")
|
|
||||||
set(INCLUDED_LIBOBS_CMAKE_MODULES true)
|
|
||||||
endif()
|
|
||||||
else()
|
|
||||||
message(FATAL_ERROR "Could not find the libobs library" )
|
|
||||||
endif()
|
|
43
data/locale/ar-SA.ini
Normal file
43
data/locale/ar-SA.ini
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
OBSWebSocket.Plugin.Description="التحكم عن بعد في استوديو OBS من خلال WebSocket"
|
||||||
|
OBSWebSocket.Settings.DialogTitle="إعدادات obs-websocket"
|
||||||
|
OBSWebSocket.Settings.PluginSettingsTitle="إعدادات الإضافات"
|
||||||
|
OBSWebSocket.Settings.ServerEnable="تمكين خادم WebSocket"
|
||||||
|
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="جلسات 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. قد يكون منفذ TCP %1 قيد الاستخدام في تطبيق آخر على هذا النظام. حاول تعيين منفذ TCP مختلف في إعدادات خادم WebSocket، أو إيقاف أي تطبيق يمكن أن يستخدم هذا المنفذ.\n رسالة الخطأ: %2"
|
43
data/locale/ca-ES.ini
Normal file
43
data/locale/ca-ES.ini
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
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.PluginSettingsTitle="Configuració del complement"
|
||||||
|
OBSWebSocket.Settings.ServerEnable="Habilita el servidor web"
|
||||||
|
OBSWebSocket.Settings.AlertsEnable="Habilita les notificacions a la barra de tasques"
|
||||||
|
OBSWebSocket.Settings.DebugEnable="Habilita l'informe de depuració"
|
||||||
|
OBSWebSocket.Settings.DebugEnableHoverText="Habilita l'informe de depuració només per a la instància actual de l'OBS i no queda resident en inicis posteriors.\nUtilitzeu --websocket_debug si us cal que el canvi sigui persistent."
|
||||||
|
OBSWebSocket.Settings.ServerSettingsTitle="Configuració del servidor"
|
||||||
|
OBSWebSocket.Settings.AuthRequired="Habilita l'autenticació"
|
||||||
|
OBSWebSocket.Settings.Password="Contrasenya del servidor"
|
||||||
|
OBSWebSocket.Settings.GeneratePassword="Genera una contrasenya"
|
||||||
|
OBSWebSocket.Settings.ServerPort="Port del servidor"
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfo="Mostra la informació de connexió"
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfoWarningTitle="Atenció: Actualment en directe"
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfoWarningMessage="Sembla que una sortida (retransmissió, gravació, etc.) està actualment activa."
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfoWarningInfoText="Segur que voleu mostrar la vostra informació de connexió?"
|
||||||
|
OBSWebSocket.Settings.Save.UserPasswordWarningTitle="Atenció: Risc potencial de seguretat"
|
||||||
|
OBSWebSocket.Settings.Save.UserPasswordWarningMessage="El servidor web del l'OBS (obs-websocket) emmagatzema la contrasenya del servidor com a text pla. És altament recomanable l'ús d'una contrasenya generada automàticament."
|
||||||
|
OBSWebSocket.Settings.Save.UserPasswordWarningInfoText="Segur que voleu utilitzar la vostra contrasenya?"
|
||||||
|
OBSWebSocket.Settings.Save.PasswordInvalidErrorTitle="Error: Configuració no vàlida"
|
||||||
|
OBSWebSocket.Settings.Save.PasswordInvalidErrorMessage="Utilitzeu una contrasenya de 6 o més caràcters."
|
||||||
|
OBSWebSocket.SessionTable.Title="Sessions de servidor connectades"
|
||||||
|
OBSWebSocket.SessionTable.RemoteAddressColumnTitle="Adreça remota"
|
||||||
|
OBSWebSocket.SessionTable.SessionDurationColumnTitle="Durada de la sessió"
|
||||||
|
OBSWebSocket.SessionTable.MessagesInOutColumnTitle="Missatges d'entrada/sortida"
|
||||||
|
OBSWebSocket.SessionTable.IdentifiedTitle="Identificat"
|
||||||
|
OBSWebSocket.SessionTable.KickButtonColumnTitle="Expulsió?"
|
||||||
|
OBSWebSocket.SessionTable.KickButtonText="Expulsa"
|
||||||
|
OBSWebSocket.ConnectInfo.DialogTitle="Informació de connexió del servidor Web (WebSocket)"
|
||||||
|
OBSWebSocket.ConnectInfo.CopyText="Copia"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerIp="Adreça IP (més acurada)"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerPort="Port"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerPassword="Contrasenya"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerPasswordPlaceholderText="[Autenticació inhabilitada]"
|
||||||
|
OBSWebSocket.ConnectInfo.QrTitle="QR de la connexió"
|
||||||
|
OBSWebSocket.TrayNotification.Identified.Title="Connexió nova de servidor Web (WebSocket)"
|
||||||
|
OBSWebSocket.TrayNotification.Identified.Body="Client %1 identificat."
|
||||||
|
OBSWebSocket.TrayNotification.AuthenticationFailed.Title="Ha fallat l'autenticació del servidor Web"
|
||||||
|
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Ha fallat l'autenticació del client %1."
|
||||||
|
OBSWebSocket.TrayNotification.Disconnected.Title="Client desconnectat del servidor Web"
|
||||||
|
OBSWebSocket.TrayNotification.Disconnected.Body="Client %1 desconnectat."
|
||||||
|
OBSWebSocket.Server.StartFailed.Title="Ha fallat el servidor Web (WebSocket)"
|
||||||
|
OBSWebSocket.Server.StartFailed.Message="El servidor Web ha fallat en iniciar. Potser el port TCP %1 ja està en ús per altre programa del sistema. Proveu un port diferent a la configuració del servidor Web (WebSocket), o atureu qualsevol altra aplicació que pugui utilitzar aquest port.\n Missatge d'error: %2"
|
43
data/locale/cs-CZ.ini
Normal file
43
data/locale/cs-CZ.ini
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
OBSWebSocket.Plugin.Description="Vzdálené ovládání OBS Studia přes WebSocket"
|
||||||
|
OBSWebSocket.Settings.DialogTitle="Nastavení obs-websocket"
|
||||||
|
OBSWebSocket.Settings.PluginSettingsTitle="Nastavení pluginu"
|
||||||
|
OBSWebSocket.Settings.ServerEnable="Povolit WebSocketový server"
|
||||||
|
OBSWebSocket.Settings.AlertsEnable="Povolit upozornění v systémové liště"
|
||||||
|
OBSWebSocket.Settings.DebugEnable="Povolit podrobné protokolování"
|
||||||
|
OBSWebSocket.Settings.DebugEnableHoverText="Zapne podrobné protokolování pro aktuální instanci OBS. Nastavení není zachováno mezi spuštěními.\nPoužijte --websocket_debug pro povlení při spuštění."
|
||||||
|
OBSWebSocket.Settings.ServerSettingsTitle="Nastavení serveru"
|
||||||
|
OBSWebSocket.Settings.AuthRequired="Povolit přihlašování"
|
||||||
|
OBSWebSocket.Settings.Password="Heslo serveru"
|
||||||
|
OBSWebSocket.Settings.GeneratePassword="Vygenerovat heslo"
|
||||||
|
OBSWebSocket.Settings.ServerPort="Port serveru"
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfo="Zobrazit info o připojení"
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfoWarningTitle="Varování: Aktuálně vysíláte"
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfoWarningMessage="Vypadá to, že výstup (vysílání, nahrávání etc.) je právě aktivní."
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfoWarningInfoText="Opravdu si přejete zobrazit údaje k připojení?"
|
||||||
|
OBSWebSocket.Settings.Save.UserPasswordWarningTitle="Varování: Potencionální bezpečnostní problém"
|
||||||
|
OBSWebSocket.Settings.Save.UserPasswordWarningMessage="obs-websocket ukládá heslo jako prostý text. Důrazně doporučujeme použití hesla generovaného pomocí obs-websocket."
|
||||||
|
OBSWebSocket.Settings.Save.UserPasswordWarningInfoText="Opravdu si přejete použít vaše vlastní heslo?"
|
||||||
|
OBSWebSocket.Settings.Save.PasswordInvalidErrorTitle="Chyba: Neplatná konfigurace"
|
||||||
|
OBSWebSocket.Settings.Save.PasswordInvalidErrorMessage="Musíte použít heslo o délce nejméně 6 znaků."
|
||||||
|
OBSWebSocket.SessionTable.Title="Připojené relace WebSocketu"
|
||||||
|
OBSWebSocket.SessionTable.RemoteAddressColumnTitle="Vzdálená adresa"
|
||||||
|
OBSWebSocket.SessionTable.SessionDurationColumnTitle="Délka relace"
|
||||||
|
OBSWebSocket.SessionTable.MessagesInOutColumnTitle="Zprávy do/z"
|
||||||
|
OBSWebSocket.SessionTable.IdentifiedTitle="Identifikované"
|
||||||
|
OBSWebSocket.SessionTable.KickButtonColumnTitle="Vykopnout?"
|
||||||
|
OBSWebSocket.SessionTable.KickButtonText="Vykopnout"
|
||||||
|
OBSWebSocket.ConnectInfo.DialogTitle="Připojení k WebSocket serveru"
|
||||||
|
OBSWebSocket.ConnectInfo.CopyText="Kopírovat"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerIp="IP adresa serveru (nejlepší odhad)"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerPort="Port serveru"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerPassword="Heslo serveru"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerPasswordPlaceholderText="[Přihlášení zakázáno]"
|
||||||
|
OBSWebSocket.ConnectInfo.QrTitle="QR pro připojení"
|
||||||
|
OBSWebSocket.TrayNotification.Identified.Title="Nové WebSocket připojení"
|
||||||
|
OBSWebSocket.TrayNotification.Identified.Body="Klient %1 identifikován."
|
||||||
|
OBSWebSocket.TrayNotification.AuthenticationFailed.Title="Chyba přihlášení k WebSocketu"
|
||||||
|
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Klient %1 nebyl přihlášen"
|
||||||
|
OBSWebSocket.TrayNotification.Disconnected.Title="WebSocket klient se odpojil"
|
||||||
|
OBSWebSocket.TrayNotification.Disconnected.Body="Klient %1 se odpojil."
|
||||||
|
OBSWebSocket.Server.StartFailed.Title="Chyba WebSocket serveru"
|
||||||
|
OBSWebSocket.Server.StartFailed.Message="WebSocket server se nepodařilo spustit. TCP port %1 může být používán jinou aplikací. Zkuste nastavit jiný TCP port v nastavení WebSocket serveru nebo zavřete aplikaci, která může používat tento port.\n Chybová zpráva: %2"
|
43
data/locale/da-DK.ini
Normal file
43
data/locale/da-DK.ini
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
OBSWebSocket.Plugin.Description="Fjernstyring af OBS Studio via WebSocket"
|
||||||
|
OBSWebSocket.Settings.DialogTitle="obs-websocket Indstillinger"
|
||||||
|
OBSWebSocket.Settings.PluginSettingsTitle="Plugin-indstillinger"
|
||||||
|
OBSWebSocket.Settings.ServerEnable="Aktivér WebSocket-server"
|
||||||
|
OBSWebSocket.Settings.AlertsEnable="Aktivér Systembakke Alarmer"
|
||||||
|
OBSWebSocket.Settings.DebugEnable="Aktivér Fejlfindingslogning"
|
||||||
|
OBSWebSocket.Settings.DebugEnableHoverText="Aktivér fejlfindingslogning for den aktuelle forekomst af OBS. Vedvarer ikke ved indlæsning.\nBrug --websocket_debug til at aktivere ved indlæsning."
|
||||||
|
OBSWebSocket.Settings.ServerSettingsTitle="Serverindstillinger"
|
||||||
|
OBSWebSocket.Settings.AuthRequired="Aktivér godkendelse"
|
||||||
|
OBSWebSocket.Settings.Password="Serveradgangskode"
|
||||||
|
OBSWebSocket.Settings.GeneratePassword="Generér adgangskode"
|
||||||
|
OBSWebSocket.Settings.ServerPort="Serverport"
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfo="Vis forbindelsesinfo"
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfoWarningTitle="Advarsel: Live i øjeblikket"
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfoWarningMessage="Det ser ud til, at et output (stream, optagelse mv.) pt. er aktiv."
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfoWarningInfoText="Sikker på, at din forbindelsesinfo skal vises?"
|
||||||
|
OBSWebSocket.Settings.Save.UserPasswordWarningTitle="Advarsel: Potentielt sikkerhedsproblem"
|
||||||
|
OBSWebSocket.Settings.Save.UserPasswordWarningMessage="obs-websocket gemmer serverens adgangskode som alm. tekst. Det anbefales kraftigt at bruge en adgangskode genereret af obs-websocket."
|
||||||
|
OBSWebSocket.Settings.Save.UserPasswordWarningInfoText="Sikker på, at din egen adgangskoder skal bruges?"
|
||||||
|
OBSWebSocket.Settings.Save.PasswordInvalidErrorTitle="Fejl: Ugyldig opsætning"
|
||||||
|
OBSWebSocket.Settings.Save.PasswordInvalidErrorMessage="En adgangskode på mindst 6 tegn skal bruges."
|
||||||
|
OBSWebSocket.SessionTable.Title="Forbundne WebSocket-sessioner"
|
||||||
|
OBSWebSocket.SessionTable.RemoteAddressColumnTitle="Fjernadresse"
|
||||||
|
OBSWebSocket.SessionTable.SessionDurationColumnTitle="Sessionsvarighed"
|
||||||
|
OBSWebSocket.SessionTable.MessagesInOutColumnTitle="Beskeder Ind/Ud"
|
||||||
|
OBSWebSocket.SessionTable.IdentifiedTitle="Identificeret"
|
||||||
|
OBSWebSocket.SessionTable.KickButtonColumnTitle="Fjern?"
|
||||||
|
OBSWebSocket.SessionTable.KickButtonText="Fjern"
|
||||||
|
OBSWebSocket.ConnectInfo.DialogTitle="WebSocket-forbindelsesinfo"
|
||||||
|
OBSWebSocket.ConnectInfo.CopyText="Kopiér"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerIp="Server-IP (bedste gæt)"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerPort="Serverport"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerPassword="Serveradgangskode"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerPasswordPlaceholderText="[Godk. deaktiveret]"
|
||||||
|
OBSWebSocket.ConnectInfo.QrTitle="Forbindelses-QR"
|
||||||
|
OBSWebSocket.TrayNotification.Identified.Title="Ny WebSocket-forbindelse"
|
||||||
|
OBSWebSocket.TrayNotification.Identified.Body="Klient %1 identificeret."
|
||||||
|
OBSWebSocket.TrayNotification.AuthenticationFailed.Title="WebSocket godkendelsesfejl"
|
||||||
|
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Klienten %1 kunne ikke godkendes."
|
||||||
|
OBSWebSocket.TrayNotification.Disconnected.Title="WebSocket-klient frakoblet"
|
||||||
|
OBSWebSocket.TrayNotification.Disconnected.Body="Klient %1 frakoblet."
|
||||||
|
OBSWebSocket.Server.StartFailed.Title="WebSocket-serverfejl"
|
||||||
|
OBSWebSocket.Server.StartFailed.Message="WebSocket-serveren started ikke. TCP-port %1 bruges måske allerede på dette system af et andet program. Prøv at angive en anden TCP-port i WebSocket-serverindstillingerne, eller stop ethvert program, der kan bruge denne port.\n Fejlmeddelelse: %2"
|
43
data/locale/de-DE.ini
Normal file
43
data/locale/de-DE.ini
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
OBSWebSocket.Plugin.Description="OBS Studio per WebSocket fernsteuern"
|
||||||
|
OBSWebSocket.Settings.DialogTitle="obs-websocket-Einstellungen"
|
||||||
|
OBSWebSocket.Settings.PluginSettingsTitle="Plugineinstellungen"
|
||||||
|
OBSWebSocket.Settings.ServerEnable="WebSocket-Server aktivieren"
|
||||||
|
OBSWebSocket.Settings.AlertsEnable="Warnungen im Infobereich aktivieren"
|
||||||
|
OBSWebSocket.Settings.DebugEnable="Debug-Logging aktivieren"
|
||||||
|
OBSWebSocket.Settings.DebugEnableHoverText="Aktiviert Debug-Logging für die aktuelle OBS-Instanz.\nVerwenden Sie „--websocket_debug“, damit die Option beim Laden aktiviert wird."
|
||||||
|
OBSWebSocket.Settings.ServerSettingsTitle="Servereinstellungen"
|
||||||
|
OBSWebSocket.Settings.AuthRequired="Authentifizierung aktivieren"
|
||||||
|
OBSWebSocket.Settings.Password="Serverpasswort"
|
||||||
|
OBSWebSocket.Settings.GeneratePassword="Passwort generieren"
|
||||||
|
OBSWebSocket.Settings.ServerPort="Serverport"
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfo="Verbindungsinformationen anzeigen"
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfoWarningTitle="Achtung: Zurzeit live"
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfoWarningMessage="Derzeit ist eine Ausgabe (Stream, Aufnahme, etc.) aktiv."
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfoWarningInfoText="Möchten Sie wirklich Ihre Verbindungsinformationen anzeigen?"
|
||||||
|
OBSWebSocket.Settings.Save.UserPasswordWarningTitle="Achtung: Mögliches Sicherheitsproblem"
|
||||||
|
OBSWebSocket.Settings.Save.UserPasswordWarningMessage="obs-websocket speichert das Serverpasswort unverschlüsselt, daher ist ein von obs-websocket generiertes Passwort sehr zu empfehlen."
|
||||||
|
OBSWebSocket.Settings.Save.UserPasswordWarningInfoText="Möchten Sie wirklich ein eigenes Passwort verwenden?"
|
||||||
|
OBSWebSocket.Settings.Save.PasswordInvalidErrorTitle="Fehler: Ungültige Konfiguration"
|
||||||
|
OBSWebSocket.Settings.Save.PasswordInvalidErrorMessage="Sie müssen ein Passwort mit mindestens 6 Zeichen verwenden."
|
||||||
|
OBSWebSocket.SessionTable.Title="Verbundene WebSocket-Sitzungen"
|
||||||
|
OBSWebSocket.SessionTable.RemoteAddressColumnTitle="Remote-Adresse"
|
||||||
|
OBSWebSocket.SessionTable.SessionDurationColumnTitle="Sitzungsdauer"
|
||||||
|
OBSWebSocket.SessionTable.MessagesInOutColumnTitle="Nachrichten rein/raus"
|
||||||
|
OBSWebSocket.SessionTable.IdentifiedTitle="Identifiziert"
|
||||||
|
OBSWebSocket.SessionTable.KickButtonColumnTitle="Entfernen?"
|
||||||
|
OBSWebSocket.SessionTable.KickButtonText="Entfernen"
|
||||||
|
OBSWebSocket.ConnectInfo.DialogTitle="WebSocket-Verbindungsinformationen"
|
||||||
|
OBSWebSocket.ConnectInfo.CopyText="Kopieren"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerIp="Server-IP (geschätzt)"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerPort="Serverport"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerPassword="Serverpasswort"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerPasswordPlaceholderText="Authentifizierung deaktiviert"
|
||||||
|
OBSWebSocket.ConnectInfo.QrTitle="QR-Code zum Verbinden"
|
||||||
|
OBSWebSocket.TrayNotification.Identified.Title="Neue WebSocket-Verbindung"
|
||||||
|
OBSWebSocket.TrayNotification.Identified.Body="Client %1 identifiziert."
|
||||||
|
OBSWebSocket.TrayNotification.AuthenticationFailed.Title="WebSocket-Authentifizierungsfehler"
|
||||||
|
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Client %1 konnte sich nicht authentifizieren."
|
||||||
|
OBSWebSocket.TrayNotification.Disconnected.Title="WebSocket-Client getrennt"
|
||||||
|
OBSWebSocket.TrayNotification.Disconnected.Body="Client %1 getrennt."
|
||||||
|
OBSWebSocket.Server.StartFailed.Title="WebSocket-Serverfehler"
|
||||||
|
OBSWebSocket.Server.StartFailed.Message="Der WebSocket-Server konnte nicht gestartet werden, da der TCP-Port %1 möglicherweise benutzt wird. Versuchen Sie, den Port in den WebSocket-Servereinstellungen zu ändern oder Anwendungen zu schließen, die diesen verwenden könnten.\nFehler: %2"
|
@ -9,14 +9,11 @@ OBSWebSocket.Settings.DebugEnable="Enable Debug Logging"
|
|||||||
OBSWebSocket.Settings.DebugEnableHoverText="Enables debug logging for the current instance of OBS. Does not persist on load.\nUse --websocket_debug to enable on load."
|
OBSWebSocket.Settings.DebugEnableHoverText="Enables debug logging for the current instance of OBS. Does not persist on load.\nUse --websocket_debug to enable on load."
|
||||||
|
|
||||||
OBSWebSocket.Settings.ServerSettingsTitle="Server Settings"
|
OBSWebSocket.Settings.ServerSettingsTitle="Server Settings"
|
||||||
OBSWebSocket.Settings.ServerPort="Server Port"
|
|
||||||
OBSWebSocket.Settings.AllowExternal="Allow External Access"
|
|
||||||
OBSWebSocket.Settings.AllowExternalHoverText="Allows clients from outside this computer to connect to obs-websocket."
|
|
||||||
OBSWebSocket.Settings.AuthRequired="Enable Authentication"
|
OBSWebSocket.Settings.AuthRequired="Enable Authentication"
|
||||||
OBSWebSocket.Settings.Password="Server Password"
|
OBSWebSocket.Settings.Password="Server Password"
|
||||||
OBSWebSocket.Settings.GeneratePassword="Generate Password"
|
OBSWebSocket.Settings.GeneratePassword="Generate Password"
|
||||||
|
OBSWebSocket.Settings.ServerPort="Server Port"
|
||||||
OBSWebSocket.Settings.ShowConnectInfo="Show Connect Info"
|
OBSWebSocket.Settings.ShowConnectInfo="Show Connect Info"
|
||||||
OBSWebSocket.Settings.ShowConnectInfoHoverText="Connect Info is not available if external connections are disabled."
|
|
||||||
OBSWebSocket.Settings.ShowConnectInfoWarningTitle="Warning: Currently Live"
|
OBSWebSocket.Settings.ShowConnectInfoWarningTitle="Warning: Currently Live"
|
||||||
OBSWebSocket.Settings.ShowConnectInfoWarningMessage="It appears that an output (stream, recording, etc.) is currently active."
|
OBSWebSocket.Settings.ShowConnectInfoWarningMessage="It appears that an output (stream, recording, etc.) is currently active."
|
||||||
OBSWebSocket.Settings.ShowConnectInfoWarningInfoText="Are you sure that you want to show your connect info?"
|
OBSWebSocket.Settings.ShowConnectInfoWarningInfoText="Are you sure that you want to show your connect info?"
|
||||||
|
43
data/locale/es-ES.ini
Normal file
43
data/locale/es-ES.ini
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
OBSWebSocket.Plugin.Description="Control remoto de OBS Studio a través de WebSocket"
|
||||||
|
OBSWebSocket.Settings.DialogTitle="Ajustes de obs-websocket"
|
||||||
|
OBSWebSocket.Settings.PluginSettingsTitle="Ajustes del plugin"
|
||||||
|
OBSWebSocket.Settings.ServerEnable="Habilitar servidor WebSocket"
|
||||||
|
OBSWebSocket.Settings.AlertsEnable="Habilitar alertas en la bandeja del sistema"
|
||||||
|
OBSWebSocket.Settings.DebugEnable="Habilitar registro de depuración"
|
||||||
|
OBSWebSocket.Settings.DebugEnableHoverText="Habilita el registro de depuración para la instancia actual de OBS. No persiste al cargar.\nUse --websocket_debug para activar al cargar."
|
||||||
|
OBSWebSocket.Settings.ServerSettingsTitle="Ajustes del servidor"
|
||||||
|
OBSWebSocket.Settings.AuthRequired="Habilitar autenticación"
|
||||||
|
OBSWebSocket.Settings.Password="Contraseña del servidor"
|
||||||
|
OBSWebSocket.Settings.GeneratePassword="Generar contraseña"
|
||||||
|
OBSWebSocket.Settings.ServerPort="Puerto del servidor"
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfo="Mostrar información de conexión"
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfoWarningTitle="Advertencia: Actualmente en directo"
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfoWarningMessage="Parece que una salida (emisión, grabación, etc.) está activa."
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfoWarningInfoText="¿Estás seguro de que quieres mostrar tu información de conexión?"
|
||||||
|
OBSWebSocket.Settings.Save.UserPasswordWarningTitle="Advertencia: Problema potencial de seguridad"
|
||||||
|
OBSWebSocket.Settings.Save.UserPasswordWarningMessage="obs-websocket almacena la contraseña del servidor como texto plano. El uso de una contraseña generada por obs-websocket es altamente recomendable."
|
||||||
|
OBSWebSocket.Settings.Save.UserPasswordWarningInfoText="¿Está seguro de que desea utilizar su propia contraseña?"
|
||||||
|
OBSWebSocket.Settings.Save.PasswordInvalidErrorTitle="Error: Configuración no válida"
|
||||||
|
OBSWebSocket.Settings.Save.PasswordInvalidErrorMessage="Debe utilizar una contraseña de 6 o más caracteres."
|
||||||
|
OBSWebSocket.SessionTable.Title="Sesiones conectadas de WebSocket"
|
||||||
|
OBSWebSocket.SessionTable.RemoteAddressColumnTitle="Dirección remota"
|
||||||
|
OBSWebSocket.SessionTable.SessionDurationColumnTitle="Duración de la sesión"
|
||||||
|
OBSWebSocket.SessionTable.MessagesInOutColumnTitle="Entrada/Salida de mensajes"
|
||||||
|
OBSWebSocket.SessionTable.IdentifiedTitle="Identificado"
|
||||||
|
OBSWebSocket.SessionTable.KickButtonColumnTitle="¿Expulsar?"
|
||||||
|
OBSWebSocket.SessionTable.KickButtonText="Expulsar"
|
||||||
|
OBSWebSocket.ConnectInfo.DialogTitle="Información de conexión de WebSocket"
|
||||||
|
OBSWebSocket.ConnectInfo.CopyText="Copiar"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerIp="IP del servidor (mejor propuesta)"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerPort="Puerto del servidor"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerPassword="Contraseña del servidor"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerPasswordPlaceholderText="[Autenticación desactivada]"
|
||||||
|
OBSWebSocket.ConnectInfo.QrTitle="QR de conexión"
|
||||||
|
OBSWebSocket.TrayNotification.Identified.Title="Nueva conexión WebSocket"
|
||||||
|
OBSWebSocket.TrayNotification.Identified.Body="Cliente %1 identificado."
|
||||||
|
OBSWebSocket.TrayNotification.AuthenticationFailed.Title="Fallo de autenticación WebSocket"
|
||||||
|
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="El cliente %1 no se pudo autenticar."
|
||||||
|
OBSWebSocket.TrayNotification.Disconnected.Title="Cliente WebSocket desconectado"
|
||||||
|
OBSWebSocket.TrayNotification.Disconnected.Body="Cliente %1 desconectado."
|
||||||
|
OBSWebSocket.Server.StartFailed.Title="Fallo del servidor WebSocket"
|
||||||
|
OBSWebSocket.Server.StartFailed.Message="El servidor WebSocket no pudo iniciarse. El puerto TCP %1 puede que ya esté en uso en otro lugar de este sistema por otra aplicación. Intente configurar un puerto TCP diferente en la configuración del servidor WebSocket o detenga cualquier aplicación que pueda estar usando este puerto.\n Mensaje de error: %2"
|
43
data/locale/et-EE.ini
Normal file
43
data/locale/et-EE.ini
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
OBSWebSocket.Plugin.Description="OBS Studio kaugjuhtimine WebSocketi kaudu"
|
||||||
|
OBSWebSocket.Settings.DialogTitle="obs-websocket seaded"
|
||||||
|
OBSWebSocket.Settings.PluginSettingsTitle="Plugina seaded"
|
||||||
|
OBSWebSocket.Settings.ServerEnable="Luba WebSocket server"
|
||||||
|
OBSWebSocket.Settings.AlertsEnable="Luba hoiatused tegumireal"
|
||||||
|
OBSWebSocket.Settings.DebugEnable="Luba silumislogimine"
|
||||||
|
OBSWebSocket.Settings.DebugEnableHoverText="Lubab OBS-i praeguse eksemplari silumislogimise. Ei püsi laadimisel.\nLaadimisel lubamiseks kasutage --websocket_debug."
|
||||||
|
OBSWebSocket.Settings.ServerSettingsTitle="Serveri seaded"
|
||||||
|
OBSWebSocket.Settings.AuthRequired="Luba autentimine"
|
||||||
|
OBSWebSocket.Settings.Password="Serveri salasõna"
|
||||||
|
OBSWebSocket.Settings.GeneratePassword="Loo salasõna"
|
||||||
|
OBSWebSocket.Settings.ServerPort="Serveri port"
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfo="Näita ühenduse infot"
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfoWarningTitle="Hoiatus: hetkel otseülekandes"
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfoWarningMessage="Näib, et väljund (voogedastus, salvestus jne) on hetkel aktiivne."
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfoWarningInfoText="Kas oled kindel, et soovid oma ühenduse teavet näidata?"
|
||||||
|
OBSWebSocket.Settings.Save.UserPasswordWarningTitle="Hoiatus: võimalik turvaprobleem"
|
||||||
|
OBSWebSocket.Settings.Save.UserPasswordWarningMessage="obs-websocket salvestab serveri salasõna lihtsa tekstina. obs-websocket'i poolt loodud salasõna kasutamine on väga soovitatav."
|
||||||
|
OBSWebSocket.Settings.Save.UserPasswordWarningInfoText="Kas oled kindel, et soovid kasutada oma salasõna?"
|
||||||
|
OBSWebSocket.Settings.Save.PasswordInvalidErrorTitle="Viga: vigane konfiguratsioon"
|
||||||
|
OBSWebSocket.Settings.Save.PasswordInvalidErrorMessage="Pead kasutama salasõna, mis koosneb 6 või enamast tähemärgist."
|
||||||
|
OBSWebSocket.SessionTable.Title="Ühendatud WebSocket'i seansid"
|
||||||
|
OBSWebSocket.SessionTable.RemoteAddressColumnTitle="Kaugjuhtimise aadress"
|
||||||
|
OBSWebSocket.SessionTable.SessionDurationColumnTitle="Seansi kestvus"
|
||||||
|
OBSWebSocket.SessionTable.MessagesInOutColumnTitle="Sõnumid sisse/välja"
|
||||||
|
OBSWebSocket.SessionTable.IdentifiedTitle="Tuvastatud"
|
||||||
|
OBSWebSocket.SessionTable.KickButtonColumnTitle="Eemalda?"
|
||||||
|
OBSWebSocket.SessionTable.KickButtonText="Eemalda"
|
||||||
|
OBSWebSocket.ConnectInfo.DialogTitle="WebSocket'i ühenduse info"
|
||||||
|
OBSWebSocket.ConnectInfo.CopyText="Kopeeri"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerIp="Serveri IP (parim oletus)"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerPort="Sreveri port"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerPassword="Serveri salasõna"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerPasswordPlaceholderText="[Autentimine keelatud]"
|
||||||
|
OBSWebSocket.ConnectInfo.QrTitle="Ühenda QR"
|
||||||
|
OBSWebSocket.TrayNotification.Identified.Title="Uus WebSocket'i ühendus"
|
||||||
|
OBSWebSocket.TrayNotification.Identified.Body="Klient %1 tuvastatud."
|
||||||
|
OBSWebSocket.TrayNotification.AuthenticationFailed.Title="WebSocket autentimise tõrge"
|
||||||
|
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Kliendi %1 autentimine ebaõnnestus."
|
||||||
|
OBSWebSocket.TrayNotification.Disconnected.Title="WebSocket kliendi ühendus katkenud"
|
||||||
|
OBSWebSocket.TrayNotification.Disconnected.Body="Kliendi %1 ühendus katkenud."
|
||||||
|
OBSWebSocket.Server.StartFailed.Title="WebSocket serveri tõrge"
|
||||||
|
OBSWebSocket.Server.StartFailed.Message="WebSocket'i serveri käivitamine ebaõnnestus. TCP-port %1 võib olla juba mujal selles süsteemis mõne teise rakenduse poolt kasutusel. Proovige määrata WebSocket'i serveri seadetes teine TCP-port või peatada rakendus, mis võib seda porti kasutada.\n Veateade: %2"
|
3
data/locale/fa-IR.ini
Normal file
3
data/locale/fa-IR.ini
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
OBSWebSocket.SessionTable.KickButtonColumnTitle="لگد زدن؟"
|
||||||
|
OBSWebSocket.SessionTable.KickButtonText="اخراج"
|
||||||
|
OBSWebSocket.ConnectInfo.CopyText="رونوشت"
|
43
data/locale/fi-FI.ini
Normal file
43
data/locale/fi-FI.ini
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
OBSWebSocket.Plugin.Description="OBS Studion etähallinta WebSocketin kautta"
|
||||||
|
OBSWebSocket.Settings.DialogTitle="obs-websocketin asetukset"
|
||||||
|
OBSWebSocket.Settings.PluginSettingsTitle="Liitännäisen asetukset"
|
||||||
|
OBSWebSocket.Settings.ServerEnable="Ota WebSocket-palvelin käyttöön"
|
||||||
|
OBSWebSocket.Settings.AlertsEnable="Ota ilmoitusalueen ilmoitukset käyttöön"
|
||||||
|
OBSWebSocket.Settings.DebugEnable="Ota vianjäljityslokitus käyttöön"
|
||||||
|
OBSWebSocket.Settings.DebugEnableHoverText="Ottaa käyttöön OBS:n virheenkorjauksen lokin. Ei kuormituksen aikana.\nKäytä --websocket_debug ottaaksesi latauksen käyttöön."
|
||||||
|
OBSWebSocket.Settings.ServerSettingsTitle="Palvelimen asetukset"
|
||||||
|
OBSWebSocket.Settings.AuthRequired="Ota tunnistautuminen käyttöön"
|
||||||
|
OBSWebSocket.Settings.Password="Palvelimen salasana"
|
||||||
|
OBSWebSocket.Settings.GeneratePassword="Luo salasana"
|
||||||
|
OBSWebSocket.Settings.ServerPort="Palvelimen portti"
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfo="Näytä yhteyden tiedot"
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfoWarningTitle="Varoitus: Suora lähetys"
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfoWarningMessage="Näyttää siltä, että jokin lähetys (suoratoisto, tallennus jne.) on tällä hetkellä aktiivinen."
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfoWarningInfoText="Oletko varma, että haluat näyttää sinun yhteyden tiedot?"
|
||||||
|
OBSWebSocket.Settings.Save.UserPasswordWarningTitle="Varoitus: Mahdollinen tietoturvaongelma"
|
||||||
|
OBSWebSocket.Settings.Save.UserPasswordWarningMessage="obs-websocket tallentaa palvelimen salasanan pelkkänä tekstinä. Obs-websocketin luoman salasanan käyttäminen on erittäin suositeltavaa."
|
||||||
|
OBSWebSocket.Settings.Save.UserPasswordWarningInfoText="Haluatko varmasti käyttää omaa salasanaasi?"
|
||||||
|
OBSWebSocket.Settings.Save.PasswordInvalidErrorTitle="Virhe: Virheellinen määritys"
|
||||||
|
OBSWebSocket.Settings.Save.PasswordInvalidErrorMessage="Sinun täytyy käyttää salasanaa, jossa on vähintään 6 merkkiä."
|
||||||
|
OBSWebSocket.SessionTable.Title="Yhdistetyt WebSocket-istunnot"
|
||||||
|
OBSWebSocket.SessionTable.RemoteAddressColumnTitle="Etäosoite"
|
||||||
|
OBSWebSocket.SessionTable.SessionDurationColumnTitle="Istunnon kesto"
|
||||||
|
OBSWebSocket.SessionTable.MessagesInOutColumnTitle="Viestejä sisään/ulos"
|
||||||
|
OBSWebSocket.SessionTable.IdentifiedTitle="Tunnistettu"
|
||||||
|
OBSWebSocket.SessionTable.KickButtonColumnTitle="Potki?"
|
||||||
|
OBSWebSocket.SessionTable.KickButtonText="Potki"
|
||||||
|
OBSWebSocket.ConnectInfo.DialogTitle="WebSocket-yhteystiedot"
|
||||||
|
OBSWebSocket.ConnectInfo.CopyText="Kopioi"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerIp="Palvelimen IP (paras arvaus)"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerPort="Palvelimen portti"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerPassword="Palvelimen salasana"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerPasswordPlaceholderText="[Todennus poistettu]"
|
||||||
|
OBSWebSocket.ConnectInfo.QrTitle="Yhdistä QR"
|
||||||
|
OBSWebSocket.TrayNotification.Identified.Title="Uusi WebSocket-yhteys"
|
||||||
|
OBSWebSocket.TrayNotification.Identified.Body="Asiakas %1 tunnistettu."
|
||||||
|
OBSWebSocket.TrayNotification.AuthenticationFailed.Title="WebSocket-tunnistusvirhe"
|
||||||
|
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Asiakas %1 todennus epäonnistui."
|
||||||
|
OBSWebSocket.TrayNotification.Disconnected.Title="WebSocket-asiakas katkaisi yhteyden"
|
||||||
|
OBSWebSocket.TrayNotification.Disconnected.Body="Asiakas %1 on katkaistu."
|
||||||
|
OBSWebSocket.Server.StartFailed.Title="WebSocket-palvelinvirhe"
|
||||||
|
OBSWebSocket.Server.StartFailed.Message="WebSocket-palvelin ei käynnistynyt. TCP-portti %1 saattaa olla jo toisen sovelluksen käytössä. Yritä määrittää toinen TCP-portti WebSocket-palvelimen asetuksissa tai lopeta kaikki sovellukset, jotka saattavat käyttää tätä porttia.\nVirheilmoitus: %2"
|
43
data/locale/fr-FR.ini
Normal file
43
data/locale/fr-FR.ini
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
OBSWebSocket.Plugin.Description="Contrôle à distance d'OBS Studio via WebSocket"
|
||||||
|
OBSWebSocket.Settings.DialogTitle="Paramètre du websocket obs"
|
||||||
|
OBSWebSocket.Settings.PluginSettingsTitle="Paramètres du plugin"
|
||||||
|
OBSWebSocket.Settings.ServerEnable="Activer le serveur WebSocket"
|
||||||
|
OBSWebSocket.Settings.AlertsEnable="Activer les alertes de la zone de notification"
|
||||||
|
OBSWebSocket.Settings.DebugEnable="Activer les journaux de débogage"
|
||||||
|
OBSWebSocket.Settings.DebugEnableHoverText="Active la journalisation du débogage pour l'instance actuelle d'OBS. Ne persiste pas au chargement.\nUtilisez --websocket_debug pour l'activer lors du chargement."
|
||||||
|
OBSWebSocket.Settings.ServerSettingsTitle="Paramètres du serveur"
|
||||||
|
OBSWebSocket.Settings.AuthRequired="Utiliser l'authentification"
|
||||||
|
OBSWebSocket.Settings.Password="Mot de passe du serveur"
|
||||||
|
OBSWebSocket.Settings.GeneratePassword="Générer un mot de passe"
|
||||||
|
OBSWebSocket.Settings.ServerPort="Port du serveur"
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfo="Afficher les informations de connexion"
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfoWarningTitle="Avertissement : Actuellement en direct"
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfoWarningMessage="Il semble qu'une sortie (stream, enregistrement, etc.) soit actuellement active."
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfoWarningInfoText="Êtes-vous sûr de vouloir afficher vos informations de connexion ?"
|
||||||
|
OBSWebSocket.Settings.Save.UserPasswordWarningTitle="Avertissement : Problème potentiel de sécurité"
|
||||||
|
OBSWebSocket.Settings.Save.UserPasswordWarningMessage="obs-websocket enregistre le mot de passe du serveur en texte brut. L'utilisation d'un mot de passe généré par obs-websocket est fortement recommandée."
|
||||||
|
OBSWebSocket.Settings.Save.UserPasswordWarningInfoText="Êtes-vous sûr de vouloir utiliser votre propre mot de passe ?"
|
||||||
|
OBSWebSocket.Settings.Save.PasswordInvalidErrorTitle="Erreur : Configuration invalide"
|
||||||
|
OBSWebSocket.Settings.Save.PasswordInvalidErrorMessage="Vous devez utiliser un mot de passe d'au moins 6 caractères"
|
||||||
|
OBSWebSocket.SessionTable.Title="Sessions WebSocket connectées"
|
||||||
|
OBSWebSocket.SessionTable.RemoteAddressColumnTitle="Adresse distante"
|
||||||
|
OBSWebSocket.SessionTable.SessionDurationColumnTitle="Durée de session"
|
||||||
|
OBSWebSocket.SessionTable.MessagesInOutColumnTitle="Messages entrant/sortant"
|
||||||
|
OBSWebSocket.SessionTable.IdentifiedTitle="Identifié"
|
||||||
|
OBSWebSocket.SessionTable.KickButtonColumnTitle="Expulser ?"
|
||||||
|
OBSWebSocket.SessionTable.KickButtonText="Expulser"
|
||||||
|
OBSWebSocket.ConnectInfo.DialogTitle="Informations de connexion WebSocket"
|
||||||
|
OBSWebSocket.ConnectInfo.CopyText="Copier"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerIp="IP du serveur (meilleure estimation)"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerPort="Port serveur"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerPassword="Mot de passe serveur"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerPasswordPlaceholderText="[Authentification désactivée]"
|
||||||
|
OBSWebSocket.ConnectInfo.QrTitle="QR code de connexion"
|
||||||
|
OBSWebSocket.TrayNotification.Identified.Title="Nouvelle connexion WebSocket"
|
||||||
|
OBSWebSocket.TrayNotification.Identified.Body="Client %1 identifié."
|
||||||
|
OBSWebSocket.TrayNotification.AuthenticationFailed.Title="Échec de l'authentification WebSocket"
|
||||||
|
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Échec d'authentification du client %1."
|
||||||
|
OBSWebSocket.TrayNotification.Disconnected.Title="Client WebSocket déconnecté"
|
||||||
|
OBSWebSocket.TrayNotification.Disconnected.Body="Client %1 déconnecté."
|
||||||
|
OBSWebSocket.Server.StartFailed.Title="Échec du serveur WebSocket"
|
||||||
|
OBSWebSocket.Server.StartFailed.Message="Le serveur WebSocket n'a pas pu démarrer. Le port TCP %1 est peut être déjà utilisé par une autre application ailleurs sur ce système. Essayez de définir un port TCP différent dans les paramètres du serveur WebSocket, ou arrêtez toute application qui pourrait utiliser ce port.\n Message d'erreur : %2"
|
43
data/locale/he-IL.ini
Normal file
43
data/locale/he-IL.ini
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
OBSWebSocket.Plugin.Description="שליטה מרחוק על OBS Studio באמצעות WebSocket"
|
||||||
|
OBSWebSocket.Settings.DialogTitle="הגדרות obs-websocket"
|
||||||
|
OBSWebSocket.Settings.PluginSettingsTitle="הגדרות תוסף"
|
||||||
|
OBSWebSocket.Settings.ServerEnable="הפעלת שרת WebSocket"
|
||||||
|
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="הפעלות 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 נכשל בהפעלה. ייתכן שפורט TCP %1 כבר נמצא בשימוש במקום אחר במערכת זו על ידי יישום אחר. יש לנסות להגדיר פורט TCP אחר בהגדרות שרת WebSocket, או לעצור כל יישום שעשוי להשתמש בפורט זה.\nהודעת שגיאה: %2"
|
43
data/locale/hi-IN.ini
Normal file
43
data/locale/hi-IN.ini
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
OBSWebSocket.Plugin.Description="WebSocket के माध्यम से OBS स्टूडियो का रिमोट-कंट्रोल"
|
||||||
|
OBSWebSocket.Settings.DialogTitle="obs-websocket सेटिंग्स"
|
||||||
|
OBSWebSocket.Settings.PluginSettingsTitle="प्लगइन सेटिंग्स"
|
||||||
|
OBSWebSocket.Settings.ServerEnable="WebSocket सर्वर सक्षम करें"
|
||||||
|
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.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="वेबसॉकेट क्लाइंट डिस्कनेक्ट हो गया"
|
||||||
|
OBSWebSocket.TrayNotification.Disconnected.Body="क्लाइंट %1 डिस्कनेक्ट हो गया."
|
||||||
|
OBSWebSocket.Server.StartFailed.Title="वेबसॉकेट सर्वर विफलता"
|
||||||
|
OBSWebSocket.Server.StartFailed.Message="WebSocket सर्वर प्रारंभ करने में विफल रहा. TCP पोर्ट %1 पहले से ही इस सिस्टम पर किसी अन्य एप्लिकेशन द्वारा कहीं और उपयोग में हो सकता है. वेबसॉकेट सर्वर सेटिंग्स में एक अलग TCP पोर्ट सेट करने का प्रयास करें, या इस पोर्ट का उपयोग करने वाले किसी भी एप्लिकेशन को रोकें.\n त्रुटि संदेश : %2"
|
43
data/locale/hu-HU.ini
Normal file
43
data/locale/hu-HU.ini
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
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.PluginSettingsTitle="Bővítménybeállítások"
|
||||||
|
OBSWebSocket.Settings.ServerEnable="WebSocket-kiszolgáló engedélyezése"
|
||||||
|
OBSWebSocket.Settings.AlertsEnable="Rendszertálca-riasztások bekapcsolása"
|
||||||
|
OBSWebSocket.Settings.DebugEnable="Hibakeresési naplózás bekapcsolása"
|
||||||
|
OBSWebSocket.Settings.DebugEnableHoverText="Bekapcsolja a hibakeresési naplózást a jelenlegi OBS-példánynál. Betöltéskor nem marad meg.\nA betöltéskor történő bekapcsoláshoz használja a --websocket_debug kapcsolót."
|
||||||
|
OBSWebSocket.Settings.ServerSettingsTitle="Kiszolgálóbeállítások"
|
||||||
|
OBSWebSocket.Settings.AuthRequired="Hitelesítés bekapcsolása"
|
||||||
|
OBSWebSocket.Settings.Password="Kiszolgáló jelszava"
|
||||||
|
OBSWebSocket.Settings.GeneratePassword="Jelszó előállítása"
|
||||||
|
OBSWebSocket.Settings.ServerPort="Kiszolgáló portja"
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfo="Kapcsolódási információ megjelenítése"
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfoWarningTitle="Figyelmeztetés: Élő adásban van"
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfoWarningMessage="Úgy néz ki, hogy egy kimenet (közvetítés, felvétel, stb.) jelenleg aktív."
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfoWarningInfoText="Biztos, hogy megjeleníti a kapcsolódási információkat?"
|
||||||
|
OBSWebSocket.Settings.Save.UserPasswordWarningTitle="Figyelmeztetés: lehetséges biztonsági probléma"
|
||||||
|
OBSWebSocket.Settings.Save.UserPasswordWarningMessage="Az obs-websocket titkosítatlan szövegként tárolja a kiszolgáló jelszavát. Ajánlatos egy az obs-websocket általelőállított jelsztó használni."
|
||||||
|
OBSWebSocket.Settings.Save.UserPasswordWarningInfoText="Biztos, hogy a saját jelszavát használja?"
|
||||||
|
OBSWebSocket.Settings.Save.PasswordInvalidErrorTitle="Hiba: Érvénytelen konfiguráció"
|
||||||
|
OBSWebSocket.Settings.Save.PasswordInvalidErrorMessage="Legalább 6 karakterből álló jelszót kell használnia."
|
||||||
|
OBSWebSocket.SessionTable.Title="Kapcsolódott WebSocket munkamenetek"
|
||||||
|
OBSWebSocket.SessionTable.RemoteAddressColumnTitle="Távoli cím"
|
||||||
|
OBSWebSocket.SessionTable.SessionDurationColumnTitle="Munkamenet hossza"
|
||||||
|
OBSWebSocket.SessionTable.MessagesInOutColumnTitle="Bejövő és kimenő üzenetek"
|
||||||
|
OBSWebSocket.SessionTable.IdentifiedTitle="Azonosított"
|
||||||
|
OBSWebSocket.SessionTable.KickButtonColumnTitle="Kirúgás?"
|
||||||
|
OBSWebSocket.SessionTable.KickButtonText="Kirúgás"
|
||||||
|
OBSWebSocket.ConnectInfo.DialogTitle="WebSocket kapcsolati információk"
|
||||||
|
OBSWebSocket.ConnectInfo.CopyText="Másolás"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerIp="Kiszolgáló IP (legjobb tipp)"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerPort="Kiszolgáló portja"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerPassword="Kiszolgáló jelszava"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerPasswordPlaceholderText="[Hitelesítés kikapcsolva]"
|
||||||
|
OBSWebSocket.ConnectInfo.QrTitle="Kapcsolódási QR-kód"
|
||||||
|
OBSWebSocket.TrayNotification.Identified.Title="Új WebSocket-kapcsolat"
|
||||||
|
OBSWebSocket.TrayNotification.Identified.Body="A(z) %1 kliens azonosítva."
|
||||||
|
OBSWebSocket.TrayNotification.AuthenticationFailed.Title="WebSocket hitelesítési hiba"
|
||||||
|
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="A(z) %1 kliens hitelesítése sikertelen."
|
||||||
|
OBSWebSocket.TrayNotification.Disconnected.Title="A WebSocket-kliens bontotta a kapcsolatot"
|
||||||
|
OBSWebSocket.TrayNotification.Disconnected.Body="A(z) %1 kliens bontotta a kapcsolatot"
|
||||||
|
OBSWebSocket.Server.StartFailed.Title="WebSocket kiszolgálóhiba"
|
||||||
|
OBSWebSocket.Server.StartFailed.Message="A WebSocket-kiszolgáló nem tudott elindulni. A(z) %1 TCP-portot lehet, hogy már egy másik alkalmazás használja. Próbáljon eltérő TCP-portot beállítani a WebSocket-kiszolgáló beállítasaiban, vagy állítson le minden olyan alkalmazást, amely ezt a portot használhatja.\n Hibaüzenet: %2"
|
43
data/locale/hy-AM.ini
Normal file
43
data/locale/hy-AM.ini
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
OBSWebSocket.Plugin.Description="OBS Studio-ի հեռակառավարումը WebSocket-ի միջոցով"
|
||||||
|
OBSWebSocket.Settings.DialogTitle="obs-websocket կարգավորումներ"
|
||||||
|
OBSWebSocket.Settings.PluginSettingsTitle="Միացնիչի կարգավորումներ"
|
||||||
|
OBSWebSocket.Settings.ServerEnable="Միացնել WebSocket սերվերը"
|
||||||
|
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-websock-ի կողմից ստեղծված գաղտնաբառը:"
|
||||||
|
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="Սերվերի ԻԱ (լավագույն ենթադրություն)"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerPort="Սերվերի պորտ"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerPassword="Սերվերի գաղտնաբառը"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerPasswordPlaceholderText="[Թույլտվությունն անջատված է]"
|
||||||
|
OBSWebSocket.ConnectInfo.QrTitle="Միացման ԱԱ կոդը"
|
||||||
|
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="Չհաջողվեց գործարկել WebSockt սերվերը: Հնարավոր է, որ TCP %1 պորտն արդեն օգտագործվում է մեկ այլ հավելվածի կողմից: Փորձեք կարգավորել այլ TCP պորտ WebSocket սերվերի կարգավորումներում կամ դադարեցնել ցանկացած ծրագիր, որը կարող է օգտագործել այս պորտը:\n Սխալի հաղորդագրություն՝ %2։"
|
43
data/locale/id-ID.ini
Normal file
43
data/locale/id-ID.ini
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
OBSWebSocket.Plugin.Description="Kendali jarak jauh OBS Studio melalui WebSocket"
|
||||||
|
OBSWebSocket.Settings.DialogTitle="Pengaturan obs-websocket"
|
||||||
|
OBSWebSocket.Settings.PluginSettingsTitle="Pengaturan Plugin"
|
||||||
|
OBSWebSocket.Settings.ServerEnable="Aktifkan server WebSocket"
|
||||||
|
OBSWebSocket.Settings.AlertsEnable="Aktifkan Peringatan Baki Sistem"
|
||||||
|
OBSWebSocket.Settings.DebugEnable="Aktifkan Pencatatan Awakutu"
|
||||||
|
OBSWebSocket.Settings.DebugEnableHoverText="Aktifkan pencatatan awakutu untuk permintaan OBS saat ini. Tidak terus aktif saat memuat.\nGunakan --websocket_debug agar diaktifkan saat memuat."
|
||||||
|
OBSWebSocket.Settings.ServerSettingsTitle="Pengaturan Server"
|
||||||
|
OBSWebSocket.Settings.AuthRequired="Aktifkan Autentikasi"
|
||||||
|
OBSWebSocket.Settings.Password="Kata Sandi Server"
|
||||||
|
OBSWebSocket.Settings.GeneratePassword="Ciptakan Kata Sandi"
|
||||||
|
OBSWebSocket.Settings.ServerPort="Port Server"
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfo="Tampilkan Informasi Koneksi"
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfoWarningTitle="Peringatan: Saat Ini Siaran Langsung"
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfoWarningMessage="Sepertinya sebuah output (stream, rekaman, dll.) sedang aktif."
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfoWarningInfoText="Anda yakin ingin melihat informasi koneksi Anda?"
|
||||||
|
OBSWebSocket.Settings.Save.UserPasswordWarningTitle="Peringatan: Potensi Masalah Keamanan"
|
||||||
|
OBSWebSocket.Settings.Save.UserPasswordWarningMessage="obs-websocket menyimpan kata sandi server sebagai teks biasa. Sangat disarankan untuk menggunakan kata sandi yang diciptakan oleh obs-websocket."
|
||||||
|
OBSWebSocket.Settings.Save.UserPasswordWarningInfoText="Anda yakin ingin menggunakan kata sandi Anda sendiri?"
|
||||||
|
OBSWebSocket.Settings.Save.PasswordInvalidErrorTitle="Galat: Konfigurasi Tidak Berlaku"
|
||||||
|
OBSWebSocket.Settings.Save.PasswordInvalidErrorMessage="Anda harus menggunakan kata sandi yang minimal 6 karakter atau lebih."
|
||||||
|
OBSWebSocket.SessionTable.Title="Sesi WebSocket yang Terhubung"
|
||||||
|
OBSWebSocket.SessionTable.RemoteAddressColumnTitle="Alamat Kendali"
|
||||||
|
OBSWebSocket.SessionTable.SessionDurationColumnTitle="Durasi Sesi"
|
||||||
|
OBSWebSocket.SessionTable.MessagesInOutColumnTitle="Pesan Masuk/Keluar"
|
||||||
|
OBSWebSocket.SessionTable.IdentifiedTitle="Teridentifikasi"
|
||||||
|
OBSWebSocket.SessionTable.KickButtonColumnTitle="Putuskan?"
|
||||||
|
OBSWebSocket.SessionTable.KickButtonText="Putuskan"
|
||||||
|
OBSWebSocket.ConnectInfo.DialogTitle="Informasi Koneksi WebSocket"
|
||||||
|
OBSWebSocket.ConnectInfo.CopyText="Salin"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerIp="IP Server (Tebakan Terbaik)"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerPort="Port Server"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerPassword="Kata Sandi Server"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerPasswordPlaceholderText="[Autentikasi Dinonaktifkan]"
|
||||||
|
OBSWebSocket.ConnectInfo.QrTitle="Hubungkan QR"
|
||||||
|
OBSWebSocket.TrayNotification.Identified.Title="Koneksi WebSocket Baru"
|
||||||
|
OBSWebSocket.TrayNotification.Identified.Body="Klien %1 teridentifikasi."
|
||||||
|
OBSWebSocket.TrayNotification.AuthenticationFailed.Title="Autentikasi WebSocket Gagal"
|
||||||
|
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Klien %1 gagal mengautentikasi."
|
||||||
|
OBSWebSocket.TrayNotification.Disconnected.Title="Klien WebSocket Terputus"
|
||||||
|
OBSWebSocket.TrayNotification.Disconnected.Body="Klien %1 terputus."
|
||||||
|
OBSWebSocket.Server.StartFailed.Title="Server WebSocket Gagal"
|
||||||
|
OBSWebSocket.Server.StartFailed.Message="Server WebSocket gagal untuk memulai. Port TCP %1 mungkin sudah digunakan siapa pun pada sistem ini oleh aplikasi lain. Coba atur port TCP yang berbeda di pengaturan server WebSocket, atau hentikan aplikasi apapun yang bisa menggunakan port ini.\n Pesan galat: %2"
|
43
data/locale/it-IT.ini
Normal file
43
data/locale/it-IT.ini
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
OBSWebSocket.Plugin.Description="Controllo remoto di OBS Studio tramite WebSocket"
|
||||||
|
OBSWebSocket.Settings.DialogTitle="Impostazioni obs-websocket"
|
||||||
|
OBSWebSocket.Settings.PluginSettingsTitle="Impostazioni del plugin"
|
||||||
|
OBSWebSocket.Settings.ServerEnable="Abilita il server WebSocket"
|
||||||
|
OBSWebSocket.Settings.AlertsEnable="Abilita avvisi sulla barra delle applicazioni"
|
||||||
|
OBSWebSocket.Settings.DebugEnable="Abilita registrazione debug"
|
||||||
|
OBSWebSocket.Settings.DebugEnableHoverText="Abilita la registrazione debug per l'istanza attuale di OBS.\nNon rimane attiva per il prossimo caricamento.\nUsa --websocket_debug per abilitarla al caricamento."
|
||||||
|
OBSWebSocket.Settings.ServerSettingsTitle="Impostazioni server"
|
||||||
|
OBSWebSocket.Settings.AuthRequired="Abilita autenticazione"
|
||||||
|
OBSWebSocket.Settings.Password="Password server"
|
||||||
|
OBSWebSocket.Settings.GeneratePassword="Genera password"
|
||||||
|
OBSWebSocket.Settings.ServerPort="Porta server"
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfo="Visualizza informazioni di connessione"
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfoWarningTitle="Attenzione: attualmente in diretta"
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfoWarningMessage="Sembra che sia attualmente attivo un output (stream, registrazione, ecc.)."
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfoWarningInfoText="Sei sicuro di voler visualizzare le tue informazioni di connessione?"
|
||||||
|
OBSWebSocket.Settings.Save.UserPasswordWarningTitle="Avvertimento: potenziale problema di sicurezza"
|
||||||
|
OBSWebSocket.Settings.Save.UserPasswordWarningMessage="obs-websocket memorizza la password del server come testo normale.\nTi consigliamo vivamente di usare una password generata da obs-websocket."
|
||||||
|
OBSWebSocket.Settings.Save.UserPasswordWarningInfoText="Sei sicuro di voler usare la tua password?"
|
||||||
|
OBSWebSocket.Settings.Save.PasswordInvalidErrorTitle="Errore: configurazione non valida"
|
||||||
|
OBSWebSocket.Settings.Save.PasswordInvalidErrorMessage="È necessario usare una password di 6 o più caratteri."
|
||||||
|
OBSWebSocket.SessionTable.Title="Sessioni WebSocket connesse"
|
||||||
|
OBSWebSocket.SessionTable.RemoteAddressColumnTitle="Indirizzo remoto"
|
||||||
|
OBSWebSocket.SessionTable.SessionDurationColumnTitle="Durata sessione"
|
||||||
|
OBSWebSocket.SessionTable.MessagesInOutColumnTitle="Messaggi in entrata/uscita"
|
||||||
|
OBSWebSocket.SessionTable.IdentifiedTitle="Identificato"
|
||||||
|
OBSWebSocket.SessionTable.KickButtonColumnTitle="Chiudere?"
|
||||||
|
OBSWebSocket.SessionTable.KickButtonText="Chiudi"
|
||||||
|
OBSWebSocket.ConnectInfo.DialogTitle="Informazioni sulla connessione WebSocket"
|
||||||
|
OBSWebSocket.ConnectInfo.CopyText="Copia"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerIp="IP server (miglior ipotesi)"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerPort="Porta server"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerPassword="Password server"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerPasswordPlaceholderText="[Autorizzazione disabilitata]"
|
||||||
|
OBSWebSocket.ConnectInfo.QrTitle="QR connessione"
|
||||||
|
OBSWebSocket.TrayNotification.Identified.Title="Nuova connessione WebSocket"
|
||||||
|
OBSWebSocket.TrayNotification.Identified.Body="Identificato client %1."
|
||||||
|
OBSWebSocket.TrayNotification.AuthenticationFailed.Title="Errore di autenticazione WebSocket"
|
||||||
|
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Il client %1 non è riuscito ad autenticarsi."
|
||||||
|
OBSWebSocket.TrayNotification.Disconnected.Title="Client WebSocket disconnesso"
|
||||||
|
OBSWebSocket.TrayNotification.Disconnected.Body="Client %1 disconnesso."
|
||||||
|
OBSWebSocket.Server.StartFailed.Title="Errore del server WebSocket"
|
||||||
|
OBSWebSocket.Server.StartFailed.Message="Impossibile avviare il server WebSocket.\nLa porta TCP %1 potrebbe essere già usata in questo sistema da un'altra applicazione.\nProva a impostare nelle impostazioni del server WebSocket una porta TCP diversa oppure interrompi qualsiasi applicazione che potrebbe usare questa porta.\nMessaggio di errore: %2."
|
43
data/locale/ja-JP.ini
Normal file
43
data/locale/ja-JP.ini
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
OBSWebSocket.Plugin.Description="WebSocketを介したOBS Studioのリモートコントロール"
|
||||||
|
OBSWebSocket.Settings.DialogTitle="obs-websocket設定"
|
||||||
|
OBSWebSocket.Settings.PluginSettingsTitle="プラグイン設定"
|
||||||
|
OBSWebSocket.Settings.ServerEnable="WebSocketサーバーを有効にする"
|
||||||
|
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="接続されているWebSocketセッション"
|
||||||
|
OBSWebSocket.SessionTable.RemoteAddressColumnTitle="リモートアドレス"
|
||||||
|
OBSWebSocket.SessionTable.SessionDurationColumnTitle="セッション時間"
|
||||||
|
OBSWebSocket.SessionTable.MessagesInOutColumnTitle="メッセージ In/Out"
|
||||||
|
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サーバーの起動に失敗しました。TCPポート %1 はこのシステム上の他の場所で別のアプリケーションによって既に使用されている可能性があります。 WebSocketサーバーの設定で別のTCPポートを設定するか、このポートを使用している可能性のあるアプリケーションを終了してください。\n エラーメッセージ: %2"
|
43
data/locale/ka-GE.ini
Normal file
43
data/locale/ka-GE.ini
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
OBSWebSocket.Plugin.Description="OBS Studio-ს დაშორებულად მართვა WebSocket-ით"
|
||||||
|
OBSWebSocket.Settings.DialogTitle="obs-websocket-პარამეტრები"
|
||||||
|
OBSWebSocket.Settings.PluginSettingsTitle="მოდულის პარამეტრები"
|
||||||
|
OBSWebSocket.Settings.ServerEnable="WebSocket-სერვერის ჩართვა"
|
||||||
|
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="დაკავშირებული 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-სერვერი ვერ ამუშავდა. TCP-პორტი %1 შეიძლება უკვე გამოიყენება სისტემაში სხვა პროგამის მიერ. მოსინჯეთ განსხვავებული TCP-პორტი WebSocket-სერვერის პარამეტრებში ან გათიშეთ ყველა პროგრამა, რომელიც ამ პორტს უნდა იყენებდეს.\n შეცდომის აღწერა: %2"
|
43
data/locale/kmr-TR.ini
Normal file
43
data/locale/kmr-TR.ini
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
OBSWebSocket.Plugin.Description="Rêveberina ji dûr ve ya OBS Studio bi riya WebSocket"
|
||||||
|
OBSWebSocket.Settings.DialogTitle="Sazkariyên obs-websocket"
|
||||||
|
OBSWebSocket.Settings.PluginSettingsTitle="Sazkariyên pêvekê"
|
||||||
|
OBSWebSocket.Settings.ServerEnable="Rajekarê WebSocket çalak bike"
|
||||||
|
OBSWebSocket.Settings.AlertsEnable="Hişyariyên darika pergalê çalak bike"
|
||||||
|
OBSWebSocket.Settings.DebugEnable="Têketinê serrastkirinê çalak bike"
|
||||||
|
OBSWebSocket.Settings.DebugEnableHoverText="Têketinê serrastkirinê çalak bike ji bo danişîna heyî ya OBS. Li ser barkirinê nadomîne.\nBikaranîna --websocket_debug rê dide bo çalakkirina barkirinê."
|
||||||
|
OBSWebSocket.Settings.ServerSettingsTitle="Sazkariyên rajekar"
|
||||||
|
OBSWebSocket.Settings.AuthRequired="Rastandinê çalak bike"
|
||||||
|
OBSWebSocket.Settings.Password="Borînpeyva rajekar"
|
||||||
|
OBSWebSocket.Settings.GeneratePassword="Borînpeyvê çê bike"
|
||||||
|
OBSWebSocket.Settings.ServerPort="Dergeha rajekar"
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfo="Zanyariyên girêdanê nîşan bide"
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfoWarningTitle="Hişyarî: Weşan zindî ye"
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfoWarningMessage="Xuye dike ku deraneke (weşan, tomarkirin, hwd.) niha çalak e."
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfoWarningInfoText="Ma tu bi rastî dixwazî zanyariya girêdana xwe nîşan bidî?"
|
||||||
|
OBSWebSocket.Settings.Save.UserPasswordWarningTitle="Hişyarî: Pirsgirêka ewlekariya potansiyel"
|
||||||
|
OBSWebSocket.Settings.Save.UserPasswordWarningMessage="obs-websocket borînpeyva rajekarê wekî nivîsek sade hiltîne. Bikaranîna borînpeyva ku ji hêla obs-websocket ve hatî çêkirin pir tê pêşniyar kirin."
|
||||||
|
OBSWebSocket.Settings.Save.UserPasswordWarningInfoText="Ma tu dixwazî ku borînpeyva xwe bi kar bînî?"
|
||||||
|
OBSWebSocket.Settings.Save.PasswordInvalidErrorTitle="Çewtî: Pevsazkirin ne derbasdar e"
|
||||||
|
OBSWebSocket.Settings.Save.PasswordInvalidErrorMessage="Divê tu borînpeyvekê bi kar bînî ku ji 6 an jî bêtir tîpan be."
|
||||||
|
OBSWebSocket.SessionTable.Title="Danişînên WebSocket ên girêdayî"
|
||||||
|
OBSWebSocket.SessionTable.RemoteAddressColumnTitle="Navnîşana ji dûr ve"
|
||||||
|
OBSWebSocket.SessionTable.SessionDurationColumnTitle="Dirêjahiya danişînê"
|
||||||
|
OBSWebSocket.SessionTable.MessagesInOutColumnTitle="Peyamên Çûyî/Hatî"
|
||||||
|
OBSWebSocket.SessionTable.IdentifiedTitle="Naskirî"
|
||||||
|
OBSWebSocket.SessionTable.KickButtonColumnTitle="Derxîne?"
|
||||||
|
OBSWebSocket.SessionTable.KickButtonText="Derxîne"
|
||||||
|
OBSWebSocket.ConnectInfo.DialogTitle="Zanyariyên girêdanê WebSocket"
|
||||||
|
OBSWebSocket.ConnectInfo.CopyText="Jê bigire"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerIp="IP ya rajekar (Çêtirîn texmîn)"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerPort="Dergeha rajekar"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerPassword="Borînpeyva rajekar"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerPasswordPlaceholderText="[Rastandin neçalak e]"
|
||||||
|
OBSWebSocket.ConnectInfo.QrTitle="QR girê bide"
|
||||||
|
OBSWebSocket.TrayNotification.Identified.Title="Girêdana bû ya WebSocket"
|
||||||
|
OBSWebSocket.TrayNotification.Identified.Body="Rajegir %1 hate naskirin."
|
||||||
|
OBSWebSocket.TrayNotification.AuthenticationFailed.Title="Rastandina WebSocket têk çû"
|
||||||
|
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Rastandina rajegir %1 têk çû."
|
||||||
|
OBSWebSocket.TrayNotification.Disconnected.Title="Girêdana rajegira WebSocket qut bû"
|
||||||
|
OBSWebSocket.TrayNotification.Disconnected.Body="Girêdana rajegir %1 qut bû."
|
||||||
|
OBSWebSocket.Server.StartFailed.Title="Rajekara WebSocket têk çû"
|
||||||
|
OBSWebSocket.Server.StartFailed.Message="Destpêkirina rajekara WebSocket têk çû. Dibe ku dergeha TCP %1 jixwe ji hêla sepaneke din ve li cîhek din li ser vê pergalê were bikaranîn. Kontrol bike ku di sazkariyên rajekara WebSocket de dergehek TCP a cuda saz bikî, an jî sepanek ku dikare vê dergehê bi kar bîne rawestîne.\n Peyama çewtiyê: %2"
|
43
data/locale/ko-KR.ini
Normal file
43
data/locale/ko-KR.ini
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
OBSWebSocket.Plugin.Description="WebSocket으로 OBS Studio를 원격 제어"
|
||||||
|
OBSWebSocket.Settings.DialogTitle="obs-websocket 설정"
|
||||||
|
OBSWebSocket.Settings.PluginSettingsTitle="플러그인 설정"
|
||||||
|
OBSWebSocket.Settings.ServerEnable="WebSocket 서버 사용"
|
||||||
|
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="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 포트가 타 응용 프로그램에 의해 이 시스템에서 이미 사용 중일 수 있습니다. WebSocket 서버 설정에서 다른 TCP 포트로 변경하거나 이 포트를 사용하는 응용 프로그램을 종료하십시오.\n 오류 메시지: %2"
|
43
data/locale/ms-MY.ini
Normal file
43
data/locale/ms-MY.ini
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
OBSWebSocket.Plugin.Description="Kawalan-jauh OBS Studio melalui WebSocket"
|
||||||
|
OBSWebSocket.Settings.DialogTitle="Tetapan obs-websocket"
|
||||||
|
OBSWebSocket.Settings.PluginSettingsTitle="Tetapan Pemalam"
|
||||||
|
OBSWebSocket.Settings.ServerEnable="Benarkan pelayan WebSocket"
|
||||||
|
OBSWebSocket.Settings.AlertsEnable="Benarkan Amaran Talam Sistem"
|
||||||
|
OBSWebSocket.Settings.DebugEnable="Benarkan Pegelogan Nyahpepijat"
|
||||||
|
OBSWebSocket.Settings.DebugEnableHoverText="Membenarkan pengelogan nyahpepijat bagi kejadian OBS semasa. Tidak ditetapkan ketika muat.\nGuna --websocket_debug untuk didayakan ketika muat."
|
||||||
|
OBSWebSocket.Settings.ServerSettingsTitle="Tetapan Pelayan"
|
||||||
|
OBSWebSocket.Settings.AuthRequired="Benarkan Pengesahihan"
|
||||||
|
OBSWebSocket.Settings.Password="Kata Laluan Pelayan"
|
||||||
|
OBSWebSocket.Settings.GeneratePassword="Jana Kata Lauan"
|
||||||
|
OBSWebSocket.Settings.ServerPort="Port Pelayan"
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfo="Tunjuk Maklumat Sambungan"
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfoWarningTitle="Amaran: Sedang Berlangsung"
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfoWarningMessage="Nampaknya ada output (strim, rakaman, dll.) masih aktif."
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfoWarningInfoText="Anda pasti mahu menunjukkan maklumat sambungan anda?"
|
||||||
|
OBSWebSocket.Settings.Save.UserPasswordWarningTitle="Amaran: Isu Keselamatan Mungkin Ada"
|
||||||
|
OBSWebSocket.Settings.Save.UserPasswordWarningMessage="obs-websocket menyimpan kata laluan pelayan dalam bentuk teks biasa. Menggunakan kata laluan yang dijana oleh obs-websocket iadalah sangat disarankan."
|
||||||
|
OBSWebSocket.Settings.Save.UserPasswordWarningInfoText="Adakah anda pasti mahu menggunakan kata laluan anda sendiri?"
|
||||||
|
OBSWebSocket.Settings.Save.PasswordInvalidErrorTitle="Ralat: Konfigurasi Tidak Sah"
|
||||||
|
OBSWebSocket.Settings.Save.PasswordInvalidErrorMessage="Anda mesti guna satu kata laluan yang terdiri daripada 6 atau lebih aksara."
|
||||||
|
OBSWebSocket.SessionTable.Title="Sesi WebSocket Bersambung"
|
||||||
|
OBSWebSocket.SessionTable.RemoteAddressColumnTitle="Alamat Jauh"
|
||||||
|
OBSWebSocket.SessionTable.SessionDurationColumnTitle="Tempoh Sesi"
|
||||||
|
OBSWebSocket.SessionTable.MessagesInOutColumnTitle="Mesej Masuk/Keluar"
|
||||||
|
OBSWebSocket.SessionTable.IdentifiedTitle="Dikenal Pasti"
|
||||||
|
OBSWebSocket.SessionTable.KickButtonColumnTitle="Tendang?"
|
||||||
|
OBSWebSocket.SessionTable.KickButtonText="Tendang"
|
||||||
|
OBSWebSocket.ConnectInfo.DialogTitle="Maklumat Sambungan WebSocket"
|
||||||
|
OBSWebSocket.ConnectInfo.CopyText="Salin"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerIp="IP Pelayan (Tekaan Terbaik)"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerPort="Port Pelayan"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerPassword="Kata Laluan Pelayan"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerPasswordPlaceholderText="[Izin Dilumpuh]"
|
||||||
|
OBSWebSocket.ConnectInfo.QrTitle="QR Sambungan"
|
||||||
|
OBSWebSocket.TrayNotification.Identified.Title="Sambungan WebSocket Baharu"
|
||||||
|
OBSWebSocket.TrayNotification.Identified.Body="Klien %1 dikenal past."
|
||||||
|
OBSWebSocket.TrayNotification.AuthenticationFailed.Title="Kegagalan Pengesahihan WebSocket"
|
||||||
|
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Klien %1 gagal disahihkan."
|
||||||
|
OBSWebSocket.TrayNotification.Disconnected.Title="Klien WebSocket Terputus"
|
||||||
|
OBSWebSocket.TrayNotification.Disconnected.Body="Klien %1 terputus."
|
||||||
|
OBSWebSocket.Server.StartFailed.Title="Kegagalan Pelayan WebSocket"
|
||||||
|
OBSWebSocket.Server.StartFailed.Message="Pelayan WebSocket gagal dimulakan. Port TCP %1 mungkin telah digunakan di tempat lain dalam sistem ini oleh aplikasi lain. Cuba tetapkan port TCP lain dalam tetapan pelayan WebSocket, atau hentikan mana-mana aplikasi yang guna port tersebut.\n Mesej ralat: %2"
|
42
data/locale/nl-NL.ini
Normal file
42
data/locale/nl-NL.ini
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
OBSWebSocket.Plugin.Description="Op afstand bediening van OBS Studio via WebSocket"
|
||||||
|
OBSWebSocket.Settings.DialogTitle="obs-websocket Instellingen"
|
||||||
|
OBSWebSocket.Settings.PluginSettingsTitle="Plugin instellingen"
|
||||||
|
OBSWebSocket.Settings.ServerEnable="WebSocket server inschakelen"
|
||||||
|
OBSWebSocket.Settings.AlertsEnable="Systeemtray meldingen inschakelen"
|
||||||
|
OBSWebSocket.Settings.DebugEnable="Activeer debug logging"
|
||||||
|
OBSWebSocket.Settings.DebugEnableHoverText="Schakelt debug logboekregistratie in voor de huidige instantie van OBS. Blijft niet meer te laden.\nGebruik --websocket_debug om bij laden in te schakelen."
|
||||||
|
OBSWebSocket.Settings.ServerSettingsTitle="Serverinstellingen"
|
||||||
|
OBSWebSocket.Settings.AuthRequired="Authenticatie inschakelen"
|
||||||
|
OBSWebSocket.Settings.Password="Server wachtwoord"
|
||||||
|
OBSWebSocket.Settings.GeneratePassword="Wachtwoord genereren"
|
||||||
|
OBSWebSocket.Settings.ServerPort="Serverpoort"
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfo="Toon verbindingsinformatie"
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfoWarningTitle="Waarschuwing: Op dit moment live"
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfoWarningMessage="Het lijkt erop dat een output (stream, opname, etc.) momenteel actief is."
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfoWarningInfoText="Weet je zeker dat je je verbindingsinformatie wilt laten zien?"
|
||||||
|
OBSWebSocket.Settings.Save.UserPasswordWarningTitle="Waarschuwing: potentieel beveiligingsprobleem"
|
||||||
|
OBSWebSocket.Settings.Save.UserPasswordWarningMessage="obs-websocket slaat het serverwachtwoord op als platte tekst. Het gebruik van een wachtwoord dat wordt gegenereerd door een obs-websocket wordt sterk aanbevolen."
|
||||||
|
OBSWebSocket.Settings.Save.UserPasswordWarningInfoText="Weet u zeker dat u uw eigen wachtwoord wilt gebruiken?"
|
||||||
|
OBSWebSocket.Settings.Save.PasswordInvalidErrorTitle="Fout: ongeldige configuratie"
|
||||||
|
OBSWebSocket.Settings.Save.PasswordInvalidErrorMessage="U moet een wachtwoord gebruiken van 6 of meer tekens."
|
||||||
|
OBSWebSocket.SessionTable.Title="Verbonden WebSocket Sessies"
|
||||||
|
OBSWebSocket.SessionTable.RemoteAddressColumnTitle="Extern adres"
|
||||||
|
OBSWebSocket.SessionTable.SessionDurationColumnTitle="Sessie duur"
|
||||||
|
OBSWebSocket.SessionTable.MessagesInOutColumnTitle="Berichten In/Uit"
|
||||||
|
OBSWebSocket.SessionTable.IdentifiedTitle="Geïdentificeerd"
|
||||||
|
OBSWebSocket.SessionTable.KickButtonColumnTitle="Verwijderen?"
|
||||||
|
OBSWebSocket.SessionTable.KickButtonText="Verwijderen"
|
||||||
|
OBSWebSocket.ConnectInfo.DialogTitle="WebSocket verbindingsinformatie"
|
||||||
|
OBSWebSocket.ConnectInfo.CopyText="Kopiëren"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerIp="Server IP (Beste inschatting)"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerPort="Serverpoort"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerPasswordPlaceholderText="[Authenticatie Uitgeschakeld]"
|
||||||
|
OBSWebSocket.ConnectInfo.QrTitle="QR koppelen"
|
||||||
|
OBSWebSocket.TrayNotification.Identified.Title="Nieuwe WebSocket verbinding"
|
||||||
|
OBSWebSocket.TrayNotification.Identified.Body="Client %1 geïdentificeerd."
|
||||||
|
OBSWebSocket.TrayNotification.AuthenticationFailed.Title="WebSocket Authenticatie Fout"
|
||||||
|
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Authenticatie van client %1 mislukt."
|
||||||
|
OBSWebSocket.TrayNotification.Disconnected.Title="WebSocket Client losgekoppeld"
|
||||||
|
OBSWebSocket.TrayNotification.Disconnected.Body="Client %1 ontkoppeld."
|
||||||
|
OBSWebSocket.Server.StartFailed.Title="WebSocket Server fout"
|
||||||
|
OBSWebSocket.Server.StartFailed.Message="De WebSocket server kon niet worden gestart. TCP-poort %1 is mogelijk al in gebruik op dit systeem door een andere toepassing. Probeer een andere TCP-poort in te stellen in de WebSocket server-instellingen, of stop elke toepassing die deze poort zou kunnen gebruiken.\n Foutmelding: %2"
|
43
data/locale/pl-PL.ini
Normal file
43
data/locale/pl-PL.ini
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
OBSWebSocket.Plugin.Description="Zdalna kontrola OBS Studio przez WebSocket"
|
||||||
|
OBSWebSocket.Settings.DialogTitle="Ustawienia obs-websocket"
|
||||||
|
OBSWebSocket.Settings.PluginSettingsTitle="Ustawienia wtyczki"
|
||||||
|
OBSWebSocket.Settings.ServerEnable="Włącz serwer WebSocket"
|
||||||
|
OBSWebSocket.Settings.AlertsEnable="Włącz powiadomienia w zasobniku systemowym"
|
||||||
|
OBSWebSocket.Settings.DebugEnable="Włącz logowanie debugowania"
|
||||||
|
OBSWebSocket.Settings.DebugEnableHoverText="Włącza logowanie debugowania dla bieżącej instancji OBS. Opcja nie jest włączana przy ładowaniu aplikacji.\nUżyj --websocket_debug, aby włączyć logowanie debugowania przy ładowaniu aplikacji."
|
||||||
|
OBSWebSocket.Settings.ServerSettingsTitle="Ustawienia serwera"
|
||||||
|
OBSWebSocket.Settings.AuthRequired="Włącz uwierzytelnianie"
|
||||||
|
OBSWebSocket.Settings.Password="Hasło serwera"
|
||||||
|
OBSWebSocket.Settings.GeneratePassword="Wygeneruj hasło"
|
||||||
|
OBSWebSocket.Settings.ServerPort="Port serwera"
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfo="Pokaż informacje połączenia"
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfoWarningTitle="Ostrzeżenie: Trwa transmisja lub nagranie"
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfoWarningMessage="Wygląda na to, że trwa transmisja lub nagrywanie."
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfoWarningInfoText="Czy na pewno chcesz pokazać informacje połączenia?"
|
||||||
|
OBSWebSocket.Settings.Save.UserPasswordWarningTitle="Ostrzeżenie: Potencjalny problem bezpieczeństwa"
|
||||||
|
OBSWebSocket.Settings.Save.UserPasswordWarningMessage="obs-websocket przechowuje hasło serwera jako zwykły tekst. Wysoce zalecane jest użycie hasła generowanego przez obs-websocket."
|
||||||
|
OBSWebSocket.Settings.Save.UserPasswordWarningInfoText="Czy na pewno chcesz użyć własnego hasła?"
|
||||||
|
OBSWebSocket.Settings.Save.PasswordInvalidErrorTitle="Błąd: Nieprawidłowa konfiguracja"
|
||||||
|
OBSWebSocket.Settings.Save.PasswordInvalidErrorMessage="Musisz użyć hasła, które ma 6 lub więcej znaków."
|
||||||
|
OBSWebSocket.SessionTable.Title="Podłączone sesje WebSocket"
|
||||||
|
OBSWebSocket.SessionTable.RemoteAddressColumnTitle="Adres zdalny"
|
||||||
|
OBSWebSocket.SessionTable.SessionDurationColumnTitle="Czas trwania sesji"
|
||||||
|
OBSWebSocket.SessionTable.MessagesInOutColumnTitle="Wiadomości przychodzące/wychodzące"
|
||||||
|
OBSWebSocket.SessionTable.IdentifiedTitle="Zidentyfikowany"
|
||||||
|
OBSWebSocket.SessionTable.KickButtonColumnTitle="Odłączyć?"
|
||||||
|
OBSWebSocket.SessionTable.KickButtonText="Odłącz"
|
||||||
|
OBSWebSocket.ConnectInfo.DialogTitle="Informacje o połączeniu WebSocket"
|
||||||
|
OBSWebSocket.ConnectInfo.CopyText="Kopiuj"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerIp="IP serwera (ustalone w miarę możliwości)"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerPort="Port serwera"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerPassword="Hasło serwera"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerPasswordPlaceholderText="[Autoryzacja wyłączona]"
|
||||||
|
OBSWebSocket.ConnectInfo.QrTitle="Kod QR połączenia"
|
||||||
|
OBSWebSocket.TrayNotification.Identified.Title="Nowe połączenie WebSocket"
|
||||||
|
OBSWebSocket.TrayNotification.Identified.Body="Klient %1 zidentyfikowany."
|
||||||
|
OBSWebSocket.TrayNotification.AuthenticationFailed.Title="Błąd uwierzytelniania WebSocket"
|
||||||
|
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Klient %1 nie został uwierzytelniony."
|
||||||
|
OBSWebSocket.TrayNotification.Disconnected.Title="Klient WebSocket odłączony"
|
||||||
|
OBSWebSocket.TrayNotification.Disconnected.Body="Klient %1 odłączony."
|
||||||
|
OBSWebSocket.Server.StartFailed.Title="Błąd serwera WebSocket"
|
||||||
|
OBSWebSocket.Server.StartFailed.Message="Nie udało się uruchomić serwera WebSocket. Port TCP %1 może być już używany w innym miejscu tego systemu przez inną aplikację. Spróbuj ustawić inny port TCP w ustawieniach serwera WebSocket lub zatrzymaj aplikację, która może korzystać z tego portu.\n Komunikat błędu: %2"
|
43
data/locale/pt-BR.ini
Normal file
43
data/locale/pt-BR.ini
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
OBSWebSocket.Plugin.Description="Controle remoto do OBS Studio através de WebSocket"
|
||||||
|
OBSWebSocket.Settings.DialogTitle="Configurações OBS-WebSocket"
|
||||||
|
OBSWebSocket.Settings.PluginSettingsTitle="Configurações de Plugin"
|
||||||
|
OBSWebSocket.Settings.ServerEnable="Ativar servidor WebSocket"
|
||||||
|
OBSWebSocket.Settings.AlertsEnable="Ativar Alertas da Bandeja do Sistema"
|
||||||
|
OBSWebSocket.Settings.DebugEnable="Habilitar log de depuração"
|
||||||
|
OBSWebSocket.Settings.DebugEnableHoverText="Ativa o registro de depuração para a instância atual do OBS. Não persiste ao carregar.\nUse --websocket_debug para ativar no carregamento."
|
||||||
|
OBSWebSocket.Settings.ServerSettingsTitle="Configurações de Servidor"
|
||||||
|
OBSWebSocket.Settings.AuthRequired="Habilitar Autenticação"
|
||||||
|
OBSWebSocket.Settings.Password="Senha de Servidor"
|
||||||
|
OBSWebSocket.Settings.GeneratePassword="Gerar Senha"
|
||||||
|
OBSWebSocket.Settings.ServerPort="Porta de Servidor"
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfo="Mostrar Informações de Conexão"
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfoWarningTitle="Aviso: Atualmente Ao Vivo"
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfoWarningMessage="Parece que uma saída (stream, gravação, etc.) está atualmente ativa."
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfoWarningInfoText="Tem certeza de que deseja mostrar suas informações de conexão?"
|
||||||
|
OBSWebSocket.Settings.Save.UserPasswordWarningTitle="Aviso: Problema de Segurança Potencial"
|
||||||
|
OBSWebSocket.Settings.Save.UserPasswordWarningMessage="obs-websocket armazena a senha do servidor como texto sem formatação. Usar uma senha gerada pela obs-websocket é altamente recomendada."
|
||||||
|
OBSWebSocket.Settings.Save.UserPasswordWarningInfoText="Tem certeza de que deseja usar a sua própria senha?"
|
||||||
|
OBSWebSocket.Settings.Save.PasswordInvalidErrorTitle="Erro: Configuração Inválida"
|
||||||
|
OBSWebSocket.Settings.Save.PasswordInvalidErrorMessage="Você deve usar uma senha que tenha 6 ou mais caracteres."
|
||||||
|
OBSWebSocket.SessionTable.Title="Sessões WebSocket Conectadas"
|
||||||
|
OBSWebSocket.SessionTable.RemoteAddressColumnTitle="Endereço Remoto"
|
||||||
|
OBSWebSocket.SessionTable.SessionDurationColumnTitle="Duração de Sessão"
|
||||||
|
OBSWebSocket.SessionTable.MessagesInOutColumnTitle="Mengsagens de Entrada/Saída"
|
||||||
|
OBSWebSocket.SessionTable.IdentifiedTitle="Identificada"
|
||||||
|
OBSWebSocket.SessionTable.KickButtonColumnTitle="Expulsar?"
|
||||||
|
OBSWebSocket.SessionTable.KickButtonText="Expulsar"
|
||||||
|
OBSWebSocket.ConnectInfo.DialogTitle="Informação de Conexão WebSocket"
|
||||||
|
OBSWebSocket.ConnectInfo.CopyText="Copiar"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerIp="IP do servidor (Melhor Chute)"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerPort="Porta de Servidor"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerPassword="Senha de Servidor"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerPasswordPlaceholderText="[Autenticação Desativada]"
|
||||||
|
OBSWebSocket.ConnectInfo.QrTitle="QR da conexão"
|
||||||
|
OBSWebSocket.TrayNotification.Identified.Title="Nova Conexão de WebSocket"
|
||||||
|
OBSWebSocket.TrayNotification.Identified.Body="Cliente %1 identificado."
|
||||||
|
OBSWebSocket.TrayNotification.AuthenticationFailed.Title="Falha na Autenticação de WebSocket"
|
||||||
|
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Cliente %1 falhou na autenticação."
|
||||||
|
OBSWebSocket.TrayNotification.Disconnected.Title="Cliente WebSocket Desconectado"
|
||||||
|
OBSWebSocket.TrayNotification.Disconnected.Body="Cliente %1 desconectado."
|
||||||
|
OBSWebSocket.Server.StartFailed.Title="Falha no Servidor WebSocket"
|
||||||
|
OBSWebSocket.Server.StartFailed.Message="O servidor de WebSocket falhou ao iniciar. A porta TCP %1 já pode estar em uso em outro lugar neste sistema por outro aplicativo. Tente definir uma porta TCP diferente nas configurações do servidor de WebSocket, ou pare qualquer aplicativo que possa estar usando essa porta.\n Mensagem de erro: %2"
|
43
data/locale/pt-PT.ini
Normal file
43
data/locale/pt-PT.ini
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
OBSWebSocket.Plugin.Description="Controlo remoto do OBS Studio através de WebSocket"
|
||||||
|
OBSWebSocket.Settings.DialogTitle="Configurações obs-websocket"
|
||||||
|
OBSWebSocket.Settings.PluginSettingsTitle="Configurações do plugin"
|
||||||
|
OBSWebSocket.Settings.ServerEnable="Ativar servidor WebSocket"
|
||||||
|
OBSWebSocket.Settings.AlertsEnable="Ativar alertas da bandeja do sistema"
|
||||||
|
OBSWebSocket.Settings.DebugEnable="Ativar registo de depuração"
|
||||||
|
OBSWebSocket.Settings.DebugEnableHoverText="Ativa o registro de depuração para a instância atual do OBS. Não persiste no arranque.\nUse --websocket_debug para ativar no arranque."
|
||||||
|
OBSWebSocket.Settings.ServerSettingsTitle="Configurações do servidor"
|
||||||
|
OBSWebSocket.Settings.AuthRequired="Ativar autenticação"
|
||||||
|
OBSWebSocket.Settings.Password="Senha do servidor"
|
||||||
|
OBSWebSocket.Settings.GeneratePassword="Gerar senha"
|
||||||
|
OBSWebSocket.Settings.ServerPort="Porta do servidor"
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfo="Mostrar informações de conexão"
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfoWarningTitle="Aviso: Atualmente ao vivo"
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfoWarningMessage="Parece que uma saída (transmissão, gravação, etc.) está atualmente ativa."
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfoWarningInfoText="Tem certeza de que deseja mostrar as suas informações de ligação?"
|
||||||
|
OBSWebSocket.Settings.Save.UserPasswordWarningTitle="Aviso: Possível problema de segurança"
|
||||||
|
OBSWebSocket.Settings.Save.UserPasswordWarningMessage="O obs-websocket armazena a senha do servidor como texto sem formatação. É altamente recomendado usar uma senha gerada pelo obs-websocket ."
|
||||||
|
OBSWebSocket.Settings.Save.UserPasswordWarningInfoText="Tem a certeza de que deseja usar as suas próprias senhas?"
|
||||||
|
OBSWebSocket.Settings.Save.PasswordInvalidErrorTitle="Erro: Configuração inválida"
|
||||||
|
OBSWebSocket.Settings.Save.PasswordInvalidErrorMessage="Deve usar uma senha que tenha 6 ou mais caracteres."
|
||||||
|
OBSWebSocket.SessionTable.Title="Sessões WebSocket ligadas"
|
||||||
|
OBSWebSocket.SessionTable.RemoteAddressColumnTitle="Endereço remoto"
|
||||||
|
OBSWebSocket.SessionTable.SessionDurationColumnTitle="Duração da sessão"
|
||||||
|
OBSWebSocket.SessionTable.MessagesInOutColumnTitle="Entrada/Saída de mensagens"
|
||||||
|
OBSWebSocket.SessionTable.IdentifiedTitle="Identificado"
|
||||||
|
OBSWebSocket.SessionTable.KickButtonColumnTitle="Expulsar?"
|
||||||
|
OBSWebSocket.SessionTable.KickButtonText="Expulsar"
|
||||||
|
OBSWebSocket.ConnectInfo.DialogTitle="Informação de ligação WebSocket"
|
||||||
|
OBSWebSocket.ConnectInfo.CopyText="Copiar"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerIp="IP do servidor (melhor cálculo)"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerPort="Porta do servidor"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerPassword="Senha do servidor"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerPasswordPlaceholderText="[Autenticação desativada]"
|
||||||
|
OBSWebSocket.ConnectInfo.QrTitle="Código QR de ligação"
|
||||||
|
OBSWebSocket.TrayNotification.Identified.Title="Nova conexão de WebSocket"
|
||||||
|
OBSWebSocket.TrayNotification.Identified.Body="Cliente %1 identificado."
|
||||||
|
OBSWebSocket.TrayNotification.AuthenticationFailed.Title="Falha na autenticação de WebSocket"
|
||||||
|
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Cliente %1 falhou na autenticação."
|
||||||
|
OBSWebSocket.TrayNotification.Disconnected.Title="Cliente WebSocket desligado"
|
||||||
|
OBSWebSocket.TrayNotification.Disconnected.Body="Cliente %1 desligado."
|
||||||
|
OBSWebSocket.Server.StartFailed.Title="Falha no servidor WebSocket"
|
||||||
|
OBSWebSocket.Server.StartFailed.Message="O servidor de WebSocket falhou ao iniciar. A porta TCP %1 pode já estar em uso noutro local deste sistema por outra aplicação. Tente definir uma porta TCP diferente nas configurações do servidor de WebSocket, ou pare qualquer aplicação que possa estar a usar essa porta.\n Mensagem de erro: %2"
|
43
data/locale/ro-RO.ini
Normal file
43
data/locale/ro-RO.ini
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
OBSWebSocket.Plugin.Description="Control de la distanță pentru OBS Studio prin WebSocket"
|
||||||
|
OBSWebSocket.Settings.DialogTitle="Setări obs-websocket"
|
||||||
|
OBSWebSocket.Settings.PluginSettingsTitle="Setări ale plugin-ului"
|
||||||
|
OBSWebSocket.Settings.ServerEnable="Activează serverul WebSocket"
|
||||||
|
OBSWebSocket.Settings.AlertsEnable="Activați alertele din bara de sistem"
|
||||||
|
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.ServerSettingsTitle="Setări server"
|
||||||
|
OBSWebSocket.Settings.AuthRequired="Activează autentificarea"
|
||||||
|
OBSWebSocket.Settings.Password="Parola serverului"
|
||||||
|
OBSWebSocket.Settings.GeneratePassword="Generează parola"
|
||||||
|
OBSWebSocket.Settings.ServerPort="Portul serverului"
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfo="Afișează informațiile de conectare"
|
||||||
|
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.ShowConnectInfoWarningInfoText="Ești sigur că vrei să-ți arăți informațiile de conectare?"
|
||||||
|
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.UserPasswordWarningInfoText="Ești sigur că vrei să-ți folosești propria parolă?"
|
||||||
|
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.SessionTable.Title="Sesiuni WebSocket conectate"
|
||||||
|
OBSWebSocket.SessionTable.RemoteAddressColumnTitle="Adresă la distanță"
|
||||||
|
OBSWebSocket.SessionTable.SessionDurationColumnTitle="Durata sesiunii"
|
||||||
|
OBSWebSocket.SessionTable.MessagesInOutColumnTitle="Mesaje de intrare/ieșire"
|
||||||
|
OBSWebSocket.SessionTable.IdentifiedTitle="Identificat"
|
||||||
|
OBSWebSocket.SessionTable.KickButtonColumnTitle="Înlătură?"
|
||||||
|
OBSWebSocket.SessionTable.KickButtonText="Înlătură"
|
||||||
|
OBSWebSocket.ConnectInfo.DialogTitle="Informații de conectare WebSocket"
|
||||||
|
OBSWebSocket.ConnectInfo.CopyText="Copiază"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerIp="IP-ul serverului (cea mai bună presupunere)"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerPort="Portul serverului"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerPassword="Parola serverului"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerPasswordPlaceholderText="[Autentificare dezactivată]"
|
||||||
|
OBSWebSocket.ConnectInfo.QrTitle="Conectare QR"
|
||||||
|
OBSWebSocket.TrayNotification.Identified.Title="O nouă conexiune WebSocket"
|
||||||
|
OBSWebSocket.TrayNotification.Identified.Body="Client %1 identificat."
|
||||||
|
OBSWebSocket.TrayNotification.AuthenticationFailed.Title="Eroare de autentificare WebSocket"
|
||||||
|
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Client %1 nu a reușit să se autentifice."
|
||||||
|
OBSWebSocket.TrayNotification.Disconnected.Title="Client WebSocket deconectat"
|
||||||
|
OBSWebSocket.TrayNotification.Disconnected.Body="Clientul %1 s-a deconectat."
|
||||||
|
OBSWebSocket.Server.StartFailed.Title="Eroare de server WebSocket"
|
||||||
|
OBSWebSocket.Server.StartFailed.Message="Serverul WebSocket nu a reușit să pornească. Este posibil ca portul TCP %1 să fie deja utilizat în altă parte pe acest sistem de o altă aplicație. Încearcă să setezi un alt port TCP în setările serverului WebSocket sau oprește orice aplicație care ar putea utiliza acest port.\n Mesaj de eroare: %2"
|
43
data/locale/ru-RU.ini
Normal file
43
data/locale/ru-RU.ini
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
OBSWebSocket.Plugin.Description="Удалённое управление OBS Studio по WebSocket"
|
||||||
|
OBSWebSocket.Settings.DialogTitle="Настройки obs-websocket"
|
||||||
|
OBSWebSocket.Settings.PluginSettingsTitle="Настройки плагина"
|
||||||
|
OBSWebSocket.Settings.ServerEnable="Включить сервер WebSocket"
|
||||||
|
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-websock."
|
||||||
|
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="Не удалось запустить сервер WebSockt. Возможно, порт TCP %1 уже используется другим приложением. Попробуйте установить другой TCP-порт в настройках сервера WebSocket или остановите любое приложение, которое может использовать этот порт.\n Сообщение ошибки: %2"
|
20
data/locale/si-LK.ini
Normal file
20
data/locale/si-LK.ini
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
OBSWebSocket.Settings.PluginSettingsTitle="පේනුවේ සැකසුම්"
|
||||||
|
OBSWebSocket.Settings.ServerSettingsTitle="සේවාදායකයේ සැකසුම්"
|
||||||
|
OBSWebSocket.Settings.AuthRequired="සත්යාපනය සබල කරන්න"
|
||||||
|
OBSWebSocket.Settings.Password="සේවාදායකයේ මුරපදය"
|
||||||
|
OBSWebSocket.Settings.GeneratePassword="මුරපදය උත්පාදනය"
|
||||||
|
OBSWebSocket.Settings.ServerPort="සේවාදායකයේ තොට"
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfo="සබඳතාවේ තොරතුරු පෙන්වන්න"
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfoWarningTitle="අවවාදයයි: දැනට සජීවයි"
|
||||||
|
OBSWebSocket.SessionTable.RemoteAddressColumnTitle="දුරස්ථ ලිපිනය"
|
||||||
|
OBSWebSocket.SessionTable.SessionDurationColumnTitle="වාරයේ පරාසය"
|
||||||
|
OBSWebSocket.SessionTable.MessagesInOutColumnTitle="පණිවිඩ එන/යන"
|
||||||
|
OBSWebSocket.SessionTable.IdentifiedTitle="හඳුනා ගැනිණි"
|
||||||
|
OBSWebSocket.ConnectInfo.CopyText="පිටපතක්"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerPort="සේවාදායකයේ තොට"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerPassword="සේවාදායකයේ මුරපදය"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerPasswordPlaceholderText="[සත්යාපනය අබලයි]"
|
||||||
|
OBSWebSocket.ConnectInfo.QrTitle="සබැඳුමට QR"
|
||||||
|
OBSWebSocket.TrayNotification.Identified.Body="දැන් %1 අනුග්රාහකය හඳුනයි."
|
||||||
|
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="%1 අනුග්රාහකය සත්යාපනයට අසමත්!"
|
||||||
|
OBSWebSocket.TrayNotification.Disconnected.Body="%1 අනුග්රාහකය විසන්ධියි."
|
43
data/locale/sk-SK.ini
Normal file
43
data/locale/sk-SK.ini
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
OBSWebSocket.Plugin.Description="Vzdialené ovládanie OBS Štúdia cez WebSocket"
|
||||||
|
OBSWebSocket.Settings.DialogTitle="Nastavenia obs-websocket"
|
||||||
|
OBSWebSocket.Settings.PluginSettingsTitle="Nastavenia pluginu"
|
||||||
|
OBSWebSocket.Settings.ServerEnable="Zapnúť WebSocket server"
|
||||||
|
OBSWebSocket.Settings.AlertsEnable="Zapnúť notifikácie zo systémovej lišty"
|
||||||
|
OBSWebSocket.Settings.DebugEnable="Zapnúť debug logovanie"
|
||||||
|
OBSWebSocket.Settings.DebugEnableHoverText="Zapne debug logovanie pre momentálnu inštanciu OBS. Nezotrvá po načítaní.\nPoužite --websocket_debug pre zapnutie pri načítaní."
|
||||||
|
OBSWebSocket.Settings.ServerSettingsTitle="Nastavenia servera"
|
||||||
|
OBSWebSocket.Settings.AuthRequired="Zapnúť autentifikáciu"
|
||||||
|
OBSWebSocket.Settings.Password="Serverové heslo"
|
||||||
|
OBSWebSocket.Settings.GeneratePassword="Vygenerovať heslo"
|
||||||
|
OBSWebSocket.Settings.ServerPort="Serverový port"
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfo="Zobraziť info pripojenia"
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfoWarningTitle="Varovanie: Momentálne naživo"
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfoWarningMessage="Zdá sa, že nejaký výstup (stream, nahrávanie, atď.) je momentálne aktívny."
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfoWarningInfoText="Ste si istí, že chcete zobraziť info vašeho pripojenia?"
|
||||||
|
OBSWebSocket.Settings.Save.UserPasswordWarningTitle="Varovanie: Potenciálny bezpečnostný problém"
|
||||||
|
OBSWebSocket.Settings.Save.UserPasswordWarningMessage="obs-websocket ukladá serverové heslo ako obyčajný text. Použitie vygenerovaného hesla pre obs-websocket je vysoko odporúčané."
|
||||||
|
OBSWebSocket.Settings.Save.UserPasswordWarningInfoText="Ste si istí, že chcete použiť svoje vlastné heslo?"
|
||||||
|
OBSWebSocket.Settings.Save.PasswordInvalidErrorTitle="Chyba: Neplatná konfigurácia"
|
||||||
|
OBSWebSocket.Settings.Save.PasswordInvalidErrorMessage="Musíte zadať heslo, ktoré má 6 alebo viac znakov."
|
||||||
|
OBSWebSocket.SessionTable.Title="Pripojené WebSocket relácie"
|
||||||
|
OBSWebSocket.SessionTable.RemoteAddressColumnTitle="Vzdialená adresa"
|
||||||
|
OBSWebSocket.SessionTable.SessionDurationColumnTitle="Travnie relácie"
|
||||||
|
OBSWebSocket.SessionTable.MessagesInOutColumnTitle="Správy dnu/von"
|
||||||
|
OBSWebSocket.SessionTable.IdentifiedTitle="Identifikovaný"
|
||||||
|
OBSWebSocket.SessionTable.KickButtonColumnTitle="Vyhodiť?"
|
||||||
|
OBSWebSocket.SessionTable.KickButtonText="Vyhodiť"
|
||||||
|
OBSWebSocket.ConnectInfo.DialogTitle="Info WebSocket pripojenia"
|
||||||
|
OBSWebSocket.ConnectInfo.CopyText="Kopírovať"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerIp="IP servera (najlepší odhad)"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerPort="Serverový port"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerPassword="Serverové heslo"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerPasswordPlaceholderText="[Autentifikácia vypnutá]"
|
||||||
|
OBSWebSocket.ConnectInfo.QrTitle="QR kód pripojenia"
|
||||||
|
OBSWebSocket.TrayNotification.Identified.Title="Nové WebSocket pripojenie"
|
||||||
|
OBSWebSocket.TrayNotification.Identified.Body="Klient %1 identifikovaný."
|
||||||
|
OBSWebSocket.TrayNotification.AuthenticationFailed.Title="Zlyhanie WebSocket autentifikácie"
|
||||||
|
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Klientovi %1 sa nepodarilo autentifikovať."
|
||||||
|
OBSWebSocket.TrayNotification.Disconnected.Title="WebSocket klient odpojený"
|
||||||
|
OBSWebSocket.TrayNotification.Disconnected.Body="Klient %1 odpojený."
|
||||||
|
OBSWebSocket.Server.StartFailed.Title="Zlyhanie WebSocket servera"
|
||||||
|
OBSWebSocket.Server.StartFailed.Message="WebSocket server zlyhal pri spustení. TCP port %1 sa môže používať na inom mieste, na tomto systéme, inou aplikáciou. Skúste nastaviť iný TCP port v nastaveniach WebSocket servera, alebo zastavte iné aplikácie, ktoré by mohli používať tento port.\n Chybová správa: %2"
|
43
data/locale/sl-SI.ini
Normal file
43
data/locale/sl-SI.ini
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
OBSWebSocket.Plugin.Description="Oddaljeni nadzor OBS Studia prek WebSocketa"
|
||||||
|
OBSWebSocket.Settings.DialogTitle="Nastavitve obs-websocket"
|
||||||
|
OBSWebSocket.Settings.PluginSettingsTitle="Nastavitve vtičnika"
|
||||||
|
OBSWebSocket.Settings.ServerEnable="Omogoči strežnik WebSocket"
|
||||||
|
OBSWebSocket.Settings.AlertsEnable="Omogoči opozorila v sistemskem pladnju"
|
||||||
|
OBSWebSocket.Settings.DebugEnable="Omogoči beleženje napak"
|
||||||
|
OBSWebSocket.Settings.DebugEnableHoverText="Omogoči beleženje dogodkov za potrebe razhroščevanja v trenutno zagnani inačici OBS. Ne vztraja ob nalaganju.\nUporabbite --websocket_debug, da to možnost omogočite ob nalaganju."
|
||||||
|
OBSWebSocket.Settings.ServerSettingsTitle="Nastavitve strežnika"
|
||||||
|
OBSWebSocket.Settings.AuthRequired="Omogoči overjanje"
|
||||||
|
OBSWebSocket.Settings.Password="Geslo strežnika"
|
||||||
|
OBSWebSocket.Settings.GeneratePassword="Tvori geslo"
|
||||||
|
OBSWebSocket.Settings.ServerPort="Vrata strežnika"
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfo="Pokaži podatke o povezavi"
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfoWarningTitle="Opozorilo: trenutno v živo"
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfoWarningMessage="Kaže, da je izhod (tok, posnetek itn.) trenutno dejaven."
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfoWarningInfoText="Ali ste prepričani, da želite pokazati svoje podatke za povezavo?"
|
||||||
|
OBSWebSocket.Settings.Save.UserPasswordWarningTitle="Opozorilo: potencialna varnostna težava"
|
||||||
|
OBSWebSocket.Settings.Save.UserPasswordWarningMessage="obs-websocket hrani geslo strežnika kot navadno besedilo. Uporaba gesla, ki ga ustvari obs-websocket je zato zelo priporočena."
|
||||||
|
OBSWebSocket.Settings.Save.UserPasswordWarningInfoText="Ali ste prepričani, da želite uporabiti lastno geslo?"
|
||||||
|
OBSWebSocket.Settings.Save.PasswordInvalidErrorTitle="Napaka: neveljavna prilagoditev"
|
||||||
|
OBSWebSocket.Settings.Save.PasswordInvalidErrorMessage="Uporabiti morate geslo z vsaj 6 znaki."
|
||||||
|
OBSWebSocket.SessionTable.Title="Povezane seje WebSocket"
|
||||||
|
OBSWebSocket.SessionTable.RemoteAddressColumnTitle="Oddaljen naslov"
|
||||||
|
OBSWebSocket.SessionTable.SessionDurationColumnTitle="Trajanje seje"
|
||||||
|
OBSWebSocket.SessionTable.MessagesInOutColumnTitle="Sporočila V/I"
|
||||||
|
OBSWebSocket.SessionTable.IdentifiedTitle="Identificirano"
|
||||||
|
OBSWebSocket.SessionTable.KickButtonColumnTitle="Odvrzi?"
|
||||||
|
OBSWebSocket.SessionTable.KickButtonText="Odvrzi"
|
||||||
|
OBSWebSocket.ConnectInfo.DialogTitle="Podatki o povezavi WebSocket"
|
||||||
|
OBSWebSocket.ConnectInfo.CopyText="Kopiraj"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerIp="IP strežnika (naj-domneva)"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerPort="Vrata strežnika"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerPassword="Geslo strežnika"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerPasswordPlaceholderText="[Overjanje onemog.]"
|
||||||
|
OBSWebSocket.ConnectInfo.QrTitle="Koda QR za povezavo"
|
||||||
|
OBSWebSocket.TrayNotification.Identified.Title="Nova povezava WebSocket"
|
||||||
|
OBSWebSocket.TrayNotification.Identified.Body="Odjemalec %1 identificiran."
|
||||||
|
OBSWebSocket.TrayNotification.AuthenticationFailed.Title="Spodletelo ovetjanje WebSocket"
|
||||||
|
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Odjemalec %1 ni prestal overjanja."
|
||||||
|
OBSWebSocket.TrayNotification.Disconnected.Title="Odjemalec WebSocket je prekinil povezavo"
|
||||||
|
OBSWebSocket.TrayNotification.Disconnected.Body="Odjemalec %1 ni več povezan."
|
||||||
|
OBSWebSocket.Server.StartFailed.Title="Odpoved strežnika WebSocket"
|
||||||
|
OBSWebSocket.Server.StartFailed.Message="Strežnik WebSocket se ni uspel zagnati. Vrata TCP %1 morda že uporablja drug program na tem sistemu. Poskusite določiti druga vrata TCP v nastavitvah strežnika WebSocket ali pa ustaviti program, ki bi lahko uporabljal želena vrata.\nSporočilo o napaki: %2"
|
43
data/locale/sv-SE.ini
Normal file
43
data/locale/sv-SE.ini
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
OBSWebSocket.Plugin.Description="Fjärrkontroll av OBS Studio via WebSocket"
|
||||||
|
OBSWebSocket.Settings.DialogTitle="Inställningar för obs-websocket"
|
||||||
|
OBSWebSocket.Settings.PluginSettingsTitle="Insticksmodulsinställningar"
|
||||||
|
OBSWebSocket.Settings.ServerEnable="Aktivera WebSocket-server"
|
||||||
|
OBSWebSocket.Settings.AlertsEnable="Aktivera systemfältsmeddelanden"
|
||||||
|
OBSWebSocket.Settings.DebugEnable="Aktivera felsökningsloggning"
|
||||||
|
OBSWebSocket.Settings.DebugEnableHoverText="Aktiverar felsökningsloggning för den aktuella instansen av OBS. Stannar inte igång vid inläsning.\nAnvänd --websocket_debug för att aktivera vid inläsning."
|
||||||
|
OBSWebSocket.Settings.ServerSettingsTitle="Serverinställningar"
|
||||||
|
OBSWebSocket.Settings.AuthRequired="Aktivera autentisering"
|
||||||
|
OBSWebSocket.Settings.Password="Serverlösenord"
|
||||||
|
OBSWebSocket.Settings.GeneratePassword="Generera lösenord"
|
||||||
|
OBSWebSocket.Settings.ServerPort="Serverport"
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfo="Visa anslutningsinformation"
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfoWarningTitle="Varning: Sänder för närvarande"
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfoWarningMessage="Det verkar som om en utmatning (ström, inspelning, etc.) är för närvarande aktiv."
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfoWarningInfoText="Är du säker på att du vill visa din anslutningsinformation?"
|
||||||
|
OBSWebSocket.Settings.Save.UserPasswordWarningTitle="Varning: Potentiellt säkerhetsproblem"
|
||||||
|
OBSWebSocket.Settings.Save.UserPasswordWarningMessage="obs-websocket lagrar serverns lösenord som vanlig text. Det kommenderas starkt att använda ett lösenord som genereras av obs-websocket."
|
||||||
|
OBSWebSocket.Settings.Save.UserPasswordWarningInfoText="Är du säker på att du vill använda ditt eget lösenord?"
|
||||||
|
OBSWebSocket.Settings.Save.PasswordInvalidErrorTitle="Fel: Ogiltig konfiguration"
|
||||||
|
OBSWebSocket.Settings.Save.PasswordInvalidErrorMessage="Du måste använda ett lösenord som har 6 eller fler tecken."
|
||||||
|
OBSWebSocket.SessionTable.Title="Anslutna WebSocket-sessioner"
|
||||||
|
OBSWebSocket.SessionTable.RemoteAddressColumnTitle="Fjärradress"
|
||||||
|
OBSWebSocket.SessionTable.SessionDurationColumnTitle="Sessionens varaktighet"
|
||||||
|
OBSWebSocket.SessionTable.MessagesInOutColumnTitle="Meddelanden in/ut"
|
||||||
|
OBSWebSocket.SessionTable.IdentifiedTitle="Identifierad"
|
||||||
|
OBSWebSocket.SessionTable.KickButtonColumnTitle="Sparka ut?"
|
||||||
|
OBSWebSocket.SessionTable.KickButtonText="Sparka ut"
|
||||||
|
OBSWebSocket.ConnectInfo.DialogTitle="Anslutningsinfo för WebSocket"
|
||||||
|
OBSWebSocket.ConnectInfo.CopyText="Kopiera"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerIp="Server-IP (uppskattad)"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerPort="Serverport"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerPassword="Serverlösenord"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerPasswordPlaceholderText="[Autentisering inaktiverad]"
|
||||||
|
OBSWebSocket.ConnectInfo.QrTitle="QR för anslutning"
|
||||||
|
OBSWebSocket.TrayNotification.Identified.Title="Ny WebSocket-anslutning"
|
||||||
|
OBSWebSocket.TrayNotification.Identified.Body="Klient %1 har identifierats."
|
||||||
|
OBSWebSocket.TrayNotification.AuthenticationFailed.Title="Autentisering av WebSocket misslyckades"
|
||||||
|
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="Klient %1 misslyckades att autentiseras."
|
||||||
|
OBSWebSocket.TrayNotification.Disconnected.Title="WebSocket-klient frånkopplades"
|
||||||
|
OBSWebSocket.TrayNotification.Disconnected.Body="Klient %1 frånkopplades."
|
||||||
|
OBSWebSocket.Server.StartFailed.Title="WebSocket-serverfel"
|
||||||
|
OBSWebSocket.Server.StartFailed.Message="WebSocket-servern kunde inte startaw. TCP-porten %1 kanske redan används någon annanstans på detta system av ett annat program. Prova att ange en annan TCP-port i WebSocket-serverinställningarna eller stoppa alla program som kan använda denna port.\n Felmeddelande: %2"
|
43
data/locale/tr-TR.ini
Normal file
43
data/locale/tr-TR.ini
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
OBSWebSocket.Plugin.Description="WebSocket aracılığıyla uzaktan OBS Studio"
|
||||||
|
OBSWebSocket.Settings.DialogTitle="obs-websocket Ayarları"
|
||||||
|
OBSWebSocket.Settings.PluginSettingsTitle="Eklenti Ayarları"
|
||||||
|
OBSWebSocket.Settings.ServerEnable="WebSocket sunucuyu etkinleştir"
|
||||||
|
OBSWebSocket.Settings.AlertsEnable="Sistem Tepsi Uyarılarını Etkinleştir"
|
||||||
|
OBSWebSocket.Settings.DebugEnable="Hata Ayıklama Günlüğünü Etkinleştir"
|
||||||
|
OBSWebSocket.Settings.DebugEnableHoverText="OBS'in geçerli örneği için hata ayıklama günlüğünü etkinleştirir. Yüklemede kalıcı değildir.\nYüklemede etkinleştirmek için -- websocket_debug kullanın."
|
||||||
|
OBSWebSocket.Settings.ServerSettingsTitle="Sunucu Ayarları"
|
||||||
|
OBSWebSocket.Settings.AuthRequired="Kimlik Doğrulamasını Etkinleştir"
|
||||||
|
OBSWebSocket.Settings.Password="Sunucu Parolası"
|
||||||
|
OBSWebSocket.Settings.GeneratePassword="Parola oluştur"
|
||||||
|
OBSWebSocket.Settings.ServerPort="Sunucu Portu"
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfo="Bağlanma Bilgilerini Göster"
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfoWarningTitle="Uyarı: Şu Anda Canlı"
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfoWarningMessage="Şu anda bir çıkış (yayın, kayıt, vb.) aktif görünüyor."
|
||||||
|
OBSWebSocket.Settings.ShowConnectInfoWarningInfoText="Bağlanma bilgilerinizi göstermek istediğinizden emin misiniz?"
|
||||||
|
OBSWebSocket.Settings.Save.UserPasswordWarningTitle="Uyarı: Olası Güvenlik Sorunu"
|
||||||
|
OBSWebSocket.Settings.Save.UserPasswordWarningMessage="obs-websocket sunucu parolasını düz metin olarak saklar. Obs-websocket tarafından oluşturulan bir parola kullanılması şiddetle tavsiye edilir."
|
||||||
|
OBSWebSocket.Settings.Save.UserPasswordWarningInfoText="Kendi parolanızı kullanmak istediğinizden emin misiniz?"
|
||||||
|
OBSWebSocket.Settings.Save.PasswordInvalidErrorTitle="Hata: Geçersiz Yapılandırma"
|
||||||
|
OBSWebSocket.Settings.Save.PasswordInvalidErrorMessage="6 veya daha fazla karakterden oluşan bir şifre kullanmalısınız."
|
||||||
|
OBSWebSocket.SessionTable.Title="Bağlı WebSocket Oturumları"
|
||||||
|
OBSWebSocket.SessionTable.RemoteAddressColumnTitle="Uzaktaki Adres"
|
||||||
|
OBSWebSocket.SessionTable.SessionDurationColumnTitle="Oturum Süresi"
|
||||||
|
OBSWebSocket.SessionTable.MessagesInOutColumnTitle="Gelen/Giden Mesajlar"
|
||||||
|
OBSWebSocket.SessionTable.IdentifiedTitle="Tanımlandı"
|
||||||
|
OBSWebSocket.SessionTable.KickButtonColumnTitle="Çıkarılsın mı?"
|
||||||
|
OBSWebSocket.SessionTable.KickButtonText="Çıkar"
|
||||||
|
OBSWebSocket.ConnectInfo.DialogTitle="WebSocket Bağlanma Bilgileri"
|
||||||
|
OBSWebSocket.ConnectInfo.CopyText="Kopyala"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerIp="Sunucu IP (En İyi Tahmin)"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerPort="Sunucu Kapısı"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerPassword="Sunucu Parolası"
|
||||||
|
OBSWebSocket.ConnectInfo.ServerPasswordPlaceholderText="[Doğrulama Devre Dışı]"
|
||||||
|
OBSWebSocket.ConnectInfo.QrTitle="Kare Kod ile Bağlan"
|
||||||
|
OBSWebSocket.TrayNotification.Identified.Title="Yeni WebSocket Bağlantısı"
|
||||||
|
OBSWebSocket.TrayNotification.Identified.Body="%1 istemcisi tanımlandı."
|
||||||
|
OBSWebSocket.TrayNotification.AuthenticationFailed.Title="WebSocket Kimlik Doğrulama Hatası"
|
||||||
|
OBSWebSocket.TrayNotification.AuthenticationFailed.Body="%1 istemcisinin kimlik doğrulaması başarısız oldu."
|
||||||
|
OBSWebSocket.TrayNotification.Disconnected.Title="WebSocket İstemcisinin Bağlantısı Kesildi"
|
||||||
|
OBSWebSocket.TrayNotification.Disconnected.Body="%1 istemcisinin bağlantısı kesildi."
|
||||||
|
OBSWebSocket.Server.StartFailed.Title="WebSocket Sunucu Hatası"
|
||||||
|
OBSWebSocket.Server.StartFailed.Message="WebSocket sunucusu başlatılamadı. %1 TCP kapısı bu sistemde başka bir yerde başka bir uygulama tarafından zaten kullanılıyor olabilir. WebSocket sunucu ayarlarında farklı bir TCP kapısı ayarlamayı deneyin, veya bu kapıyı kullanıyor olabilecek herhangi bir uygulamayı durdurun.\n Hata mesajı: %2"
|
43
data/locale/uk-UA.ini
Normal file
43
data/locale/uk-UA.ini
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
OBSWebSocket.Plugin.Description="Віддалене керування OBS Studio через WebSocket"
|
||||||
|
OBSWebSocket.Settings.DialogTitle="Налаштування obs-websocket"
|
||||||
|
OBSWebSocket.Settings.PluginSettingsTitle="Налаштування плагіна"
|
||||||
|
OBSWebSocket.Settings.ServerEnable="Увімкнути сервер WebSocket"
|
||||||
|
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="Під'єднані сеанси 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. Порт TCP %1 може вже використовуватися в іншому місці цим системним інтерфейсом. Спробуйте встановити інший TCP порт в налаштуваннях WebSocket сервера або зупинити будь-які застосунки, які можуть використовувати цей порт.\n Повідомлення про помилку: %2"
|
43
data/locale/zh-CN.ini
Normal file
43
data/locale/zh-CN.ini
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
OBSWebSocket.Plugin.Description="通过 WebSocket 远程控制 OBS Studio"
|
||||||
|
OBSWebSocket.Settings.DialogTitle="obs-websocket 设置"
|
||||||
|
OBSWebSocket.Settings.PluginSettingsTitle="插件设置"
|
||||||
|
OBSWebSocket.Settings.ServerEnable="开启 WebSocket 服务器"
|
||||||
|
OBSWebSocket.Settings.AlertsEnable="开启系统托盘提醒"
|
||||||
|
OBSWebSocket.Settings.DebugEnable="开启调试日志"
|
||||||
|
OBSWebSocket.Settings.DebugEnableHoverText="启用当前 OBS 实例的调试日志。下次启动时需重新设置。\n使用 --websocket_debug 在启动 OBS 时启用日志。"
|
||||||
|
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 服务器启动失败。TCP 端口 %1 可能已被其它程序占用。请尝试在 WebSocket 服务器设置中更改不同的 TCP 端口号,或者结束其它任何可能占用此端口的程序。\n错误信息:%2"
|
43
data/locale/zh-TW.ini
Normal file
43
data/locale/zh-TW.ini
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
OBSWebSocket.Plugin.Description="透過 WebSocket 遠端控制 OBS Studio"
|
||||||
|
OBSWebSocket.Settings.DialogTitle="obs-websocket 設定"
|
||||||
|
OBSWebSocket.Settings.PluginSettingsTitle="外掛程式設定"
|
||||||
|
OBSWebSocket.Settings.ServerEnable="啟用 WebSocket 伺服器"
|
||||||
|
OBSWebSocket.Settings.AlertsEnable="啟用系統匣通知"
|
||||||
|
OBSWebSocket.Settings.DebugEnable="啟用除錯日誌"
|
||||||
|
OBSWebSocket.Settings.DebugEnableHoverText="啟用目前 OBS 實體的除錯日誌。下次啟動時需重新設定。\n使用 --websocket_debug 在啟動 OBS 時啟用日誌。"
|
||||||
|
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 伺服器。可能 TCP 連線埠 %1 已經被系統中的某個應用程式佔用。請嘗試在 WebSocket 伺服器設定更改不同的 TCP 連線埠,或停止任何可能正在使用這個連線埠的應用程式。\n錯誤訊息:%2"
|
@ -1,5 +1,5 @@
|
|||||||
|
|
||||||
# obs-websocket 5.0.0 Protocol
|
# obs-websocket 5.0.1 Protocol
|
||||||
|
|
||||||
## Main Table of Contents
|
## Main Table of Contents
|
||||||
|
|
||||||
@ -143,7 +143,7 @@ Authentication is required
|
|||||||
{
|
{
|
||||||
"op": 0,
|
"op": 0,
|
||||||
"d": {
|
"d": {
|
||||||
"obsWebSocketVersion": "5.0.0",
|
"obsWebSocketVersion": "5.0.1",
|
||||||
"rpcVersion": 1,
|
"rpcVersion": 1,
|
||||||
"authentication": {
|
"authentication": {
|
||||||
"challenge": "+IxH4CnCiqpX1rM9scsNynZzbOe4KhDeYcTNS3PDaeY=",
|
"challenge": "+IxH4CnCiqpX1rM9scsNynZzbOe4KhDeYcTNS3PDaeY=",
|
||||||
@ -159,7 +159,7 @@ Authentication is not required
|
|||||||
{
|
{
|
||||||
"op": 0,
|
"op": 0,
|
||||||
"d": {
|
"d": {
|
||||||
"obsWebSocketVersion": "5.0.0",
|
"obsWebSocketVersion": "5.0.1",
|
||||||
"rpcVersion": 1
|
"rpcVersion": 1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -306,7 +306,7 @@ Authentication is not required
|
|||||||
{
|
{
|
||||||
"op": 6,
|
"op": 6,
|
||||||
"d": {
|
"d": {
|
||||||
"requestType": "SetCurrentScene",
|
"requestType": "SetCurrentProgramScene",
|
||||||
"requestId": "f819dcf0-89cc-11eb-8f0e-382c4ac93b9c",
|
"requestId": "f819dcf0-89cc-11eb-8f0e-382c4ac93b9c",
|
||||||
"requestData": {
|
"requestData": {
|
||||||
"sceneName": "Scene 12"
|
"sceneName": "Scene 12"
|
||||||
@ -357,7 +357,7 @@ Successful Response
|
|||||||
{
|
{
|
||||||
"op": 7,
|
"op": 7,
|
||||||
"d": {
|
"d": {
|
||||||
"requestType": "SetCurrentScene",
|
"requestType": "SetCurrentProgramScene",
|
||||||
"requestId": "f819dcf0-89cc-11eb-8f0e-382c4ac93b9c",
|
"requestId": "f819dcf0-89cc-11eb-8f0e-382c4ac93b9c",
|
||||||
"requestStatus": {
|
"requestStatus": {
|
||||||
"result": true,
|
"result": true,
|
||||||
@ -373,7 +373,7 @@ Failure Response
|
|||||||
{
|
{
|
||||||
"op": 7,
|
"op": 7,
|
||||||
"d": {
|
"d": {
|
||||||
"requestType": "SetCurrentScene",
|
"requestType": "SetCurrentProgramScene",
|
||||||
"requestId": "f819dcf0-89cc-11eb-8f0e-382c4ac93b9c",
|
"requestId": "f819dcf0-89cc-11eb-8f0e-382c4ac93b9c",
|
||||||
"requestStatus": {
|
"requestStatus": {
|
||||||
"result": false,
|
"result": false,
|
||||||
|
@ -105,7 +105,7 @@
|
|||||||
"rpcVersion": "1",
|
"rpcVersion": "1",
|
||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"initialVersion": "5.0.0",
|
"initialVersion": "5.0.0",
|
||||||
"enumValue": "(General | Config | Scenes | Inputs | Transitions | Filters | Outputs | SceneItems | MediaInputs | Vendors)"
|
"enumValue": "(General | Config | Scenes | Inputs | Transitions | Filters | Outputs | SceneItems | MediaInputs | Vendors | Ui)"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"description": "Subscription value to receive the `InputVolumeMeters` high-volume event.",
|
"description": "Subscription value to receive the `InputVolumeMeters` high-volume event.",
|
||||||
@ -1144,7 +1144,7 @@
|
|||||||
"rpcVersion": "1",
|
"rpcVersion": "1",
|
||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
"initialVersion": "5.0.0",
|
"initialVersion": "5.0.0",
|
||||||
"category": "rconfig",
|
"category": "config",
|
||||||
"requestFields": [],
|
"requestFields": [],
|
||||||
"responseFields": [
|
"responseFields": [
|
||||||
{
|
{
|
||||||
@ -1648,6 +1648,16 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"responseFields": [
|
"responseFields": [
|
||||||
|
{
|
||||||
|
"valueName": "vendorName",
|
||||||
|
"valueType": "String",
|
||||||
|
"valueDescription": "Echoed of `vendorName`"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"valueName": "requestType",
|
||||||
|
"valueType": "String",
|
||||||
|
"valueDescription": "Echoed of `requestType`"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"valueName": "responseData",
|
"valueName": "responseData",
|
||||||
"valueType": "Object",
|
"valueType": "Object",
|
||||||
@ -2758,6 +2768,198 @@
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"description": "Gets the list of available outputs.",
|
||||||
|
"requestType": "GetOutputList",
|
||||||
|
"complexity": 4,
|
||||||
|
"rpcVersion": "1",
|
||||||
|
"deprecated": false,
|
||||||
|
"initialVersion": "5.0.0",
|
||||||
|
"category": "outputs",
|
||||||
|
"requestFields": [],
|
||||||
|
"responseFields": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"description": "Gets the status of an output.",
|
||||||
|
"requestType": "GetOutputStatus",
|
||||||
|
"complexity": 4,
|
||||||
|
"rpcVersion": "1",
|
||||||
|
"deprecated": false,
|
||||||
|
"initialVersion": "5.0.0",
|
||||||
|
"category": "outputs",
|
||||||
|
"requestFields": [
|
||||||
|
{
|
||||||
|
"valueName": "outputName",
|
||||||
|
"valueType": "String",
|
||||||
|
"valueDescription": "Output name",
|
||||||
|
"valueRestrictions": null,
|
||||||
|
"valueOptional": false,
|
||||||
|
"valueOptionalBehavior": null
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"responseFields": [
|
||||||
|
{
|
||||||
|
"valueName": "outputActive",
|
||||||
|
"valueType": "Boolean",
|
||||||
|
"valueDescription": "Whether the output is active"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"valueName": "outputReconnecting",
|
||||||
|
"valueType": "Boolean",
|
||||||
|
"valueDescription": "Whether the output is reconnecting"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"valueName": "outputTimecode",
|
||||||
|
"valueType": "String",
|
||||||
|
"valueDescription": "Current formatted timecode string for the output"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"valueName": "outputDuration",
|
||||||
|
"valueType": "Number",
|
||||||
|
"valueDescription": "Current duration in milliseconds for the output"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"valueName": "outputCongestion",
|
||||||
|
"valueType": "Number",
|
||||||
|
"valueDescription": "Congestion of the output"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"valueName": "outputBytes",
|
||||||
|
"valueType": "Number",
|
||||||
|
"valueDescription": "Number of bytes sent by the output"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"valueName": "outputSkippedFrames",
|
||||||
|
"valueType": "Number",
|
||||||
|
"valueDescription": "Number of frames skipped by the output's process"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"valueName": "outputTotalFrames",
|
||||||
|
"valueType": "Number",
|
||||||
|
"valueDescription": "Total number of frames delivered by the output's process"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"description": "Toggles the status of an output.",
|
||||||
|
"requestType": "ToggleOutput",
|
||||||
|
"complexity": 4,
|
||||||
|
"rpcVersion": "1",
|
||||||
|
"deprecated": false,
|
||||||
|
"initialVersion": "5.0.0",
|
||||||
|
"category": "outputs",
|
||||||
|
"requestFields": [
|
||||||
|
{
|
||||||
|
"valueName": "outputName",
|
||||||
|
"valueType": "String",
|
||||||
|
"valueDescription": "Output name",
|
||||||
|
"valueRestrictions": null,
|
||||||
|
"valueOptional": false,
|
||||||
|
"valueOptionalBehavior": null
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"responseFields": [
|
||||||
|
{
|
||||||
|
"valueName": "outputActive",
|
||||||
|
"valueType": "Boolean",
|
||||||
|
"valueDescription": "Whether the output is active"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"description": "Starts an output.",
|
||||||
|
"requestType": "StartOutput",
|
||||||
|
"complexity": 4,
|
||||||
|
"rpcVersion": "1",
|
||||||
|
"deprecated": false,
|
||||||
|
"initialVersion": "5.0.0",
|
||||||
|
"category": "outputs",
|
||||||
|
"requestFields": [
|
||||||
|
{
|
||||||
|
"valueName": "outputName",
|
||||||
|
"valueType": "String",
|
||||||
|
"valueDescription": "Output name",
|
||||||
|
"valueRestrictions": null,
|
||||||
|
"valueOptional": false,
|
||||||
|
"valueOptionalBehavior": null
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"responseFields": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"description": "Stops an output.",
|
||||||
|
"requestType": "StopOutput",
|
||||||
|
"complexity": 4,
|
||||||
|
"rpcVersion": "1",
|
||||||
|
"deprecated": false,
|
||||||
|
"initialVersion": "5.0.0",
|
||||||
|
"category": "outputs",
|
||||||
|
"requestFields": [
|
||||||
|
{
|
||||||
|
"valueName": "outputName",
|
||||||
|
"valueType": "String",
|
||||||
|
"valueDescription": "Output name",
|
||||||
|
"valueRestrictions": null,
|
||||||
|
"valueOptional": false,
|
||||||
|
"valueOptionalBehavior": null
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"responseFields": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"description": "Gets the settings of an output.",
|
||||||
|
"requestType": "GetOutputSettings",
|
||||||
|
"complexity": 4,
|
||||||
|
"rpcVersion": "1",
|
||||||
|
"deprecated": false,
|
||||||
|
"initialVersion": "5.0.0",
|
||||||
|
"category": "outputs",
|
||||||
|
"requestFields": [
|
||||||
|
{
|
||||||
|
"valueName": "outputName",
|
||||||
|
"valueType": "String",
|
||||||
|
"valueDescription": "Output name",
|
||||||
|
"valueRestrictions": null,
|
||||||
|
"valueOptional": false,
|
||||||
|
"valueOptionalBehavior": null
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"responseFields": [
|
||||||
|
{
|
||||||
|
"valueName": "outputSettings",
|
||||||
|
"valueType": "Object",
|
||||||
|
"valueDescription": "Output settings"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"description": "Sets the settings of an output.",
|
||||||
|
"requestType": "SetOutputSettings",
|
||||||
|
"complexity": 4,
|
||||||
|
"rpcVersion": "1",
|
||||||
|
"deprecated": false,
|
||||||
|
"initialVersion": "5.0.0",
|
||||||
|
"category": "outputs",
|
||||||
|
"requestFields": [
|
||||||
|
{
|
||||||
|
"valueName": "outputName",
|
||||||
|
"valueType": "String",
|
||||||
|
"valueDescription": "Output name",
|
||||||
|
"valueRestrictions": null,
|
||||||
|
"valueOptional": false,
|
||||||
|
"valueOptionalBehavior": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"valueName": "outputSettings",
|
||||||
|
"valueType": "Object",
|
||||||
|
"valueDescription": "Output settings",
|
||||||
|
"valueRestrictions": null,
|
||||||
|
"valueOptional": false,
|
||||||
|
"valueOptionalBehavior": null
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"responseFields": []
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"description": "Gets the status of the record output.",
|
"description": "Gets the status of the record output.",
|
||||||
"requestType": "GetRecordStatus",
|
"requestType": "GetRecordStatus",
|
||||||
@ -2826,7 +3028,13 @@
|
|||||||
"initialVersion": "5.0.0",
|
"initialVersion": "5.0.0",
|
||||||
"category": "record",
|
"category": "record",
|
||||||
"requestFields": [],
|
"requestFields": [],
|
||||||
"responseFields": []
|
"responseFields": [
|
||||||
|
{
|
||||||
|
"valueName": "outputPath",
|
||||||
|
"valueType": "String",
|
||||||
|
"valueDescription": "File name for the saved recording"
|
||||||
|
}
|
||||||
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"description": "Toggles pause on the record output.",
|
"description": "Toggles pause on the record output.",
|
||||||
@ -2889,7 +3097,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.\n\nGroups only",
|
||||||
"requestType": "GetGroupItemList",
|
"requestType": "GetGroupSceneItemList",
|
||||||
"complexity": 3,
|
"complexity": 3,
|
||||||
"rpcVersion": "1",
|
"rpcVersion": "1",
|
||||||
"deprecated": false,
|
"deprecated": false,
|
||||||
@ -3855,6 +4063,11 @@
|
|||||||
"valueType": "Number",
|
"valueType": "Number",
|
||||||
"valueDescription": "Current duration in milliseconds for the output"
|
"valueDescription": "Current duration in milliseconds for the output"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"valueName": "outputCongestion",
|
||||||
|
"valueType": "Number",
|
||||||
|
"valueDescription": "Congestion of the output"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"valueName": "outputBytes",
|
"valueName": "outputBytes",
|
||||||
"valueType": "Number",
|
"valueType": "Number",
|
||||||
@ -4254,6 +4467,78 @@
|
|||||||
"valueDescription": "a list of detected monitors with some information"
|
"valueDescription": "a list of detected monitors with some information"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"description": "Opens a projector for a specific output video mix.\n\nMix types:\n\n- `OBS_WEBSOCKET_VIDEO_MIX_TYPE_PREVIEW`\n- `OBS_WEBSOCKET_VIDEO_MIX_TYPE_PROGRAM`\n- `OBS_WEBSOCKET_VIDEO_MIX_TYPE_MULTIVIEW`\n\nNote: This request serves to provide feature parity with 4.x. It is very likely to be changed/deprecated in a future release.",
|
||||||
|
"requestType": "OpenVideoMixProjector",
|
||||||
|
"complexity": 3,
|
||||||
|
"rpcVersion": "1",
|
||||||
|
"deprecated": false,
|
||||||
|
"initialVersion": "5.0.0",
|
||||||
|
"category": "ui",
|
||||||
|
"requestFields": [
|
||||||
|
{
|
||||||
|
"valueName": "videoMixType",
|
||||||
|
"valueType": "String",
|
||||||
|
"valueDescription": "Type of mix to open",
|
||||||
|
"valueRestrictions": null,
|
||||||
|
"valueOptional": false,
|
||||||
|
"valueOptionalBehavior": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"valueName": "monitorIndex",
|
||||||
|
"valueType": "Number",
|
||||||
|
"valueDescription": "Monitor index, use `GetMonitorList` to obtain index",
|
||||||
|
"valueRestrictions": null,
|
||||||
|
"valueOptional": true,
|
||||||
|
"valueOptionalBehavior": "-1: Opens projector in windowed mode"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"valueName": "projectorGeometry",
|
||||||
|
"valueType": "String",
|
||||||
|
"valueDescription": "Size/Position data for a windowed projector, in Qt Base64 encoded format. Mutually exclusive with `monitorIndex`",
|
||||||
|
"valueRestrictions": null,
|
||||||
|
"valueOptional": true,
|
||||||
|
"valueOptionalBehavior": "N/A"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"responseFields": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"description": "Opens a projector for a source.\n\nNote: This request serves to provide feature parity with 4.x. It is very likely to be changed/deprecated in a future release.",
|
||||||
|
"requestType": "OpenSourceProjector",
|
||||||
|
"complexity": 3,
|
||||||
|
"rpcVersion": "1",
|
||||||
|
"deprecated": false,
|
||||||
|
"initialVersion": "5.0.0",
|
||||||
|
"category": "ui",
|
||||||
|
"requestFields": [
|
||||||
|
{
|
||||||
|
"valueName": "sourceName",
|
||||||
|
"valueType": "String",
|
||||||
|
"valueDescription": "Name of the source to open a projector for",
|
||||||
|
"valueRestrictions": null,
|
||||||
|
"valueOptional": false,
|
||||||
|
"valueOptionalBehavior": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"valueName": "monitorIndex",
|
||||||
|
"valueType": "Number",
|
||||||
|
"valueDescription": "Monitor index, use `GetMonitorList` to obtain index",
|
||||||
|
"valueRestrictions": null,
|
||||||
|
"valueOptional": true,
|
||||||
|
"valueOptionalBehavior": "-1: Opens projector in windowed mode"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"valueName": "projectorGeometry",
|
||||||
|
"valueType": "String",
|
||||||
|
"valueDescription": "Size/Position data for a windowed projector, in Qt Base64 encoded format. Mutually exclusive with `monitorIndex`",
|
||||||
|
"valueRestrictions": null,
|
||||||
|
"valueOptional": true,
|
||||||
|
"valueOptionalBehavior": "N/A"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"responseFields": []
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"events": [
|
"events": [
|
||||||
@ -4881,6 +5166,11 @@
|
|||||||
"valueName": "outputState",
|
"valueName": "outputState",
|
||||||
"valueType": "String",
|
"valueType": "String",
|
||||||
"valueDescription": "The specific state of the output"
|
"valueDescription": "The specific state of the output"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"valueName": "outputPath",
|
||||||
|
"valueType": "String",
|
||||||
|
"valueDescription": "File name for the saved recording, if record stopped. `null` otherwise"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
@ -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.0 Protocol
|
# obs-websocket 5.0.1 Protocol
|
||||||
|
|
||||||
## Main Table of Contents
|
## Main Table of Contents
|
||||||
|
|
||||||
@ -145,7 +145,7 @@ Authentication is required
|
|||||||
{
|
{
|
||||||
"op": 0,
|
"op": 0,
|
||||||
"d": {
|
"d": {
|
||||||
"obsWebSocketVersion": "5.0.0",
|
"obsWebSocketVersion": "5.0.1",
|
||||||
"rpcVersion": 1,
|
"rpcVersion": 1,
|
||||||
"authentication": {
|
"authentication": {
|
||||||
"challenge": "+IxH4CnCiqpX1rM9scsNynZzbOe4KhDeYcTNS3PDaeY=",
|
"challenge": "+IxH4CnCiqpX1rM9scsNynZzbOe4KhDeYcTNS3PDaeY=",
|
||||||
@ -161,7 +161,7 @@ Authentication is not required
|
|||||||
{
|
{
|
||||||
"op": 0,
|
"op": 0,
|
||||||
"d": {
|
"d": {
|
||||||
"obsWebSocketVersion": "5.0.0",
|
"obsWebSocketVersion": "5.0.1",
|
||||||
"rpcVersion": 1
|
"rpcVersion": 1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -308,7 +308,7 @@ Authentication is not required
|
|||||||
{
|
{
|
||||||
"op": 6,
|
"op": 6,
|
||||||
"d": {
|
"d": {
|
||||||
"requestType": "SetCurrentScene",
|
"requestType": "SetCurrentProgramScene",
|
||||||
"requestId": "f819dcf0-89cc-11eb-8f0e-382c4ac93b9c",
|
"requestId": "f819dcf0-89cc-11eb-8f0e-382c4ac93b9c",
|
||||||
"requestData": {
|
"requestData": {
|
||||||
"sceneName": "Scene 12"
|
"sceneName": "Scene 12"
|
||||||
@ -359,7 +359,7 @@ Successful Response
|
|||||||
{
|
{
|
||||||
"op": 7,
|
"op": 7,
|
||||||
"d": {
|
"d": {
|
||||||
"requestType": "SetCurrentScene",
|
"requestType": "SetCurrentProgramScene",
|
||||||
"requestId": "f819dcf0-89cc-11eb-8f0e-382c4ac93b9c",
|
"requestId": "f819dcf0-89cc-11eb-8f0e-382c4ac93b9c",
|
||||||
"requestStatus": {
|
"requestStatus": {
|
||||||
"result": true,
|
"result": true,
|
||||||
@ -375,7 +375,7 @@ Failure Response
|
|||||||
{
|
{
|
||||||
"op": 7,
|
"op": 7,
|
||||||
"d": {
|
"d": {
|
||||||
"requestType": "SetCurrentScene",
|
"requestType": "SetCurrentProgramScene",
|
||||||
"requestId": "f819dcf0-89cc-11eb-8f0e-382c4ac93b9c",
|
"requestId": "f819dcf0-89cc-11eb-8f0e-382c4ac93b9c",
|
||||||
"requestStatus": {
|
"requestStatus": {
|
||||||
"result": false,
|
"result": false,
|
||||||
@ -1250,7 +1250,7 @@ Subscription value to receive events in the `Ui` category.
|
|||||||
|
|
||||||
Helper to receive all non-high-volume events.
|
Helper to receive all non-high-volume events.
|
||||||
|
|
||||||
- Identifier Value: `(General | Config | Scenes | Inputs | Transitions | Filters | Outputs | SceneItems | MediaInputs | Vendors)`
|
- Identifier Value: `(General | Config | Scenes | Inputs | Transitions | Filters | Outputs | SceneItems | MediaInputs | Vendors | Ui)`
|
||||||
- Latest Supported RPC Version: `1`
|
- Latest Supported RPC Version: `1`
|
||||||
- Added in v5.0.0
|
- Added in v5.0.0
|
||||||
|
|
||||||
@ -2148,6 +2148,7 @@ The state of the record output has changed.
|
|||||||
| ---- | :---: | ----------- |
|
| ---- | :---: | ----------- |
|
||||||
| outputActive | Boolean | Whether the output is active |
|
| outputActive | Boolean | Whether the output is active |
|
||||||
| outputState | String | The specific state of the output |
|
| outputState | String | The specific state of the output |
|
||||||
|
| outputPath | String | File name for the saved recording, if record stopped. `null` otherwise |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@ -2293,6 +2294,7 @@ Studio mode has been enabled or disabled.
|
|||||||
- [SetVideoSettings](#setvideosettings)
|
- [SetVideoSettings](#setvideosettings)
|
||||||
- [GetStreamServiceSettings](#getstreamservicesettings)
|
- [GetStreamServiceSettings](#getstreamservicesettings)
|
||||||
- [SetStreamServiceSettings](#setstreamservicesettings)
|
- [SetStreamServiceSettings](#setstreamservicesettings)
|
||||||
|
- [GetRecordDirectory](#getrecorddirectory)
|
||||||
- [Sources Requests](#sources-requests)
|
- [Sources Requests](#sources-requests)
|
||||||
- [GetSourceActive](#getsourceactive)
|
- [GetSourceActive](#getsourceactive)
|
||||||
- [GetSourceScreenshot](#getsourcescreenshot)
|
- [GetSourceScreenshot](#getsourcescreenshot)
|
||||||
@ -2356,7 +2358,7 @@ Studio mode has been enabled or disabled.
|
|||||||
- [SetSourceFilterEnabled](#setsourcefilterenabled)
|
- [SetSourceFilterEnabled](#setsourcefilterenabled)
|
||||||
- [Scene Items Requests](#scene-items-1-requests)
|
- [Scene Items Requests](#scene-items-1-requests)
|
||||||
- [GetSceneItemList](#getsceneitemlist)
|
- [GetSceneItemList](#getsceneitemlist)
|
||||||
- [GetGroupItemList](#getgroupitemlist)
|
- [GetGroupSceneItemList](#getgroupsceneitemlist)
|
||||||
- [GetSceneItemId](#getsceneitemid)
|
- [GetSceneItemId](#getsceneitemid)
|
||||||
- [CreateSceneItem](#createsceneitem)
|
- [CreateSceneItem](#createsceneitem)
|
||||||
- [RemoveSceneItem](#removesceneitem)
|
- [RemoveSceneItem](#removesceneitem)
|
||||||
@ -2382,6 +2384,13 @@ Studio mode has been enabled or disabled.
|
|||||||
- [StopReplayBuffer](#stopreplaybuffer)
|
- [StopReplayBuffer](#stopreplaybuffer)
|
||||||
- [SaveReplayBuffer](#savereplaybuffer)
|
- [SaveReplayBuffer](#savereplaybuffer)
|
||||||
- [GetLastReplayBufferReplay](#getlastreplaybufferreplay)
|
- [GetLastReplayBufferReplay](#getlastreplaybufferreplay)
|
||||||
|
- [GetOutputList](#getoutputlist)
|
||||||
|
- [GetOutputStatus](#getoutputstatus)
|
||||||
|
- [ToggleOutput](#toggleoutput)
|
||||||
|
- [StartOutput](#startoutput)
|
||||||
|
- [StopOutput](#stopoutput)
|
||||||
|
- [GetOutputSettings](#getoutputsettings)
|
||||||
|
- [SetOutputSettings](#setoutputsettings)
|
||||||
- [Stream Requests](#stream-requests)
|
- [Stream Requests](#stream-requests)
|
||||||
- [GetStreamStatus](#getstreamstatus)
|
- [GetStreamStatus](#getstreamstatus)
|
||||||
- [ToggleStream](#togglestream)
|
- [ToggleStream](#togglestream)
|
||||||
@ -2408,6 +2417,8 @@ Studio mode has been enabled or disabled.
|
|||||||
- [OpenInputFiltersDialog](#openinputfiltersdialog)
|
- [OpenInputFiltersDialog](#openinputfiltersdialog)
|
||||||
- [OpenInputInteractDialog](#openinputinteractdialog)
|
- [OpenInputInteractDialog](#openinputinteractdialog)
|
||||||
- [GetMonitorList](#getmonitorlist)
|
- [GetMonitorList](#getmonitorlist)
|
||||||
|
- [OpenVideoMixProjector](#openvideomixprojector)
|
||||||
|
- [OpenSourceProjector](#opensourceprojector)
|
||||||
|
|
||||||
## General Requests
|
## General Requests
|
||||||
|
|
||||||
@ -2498,6 +2509,8 @@ If a plugin or script implements vendor requests or events, documentation is exp
|
|||||||
|
|
||||||
| Name | Type | Description |
|
| Name | Type | Description |
|
||||||
| ---- | :---: | ----------- |
|
| ---- | :---: | ----------- |
|
||||||
|
| vendorName | String | Echoed of `vendorName` |
|
||||||
|
| requestType | String | Echoed of `requestType` |
|
||||||
| responseData | Object | Object containing appropriate response data. {} if request does not provide any response data |
|
| responseData | Object | Object containing appropriate response data. {} if request does not provide any response data |
|
||||||
|
|
||||||
---
|
---
|
||||||
@ -2853,6 +2866,22 @@ Note: Simple RTMP settings can be set with type `rtmp_custom` and the settings f
|
|||||||
| streamServiceType | String | Type of stream service to apply. Example: `rtmp_common` or `rtmp_custom` | None | N/A |
|
| streamServiceType | String | Type of stream service to apply. Example: `rtmp_common` or `rtmp_custom` | None | N/A |
|
||||||
| streamServiceSettings | Object | Settings to apply to the service | None | N/A |
|
| streamServiceSettings | Object | Settings to apply to the service | None | N/A |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### GetRecordDirectory
|
||||||
|
|
||||||
|
Gets the current directory that the record output is set to.
|
||||||
|
|
||||||
|
- Complexity Rating: `1/5`
|
||||||
|
- Latest Supported RPC Version: `1`
|
||||||
|
- Added in v5.0.0
|
||||||
|
|
||||||
|
**Response Fields:**
|
||||||
|
|
||||||
|
| Name | Type | Description |
|
||||||
|
| ---- | :---: | ----------- |
|
||||||
|
| recordDirectory | String | Output directory |
|
||||||
|
|
||||||
## Sources Requests
|
## Sources Requests
|
||||||
|
|
||||||
### GetSourceActive
|
### GetSourceActive
|
||||||
@ -3996,7 +4025,7 @@ Scenes only
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### GetGroupItemList
|
### GetGroupSceneItemList
|
||||||
|
|
||||||
Basically GetSceneItemList, but for groups.
|
Basically GetSceneItemList, but for groups.
|
||||||
|
|
||||||
@ -4482,6 +4511,138 @@ Gets the filename of the last replay buffer save file.
|
|||||||
| ---- | :---: | ----------- |
|
| ---- | :---: | ----------- |
|
||||||
| savedReplayPath | String | File path |
|
| savedReplayPath | String | File path |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### GetOutputList
|
||||||
|
|
||||||
|
Gets the list of available outputs.
|
||||||
|
|
||||||
|
- Complexity Rating: `4/5`
|
||||||
|
- Latest Supported RPC Version: `1`
|
||||||
|
- Added in v5.0.0
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### GetOutputStatus
|
||||||
|
|
||||||
|
Gets the status of an output.
|
||||||
|
|
||||||
|
- Complexity Rating: `4/5`
|
||||||
|
- Latest Supported RPC Version: `1`
|
||||||
|
- Added in v5.0.0
|
||||||
|
|
||||||
|
**Request Fields:**
|
||||||
|
|
||||||
|
| Name | Type | Description | Value Restrictions | ?Default Behavior |
|
||||||
|
| ---- | :---: | ----------- | :----------------: | ----------------- |
|
||||||
|
| outputName | String | Output name | None | N/A |
|
||||||
|
|
||||||
|
**Response Fields:**
|
||||||
|
|
||||||
|
| Name | Type | Description |
|
||||||
|
| ---- | :---: | ----------- |
|
||||||
|
| outputActive | Boolean | Whether the output is active |
|
||||||
|
| outputReconnecting | Boolean | Whether the output is reconnecting |
|
||||||
|
| outputTimecode | String | Current formatted timecode string for the output |
|
||||||
|
| outputDuration | Number | Current duration in milliseconds for the output |
|
||||||
|
| outputCongestion | Number | Congestion of the output |
|
||||||
|
| outputBytes | Number | Number of bytes sent by the output |
|
||||||
|
| outputSkippedFrames | Number | Number of frames skipped by the output's process |
|
||||||
|
| outputTotalFrames | Number | Total number of frames delivered by the output's process |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### ToggleOutput
|
||||||
|
|
||||||
|
Toggles the status of an output.
|
||||||
|
|
||||||
|
- Complexity Rating: `4/5`
|
||||||
|
- Latest Supported RPC Version: `1`
|
||||||
|
- Added in v5.0.0
|
||||||
|
|
||||||
|
**Request Fields:**
|
||||||
|
|
||||||
|
| Name | Type | Description | Value Restrictions | ?Default Behavior |
|
||||||
|
| ---- | :---: | ----------- | :----------------: | ----------------- |
|
||||||
|
| outputName | String | Output name | None | N/A |
|
||||||
|
|
||||||
|
**Response Fields:**
|
||||||
|
|
||||||
|
| Name | Type | Description |
|
||||||
|
| ---- | :---: | ----------- |
|
||||||
|
| outputActive | Boolean | Whether the output is active |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### StartOutput
|
||||||
|
|
||||||
|
Starts an output.
|
||||||
|
|
||||||
|
- Complexity Rating: `4/5`
|
||||||
|
- Latest Supported RPC Version: `1`
|
||||||
|
- Added in v5.0.0
|
||||||
|
|
||||||
|
**Request Fields:**
|
||||||
|
|
||||||
|
| Name | Type | Description | Value Restrictions | ?Default Behavior |
|
||||||
|
| ---- | :---: | ----------- | :----------------: | ----------------- |
|
||||||
|
| outputName | String | Output name | None | N/A |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### StopOutput
|
||||||
|
|
||||||
|
Stops an output.
|
||||||
|
|
||||||
|
- Complexity Rating: `4/5`
|
||||||
|
- Latest Supported RPC Version: `1`
|
||||||
|
- Added in v5.0.0
|
||||||
|
|
||||||
|
**Request Fields:**
|
||||||
|
|
||||||
|
| Name | Type | Description | Value Restrictions | ?Default Behavior |
|
||||||
|
| ---- | :---: | ----------- | :----------------: | ----------------- |
|
||||||
|
| outputName | String | Output name | None | N/A |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### GetOutputSettings
|
||||||
|
|
||||||
|
Gets the settings of an output.
|
||||||
|
|
||||||
|
- Complexity Rating: `4/5`
|
||||||
|
- Latest Supported RPC Version: `1`
|
||||||
|
- Added in v5.0.0
|
||||||
|
|
||||||
|
**Request Fields:**
|
||||||
|
|
||||||
|
| Name | Type | Description | Value Restrictions | ?Default Behavior |
|
||||||
|
| ---- | :---: | ----------- | :----------------: | ----------------- |
|
||||||
|
| outputName | String | Output name | None | N/A |
|
||||||
|
|
||||||
|
**Response Fields:**
|
||||||
|
|
||||||
|
| Name | Type | Description |
|
||||||
|
| ---- | :---: | ----------- |
|
||||||
|
| outputSettings | Object | Output settings |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### SetOutputSettings
|
||||||
|
|
||||||
|
Sets the settings of an output.
|
||||||
|
|
||||||
|
- Complexity Rating: `4/5`
|
||||||
|
- Latest Supported RPC Version: `1`
|
||||||
|
- Added in v5.0.0
|
||||||
|
|
||||||
|
**Request Fields:**
|
||||||
|
|
||||||
|
| Name | Type | Description | Value Restrictions | ?Default Behavior |
|
||||||
|
| ---- | :---: | ----------- | :----------------: | ----------------- |
|
||||||
|
| outputName | String | Output name | None | N/A |
|
||||||
|
| outputSettings | Object | Output settings | None | N/A |
|
||||||
|
|
||||||
## Stream Requests
|
## Stream Requests
|
||||||
|
|
||||||
### GetStreamStatus
|
### GetStreamStatus
|
||||||
@ -4500,6 +4661,7 @@ Gets the status of the stream output.
|
|||||||
| outputReconnecting | Boolean | Whether the output is currently reconnecting |
|
| outputReconnecting | Boolean | Whether the output is currently reconnecting |
|
||||||
| 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 |
|
||||||
|
| outputCongestion | Number | Congestion of the output |
|
||||||
| outputBytes | Number | Number of bytes sent by the output |
|
| outputBytes | Number | Number of bytes sent by the output |
|
||||||
| outputSkippedFrames | Number | Number of frames skipped by the output's process |
|
| outputSkippedFrames | Number | Number of frames skipped by the output's process |
|
||||||
| outputTotalFrames | Number | Total number of frames delivered by the output's process |
|
| outputTotalFrames | Number | Total number of frames delivered by the output's process |
|
||||||
@ -4606,6 +4768,12 @@ Stops the record output.
|
|||||||
- 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 |
|
||||||
|
| ---- | :---: | ----------- |
|
||||||
|
| outputPath | String | File name for the saved recording |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### ToggleRecordPause
|
### ToggleRecordPause
|
||||||
@ -4821,3 +4989,49 @@ Gets a list of connected monitors and information about them.
|
|||||||
| Name | Type | Description |
|
| Name | Type | Description |
|
||||||
| ---- | :---: | ----------- |
|
| ---- | :---: | ----------- |
|
||||||
| monitors | Array<Object> | a list of detected monitors with some information |
|
| monitors | Array<Object> | a list of detected monitors with some information |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### OpenVideoMixProjector
|
||||||
|
|
||||||
|
Opens a projector for a specific output video mix.
|
||||||
|
|
||||||
|
Mix types:
|
||||||
|
|
||||||
|
- `OBS_WEBSOCKET_VIDEO_MIX_TYPE_PREVIEW`
|
||||||
|
- `OBS_WEBSOCKET_VIDEO_MIX_TYPE_PROGRAM`
|
||||||
|
- `OBS_WEBSOCKET_VIDEO_MIX_TYPE_MULTIVIEW`
|
||||||
|
|
||||||
|
Note: This request serves to provide feature parity with 4.x. It is very likely to be changed/deprecated in a future release.
|
||||||
|
|
||||||
|
- Complexity Rating: `3/5`
|
||||||
|
- Latest Supported RPC Version: `1`
|
||||||
|
- Added in v5.0.0
|
||||||
|
|
||||||
|
**Request Fields:**
|
||||||
|
|
||||||
|
| Name | Type | Description | Value Restrictions | ?Default Behavior |
|
||||||
|
| ---- | :---: | ----------- | :----------------: | ----------------- |
|
||||||
|
| videoMixType | String | Type of mix to open | None | N/A |
|
||||||
|
| ?monitorIndex | Number | Monitor index, use `GetMonitorList` to obtain index | None | -1: Opens projector in windowed mode |
|
||||||
|
| ?projectorGeometry | String | Size/Position data for a windowed projector, in Qt Base64 encoded format. Mutually exclusive with `monitorIndex` | None | N/A |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### OpenSourceProjector
|
||||||
|
|
||||||
|
Opens a projector for a source.
|
||||||
|
|
||||||
|
Note: This request serves to provide feature parity with 4.x. It is very likely to be changed/deprecated in a future release.
|
||||||
|
|
||||||
|
- Complexity Rating: `3/5`
|
||||||
|
- Latest Supported RPC Version: `1`
|
||||||
|
- Added in v5.0.0
|
||||||
|
|
||||||
|
**Request Fields:**
|
||||||
|
|
||||||
|
| Name | Type | Description | Value Restrictions | ?Default Behavior |
|
||||||
|
| ---- | :---: | ----------- | :----------------: | ----------------- |
|
||||||
|
| sourceName | String | Name of the source to open a projector for | None | N/A |
|
||||||
|
| ?monitorIndex | Number | Monitor index, use `GetMonitorList` to obtain index | None | -1: Opens projector in windowed mode |
|
||||||
|
| ?projectorGeometry | String | Size/Position data for a windowed projector, in Qt Base64 encoded format. Mutually exclusive with `monitorIndex` | None | N/A |
|
||||||
|
@ -1,74 +0,0 @@
|
|||||||
#define MyAppName "obs-websocket"
|
|
||||||
#define MyAppVersion "@OBS_WEBSOCKET_VERSION@"
|
|
||||||
#define MyAppPublisher "obs-websocket"
|
|
||||||
#define MyAppURL "http://github.com/obsproject/obs-websocket"
|
|
||||||
|
|
||||||
[Setup]
|
|
||||||
; NOTE: The value of AppId uniquely identifies this application.
|
|
||||||
; Do not use the same AppId value in installers for other applications.
|
|
||||||
; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
|
|
||||||
AppId={{117EE44F-48E1-49E5-A381-CC8D9195CF35}
|
|
||||||
AppName={#MyAppName}
|
|
||||||
AppVersion={#MyAppVersion}
|
|
||||||
AppPublisher={#MyAppPublisher}
|
|
||||||
AppPublisherURL={#MyAppURL}
|
|
||||||
AppSupportURL={#MyAppURL}
|
|
||||||
AppUpdatesURL={#MyAppURL}
|
|
||||||
DefaultDirName={code:GetDirName}
|
|
||||||
DefaultGroupName={#MyAppName}
|
|
||||||
OutputBaseFilename=obs-websocket-{#MyAppVersion}-Windows-Installer
|
|
||||||
Compression=lzma
|
|
||||||
SolidCompression=yes
|
|
||||||
DirExistsWarning=no
|
|
||||||
|
|
||||||
[Languages]
|
|
||||||
Name: "english"; MessagesFile: "compiler:Default.isl"
|
|
||||||
|
|
||||||
[Files]
|
|
||||||
Source: "..\release\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
|
|
||||||
Source: "..\LICENSE"; Flags: dontcopy
|
|
||||||
; NOTE: Don't use "Flags: ignoreversion" on any shared system files
|
|
||||||
|
|
||||||
[Icons]
|
|
||||||
Name: "{group}\{cm:ProgramOnTheWeb,{#MyAppName}}"; Filename: "{#MyAppURL}"
|
|
||||||
Name: "{group}\{cm:UninstallProgram,{#MyAppName}}"; Filename: "{uninstallexe}"
|
|
||||||
|
|
||||||
[Code]
|
|
||||||
procedure InitializeWizard();
|
|
||||||
var
|
|
||||||
GPLText: AnsiString;
|
|
||||||
Page: TOutputMsgMemoWizardPage;
|
|
||||||
begin
|
|
||||||
ExtractTemporaryFile('LICENSE');
|
|
||||||
LoadStringFromFile(ExpandConstant('{tmp}\LICENSE'), GPLText);
|
|
||||||
Page := CreateOutputMsgMemoPage(wpWelcome,
|
|
||||||
'License Information', 'Please review the license terms before installing obs-websocket',
|
|
||||||
'Press Page Down to see the rest of the agreement. Once you are aware of your rights, click Next to continue.',
|
|
||||||
String(GPLText)
|
|
||||||
);
|
|
||||||
end;
|
|
||||||
|
|
||||||
// Validate that obs-studio is installed before installing the plugin
|
|
||||||
function PrepareToInstall(var NeedsRestart: Boolean): String;
|
|
||||||
begin
|
|
||||||
Result := '';
|
|
||||||
|
|
||||||
if not DirExists(ExpandConstant('{app}\obs-plugins')) then
|
|
||||||
begin
|
|
||||||
Result := 'The selected install directory does not appear to be valid. Please install OBS Studio before installing {#MyAppName} or correct your install path.';
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
|
|
||||||
// credit where it's due :
|
|
||||||
// following function come from https://github.com/Xaymar/obs-studio_amf-encoder-plugin/blob/master/%23Resources/Installer.in.iss#L45
|
|
||||||
function GetDirName(Value: string): string;
|
|
||||||
var
|
|
||||||
InstallPath: string;
|
|
||||||
begin
|
|
||||||
// initialize default path, which will be returned when the following registry
|
|
||||||
// key queries fail due to missing keys or for some different reason
|
|
||||||
Result := '{commonpf}\obs-studio';
|
|
||||||
// query the first registry value; if this succeeds, return the obtained value
|
|
||||||
if RegQueryStringValue(HKLM32, 'SOFTWARE\OBS Studio', '', InstallPath) then
|
|
||||||
Result := InstallPath
|
|
||||||
end;
|
|
@ -60,7 +60,8 @@ void obs_module_post_load(void)
|
|||||||
blog(LOG_ERROR, "Failed to call GetVersion due to obs-websocket not being installed.");
|
blog(LOG_ERROR, "Failed to call GetVersion due to obs-websocket not being installed.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
blog(LOG_INFO, "[obs_module_post_load] Called GetVersion. Status Code: %u | Comment: %s | Response Data: %s", response->status_code, response->comment, response->response_data);
|
blog(LOG_INFO, "[obs_module_post_load] Called GetVersion. Status Code: %u | Comment: %s | Response Data: %s",
|
||||||
|
response->status_code, response->comment, response->response_data);
|
||||||
obs_websocket_request_response_free(response);
|
obs_websocket_request_response_free(response);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -96,7 +96,7 @@ static inline unsigned int obs_websocket_get_api_version(void)
|
|||||||
if (!proc_handler_call(_ph, "get_api_version", &cd))
|
if (!proc_handler_call(_ph, "get_api_version", &cd))
|
||||||
return 1; // API v1 does not include get_api_version
|
return 1; // API v1 does not include get_api_version
|
||||||
|
|
||||||
unsigned int ret = calldata_int(&cd, "version");
|
unsigned int ret = (unsigned int)calldata_int(&cd, "version");
|
||||||
|
|
||||||
calldata_free(&cd);
|
calldata_free(&cd);
|
||||||
|
|
||||||
@ -161,7 +161,8 @@ static inline obs_websocket_vendor obs_websocket_register_vendor(const char *ven
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Registers a new request for a vendor
|
// Registers a new request for a vendor
|
||||||
static inline bool obs_websocket_vendor_register_request(obs_websocket_vendor vendor, const char *request_type, obs_websocket_request_callback_function request_callback, void* priv_data)
|
static inline bool obs_websocket_vendor_register_request(obs_websocket_vendor vendor, const char *request_type,
|
||||||
|
obs_websocket_request_callback_function request_callback, void *priv_data)
|
||||||
{
|
{
|
||||||
calldata_t cd = {0};
|
calldata_t cd = {0};
|
||||||
|
|
||||||
|
@ -28,7 +28,6 @@ with this program. If not, see <https://www.gnu.org/licenses/>
|
|||||||
#define PARAM_FIRSTLOAD "FirstLoad"
|
#define PARAM_FIRSTLOAD "FirstLoad"
|
||||||
#define PARAM_ENABLED "ServerEnabled"
|
#define PARAM_ENABLED "ServerEnabled"
|
||||||
#define PARAM_PORT "ServerPort"
|
#define PARAM_PORT "ServerPort"
|
||||||
#define PARAM_BINDLOOPBACK "BindLoopback"
|
|
||||||
#define PARAM_ALERTS "AlertsEnabled"
|
#define PARAM_ALERTS "AlertsEnabled"
|
||||||
#define PARAM_AUTHREQUIRED "AuthRequired"
|
#define PARAM_AUTHREQUIRED "AuthRequired"
|
||||||
#define PARAM_PASSWORD "ServerPassword"
|
#define PARAM_PASSWORD "ServerPassword"
|
||||||
@ -38,13 +37,12 @@ with this program. If not, see <https://www.gnu.org/licenses/>
|
|||||||
#define CMDLINE_WEBSOCKET_PASSWORD "websocket_password"
|
#define CMDLINE_WEBSOCKET_PASSWORD "websocket_password"
|
||||||
#define CMDLINE_WEBSOCKET_DEBUG "websocket_debug"
|
#define CMDLINE_WEBSOCKET_DEBUG "websocket_debug"
|
||||||
|
|
||||||
Config::Config() :
|
Config::Config()
|
||||||
PortOverridden(false),
|
: PortOverridden(false),
|
||||||
PasswordOverridden(false),
|
PasswordOverridden(false),
|
||||||
FirstLoad(true),
|
FirstLoad(true),
|
||||||
ServerEnabled(true),
|
ServerEnabled(false),
|
||||||
ServerPort(4455),
|
ServerPort(4455),
|
||||||
BindLoopback(true),
|
|
||||||
Ipv4Only(false),
|
Ipv4Only(false),
|
||||||
DebugEnabled(false),
|
DebugEnabled(false),
|
||||||
AlertsEnabled(false),
|
AlertsEnabled(false),
|
||||||
@ -66,7 +64,6 @@ void Config::Load()
|
|||||||
ServerEnabled = config_get_bool(obsConfig, CONFIG_SECTION_NAME, PARAM_ENABLED);
|
ServerEnabled = config_get_bool(obsConfig, CONFIG_SECTION_NAME, PARAM_ENABLED);
|
||||||
AlertsEnabled = config_get_bool(obsConfig, CONFIG_SECTION_NAME, PARAM_ALERTS);
|
AlertsEnabled = config_get_bool(obsConfig, CONFIG_SECTION_NAME, PARAM_ALERTS);
|
||||||
ServerPort = config_get_uint(obsConfig, CONFIG_SECTION_NAME, PARAM_PORT);
|
ServerPort = config_get_uint(obsConfig, CONFIG_SECTION_NAME, PARAM_PORT);
|
||||||
BindLoopback = config_get_bool(obsConfig, CONFIG_SECTION_NAME, PARAM_BINDLOOPBACK);
|
|
||||||
AuthRequired = config_get_bool(obsConfig, CONFIG_SECTION_NAME, PARAM_AUTHREQUIRED);
|
AuthRequired = config_get_bool(obsConfig, CONFIG_SECTION_NAME, PARAM_AUTHREQUIRED);
|
||||||
ServerPassword = config_get_string(obsConfig, CONFIG_SECTION_NAME, PARAM_PASSWORD);
|
ServerPassword = config_get_string(obsConfig, CONFIG_SECTION_NAME, PARAM_PASSWORD);
|
||||||
|
|
||||||
@ -134,7 +131,6 @@ void Config::Save()
|
|||||||
if (!PortOverridden) {
|
if (!PortOverridden) {
|
||||||
config_set_uint(obsConfig, CONFIG_SECTION_NAME, PARAM_PORT, ServerPort);
|
config_set_uint(obsConfig, CONFIG_SECTION_NAME, PARAM_PORT, ServerPort);
|
||||||
}
|
}
|
||||||
config_set_bool(obsConfig, CONFIG_SECTION_NAME, PARAM_BINDLOOPBACK, BindLoopback);
|
|
||||||
config_set_bool(obsConfig, CONFIG_SECTION_NAME, PARAM_ALERTS, AlertsEnabled);
|
config_set_bool(obsConfig, CONFIG_SECTION_NAME, PARAM_ALERTS, AlertsEnabled);
|
||||||
if (!PasswordOverridden) {
|
if (!PasswordOverridden) {
|
||||||
config_set_bool(obsConfig, CONFIG_SECTION_NAME, PARAM_AUTHREQUIRED, AuthRequired);
|
config_set_bool(obsConfig, CONFIG_SECTION_NAME, PARAM_AUTHREQUIRED, AuthRequired);
|
||||||
@ -155,7 +151,6 @@ void Config::SetDefaultsToGlobalStore()
|
|||||||
config_set_default_bool(obsConfig, CONFIG_SECTION_NAME, PARAM_FIRSTLOAD, FirstLoad);
|
config_set_default_bool(obsConfig, CONFIG_SECTION_NAME, PARAM_FIRSTLOAD, FirstLoad);
|
||||||
config_set_default_bool(obsConfig, CONFIG_SECTION_NAME, PARAM_ENABLED, ServerEnabled);
|
config_set_default_bool(obsConfig, CONFIG_SECTION_NAME, PARAM_ENABLED, ServerEnabled);
|
||||||
config_set_default_uint(obsConfig, CONFIG_SECTION_NAME, PARAM_PORT, ServerPort);
|
config_set_default_uint(obsConfig, CONFIG_SECTION_NAME, PARAM_PORT, ServerPort);
|
||||||
config_set_default_bool(obsConfig, CONFIG_SECTION_NAME, PARAM_BINDLOOPBACK, BindLoopback);
|
|
||||||
config_set_default_bool(obsConfig, CONFIG_SECTION_NAME, PARAM_ALERTS, AlertsEnabled);
|
config_set_default_bool(obsConfig, CONFIG_SECTION_NAME, PARAM_ALERTS, AlertsEnabled);
|
||||||
config_set_default_bool(obsConfig, CONFIG_SECTION_NAME, PARAM_AUTHREQUIRED, AuthRequired);
|
config_set_default_bool(obsConfig, CONFIG_SECTION_NAME, PARAM_AUTHREQUIRED, AuthRequired);
|
||||||
config_set_default_string(obsConfig, CONFIG_SECTION_NAME, PARAM_PASSWORD, QT_TO_UTF8(ServerPassword));
|
config_set_default_string(obsConfig, CONFIG_SECTION_NAME, PARAM_PASSWORD, QT_TO_UTF8(ServerPassword));
|
||||||
|
@ -38,7 +38,6 @@ struct Config {
|
|||||||
std::atomic<bool> FirstLoad;
|
std::atomic<bool> FirstLoad;
|
||||||
std::atomic<bool> ServerEnabled;
|
std::atomic<bool> ServerEnabled;
|
||||||
std::atomic<uint16_t> ServerPort;
|
std::atomic<uint16_t> ServerPort;
|
||||||
std::atomic<bool> BindLoopback;
|
|
||||||
std::atomic<bool> Ipv4Only;
|
std::atomic<bool> Ipv4Only;
|
||||||
std::atomic<bool> DebugEnabled;
|
std::atomic<bool> DebugEnabled;
|
||||||
std::atomic<bool> AlertsEnabled;
|
std::atomic<bool> AlertsEnabled;
|
||||||
|
@ -3,7 +3,11 @@
|
|||||||
#include "obs-websocket.h"
|
#include "obs-websocket.h"
|
||||||
#include "utils/Json.h"
|
#include "utils/Json.h"
|
||||||
|
|
||||||
#define RETURN_STATUS(status) { calldata_set_bool(cd, "success", status); return; }
|
#define RETURN_STATUS(status) \
|
||||||
|
{ \
|
||||||
|
calldata_set_bool(cd, "success", status); \
|
||||||
|
return; \
|
||||||
|
}
|
||||||
#define RETURN_SUCCESS() RETURN_STATUS(true);
|
#define RETURN_SUCCESS() RETURN_STATUS(true);
|
||||||
#define RETURN_FAILURE() RETURN_STATUS(false);
|
#define RETURN_FAILURE() RETURN_STATUS(false);
|
||||||
|
|
||||||
@ -25,11 +29,15 @@ WebSocketApi::WebSocketApi()
|
|||||||
_procHandler = proc_handler_create();
|
_procHandler = proc_handler_create();
|
||||||
|
|
||||||
proc_handler_add(_procHandler, "bool get_api_version(out int version)", &get_api_version, nullptr);
|
proc_handler_add(_procHandler, "bool get_api_version(out int version)", &get_api_version, nullptr);
|
||||||
proc_handler_add(_procHandler, "bool call_request(in string request_type, in string request_data, out ptr response)", &call_request, nullptr);
|
proc_handler_add(_procHandler, "bool call_request(in string request_type, in string request_data, out ptr response)",
|
||||||
|
&call_request, nullptr);
|
||||||
proc_handler_add(_procHandler, "bool vendor_register(in string name, out ptr vendor)", &vendor_register_cb, this);
|
proc_handler_add(_procHandler, "bool vendor_register(in string name, out ptr vendor)", &vendor_register_cb, this);
|
||||||
proc_handler_add(_procHandler, "bool vendor_request_register(in ptr vendor, in string type, in ptr callback)", &vendor_request_register_cb, this);
|
proc_handler_add(_procHandler, "bool vendor_request_register(in ptr vendor, in string type, in ptr callback)",
|
||||||
proc_handler_add(_procHandler, "bool vendor_request_unregister(in ptr vendor, in string type)", &vendor_request_unregister_cb, this);
|
&vendor_request_register_cb, this);
|
||||||
proc_handler_add(_procHandler, "bool vendor_event_emit(in ptr vendor, in string type, in ptr data)", &vendor_event_emit_cb, this);
|
proc_handler_add(_procHandler, "bool vendor_request_unregister(in ptr vendor, in string type)",
|
||||||
|
&vendor_request_unregister_cb, this);
|
||||||
|
proc_handler_add(_procHandler, "bool vendor_event_emit(in ptr vendor, in string type, in ptr data)", &vendor_event_emit_cb,
|
||||||
|
this);
|
||||||
|
|
||||||
proc_handler_t *ph = obs_get_proc_handler();
|
proc_handler_t *ph = obs_get_proc_handler();
|
||||||
assert(ph != NULL);
|
assert(ph != NULL);
|
||||||
@ -58,7 +66,8 @@ void WebSocketApi::SetEventCallback(EventCallback cb)
|
|||||||
_eventCallback = cb;
|
_eventCallback = cb;
|
||||||
}
|
}
|
||||||
|
|
||||||
enum WebSocketApi::RequestReturnCode WebSocketApi::PerformVendorRequest(std::string vendorName, std::string requestType, obs_data_t *requestData, obs_data_t *responseData)
|
enum WebSocketApi::RequestReturnCode WebSocketApi::PerformVendorRequest(std::string vendorName, std::string requestType,
|
||||||
|
obs_data_t *requestData, obs_data_t *responseData)
|
||||||
{
|
{
|
||||||
std::shared_lock l(_mutex);
|
std::shared_lock l(_mutex);
|
||||||
|
|
||||||
@ -119,7 +128,7 @@ void WebSocketApi::call_request(void *, calldata_t *cd)
|
|||||||
Request request(request_type, requestData);
|
Request request(request_type, requestData);
|
||||||
RequestResult requestResult = requestHandler.ProcessRequest(request);
|
RequestResult requestResult = requestHandler.ProcessRequest(request);
|
||||||
|
|
||||||
response->status_code = (uint)requestResult.StatusCode;
|
response->status_code = (unsigned int)requestResult.StatusCode;
|
||||||
if (!requestResult.Comment.empty())
|
if (!requestResult.Comment.empty())
|
||||||
response->comment = bstrdup(requestResult.Comment.c_str());
|
response->comment = bstrdup(requestResult.Comment.c_str());
|
||||||
if (requestResult.ResponseData.is_object()) {
|
if (requestResult.ResponseData.is_object()) {
|
||||||
@ -129,7 +138,8 @@ void WebSocketApi::call_request(void *, calldata_t *cd)
|
|||||||
|
|
||||||
calldata_set_ptr(cd, "response", response);
|
calldata_set_ptr(cd, "response", response);
|
||||||
|
|
||||||
blog_debug("[WebSocketApi::call_request] Request %s called, response status code is %u", request_type, response->status_code);
|
blog_debug("[WebSocketApi::call_request] Request %s called, response status code is %u", request_type,
|
||||||
|
response->status_code);
|
||||||
|
|
||||||
RETURN_SUCCESS();
|
RETURN_SUCCESS();
|
||||||
}
|
}
|
||||||
@ -148,7 +158,8 @@ void WebSocketApi::vendor_register_cb(void *priv_data, calldata_t *cd)
|
|||||||
std::unique_lock l(c->_mutex);
|
std::unique_lock l(c->_mutex);
|
||||||
|
|
||||||
if (c->_vendors.count(vendorName)) {
|
if (c->_vendors.count(vendorName)) {
|
||||||
blog(LOG_WARNING, "[WebSocketApi::vendor_register_cb] Failed because `%s` is already a registered vendor.", vendorName);
|
blog(LOG_WARNING, "[WebSocketApi::vendor_register_cb] Failed because `%s` is already a registered vendor.",
|
||||||
|
vendorName);
|
||||||
RETURN_FAILURE();
|
RETURN_FAILURE();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -172,13 +183,17 @@ void WebSocketApi::vendor_request_register_cb(void *, calldata_t *cd)
|
|||||||
|
|
||||||
const char *requestType;
|
const char *requestType;
|
||||||
if (!calldata_get_string(cd, "type", &requestType) || strlen(requestType) == 0) {
|
if (!calldata_get_string(cd, "type", &requestType) || strlen(requestType) == 0) {
|
||||||
blog(LOG_WARNING, "[WebSocketApi::vendor_request_register_cb] [vendorName: %s] Failed due to missing or empty `type` string.", v->_name.c_str());
|
blog(LOG_WARNING,
|
||||||
|
"[WebSocketApi::vendor_request_register_cb] [vendorName: %s] Failed due to missing or empty `type` string.",
|
||||||
|
v->_name.c_str());
|
||||||
RETURN_FAILURE();
|
RETURN_FAILURE();
|
||||||
}
|
}
|
||||||
|
|
||||||
void *voidCallback;
|
void *voidCallback;
|
||||||
if (!calldata_get_ptr(cd, "callback", &voidCallback) || !voidCallback) {
|
if (!calldata_get_ptr(cd, "callback", &voidCallback) || !voidCallback) {
|
||||||
blog(LOG_WARNING, "[WebSocketApi::vendor_request_register_cb] [vendorName: %s] Failed due to missing `callback` pointer.", v->_name.c_str());
|
blog(LOG_WARNING,
|
||||||
|
"[WebSocketApi::vendor_request_register_cb] [vendorName: %s] Failed due to missing `callback` pointer.",
|
||||||
|
v->_name.c_str());
|
||||||
RETURN_FAILURE();
|
RETURN_FAILURE();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -187,13 +202,16 @@ void WebSocketApi::vendor_request_register_cb(void *, calldata_t *cd)
|
|||||||
std::unique_lock l(v->_mutex);
|
std::unique_lock l(v->_mutex);
|
||||||
|
|
||||||
if (v->_requests.count(requestType)) {
|
if (v->_requests.count(requestType)) {
|
||||||
blog(LOG_WARNING, "[WebSocketApi::vendor_request_register_cb] [vendorName: %s] Failed because `%s` is already a registered request.", v->_name.c_str(), requestType);
|
blog(LOG_WARNING,
|
||||||
|
"[WebSocketApi::vendor_request_register_cb] [vendorName: %s] Failed because `%s` is already a registered request.",
|
||||||
|
v->_name.c_str(), requestType);
|
||||||
RETURN_FAILURE();
|
RETURN_FAILURE();
|
||||||
}
|
}
|
||||||
|
|
||||||
v->_requests[requestType] = *cb;
|
v->_requests[requestType] = *cb;
|
||||||
|
|
||||||
blog_debug("[WebSocketApi::vendor_request_register_cb] [vendorName: %s] Registered new vendor request: %s", v->_name.c_str(), requestType);
|
blog_debug("[WebSocketApi::vendor_request_register_cb] [vendorName: %s] Registered new vendor request: %s",
|
||||||
|
v->_name.c_str(), requestType);
|
||||||
|
|
||||||
RETURN_SUCCESS();
|
RETURN_SUCCESS();
|
||||||
}
|
}
|
||||||
@ -206,20 +224,25 @@ void WebSocketApi::vendor_request_unregister_cb(void *, calldata_t *cd)
|
|||||||
|
|
||||||
const char *requestType;
|
const char *requestType;
|
||||||
if (!calldata_get_string(cd, "type", &requestType) || strlen(requestType) == 0) {
|
if (!calldata_get_string(cd, "type", &requestType) || strlen(requestType) == 0) {
|
||||||
blog(LOG_WARNING, "[WebSocketApi::vendor_request_unregister_cb] [vendorName: %s] Failed due to missing `type` string.", v->_name.c_str());
|
blog(LOG_WARNING,
|
||||||
|
"[WebSocketApi::vendor_request_unregister_cb] [vendorName: %s] Failed due to missing `type` string.",
|
||||||
|
v->_name.c_str());
|
||||||
RETURN_FAILURE();
|
RETURN_FAILURE();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::unique_lock l(v->_mutex);
|
std::unique_lock l(v->_mutex);
|
||||||
|
|
||||||
if (!v->_requests.count(requestType)) {
|
if (!v->_requests.count(requestType)) {
|
||||||
blog(LOG_WARNING, "[WebSocketApi::vendor_request_register_cb] [vendorName: %s] Failed because `%s` is not a registered request.", v->_name.c_str(), requestType);
|
blog(LOG_WARNING,
|
||||||
|
"[WebSocketApi::vendor_request_register_cb] [vendorName: %s] Failed because `%s` is not a registered request.",
|
||||||
|
v->_name.c_str(), requestType);
|
||||||
RETURN_FAILURE();
|
RETURN_FAILURE();
|
||||||
}
|
}
|
||||||
|
|
||||||
v->_requests.erase(requestType);
|
v->_requests.erase(requestType);
|
||||||
|
|
||||||
blog_debug("[WebSocketApi::vendor_request_unregister_cb] [vendorName: %s] Unregistered vendor request: %s", v->_name.c_str(), requestType);
|
blog_debug("[WebSocketApi::vendor_request_unregister_cb] [vendorName: %s] Unregistered vendor request: %s",
|
||||||
|
v->_name.c_str(), requestType);
|
||||||
|
|
||||||
RETURN_SUCCESS();
|
RETURN_SUCCESS();
|
||||||
}
|
}
|
||||||
@ -234,13 +257,15 @@ void WebSocketApi::vendor_event_emit_cb(void *priv_data, calldata_t *cd)
|
|||||||
|
|
||||||
const char *eventType;
|
const char *eventType;
|
||||||
if (!calldata_get_string(cd, "type", &eventType) || strlen(eventType) == 0) {
|
if (!calldata_get_string(cd, "type", &eventType) || strlen(eventType) == 0) {
|
||||||
blog(LOG_WARNING, "[WebSocketApi::vendor_event_emit_cb] [vendorName: %s] Failed due to missing `type` string.", v->_name.c_str());
|
blog(LOG_WARNING, "[WebSocketApi::vendor_event_emit_cb] [vendorName: %s] Failed due to missing `type` string.",
|
||||||
|
v->_name.c_str());
|
||||||
RETURN_FAILURE();
|
RETURN_FAILURE();
|
||||||
}
|
}
|
||||||
|
|
||||||
void *voidEventData;
|
void *voidEventData;
|
||||||
if (!calldata_get_ptr(cd, "data", &voidEventData)) {
|
if (!calldata_get_ptr(cd, "data", &voidEventData)) {
|
||||||
blog(LOG_WARNING, "[WebSocketApi::vendor_event_emit_cb] [vendorName: %s] Failed due to missing `data` pointer.", v->_name.c_str());
|
blog(LOG_WARNING, "[WebSocketApi::vendor_event_emit_cb] [vendorName: %s] Failed due to missing `data` pointer.",
|
||||||
|
v->_name.c_str());
|
||||||
RETURN_FAILURE();
|
RETURN_FAILURE();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -30,7 +30,8 @@ class WebSocketApi {
|
|||||||
|
|
||||||
void SetEventCallback(EventCallback cb);
|
void SetEventCallback(EventCallback cb);
|
||||||
|
|
||||||
enum RequestReturnCode PerformVendorRequest(std::string vendorName, std::string requestName, obs_data_t *requestData, obs_data_t *responseData);
|
enum RequestReturnCode PerformVendorRequest(std::string vendorName, std::string requestName, obs_data_t *requestData,
|
||||||
|
obs_data_t *responseData);
|
||||||
|
|
||||||
static void get_ph_cb(void *priv_data, calldata_t *cd);
|
static void get_ph_cb(void *priv_data, calldata_t *cd);
|
||||||
static void get_api_version(void *, calldata_t *cd);
|
static void get_api_version(void *, calldata_t *cd);
|
||||||
|
@ -19,8 +19,8 @@ with this program. If not, see <https://www.gnu.org/licenses/>
|
|||||||
|
|
||||||
#include "EventHandler.h"
|
#include "EventHandler.h"
|
||||||
|
|
||||||
EventHandler::EventHandler() :
|
EventHandler::EventHandler()
|
||||||
_obsLoaded(false),
|
: _obsLoaded(false),
|
||||||
_inputVolumeMetersRef(0),
|
_inputVolumeMetersRef(0),
|
||||||
_inputActiveStateChangedRef(0),
|
_inputActiveStateChangedRef(0),
|
||||||
_inputShowStateChangedRef(0),
|
_inputShowStateChangedRef(0),
|
||||||
@ -80,7 +80,8 @@ void EventHandler::ProcessSubscription(uint64_t eventSubscriptions)
|
|||||||
if (_inputVolumeMetersHandler)
|
if (_inputVolumeMetersHandler)
|
||||||
blog(LOG_WARNING, "[EventHandler::ProcessSubscription] Input volume meter handler already exists!");
|
blog(LOG_WARNING, "[EventHandler::ProcessSubscription] Input volume meter handler already exists!");
|
||||||
else
|
else
|
||||||
_inputVolumeMetersHandler = std::make_unique<Utils::Obs::VolumeMeter::Handler>(std::bind(&EventHandler::HandleInputVolumeMeters, this, std::placeholders::_1));
|
_inputVolumeMetersHandler = std::make_unique<Utils::Obs::VolumeMeter::Handler>(
|
||||||
|
std::bind(&EventHandler::HandleInputVolumeMeters, this, std::placeholders::_1));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ((eventSubscriptions & EventSubscription::InputActiveStateChanged) != 0)
|
if ((eventSubscriptions & EventSubscription::InputActiveStateChanged) != 0)
|
||||||
@ -266,7 +267,8 @@ 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::OnFrontendEvent] OBS has finished loading. Connecting final handlers and enabling events...");
|
blog_debug(
|
||||||
|
"[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).
|
// Connect source signals and enable events only after OBS has fully loaded (to reduce extra logging).
|
||||||
eventHandler->_obsLoaded.store(true);
|
eventHandler->_obsLoaded.store(true);
|
||||||
@ -359,8 +361,7 @@ void EventHandler::OnFrontendEvent(enum obs_frontend_event event, void *private_
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
// Config
|
// Config
|
||||||
case OBS_FRONTEND_EVENT_SCENE_COLLECTION_CHANGING:
|
case OBS_FRONTEND_EVENT_SCENE_COLLECTION_CHANGING: {
|
||||||
{
|
|
||||||
obs_frontend_source_list transitions = {};
|
obs_frontend_source_list transitions = {};
|
||||||
obs_frontend_get_transitions(&transitions);
|
obs_frontend_get_transitions(&transitions);
|
||||||
for (size_t i = 0; i < transitions.sources.num; i++) {
|
for (size_t i = 0; i < transitions.sources.num; i++) {
|
||||||
@ -371,8 +372,7 @@ void EventHandler::OnFrontendEvent(enum obs_frontend_event event, void *private_
|
|||||||
}
|
}
|
||||||
eventHandler->HandleCurrentSceneCollectionChanging();
|
eventHandler->HandleCurrentSceneCollectionChanging();
|
||||||
break;
|
break;
|
||||||
case OBS_FRONTEND_EVENT_SCENE_COLLECTION_CHANGED:
|
case OBS_FRONTEND_EVENT_SCENE_COLLECTION_CHANGED: {
|
||||||
{
|
|
||||||
obs_frontend_source_list transitions = {};
|
obs_frontend_source_list transitions = {};
|
||||||
obs_frontend_get_transitions(&transitions);
|
obs_frontend_get_transitions(&transitions);
|
||||||
for (size_t i = 0; i < transitions.sources.num; i++) {
|
for (size_t i = 0; i < transitions.sources.num; i++) {
|
||||||
@ -411,8 +411,7 @@ void EventHandler::OnFrontendEvent(enum obs_frontend_event event, void *private_
|
|||||||
case OBS_FRONTEND_EVENT_TRANSITION_CHANGED:
|
case OBS_FRONTEND_EVENT_TRANSITION_CHANGED:
|
||||||
eventHandler->HandleCurrentSceneTransitionChanged();
|
eventHandler->HandleCurrentSceneTransitionChanged();
|
||||||
break;
|
break;
|
||||||
case OBS_FRONTEND_EVENT_TRANSITION_LIST_CHANGED:
|
case OBS_FRONTEND_EVENT_TRANSITION_LIST_CHANGED: {
|
||||||
{
|
|
||||||
obs_frontend_source_list transitions = {};
|
obs_frontend_source_list transitions = {};
|
||||||
obs_frontend_get_transitions(&transitions);
|
obs_frontend_get_transitions(&transitions);
|
||||||
for (size_t i = 0; i < transitions.sources.num; i++) {
|
for (size_t i = 0; i < transitions.sources.num; i++) {
|
||||||
@ -420,8 +419,7 @@ void EventHandler::OnFrontendEvent(enum obs_frontend_event event, void *private_
|
|||||||
eventHandler->ConnectSourceSignals(transition);
|
eventHandler->ConnectSourceSignals(transition);
|
||||||
}
|
}
|
||||||
obs_frontend_source_list_free(&transitions);
|
obs_frontend_source_list_free(&transitions);
|
||||||
}
|
} break;
|
||||||
break;
|
|
||||||
case OBS_FRONTEND_EVENT_TRANSITION_DURATION_CHANGED:
|
case OBS_FRONTEND_EVENT_TRANSITION_DURATION_CHANGED:
|
||||||
eventHandler->HandleCurrentSceneTransitionDurationChanged();
|
eventHandler->HandleCurrentSceneTransitionDurationChanged();
|
||||||
break;
|
break;
|
||||||
|
@ -29,8 +29,7 @@ with this program. If not, see <https://www.gnu.org/licenses/>
|
|||||||
#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:
|
||||||
EventHandler();
|
EventHandler();
|
||||||
~EventHandler();
|
~EventHandler();
|
||||||
@ -77,7 +76,6 @@ class EventHandler
|
|||||||
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);
|
||||||
|
|
||||||
|
|
||||||
// General
|
// General
|
||||||
void HandleExitStarted();
|
void HandleExitStarted();
|
||||||
void HandleStudioModeStateChanged(bool enabled);
|
void HandleStudioModeStateChanged(bool enabled);
|
||||||
@ -103,29 +101,44 @@ class EventHandler
|
|||||||
void HandleInputRemoved(obs_source_t *source);
|
void HandleInputRemoved(obs_source_t *source);
|
||||||
void HandleInputNameChanged(obs_source_t *source, std::string oldInputName, std::string inputName);
|
void HandleInputNameChanged(obs_source_t *source, std::string oldInputName, std::string inputName);
|
||||||
void HandleInputVolumeMeters(std::vector<json> inputs); // AudioMeter::Handler callback
|
void HandleInputVolumeMeters(std::vector<json> inputs); // AudioMeter::Handler callback
|
||||||
static void HandleInputActiveStateChanged(void *param, calldata_t *data); // Direct callback
|
static void HandleInputActiveStateChanged(void *param,
|
||||||
static void HandleInputShowStateChanged(void *param, calldata_t *data); // Direct callback
|
calldata_t *data); // Direct callback
|
||||||
static void HandleInputMuteStateChanged(void *param, calldata_t *data); // Direct callback
|
static void HandleInputShowStateChanged(void *param,
|
||||||
static void HandleInputVolumeChanged(void *param, calldata_t *data); // Direct callback
|
calldata_t *data); // Direct callback
|
||||||
static void HandleInputAudioBalanceChanged(void *param, calldata_t *data); // Direct callback
|
static void HandleInputMuteStateChanged(void *param,
|
||||||
static void HandleInputAudioSyncOffsetChanged(void *param, calldata_t *data); // Direct callback
|
calldata_t *data); // Direct callback
|
||||||
static void HandleInputAudioTracksChanged(void *param, calldata_t *data); // Direct callback
|
static void HandleInputVolumeChanged(void *param,
|
||||||
static void HandleInputAudioMonitorTypeChanged(void *param, calldata_t *data); // Direct callback
|
calldata_t *data); // Direct callback
|
||||||
|
static void HandleInputAudioBalanceChanged(void *param,
|
||||||
|
calldata_t *data); // Direct callback
|
||||||
|
static void HandleInputAudioSyncOffsetChanged(void *param,
|
||||||
|
calldata_t *data); // Direct callback
|
||||||
|
static void HandleInputAudioTracksChanged(void *param,
|
||||||
|
calldata_t *data); // Direct callback
|
||||||
|
static void HandleInputAudioMonitorTypeChanged(void *param,
|
||||||
|
calldata_t *data); // Direct callback
|
||||||
|
|
||||||
// Transitions
|
// Transitions
|
||||||
void HandleCurrentSceneTransitionChanged();
|
void HandleCurrentSceneTransitionChanged();
|
||||||
void HandleCurrentSceneTransitionDurationChanged();
|
void HandleCurrentSceneTransitionDurationChanged();
|
||||||
static void HandleSceneTransitionStarted(void *param, calldata_t *data); // Direct callback
|
static void HandleSceneTransitionStarted(void *param,
|
||||||
static void HandleSceneTransitionEnded(void *param, calldata_t *data); // Direct callback
|
calldata_t *data); // Direct callback
|
||||||
static void HandleSceneTransitionVideoEnded(void *param, calldata_t *data); // Direct callback
|
static void HandleSceneTransitionEnded(void *param,
|
||||||
|
calldata_t *data); // Direct callback
|
||||||
|
static void HandleSceneTransitionVideoEnded(void *param,
|
||||||
|
calldata_t *data); // Direct callback
|
||||||
|
|
||||||
// Filters
|
// Filters
|
||||||
static void FilterAddMultiHandler(void *param, calldata_t *data); // Direct callback
|
static void FilterAddMultiHandler(void *param,
|
||||||
static void FilterRemoveMultiHandler(void *param, calldata_t *data); // Direct callback
|
calldata_t *data); // Direct callback
|
||||||
static void HandleSourceFilterListReindexed(void *param, calldata_t *data); // Direct callback
|
static void FilterRemoveMultiHandler(void *param,
|
||||||
|
calldata_t *data); // Direct callback
|
||||||
|
static void HandleSourceFilterListReindexed(void *param,
|
||||||
|
calldata_t *data); // Direct callback
|
||||||
void HandleSourceFilterCreated(obs_source_t *source, obs_source_t *filter);
|
void HandleSourceFilterCreated(obs_source_t *source, obs_source_t *filter);
|
||||||
void HandleSourceFilterRemoved(obs_source_t *source, obs_source_t *filter);
|
void HandleSourceFilterRemoved(obs_source_t *source, obs_source_t *filter);
|
||||||
static void HandleSourceFilterNameChanged(void *param, calldata_t *data); // Direct callback
|
static void HandleSourceFilterNameChanged(void *param,
|
||||||
|
calldata_t *data); // Direct callback
|
||||||
static void HandleSourceFilterEnableStateChanged(void *param, calldata_t *data); // Direct callback
|
static void HandleSourceFilterEnableStateChanged(void *param, calldata_t *data); // Direct callback
|
||||||
|
|
||||||
// Outputs
|
// Outputs
|
||||||
@ -136,16 +149,25 @@ class EventHandler
|
|||||||
void HandleReplayBufferSaved();
|
void HandleReplayBufferSaved();
|
||||||
|
|
||||||
// Scene Items
|
// Scene Items
|
||||||
static void HandleSceneItemCreated(void *param, calldata_t *data); // Direct callback
|
static void HandleSceneItemCreated(void *param,
|
||||||
static void HandleSceneItemRemoved(void *param, calldata_t *data); // Direct callback
|
calldata_t *data); // Direct callback
|
||||||
static void HandleSceneItemListReindexed(void *param, calldata_t *data); // Direct callback
|
static void HandleSceneItemRemoved(void *param,
|
||||||
static void HandleSceneItemEnableStateChanged(void *param, calldata_t *data); // Direct callback
|
calldata_t *data); // Direct callback
|
||||||
static void HandleSceneItemLockStateChanged(void *param, calldata_t *data); // Direct callback
|
static void HandleSceneItemListReindexed(void *param,
|
||||||
static void HandleSceneItemSelected(void *param, calldata_t *data); // Direct callback
|
calldata_t *data); // Direct callback
|
||||||
static void HandleSceneItemTransformChanged(void *param, calldata_t *data); // Direct callback
|
static void HandleSceneItemEnableStateChanged(void *param,
|
||||||
|
calldata_t *data); // Direct callback
|
||||||
|
static void HandleSceneItemLockStateChanged(void *param,
|
||||||
|
calldata_t *data); // Direct callback
|
||||||
|
static void HandleSceneItemSelected(void *param,
|
||||||
|
calldata_t *data); // Direct callback
|
||||||
|
static void HandleSceneItemTransformChanged(void *param,
|
||||||
|
calldata_t *data); // Direct callback
|
||||||
|
|
||||||
// Media Inputs
|
// Media Inputs
|
||||||
static void HandleMediaInputPlaybackStarted(void *param, calldata_t *data); // Direct callback
|
static void HandleMediaInputPlaybackStarted(void *param,
|
||||||
static void HandleMediaInputPlaybackEnded(void *param, calldata_t *data); // Direct callback
|
calldata_t *data); // Direct callback
|
||||||
|
static void HandleMediaInputPlaybackEnded(void *param,
|
||||||
|
calldata_t *data); // Direct callback
|
||||||
void HandleMediaInputActionTriggered(obs_source_t *source, ObsMediaInputAction action);
|
void HandleMediaInputActionTriggered(obs_source_t *source, ObsMediaInputAction action);
|
||||||
};
|
};
|
||||||
|
@ -225,7 +225,7 @@ void EventHandler::HandleInputVolumeChanged(void *param, calldata_t *data)
|
|||||||
// Volume must be grabbed from the calldata. Running obs_source_get_volume() will return the previous value.
|
// Volume must be grabbed from the calldata. Running obs_source_get_volume() will return the previous value.
|
||||||
double inputVolumeMul = calldata_float(data, "volume");
|
double inputVolumeMul = calldata_float(data, "volume");
|
||||||
|
|
||||||
double inputVolumeDb = obs_mul_to_db(inputVolumeMul);
|
double inputVolumeDb = obs_mul_to_db((float)inputVolumeMul);
|
||||||
if (inputVolumeDb == -INFINITY)
|
if (inputVolumeDb == -INFINITY)
|
||||||
inputVolumeDb = -100;
|
inputVolumeDb = -100;
|
||||||
|
|
||||||
@ -373,11 +373,9 @@ void EventHandler::HandleInputAudioMonitorTypeChanged(void *param, calldata_t *d
|
|||||||
|
|
||||||
enum obs_monitoring_type monitorType = (obs_monitoring_type)calldata_int(data, "type");
|
enum obs_monitoring_type monitorType = (obs_monitoring_type)calldata_int(data, "type");
|
||||||
|
|
||||||
std::string monitorTypeString = Utils::Obs::StringHelper::GetInputMonitorType(monitorType);
|
|
||||||
|
|
||||||
json eventData;
|
json eventData;
|
||||||
eventData["inputName"] = obs_source_get_name(source);
|
eventData["inputName"] = obs_source_get_name(source);
|
||||||
eventData["monitorType"] = monitorTypeString;
|
eventData["monitorType"] = monitorType;
|
||||||
eventHandler->BroadcastEvent(EventSubscription::Inputs, "InputAudioMonitorTypeChanged", eventData);
|
eventHandler->BroadcastEvent(EventSubscription::Inputs, "InputAudioMonitorTypeChanged", eventData);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -19,9 +19,12 @@ with this program. If not, see <https://www.gnu.org/licenses/>
|
|||||||
|
|
||||||
#include "EventHandler.h"
|
#include "EventHandler.h"
|
||||||
|
|
||||||
#define CASE(x) case x: return #x;
|
#define CASE(x) \
|
||||||
|
case x: \
|
||||||
|
return #x;
|
||||||
|
|
||||||
std::string GetMediaInputActionString(ObsMediaInputAction action) {
|
std::string GetMediaInputActionString(ObsMediaInputAction action)
|
||||||
|
{
|
||||||
switch (action) {
|
switch (action) {
|
||||||
default:
|
default:
|
||||||
CASE(OBS_WEBSOCKET_MEDIA_INPUT_ACTION_PAUSE)
|
CASE(OBS_WEBSOCKET_MEDIA_INPUT_ACTION_PAUSE)
|
||||||
|
@ -19,7 +19,8 @@ with this program. If not, see <https://www.gnu.org/licenses/>
|
|||||||
|
|
||||||
#include "EventHandler.h"
|
#include "EventHandler.h"
|
||||||
|
|
||||||
static bool GetOutputStateActive(ObsOutputState state) {
|
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:
|
||||||
@ -52,7 +53,7 @@ void EventHandler::HandleStreamStateChanged(ObsOutputState state)
|
|||||||
{
|
{
|
||||||
json eventData;
|
json eventData;
|
||||||
eventData["outputActive"] = GetOutputStateActive(state);
|
eventData["outputActive"] = GetOutputStateActive(state);
|
||||||
eventData["outputState"] = Utils::Obs::StringHelper::GetOutputState(state);
|
eventData["outputState"] = state;
|
||||||
BroadcastEvent(EventSubscription::Outputs, "StreamStateChanged", eventData);
|
BroadcastEvent(EventSubscription::Outputs, "StreamStateChanged", eventData);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -61,6 +62,7 @@ void EventHandler::HandleStreamStateChanged(ObsOutputState state)
|
|||||||
*
|
*
|
||||||
* @dataField outputActive | Boolean | Whether the output is active
|
* @dataField outputActive | Boolean | Whether the output is active
|
||||||
* @dataField outputState | String | The specific state of the output
|
* @dataField outputState | String | The specific state of the output
|
||||||
|
* @dataField outputPath | String | File name for the saved recording, if record stopped. `null` otherwise
|
||||||
*
|
*
|
||||||
* @eventType RecordStateChanged
|
* @eventType RecordStateChanged
|
||||||
* @eventSubscription Outputs
|
* @eventSubscription Outputs
|
||||||
@ -74,7 +76,12 @@ void EventHandler::HandleRecordStateChanged(ObsOutputState state)
|
|||||||
{
|
{
|
||||||
json eventData;
|
json eventData;
|
||||||
eventData["outputActive"] = GetOutputStateActive(state);
|
eventData["outputActive"] = GetOutputStateActive(state);
|
||||||
eventData["outputState"] = Utils::Obs::StringHelper::GetOutputState(state);
|
eventData["outputState"] = state;
|
||||||
|
if (state == OBS_WEBSOCKET_OUTPUT_STOPPED || state == OBS_WEBSOCKET_OUTPUT_STARTED) {
|
||||||
|
eventData["outputPath"] = Utils::Obs::StringHelper::GetLastRecordFileName();
|
||||||
|
} else {
|
||||||
|
eventData["outputPath"] = nullptr;
|
||||||
|
}
|
||||||
BroadcastEvent(EventSubscription::Outputs, "RecordStateChanged", eventData);
|
BroadcastEvent(EventSubscription::Outputs, "RecordStateChanged", eventData);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -96,7 +103,7 @@ void EventHandler::HandleReplayBufferStateChanged(ObsOutputState state)
|
|||||||
{
|
{
|
||||||
json eventData;
|
json eventData;
|
||||||
eventData["outputActive"] = GetOutputStateActive(state);
|
eventData["outputActive"] = GetOutputStateActive(state);
|
||||||
eventData["outputState"] = Utils::Obs::StringHelper::GetOutputState(state);
|
eventData["outputState"] = state;
|
||||||
BroadcastEvent(EventSubscription::Outputs, "ReplayBufferStateChanged", eventData);
|
BroadcastEvent(EventSubscription::Outputs, "ReplayBufferStateChanged", eventData);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -118,7 +125,7 @@ void EventHandler::HandleVirtualcamStateChanged(ObsOutputState state)
|
|||||||
{
|
{
|
||||||
json eventData;
|
json eventData;
|
||||||
eventData["outputActive"] = GetOutputStateActive(state);
|
eventData["outputActive"] = GetOutputStateActive(state);
|
||||||
eventData["outputState"] = Utils::Obs::StringHelper::GetOutputState(state);
|
eventData["outputState"] = state;
|
||||||
BroadcastEvent(EventSubscription::Outputs, "VirtualcamStateChanged", eventData);
|
BroadcastEvent(EventSubscription::Outputs, "VirtualcamStateChanged", eventData);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -138,6 +145,6 @@ void EventHandler::HandleVirtualcamStateChanged(ObsOutputState state)
|
|||||||
void EventHandler::HandleReplayBufferSaved()
|
void EventHandler::HandleReplayBufferSaved()
|
||||||
{
|
{
|
||||||
json eventData;
|
json eventData;
|
||||||
eventData["savedReplayPath"] = Utils::Obs::StringHelper::GetLastReplayBufferFilePath();
|
eventData["savedReplayPath"] = Utils::Obs::StringHelper::GetLastReplayBufferFileName();
|
||||||
BroadcastEvent(EventSubscription::Outputs, "ReplayBufferSaved", eventData);
|
BroadcastEvent(EventSubscription::Outputs, "ReplayBufferSaved", eventData);
|
||||||
}
|
}
|
||||||
|
@ -157,13 +157,14 @@ namespace EventSubscription {
|
|||||||
* Helper to receive all non-high-volume events.
|
* Helper to receive all non-high-volume events.
|
||||||
*
|
*
|
||||||
* @enumIdentifier All
|
* @enumIdentifier All
|
||||||
* @enumValue (General | Config | Scenes | Inputs | Transitions | Filters | Outputs | SceneItems | MediaInputs | Vendors)
|
* @enumValue (General | Config | Scenes | Inputs | Transitions | Filters | Outputs | SceneItems | MediaInputs | Vendors | Ui)
|
||||||
* @enumType EventSubscription
|
* @enumType EventSubscription
|
||||||
* @rpcVersion -1
|
* @rpcVersion -1
|
||||||
* @initialVersion 5.0.0
|
* @initialVersion 5.0.0
|
||||||
* @api enums
|
* @api enums
|
||||||
*/
|
*/
|
||||||
All = (General | Config | Scenes | Inputs | Transitions | Filters | Outputs | SceneItems | MediaInputs | Ui | Vendors),
|
All = (General | Config | Scenes | Inputs | Transitions | Filters | Outputs | SceneItems | MediaInputs | Vendors |
|
||||||
|
Ui),
|
||||||
/**
|
/**
|
||||||
* Subscription value to receive the `InputVolumeMeters` high-volume event.
|
* Subscription value to receive the `InputVolumeMeters` high-volume event.
|
||||||
*
|
*
|
||||||
|
@ -28,18 +28,13 @@ with this program. If not, see <https://www.gnu.org/licenses/>
|
|||||||
#include "../Config.h"
|
#include "../Config.h"
|
||||||
#include "../utils/Platform.h"
|
#include "../utils/Platform.h"
|
||||||
|
|
||||||
ConnectInfo::ConnectInfo(QWidget* parent) :
|
ConnectInfo::ConnectInfo(QWidget *parent) : QDialog(parent, Qt::Dialog), ui(new Ui::ConnectInfo)
|
||||||
QDialog(parent, Qt::Dialog),
|
|
||||||
ui(new Ui::ConnectInfo)
|
|
||||||
{
|
{
|
||||||
ui->setupUi(this);
|
ui->setupUi(this);
|
||||||
|
|
||||||
connect(ui->copyServerIpButton, &QPushButton::clicked,
|
connect(ui->copyServerIpButton, &QPushButton::clicked, this, &ConnectInfo::CopyServerIpButtonClicked);
|
||||||
this, &ConnectInfo::CopyServerIpButtonClicked);
|
connect(ui->copyServerPortButton, &QPushButton::clicked, this, &ConnectInfo::CopyServerPortButtonClicked);
|
||||||
connect(ui->copyServerPortButton, &QPushButton::clicked,
|
connect(ui->copyServerPasswordButton, &QPushButton::clicked, this, &ConnectInfo::CopyServerPasswordButtonClicked);
|
||||||
this, &ConnectInfo::CopyServerPortButtonClicked);
|
|
||||||
connect(ui->copyServerPasswordButton, &QPushButton::clicked,
|
|
||||||
this, &ConnectInfo::CopyServerPasswordButtonClicked);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ConnectInfo::~ConnectInfo()
|
ConnectInfo::~ConnectInfo()
|
||||||
|
@ -25,8 +25,7 @@ with this program. If not, see <https://www.gnu.org/licenses/>
|
|||||||
|
|
||||||
#include "ui_ConnectInfo.h"
|
#include "ui_ConnectInfo.h"
|
||||||
|
|
||||||
class ConnectInfo : public QDialog
|
class ConnectInfo : public QDialog {
|
||||||
{
|
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
@ -37,8 +37,8 @@ QString GetToolTipIconHtml()
|
|||||||
return iconTemplate.arg(iconFile);
|
return iconTemplate.arg(iconFile);
|
||||||
}
|
}
|
||||||
|
|
||||||
SettingsDialog::SettingsDialog(QWidget* parent) :
|
SettingsDialog::SettingsDialog(QWidget *parent)
|
||||||
QDialog(parent, Qt::Dialog),
|
: QDialog(parent, Qt::Dialog),
|
||||||
ui(new Ui::SettingsDialog),
|
ui(new Ui::SettingsDialog),
|
||||||
connectInfo(new ConnectInfo),
|
connectInfo(new ConnectInfo),
|
||||||
sessionTableTimer(new QTimer),
|
sessionTableTimer(new QTimer),
|
||||||
@ -52,22 +52,15 @@ SettingsDialog::SettingsDialog(QWidget* parent) :
|
|||||||
setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);
|
setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);
|
||||||
|
|
||||||
// Set the appropriate tooltip icon for the theme
|
// Set the appropriate tooltip icon for the theme
|
||||||
QString toolTipHtml = GetToolTipIconHtml();
|
ui->enableDebugLoggingToolTipLabel->setText(GetToolTipIconHtml());
|
||||||
ui->enableDebugLoggingToolTipLabel->setText(toolTipHtml);
|
|
||||||
ui->allowExternalToolTipLabel->setText(toolTipHtml);
|
|
||||||
|
|
||||||
connect(sessionTableTimer, &QTimer::timeout,
|
connect(sessionTableTimer, &QTimer::timeout, this, &SettingsDialog::FillSessionTable);
|
||||||
this, &SettingsDialog::FillSessionTable);
|
connect(ui->buttonBox, &QDialogButtonBox::clicked, this, &SettingsDialog::DialogButtonClicked);
|
||||||
connect(ui->buttonBox, &QDialogButtonBox::clicked,
|
connect(ui->enableAuthenticationCheckBox, &QCheckBox::stateChanged, this,
|
||||||
this, &SettingsDialog::DialogButtonClicked);
|
&SettingsDialog::EnableAuthenticationCheckBoxChanged);
|
||||||
connect(ui->enableAuthenticationCheckBox, &QCheckBox::stateChanged,
|
connect(ui->generatePasswordButton, &QPushButton::clicked, this, &SettingsDialog::GeneratePasswordButtonClicked);
|
||||||
this, &SettingsDialog::EnableAuthenticationCheckBoxChanged);
|
connect(ui->showConnectInfoButton, &QPushButton::clicked, this, &SettingsDialog::ShowConnectInfoButtonClicked);
|
||||||
connect(ui->generatePasswordButton, &QPushButton::clicked,
|
connect(ui->serverPasswordLineEdit, &QLineEdit::textEdited, this, &SettingsDialog::PasswordEdited);
|
||||||
this, &SettingsDialog::GeneratePasswordButtonClicked);
|
|
||||||
connect(ui->showConnectInfoButton, &QPushButton::clicked,
|
|
||||||
this, &SettingsDialog::ShowConnectInfoButtonClicked);
|
|
||||||
connect(ui->serverPasswordLineEdit, &QLineEdit::textEdited,
|
|
||||||
this, &SettingsDialog::PasswordEdited);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SettingsDialog::~SettingsDialog()
|
SettingsDialog::~SettingsDialog()
|
||||||
@ -129,16 +122,12 @@ void SettingsDialog::RefreshData()
|
|||||||
ui->enableSystemTrayAlertsCheckBox->setChecked(conf->AlertsEnabled);
|
ui->enableSystemTrayAlertsCheckBox->setChecked(conf->AlertsEnabled);
|
||||||
ui->enableDebugLoggingCheckBox->setChecked(conf->DebugEnabled);
|
ui->enableDebugLoggingCheckBox->setChecked(conf->DebugEnabled);
|
||||||
ui->serverPortSpinBox->setValue(conf->ServerPort);
|
ui->serverPortSpinBox->setValue(conf->ServerPort);
|
||||||
ui->allowExternalCheckBox->setChecked(!conf->BindLoopback);
|
|
||||||
ui->enableAuthenticationCheckBox->setChecked(conf->AuthRequired);
|
ui->enableAuthenticationCheckBox->setChecked(conf->AuthRequired);
|
||||||
ui->serverPasswordLineEdit->setText(conf->ServerPassword);
|
ui->serverPasswordLineEdit->setText(conf->ServerPassword);
|
||||||
|
|
||||||
ui->showConnectInfoButton->setEnabled(!conf->BindLoopback);
|
|
||||||
ui->serverPasswordLineEdit->setEnabled(conf->AuthRequired);
|
ui->serverPasswordLineEdit->setEnabled(conf->AuthRequired);
|
||||||
ui->generatePasswordButton->setEnabled(conf->AuthRequired);
|
ui->generatePasswordButton->setEnabled(conf->AuthRequired);
|
||||||
|
|
||||||
ui->showConnectInfoButton->setToolTip(ui->allowExternalCheckBox->isChecked() ? "" : obs_module_text("OBSWebSocket.Settings.ShowConnectInfoHoverText"));
|
|
||||||
|
|
||||||
FillSessionTable();
|
FillSessionTable();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -188,16 +177,15 @@ void SettingsDialog::SaveFormData()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool needsRestart = (conf->ServerEnabled != ui->enableWebSocketServerCheckBox->isChecked()) ||
|
bool needsRestart =
|
||||||
(ui->enableAuthenticationCheckBox->isChecked() && conf->ServerPassword != ui->serverPasswordLineEdit->text()) ||
|
(conf->ServerEnabled != ui->enableWebSocketServerCheckBox->isChecked()) ||
|
||||||
(conf->BindLoopback == ui->allowExternalCheckBox->isChecked()) ||
|
(conf->ServerPort != ui->serverPortSpinBox->value()) ||
|
||||||
(conf->ServerPort != ui->serverPortSpinBox->value());
|
(ui->enableAuthenticationCheckBox->isChecked() && conf->ServerPassword != ui->serverPasswordLineEdit->text());
|
||||||
|
|
||||||
conf->ServerEnabled = ui->enableWebSocketServerCheckBox->isChecked();
|
conf->ServerEnabled = ui->enableWebSocketServerCheckBox->isChecked();
|
||||||
conf->AlertsEnabled = ui->enableSystemTrayAlertsCheckBox->isChecked();
|
conf->AlertsEnabled = ui->enableSystemTrayAlertsCheckBox->isChecked();
|
||||||
conf->DebugEnabled = ui->enableDebugLoggingCheckBox->isChecked();
|
conf->DebugEnabled = ui->enableDebugLoggingCheckBox->isChecked();
|
||||||
conf->ServerPort = ui->serverPortSpinBox->value();
|
conf->ServerPort = ui->serverPortSpinBox->value();
|
||||||
conf->BindLoopback = !ui->allowExternalCheckBox->isChecked();
|
|
||||||
conf->AuthRequired = ui->enableAuthenticationCheckBox->isChecked();
|
conf->AuthRequired = ui->enableAuthenticationCheckBox->isChecked();
|
||||||
conf->ServerPassword = ui->serverPasswordLineEdit->text();
|
conf->ServerPassword = ui->serverPasswordLineEdit->text();
|
||||||
|
|
||||||
@ -246,7 +234,8 @@ void SettingsDialog::FillSessionTable()
|
|||||||
QTableWidgetItem *durationItem = new QTableWidgetItem(QTime(0, 0, sessionDuration).toString("hh:mm:ss"));
|
QTableWidgetItem *durationItem = new QTableWidgetItem(QTime(0, 0, sessionDuration).toString("hh:mm:ss"));
|
||||||
ui->websocketSessionTable->setItem(i, 1, durationItem);
|
ui->websocketSessionTable->setItem(i, 1, durationItem);
|
||||||
|
|
||||||
QTableWidgetItem *statsItem = new QTableWidgetItem(QString("%1/%2").arg(session.incomingMessages).arg(session.outgoingMessages));
|
QTableWidgetItem *statsItem =
|
||||||
|
new QTableWidgetItem(QString("%1/%2").arg(session.incomingMessages).arg(session.outgoingMessages));
|
||||||
ui->websocketSessionTable->setItem(i, 2, statsItem);
|
ui->websocketSessionTable->setItem(i, 2, statsItem);
|
||||||
|
|
||||||
QLabel *identifiedLabel = new QLabel();
|
QLabel *identifiedLabel = new QLabel();
|
||||||
@ -266,9 +255,7 @@ void SettingsDialog::FillSessionTable()
|
|||||||
invalidateButtonLayout->setContentsMargins(0, 0, 0, 0);
|
invalidateButtonLayout->setContentsMargins(0, 0, 0, 0);
|
||||||
invalidateButtonWidget->setLayout(invalidateButtonLayout);
|
invalidateButtonWidget->setLayout(invalidateButtonLayout);
|
||||||
ui->websocketSessionTable->setCellWidget(i, 4, invalidateButtonWidget);
|
ui->websocketSessionTable->setCellWidget(i, 4, invalidateButtonWidget);
|
||||||
connect(invalidateButton, &QPushButton::clicked, [=]() {
|
connect(invalidateButton, &QPushButton::clicked, [=]() { webSocketServer->InvalidateSession(session.hdl); });
|
||||||
webSocketServer->InvalidateSession(session.hdl);
|
|
||||||
});
|
|
||||||
|
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
|
@ -27,8 +27,7 @@ with this program. If not, see <https://www.gnu.org/licenses/>
|
|||||||
|
|
||||||
#include "ui_SettingsDialog.h"
|
#include "ui_SettingsDialog.h"
|
||||||
|
|
||||||
class SettingsDialog : public QDialog
|
class SettingsDialog : public QDialog {
|
||||||
{
|
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
@ -155,21 +155,21 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="3" column="1">
|
<item row="1" column="1">
|
||||||
<widget class="QCheckBox" name="enableAuthenticationCheckBox">
|
<widget class="QCheckBox" name="enableAuthenticationCheckBox">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>OBSWebSocket.Settings.AuthRequired</string>
|
<string>OBSWebSocket.Settings.AuthRequired</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="4" column="0">
|
<item row="2" column="0">
|
||||||
<widget class="QLabel" name="serverPasswordLabel">
|
<widget class="QLabel" name="serverPasswordLabel">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>OBSWebSocket.Settings.Password</string>
|
<string>OBSWebSocket.Settings.Password</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="4" column="1">
|
<item row="2" column="1">
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||||
<item>
|
<item>
|
||||||
<widget class="QLineEdit" name="serverPasswordLineEdit">
|
<widget class="QLineEdit" name="serverPasswordLineEdit">
|
||||||
@ -187,7 +187,7 @@
|
|||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
<item row="5" column="0">
|
<item row="3" column="0">
|
||||||
<spacer name="horizontalSpacer_2">
|
<spacer name="horizontalSpacer_2">
|
||||||
<property name="orientation">
|
<property name="orientation">
|
||||||
<enum>Qt::Horizontal</enum>
|
<enum>Qt::Horizontal</enum>
|
||||||
@ -203,47 +203,13 @@
|
|||||||
</property>
|
</property>
|
||||||
</spacer>
|
</spacer>
|
||||||
</item>
|
</item>
|
||||||
<item row="5" column="1">
|
<item row="3" column="1">
|
||||||
<widget class="QPushButton" name="showConnectInfoButton">
|
<widget class="QPushButton" name="showConnectInfoButton">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>OBSWebSocket.Settings.ShowConnectInfo</string>
|
<string>OBSWebSocket.Settings.ShowConnectInfo</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="1" column="1">
|
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout_3">
|
|
||||||
<item>
|
|
||||||
<widget class="QCheckBox" name="allowExternalCheckBox">
|
|
||||||
<property name="text">
|
|
||||||
<string>OBSWebSocket.Settings.AllowExternal</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QLabel" name="allowExternalToolTipLabel">
|
|
||||||
<property name="toolTip">
|
|
||||||
<string>OBSWebSocket.Settings.AllowExternalHoverText</string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string/>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<spacer name="horizontalSpacer_4">
|
|
||||||
<property name="orientation">
|
|
||||||
<enum>Qt::Horizontal</enum>
|
|
||||||
</property>
|
|
||||||
<property name="sizeHint" stdset="0">
|
|
||||||
<size>
|
|
||||||
<width>40</width>
|
|
||||||
<height>20</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
</spacer>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
@ -32,8 +32,14 @@ with this program. If not, see <https://www.gnu.org/licenses/>
|
|||||||
OBS_DECLARE_MODULE()
|
OBS_DECLARE_MODULE()
|
||||||
OBS_MODULE_USE_DEFAULT_LOCALE("obs-websocket", "en-US")
|
OBS_MODULE_USE_DEFAULT_LOCALE("obs-websocket", "en-US")
|
||||||
OBS_MODULE_AUTHOR("OBSProject")
|
OBS_MODULE_AUTHOR("OBSProject")
|
||||||
const char *obs_module_name(void) { return "obs-websocket"; }
|
const char *obs_module_name(void)
|
||||||
const char *obs_module_description(void) { return obs_module_text("OBSWebSocket.Plugin.Description"); }
|
{
|
||||||
|
return "obs-websocket";
|
||||||
|
}
|
||||||
|
const char *obs_module_description(void)
|
||||||
|
{
|
||||||
|
return obs_module_text("OBSWebSocket.Plugin.Description");
|
||||||
|
}
|
||||||
|
|
||||||
os_cpu_usage_info_t *_cpuUsageInfo;
|
os_cpu_usage_info_t *_cpuUsageInfo;
|
||||||
ConfigPtr _config;
|
ConfigPtr _config;
|
||||||
@ -46,7 +52,8 @@ void WebSocketApiEventCallback(std::string vendorName, std::string eventType, ob
|
|||||||
|
|
||||||
bool obs_module_load(void)
|
bool obs_module_load(void)
|
||||||
{
|
{
|
||||||
blog(LOG_INFO, "[obs_module_load] you can haz websockets (Version: %s | RPC Version: %d)", OBS_WEBSOCKET_VERSION, OBS_WEBSOCKET_RPC_VERSION);
|
blog(LOG_INFO, "[obs_module_load] you can haz websockets (Version: %s | RPC Version: %d)", OBS_WEBSOCKET_VERSION,
|
||||||
|
OBS_WEBSOCKET_RPC_VERSION);
|
||||||
blog(LOG_INFO, "[obs_module_load] Qt version (compile-time): %s | Qt version (run-time): %s", QT_VERSION_STR, qVersion());
|
blog(LOG_INFO, "[obs_module_load] Qt version (compile-time): %s | Qt version (run-time): %s", QT_VERSION_STR, qVersion());
|
||||||
blog(LOG_INFO, "[obs_module_load] Linked ASIO Version: %d", ASIO_VERSION);
|
blog(LOG_INFO, "[obs_module_load] Linked ASIO Version: %d", ASIO_VERSION);
|
||||||
|
|
||||||
@ -197,7 +204,8 @@ void obs_module_post_load()
|
|||||||
// Test calling obs-websocket requests
|
// Test calling obs-websocket requests
|
||||||
struct obs_websocket_request_response *response = obs_websocket_call_request("GetVersion");
|
struct obs_websocket_request_response *response = obs_websocket_call_request("GetVersion");
|
||||||
if (response) {
|
if (response) {
|
||||||
blog(LOG_INFO, "[obs_module_post_load] Called GetVersion. Status Code: %u | Comment: %s | Response Data: %s", response->status_code, response->comment, response->response_data);
|
blog(LOG_INFO, "[obs_module_post_load] Called GetVersion. Status Code: %u | Comment: %s | Response Data: %s",
|
||||||
|
response->status_code, response->comment, response->response_data);
|
||||||
obs_websocket_request_response_free(response);
|
obs_websocket_request_response_free(response);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -26,7 +26,7 @@ with this program. If not, see <https://www.gnu.org/licenses/>
|
|||||||
#include "utils/Obs.h"
|
#include "utils/Obs.h"
|
||||||
#include "plugin-macros.generated.h"
|
#include "plugin-macros.generated.h"
|
||||||
|
|
||||||
class Config;
|
struct Config;
|
||||||
typedef std::shared_ptr<Config> ConfigPtr;
|
typedef std::shared_ptr<Config> ConfigPtr;
|
||||||
|
|
||||||
class EventHandler;
|
class EventHandler;
|
||||||
|
@ -24,7 +24,7 @@ with this program. If not, see <https://www.gnu.org/licenses/>
|
|||||||
|
|
||||||
#define blog_debug(msg, ...) if (IsDebugEnabled()) blog(LOG_INFO, "[debug] " msg, ##__VA_ARGS__)
|
#define blog_debug(msg, ...) if (IsDebugEnabled()) blog(LOG_INFO, "[debug] " msg, ##__VA_ARGS__)
|
||||||
|
|
||||||
#define OBS_WEBSOCKET_VERSION "@OBS_WEBSOCKET_VERSION@"
|
#define OBS_WEBSOCKET_VERSION "@obs-websocket_VERSION@"
|
||||||
|
|
||||||
#define OBS_WEBSOCKET_RPC_VERSION @OBS_WEBSOCKET_RPC_VERSION@
|
#define OBS_WEBSOCKET_RPC_VERSION @OBS_WEBSOCKET_RPC_VERSION@
|
||||||
|
|
||||||
|
@ -24,8 +24,7 @@ with this program. If not, see <https://www.gnu.org/licenses/>
|
|||||||
#include "../utils/Compat.h"
|
#include "../utils/Compat.h"
|
||||||
#include "../obs-websocket.h"
|
#include "../obs-websocket.h"
|
||||||
|
|
||||||
struct SerialFrameBatch
|
struct SerialFrameBatch {
|
||||||
{
|
|
||||||
RequestHandler &requestHandler;
|
RequestHandler &requestHandler;
|
||||||
std::queue<RequestBatchRequest> requests;
|
std::queue<RequestBatchRequest> requests;
|
||||||
std::vector<RequestResult> results;
|
std::vector<RequestResult> results;
|
||||||
@ -37,43 +36,46 @@ struct SerialFrameBatch
|
|||||||
std::mutex conditionMutex;
|
std::mutex conditionMutex;
|
||||||
std::condition_variable condition;
|
std::condition_variable condition;
|
||||||
|
|
||||||
SerialFrameBatch(RequestHandler &requestHandler, json &variables, bool haltOnFailure) :
|
SerialFrameBatch(RequestHandler &requestHandler, json &variables, bool haltOnFailure)
|
||||||
requestHandler(requestHandler),
|
: requestHandler(requestHandler),
|
||||||
variables(variables),
|
variables(variables),
|
||||||
haltOnFailure(haltOnFailure),
|
haltOnFailure(haltOnFailure),
|
||||||
frameCount(0),
|
frameCount(0),
|
||||||
sleepUntilFrame(0)
|
sleepUntilFrame(0)
|
||||||
{}
|
{
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ParallelBatchResults
|
struct ParallelBatchResults {
|
||||||
{
|
|
||||||
RequestHandler &requestHandler;
|
RequestHandler &requestHandler;
|
||||||
std::vector<RequestResult> results;
|
std::vector<RequestResult> results;
|
||||||
|
|
||||||
std::mutex conditionMutex;
|
std::mutex conditionMutex;
|
||||||
std::condition_variable condition;
|
std::condition_variable condition;
|
||||||
|
|
||||||
ParallelBatchResults(RequestHandler &requestHandler) :
|
ParallelBatchResults(RequestHandler &requestHandler) : requestHandler(requestHandler) {}
|
||||||
requestHandler(requestHandler)
|
|
||||||
{}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// `{"inputName": "inputNameVariable"}` is essentially `inputName = inputNameVariable`
|
// `{"inputName": "inputNameVariable"}` is essentially `inputName = inputNameVariable`
|
||||||
static void PreProcessVariables(const json &variables, RequestBatchRequest &request)
|
static void PreProcessVariables(const json &variables, RequestBatchRequest &request)
|
||||||
{
|
{
|
||||||
if (variables.empty() || !request.InputVariables.is_object() || request.InputVariables.empty() || !request.RequestData.is_object())
|
if (variables.empty() || !request.InputVariables.is_object() || request.InputVariables.empty() ||
|
||||||
|
!request.RequestData.is_object())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
for (auto &[key, value] : request.InputVariables.items()) {
|
for (auto &[key, value] : request.InputVariables.items()) {
|
||||||
if (!value.is_string()) {
|
if (!value.is_string()) {
|
||||||
blog_debug("[WebSocketServer::ProcessRequestBatch] Value of field `%s` in `inputVariables `is not a string. Skipping!", key.c_str());
|
blog_debug(
|
||||||
|
"[WebSocketServer::ProcessRequestBatch] Value of field `%s` in `inputVariables `is not a string. Skipping!",
|
||||||
|
key.c_str());
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string valueString = value;
|
std::string valueString = value;
|
||||||
if (!variables.contains(valueString)) {
|
if (!variables.contains(valueString)) {
|
||||||
blog_debug("[WebSocketServer::ProcessRequestBatch] `inputVariables` requested variable `%s`, but it does not exist. Skipping!", valueString.c_str());
|
blog_debug(
|
||||||
|
"[WebSocketServer::ProcessRequestBatch] `inputVariables` requested variable `%s`, but it does not exist. Skipping!",
|
||||||
|
valueString.c_str());
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -91,13 +93,17 @@ static void PostProcessVariables(json &variables, const RequestBatchRequest &req
|
|||||||
|
|
||||||
for (auto &[key, value] : request.OutputVariables.items()) {
|
for (auto &[key, value] : request.OutputVariables.items()) {
|
||||||
if (!value.is_string()) {
|
if (!value.is_string()) {
|
||||||
blog_debug("[WebSocketServer::ProcessRequestBatch] Value of field `%s` in `outputVariables` is not a string. Skipping!", key.c_str());
|
blog_debug(
|
||||||
|
"[WebSocketServer::ProcessRequestBatch] Value of field `%s` in `outputVariables` is not a string. Skipping!",
|
||||||
|
key.c_str());
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string valueString = value;
|
std::string valueString = value;
|
||||||
if (!requestResult.ResponseData.contains(valueString)) {
|
if (!requestResult.ResponseData.contains(valueString)) {
|
||||||
blog_debug("[WebSocketServer::ProcessRequestBatch] `outputVariables` requested responseData field `%s`, but it does not exist. Skipping!", valueString.c_str());
|
blog_debug(
|
||||||
|
"[WebSocketServer::ProcessRequestBatch] `outputVariables` requested responseData field `%s`, but it does not exist. Skipping!",
|
||||||
|
valueString.c_str());
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -156,7 +162,10 @@ static void ObsTickCallback(void *param, float)
|
|||||||
serialFrameBatch->condition.notify_one();
|
serialFrameBatch->condition.notify_one();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<RequestResult> RequestBatchHandler::ProcessRequestBatch(QThreadPool &threadPool, SessionPtr session, RequestBatchExecutionType::RequestBatchExecutionType executionType, std::vector<RequestBatchRequest> &requests, json &variables, bool haltOnFailure)
|
std::vector<RequestResult>
|
||||||
|
RequestBatchHandler::ProcessRequestBatch(QThreadPool &threadPool, SessionPtr session,
|
||||||
|
RequestBatchExecutionType::RequestBatchExecutionType executionType,
|
||||||
|
std::vector<RequestBatchRequest> &requests, json &variables, bool haltOnFailure)
|
||||||
{
|
{
|
||||||
RequestHandler requestHandler(session);
|
RequestHandler requestHandler(session);
|
||||||
if (executionType == RequestBatchExecutionType::SerialRealtime) {
|
if (executionType == RequestBatchExecutionType::SerialRealtime) {
|
||||||
@ -215,7 +224,9 @@ std::vector<RequestResult> RequestBatchHandler::ProcessRequestBatch(QThreadPool
|
|||||||
|
|
||||||
// Wait for the last request to finish processing
|
// Wait for the last request to finish processing
|
||||||
size_t requestCount = requests.size();
|
size_t requestCount = requests.size();
|
||||||
parallelResults.condition.wait(lock, [¶llelResults, requestCount]{return parallelResults.results.size() == requestCount;});
|
parallelResults.condition.wait(lock, [¶llelResults, requestCount] {
|
||||||
|
return parallelResults.results.size() == requestCount;
|
||||||
|
});
|
||||||
|
|
||||||
return parallelResults.results;
|
return parallelResults.results;
|
||||||
}
|
}
|
||||||
|
@ -24,5 +24,8 @@ with this program. If not, see <https://www.gnu.org/licenses/>
|
|||||||
#include "rpc/RequestBatchRequest.h"
|
#include "rpc/RequestBatchRequest.h"
|
||||||
|
|
||||||
namespace RequestBatchHandler {
|
namespace RequestBatchHandler {
|
||||||
std::vector<RequestResult> ProcessRequestBatch(QThreadPool &threadPool, SessionPtr session, RequestBatchExecutionType::RequestBatchExecutionType executionType, std::vector<RequestBatchRequest> &requests, json &variables, bool haltOnFailure);
|
std::vector<RequestResult> ProcessRequestBatch(QThreadPool &threadPool, SessionPtr session,
|
||||||
|
RequestBatchExecutionType::RequestBatchExecutionType executionType,
|
||||||
|
std::vector<RequestBatchRequest> &requests, json &variables,
|
||||||
|
bool haltOnFailure);
|
||||||
}
|
}
|
||||||
|
@ -23,8 +23,7 @@ with this program. If not, see <https://www.gnu.org/licenses/>
|
|||||||
|
|
||||||
#include "RequestHandler.h"
|
#include "RequestHandler.h"
|
||||||
|
|
||||||
const std::unordered_map<std::string, RequestMethodHandler> RequestHandler::_handlerMap
|
const std::unordered_map<std::string, RequestMethodHandler> RequestHandler::_handlerMap{
|
||||||
{
|
|
||||||
// General
|
// General
|
||||||
{"GetVersion", &RequestHandler::GetVersion},
|
{"GetVersion", &RequestHandler::GetVersion},
|
||||||
{"GetStats", &RequestHandler::GetStats},
|
{"GetStats", &RequestHandler::GetStats},
|
||||||
@ -152,6 +151,13 @@ const std::unordered_map<std::string, RequestMethodHandler> RequestHandler::_han
|
|||||||
{"StopReplayBuffer", &RequestHandler::StopReplayBuffer},
|
{"StopReplayBuffer", &RequestHandler::StopReplayBuffer},
|
||||||
{"SaveReplayBuffer", &RequestHandler::SaveReplayBuffer},
|
{"SaveReplayBuffer", &RequestHandler::SaveReplayBuffer},
|
||||||
{"GetLastReplayBufferReplay", &RequestHandler::GetLastReplayBufferReplay},
|
{"GetLastReplayBufferReplay", &RequestHandler::GetLastReplayBufferReplay},
|
||||||
|
{"GetOutputList", &RequestHandler::GetOutputList},
|
||||||
|
{"GetOutputStatus", &RequestHandler::GetOutputStatus},
|
||||||
|
{"ToggleOutput", &RequestHandler::ToggleOutput},
|
||||||
|
{"StartOutput", &RequestHandler::StartOutput},
|
||||||
|
{"StopOutput", &RequestHandler::StopOutput},
|
||||||
|
{"GetOutputSettings", &RequestHandler::GetOutputSettings},
|
||||||
|
{"SetOutputSettings", &RequestHandler::SetOutputSettings},
|
||||||
|
|
||||||
// Stream
|
// Stream
|
||||||
{"GetStreamStatus", &RequestHandler::GetStreamStatus},
|
{"GetStreamStatus", &RequestHandler::GetStreamStatus},
|
||||||
@ -182,12 +188,11 @@ const std::unordered_map<std::string, RequestMethodHandler> RequestHandler::_han
|
|||||||
{"OpenInputFiltersDialog", &RequestHandler::OpenInputFiltersDialog},
|
{"OpenInputFiltersDialog", &RequestHandler::OpenInputFiltersDialog},
|
||||||
{"OpenInputInteractDialog", &RequestHandler::OpenInputInteractDialog},
|
{"OpenInputInteractDialog", &RequestHandler::OpenInputInteractDialog},
|
||||||
{"GetMonitorList", &RequestHandler::GetMonitorList},
|
{"GetMonitorList", &RequestHandler::GetMonitorList},
|
||||||
|
{"OpenVideoMixProjector", &RequestHandler::OpenVideoMixProjector},
|
||||||
|
{"OpenSourceProjector", &RequestHandler::OpenSourceProjector},
|
||||||
};
|
};
|
||||||
|
|
||||||
RequestHandler::RequestHandler(SessionPtr session) :
|
RequestHandler::RequestHandler(SessionPtr session) : _session(session) {}
|
||||||
_session(session)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
RequestResult RequestHandler::ProcessRequest(const Request &request)
|
RequestResult RequestHandler::ProcessRequest(const Request &request)
|
||||||
{
|
{
|
||||||
@ -199,12 +204,13 @@ RequestResult RequestHandler::ProcessRequest(const Request& request)
|
|||||||
return RequestResult::Error(RequestStatus::InvalidRequestFieldType, "Your request data is not an object.");
|
return RequestResult::Error(RequestStatus::InvalidRequestFieldType, "Your request data is not an object.");
|
||||||
|
|
||||||
if (request.RequestType.empty())
|
if (request.RequestType.empty())
|
||||||
return RequestResult::Error(RequestStatus::MissingRequestType, "Your request is missing a `requestType`");
|
return RequestResult::Error(RequestStatus::MissingRequestType, "Your request's `requestType` may not be empty.");
|
||||||
|
|
||||||
RequestMethodHandler handler;
|
RequestMethodHandler handler;
|
||||||
try {
|
try {
|
||||||
handler = _handlerMap.at(request.RequestType);
|
handler = _handlerMap.at(request.RequestType);
|
||||||
} catch (const std::out_of_range &oor) {
|
} catch (const std::out_of_range &oor) {
|
||||||
|
UNUSED_PARAMETER(oor);
|
||||||
return RequestResult::Error(RequestStatus::UnknownRequestType, "Your request type is not valid.");
|
return RequestResult::Error(RequestStatus::UnknownRequestType, "Your request type is not valid.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -170,6 +170,13 @@ class RequestHandler {
|
|||||||
RequestResult StopReplayBuffer(const Request &);
|
RequestResult StopReplayBuffer(const Request &);
|
||||||
RequestResult SaveReplayBuffer(const Request &);
|
RequestResult SaveReplayBuffer(const Request &);
|
||||||
RequestResult GetLastReplayBufferReplay(const Request &);
|
RequestResult GetLastReplayBufferReplay(const Request &);
|
||||||
|
RequestResult GetOutputList(const Request &);
|
||||||
|
RequestResult GetOutputStatus(const Request &);
|
||||||
|
RequestResult ToggleOutput(const Request &);
|
||||||
|
RequestResult StartOutput(const Request &);
|
||||||
|
RequestResult StopOutput(const Request &);
|
||||||
|
RequestResult GetOutputSettings(const Request &);
|
||||||
|
RequestResult SetOutputSettings(const Request &);
|
||||||
|
|
||||||
// Stream
|
// Stream
|
||||||
RequestResult GetStreamStatus(const Request &);
|
RequestResult GetStreamStatus(const Request &);
|
||||||
@ -200,6 +207,8 @@ class RequestHandler {
|
|||||||
RequestResult OpenInputFiltersDialog(const Request &);
|
RequestResult OpenInputFiltersDialog(const Request &);
|
||||||
RequestResult OpenInputInteractDialog(const Request &);
|
RequestResult OpenInputInteractDialog(const Request &);
|
||||||
RequestResult GetMonitorList(const Request &);
|
RequestResult GetMonitorList(const Request &);
|
||||||
|
RequestResult OpenVideoMixProjector(const Request &);
|
||||||
|
RequestResult OpenSourceProjector(const Request &);
|
||||||
|
|
||||||
SessionPtr _session;
|
SessionPtr _session;
|
||||||
static const std::unordered_map<std::string, RequestMethodHandler> _handlerMap;
|
static const std::unordered_map<std::string, RequestMethodHandler> _handlerMap;
|
||||||
|
@ -53,7 +53,8 @@ RequestResult RequestHandler::GetPersistentData(const Request& request)
|
|||||||
else if (realm == "OBS_WEBSOCKET_DATA_REALM_PROFILE")
|
else if (realm == "OBS_WEBSOCKET_DATA_REALM_PROFILE")
|
||||||
persistentDataPath += "/obsWebSocketPersistentData.json";
|
persistentDataPath += "/obsWebSocketPersistentData.json";
|
||||||
else
|
else
|
||||||
return RequestResult::Error(RequestStatus::ResourceNotFound, "You have specified an invalid persistent data realm.");
|
return RequestResult::Error(RequestStatus::ResourceNotFound,
|
||||||
|
"You have specified an invalid persistent data realm.");
|
||||||
|
|
||||||
json responseData;
|
json responseData;
|
||||||
json persistentData;
|
json persistentData;
|
||||||
@ -83,7 +84,8 @@ RequestResult RequestHandler::SetPersistentData(const Request& request)
|
|||||||
{
|
{
|
||||||
RequestStatus::RequestStatus statusCode;
|
RequestStatus::RequestStatus statusCode;
|
||||||
std::string comment;
|
std::string comment;
|
||||||
if (!(request.ValidateString("realm", statusCode, comment) && request.ValidateString("slotName", statusCode, comment) && request.ValidateBasic("slotValue", statusCode, comment)))
|
if (!(request.ValidateString("realm", statusCode, comment) && request.ValidateString("slotName", statusCode, comment) &&
|
||||||
|
request.ValidateBasic("slotValue", statusCode, comment)))
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
std::string realm = request.RequestData["realm"];
|
std::string realm = request.RequestData["realm"];
|
||||||
@ -96,13 +98,15 @@ RequestResult RequestHandler::SetPersistentData(const Request& request)
|
|||||||
else if (realm == "OBS_WEBSOCKET_DATA_REALM_PROFILE")
|
else if (realm == "OBS_WEBSOCKET_DATA_REALM_PROFILE")
|
||||||
persistentDataPath += "/obsWebSocketPersistentData.json";
|
persistentDataPath += "/obsWebSocketPersistentData.json";
|
||||||
else
|
else
|
||||||
return RequestResult::Error(RequestStatus::ResourceNotFound, "You have specified an invalid persistent data realm.");
|
return RequestResult::Error(RequestStatus::ResourceNotFound,
|
||||||
|
"You have specified an invalid persistent data realm.");
|
||||||
|
|
||||||
json persistentData = json::object();
|
json persistentData = json::object();
|
||||||
Utils::Json::GetJsonFileContent(persistentDataPath, persistentData);
|
Utils::Json::GetJsonFileContent(persistentDataPath, persistentData);
|
||||||
persistentData[slotName] = slotValue;
|
persistentData[slotName] = slotValue;
|
||||||
if (!Utils::Json::SetJsonFileContent(persistentDataPath, persistentData))
|
if (!Utils::Json::SetJsonFileContent(persistentDataPath, persistentData))
|
||||||
return RequestResult::Error(RequestStatus::RequestProcessingFailed, "Unable to write persistent data. No permissions?");
|
return RequestResult::Error(RequestStatus::RequestProcessingFailed,
|
||||||
|
"Unable to write persistent data. No permissions?");
|
||||||
|
|
||||||
return RequestResult::Success();
|
return RequestResult::Success();
|
||||||
}
|
}
|
||||||
@ -158,9 +162,10 @@ RequestResult RequestHandler::SetCurrentSceneCollection(const Request& request)
|
|||||||
std::string currentSceneCollectionName = Utils::Obs::StringHelper::GetCurrentSceneCollection();
|
std::string currentSceneCollectionName = Utils::Obs::StringHelper::GetCurrentSceneCollection();
|
||||||
// Avoid queueing tasks if nothing will change
|
// Avoid queueing tasks if nothing will change
|
||||||
if (currentSceneCollectionName != sceneCollectionName) {
|
if (currentSceneCollectionName != sceneCollectionName) {
|
||||||
obs_queue_task(OBS_TASK_UI, [](void* param) {
|
obs_queue_task(
|
||||||
obs_frontend_set_current_scene_collection(static_cast<const char*>(param));
|
OBS_TASK_UI,
|
||||||
}, (void*)sceneCollectionName.c_str(), true);
|
[](void *param) { obs_frontend_set_current_scene_collection(static_cast<const char *>(param)); },
|
||||||
|
(void *)sceneCollectionName.c_str(), true);
|
||||||
}
|
}
|
||||||
|
|
||||||
return RequestResult::Success();
|
return RequestResult::Success();
|
||||||
@ -195,7 +200,8 @@ RequestResult RequestHandler::CreateSceneCollection(const Request& request)
|
|||||||
|
|
||||||
QMainWindow *mainWindow = static_cast<QMainWindow *>(obs_frontend_get_main_window());
|
QMainWindow *mainWindow = static_cast<QMainWindow *>(obs_frontend_get_main_window());
|
||||||
bool success = false;
|
bool success = false;
|
||||||
QMetaObject::invokeMethod(mainWindow, "AddSceneCollection", Qt::BlockingQueuedConnection, Q_RETURN_ARG(bool, success), Q_ARG(bool, true), Q_ARG(QString, QString::fromStdString(sceneCollectionName)));
|
QMetaObject::invokeMethod(mainWindow, "AddSceneCollection", Qt::BlockingQueuedConnection, Q_RETURN_ARG(bool, success),
|
||||||
|
Q_ARG(bool, true), Q_ARG(QString, QString::fromStdString(sceneCollectionName)));
|
||||||
if (!success)
|
if (!success)
|
||||||
return RequestResult::Error(RequestStatus::ResourceCreationFailed, "Failed to create the scene collection.");
|
return RequestResult::Error(RequestStatus::ResourceCreationFailed, "Failed to create the scene collection.");
|
||||||
|
|
||||||
@ -251,9 +257,9 @@ RequestResult RequestHandler::SetCurrentProfile(const Request& request)
|
|||||||
std::string currentProfileName = Utils::Obs::StringHelper::GetCurrentProfile();
|
std::string currentProfileName = Utils::Obs::StringHelper::GetCurrentProfile();
|
||||||
// Avoid queueing tasks if nothing will change
|
// Avoid queueing tasks if nothing will change
|
||||||
if (currentProfileName != profileName) {
|
if (currentProfileName != profileName) {
|
||||||
obs_queue_task(OBS_TASK_UI, [](void* param) {
|
obs_queue_task(
|
||||||
obs_frontend_set_current_profile(static_cast<const char*>(param));
|
OBS_TASK_UI, [](void *param) { obs_frontend_set_current_profile(static_cast<const char *>(param)); },
|
||||||
}, (void*)profileName.c_str(), true);
|
(void *)profileName.c_str(), true);
|
||||||
}
|
}
|
||||||
|
|
||||||
return RequestResult::Success();
|
return RequestResult::Success();
|
||||||
@ -285,7 +291,8 @@ RequestResult RequestHandler::CreateProfile(const Request& request)
|
|||||||
return RequestResult::Error(RequestStatus::ResourceAlreadyExists);
|
return RequestResult::Error(RequestStatus::ResourceAlreadyExists);
|
||||||
|
|
||||||
QMainWindow *mainWindow = static_cast<QMainWindow *>(obs_frontend_get_main_window());
|
QMainWindow *mainWindow = static_cast<QMainWindow *>(obs_frontend_get_main_window());
|
||||||
QMetaObject::invokeMethod(mainWindow, "NewProfile", Qt::BlockingQueuedConnection, Q_ARG(QString, QString::fromStdString(profileName)));
|
QMetaObject::invokeMethod(mainWindow, "NewProfile", Qt::BlockingQueuedConnection,
|
||||||
|
Q_ARG(QString, QString::fromStdString(profileName)));
|
||||||
|
|
||||||
return RequestResult::Success();
|
return RequestResult::Success();
|
||||||
}
|
}
|
||||||
@ -319,7 +326,8 @@ RequestResult RequestHandler::RemoveProfile(const Request& request)
|
|||||||
return RequestResult::Error(RequestStatus::NotEnoughResources);
|
return RequestResult::Error(RequestStatus::NotEnoughResources);
|
||||||
|
|
||||||
QMainWindow *mainWindow = static_cast<QMainWindow *>(obs_frontend_get_main_window());
|
QMainWindow *mainWindow = static_cast<QMainWindow *>(obs_frontend_get_main_window());
|
||||||
QMetaObject::invokeMethod(mainWindow, "DeleteProfile", Qt::BlockingQueuedConnection, Q_ARG(QString, QString::fromStdString(profileName)));
|
QMetaObject::invokeMethod(mainWindow, "DeleteProfile", Qt::BlockingQueuedConnection,
|
||||||
|
Q_ARG(QString, QString::fromStdString(profileName)));
|
||||||
|
|
||||||
return RequestResult::Success();
|
return RequestResult::Success();
|
||||||
}
|
}
|
||||||
@ -344,7 +352,8 @@ RequestResult RequestHandler::GetProfileParameter(const Request& request)
|
|||||||
{
|
{
|
||||||
RequestStatus::RequestStatus statusCode;
|
RequestStatus::RequestStatus statusCode;
|
||||||
std::string comment;
|
std::string comment;
|
||||||
if (!(request.ValidateString("parameterCategory", statusCode, comment) && request.ValidateString("parameterName", statusCode, comment)))
|
if (!(request.ValidateString("parameterCategory", statusCode, comment) &&
|
||||||
|
request.ValidateString("parameterName", statusCode, comment)))
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
std::string parameterCategory = request.RequestData["parameterCategory"];
|
std::string parameterCategory = request.RequestData["parameterCategory"];
|
||||||
@ -358,7 +367,8 @@ RequestResult RequestHandler::GetProfileParameter(const Request& request)
|
|||||||
json responseData;
|
json responseData;
|
||||||
if (config_has_default_value(profile, parameterCategory.c_str(), parameterName.c_str())) {
|
if (config_has_default_value(profile, parameterCategory.c_str(), parameterName.c_str())) {
|
||||||
responseData["parameterValue"] = config_get_string(profile, parameterCategory.c_str(), parameterName.c_str());
|
responseData["parameterValue"] = config_get_string(profile, parameterCategory.c_str(), parameterName.c_str());
|
||||||
responseData["defaultParameterValue"] = config_get_default_string(profile, parameterCategory.c_str(), parameterName.c_str());
|
responseData["defaultParameterValue"] =
|
||||||
|
config_get_default_string(profile, parameterCategory.c_str(), parameterName.c_str());
|
||||||
} else if (config_has_user_value(profile, parameterCategory.c_str(), parameterName.c_str())) {
|
} else if (config_has_user_value(profile, parameterCategory.c_str(), parameterName.c_str())) {
|
||||||
responseData["parameterValue"] = config_get_string(profile, parameterCategory.c_str(), parameterName.c_str());
|
responseData["parameterValue"] = config_get_string(profile, parameterCategory.c_str(), parameterName.c_str());
|
||||||
responseData["defaultParameterValue"] = nullptr;
|
responseData["defaultParameterValue"] = nullptr;
|
||||||
@ -400,7 +410,8 @@ RequestResult RequestHandler::SetProfileParameter(const Request& request)
|
|||||||
// Using check helpers here would just make the logic more complicated
|
// Using check helpers here would just make the logic more complicated
|
||||||
if (!request.RequestData.contains("parameterValue") || request.RequestData["parameterValue"].is_null()) {
|
if (!request.RequestData.contains("parameterValue") || request.RequestData["parameterValue"].is_null()) {
|
||||||
if (!config_remove_value(profile, parameterCategory.c_str(), parameterName.c_str()))
|
if (!config_remove_value(profile, parameterCategory.c_str(), parameterName.c_str()))
|
||||||
return RequestResult::Error(RequestStatus::ResourceNotFound, "There are no existing instances of that profile parameter.");
|
return RequestResult::Error(RequestStatus::ResourceNotFound,
|
||||||
|
"There are no existing instances of that profile parameter.");
|
||||||
} else if (request.RequestData["parameterValue"].is_string()) {
|
} else if (request.RequestData["parameterValue"].is_string()) {
|
||||||
std::string parameterValue = request.RequestData["parameterValue"];
|
std::string parameterValue = request.RequestData["parameterValue"];
|
||||||
config_set_string(profile, parameterCategory.c_str(), parameterName.c_str(), parameterValue.c_str());
|
config_set_string(profile, parameterCategory.c_str(), parameterName.c_str(), parameterValue.c_str());
|
||||||
@ -471,20 +482,24 @@ RequestResult RequestHandler::GetVideoSettings(const Request&)
|
|||||||
RequestResult RequestHandler::SetVideoSettings(const Request &request)
|
RequestResult RequestHandler::SetVideoSettings(const Request &request)
|
||||||
{
|
{
|
||||||
if (obs_video_active())
|
if (obs_video_active())
|
||||||
return RequestResult::Error(RequestStatus::OutputRunning, "Video settings cannot be changed while an output is active.");
|
return RequestResult::Error(RequestStatus::OutputRunning,
|
||||||
|
"Video settings cannot be changed while an output is active.");
|
||||||
|
|
||||||
RequestStatus::RequestStatus statusCode = RequestStatus::NoError;
|
RequestStatus::RequestStatus statusCode = RequestStatus::NoError;
|
||||||
std::string comment;
|
std::string comment;
|
||||||
bool changeFps = (request.Contains("fpsNumerator") && request.Contains("fpsDenominator"));
|
bool changeFps = (request.Contains("fpsNumerator") && request.Contains("fpsDenominator"));
|
||||||
if (changeFps && !(request.ValidateOptionalNumber("fpsNumerator", statusCode, comment, 1) && request.ValidateOptionalNumber("fpsDenominator", statusCode, comment, 1)))
|
if (changeFps && !(request.ValidateOptionalNumber("fpsNumerator", statusCode, comment, 1) &&
|
||||||
|
request.ValidateOptionalNumber("fpsDenominator", statusCode, comment, 1)))
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
bool changeBaseRes = (request.Contains("baseWidth") && request.Contains("baseHeight"));
|
bool changeBaseRes = (request.Contains("baseWidth") && request.Contains("baseHeight"));
|
||||||
if (changeBaseRes && !(request.ValidateOptionalNumber("baseWidth", statusCode, comment, 8, 4096) && request.ValidateOptionalNumber("baseHeight", statusCode, comment, 8, 4096)))
|
if (changeBaseRes && !(request.ValidateOptionalNumber("baseWidth", statusCode, comment, 8, 4096) &&
|
||||||
|
request.ValidateOptionalNumber("baseHeight", statusCode, comment, 8, 4096)))
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
bool changeOutputRes = (request.Contains("outputWidth") && request.Contains("outputHeight"));
|
bool changeOutputRes = (request.Contains("outputWidth") && request.Contains("outputHeight"));
|
||||||
if (changeOutputRes && !(request.ValidateOptionalNumber("outputWidth", statusCode, comment, 8, 4096) && request.ValidateOptionalNumber("outputHeight", statusCode, comment, 8, 4096)))
|
if (changeOutputRes && !(request.ValidateOptionalNumber("outputWidth", statusCode, comment, 8, 4096) &&
|
||||||
|
request.ValidateOptionalNumber("outputHeight", statusCode, comment, 8, 4096)))
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
config_t *config = obs_frontend_get_profile_config();
|
config_t *config = obs_frontend_get_profile_config();
|
||||||
@ -557,18 +572,21 @@ RequestResult RequestHandler::GetStreamServiceSettings(const Request&)
|
|||||||
RequestResult RequestHandler::SetStreamServiceSettings(const Request &request)
|
RequestResult RequestHandler::SetStreamServiceSettings(const Request &request)
|
||||||
{
|
{
|
||||||
if (obs_frontend_streaming_active())
|
if (obs_frontend_streaming_active())
|
||||||
return RequestResult::Error(RequestStatus::OutputRunning, "You cannot change stream service settings while streaming.");
|
return RequestResult::Error(RequestStatus::OutputRunning,
|
||||||
|
"You cannot change stream service settings while streaming.");
|
||||||
|
|
||||||
RequestStatus::RequestStatus statusCode;
|
RequestStatus::RequestStatus statusCode;
|
||||||
std::string comment;
|
std::string comment;
|
||||||
if (!(request.ValidateString("streamServiceType", statusCode, comment) && request.ValidateObject("streamServiceSettings", statusCode, comment)))
|
if (!(request.ValidateString("streamServiceType", statusCode, comment) &&
|
||||||
|
request.ValidateObject("streamServiceSettings", statusCode, comment)))
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
OBSService currentStreamService = obs_frontend_get_streaming_service();
|
OBSService currentStreamService = obs_frontend_get_streaming_service();
|
||||||
|
|
||||||
std::string streamServiceType = obs_service_get_type(currentStreamService);
|
std::string streamServiceType = obs_service_get_type(currentStreamService);
|
||||||
std::string requestedStreamServiceType = request.RequestData["streamServiceType"];
|
std::string requestedStreamServiceType = request.RequestData["streamServiceType"];
|
||||||
OBSDataAutoRelease requestedStreamServiceSettings = Utils::Json::JsonToObsData(request.RequestData["streamServiceSettings"]);
|
OBSDataAutoRelease requestedStreamServiceSettings =
|
||||||
|
Utils::Json::JsonToObsData(request.RequestData["streamServiceSettings"]);
|
||||||
|
|
||||||
// Don't create a new service if the current service is the same type.
|
// Don't create a new service if the current service is the same type.
|
||||||
if (streamServiceType == requestedStreamServiceType) {
|
if (streamServiceType == requestedStreamServiceType) {
|
||||||
@ -582,10 +600,13 @@ RequestResult RequestHandler::SetStreamServiceSettings(const Request& request)
|
|||||||
obs_service_update(currentStreamService, newStreamServiceSettings);
|
obs_service_update(currentStreamService, newStreamServiceSettings);
|
||||||
} else {
|
} else {
|
||||||
// TODO: This leaks memory. I have no idea why.
|
// TODO: This leaks memory. I have no idea why.
|
||||||
OBSService newStreamService = obs_service_create(requestedStreamServiceType.c_str(), "obs_websocket_custom_service", requestedStreamServiceSettings, nullptr);
|
OBSService newStreamService = obs_service_create(requestedStreamServiceType.c_str(), "obs_websocket_custom_service",
|
||||||
|
requestedStreamServiceSettings, nullptr);
|
||||||
// TODO: Check service type here, instead of relying on service creation to fail.
|
// TODO: Check service type here, instead of relying on service creation to fail.
|
||||||
if (!newStreamService)
|
if (!newStreamService)
|
||||||
return RequestResult::Error(RequestStatus::ResourceCreationFailed, "Failed to create the stream service with the requested streamServiceType. It may be an invalid type.");
|
return RequestResult::Error(
|
||||||
|
RequestStatus::ResourceCreationFailed,
|
||||||
|
"Failed to create the stream service with the requested streamServiceType. It may be an invalid type.");
|
||||||
|
|
||||||
obs_frontend_set_streaming_service(newStreamService);
|
obs_frontend_set_streaming_service(newStreamService);
|
||||||
}
|
}
|
||||||
@ -605,7 +626,7 @@ RequestResult RequestHandler::SetStreamServiceSettings(const Request& request)
|
|||||||
* @rpcVersion -1
|
* @rpcVersion -1
|
||||||
* @initialVersion 5.0.0
|
* @initialVersion 5.0.0
|
||||||
* @api requests
|
* @api requests
|
||||||
* @category rconfig
|
* @category config
|
||||||
*/
|
*/
|
||||||
RequestResult RequestHandler::GetRecordDirectory(const Request &)
|
RequestResult RequestHandler::GetRecordDirectory(const Request &)
|
||||||
{
|
{
|
||||||
|
@ -103,7 +103,8 @@ RequestResult RequestHandler::CreateSourceFilter(const Request& request)
|
|||||||
std::string comment;
|
std::string comment;
|
||||||
|
|
||||||
OBSSourceAutoRelease source = request.ValidateSource("sourceName", statusCode, comment);
|
OBSSourceAutoRelease source = request.ValidateSource("sourceName", statusCode, comment);
|
||||||
if (!(source && request.ValidateString("filterName", statusCode, comment) && request.ValidateString("filterKind", statusCode, comment)))
|
if (!(source && request.ValidateString("filterName", statusCode, comment) &&
|
||||||
|
request.ValidateString("filterKind", statusCode, comment)))
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
std::string filterName = request.RequestData["filterName"];
|
std::string filterName = request.RequestData["filterName"];
|
||||||
@ -114,7 +115,9 @@ RequestResult RequestHandler::CreateSourceFilter(const Request& request)
|
|||||||
std::string filterKind = request.RequestData["filterKind"];
|
std::string filterKind = request.RequestData["filterKind"];
|
||||||
auto kinds = Utils::Obs::ArrayHelper::GetFilterKindList();
|
auto kinds = Utils::Obs::ArrayHelper::GetFilterKindList();
|
||||||
if (std::find(kinds.begin(), kinds.end(), filterKind) == kinds.end())
|
if (std::find(kinds.begin(), kinds.end(), filterKind) == kinds.end())
|
||||||
return RequestResult::Error(RequestStatus::InvalidFilterKind, "Your specified filter kind is not supported by OBS. Check that any necessary plugins are loaded.");
|
return RequestResult::Error(
|
||||||
|
RequestStatus::InvalidFilterKind,
|
||||||
|
"Your specified filter kind is not supported by OBS. Check that any necessary plugins are loaded.");
|
||||||
|
|
||||||
OBSDataAutoRelease filterSettings = nullptr;
|
OBSDataAutoRelease filterSettings = nullptr;
|
||||||
if (request.Contains("filterSettings")) {
|
if (request.Contains("filterSettings")) {
|
||||||
@ -219,7 +222,9 @@ RequestResult RequestHandler::GetSourceFilter(const Request& request)
|
|||||||
|
|
||||||
json responseData;
|
json responseData;
|
||||||
responseData["filterEnabled"] = obs_source_enabled(pair.filter);
|
responseData["filterEnabled"] = obs_source_enabled(pair.filter);
|
||||||
responseData["filterIndex"] = Utils::Obs::NumberHelper::GetSourceFilterIndex(pair.source, pair.filter); // Todo: Use `GetSourceFilterlist` to select this filter maybe
|
responseData["filterIndex"] = Utils::Obs::NumberHelper::GetSourceFilterIndex(
|
||||||
|
pair.source,
|
||||||
|
pair.filter); // Todo: Use `GetSourceFilterlist` to select this filter maybe
|
||||||
responseData["filterKind"] = obs_source_get_id(pair.filter);
|
responseData["filterKind"] = obs_source_get_id(pair.filter);
|
||||||
|
|
||||||
OBSDataAutoRelease filterSettings = obs_source_get_settings(pair.filter);
|
OBSDataAutoRelease filterSettings = obs_source_get_settings(pair.filter);
|
||||||
@ -292,7 +297,8 @@ RequestResult RequestHandler::SetSourceFilterSettings(const Request& request)
|
|||||||
|
|
||||||
OBSDataAutoRelease newSettings = Utils::Json::JsonToObsData(request.RequestData["filterSettings"]);
|
OBSDataAutoRelease newSettings = Utils::Json::JsonToObsData(request.RequestData["filterSettings"]);
|
||||||
if (!newSettings)
|
if (!newSettings)
|
||||||
return RequestResult::Error(RequestStatus::RequestProcessingFailed, "An internal data conversion operation failed. Please report this!");
|
return RequestResult::Error(RequestStatus::RequestProcessingFailed,
|
||||||
|
"An internal data conversion operation failed. Please report this!");
|
||||||
|
|
||||||
if (overlay)
|
if (overlay)
|
||||||
obs_source_update(pair.filter, newSettings);
|
obs_source_update(pair.filter, newSettings);
|
||||||
|
@ -26,7 +26,6 @@ with this program. If not, see <https://www.gnu.org/licenses/>
|
|||||||
#include "../WebSocketApi.h"
|
#include "../WebSocketApi.h"
|
||||||
#include "../obs-websocket.h"
|
#include "../obs-websocket.h"
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets data about the current plugin and RPC version.
|
* Gets data about the current plugin and RPC version.
|
||||||
*
|
*
|
||||||
@ -141,6 +140,8 @@ RequestResult RequestHandler::BroadcastCustomEvent(const Request& request)
|
|||||||
* @requestField requestType | String | The request type to call
|
* @requestField requestType | String | The request type to call
|
||||||
* @requestField ?requestData | Object | Object containing appropriate request data | {}
|
* @requestField ?requestData | Object | Object containing appropriate request data | {}
|
||||||
*
|
*
|
||||||
|
* @responseField vendorName | String | Echoed of `vendorName`
|
||||||
|
* @responseField requestType | String | Echoed of `requestType`
|
||||||
* @responseField responseData | Object | Object containing appropriate response data. {} if request does not provide any response data
|
* @responseField responseData | Object | Object containing appropriate response data. {} if request does not provide any response data
|
||||||
*
|
*
|
||||||
* @requestType CallVendorRequest
|
* @requestType CallVendorRequest
|
||||||
@ -154,7 +155,8 @@ RequestResult RequestHandler::CallVendorRequest(const Request& request)
|
|||||||
{
|
{
|
||||||
RequestStatus::RequestStatus statusCode;
|
RequestStatus::RequestStatus statusCode;
|
||||||
std::string comment;
|
std::string comment;
|
||||||
if (!request.ValidateString("vendorName", statusCode, comment) || !request.ValidateString("requestType", statusCode, comment))
|
if (!request.ValidateString("vendorName", statusCode, comment) ||
|
||||||
|
!request.ValidateString("requestType", statusCode, comment))
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
std::string vendorName = request.RequestData["vendorName"];
|
std::string vendorName = request.RequestData["vendorName"];
|
||||||
@ -172,7 +174,8 @@ RequestResult RequestHandler::CallVendorRequest(const Request& request)
|
|||||||
|
|
||||||
auto webSocketApi = GetWebSocketApi();
|
auto webSocketApi = GetWebSocketApi();
|
||||||
if (!webSocketApi)
|
if (!webSocketApi)
|
||||||
return RequestResult::Error(RequestStatus::RequestProcessingFailed, "Unable to call request due to internal error.");
|
return RequestResult::Error(RequestStatus::RequestProcessingFailed,
|
||||||
|
"Unable to call request due to internal error.");
|
||||||
|
|
||||||
auto ret = webSocketApi->PerformVendorRequest(vendorName, requestType, requestData, obsResponseData);
|
auto ret = webSocketApi->PerformVendorRequest(vendorName, requestType, requestData, obsResponseData);
|
||||||
switch (ret) {
|
switch (ret) {
|
||||||
@ -186,6 +189,8 @@ RequestResult RequestHandler::CallVendorRequest(const Request& request)
|
|||||||
}
|
}
|
||||||
|
|
||||||
json responseData;
|
json responseData;
|
||||||
|
responseData["vendorName"] = vendorName;
|
||||||
|
responseData["requestType"] = requestType;
|
||||||
responseData["responseData"] = Utils::Json::ObsDataToJson(obsResponseData);
|
responseData["responseData"] = Utils::Json::ObsDataToJson(obsResponseData);
|
||||||
|
|
||||||
return RequestResult::Success(responseData);
|
return RequestResult::Success(responseData);
|
||||||
@ -277,19 +282,23 @@ RequestResult RequestHandler::TriggerHotkeyByKeySequence(const Request& request)
|
|||||||
|
|
||||||
const json keyModifiersJson = request.RequestData["keyModifiers"];
|
const json keyModifiersJson = request.RequestData["keyModifiers"];
|
||||||
uint32_t keyModifiers = 0;
|
uint32_t keyModifiers = 0;
|
||||||
if (keyModifiersJson.contains("shift") && keyModifiersJson["shift"].is_boolean() && keyModifiersJson["shift"].get<bool>())
|
if (keyModifiersJson.contains("shift") && keyModifiersJson["shift"].is_boolean() &&
|
||||||
|
keyModifiersJson["shift"].get<bool>())
|
||||||
keyModifiers |= INTERACT_SHIFT_KEY;
|
keyModifiers |= INTERACT_SHIFT_KEY;
|
||||||
if (keyModifiersJson.contains("control") && keyModifiersJson["control"].is_boolean() && keyModifiersJson["control"].get<bool>())
|
if (keyModifiersJson.contains("control") && keyModifiersJson["control"].is_boolean() &&
|
||||||
|
keyModifiersJson["control"].get<bool>())
|
||||||
keyModifiers |= INTERACT_CONTROL_KEY;
|
keyModifiers |= INTERACT_CONTROL_KEY;
|
||||||
if (keyModifiersJson.contains("alt") && keyModifiersJson["alt"].is_boolean() && keyModifiersJson["alt"].get<bool>())
|
if (keyModifiersJson.contains("alt") && keyModifiersJson["alt"].is_boolean() && keyModifiersJson["alt"].get<bool>())
|
||||||
keyModifiers |= INTERACT_ALT_KEY;
|
keyModifiers |= INTERACT_ALT_KEY;
|
||||||
if (keyModifiersJson.contains("command") && keyModifiersJson["command"].is_boolean() && keyModifiersJson["command"].get<bool>())
|
if (keyModifiersJson.contains("command") && keyModifiersJson["command"].is_boolean() &&
|
||||||
|
keyModifiersJson["command"].get<bool>())
|
||||||
keyModifiers |= INTERACT_COMMAND_KEY;
|
keyModifiers |= INTERACT_COMMAND_KEY;
|
||||||
combo.modifiers = keyModifiers;
|
combo.modifiers = keyModifiers;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!combo.modifiers && (combo.key == OBS_KEY_NONE || combo.key >= OBS_KEY_LAST_VALUE))
|
if (!combo.modifiers && (combo.key == OBS_KEY_NONE || combo.key >= OBS_KEY_LAST_VALUE))
|
||||||
return RequestResult::Error(RequestStatus::CannotAct, "Your provided request fields cannot be used to trigger a hotkey.");
|
return RequestResult::Error(RequestStatus::CannotAct,
|
||||||
|
"Your provided request fields cannot be used to trigger a hotkey.");
|
||||||
|
|
||||||
// Apparently things break when you don't start by setting the combo to false
|
// Apparently things break when you don't start by setting the combo to false
|
||||||
obs_hotkey_inject_event(combo, false);
|
obs_hotkey_inject_event(combo, false);
|
||||||
|
@ -106,7 +106,7 @@ RequestResult RequestHandler::GetSpecialInputs(const Request&)
|
|||||||
|
|
||||||
std::vector<std::string> channels = {"desktop1", "desktop2", "mic1", "mic2", "mic3", "mic4"};
|
std::vector<std::string> channels = {"desktop1", "desktop2", "mic1", "mic2", "mic3", "mic4"};
|
||||||
|
|
||||||
size_t channelId = 1;
|
uint32_t channelId = 1;
|
||||||
for (auto &channel : channels) {
|
for (auto &channel : channels) {
|
||||||
OBSSourceAutoRelease input = obs_get_output_source(channelId);
|
OBSSourceAutoRelease input = obs_get_output_source(channelId);
|
||||||
if (!input)
|
if (!input)
|
||||||
@ -143,7 +143,8 @@ RequestResult RequestHandler::CreateInput(const Request& request)
|
|||||||
RequestStatus::RequestStatus statusCode;
|
RequestStatus::RequestStatus statusCode;
|
||||||
std::string comment;
|
std::string comment;
|
||||||
OBSSourceAutoRelease sceneSource = request.ValidateScene("sceneName", statusCode, comment);
|
OBSSourceAutoRelease sceneSource = request.ValidateScene("sceneName", statusCode, comment);
|
||||||
if (!(sceneSource && request.ValidateString("inputName", statusCode, comment) && request.ValidateString("inputKind", statusCode, comment)))
|
if (!(sceneSource && request.ValidateString("inputName", statusCode, comment) &&
|
||||||
|
request.ValidateString("inputKind", statusCode, comment)))
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
std::string inputName = request.RequestData["inputName"];
|
std::string inputName = request.RequestData["inputName"];
|
||||||
@ -154,7 +155,9 @@ RequestResult RequestHandler::CreateInput(const Request& request)
|
|||||||
std::string inputKind = request.RequestData["inputKind"];
|
std::string inputKind = request.RequestData["inputKind"];
|
||||||
auto kinds = Utils::Obs::ArrayHelper::GetInputKindList();
|
auto kinds = Utils::Obs::ArrayHelper::GetInputKindList();
|
||||||
if (std::find(kinds.begin(), kinds.end(), inputKind) == kinds.end())
|
if (std::find(kinds.begin(), kinds.end(), inputKind) == kinds.end())
|
||||||
return RequestResult::Error(RequestStatus::InvalidInputKind, "Your specified input kind is not supported by OBS. Check that your specified kind is properly versioned and that any necessary plugins are loaded.");
|
return RequestResult::Error(
|
||||||
|
RequestStatus::InvalidInputKind,
|
||||||
|
"Your specified input kind is not supported by OBS. Check that your specified kind is properly versioned and that any necessary plugins are loaded.");
|
||||||
|
|
||||||
OBSDataAutoRelease inputSettings = nullptr;
|
OBSDataAutoRelease inputSettings = nullptr;
|
||||||
if (request.Contains("inputSettings")) {
|
if (request.Contains("inputSettings")) {
|
||||||
@ -175,7 +178,8 @@ RequestResult RequestHandler::CreateInput(const Request& request)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Create the input and add it as a scene item to the destination scene
|
// Create the input and add it as a scene item to the destination scene
|
||||||
OBSSceneItemAutoRelease sceneItem = Utils::Obs::ActionHelper::CreateInput(inputName, inputKind, inputSettings, scene, sceneItemEnabled);
|
OBSSceneItemAutoRelease sceneItem =
|
||||||
|
Utils::Obs::ActionHelper::CreateInput(inputName, inputKind, inputSettings, scene, sceneItemEnabled);
|
||||||
|
|
||||||
if (!sceneItem)
|
if (!sceneItem)
|
||||||
return RequestResult::Error(RequestStatus::ResourceCreationFailed, "Creation of the input or scene item failed.");
|
return RequestResult::Error(RequestStatus::ResourceCreationFailed, "Creation of the input or scene item failed.");
|
||||||
@ -240,7 +244,8 @@ RequestResult RequestHandler::SetInputName(const Request& request)
|
|||||||
|
|
||||||
OBSSourceAutoRelease existingSource = obs_get_source_by_name(newInputName.c_str());
|
OBSSourceAutoRelease existingSource = obs_get_source_by_name(newInputName.c_str());
|
||||||
if (existingSource)
|
if (existingSource)
|
||||||
return RequestResult::Error(RequestStatus::ResourceAlreadyExists, "A source already exists by that new input name.");
|
return RequestResult::Error(RequestStatus::ResourceAlreadyExists,
|
||||||
|
"A source already exists by that new input name.");
|
||||||
|
|
||||||
obs_source_set_name(input, newInputName.c_str());
|
obs_source_set_name(input, newInputName.c_str());
|
||||||
|
|
||||||
@ -349,7 +354,8 @@ RequestResult RequestHandler::SetInputSettings(const Request& request)
|
|||||||
OBSDataAutoRelease newSettings = Utils::Json::JsonToObsData(request.RequestData["inputSettings"]);
|
OBSDataAutoRelease newSettings = Utils::Json::JsonToObsData(request.RequestData["inputSettings"]);
|
||||||
if (!newSettings)
|
if (!newSettings)
|
||||||
// This should never happen
|
// This should never happen
|
||||||
return RequestResult::Error(RequestStatus::RequestProcessingFailed, "An internal data conversion operation failed. Please report this!");
|
return RequestResult::Error(RequestStatus::RequestProcessingFailed,
|
||||||
|
"An internal data conversion operation failed. Please report this!");
|
||||||
|
|
||||||
if (overlay)
|
if (overlay)
|
||||||
// Applies the new settings on top of the existing user settings
|
// Applies the new settings on top of the existing user settings
|
||||||
@ -700,7 +706,7 @@ RequestResult RequestHandler::GetInputAudioMonitorType(const Request& request)
|
|||||||
return RequestResult::Error(RequestStatus::InvalidResourceState, "The specified input does not support audio.");
|
return RequestResult::Error(RequestStatus::InvalidResourceState, "The specified input does not support audio.");
|
||||||
|
|
||||||
json responseData;
|
json responseData;
|
||||||
responseData["monitorType"] = Utils::Obs::StringHelper::GetInputMonitorType(input);
|
responseData["monitorType"] = obs_source_get_monitoring_type(input);
|
||||||
|
|
||||||
return RequestResult::Success(responseData);
|
return RequestResult::Success(responseData);
|
||||||
}
|
}
|
||||||
@ -730,7 +736,8 @@ RequestResult RequestHandler::SetInputAudioMonitorType(const Request& request)
|
|||||||
return RequestResult::Error(RequestStatus::InvalidResourceState, "The specified input does not support audio.");
|
return RequestResult::Error(RequestStatus::InvalidResourceState, "The specified input does not support audio.");
|
||||||
|
|
||||||
if (!obs_audio_monitoring_available())
|
if (!obs_audio_monitoring_available())
|
||||||
return RequestResult::Error(RequestStatus::InvalidResourceState, "Audio monitoring is not available on this platform.");
|
return RequestResult::Error(RequestStatus::InvalidResourceState,
|
||||||
|
"Audio monitoring is not available on this platform.");
|
||||||
|
|
||||||
enum obs_monitoring_type monitorType;
|
enum obs_monitoring_type monitorType;
|
||||||
std::string monitorTypeString = request.RequestData["monitorType"];
|
std::string monitorTypeString = request.RequestData["monitorType"];
|
||||||
@ -741,7 +748,8 @@ RequestResult RequestHandler::SetInputAudioMonitorType(const Request& request)
|
|||||||
else if (monitorTypeString == "OBS_MONITORING_TYPE_MONITOR_AND_OUTPUT")
|
else if (monitorTypeString == "OBS_MONITORING_TYPE_MONITOR_AND_OUTPUT")
|
||||||
monitorType = OBS_MONITORING_TYPE_MONITOR_AND_OUTPUT;
|
monitorType = OBS_MONITORING_TYPE_MONITOR_AND_OUTPUT;
|
||||||
else
|
else
|
||||||
return RequestResult::Error(RequestStatus::InvalidRequestField, std::string("Unknown monitor type: ") + monitorTypeString);
|
return RequestResult::Error(RequestStatus::InvalidRequestField,
|
||||||
|
std::string("Unknown monitor type: ") + monitorTypeString);
|
||||||
|
|
||||||
obs_source_set_monitoring_type(input, monitorType);
|
obs_source_set_monitoring_type(input, monitorType);
|
||||||
|
|
||||||
@ -812,16 +820,17 @@ RequestResult RequestHandler::SetInputAudioTracks(const Request& request)
|
|||||||
|
|
||||||
json inputAudioTracks = request.RequestData["inputAudioTracks"];
|
json inputAudioTracks = request.RequestData["inputAudioTracks"];
|
||||||
|
|
||||||
long long mixers = obs_source_get_audio_mixers(input);
|
uint32_t mixers = obs_source_get_audio_mixers(input);
|
||||||
|
|
||||||
for (long long i = 0; i < MAX_AUDIO_MIXES; i++) {
|
for (uint32_t i = 0; i < MAX_AUDIO_MIXES; i++) {
|
||||||
std::string track = std::to_string(i + 1);
|
std::string track = std::to_string(i + 1);
|
||||||
|
|
||||||
if (!Utils::Json::Contains(inputAudioTracks, track))
|
if (!Utils::Json::Contains(inputAudioTracks, track))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (!inputAudioTracks[track].is_boolean())
|
if (!inputAudioTracks[track].is_boolean())
|
||||||
return RequestResult::Error(RequestStatus::InvalidRequestFieldType, "The value of one of your tracks is not a boolean.");
|
return RequestResult::Error(RequestStatus::InvalidRequestFieldType,
|
||||||
|
"The value of one of your tracks is not a boolean.");
|
||||||
|
|
||||||
bool enabled = inputAudioTracks[track];
|
bool enabled = inputAudioTracks[track];
|
||||||
|
|
||||||
|
@ -61,7 +61,8 @@ RequestResult RequestHandler::GetMediaInputStatus(const Request& request)
|
|||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
json responseData;
|
json responseData;
|
||||||
responseData["mediaState"] = Utils::Obs::StringHelper::GetMediaInputState(input);
|
responseData["mediaState"] = obs_source_media_get_state(input);
|
||||||
|
;
|
||||||
|
|
||||||
if (IsMediaTimeValid(input)) {
|
if (IsMediaTimeValid(input)) {
|
||||||
responseData["mediaDuration"] = obs_source_media_get_duration(input);
|
responseData["mediaDuration"] = obs_source_media_get_duration(input);
|
||||||
@ -98,7 +99,8 @@ RequestResult RequestHandler::SetMediaInputCursor(const Request& request)
|
|||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
if (!IsMediaTimeValid(input))
|
if (!IsMediaTimeValid(input))
|
||||||
return RequestResult::Error(RequestStatus::InvalidResourceState, "The media input must be playing or paused in order to set the cursor position.");
|
return RequestResult::Error(RequestStatus::InvalidResourceState,
|
||||||
|
"The media input must be playing or paused in order to set the cursor position.");
|
||||||
|
|
||||||
int64_t mediaCursor = request.RequestData["mediaCursor"];
|
int64_t mediaCursor = request.RequestData["mediaCursor"];
|
||||||
|
|
||||||
@ -132,7 +134,8 @@ RequestResult RequestHandler::OffsetMediaInputCursor(const Request& request)
|
|||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
if (!IsMediaTimeValid(input))
|
if (!IsMediaTimeValid(input))
|
||||||
return RequestResult::Error(RequestStatus::InvalidResourceState, "The media input must be playing or paused in order to set the cursor position.");
|
return RequestResult::Error(RequestStatus::InvalidResourceState,
|
||||||
|
"The media input must be playing or paused in order to set the cursor position.");
|
||||||
|
|
||||||
int64_t mediaCursorOffset = request.RequestData["mediaCursorOffset"];
|
int64_t mediaCursorOffset = request.RequestData["mediaCursorOffset"];
|
||||||
int64_t mediaCursor = obs_source_media_get_time(input) + mediaCursorOffset;
|
int64_t mediaCursor = obs_source_media_get_time(input) + mediaCursorOffset;
|
||||||
@ -166,13 +169,13 @@ RequestResult RequestHandler::TriggerMediaInputAction(const Request& request)
|
|||||||
if (!(input && request.ValidateString("mediaAction", statusCode, comment)))
|
if (!(input && request.ValidateString("mediaAction", statusCode, comment)))
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
std::string mediaActionString = request.RequestData["mediaAction"];
|
enum ObsMediaInputAction mediaAction = request.RequestData["mediaAction"];
|
||||||
auto mediaAction = Utils::Obs::EnumHelper::GetMediaInputAction(mediaActionString);
|
|
||||||
|
|
||||||
switch (mediaAction) {
|
switch (mediaAction) {
|
||||||
default:
|
default:
|
||||||
case OBS_WEBSOCKET_MEDIA_INPUT_ACTION_NONE:
|
case OBS_WEBSOCKET_MEDIA_INPUT_ACTION_NONE:
|
||||||
return RequestResult::Error(RequestStatus::InvalidRequestField, "You have specified an invalid media input action.");
|
return RequestResult::Error(RequestStatus::InvalidRequestField,
|
||||||
|
"You have specified an invalid media input action.");
|
||||||
case OBS_WEBSOCKET_MEDIA_INPUT_ACTION_PLAY:
|
case OBS_WEBSOCKET_MEDIA_INPUT_ACTION_PLAY:
|
||||||
// Shoutout to whoever implemented this API call like this
|
// Shoutout to whoever implemented this API call like this
|
||||||
obs_source_media_play_pause(input, false);
|
obs_source_media_play_pause(input, false);
|
||||||
|
@ -272,6 +272,217 @@ RequestResult RequestHandler::GetLastReplayBufferReplay(const Request&)
|
|||||||
return RequestResult::Error(RequestStatus::OutputNotRunning);
|
return RequestResult::Error(RequestStatus::OutputNotRunning);
|
||||||
|
|
||||||
json responseData;
|
json responseData;
|
||||||
responseData["savedReplayPath"] = Utils::Obs::StringHelper::GetLastReplayBufferFilePath();
|
responseData["savedReplayPath"] = Utils::Obs::StringHelper::GetLastReplayBufferFileName();
|
||||||
return RequestResult::Success(responseData);
|
return RequestResult::Success(responseData);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the list of available outputs.
|
||||||
|
*
|
||||||
|
* @requestType GetOutputList
|
||||||
|
* @complexity 4
|
||||||
|
* @rpcVersion -1
|
||||||
|
* @initialVersion 5.0.0
|
||||||
|
* @api requests
|
||||||
|
* @category outputs
|
||||||
|
*/
|
||||||
|
RequestResult RequestHandler::GetOutputList(const Request &)
|
||||||
|
{
|
||||||
|
json responseData;
|
||||||
|
responseData["outputs"] = Utils::Obs::ArrayHelper::GetOutputList();
|
||||||
|
return RequestResult::Success(responseData);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the status of an output.
|
||||||
|
*
|
||||||
|
* @requestField outputName | String | Output name
|
||||||
|
*
|
||||||
|
* @responseField outputActive | Boolean | Whether the output is active
|
||||||
|
* @responseField outputReconnecting | Boolean | Whether the output is reconnecting
|
||||||
|
* @responseField outputTimecode | String | Current formatted timecode string for the output
|
||||||
|
* @responseField outputDuration | Number | Current duration in milliseconds for the output
|
||||||
|
* @responseField outputCongestion | Number | Congestion of the output
|
||||||
|
* @responseField outputBytes | Number | Number of bytes sent by the output
|
||||||
|
* @responseField outputSkippedFrames | Number | Number of frames skipped by the output's process
|
||||||
|
* @responseField outputTotalFrames | Number | Total number of frames delivered by the output's process
|
||||||
|
*
|
||||||
|
* @requestType GetOutputStatus
|
||||||
|
* @complexity 4
|
||||||
|
* @rpcVersion -1
|
||||||
|
* @initialVersion 5.0.0
|
||||||
|
* @api requests
|
||||||
|
* @category outputs
|
||||||
|
*/
|
||||||
|
RequestResult RequestHandler::GetOutputStatus(const Request &request)
|
||||||
|
{
|
||||||
|
RequestStatus::RequestStatus statusCode;
|
||||||
|
std::string comment;
|
||||||
|
OBSOutputAutoRelease output = request.ValidateOutput("outputName", statusCode, comment);
|
||||||
|
if (!output)
|
||||||
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
|
uint64_t outputDuration = Utils::Obs::NumberHelper::GetOutputDuration(output);
|
||||||
|
|
||||||
|
json responseData;
|
||||||
|
responseData["outputActive"] = obs_output_active(output);
|
||||||
|
responseData["outputReconnecting"] = obs_output_reconnecting(output);
|
||||||
|
responseData["outputTimecode"] = Utils::Obs::StringHelper::DurationToTimecode(outputDuration);
|
||||||
|
responseData["outputDuration"] = outputDuration;
|
||||||
|
responseData["outputCongestion"] = obs_output_get_congestion(output);
|
||||||
|
responseData["outputBytes"] = obs_output_get_total_bytes(output);
|
||||||
|
responseData["outputSkippedFrames"] = obs_output_get_frames_dropped(output);
|
||||||
|
responseData["outputTotalFrames"] = obs_output_get_total_frames(output);
|
||||||
|
|
||||||
|
return RequestResult::Success(responseData);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Toggles the status of an output.
|
||||||
|
*
|
||||||
|
* @requestField outputName | String | Output name
|
||||||
|
*
|
||||||
|
* @responseField outputActive | Boolean | Whether the output is active
|
||||||
|
*
|
||||||
|
* @requestType ToggleOutput
|
||||||
|
* @complexity 4
|
||||||
|
* @rpcVersion -1
|
||||||
|
* @initialVersion 5.0.0
|
||||||
|
* @api requests
|
||||||
|
* @category outputs
|
||||||
|
*/
|
||||||
|
RequestResult RequestHandler::ToggleOutput(const Request &request)
|
||||||
|
{
|
||||||
|
RequestStatus::RequestStatus statusCode;
|
||||||
|
std::string comment;
|
||||||
|
OBSOutputAutoRelease output = request.ValidateOutput("outputName", statusCode, comment);
|
||||||
|
if (!output)
|
||||||
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
|
bool outputActive = obs_output_active(output);
|
||||||
|
if (outputActive)
|
||||||
|
obs_output_stop(output);
|
||||||
|
else
|
||||||
|
obs_output_start(output);
|
||||||
|
|
||||||
|
json responseData;
|
||||||
|
responseData["outputActive"] = !outputActive;
|
||||||
|
return RequestResult::Success(responseData);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Starts an output.
|
||||||
|
*
|
||||||
|
* @requestField outputName | String | Output name
|
||||||
|
*
|
||||||
|
* @requestType StartOutput
|
||||||
|
* @complexity 4
|
||||||
|
* @rpcVersion -1
|
||||||
|
* @initialVersion 5.0.0
|
||||||
|
* @api requests
|
||||||
|
* @category outputs
|
||||||
|
*/
|
||||||
|
RequestResult RequestHandler::StartOutput(const Request &request)
|
||||||
|
{
|
||||||
|
RequestStatus::RequestStatus statusCode;
|
||||||
|
std::string comment;
|
||||||
|
OBSOutputAutoRelease output = request.ValidateOutput("outputName", statusCode, comment);
|
||||||
|
if (!output)
|
||||||
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
|
if (obs_output_active(output))
|
||||||
|
return RequestResult::Error(RequestStatus::OutputRunning);
|
||||||
|
|
||||||
|
obs_output_start(output);
|
||||||
|
|
||||||
|
return RequestResult::Success();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Stops an output.
|
||||||
|
*
|
||||||
|
* @requestField outputName | String | Output name
|
||||||
|
*
|
||||||
|
* @requestType StopOutput
|
||||||
|
* @complexity 4
|
||||||
|
* @rpcVersion -1
|
||||||
|
* @initialVersion 5.0.0
|
||||||
|
* @api requests
|
||||||
|
* @category outputs
|
||||||
|
*/
|
||||||
|
RequestResult RequestHandler::StopOutput(const Request &request)
|
||||||
|
{
|
||||||
|
RequestStatus::RequestStatus statusCode;
|
||||||
|
std::string comment;
|
||||||
|
OBSOutputAutoRelease output = request.ValidateOutput("outputName", statusCode, comment);
|
||||||
|
if (!output)
|
||||||
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
|
if (!obs_output_active(output))
|
||||||
|
return RequestResult::Error(RequestStatus::OutputNotRunning);
|
||||||
|
|
||||||
|
obs_output_stop(output);
|
||||||
|
|
||||||
|
return RequestResult::Success();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the settings of an output.
|
||||||
|
*
|
||||||
|
* @requestField outputName | String | Output name
|
||||||
|
*
|
||||||
|
* @responseField outputSettings | Object | Output settings
|
||||||
|
*
|
||||||
|
* @requestType GetOutputSettings
|
||||||
|
* @complexity 4
|
||||||
|
* @rpcVersion -1
|
||||||
|
* @initialVersion 5.0.0
|
||||||
|
* @api requests
|
||||||
|
* @category outputs
|
||||||
|
*/
|
||||||
|
RequestResult RequestHandler::GetOutputSettings(const Request &request)
|
||||||
|
{
|
||||||
|
RequestStatus::RequestStatus statusCode;
|
||||||
|
std::string comment;
|
||||||
|
OBSOutputAutoRelease output = request.ValidateOutput("outputName", statusCode, comment);
|
||||||
|
if (!output)
|
||||||
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
|
OBSDataAutoRelease outputSettings = obs_output_get_settings(output);
|
||||||
|
|
||||||
|
json responseData;
|
||||||
|
responseData["outputSettings"] = Utils::Json::ObsDataToJson(outputSettings);
|
||||||
|
return RequestResult::Success(responseData);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the settings of an output.
|
||||||
|
*
|
||||||
|
* @requestField outputName | String | Output name
|
||||||
|
* @requestField outputSettings | Object | Output settings
|
||||||
|
*
|
||||||
|
* @requestType SetOutputSettings
|
||||||
|
* @complexity 4
|
||||||
|
* @rpcVersion -1
|
||||||
|
* @initialVersion 5.0.0
|
||||||
|
* @api requests
|
||||||
|
* @category outputs
|
||||||
|
*/
|
||||||
|
RequestResult RequestHandler::SetOutputSettings(const Request &request)
|
||||||
|
{
|
||||||
|
RequestStatus::RequestStatus statusCode;
|
||||||
|
std::string comment;
|
||||||
|
OBSOutputAutoRelease output = request.ValidateOutput("outputName", statusCode, comment);
|
||||||
|
if (!(output && request.ValidateObject("outputSettings", statusCode, comment, true)))
|
||||||
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
|
OBSDataAutoRelease newSettings = Utils::Json::JsonToObsData(request.RequestData["outputSettings"]);
|
||||||
|
if (!newSettings)
|
||||||
|
// This should never happen
|
||||||
|
return RequestResult::Error(RequestStatus::RequestProcessingFailed,
|
||||||
|
"An internal data conversion operation failed. Please report this!");
|
||||||
|
|
||||||
|
obs_output_update(output, newSettings);
|
||||||
|
|
||||||
|
return RequestResult::Success();
|
||||||
|
}
|
||||||
|
@ -99,6 +99,8 @@ RequestResult RequestHandler::StartRecord(const Request&)
|
|||||||
/**
|
/**
|
||||||
* Stops the record output.
|
* Stops the record output.
|
||||||
*
|
*
|
||||||
|
* @responseField outputPath | String | File name for the saved recording
|
||||||
|
*
|
||||||
* @requestType StopRecord
|
* @requestType StopRecord
|
||||||
* @complexity 1
|
* @complexity 1
|
||||||
* @rpcVersion -1
|
* @rpcVersion -1
|
||||||
@ -114,7 +116,10 @@ RequestResult RequestHandler::StopRecord(const Request&)
|
|||||||
// TODO: Call signal directly to perform blocking wait
|
// TODO: Call signal directly to perform blocking wait
|
||||||
obs_frontend_recording_stop();
|
obs_frontend_recording_stop();
|
||||||
|
|
||||||
return RequestResult::Success();
|
json responseData;
|
||||||
|
responseData["outputPath"] = Utils::Obs::StringHelper::GetLastRecordFileName();
|
||||||
|
|
||||||
|
return RequestResult::Success(responseData);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -60,7 +60,7 @@ RequestResult RequestHandler::GetSceneItemList(const Request& request)
|
|||||||
*
|
*
|
||||||
* @responseField sceneItems | Array<Object> | Array of scene items in the group
|
* @responseField sceneItems | Array<Object> | Array of scene items in the group
|
||||||
*
|
*
|
||||||
* @requestType GetGroupItemList
|
* @requestType GetGroupSceneItemList
|
||||||
* @complexity 3
|
* @complexity 3
|
||||||
* @rpcVersion -1
|
* @rpcVersion -1
|
||||||
* @initialVersion 5.0.0
|
* @initialVersion 5.0.0
|
||||||
@ -103,7 +103,8 @@ RequestResult RequestHandler::GetSceneItemId(const Request& request)
|
|||||||
{
|
{
|
||||||
RequestStatus::RequestStatus statusCode;
|
RequestStatus::RequestStatus statusCode;
|
||||||
std::string comment;
|
std::string comment;
|
||||||
OBSSceneAutoRelease scene = request.ValidateScene2("sceneName", statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP);
|
OBSSceneAutoRelease scene =
|
||||||
|
request.ValidateScene2("sceneName", statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP);
|
||||||
if (!(scene && request.ValidateString("sourceName", statusCode, comment)))
|
if (!(scene && request.ValidateString("sourceName", statusCode, comment)))
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
@ -118,7 +119,8 @@ RequestResult RequestHandler::GetSceneItemId(const Request& request)
|
|||||||
|
|
||||||
OBSSceneItemAutoRelease item = Utils::Obs::SearchHelper::GetSceneItemByName(scene, sourceName, offset);
|
OBSSceneItemAutoRelease item = Utils::Obs::SearchHelper::GetSceneItemByName(scene, sourceName, offset);
|
||||||
if (!item)
|
if (!item)
|
||||||
return RequestResult::Error(RequestStatus::ResourceNotFound, "No scene items were found in the specified scene by that name or offset.");
|
return RequestResult::Error(RequestStatus::ResourceNotFound,
|
||||||
|
"No scene items were found in the specified scene by that name or offset.");
|
||||||
|
|
||||||
json responseData;
|
json responseData;
|
||||||
responseData["sceneItemId"] = obs_sceneitem_get_id(item);
|
responseData["sceneItemId"] = obs_sceneitem_get_id(item);
|
||||||
@ -242,7 +244,8 @@ RequestResult RequestHandler::DuplicateSceneItem(const Request& request)
|
|||||||
} else {
|
} else {
|
||||||
destinationScene = obs_scene_get_ref(obs_sceneitem_get_scene(sceneItem));
|
destinationScene = obs_scene_get_ref(obs_sceneitem_get_scene(sceneItem));
|
||||||
if (!destinationScene)
|
if (!destinationScene)
|
||||||
return RequestResult::Error(RequestStatus::RequestProcessingFailed, "Internal error: Failed to get ref for scene of scene item.");
|
return RequestResult::Error(RequestStatus::RequestProcessingFailed,
|
||||||
|
"Internal error: Failed to get ref for scene of scene item.");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (obs_sceneitem_is_group(sceneItem) && obs_sceneitem_get_scene(sceneItem) == destinationScene) {
|
if (obs_sceneitem_is_group(sceneItem) && obs_sceneitem_get_scene(sceneItem) == destinationScene) {
|
||||||
@ -259,7 +262,8 @@ RequestResult RequestHandler::DuplicateSceneItem(const Request& request)
|
|||||||
obs_sceneitem_get_crop(sceneItem, &sceneItemCrop);
|
obs_sceneitem_get_crop(sceneItem, &sceneItemCrop);
|
||||||
|
|
||||||
// Create the new item
|
// Create the new item
|
||||||
OBSSceneItemAutoRelease newSceneItem = Utils::Obs::ActionHelper::CreateSceneItem(sceneItemSource, destinationScene, sceneItemEnabled, &sceneItemTransform, &sceneItemCrop);
|
OBSSceneItemAutoRelease newSceneItem = Utils::Obs::ActionHelper::CreateSceneItem(
|
||||||
|
sceneItemSource, destinationScene, sceneItemEnabled, &sceneItemTransform, &sceneItemCrop);
|
||||||
obs_scene_release(destinationScene);
|
obs_scene_release(destinationScene);
|
||||||
if (!newSceneItem)
|
if (!newSceneItem)
|
||||||
return RequestResult::Error(RequestStatus::ResourceCreationFailed, "Failed to create the scene item.");
|
return RequestResult::Error(RequestStatus::ResourceCreationFailed, "Failed to create the scene item.");
|
||||||
@ -291,7 +295,8 @@ RequestResult RequestHandler::GetSceneItemTransform(const Request& request)
|
|||||||
{
|
{
|
||||||
RequestStatus::RequestStatus statusCode;
|
RequestStatus::RequestStatus statusCode;
|
||||||
std::string comment;
|
std::string comment;
|
||||||
OBSSceneItemAutoRelease sceneItem = request.ValidateSceneItem("sceneName", "sceneItemId", statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP);
|
OBSSceneItemAutoRelease sceneItem = request.ValidateSceneItem("sceneName", "sceneItemId", statusCode, comment,
|
||||||
|
OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP);
|
||||||
if (!sceneItem)
|
if (!sceneItem)
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
@ -319,7 +324,8 @@ RequestResult RequestHandler::SetSceneItemTransform(const Request& request)
|
|||||||
{
|
{
|
||||||
RequestStatus::RequestStatus statusCode;
|
RequestStatus::RequestStatus statusCode;
|
||||||
std::string comment;
|
std::string comment;
|
||||||
OBSSceneItemAutoRelease sceneItem = request.ValidateSceneItem("sceneName", "sceneItemId", statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP);
|
OBSSceneItemAutoRelease sceneItem = request.ValidateSceneItem("sceneName", "sceneItemId", statusCode, comment,
|
||||||
|
OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP);
|
||||||
if (!(sceneItem && request.ValidateObject("sceneItemTransform", statusCode, comment)))
|
if (!(sceneItem && request.ValidateObject("sceneItemTransform", statusCode, comment)))
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
@ -363,7 +369,8 @@ RequestResult RequestHandler::SetSceneItemTransform(const Request& request)
|
|||||||
float scaleX = r.RequestData["scaleX"];
|
float scaleX = r.RequestData["scaleX"];
|
||||||
float finalWidth = scaleX * sourceWidth;
|
float finalWidth = scaleX * sourceWidth;
|
||||||
if (!(finalWidth > -90001.0 && finalWidth < 90001.0))
|
if (!(finalWidth > -90001.0 && finalWidth < 90001.0))
|
||||||
return RequestResult::Error(RequestStatus::RequestFieldOutOfRange, "The field scaleX is too small or large for the current source resolution.");
|
return RequestResult::Error(RequestStatus::RequestFieldOutOfRange,
|
||||||
|
"The field `scaleX` is too small or large for the current source resolution.");
|
||||||
sceneItemTransform.scale.x = scaleX;
|
sceneItemTransform.scale.x = scaleX;
|
||||||
transformChanged = true;
|
transformChanged = true;
|
||||||
}
|
}
|
||||||
@ -373,7 +380,8 @@ RequestResult RequestHandler::SetSceneItemTransform(const Request& request)
|
|||||||
float scaleY = r.RequestData["scaleY"];
|
float scaleY = r.RequestData["scaleY"];
|
||||||
float finalHeight = scaleY * sourceHeight;
|
float finalHeight = scaleY * sourceHeight;
|
||||||
if (!(finalHeight > -90001.0 && finalHeight < 90001.0))
|
if (!(finalHeight > -90001.0 && finalHeight < 90001.0))
|
||||||
return RequestResult::Error(RequestStatus::RequestFieldOutOfRange, "The field scaleY is too small or large for the current source resolution.");
|
return RequestResult::Error(RequestStatus::RequestFieldOutOfRange,
|
||||||
|
"The field `scaleY` is too small or large for the current source resolution.");
|
||||||
sceneItemTransform.scale.y = scaleY;
|
sceneItemTransform.scale.y = scaleY;
|
||||||
transformChanged = true;
|
transformChanged = true;
|
||||||
}
|
}
|
||||||
@ -388,10 +396,10 @@ RequestResult RequestHandler::SetSceneItemTransform(const Request& request)
|
|||||||
if (r.Contains("boundsType")) {
|
if (r.Contains("boundsType")) {
|
||||||
if (!r.ValidateOptionalString("boundsType", statusCode, comment))
|
if (!r.ValidateOptionalString("boundsType", statusCode, comment))
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
std::string boundsTypeString = r.RequestData["boundsType"];
|
enum obs_bounds_type boundsType = r.RequestData["boundsType"];
|
||||||
enum obs_bounds_type boundsType = Utils::Obs::EnumHelper::GetSceneItemBoundsType(boundsTypeString);
|
if (boundsType == OBS_BOUNDS_NONE && r.RequestData["boundsType"] != "OBS_BOUNDS_NONE")
|
||||||
if (boundsType == OBS_BOUNDS_NONE && boundsTypeString != "OBS_BOUNDS_NONE")
|
return RequestResult::Error(RequestStatus::InvalidRequestField,
|
||||||
return RequestResult::Error(RequestStatus::InvalidRequestField, "The field boundsType has an invalid value.");
|
"The field `boundsType` has an invalid value.");
|
||||||
sceneItemTransform.bounds_type = boundsType;
|
sceneItemTransform.bounds_type = boundsType;
|
||||||
transformChanged = true;
|
transformChanged = true;
|
||||||
}
|
}
|
||||||
@ -474,7 +482,8 @@ RequestResult RequestHandler::GetSceneItemEnabled(const Request& request)
|
|||||||
{
|
{
|
||||||
RequestStatus::RequestStatus statusCode;
|
RequestStatus::RequestStatus statusCode;
|
||||||
std::string comment;
|
std::string comment;
|
||||||
OBSSceneItemAutoRelease sceneItem = request.ValidateSceneItem("sceneName", "sceneItemId", statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP);
|
OBSSceneItemAutoRelease sceneItem = request.ValidateSceneItem("sceneName", "sceneItemId", statusCode, comment,
|
||||||
|
OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP);
|
||||||
if (!sceneItem)
|
if (!sceneItem)
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
@ -504,7 +513,8 @@ RequestResult RequestHandler::SetSceneItemEnabled(const Request& request)
|
|||||||
{
|
{
|
||||||
RequestStatus::RequestStatus statusCode;
|
RequestStatus::RequestStatus statusCode;
|
||||||
std::string comment;
|
std::string comment;
|
||||||
OBSSceneItemAutoRelease sceneItem = request.ValidateSceneItem("sceneName", "sceneItemId", statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP);
|
OBSSceneItemAutoRelease sceneItem = request.ValidateSceneItem("sceneName", "sceneItemId", statusCode, comment,
|
||||||
|
OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP);
|
||||||
if (!(sceneItem && request.ValidateBoolean("sceneItemEnabled", statusCode, comment)))
|
if (!(sceneItem && request.ValidateBoolean("sceneItemEnabled", statusCode, comment)))
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
@ -536,7 +546,8 @@ RequestResult RequestHandler::GetSceneItemLocked(const Request& request)
|
|||||||
{
|
{
|
||||||
RequestStatus::RequestStatus statusCode;
|
RequestStatus::RequestStatus statusCode;
|
||||||
std::string comment;
|
std::string comment;
|
||||||
OBSSceneItemAutoRelease sceneItem = request.ValidateSceneItem("sceneName", "sceneItemId", statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP);
|
OBSSceneItemAutoRelease sceneItem = request.ValidateSceneItem("sceneName", "sceneItemId", statusCode, comment,
|
||||||
|
OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP);
|
||||||
if (!sceneItem)
|
if (!sceneItem)
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
@ -566,7 +577,8 @@ RequestResult RequestHandler::SetSceneItemLocked(const Request& request)
|
|||||||
{
|
{
|
||||||
RequestStatus::RequestStatus statusCode;
|
RequestStatus::RequestStatus statusCode;
|
||||||
std::string comment;
|
std::string comment;
|
||||||
OBSSceneItemAutoRelease sceneItem = request.ValidateSceneItem("sceneName", "sceneItemId", statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP);
|
OBSSceneItemAutoRelease sceneItem = request.ValidateSceneItem("sceneName", "sceneItemId", statusCode, comment,
|
||||||
|
OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP);
|
||||||
if (!(sceneItem && request.ValidateBoolean("sceneItemLocked", statusCode, comment)))
|
if (!(sceneItem && request.ValidateBoolean("sceneItemLocked", statusCode, comment)))
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
@ -600,7 +612,8 @@ RequestResult RequestHandler::GetSceneItemIndex(const Request& request)
|
|||||||
{
|
{
|
||||||
RequestStatus::RequestStatus statusCode;
|
RequestStatus::RequestStatus statusCode;
|
||||||
std::string comment;
|
std::string comment;
|
||||||
OBSSceneItemAutoRelease sceneItem = request.ValidateSceneItem("sceneName", "sceneItemId", statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP);
|
OBSSceneItemAutoRelease sceneItem = request.ValidateSceneItem("sceneName", "sceneItemId", statusCode, comment,
|
||||||
|
OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP);
|
||||||
if (!sceneItem)
|
if (!sceneItem)
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
@ -630,7 +643,8 @@ RequestResult RequestHandler::SetSceneItemIndex(const Request& request)
|
|||||||
{
|
{
|
||||||
RequestStatus::RequestStatus statusCode;
|
RequestStatus::RequestStatus statusCode;
|
||||||
std::string comment;
|
std::string comment;
|
||||||
OBSSceneItemAutoRelease sceneItem = request.ValidateSceneItem("sceneName", "sceneItemId", statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP);
|
OBSSceneItemAutoRelease sceneItem = request.ValidateSceneItem("sceneName", "sceneItemId", statusCode, comment,
|
||||||
|
OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP);
|
||||||
if (!(sceneItem && request.ValidateNumber("sceneItemIndex", statusCode, comment, 0, 8192)))
|
if (!(sceneItem && request.ValidateNumber("sceneItemIndex", statusCode, comment, 0, 8192)))
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
@ -672,14 +686,15 @@ RequestResult RequestHandler::GetSceneItemBlendMode(const Request& request)
|
|||||||
{
|
{
|
||||||
RequestStatus::RequestStatus statusCode;
|
RequestStatus::RequestStatus statusCode;
|
||||||
std::string comment;
|
std::string comment;
|
||||||
OBSSceneItemAutoRelease sceneItem = request.ValidateSceneItem("sceneName", "sceneItemId", statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP);
|
OBSSceneItemAutoRelease sceneItem = request.ValidateSceneItem("sceneName", "sceneItemId", statusCode, comment,
|
||||||
|
OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP);
|
||||||
if (!sceneItem)
|
if (!sceneItem)
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
auto blendMode = obs_sceneitem_get_blending_mode(sceneItem);
|
auto blendMode = obs_sceneitem_get_blending_mode(sceneItem);
|
||||||
|
|
||||||
json responseData;
|
json responseData;
|
||||||
responseData["sceneItemBlendMode"] = Utils::Obs::StringHelper::GetSceneItemBlendMode(blendMode);
|
responseData["sceneItemBlendMode"] = blendMode;
|
||||||
|
|
||||||
return RequestResult::Success(responseData);
|
return RequestResult::Success(responseData);
|
||||||
}
|
}
|
||||||
@ -704,15 +719,15 @@ RequestResult RequestHandler::SetSceneItemBlendMode(const Request& request)
|
|||||||
{
|
{
|
||||||
RequestStatus::RequestStatus statusCode;
|
RequestStatus::RequestStatus statusCode;
|
||||||
std::string comment;
|
std::string comment;
|
||||||
OBSSceneItemAutoRelease sceneItem = request.ValidateSceneItem("sceneName", "sceneItemId", statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP);
|
OBSSceneItemAutoRelease sceneItem = request.ValidateSceneItem("sceneName", "sceneItemId", statusCode, comment,
|
||||||
|
OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP);
|
||||||
if (!(sceneItem && request.ValidateString("sceneItemBlendMode", statusCode, comment)))
|
if (!(sceneItem && request.ValidateString("sceneItemBlendMode", statusCode, comment)))
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
std::string blendModeString = request.RequestData["sceneItemBlendMode"];
|
enum obs_blending_type blendMode = request.RequestData["sceneItemBlendMode"];
|
||||||
|
if (blendMode == OBS_BLEND_NORMAL && request.RequestData["sceneItemBlendMode"] != "OBS_BLEND_NORMAL")
|
||||||
auto blendMode = Utils::Obs::EnumHelper::GetSceneItemBlendMode(blendModeString);
|
return RequestResult::Error(RequestStatus::InvalidRequestField,
|
||||||
if (blendMode == OBS_BLEND_NORMAL && blendModeString != "OBS_BLEND_NORMAL")
|
"The field sceneItemBlendMode has an invalid value.");
|
||||||
return RequestResult::Error(RequestStatus::InvalidRequestField, "The field sceneItemBlendMode has an invalid value.");
|
|
||||||
|
|
||||||
obs_sceneitem_set_blending_mode(sceneItem, blendMode);
|
obs_sceneitem_set_blending_mode(sceneItem, blendMode);
|
||||||
|
|
||||||
@ -724,7 +739,8 @@ RequestResult RequestHandler::GetSceneItemPrivateSettings(const Request& request
|
|||||||
{
|
{
|
||||||
RequestStatus::RequestStatus statusCode;
|
RequestStatus::RequestStatus statusCode;
|
||||||
std::string comment;
|
std::string comment;
|
||||||
OBSSceneItemAutoRelease sceneItem = request.ValidateSceneItem("sceneName", "sceneItemId", statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP);
|
OBSSceneItemAutoRelease sceneItem = request.ValidateSceneItem("sceneName", "sceneItemId", statusCode, comment,
|
||||||
|
OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP);
|
||||||
if (!sceneItem)
|
if (!sceneItem)
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
@ -741,8 +757,9 @@ RequestResult RequestHandler::SetSceneItemPrivateSettings(const Request& request
|
|||||||
{
|
{
|
||||||
RequestStatus::RequestStatus statusCode;
|
RequestStatus::RequestStatus statusCode;
|
||||||
std::string comment;
|
std::string comment;
|
||||||
OBSSceneItemAutoRelease sceneItem = request.ValidateSceneItem("sceneName", "sceneItemId", statusCode, comment, OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP);
|
OBSSceneItemAutoRelease sceneItem = request.ValidateSceneItem("sceneName", "sceneItemId", statusCode, comment,
|
||||||
if (!sceneItem || !request.ValidateObject("sceneItemSettings", statusCode, comment))
|
OBS_WEBSOCKET_SCENE_FILTER_SCENE_OR_GROUP);
|
||||||
|
if (!sceneItem || !request.ValidateObject("sceneItemSettings", statusCode, comment, true))
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
OBSDataAutoRelease privateSettings = obs_sceneitem_get_private_settings(sceneItem);
|
OBSDataAutoRelease privateSettings = obs_sceneitem_get_private_settings(sceneItem);
|
||||||
|
@ -235,7 +235,8 @@ RequestResult RequestHandler::RemoveScene(const Request& request)
|
|||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
if (Utils::Obs::NumberHelper::GetSceneCount() < 2)
|
if (Utils::Obs::NumberHelper::GetSceneCount() < 2)
|
||||||
return RequestResult::Error(RequestStatus::NotEnoughResources, "You cannot remove the last scene in the collection.");
|
return RequestResult::Error(RequestStatus::NotEnoughResources,
|
||||||
|
"You cannot remove the last scene in the collection.");
|
||||||
|
|
||||||
obs_source_remove(scene);
|
obs_source_remove(scene);
|
||||||
|
|
||||||
@ -267,7 +268,8 @@ RequestResult RequestHandler::SetSceneName(const Request& request)
|
|||||||
|
|
||||||
OBSSourceAutoRelease existingSource = obs_get_source_by_name(newSceneName.c_str());
|
OBSSourceAutoRelease existingSource = obs_get_source_by_name(newSceneName.c_str());
|
||||||
if (existingSource)
|
if (existingSource)
|
||||||
return RequestResult::Error(RequestStatus::ResourceAlreadyExists, "A source already exists by that new scene name.");
|
return RequestResult::Error(RequestStatus::ResourceAlreadyExists,
|
||||||
|
"A source already exists by that new scene name.");
|
||||||
|
|
||||||
obs_source_set_name(scene, newSceneName.c_str());
|
obs_source_set_name(scene, newSceneName.c_str());
|
||||||
|
|
||||||
@ -342,7 +344,8 @@ RequestResult RequestHandler::SetSceneSceneTransitionOverride(const Request& req
|
|||||||
if (hasName && !request.RequestData["transitionName"].is_null()) {
|
if (hasName && !request.RequestData["transitionName"].is_null()) {
|
||||||
if (!request.ValidateOptionalString("transitionName", statusCode, comment))
|
if (!request.ValidateOptionalString("transitionName", statusCode, comment))
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
OBSSourceAutoRelease transition = Utils::Obs::SearchHelper::GetSceneTransitionByName(request.RequestData["transitionName"]);
|
OBSSourceAutoRelease transition =
|
||||||
|
Utils::Obs::SearchHelper::GetSceneTransitionByName(request.RequestData["transitionName"]);
|
||||||
if (!transition)
|
if (!transition)
|
||||||
return RequestResult::Error(RequestStatus::ResourceNotFound, "No scene transition was found by that name.");
|
return RequestResult::Error(RequestStatus::ResourceNotFound, "No scene transition was found by that name.");
|
||||||
}
|
}
|
||||||
@ -354,7 +357,8 @@ RequestResult RequestHandler::SetSceneSceneTransitionOverride(const Request& req
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!hasName && !hasDuration)
|
if (!hasName && !hasDuration)
|
||||||
return RequestResult::Error(RequestStatus::MissingRequestField, "Your request data must include either `transitionName` or `transitionDuration`.");
|
return RequestResult::Error(RequestStatus::MissingRequestField,
|
||||||
|
"Your request data must include either `transitionName` or `transitionDuration`.");
|
||||||
|
|
||||||
if (hasName) {
|
if (hasName) {
|
||||||
if (request.RequestData["transitionName"].is_null()) {
|
if (request.RequestData["transitionName"].is_null()) {
|
||||||
|
@ -180,7 +180,8 @@ RequestResult RequestHandler::GetSourceScreenshot(const Request& request)
|
|||||||
std::string imageFormat = request.RequestData["imageFormat"];
|
std::string imageFormat = request.RequestData["imageFormat"];
|
||||||
|
|
||||||
if (!IsImageFormatValid(imageFormat))
|
if (!IsImageFormatValid(imageFormat))
|
||||||
return RequestResult::Error(RequestStatus::InvalidRequestField, "Your specified image format is invalid or not supported by this system.");
|
return RequestResult::Error(RequestStatus::InvalidRequestField,
|
||||||
|
"Your specified image format is invalid or not supported by this system.");
|
||||||
|
|
||||||
uint32_t requestedWidth{0};
|
uint32_t requestedWidth{0};
|
||||||
uint32_t requestedHeight{0};
|
uint32_t requestedHeight{0};
|
||||||
@ -258,7 +259,8 @@ RequestResult RequestHandler::SaveSourceScreenshot(const Request& request)
|
|||||||
RequestStatus::RequestStatus statusCode;
|
RequestStatus::RequestStatus statusCode;
|
||||||
std::string comment;
|
std::string comment;
|
||||||
OBSSourceAutoRelease source = request.ValidateSource("sourceName", statusCode, comment);
|
OBSSourceAutoRelease source = request.ValidateSource("sourceName", statusCode, comment);
|
||||||
if (!(source && request.ValidateString("imageFormat", statusCode, comment) && request.ValidateString("imageFilePath", statusCode, comment)))
|
if (!(source && request.ValidateString("imageFormat", statusCode, comment) &&
|
||||||
|
request.ValidateString("imageFilePath", statusCode, comment)))
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
if (obs_source_get_type(source) != OBS_SOURCE_TYPE_INPUT && obs_source_get_type(source) != OBS_SOURCE_TYPE_SCENE)
|
if (obs_source_get_type(source) != OBS_SOURCE_TYPE_INPUT && obs_source_get_type(source) != OBS_SOURCE_TYPE_SCENE)
|
||||||
@ -268,7 +270,8 @@ RequestResult RequestHandler::SaveSourceScreenshot(const Request& request)
|
|||||||
std::string imageFilePath = request.RequestData["imageFilePath"];
|
std::string imageFilePath = request.RequestData["imageFilePath"];
|
||||||
|
|
||||||
if (!IsImageFormatValid(imageFormat))
|
if (!IsImageFormatValid(imageFormat))
|
||||||
return RequestResult::Error(RequestStatus::InvalidRequestField, "Your specified image format is invalid or not supported by this system.");
|
return RequestResult::Error(RequestStatus::InvalidRequestField,
|
||||||
|
"Your specified image format is invalid or not supported by this system.");
|
||||||
|
|
||||||
QFileInfo filePathInfo(QString::fromStdString(imageFilePath));
|
QFileInfo filePathInfo(QString::fromStdString(imageFilePath));
|
||||||
if (!filePathInfo.absoluteDir().exists())
|
if (!filePathInfo.absoluteDir().exists())
|
||||||
@ -336,7 +339,7 @@ RequestResult RequestHandler::SetSourcePrivateSettings(const Request& request)
|
|||||||
RequestStatus::RequestStatus statusCode;
|
RequestStatus::RequestStatus statusCode;
|
||||||
std::string comment;
|
std::string comment;
|
||||||
OBSSourceAutoRelease source = request.ValidateSource("sourceName", statusCode, comment);
|
OBSSourceAutoRelease source = request.ValidateSource("sourceName", statusCode, comment);
|
||||||
if (!source || !request.ValidateObject("sourceSettings", statusCode, comment))
|
if (!source || !request.ValidateObject("sourceSettings", statusCode, comment, true))
|
||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
OBSDataAutoRelease privateSettings = obs_source_get_private_settings(source);
|
OBSDataAutoRelease privateSettings = obs_source_get_private_settings(source);
|
||||||
|
@ -26,6 +26,7 @@ with this program. If not, see <https://www.gnu.org/licenses/>
|
|||||||
* @responseField outputReconnecting | Boolean | Whether the output is currently reconnecting
|
* @responseField outputReconnecting | Boolean | Whether the output is currently reconnecting
|
||||||
* @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 outputCongestion | Number | Congestion of the output
|
||||||
* @responseField outputBytes | Number | Number of bytes sent by the output
|
* @responseField outputBytes | Number | Number of bytes sent by the output
|
||||||
* @responseField outputSkippedFrames | Number | Number of frames skipped by the output's process
|
* @responseField outputSkippedFrames | Number | Number of frames skipped by the output's process
|
||||||
* @responseField outputTotalFrames | Number | Total number of frames delivered by the output's process
|
* @responseField outputTotalFrames | Number | Total number of frames delivered by the output's process
|
||||||
@ -48,6 +49,7 @@ RequestResult RequestHandler::GetStreamStatus(const Request&)
|
|||||||
responseData["outputReconnecting"] = obs_output_reconnecting(streamOutput);
|
responseData["outputReconnecting"] = obs_output_reconnecting(streamOutput);
|
||||||
responseData["outputTimecode"] = Utils::Obs::StringHelper::DurationToTimecode(outputDuration);
|
responseData["outputTimecode"] = Utils::Obs::StringHelper::DurationToTimecode(outputDuration);
|
||||||
responseData["outputDuration"] = outputDuration;
|
responseData["outputDuration"] = outputDuration;
|
||||||
|
responseData["outputCongestion"] = obs_output_get_congestion(streamOutput);
|
||||||
responseData["outputBytes"] = (uint64_t)obs_output_get_total_bytes(streamOutput);
|
responseData["outputBytes"] = (uint64_t)obs_output_get_total_bytes(streamOutput);
|
||||||
responseData["outputSkippedFrames"] = obs_output_get_frames_dropped(streamOutput);
|
responseData["outputSkippedFrames"] = obs_output_get_frames_dropped(streamOutput);
|
||||||
responseData["outputTotalFrames"] = obs_output_get_total_frames(streamOutput);
|
responseData["outputTotalFrames"] = obs_output_get_total_frames(streamOutput);
|
||||||
|
@ -95,7 +95,8 @@ RequestResult RequestHandler::GetCurrentSceneTransition(const Request&)
|
|||||||
{
|
{
|
||||||
OBSSourceAutoRelease transition = obs_frontend_get_current_transition();
|
OBSSourceAutoRelease transition = obs_frontend_get_current_transition();
|
||||||
if (!transition)
|
if (!transition)
|
||||||
return RequestResult::Error(RequestStatus::InvalidResourceState, "OBS does not currently have a scene transition set."); // This should not happen!
|
return RequestResult::Error(RequestStatus::InvalidResourceState,
|
||||||
|
"OBS does not currently have a scene transition set."); // This should not happen!
|
||||||
|
|
||||||
json responseData;
|
json responseData;
|
||||||
responseData["transitionName"] = obs_source_get_name(transition);
|
responseData["transitionName"] = obs_source_get_name(transition);
|
||||||
@ -201,10 +202,12 @@ RequestResult RequestHandler::SetCurrentSceneTransitionSettings(const Request& r
|
|||||||
|
|
||||||
OBSSourceAutoRelease transition = obs_frontend_get_current_transition();
|
OBSSourceAutoRelease transition = obs_frontend_get_current_transition();
|
||||||
if (!transition)
|
if (!transition)
|
||||||
return RequestResult::Error(RequestStatus::InvalidResourceState, "OBS does not currently have a scene transition set."); // This should not happen!
|
return RequestResult::Error(RequestStatus::InvalidResourceState,
|
||||||
|
"OBS does not currently have a scene transition set."); // This should not happen!
|
||||||
|
|
||||||
if (!obs_source_configurable(transition))
|
if (!obs_source_configurable(transition))
|
||||||
return RequestResult::Error(RequestStatus::ResourceNotConfigurable, "The current transition does not support custom settings.");
|
return RequestResult::Error(RequestStatus::ResourceNotConfigurable,
|
||||||
|
"The current transition does not support custom settings.");
|
||||||
|
|
||||||
bool overlay = true;
|
bool overlay = true;
|
||||||
if (request.Contains("overlay")) {
|
if (request.Contains("overlay")) {
|
||||||
@ -216,7 +219,8 @@ RequestResult RequestHandler::SetCurrentSceneTransitionSettings(const Request& r
|
|||||||
|
|
||||||
OBSDataAutoRelease newSettings = Utils::Json::JsonToObsData(request.RequestData["transitionSettings"]);
|
OBSDataAutoRelease newSettings = Utils::Json::JsonToObsData(request.RequestData["transitionSettings"]);
|
||||||
if (!newSettings)
|
if (!newSettings)
|
||||||
return RequestResult::Error(RequestStatus::RequestProcessingFailed, "An internal data conversion operation failed. Please report this!");
|
return RequestResult::Error(RequestStatus::RequestProcessingFailed,
|
||||||
|
"An internal data conversion operation failed. Please report this!");
|
||||||
|
|
||||||
if (overlay)
|
if (overlay)
|
||||||
obs_source_update(transition, newSettings);
|
obs_source_update(transition, newSettings);
|
||||||
@ -246,7 +250,8 @@ RequestResult RequestHandler::GetCurrentSceneTransitionCursor(const Request&)
|
|||||||
{
|
{
|
||||||
OBSSourceAutoRelease transition = obs_frontend_get_current_transition();
|
OBSSourceAutoRelease transition = obs_frontend_get_current_transition();
|
||||||
if (!transition)
|
if (!transition)
|
||||||
return RequestResult::Error(RequestStatus::InvalidResourceState, "OBS does not currently have a scene transition set."); // This should not happen!
|
return RequestResult::Error(RequestStatus::InvalidResourceState,
|
||||||
|
"OBS does not currently have a scene transition set."); // This should not happen!
|
||||||
|
|
||||||
json responseData;
|
json responseData;
|
||||||
responseData["transitionCursor"] = obs_transition_get_time(transition);
|
responseData["transitionCursor"] = obs_transition_get_time(transition);
|
||||||
@ -309,7 +314,8 @@ RequestResult RequestHandler::SetTBarPosition(const Request& request)
|
|||||||
|
|
||||||
OBSSourceAutoRelease transition = obs_frontend_get_current_transition();
|
OBSSourceAutoRelease transition = obs_frontend_get_current_transition();
|
||||||
if (!transition)
|
if (!transition)
|
||||||
return RequestResult::Error(RequestStatus::InvalidResourceState, "OBS does not currently have a scene transition set."); // This should not happen!
|
return RequestResult::Error(RequestStatus::InvalidResourceState,
|
||||||
|
"OBS does not currently have a scene transition set."); // This should not happen!
|
||||||
|
|
||||||
float position = request.RequestData["position"];
|
float position = request.RequestData["position"];
|
||||||
|
|
||||||
|
@ -67,10 +67,13 @@ RequestResult RequestHandler::SetStudioModeEnabled(const Request& request)
|
|||||||
// (Bad) Create a boolean then pass it as a reference to the task. Requires `wait` in obs_queue_task() to be true, else undefined behavior
|
// (Bad) Create a boolean then pass it as a reference to the task. Requires `wait` in obs_queue_task() to be true, else undefined behavior
|
||||||
bool studioModeEnabled = request.RequestData["studioModeEnabled"];
|
bool studioModeEnabled = request.RequestData["studioModeEnabled"];
|
||||||
// Queue the task inside of the UI thread to prevent race conditions
|
// Queue the task inside of the UI thread to prevent race conditions
|
||||||
obs_queue_task(OBS_TASK_UI, [](void* param) {
|
obs_queue_task(
|
||||||
|
OBS_TASK_UI,
|
||||||
|
[](void *param) {
|
||||||
auto studioModeEnabled = (bool *)param;
|
auto studioModeEnabled = (bool *)param;
|
||||||
obs_frontend_set_preview_program_mode(*studioModeEnabled);
|
obs_frontend_set_preview_program_mode(*studioModeEnabled);
|
||||||
}, &studioModeEnabled, true);
|
},
|
||||||
|
&studioModeEnabled, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
return RequestResult::Success();
|
return RequestResult::Success();
|
||||||
@ -147,7 +150,8 @@ RequestResult RequestHandler::OpenInputInteractDialog(const Request& request)
|
|||||||
return RequestResult::Error(statusCode, comment);
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
if (!(obs_source_get_output_flags(input) & OBS_SOURCE_INTERACTION))
|
if (!(obs_source_get_output_flags(input) & OBS_SOURCE_INTERACTION))
|
||||||
return RequestResult::Error(RequestStatus::InvalidResourceState, "The specified input does not support interaction.");
|
return RequestResult::Error(RequestStatus::InvalidResourceState,
|
||||||
|
"The specified input does not support interaction.");
|
||||||
|
|
||||||
obs_frontend_open_source_interaction(input);
|
obs_frontend_open_source_interaction(input);
|
||||||
|
|
||||||
@ -171,14 +175,14 @@ RequestResult RequestHandler::GetMonitorList(const Request&)
|
|||||||
json responseData;
|
json responseData;
|
||||||
std::vector<json> monitorsData;
|
std::vector<json> monitorsData;
|
||||||
QList<QScreen *> screensList = QGuiApplication::screens();
|
QList<QScreen *> screensList = QGuiApplication::screens();
|
||||||
for (int screenIndex = 0; screenIndex < screensList.size(); screenIndex++)
|
for (int screenIndex = 0; screenIndex < screensList.size(); screenIndex++) {
|
||||||
{
|
|
||||||
json screenData;
|
json screenData;
|
||||||
QScreen const *screen = screensList[screenIndex];
|
QScreen const *screen = screensList[screenIndex];
|
||||||
std::stringstream nameAndIndex;
|
std::stringstream nameAndIndex;
|
||||||
nameAndIndex << screen->name().toStdString();
|
nameAndIndex << screen->name().toStdString();
|
||||||
nameAndIndex << '(' << screenIndex << ')';
|
nameAndIndex << '(' << screenIndex << ')';
|
||||||
screenData["monitorName"] = nameAndIndex.str();
|
screenData["monitorName"] = nameAndIndex.str();
|
||||||
|
screenData["monitorIndex"] = screenIndex;
|
||||||
const QRect screenGeometry = screen->geometry();
|
const QRect screenGeometry = screen->geometry();
|
||||||
screenData["monitorWidth"] = screenGeometry.width();
|
screenData["monitorWidth"] = screenGeometry.width();
|
||||||
screenData["monitorHeight"] = screenGeometry.height();
|
screenData["monitorHeight"] = screenGeometry.height();
|
||||||
@ -189,3 +193,112 @@ RequestResult RequestHandler::GetMonitorList(const Request&)
|
|||||||
responseData["monitors"] = monitorsData;
|
responseData["monitors"] = monitorsData;
|
||||||
return RequestResult::Success(responseData);
|
return RequestResult::Success(responseData);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Opens a projector for a specific output video mix.
|
||||||
|
*
|
||||||
|
* Mix types:
|
||||||
|
*
|
||||||
|
* - `OBS_WEBSOCKET_VIDEO_MIX_TYPE_PREVIEW`
|
||||||
|
* - `OBS_WEBSOCKET_VIDEO_MIX_TYPE_PROGRAM`
|
||||||
|
* - `OBS_WEBSOCKET_VIDEO_MIX_TYPE_MULTIVIEW`
|
||||||
|
*
|
||||||
|
* Note: This request serves to provide feature parity with 4.x. It is very likely to be changed/deprecated in a future release.
|
||||||
|
*
|
||||||
|
* @requestField videoMixType | String | Type of mix to open
|
||||||
|
* @requestField ?monitorIndex | Number | Monitor index, use `GetMonitorList` to obtain index | None | -1: Opens projector in windowed mode
|
||||||
|
* @requestField ?projectorGeometry | String | Size/Position data for a windowed projector, in Qt Base64 encoded format. Mutually exclusive with `monitorIndex` | N/A
|
||||||
|
*
|
||||||
|
* @requestType OpenVideoMixProjector
|
||||||
|
* @complexity 3
|
||||||
|
* @rpcVersion -1
|
||||||
|
* @initialVersion 5.0.0
|
||||||
|
* @category ui
|
||||||
|
* @api requests
|
||||||
|
*/
|
||||||
|
RequestResult RequestHandler::OpenVideoMixProjector(const Request &request)
|
||||||
|
{
|
||||||
|
RequestStatus::RequestStatus statusCode;
|
||||||
|
std::string comment;
|
||||||
|
if (!request.ValidateString("videoMixType", statusCode, comment))
|
||||||
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
|
std::string videoMixType = request.RequestData["videoMixType"];
|
||||||
|
const char *projectorType;
|
||||||
|
if (videoMixType == "OBS_WEBSOCKET_VIDEO_MIX_TYPE_PREVIEW")
|
||||||
|
projectorType = "Preview";
|
||||||
|
else if (videoMixType == "OBS_WEBSOCKET_VIDEO_MIX_TYPE_PROGRAM")
|
||||||
|
projectorType = "StudioProgram";
|
||||||
|
else if (videoMixType == "OBS_WEBSOCKET_VIDEO_MIX_TYPE_MULTIVIEW")
|
||||||
|
projectorType = "Multiview";
|
||||||
|
else
|
||||||
|
return RequestResult::Error(RequestStatus::InvalidRequestField,
|
||||||
|
"The field `videoMixType` has an invalid enum value.");
|
||||||
|
|
||||||
|
int monitorIndex = -1;
|
||||||
|
if (request.Contains("monitorIndex")) {
|
||||||
|
if (!request.ValidateOptionalNumber("monitorIndex", statusCode, comment, -1, 9))
|
||||||
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
monitorIndex = request.RequestData["monitorIndex"];
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string projectorGeometry;
|
||||||
|
if (request.Contains("projectorGeometry")) {
|
||||||
|
if (!request.ValidateOptionalString("projectorGeometry", statusCode, comment))
|
||||||
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
if (monitorIndex != -1)
|
||||||
|
return RequestResult::Error(RequestStatus::TooManyRequestFields,
|
||||||
|
"`monitorIndex` and `projectorGeometry` are mutually exclusive.");
|
||||||
|
projectorGeometry = request.RequestData["projectorGeometry"];
|
||||||
|
}
|
||||||
|
|
||||||
|
obs_frontend_open_projector(projectorType, monitorIndex, projectorGeometry.c_str(), nullptr);
|
||||||
|
|
||||||
|
return RequestResult::Success();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Opens a projector for a source.
|
||||||
|
*
|
||||||
|
* Note: This request serves to provide feature parity with 4.x. It is very likely to be changed/deprecated in a future release.
|
||||||
|
*
|
||||||
|
* @requestField sourceName | String | Name of the source to open a projector for
|
||||||
|
* @requestField ?monitorIndex | Number | Monitor index, use `GetMonitorList` to obtain index | None | -1: Opens projector in windowed mode
|
||||||
|
* @requestField ?projectorGeometry | String | Size/Position data for a windowed projector, in Qt Base64 encoded format. Mutually exclusive with `monitorIndex` | N/A
|
||||||
|
*
|
||||||
|
* @requestType OpenSourceProjector
|
||||||
|
* @complexity 3
|
||||||
|
* @rpcVersion -1
|
||||||
|
* @initialVersion 5.0.0
|
||||||
|
* @category ui
|
||||||
|
* @api requests
|
||||||
|
*/
|
||||||
|
RequestResult RequestHandler::OpenSourceProjector(const Request &request)
|
||||||
|
{
|
||||||
|
RequestStatus::RequestStatus statusCode;
|
||||||
|
std::string comment;
|
||||||
|
OBSSourceAutoRelease source = request.ValidateSource("sourceName", statusCode, comment);
|
||||||
|
if (!source)
|
||||||
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
|
||||||
|
int monitorIndex = -1;
|
||||||
|
if (request.Contains("monitorIndex")) {
|
||||||
|
if (!request.ValidateOptionalNumber("monitorIndex", statusCode, comment, -1, 9))
|
||||||
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
monitorIndex = request.RequestData["monitorIndex"];
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string projectorGeometry;
|
||||||
|
if (request.Contains("projectorGeometry")) {
|
||||||
|
if (!request.ValidateOptionalString("projectorGeometry", statusCode, comment))
|
||||||
|
return RequestResult::Error(statusCode, comment);
|
||||||
|
if (monitorIndex != -1)
|
||||||
|
return RequestResult::Error(RequestStatus::TooManyRequestFields,
|
||||||
|
"`monitorIndex` and `projectorGeometry` are mutually exclusive.");
|
||||||
|
projectorGeometry = request.RequestData["projectorGeometry"];
|
||||||
|
}
|
||||||
|
|
||||||
|
obs_frontend_open_projector("Source", monitorIndex, projectorGeometry.c_str(), obs_source_get_name(source));
|
||||||
|
|
||||||
|
return RequestResult::Success();
|
||||||
|
}
|
||||||
|
@ -29,8 +29,9 @@ json GetDefaultJsonObject(const json &requestData)
|
|||||||
return requestData;
|
return requestData;
|
||||||
}
|
}
|
||||||
|
|
||||||
Request::Request(const std::string &requestType, const json &requestData, const RequestBatchExecutionType::RequestBatchExecutionType executionType) :
|
Request::Request(const std::string &requestType, const json &requestData,
|
||||||
RequestType(requestType),
|
const RequestBatchExecutionType::RequestBatchExecutionType executionType)
|
||||||
|
: RequestType(requestType),
|
||||||
HasRequestData(requestData.is_object()),
|
HasRequestData(requestData.is_object()),
|
||||||
RequestData(GetDefaultJsonObject(requestData)),
|
RequestData(GetDefaultJsonObject(requestData)),
|
||||||
ExecutionType(executionType)
|
ExecutionType(executionType)
|
||||||
@ -59,7 +60,8 @@ bool Request::ValidateBasic(const std::string &keyName, RequestStatus::RequestSt
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Request::ValidateOptionalNumber(const std::string &keyName, RequestStatus::RequestStatus &statusCode, std::string &comment, const double minValue, const double maxValue) const
|
bool Request::ValidateOptionalNumber(const std::string &keyName, RequestStatus::RequestStatus &statusCode, std::string &comment,
|
||||||
|
const double minValue, const double maxValue) const
|
||||||
{
|
{
|
||||||
if (!RequestData[keyName].is_number()) {
|
if (!RequestData[keyName].is_number()) {
|
||||||
statusCode = RequestStatus::InvalidRequestFieldType;
|
statusCode = RequestStatus::InvalidRequestFieldType;
|
||||||
@ -70,19 +72,22 @@ bool Request::ValidateOptionalNumber(const std::string &keyName, RequestStatus::
|
|||||||
double value = RequestData[keyName];
|
double value = RequestData[keyName];
|
||||||
if (value < minValue) {
|
if (value < minValue) {
|
||||||
statusCode = RequestStatus::RequestFieldOutOfRange;
|
statusCode = RequestStatus::RequestFieldOutOfRange;
|
||||||
comment = std::string("The field value of `") + keyName + "` is below the minimum of `" + std::to_string(minValue) + "`";
|
comment = std::string("The field value of `") + keyName + "` is below the minimum of `" + std::to_string(minValue) +
|
||||||
|
"`";
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (value > maxValue) {
|
if (value > maxValue) {
|
||||||
statusCode = RequestStatus::RequestFieldOutOfRange;
|
statusCode = RequestStatus::RequestFieldOutOfRange;
|
||||||
comment = std::string("The field value of `") + keyName + "` is above the maximum of `" + std::to_string(maxValue) + "`";
|
comment = std::string("The field value of `") + keyName + "` is above the maximum of `" + std::to_string(maxValue) +
|
||||||
|
"`";
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Request::ValidateNumber(const std::string &keyName, RequestStatus::RequestStatus &statusCode, std::string &comment, const double minValue, const double maxValue) const
|
bool Request::ValidateNumber(const std::string &keyName, RequestStatus::RequestStatus &statusCode, std::string &comment,
|
||||||
|
const double minValue, const double maxValue) const
|
||||||
{
|
{
|
||||||
if (!ValidateBasic(keyName, statusCode, comment))
|
if (!ValidateBasic(keyName, statusCode, comment))
|
||||||
return false;
|
return false;
|
||||||
@ -93,7 +98,8 @@ bool Request::ValidateNumber(const std::string &keyName, RequestStatus::RequestS
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Request::ValidateOptionalString(const std::string &keyName, RequestStatus::RequestStatus &statusCode, std::string &comment, const bool allowEmpty) const
|
bool Request::ValidateOptionalString(const std::string &keyName, RequestStatus::RequestStatus &statusCode, std::string &comment,
|
||||||
|
const bool allowEmpty) const
|
||||||
{
|
{
|
||||||
if (!RequestData[keyName].is_string()) {
|
if (!RequestData[keyName].is_string()) {
|
||||||
statusCode = RequestStatus::InvalidRequestFieldType;
|
statusCode = RequestStatus::InvalidRequestFieldType;
|
||||||
@ -110,7 +116,8 @@ bool Request::ValidateOptionalString(const std::string &keyName, RequestStatus::
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Request::ValidateString(const std::string &keyName, RequestStatus::RequestStatus &statusCode, std::string &comment, const bool allowEmpty) const
|
bool Request::ValidateString(const std::string &keyName, RequestStatus::RequestStatus &statusCode, std::string &comment,
|
||||||
|
const bool allowEmpty) const
|
||||||
{
|
{
|
||||||
if (!ValidateBasic(keyName, statusCode, comment))
|
if (!ValidateBasic(keyName, statusCode, comment))
|
||||||
return false;
|
return false;
|
||||||
@ -121,7 +128,8 @@ bool Request::ValidateString(const std::string &keyName, RequestStatus::RequestS
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Request::ValidateOptionalBoolean(const std::string &keyName, RequestStatus::RequestStatus &statusCode, std::string &comment) const
|
bool Request::ValidateOptionalBoolean(const std::string &keyName, RequestStatus::RequestStatus &statusCode,
|
||||||
|
std::string &comment) const
|
||||||
{
|
{
|
||||||
if (!RequestData[keyName].is_boolean()) {
|
if (!RequestData[keyName].is_boolean()) {
|
||||||
statusCode = RequestStatus::InvalidRequestFieldType;
|
statusCode = RequestStatus::InvalidRequestFieldType;
|
||||||
@ -143,7 +151,8 @@ bool Request::ValidateBoolean(const std::string &keyName, RequestStatus::Request
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Request::ValidateOptionalObject(const std::string &keyName, RequestStatus::RequestStatus &statusCode, std::string &comment, const bool allowEmpty) const
|
bool Request::ValidateOptionalObject(const std::string &keyName, RequestStatus::RequestStatus &statusCode, std::string &comment,
|
||||||
|
const bool allowEmpty) const
|
||||||
{
|
{
|
||||||
if (!RequestData[keyName].is_object()) {
|
if (!RequestData[keyName].is_object()) {
|
||||||
statusCode = RequestStatus::InvalidRequestFieldType;
|
statusCode = RequestStatus::InvalidRequestFieldType;
|
||||||
@ -160,7 +169,8 @@ bool Request::ValidateOptionalObject(const std::string &keyName, RequestStatus::
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Request::ValidateObject(const std::string &keyName, RequestStatus::RequestStatus &statusCode, std::string &comment, const bool allowEmpty) const
|
bool Request::ValidateObject(const std::string &keyName, RequestStatus::RequestStatus &statusCode, std::string &comment,
|
||||||
|
const bool allowEmpty) const
|
||||||
{
|
{
|
||||||
if (!ValidateBasic(keyName, statusCode, comment))
|
if (!ValidateBasic(keyName, statusCode, comment))
|
||||||
return false;
|
return false;
|
||||||
@ -171,7 +181,8 @@ bool Request::ValidateObject(const std::string &keyName, RequestStatus::RequestS
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Request::ValidateOptionalArray(const std::string &keyName, RequestStatus::RequestStatus &statusCode, std::string &comment, const bool allowEmpty) const
|
bool Request::ValidateOptionalArray(const std::string &keyName, RequestStatus::RequestStatus &statusCode, std::string &comment,
|
||||||
|
const bool allowEmpty) const
|
||||||
{
|
{
|
||||||
if (!RequestData[keyName].is_array()) {
|
if (!RequestData[keyName].is_array()) {
|
||||||
statusCode = RequestStatus::InvalidRequestFieldType;
|
statusCode = RequestStatus::InvalidRequestFieldType;
|
||||||
@ -188,7 +199,8 @@ bool Request::ValidateOptionalArray(const std::string &keyName, RequestStatus::R
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Request::ValidateArray(const std::string &keyName, RequestStatus::RequestStatus &statusCode, std::string &comment, const bool allowEmpty) const
|
bool Request::ValidateArray(const std::string &keyName, RequestStatus::RequestStatus &statusCode, std::string &comment,
|
||||||
|
const bool allowEmpty) const
|
||||||
{
|
{
|
||||||
if (!ValidateBasic(keyName, statusCode, comment))
|
if (!ValidateBasic(keyName, statusCode, comment))
|
||||||
return false;
|
return false;
|
||||||
@ -199,7 +211,8 @@ bool Request::ValidateArray(const std::string &keyName, RequestStatus::RequestSt
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
obs_source_t *Request::ValidateSource(const std::string &keyName, RequestStatus::RequestStatus &statusCode, std::string &comment) const
|
obs_source_t *Request::ValidateSource(const std::string &keyName, RequestStatus::RequestStatus &statusCode,
|
||||||
|
std::string &comment) const
|
||||||
{
|
{
|
||||||
if (!ValidateString(keyName, statusCode, comment))
|
if (!ValidateString(keyName, statusCode, comment))
|
||||||
return nullptr;
|
return nullptr;
|
||||||
@ -216,7 +229,8 @@ obs_source_t *Request::ValidateSource(const std::string &keyName, RequestStatus:
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
obs_source_t *Request::ValidateScene(const std::string &keyName, RequestStatus::RequestStatus &statusCode, std::string &comment, const ObsWebSocketSceneFilter filter) const
|
obs_source_t *Request::ValidateScene(const std::string &keyName, RequestStatus::RequestStatus &statusCode, std::string &comment,
|
||||||
|
const ObsWebSocketSceneFilter filter) const
|
||||||
{
|
{
|
||||||
obs_source_t *ret = ValidateSource(keyName, statusCode, comment);
|
obs_source_t *ret = ValidateSource(keyName, statusCode, comment);
|
||||||
if (!ret)
|
if (!ret)
|
||||||
@ -245,7 +259,8 @@ obs_source_t *Request::ValidateScene(const std::string &keyName, RequestStatus::
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
obs_scene_t *Request::ValidateScene2(const std::string &keyName, RequestStatus::RequestStatus &statusCode, std::string &comment, const ObsWebSocketSceneFilter filter) const
|
obs_scene_t *Request::ValidateScene2(const std::string &keyName, RequestStatus::RequestStatus &statusCode, std::string &comment,
|
||||||
|
const ObsWebSocketSceneFilter filter) const
|
||||||
{
|
{
|
||||||
OBSSourceAutoRelease sceneSource = ValidateSource(keyName, statusCode, comment);
|
OBSSourceAutoRelease sceneSource = ValidateSource(keyName, statusCode, comment);
|
||||||
if (!sceneSource)
|
if (!sceneSource)
|
||||||
@ -275,7 +290,8 @@ obs_scene_t *Request::ValidateScene2(const std::string &keyName, RequestStatus::
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
obs_source_t *Request::ValidateInput(const std::string &keyName, RequestStatus::RequestStatus &statusCode, std::string &comment) const
|
obs_source_t *Request::ValidateInput(const std::string &keyName, RequestStatus::RequestStatus &statusCode,
|
||||||
|
std::string &comment) const
|
||||||
{
|
{
|
||||||
obs_source_t *ret = ValidateSource(keyName, statusCode, comment);
|
obs_source_t *ret = ValidateSource(keyName, statusCode, comment);
|
||||||
if (!ret)
|
if (!ret)
|
||||||
@ -291,7 +307,8 @@ obs_source_t *Request::ValidateInput(const std::string &keyName, RequestStatus::
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
FilterPair Request::ValidateFilter(const std::string &sourceKeyName, const std::string &filterKeyName, RequestStatus::RequestStatus &statusCode, std::string &comment) const
|
FilterPair Request::ValidateFilter(const std::string &sourceKeyName, const std::string &filterKeyName,
|
||||||
|
RequestStatus::RequestStatus &statusCode, std::string &comment) const
|
||||||
{
|
{
|
||||||
obs_source_t *source = ValidateSource(sourceKeyName, statusCode, comment);
|
obs_source_t *source = ValidateSource(sourceKeyName, statusCode, comment);
|
||||||
if (!source)
|
if (!source)
|
||||||
@ -305,14 +322,17 @@ FilterPair Request::ValidateFilter(const std::string &sourceKeyName, const std::
|
|||||||
obs_source_t *filter = obs_source_get_filter_by_name(source, filterName.c_str());
|
obs_source_t *filter = obs_source_get_filter_by_name(source, filterName.c_str());
|
||||||
if (!filter) {
|
if (!filter) {
|
||||||
statusCode = RequestStatus::ResourceNotFound;
|
statusCode = RequestStatus::ResourceNotFound;
|
||||||
comment = std::string("No filter was found in the source `") + RequestData[sourceKeyName].get<std::string>() + "` with the name `" + filterName + "`.";
|
comment = std::string("No filter was found in the source `") + RequestData[sourceKeyName].get<std::string>() +
|
||||||
|
"` with the name `" + filterName + "`.";
|
||||||
return FilterPair{source, nullptr};
|
return FilterPair{source, nullptr};
|
||||||
}
|
}
|
||||||
|
|
||||||
return FilterPair{source, filter};
|
return FilterPair{source, filter};
|
||||||
}
|
}
|
||||||
|
|
||||||
obs_sceneitem_t *Request::ValidateSceneItem(const std::string &sceneKeyName, const std::string &sceneItemIdKeyName, RequestStatus::RequestStatus &statusCode, std::string &comment, const ObsWebSocketSceneFilter filter) const
|
obs_sceneitem_t *Request::ValidateSceneItem(const std::string &sceneKeyName, const std::string &sceneItemIdKeyName,
|
||||||
|
RequestStatus::RequestStatus &statusCode, std::string &comment,
|
||||||
|
const ObsWebSocketSceneFilter filter) const
|
||||||
{
|
{
|
||||||
OBSSceneAutoRelease scene = ValidateScene2(sceneKeyName, statusCode, comment, filter);
|
OBSSceneAutoRelease scene = ValidateScene2(sceneKeyName, statusCode, comment, filter);
|
||||||
if (!scene)
|
if (!scene)
|
||||||
@ -326,10 +346,29 @@ obs_sceneitem_t *Request::ValidateSceneItem(const std::string &sceneKeyName, con
|
|||||||
OBSSceneItem sceneItem = obs_scene_find_sceneitem_by_id(scene, sceneItemId);
|
OBSSceneItem sceneItem = obs_scene_find_sceneitem_by_id(scene, sceneItemId);
|
||||||
if (!sceneItem) {
|
if (!sceneItem) {
|
||||||
statusCode = RequestStatus::ResourceNotFound;
|
statusCode = RequestStatus::ResourceNotFound;
|
||||||
comment = std::string("No scene items were found in scene `") + RequestData[sceneKeyName].get<std::string>() + "` with the ID `" + std::to_string(sceneItemId) + "`.";
|
comment = std::string("No scene items were found in scene `") + RequestData[sceneKeyName].get<std::string>() +
|
||||||
|
"` with the ID `" + std::to_string(sceneItemId) + "`.";
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
obs_sceneitem_addref(sceneItem);
|
obs_sceneitem_addref(sceneItem);
|
||||||
return sceneItem;
|
return sceneItem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
obs_output_t *Request::ValidateOutput(const std::string &keyName, RequestStatus::RequestStatus &statusCode,
|
||||||
|
std::string &comment) const
|
||||||
|
{
|
||||||
|
if (!ValidateString(keyName, statusCode, comment))
|
||||||
|
return nullptr;
|
||||||
|
|
||||||
|
std::string outputName = RequestData[keyName];
|
||||||
|
|
||||||
|
obs_output_t *ret = obs_get_output_by_name(outputName.c_str());
|
||||||
|
if (!ret) {
|
||||||
|
statusCode = RequestStatus::ResourceNotFound;
|
||||||
|
comment = std::string("No output was found with the name `") + outputName + "`.";
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
@ -35,32 +35,50 @@ struct FilterPair {
|
|||||||
OBSSourceAutoRelease filter;
|
OBSSourceAutoRelease filter;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Request
|
struct Request {
|
||||||
{
|
Request(const std::string &requestType, const json &requestData = nullptr,
|
||||||
Request(const std::string &requestType, const json &requestData = nullptr, const RequestBatchExecutionType::RequestBatchExecutionType executionType = RequestBatchExecutionType::None);
|
const RequestBatchExecutionType::RequestBatchExecutionType executionType = RequestBatchExecutionType::None);
|
||||||
|
|
||||||
// Contains the key and is not null
|
// Contains the key and is not null
|
||||||
bool Contains(const std::string &keyName) const;
|
bool Contains(const std::string &keyName) const;
|
||||||
|
|
||||||
bool ValidateBasic(const std::string &keyName, RequestStatus::RequestStatus &statusCode, std::string &comment) const;
|
bool ValidateBasic(const std::string &keyName, RequestStatus::RequestStatus &statusCode, std::string &comment) const;
|
||||||
bool ValidateOptionalNumber(const std::string &keyName, RequestStatus::RequestStatus &statusCode, std::string &comment, const double minValue = -INFINITY, const double maxValue = INFINITY) const;
|
bool ValidateOptionalNumber(const std::string &keyName, RequestStatus::RequestStatus &statusCode, std::string &comment,
|
||||||
bool ValidateNumber(const std::string &keyName, RequestStatus::RequestStatus &statusCode, std::string &comment, const double minValue = -INFINITY, const double maxValue = INFINITY) const;
|
const double minValue = -INFINITY, const double maxValue = INFINITY) const;
|
||||||
bool ValidateOptionalString(const std::string &keyName, RequestStatus::RequestStatus &statusCode, std::string &comment, const bool allowEmpty = false) const;
|
bool ValidateNumber(const std::string &keyName, RequestStatus::RequestStatus &statusCode, std::string &comment,
|
||||||
bool ValidateString(const std::string &keyName, RequestStatus::RequestStatus &statusCode, std::string &comment, const bool allowEmpty = false) const;
|
const double minValue = -INFINITY, const double maxValue = INFINITY) const;
|
||||||
bool ValidateOptionalBoolean(const std::string &keyName, RequestStatus::RequestStatus &statusCode, std::string &comment) const;
|
bool ValidateOptionalString(const std::string &keyName, RequestStatus::RequestStatus &statusCode, std::string &comment,
|
||||||
|
const bool allowEmpty = false) const;
|
||||||
|
bool ValidateString(const std::string &keyName, RequestStatus::RequestStatus &statusCode, std::string &comment,
|
||||||
|
const bool allowEmpty = false) const;
|
||||||
|
bool ValidateOptionalBoolean(const std::string &keyName, RequestStatus::RequestStatus &statusCode,
|
||||||
|
std::string &comment) const;
|
||||||
bool ValidateBoolean(const std::string &keyName, RequestStatus::RequestStatus &statusCode, std::string &comment) const;
|
bool ValidateBoolean(const std::string &keyName, RequestStatus::RequestStatus &statusCode, std::string &comment) const;
|
||||||
bool ValidateOptionalObject(const std::string &keyName, RequestStatus::RequestStatus &statusCode, std::string &comment, const bool allowEmpty = false) const;
|
bool ValidateOptionalObject(const std::string &keyName, RequestStatus::RequestStatus &statusCode, std::string &comment,
|
||||||
bool ValidateObject(const std::string &keyName, RequestStatus::RequestStatus &statusCode, std::string &comment, const bool allowEmpty = false) const;
|
const bool allowEmpty = false) const;
|
||||||
bool ValidateOptionalArray(const std::string &keyName, RequestStatus::RequestStatus &statusCode, std::string &comment, const bool allowEmpty = false) const;
|
bool ValidateObject(const std::string &keyName, RequestStatus::RequestStatus &statusCode, std::string &comment,
|
||||||
bool ValidateArray(const std::string &keyName, RequestStatus::RequestStatus &statusCode, std::string &comment, const bool allowEmpty = false) const;
|
const bool allowEmpty = false) const;
|
||||||
|
bool ValidateOptionalArray(const std::string &keyName, RequestStatus::RequestStatus &statusCode, std::string &comment,
|
||||||
|
const bool allowEmpty = false) const;
|
||||||
|
bool ValidateArray(const std::string &keyName, RequestStatus::RequestStatus &statusCode, std::string &comment,
|
||||||
|
const bool allowEmpty = false) const;
|
||||||
|
|
||||||
// All return values have incremented refcounts
|
// All return values have incremented refcounts
|
||||||
obs_source_t *ValidateSource(const std::string &keyName, RequestStatus::RequestStatus &statusCode, std::string &comment) const;
|
obs_source_t *ValidateSource(const std::string &keyName, RequestStatus::RequestStatus &statusCode,
|
||||||
obs_source_t *ValidateScene(const std::string &keyName, RequestStatus::RequestStatus &statusCode, std::string &comment, const ObsWebSocketSceneFilter filter = OBS_WEBSOCKET_SCENE_FILTER_SCENE_ONLY) const;
|
std::string &comment) const;
|
||||||
obs_scene_t *ValidateScene2(const std::string &keyName, RequestStatus::RequestStatus &statusCode, std::string &comment, const ObsWebSocketSceneFilter filter = OBS_WEBSOCKET_SCENE_FILTER_SCENE_ONLY) const;
|
obs_source_t *ValidateScene(const std::string &keyName, RequestStatus::RequestStatus &statusCode, std::string &comment,
|
||||||
obs_source_t *ValidateInput(const std::string &keyName, RequestStatus::RequestStatus &statusCode, std::string &comment) const;
|
const ObsWebSocketSceneFilter filter = OBS_WEBSOCKET_SCENE_FILTER_SCENE_ONLY) const;
|
||||||
FilterPair ValidateFilter(const std::string &sourceKeyName, const std::string &filterKeyName, RequestStatus::RequestStatus &statusCode, std::string &comment) const;
|
obs_scene_t *ValidateScene2(const std::string &keyName, RequestStatus::RequestStatus &statusCode, std::string &comment,
|
||||||
obs_sceneitem_t *ValidateSceneItem(const std::string &sceneKeyName, const std::string &sceneItemIdKeyName, RequestStatus::RequestStatus &statusCode, std::string &comment, const ObsWebSocketSceneFilter filter = OBS_WEBSOCKET_SCENE_FILTER_SCENE_ONLY) const;
|
const ObsWebSocketSceneFilter filter = OBS_WEBSOCKET_SCENE_FILTER_SCENE_ONLY) const;
|
||||||
|
obs_source_t *ValidateInput(const std::string &keyName, RequestStatus::RequestStatus &statusCode,
|
||||||
|
std::string &comment) const;
|
||||||
|
FilterPair ValidateFilter(const std::string &sourceKeyName, const std::string &filterKeyName,
|
||||||
|
RequestStatus::RequestStatus &statusCode, std::string &comment) const;
|
||||||
|
obs_sceneitem_t *ValidateSceneItem(const std::string &sceneKeyName, const std::string &sceneItemIdKeyName,
|
||||||
|
RequestStatus::RequestStatus &statusCode, std::string &comment,
|
||||||
|
const ObsWebSocketSceneFilter filter = OBS_WEBSOCKET_SCENE_FILTER_SCENE_ONLY) const;
|
||||||
|
obs_output_t *ValidateOutput(const std::string &keyName, RequestStatus::RequestStatus &statusCode,
|
||||||
|
std::string &comment) const;
|
||||||
|
|
||||||
std::string RequestType;
|
std::string RequestType;
|
||||||
bool HasRequestData;
|
bool HasRequestData;
|
||||||
|
@ -18,9 +18,9 @@ with this program. If not, see <https://www.gnu.org/licenses/>
|
|||||||
|
|
||||||
#include "RequestBatchRequest.h"
|
#include "RequestBatchRequest.h"
|
||||||
|
|
||||||
RequestBatchRequest::RequestBatchRequest(const std::string &requestType, const json &requestData, RequestBatchExecutionType::RequestBatchExecutionType executionType, const json &inputVariables, const json &outputVariables) :
|
RequestBatchRequest::RequestBatchRequest(const std::string &requestType, const json &requestData,
|
||||||
Request(requestType, requestData, executionType),
|
RequestBatchExecutionType::RequestBatchExecutionType executionType,
|
||||||
InputVariables(inputVariables),
|
const json &inputVariables, const json &outputVariables)
|
||||||
OutputVariables(outputVariables)
|
: Request(requestType, requestData, executionType), InputVariables(inputVariables), OutputVariables(outputVariables)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
@ -21,7 +21,9 @@ with this program. If not, see <https://www.gnu.org/licenses/>
|
|||||||
#include "Request.h"
|
#include "Request.h"
|
||||||
|
|
||||||
struct RequestBatchRequest : Request {
|
struct RequestBatchRequest : Request {
|
||||||
RequestBatchRequest(const std::string &requestType, const json &requestData, RequestBatchExecutionType::RequestBatchExecutionType executionType, const json &inputVariables = nullptr, const json &outputVariables = nullptr);
|
RequestBatchRequest(const std::string &requestType, const json &requestData,
|
||||||
|
RequestBatchExecutionType::RequestBatchExecutionType executionType,
|
||||||
|
const json &inputVariables = nullptr, const json &outputVariables = nullptr);
|
||||||
|
|
||||||
json InputVariables;
|
json InputVariables;
|
||||||
json OutputVariables;
|
json OutputVariables;
|
||||||
|
@ -19,11 +19,8 @@ with this program. If not, see <https://www.gnu.org/licenses/>
|
|||||||
|
|
||||||
#include "RequestResult.h"
|
#include "RequestResult.h"
|
||||||
|
|
||||||
RequestResult::RequestResult(RequestStatus::RequestStatus statusCode, json responseData, std::string comment) :
|
RequestResult::RequestResult(RequestStatus::RequestStatus statusCode, json responseData, std::string comment)
|
||||||
StatusCode(statusCode),
|
: StatusCode(statusCode), ResponseData(responseData), Comment(comment), SleepFrames(0)
|
||||||
ResponseData(responseData),
|
|
||||||
Comment(comment),
|
|
||||||
SleepFrames(0)
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -22,9 +22,9 @@ with this program. If not, see <https://www.gnu.org/licenses/>
|
|||||||
#include "../types/RequestStatus.h"
|
#include "../types/RequestStatus.h"
|
||||||
#include "../../utils/Json.h"
|
#include "../../utils/Json.h"
|
||||||
|
|
||||||
struct RequestResult
|
struct RequestResult {
|
||||||
{
|
RequestResult(RequestStatus::RequestStatus statusCode = RequestStatus::Success, json responseData = nullptr,
|
||||||
RequestResult(RequestStatus::RequestStatus statusCode = RequestStatus::Success, json responseData = nullptr, std::string comment = "");
|
std::string comment = "");
|
||||||
static RequestResult Success(json responseData = nullptr);
|
static RequestResult Success(json responseData = nullptr);
|
||||||
static RequestResult Error(RequestStatus::RequestStatus statusCode, std::string comment = "");
|
static RequestResult Error(RequestStatus::RequestStatus statusCode, std::string comment = "");
|
||||||
RequestStatus::RequestStatus StatusCode;
|
RequestStatus::RequestStatus StatusCode;
|
||||||
|
@ -77,8 +77,5 @@ namespace RequestBatchExecutionType {
|
|||||||
Parallel = 2,
|
Parallel = 2,
|
||||||
};
|
};
|
||||||
|
|
||||||
inline bool IsValid(int8_t executionType)
|
inline bool IsValid(int8_t executionType) { return executionType >= None && executionType <= Parallel; }
|
||||||
{
|
|
||||||
return executionType >= None && executionType <= Parallel;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -263,7 +263,6 @@ namespace RequestStatus {
|
|||||||
*/
|
*/
|
||||||
StudioModeNotActive = 506,
|
StudioModeNotActive = 506,
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The resource was not found.
|
* The resource was not found.
|
||||||
*
|
*
|
||||||
|
@ -19,10 +19,7 @@ with this program. If not, see <https://www.gnu.org/licenses/>
|
|||||||
|
|
||||||
#include "Compat.h"
|
#include "Compat.h"
|
||||||
|
|
||||||
Utils::Compat::StdFunctionRunnable::StdFunctionRunnable(std::function<void()> func) :
|
Utils::Compat::StdFunctionRunnable::StdFunctionRunnable(std::function<void()> func) : cb(std::move(func)) {}
|
||||||
cb(std::move(func))
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void Utils::Compat::StdFunctionRunnable::run()
|
void Utils::Compat::StdFunctionRunnable::run()
|
||||||
{
|
{
|
||||||
|
@ -27,6 +27,7 @@ namespace Utils {
|
|||||||
// Reimplement QRunnable for std::function. Retrocompatability for Qt < 5.15
|
// Reimplement QRunnable for std::function. Retrocompatability for Qt < 5.15
|
||||||
class StdFunctionRunnable : public QRunnable {
|
class StdFunctionRunnable : public QRunnable {
|
||||||
std::function<void()> cb;
|
std::function<void()> cb;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
StdFunctionRunnable(std::function<void()> func);
|
StdFunctionRunnable(std::function<void()> func);
|
||||||
void run() override;
|
void run() override;
|
||||||
|
@ -63,10 +63,7 @@ bool Utils::Crypto::CheckAuthenticationString(std::string secret, std::string ch
|
|||||||
secretAndChallenge += QString::fromStdString(challenge);
|
secretAndChallenge += QString::fromStdString(challenge);
|
||||||
|
|
||||||
// Generate a SHA256 hash of secretAndChallenge
|
// Generate a SHA256 hash of secretAndChallenge
|
||||||
auto hash = QCryptographicHash::hash(
|
auto hash = QCryptographicHash::hash(secretAndChallenge.toUtf8(), QCryptographicHash::Algorithm::Sha256);
|
||||||
secretAndChallenge.toUtf8(),
|
|
||||||
QCryptographicHash::Algorithm::Sha256
|
|
||||||
);
|
|
||||||
|
|
||||||
// Encode the SHA256 hash to Base64
|
// Encode the SHA256 hash to Base64
|
||||||
std::string expectedAuthenticationString = hash.toBase64().toStdString();
|
std::string expectedAuthenticationString = hash.toBase64().toStdString();
|
||||||
|
@ -168,8 +168,7 @@ json Utils::Json::ObsDataToJson(obs_data_t *d, bool includeDefault)
|
|||||||
case OBS_DATA_ARRAY:
|
case OBS_DATA_ARRAY:
|
||||||
set_json_array(&j, name, item, includeDefault);
|
set_json_array(&j, name, item, includeDefault);
|
||||||
break;
|
break;
|
||||||
default:
|
default:;
|
||||||
;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user