├── .circleci └── config.yml ├── .clang-format ├── .gitignore ├── CI └── check-format.sh ├── CMakeLists.txt ├── COPYING ├── FindAngelScript.cmake ├── FindBugSplat.cmake ├── FindCEF.cmake ├── README.md ├── appveyor.yml ├── browser-app.cpp ├── browser-app.hpp ├── browser-client.cpp ├── browser-client.hpp ├── browser-config.h.in ├── browser-scheme.cpp ├── browser-scheme.hpp ├── browser-version.h ├── cef-headers.hpp ├── data ├── error.html └── locale │ ├── ar-SA.ini │ ├── az-AZ.ini │ ├── ba-RU.ini │ ├── bg-BG.ini │ ├── bn-BD.ini │ ├── ca-ES.ini │ ├── cs-CZ.ini │ ├── da-DK.ini │ ├── de-DE.ini │ ├── el-GR.ini │ ├── en-GB.ini │ ├── en-US.ini │ ├── eo-UY.ini │ ├── es-ES.ini │ ├── et-EE.ini │ ├── eu-ES.ini │ ├── fa-IR.ini │ ├── fi-FI.ini │ ├── fil-PH.ini │ ├── fr-FR.ini │ ├── gd-GB.ini │ ├── gl-ES.ini │ ├── he-IL.ini │ ├── hi-IN.ini │ ├── hr-HR.ini │ ├── hu-HU.ini │ ├── id-ID.ini │ ├── it-IT.ini │ ├── ja-JP.ini │ ├── ka-GE.ini │ ├── kab-KAB.ini │ ├── kmr-TR.ini │ ├── ko-KR.ini │ ├── lt-LT.ini │ ├── mn-MN.ini │ ├── ms-MY.ini │ ├── nb-NO.ini │ ├── nl-NL.ini │ ├── nn-NO.ini │ ├── oc-FR.ini │ ├── pl-PL.ini │ ├── pt-BR.ini │ ├── pt-PT.ini │ ├── ro-RO.ini │ ├── ru-RU.ini │ ├── si-LK.ini │ ├── sk-SK.ini │ ├── sl-SI.ini │ ├── sr-CS.ini │ ├── sr-SP.ini │ ├── sv-SE.ini │ ├── szl-PL.ini │ ├── ta-IN.ini │ ├── th-TH.ini │ ├── tr-TR.ini │ ├── uk-UA.ini │ ├── vi-VN.ini │ ├── zh-CN.ini │ └── zh-TW.ini ├── deps ├── base64 │ ├── .clang-format │ ├── base64.cpp │ └── base64.hpp ├── json11 │ ├── .clang-format │ ├── LICENSE.txt │ ├── json11.cpp │ └── json11.hpp ├── obs-websocket-api │ ├── .clang-format │ └── obs-websocket-api.h ├── wide-string.cpp └── wide-string.hpp ├── formatcode.sh ├── helper-Info.plist ├── linux-keyboard-helpers.hpp ├── macutil.mm ├── obs-browser-page.manifest ├── obs-browser-page └── obs-browser-page-main.cpp ├── obs-browser-page_autogen ├── include_RelWithDebInfo │ └── EWIEGA46WW │ │ └── moc_browser-app.cpp └── mocs_compilation.cpp ├── obs-browser-plugin.cpp ├── obs-browser-source-audio.cpp ├── obs-browser-source.cpp ├── obs-browser-source.hpp ├── obs-browser-streamelements-restore-script-host_autogen └── mocs_compilation.cpp ├── obs-browser_autogen ├── include_RelWithDebInfo │ ├── 2M4IF6KQHC │ │ ├── moc_browser-panel-internal.cpp │ │ └── moc_browser-panel.cpp │ ├── EWIEGA46WW │ │ └── moc_browser-app.cpp │ └── QIUOOOG5GC │ │ ├── moc_StreamElementsBrowserWidget.cpp │ │ ├── moc_StreamElementsCefClient.cpp │ │ ├── moc_StreamElementsMenuManager.cpp │ │ ├── moc_StreamElementsNativeOBSControlsManager.cpp │ │ ├── moc_StreamElementsNetworkDialog.cpp │ │ ├── moc_StreamElementsPleaseWaitWindow.cpp │ │ ├── moc_StreamElementsProgressDialog.cpp │ │ └── moc_StreamElementsReportIssueDialog.cpp └── mocs_compilation.cpp ├── panel ├── browser-panel-client.cpp ├── browser-panel-client.hpp ├── browser-panel-internal.hpp ├── browser-panel.cpp └── browser-panel.hpp ├── qrc_streamelements.cpp └── streamelements ├── StreamElementsAnalyticsEventsManager.cpp ├── StreamElementsAnalyticsEventsManager.hpp ├── StreamElementsApiMessageHandler.cpp ├── StreamElementsApiMessageHandler.hpp ├── StreamElementsAsyncTaskQueue.cpp ├── StreamElementsAsyncTaskQueue.hpp ├── StreamElementsBackupManager.cpp ├── StreamElementsBackupManager.hpp ├── StreamElementsBandwidthTestClient.cpp ├── StreamElementsBandwidthTestClient.hpp ├── StreamElementsBandwidthTestManager.cpp ├── StreamElementsBandwidthTestManager.hpp ├── StreamElementsBrowserDialog.cpp ├── StreamElementsBrowserDialog.hpp ├── StreamElementsBrowserMessageHandler.hpp ├── StreamElementsBrowserSourceApiMessageHandler.cpp ├── StreamElementsBrowserSourceApiMessageHandler.hpp ├── StreamElementsBrowserWidget.cpp ├── StreamElementsBrowserWidget.hpp ├── StreamElementsBrowserWidgetManager.cpp ├── StreamElementsBrowserWidgetManager.hpp ├── StreamElementsCefClient.cpp ├── StreamElementsCefClient.hpp ├── StreamElementsCleanupManager.cpp ├── StreamElementsCleanupManager.hpp ├── StreamElementsConfig.cpp ├── StreamElementsConfig.hpp ├── StreamElementsControllerServer.cpp ├── StreamElementsControllerServer.hpp ├── StreamElementsCookieManager.cpp ├── StreamElementsCookieManager.hpp ├── StreamElementsCrashHandler.cpp ├── StreamElementsCrashHandler.hpp ├── StreamElementsCrashHandler.mm ├── StreamElementsDeferredExecutive.cpp ├── StreamElementsDeferredExecutive.hpp ├── StreamElementsExternalSceneDataProvider.hpp ├── StreamElementsExternalSceneDataProviderManager.hpp ├── StreamElementsExternalSceneDataProviderSlobsClient.cpp ├── StreamElementsExternalSceneDataProviderSlobsClient.hpp ├── StreamElementsFileSystemMapper.hpp ├── StreamElementsGlobalStateManager.cpp ├── StreamElementsGlobalStateManager.hpp ├── StreamElementsHotkeyManager.cpp ├── StreamElementsHotkeyManager.hpp ├── StreamElementsHttpClient.cpp ├── StreamElementsHttpClient.hpp ├── StreamElementsHttpServerManager.cpp ├── StreamElementsHttpServerManager.hpp ├── StreamElementsLocalWebFilesServer.cpp ├── StreamElementsLocalWebFilesServer.hpp ├── StreamElementsMenuManager.cpp ├── StreamElementsMenuManager.hpp ├── StreamElementsMessageBus.cpp ├── StreamElementsMessageBus.hpp ├── StreamElementsNativeOBSControlsManager.cpp ├── StreamElementsNativeOBSControlsManager.hpp ├── StreamElementsNetworkDialog.cpp ├── StreamElementsNetworkDialog.hpp ├── StreamElementsNetworkDialog.ui ├── StreamElementsObsAppMonitor.cpp ├── StreamElementsObsAppMonitor.hpp ├── StreamElementsObsBandwidthTestClient.cpp ├── StreamElementsObsBandwidthTestClient.hpp ├── StreamElementsObsSceneManager.cpp ├── StreamElementsObsSceneManager.hpp ├── StreamElementsOutputSettingsManager.cpp ├── StreamElementsOutputSettingsManager.hpp ├── StreamElementsPerformanceHistoryTracker.cpp ├── StreamElementsPerformanceHistoryTracker.hpp ├── StreamElementsPleaseWaitWindow.cpp ├── StreamElementsPleaseWaitWindow.hpp ├── StreamElementsPleaseWaitWindow.ui ├── StreamElementsPreviewManager.cpp ├── StreamElementsPreviewManager.hpp ├── StreamElementsProfilesManager.cpp ├── StreamElementsProfilesManager.hpp ├── StreamElementsProgressDialog.cpp ├── StreamElementsProgressDialog.hpp ├── StreamElementsProgressDialog.ui ├── StreamElementsRemoteIconLoader.cpp ├── StreamElementsRemoteIconLoader.hpp ├── StreamElementsReportIssueDialog.cpp ├── StreamElementsReportIssueDialog.hpp ├── StreamElementsReportIssueDialog.ui ├── StreamElementsSceneItemsMonitor.cpp ├── StreamElementsSceneItemsMonitor.hpp ├── StreamElementsScenesListWidgetManager.cpp ├── StreamElementsScenesListWidgetManager.hpp ├── StreamElementsUtils.cpp ├── StreamElementsUtils.hpp ├── StreamElementsUtils.mm ├── StreamElementsWidgetManager.cpp ├── StreamElementsWidgetManager.hpp ├── StreamElementsWorkerManager.cpp ├── StreamElementsWorkerManager.hpp ├── Version.cpp ├── Version.generated.hpp ├── Version.hpp ├── deps ├── StackWalker │ ├── LICENSE │ ├── StackWalker.cpp │ └── StackWalker.h ├── cpp-httplib │ ├── CMakeLists.txt │ ├── LICENSE │ ├── README.md │ ├── cmake │ │ └── FindBrotli.cmake │ ├── example │ │ ├── benchmark.cc │ │ ├── ca-bundle.crt │ │ ├── client.cc │ │ ├── client.vcxproj │ │ ├── example.sln │ │ ├── hello.cc │ │ ├── redirect.cc │ │ ├── server.cc │ │ ├── server.vcxproj │ │ ├── simplecli.cc │ │ ├── simplesvr.cc │ │ └── upload.cc │ ├── httplib.h │ ├── httplibConfig.cmake.in │ ├── split.py │ └── test │ │ ├── Makefile.fuzz_test │ │ ├── ca-bundle.crt │ │ ├── fuzzing │ │ ├── corpus │ │ │ ├── 1 │ │ │ └── 2 │ │ ├── server_fuzzer.cc │ │ ├── server_fuzzer.dict │ │ └── standalone_fuzz_target_runner.cpp │ │ ├── gtest │ │ ├── gtest-all.cc │ │ ├── gtest.h │ │ └── gtest_main.cc │ │ ├── image.jpg │ │ ├── proxy │ │ ├── Dockerfile │ │ ├── basic_passwd │ │ ├── basic_squid.conf │ │ ├── digest_passwd │ │ ├── digest_squid.conf │ │ ├── docker-compose.yml │ │ ├── down.sh │ │ └── up.sh │ │ ├── test.cc │ │ ├── test.conf │ │ ├── test.rootCA.conf │ │ ├── test.sln │ │ ├── test.vcxproj │ │ ├── test_proxy.cc │ │ ├── www │ │ └── dir │ │ │ ├── index.html │ │ │ ├── test.abcde │ │ │ └── test.html │ │ ├── www2 │ │ └── dir │ │ │ ├── index.html │ │ │ └── test.html │ │ └── www3 │ │ └── dir │ │ ├── index.html │ │ └── test.html ├── cpptoml │ └── cpptoml.h ├── moodycamel │ ├── blockingconcurrentqueue.h │ └── concurrentqueue.h ├── picosha2 │ └── picosha2.h ├── server │ ├── HttpServer.cpp │ ├── HttpServer.hpp │ ├── NamedPipesServer.cpp │ ├── NamedPipesServer.hpp │ ├── NamedPipesServerClientHandler.cpp │ └── NamedPipesServerClientHandler.hpp ├── sqlite │ ├── shell.c │ ├── sqlite3.c │ ├── sqlite3.h │ └── sqlite3ext.h ├── utf8.h ├── utf8 │ ├── checked.h │ ├── core.h │ ├── cpp11.h │ ├── cpp17.h │ └── unchecked.h └── zip │ ├── miniz.h │ ├── zip.c │ └── zip.h ├── html ├── error.html └── loading.html ├── images ├── icon.ico ├── icon.png ├── logo.png ├── logo_100x30.png ├── logo_137x30.png └── toolbar │ ├── back.ico │ ├── close.png │ ├── dockToggle.png │ ├── forward.ico │ ├── home.ico │ ├── reload.ico │ └── reload.png ├── mach_exc.h ├── mach_excServer.c ├── mach_excUser.c ├── patch └── qt │ └── qalgorithms.h ├── qt.conf ├── restore-script-host ├── ScriptEngine.cpp ├── ScriptEngine.hpp ├── main.cpp ├── main.hpp ├── main.rc └── streamelements.ico ├── streamelements.qrc └── streamelements.qrc.depends /.circleci/config.yml: -------------------------------------------------------------------------------- 1 | version: 2.1 2 | jobs: 3 | build: 4 | macos: 5 | xcode: 13.1.0 6 | steps: 7 | - checkout 8 | - run: 9 | name: Build 10 | command: | 11 | printf "Building STREAMELEMENTS_PLUGIN_VERSION %s\n" `date +%Y.%m.%d.${CIRCLE_BUILD_NUM}` 12 | 13 | export TERM=xterm-256color 14 | 15 | export CEF_BUILD_VERSION=4638 16 | 17 | rm -rf /usr/local/lib/python3.9/site-packages/six.py 18 | 19 | brew install awscli zip swig 20 | 21 | cd .. 22 | 23 | git clone --recursive https://github.com/obsproject/obs-studio.git 24 | 25 | rm -rf obs-studio/plugins/obs-browser 26 | 27 | mv project obs-studio/plugins/obs-browser 28 | 29 | cd obs-studio 30 | 31 | git checkout 27.2.3 32 | 33 | printf "#define STREAMELEMENTS_PLUGIN_VERSION %s%06dL\n" `date +%Y%m%d` ${CIRCLE_BUILD_NUM} >plugins/obs-browser/streamelements/Version.generated.hpp 34 | 35 | cat plugins/obs-browser/streamelements/Version.generated.hpp 36 | 37 | ./CI/full-build-macos.sh -b 38 | 39 | echo "Branch: ${CIRCLE_BRANCH}" 40 | 41 | if [ ${CIRCLE_BRANCH} = master ]; then 42 | cd build 43 | zip -rv9 obs-browser.zip OBS.app 44 | aws s3 cp "obs-browser.zip" "s3://obs-builds/obs-browser/latest/macos/obs-browser.zip"; 45 | cd .. 46 | aws s3 cp "plugins/obs-browser/streamelements/Version.generated.hpp" "s3://obs-builds/obs-browser/latest/macos/Version.generated.hpp" 47 | else 48 | exit 0; 49 | fi; 50 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | #binaries 2 | *.exe 3 | *.dll 4 | *.dylib 5 | *.so 6 | 7 | #cmake 8 | /cmbuild/ 9 | /build/ 10 | /build32/ 11 | /build64/ 12 | /release/ 13 | /release32/ 14 | /release64/ 15 | /debug/ 16 | /debug32/ 17 | /debug64/ 18 | /builds/ 19 | *.o.d 20 | *.ninja 21 | .ninja* 22 | .dirstamp 23 | 24 | #xcode 25 | *.xcodeproj/ 26 | 27 | #other stuff (windows stuff, qt moc stuff, etc) 28 | Release_MD/ 29 | Release/ 30 | Debug/ 31 | x64/ 32 | ipch/ 33 | GeneratedFiles/ 34 | .moc/ 35 | 36 | /other/ 37 | 38 | #make stuff 39 | configure 40 | depcomp 41 | install-sh 42 | Makefile.in 43 | Makefile 44 | 45 | #random useless file stuff 46 | *.dmg 47 | *.app 48 | .DS_Store 49 | .directory 50 | .hg 51 | .depend 52 | tags 53 | *.trace 54 | *.vsp 55 | *.psess 56 | *.swp 57 | *.dat 58 | *.clbin 59 | *.log 60 | *.tlog 61 | *.sdf 62 | *.opensdf 63 | *.xml 64 | *.ipch 65 | *.css 66 | *.xslt 67 | *.aps 68 | *.suo 69 | *.ncb 70 | *.user 71 | *.lo 72 | *.ilk 73 | *.la 74 | *.o 75 | *.obj 76 | *.pdb 77 | *.res 78 | *.dep 79 | *.zip 80 | *.lnk 81 | *.chm 82 | *~ 83 | .DS_Store 84 | */.DS_Store 85 | */**/.DS_Store 86 | -------------------------------------------------------------------------------- /CI/check-format.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | dirty=$(git ls-files --modified) 3 | 4 | set +x 5 | if [[ $dirty ]]; then 6 | echo "=================================" 7 | echo "Files were not formatted properly" 8 | echo "$dirty" 9 | echo "=================================" 10 | exit 1 11 | fi -------------------------------------------------------------------------------- /FindAngelScript.cmake: -------------------------------------------------------------------------------- 1 | include(FindPackageHandleStandardArgs) 2 | 3 | SET(ANGELSCRIPT_ROOT_DIR "" CACHE PATH "Path to AngelScript SDK") 4 | 5 | if(CMAKE_SIZEOF_VOID_P EQUAL 8) 6 | # 64 bits 7 | message("Looking for angelscript.lib in ${ANGELSCRIPT_ROOT_DIR}/sdk/angelscript/lib/64bit") 8 | find_library(ANGELSCRIPT_LIBRARY 9 | NAMES angelscript.lib "AngelScript" 10 | PATHS ${ANGELSCRIPT_ROOT_DIR}/sdk/angelscript/lib/64bit) 11 | message("ANGELSCRIPT_LIBRARY: ${ANGELSCRIPT_LIBRARY}") 12 | elseif(CMAKE_SIZEOF_VOID_P EQUAL 4) 13 | # 32 bits 14 | message("Looking for angelscript.lib in ${ANGELSCRIPT_ROOT_DIR}/sdk/angelscript/lib/32bit") 15 | find_library(ANGELSCRIPT_LIBRARY 16 | NAMES angelscript.lib "AngelScript" 17 | PATHS ${ANGELSCRIPT_ROOT_DIR}/sdk/angelscript/lib/32bit) 18 | message("ANGELSCRIPT_LIBRARY: ${ANGELSCRIPT_LIBRARY}") 19 | else() 20 | message(WARNING "Could not detect CPU architecture") 21 | set(ANGELSCRIPT_FOUND FALSE) 22 | return() 23 | endif() 24 | 25 | if(NOT ANGELSCRIPT_LIBRARY) 26 | message(WARNING "Could not find the AngelScript library" ) 27 | set(ANGELSCRIPT_FOUND FALSE) 28 | return() 29 | else() 30 | message("ANGELSCRIPT_LIBRARY: ${ANGELSCRIPT_LIBRARY}") 31 | endif() 32 | 33 | set(ANGELSCRIPT_INCLUDE_DIR "${ANGELSCRIPT_ROOT_DIR}/sdk/angelscript/include") 34 | set(ANGELSCRIPT_ADDON_INCLUDE_DIR "${ANGELSCRIPT_ROOT_DIR}/sdk/add_on") 35 | 36 | set(ANGELSCRIPT_LIBRARIES 37 | optimized ${ANGELSCRIPT_LIBRARY}) 38 | 39 | message("ANGELSCRIPT_LIBRARIES: ${ANGELSCRIPT_LIBRARIES}") 40 | 41 | find_package_handle_standard_args(AngelScript DEFAULT_MSG ANGELSCRIPT_LIBRARY ANGELSCRIPT_INCLUDE_DIR) 42 | mark_as_advanced(ANGELSCRIPT_LIBRARY ANGELSCRIPT_LIBRARIES ANGELSCRIPT_INCLUDE_DIR) 43 | -------------------------------------------------------------------------------- /FindBugSplat.cmake: -------------------------------------------------------------------------------- 1 | include(FindPackageHandleStandardArgs) 2 | 3 | SET(BUGSPLAT_ROOT_DIR "" CACHE PATH "Path to BugSplat SDK") 4 | 5 | if(CMAKE_SIZEOF_VOID_P EQUAL 8) 6 | # 64 bits 7 | find_library(BUGSPLAT_LIBRARY 8 | NAMES BugSplat64.lib "BugSplat" 9 | PATHS ${BUGSPLAT_ROOT_DIR} ${BUGSPLAT_ROOT_DIR}/lib64) 10 | 11 | set(BUGSPLAT_BIN_DIR "${BUGSPLAT_ROOT_DIR}/bin64") 12 | set(BUGSPLAT_BIN_FILES 13 | ${BUGSPLAT_BIN_DIR}/BsSndRpt64.exe 14 | ${BUGSPLAT_BIN_DIR}/BugSplat64.dll 15 | ${BUGSPLAT_BIN_DIR}/BugSplat64.pdb 16 | ${BUGSPLAT_BIN_DIR}/BugSplatHD64.exe 17 | ${BUGSPLAT_BIN_DIR}/bugsplathd64.pdb 18 | ${BUGSPLAT_BIN_DIR}/BugSplatRc64.dll 19 | ) 20 | elseif(CMAKE_SIZEOF_VOID_P EQUAL 4) 21 | # 32 bits 22 | set(BUGSPLAT_LIBRARY "${BUGSPLAT_ROOT_DIR}/lib/BugSplat.lib") 23 | 24 | set(BUGSPLAT_BIN_DIR "${BUGSPLAT_ROOT_DIR}/bin") 25 | set(BUGSPLAT_BIN_FILES 26 | ${BUGSPLAT_BIN_DIR}/BsSndRpt.exe 27 | ${BUGSPLAT_BIN_DIR}/BugSplat.dll 28 | ${BUGSPLAT_BIN_DIR}/BugSplat.pdb 29 | ${BUGSPLAT_BIN_DIR}/BugSplatHD.exe 30 | ${BUGSPLAT_BIN_DIR}/bugsplathd.pdb 31 | ${BUGSPLAT_BIN_DIR}/BugSplatRc.dll 32 | ) 33 | else() 34 | message(WARNING "Could not detect CPU architecture") 35 | set(BUGSPLAT_FOUND FALSE) 36 | return() 37 | endif() 38 | 39 | if(NOT BUGSPLAT_LIBRARY) 40 | message(WARNING "Could not find the BugSplat shared library" ) 41 | set(BUGSPLAT_FOUND FALSE) 42 | return() 43 | endif() 44 | 45 | set(BUGSPLAT_INCLUDE_DIR "${BUGSPLAT_ROOT_DIR}/inc") 46 | 47 | set(BUGSPLAT_LIBRARIES 48 | optimized ${BUGSPLAT_LIBRARY}) 49 | 50 | find_package_handle_standard_args(BugSplat DEFAULT_MSG BUGSPLAT_LIBRARY BUGSPLAT_INCLUDE_DIR) 51 | mark_as_advanced(BUGSPLAT_LIBRARY BUGSPLAT_LIBRARIES BUGSPLAT_INCLUDE_DIR) 52 | -------------------------------------------------------------------------------- /browser-config.h.in: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #ifndef ON 4 | #define ON true 5 | #endif 6 | 7 | #ifndef OFF 8 | #define OFF false 9 | #endif 10 | 11 | #ifndef TRUE 12 | #define TRUE true 13 | #endif 14 | 15 | #ifndef FALSE 16 | #define FALSE false 17 | #endif 18 | 19 | #ifdef __APPLE__ 20 | #define CEF_LIBRARY "@CEF_LIBRARY@" 21 | #endif 22 | -------------------------------------------------------------------------------- /browser-scheme.cpp: -------------------------------------------------------------------------------- 1 | /****************************************************************************** 2 | Copyright (C) 2014 by John R. Bradley 3 | Copyright (C) 2018 by Hugh Bailey ("Jim") 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU General Public License as published by 7 | the Free Software Foundation, either version 2 of the License, or 8 | (at your option) any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU General Public License for more details. 14 | 15 | You should have received a copy of the GNU General Public License 16 | along with this program. If not, see . 17 | ******************************************************************************/ 18 | 19 | #include "browser-scheme.hpp" 20 | #include "wide-string.hpp" 21 | #include 22 | 23 | #if !ENABLE_LOCAL_FILE_URL_SCHEME 24 | CefRefPtr 25 | BrowserSchemeHandlerFactory::Create(CefRefPtr browser, 26 | CefRefPtr, const CefString &, 27 | CefRefPtr request) 28 | { 29 | if (!browser || !request) 30 | return nullptr; 31 | 32 | CefURLParts parts; 33 | CefParseURL(request->GetURL(), parts); 34 | 35 | std::string path = CefString(&parts.path); 36 | 37 | path = CefURIDecode(path, true, cef_uri_unescape_rule_t::UU_SPACES); 38 | path = CefURIDecode( 39 | path, true, 40 | cef_uri_unescape_rule_t:: 41 | UU_URL_SPECIAL_CHARS_EXCEPT_PATH_SEPARATORS); 42 | 43 | std::string fileExtension = path.substr(path.find_last_of(".") + 1); 44 | 45 | for (char &ch : fileExtension) 46 | ch = (char)tolower(ch); 47 | if (fileExtension.compare("woff2") == 0) 48 | fileExtension = "woff"; 49 | 50 | #ifdef _WIN32 51 | CefRefPtr stream = 52 | CefStreamReader::CreateForFile(path.substr(1)); 53 | #else 54 | CefRefPtr stream = 55 | CefStreamReader::CreateForFile(path); 56 | #endif 57 | 58 | if (stream) { 59 | return new CefStreamResourceHandler( 60 | CefGetMimeType(fileExtension), stream); 61 | } else { 62 | return nullptr; 63 | } 64 | } 65 | #endif 66 | -------------------------------------------------------------------------------- /browser-scheme.hpp: -------------------------------------------------------------------------------- 1 | /****************************************************************************** 2 | Copyright (C) 2014 by John R. Bradley 3 | Copyright (C) 2018 by Hugh Bailey ("Jim") 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU General Public License as published by 7 | the Free Software Foundation, either version 2 of the License, or 8 | (at your option) any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU General Public License for more details. 14 | 15 | You should have received a copy of the GNU General Public License 16 | along with this program. If not, see . 17 | ******************************************************************************/ 18 | 19 | #pragma once 20 | 21 | #include "cef-headers.hpp" 22 | #include 23 | #include 24 | 25 | #if CHROME_VERSION_BUILD < 4638 26 | #define ENABLE_LOCAL_FILE_URL_SCHEME 1 27 | #else 28 | #define ENABLE_LOCAL_FILE_URL_SCHEME 0 29 | #endif 30 | 31 | #if !ENABLE_LOCAL_FILE_URL_SCHEME 32 | class BrowserSchemeHandlerFactory : public CefSchemeHandlerFactory { 33 | public: 34 | virtual CefRefPtr 35 | Create(CefRefPtr browser, CefRefPtr, 36 | const CefString &, CefRefPtr request) override; 37 | 38 | IMPLEMENT_REFCOUNTING(BrowserSchemeHandlerFactory); 39 | }; 40 | #endif 41 | -------------------------------------------------------------------------------- /browser-version.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #define OBS_BROWSER_VERSION_MAJOR 2 4 | #define OBS_BROWSER_VERSION_MINOR 17 5 | #define OBS_BROWSER_VERSION_PATCH 14 6 | 7 | #ifndef MAKE_SEMANTIC_VERSION 8 | #define MAKE_SEMANTIC_VERSION(major, minor, patch) \ 9 | ((major << 24) | (minor << 16) | patch) 10 | #endif 11 | 12 | #define OBS_BROWSER_VERSION_INT \ 13 | MAKE_SEMANTIC_VERSION(OBS_BROWSER_VERSION_MAJOR, \ 14 | OBS_BROWSER_VERSION_MINOR, \ 15 | OBS_BROWSER_VERSION_PATCH) 16 | 17 | #define OBS_BROWSER_MACRO_STR_(x) #x 18 | #define OBS_BROWSER_MACRO_STR(x) OBS_BROWSER_MACRO_STR_(x) 19 | 20 | #define OBS_BROWSER_VERSION_STRING \ 21 | OBS_BROWSER_MACRO_STR(OBS_BROWSER_VERSION_MAJOR) \ 22 | "." OBS_BROWSER_MACRO_STR(OBS_BROWSER_VERSION_MINOR) "." OBS_BROWSER_MACRO_STR( \ 23 | OBS_BROWSER_VERSION_PATCH) 24 | -------------------------------------------------------------------------------- /cef-headers.hpp: -------------------------------------------------------------------------------- 1 | /****************************************************************************** 2 | Copyright (C) 2014 by John R. Bradley 3 | Copyright (C) 2018 by Hugh Bailey ("Jim") 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU General Public License as published by 7 | the Free Software Foundation, either version 2 of the License, or 8 | (at your option) any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU General Public License for more details. 14 | 15 | You should have received a copy of the GNU General Public License 16 | along with this program. If not, see . 17 | ******************************************************************************/ 18 | 19 | #pragma once 20 | 21 | #ifdef _MSC_VER 22 | #pragma warning(push) 23 | #pragma warning(disable : 4100 4996) 24 | #else 25 | #pragma GCC diagnostic push 26 | #pragma GCC diagnostic ignored "-Wunused-parameter" 27 | #pragma GCC diagnostic ignored "-Wdeprecated-declarations" 28 | #endif 29 | 30 | // Must include before 31 | #include "streamelements/deps/server/HttpServer.hpp" 32 | 33 | #include 34 | #include 35 | #include 36 | #include 37 | #include 38 | #include 39 | #include 40 | #include 41 | #include 42 | #include 43 | #include 44 | #if defined(__APPLE__) && !defined(BROWSER_LEGACY) 45 | #include "include/wrapper/cef_library_loader.h" 46 | #endif 47 | 48 | #if CHROME_VERSION_BUILD >= 4183 49 | #define ENABLE_CREATE_BROWSER_API 1 50 | #else 51 | #define ENABLE_CREATE_BROWSER_API 0 52 | #endif 53 | 54 | #if CHROME_VERSION_BUILD < 3770 55 | #define ENABLE_DECRYPT_COOKIES 1 56 | #else 57 | #define ENABLE_DECRYPT_COOKIES 0 58 | #endif 59 | 60 | #if CHROME_VERSION_BUILD >= 4430 61 | #define ENABLE_WASHIDDEN 1 62 | #else 63 | #define ENABLE_WASHIDDEN 0 64 | #endif 65 | 66 | #define SendBrowserProcessMessage(browser, pid, msg) \ 67 | CefRefPtr mainFrame = browser->GetMainFrame(); \ 68 | if (mainFrame) { \ 69 | mainFrame->SendProcessMessage(pid, msg); \ 70 | } 71 | 72 | #ifdef _MSC_VER 73 | #pragma warning(pop) 74 | #else 75 | #pragma GCC diagnostic pop 76 | #endif 77 | -------------------------------------------------------------------------------- /data/locale/ar-SA.ini: -------------------------------------------------------------------------------- 1 | LocalFile="ملف محلي" 2 | URL="الرابط" 3 | Width="العرض" 4 | Height="الارتفاع" 5 | FPS="عدد الإطارات /ث" 6 | CSS="CSS مخصص" 7 | ShutdownSourceNotVisible="إيقاف تشغيل المصدر عندما لا يكون مرئياً" 8 | RefreshBrowserActive="قم بتحديث المستعرض عندما يصبح المشهد نشطاً" 9 | RefreshNoCache="تحديث ذاكرة التخزين المؤقت للصفحة الحالية" 10 | RestartCEF="أعد تشغيل CEF" 11 | BrowserSource="متصفح" 12 | CustomFrameRate="استخدام معدل إطارات مخصص" 13 | RerouteAudio="التحكم في الصوت عن طريق OBS" 14 | WebpageControlLevel="أُذُونَات الصفحة" 15 | WebpageControlLevel.Level.None="لا يوجد إذن للوصول إلى (OBS)" 16 | WebpageControlLevel.Level.ReadOnly="الوصول لـ(OBS) للقراءة ققط" 17 | WebpageControlLevel.Level.Basic="الوصول الأساسي ل OBS (حفظ مؤقت لإعادة العرض , إلخ..)" 18 | WebpageControlLevel.Level.Advanced="وصول متقدم ل OBS (تغيير المشاهد, تشغيل/إيقاف إعادة العرض المؤقت, إلخ...)" 19 | WebpageControlLevel.Level.All="الوصول الكامل ل OBS (بدء/ايقاف البث المباشر بدون إنذار, إلخ...)" 20 | Error.Title="تعذر تحميل هذه الصفحة!" 21 | Error.Description="تأكد من صحة العنوان ، وأن الموقع لا يواجه مشاكل." 22 | Error.Retry="انقر لإعادة المحاولة" 23 | Error.Code="خطأ: %1" 24 | Error.URL="الرابط: %2" 25 | ErrorCode.ERR_CONNECTION_REFUSED="رفض الخادم الاتصال" 26 | ErrorCode.ERR_NAME_NOT_RESOLVED="لم يتم العثور على عنوان IP للخادم" 27 | ErrorCode.ERR_CONNECTION_TIMED_OUT="انتهت مهلة الاتصال" 28 | ErrorCode.ERR_FILE_NOT_FOUND="لم يتم العثور على الملف" 29 | ErrorCode.ERR_FAILED="فشل في الاتصال" 30 | ErrorCode.ERR_NETWORK_CHANGED="تم تغيير الشبكة" 31 | ErrorCode.ERR_SSL_VERSION_INTERFERENCE="تدخّل إصدار SSL. يمكن حظر أو تعديل TLS 1.3 ." 32 | ErrorCode.ERR_SSL_PROTOCOL_ERROR="خطأ في بروتوكول SSL. لا يمكن إجراء اتصال آمن." 33 | -------------------------------------------------------------------------------- /data/locale/az-AZ.ini: -------------------------------------------------------------------------------- 1 | LocalFile="Yerli fayl" 2 | Width="Eni" 3 | Height="Hündürlüyü" 4 | CSS="Özəl CSS" 5 | ShutdownSourceNotVisible="Görünməyəndə mənbəni söndür" 6 | RefreshBrowserActive="Səhnə aktiv olanda səyyahı təzələ" 7 | RefreshNoCache="Hazırki səhifənin keşini təzələ" 8 | RestartCEF="CEF-i yenidən başlat" 9 | BrowserSource="Səyyah" 10 | CustomFrameRate="Özəl kadr sürəti istifadə et" 11 | RerouteAudio="OBS ilə səsə nəzarət" 12 | -------------------------------------------------------------------------------- /data/locale/ba-RU.ini: -------------------------------------------------------------------------------- 1 | LocalFile="Локаль файл" 2 | Width="Киңлек" 3 | Height="Бейеклек" 4 | BrowserSource="Браузер" 5 | -------------------------------------------------------------------------------- /data/locale/bg-BG.ini: -------------------------------------------------------------------------------- 1 | LocalFile="Локален файл" 2 | URL="URL адрес" 3 | Width="Ширина" 4 | Height="Височина" 5 | FPS="Кдр. в сек." 6 | CSS="Потребителски CSS" 7 | ShutdownSourceNotVisible="Изключване на източника, когато не е видим" 8 | RefreshBrowserActive="Опресняване на браузъра, когато сцената стане активна" 9 | RefreshNoCache="Опресняване на кеша на текущата страница" 10 | RestartCEF="Рестартиране на CEF" 11 | BrowserSource="Браузър" 12 | CustomFrameRate="Използване на настроена кадрова честота" 13 | RerouteAudio="Управление на звука чрез OBS" 14 | WebpageControlLevel="Позволения на страницата" 15 | WebpageControlLevel.Level.None="Няма достъп до OBS" 16 | WebpageControlLevel.Level.ReadOnly="Достъп само за четене до OBS" 17 | Error.Title="Страницата не би могла да се зареди!" 18 | Error.Description="Уверете се в правилността на адреса и че сайтът няма проблеми." 19 | Error.Retry="Щракнете тук за нов опит" 20 | Error.Code="Грешка: %1" 21 | Error.URL="URL адрес: %2" 22 | ErrorCode.ERR_FILE_NOT_FOUND="Файлът не е намерен" 23 | ErrorCode.ERR_FAILED="Неуспех при свързването" 24 | ErrorCode.ERR_NETWORK_CHANGED="Променена мрежа" 25 | ErrorCode.ERR_SSL_PROTOCOL_ERROR="Грешка на протокол SSL. Не би могло да се осъществи сигурно свързване." 26 | -------------------------------------------------------------------------------- /data/locale/bn-BD.ini: -------------------------------------------------------------------------------- 1 | LocalFile="স্থানীয় ফাইল" 2 | URL="ইউআরএল" 3 | Width="প্রস্থ" 4 | Height="উচ্চতা" 5 | FPS="এফপিএস" 6 | CSS="কাস্টম সিএসএস" 7 | ShutdownSourceNotVisible="দৃশ্যমান না হলে সোর্স বন্ধ করুন" 8 | RefreshBrowserActive="দৃশ্য সক্রিয় হয়ে গেলে ব্রাউজারটি রিফ্রেশ করুন" 9 | RefreshNoCache="বর্তমান পৃষ্ঠার ক্যাশে রিফ্রেশ করুন" 10 | RestartCEF="CEF পুনঃরম্ভ" 11 | BrowserSource="ব্রাউজার" 12 | CustomFrameRate="পছন্দসই ফ্রেম হার ব্যবহার করুন" 13 | RerouteAudio="OBS এর মাধ্যমে অডিও নিয়ন্ত্রণ করুন" 14 | WebpageControlLevel="পেজ অনুমতি" 15 | WebpageControlLevel.Level.None="OBS এ কোনো অ্যাক্সেস নেই" 16 | WebpageControlLevel.Level.ReadOnly="OBS তে শুধুমাত্র পঠন অ্যাক্সেস" 17 | WebpageControlLevel.Level.Basic="OBS তে প্রাথমিক অ্যাক্সেস (রিপ্লে বাফার সংরক্ষণ, ইত্যাদি)" 18 | WebpageControlLevel.Level.Advanced="OBS এ উন্নত অ্যাক্সেস (দৃশ্য পরিবর্তন, রিপ্লে বাফার শুরু/বন্ধ, ইত্যাদি)" 19 | WebpageControlLevel.Level.All="OBS এ সম্পূর্ণ অ্যাক্সেস (সতর্কতা ছাড়াই স্ট্রিমিং শুরু/বন্ধ, ইত্যাদি)" 20 | Error.Title="পেজটি লোড করা যায়নি!" 21 | Error.Description="ঠিকানাটি সঠিক কিনা এবং সাইটটিতে কোনও সমস্যা হচ্ছে না তা নিশ্চিত করুন।" 22 | Error.Retry="আবার চেষ্টা করতে এখানে ক্লিক করুন" 23 | Error.Code="ত্রুটি: %1" 24 | Error.URL="ইউআরএল: %2" 25 | ErrorCode.ERR_CONNECTION_REFUSED="সার্ভার সংযোগ প্রত্যাখ্যান করেছে" 26 | ErrorCode.ERR_NAME_NOT_RESOLVED="সার্ভারের আইপি অ্যাড্রেস পাওয়া যায়নি" 27 | ErrorCode.ERR_CONNECTION_TIMED_OUT="সংযোগের সময় শেষ" 28 | ErrorCode.ERR_FILE_NOT_FOUND="ফাইল খুঁজে পাওয়া যায়নি" 29 | ErrorCode.ERR_FAILED="সংযোগ ব্যর্থ হয়েছে" 30 | ErrorCode.ERR_NETWORK_CHANGED="নেটওয়ার্ক পরিবর্তিত হয়েছে" 31 | ErrorCode.ERR_SSL_VERSION_INTERFERENCE="SSL সংস্করণ হস্তক্ষেপ। TLS 1.3 রোধ বা সংশোধন করা হতে পারে।" 32 | ErrorCode.ERR_SSL_PROTOCOL_ERROR="SSL প্রোটোকল ত্রুটি। একটি নিরাপদ সংযোগ করা যায়নি." 33 | -------------------------------------------------------------------------------- /data/locale/ca-ES.ini: -------------------------------------------------------------------------------- 1 | LocalFile="Fitxer local" 2 | Width="Amplada" 3 | Height="Alçada" 4 | CSS="CSS personalizat" 5 | ShutdownSourceNotVisible="Apaga la font quan no sigui visible" 6 | RefreshBrowserActive="Actualitza el navegador en activar-se l'escena" 7 | RefreshNoCache="Actualitza la memòria cau de la pàgina actual" 8 | RestartCEF="Reinicia CEF" 9 | BrowserSource="Navegador" 10 | CustomFrameRate="Utilitza una taxa de fotogrames personalitzada" 11 | RerouteAudio="Control d'àudio mitjançant l'OBS" 12 | WebpageControlLevel="Permisos de la pàgina" 13 | WebpageControlLevel.Level.None="Sense accés a l'OBS" 14 | WebpageControlLevel.Level.ReadOnly="Accés de només lectura a l'OBS" 15 | WebpageControlLevel.Level.Basic="Accés bàsic a l'OBS (desa la memòria intermèdia de reproducció, etc.)" 16 | WebpageControlLevel.Level.Advanced="Accés avançat a l'OBS (canvia d'escenes, inicia/atura la memòria intermèdia de reproducció, etc.)" 17 | WebpageControlLevel.Level.All="Accés complet a l'OBS (inicia/atura la transmissió sense avís, etc.)" 18 | Error.Title="No s'ha pogut carregar la pàgina!" 19 | Error.Description="Assegureu-vos que l'adreça sigui correcta i que el lloc no tingui problemes." 20 | Error.Retry="Feu clic aquí per tornar a provar" 21 | ErrorCode.ERR_CONNECTION_REFUSED="El servidor ha rebutjat la connexió" 22 | ErrorCode.ERR_NAME_NOT_RESOLVED="No s'ha trobat l'adreça IP del servidor" 23 | ErrorCode.ERR_CONNECTION_TIMED_OUT="S'ha esgotat el temps de la connexió" 24 | ErrorCode.ERR_FILE_NOT_FOUND="No s'ha trobat el fitxer" 25 | ErrorCode.ERR_FAILED="Error en connectar" 26 | ErrorCode.ERR_NETWORK_CHANGED="La xarxa ha canviat" 27 | ErrorCode.ERR_SSL_VERSION_INTERFERENCE="Interferència de la versió SSL. És possible que TLS 1.3 estigui blocat o modificat." 28 | ErrorCode.ERR_SSL_PROTOCOL_ERROR="Error de protocol SSL. No s'ha pogut establir una connexió segura." 29 | -------------------------------------------------------------------------------- /data/locale/cs-CZ.ini: -------------------------------------------------------------------------------- 1 | LocalFile="Místní soubor" 2 | URL="Adresa URL" 3 | Width="Šířka" 4 | Height="Výška" 5 | CSS="Vlastní styly" 6 | ShutdownSourceNotVisible="Vypnout zdroj, pokud není vidět" 7 | RefreshBrowserActive="Obnovit stránku při aktivaci scény" 8 | RefreshNoCache="Vyčistit mezipaměť (cache) aktuální stránky" 9 | RestartCEF="Restartovat CEF" 10 | BrowserSource="Prohlížeč" 11 | CustomFrameRate="Použít vlastní snímkovací frekvenci" 12 | RerouteAudio="Ovládat zvuk pomocí OBS" 13 | WebpageControlLevel="Oprávnění stránky" 14 | WebpageControlLevel.Level.None="Žádný přístup k OBS" 15 | WebpageControlLevel.Level.ReadOnly="Pouze přístup pro čtení k OBS" 16 | WebpageControlLevel.Level.Basic="Základní přístup k OBS (Uložit záznam, etc.)" 17 | WebpageControlLevel.Level.Advanced="Pokročilý přístup k OBS (Změnit scény, spustit/zastavit záznam do paměti, etc.)" 18 | WebpageControlLevel.Level.All="Plný přístup k OBS (Začít/Ukončit vysílání bez varování, etc.)" 19 | Error.Title="Stránku se nepodařilo načíst!" 20 | Error.Description="Zkontroluj, zda je adresa správná a cílové stránky nemají potíže." 21 | Error.Retry="Kliknutím zkuste znovu" 22 | Error.Code="Chyba: %1" 23 | Error.URL="Adresa: %2" 24 | ErrorCode.ERR_CONNECTION_REFUSED="Server odmítl připojení" 25 | ErrorCode.ERR_NAME_NOT_RESOLVED="IP adresa serveru nebyla nalezena" 26 | ErrorCode.ERR_CONNECTION_TIMED_OUT="Vypršel čas připojování" 27 | ErrorCode.ERR_FILE_NOT_FOUND="Soubor nenalezen" 28 | ErrorCode.ERR_FAILED="Spojení se nezdařilo" 29 | ErrorCode.ERR_NETWORK_CHANGED="Síť změněna" 30 | ErrorCode.ERR_SSL_VERSION_INTERFERENCE="Ovlivnění SSL verze. TLS 1.3 může být blokována nebo modifikována." 31 | ErrorCode.ERR_SSL_PROTOCOL_ERROR="Chyba protokolu SSL. Nepodařilo se vytvořit bezpečné připojení." 32 | -------------------------------------------------------------------------------- /data/locale/da-DK.ini: -------------------------------------------------------------------------------- 1 | LocalFile="Lokal fil" 2 | Width="Bredde" 3 | Height="Højde" 4 | CSS="Tilpasset CSS" 5 | ShutdownSourceNotVisible="Luk kilden, når den ikke er synlig" 6 | RefreshBrowserActive="Opfrisk browseren, når scenen bliver aktiv" 7 | RefreshNoCache="Opfrisk aktuelle side-cache" 8 | RestartCEF="Genstart CEF" 9 | CustomFrameRate="Benyt tilpasset billedhastighed" 10 | RerouteAudio="Styr lyd via OBS" 11 | WebpageControlLevel="Sidetilladelser" 12 | WebpageControlLevel.Level.None="Ingen adgang til OBS" 13 | WebpageControlLevel.Level.ReadOnly="Skrivebeskyttet adgang til OBS" 14 | WebpageControlLevel.Level.Basic="Basisadgang til OBS (Gem genafspilningsbuffer mv.)" 15 | WebpageControlLevel.Level.Advanced="Avanceret adgang til OBS (Skift scener, Start/Stop genafsp.buffer mv.)" 16 | WebpageControlLevel.Level.All="Fuld adgang til OBS (Start/Stop streaming uden advarsel mv.)" 17 | Error.Title="Siden kunne ikke indlæses!" 18 | Error.Description="Sørg for, at adressen er korrekt, og at webstedet ikke har problemer." 19 | Error.Retry="Klik hér, for at prøve igen" 20 | Error.Code="Fejl: %1" 21 | ErrorCode.ERR_CONNECTION_REFUSED="Server afviste forbindelsen" 22 | ErrorCode.ERR_NAME_NOT_RESOLVED="Server IP-adressen ikke fundet" 23 | ErrorCode.ERR_CONNECTION_TIMED_OUT="Forbindelsen fik timeout." 24 | ErrorCode.ERR_FILE_NOT_FOUND="Fil ikke fundet" 25 | ErrorCode.ERR_FAILED="Mislykkedes at forbinde" 26 | ErrorCode.ERR_NETWORK_CHANGED="Netværk ændret" 27 | ErrorCode.ERR_SSL_VERSION_INTERFERENCE="SSL-versionsinterferens. TLS 1.3 blokeres eller ændres muligvis." 28 | ErrorCode.ERR_SSL_PROTOCOL_ERROR="SSL-protokolfejl. Sikker forbindelse kunne ikke oprettes." 29 | -------------------------------------------------------------------------------- /data/locale/de-DE.ini: -------------------------------------------------------------------------------- 1 | LocalFile="Lokale Datei" 2 | Width="Breite" 3 | Height="Höhe" 4 | CSS="Benutzerdefiniertes CSS" 5 | ShutdownSourceNotVisible="Deaktivieren, wenn Quelle nicht sichtbar" 6 | RefreshBrowserActive="Browser bei Szenenaktivierung aktualisieren" 7 | RefreshNoCache="Cache der aktuellen Seite aktualisieren" 8 | RestartCEF="CEF neu starten" 9 | CustomFrameRate="Benutzerdefinierte FPS verwenden" 10 | RerouteAudio="Audio über OBS steuern" 11 | WebpageControlLevel="Seitenberechtigungen" 12 | WebpageControlLevel.Level.None="Kein Zugriff auf OBS" 13 | WebpageControlLevel.Level.ReadOnly="Lesezugriff auf OBS" 14 | WebpageControlLevel.Level.Basic="Grundlegender Zugriff auf OBS (Wiederholungspuffer speichern, etc.)" 15 | WebpageControlLevel.Level.Advanced="Erweiterter Zugriff auf OBS (Szenen wechseln, Wiederholungspuffer starten/beenden, etc.)" 16 | WebpageControlLevel.Level.All="Voller Zugriff auf OBS (Stream ohne Warnung starten/beenden, etc.)" 17 | Error.Title="Die Seite konnte nicht geladen werden." 18 | Error.Description="Stellen Sie sicher, dass die Adresse korrekt ist und dass die Seite keine Probleme hat." 19 | Error.Retry="Hier klicken, um es erneut zu versuchen" 20 | Error.Code="Fehler: %1" 21 | ErrorCode.ERR_CONNECTION_REFUSED="Server hat die Verbindung abgelehnt" 22 | ErrorCode.ERR_NAME_NOT_RESOLVED="IP-Adresse des Servers nicht gefunden" 23 | ErrorCode.ERR_CONNECTION_TIMED_OUT="Zeitüberschreitung bei Verbindung" 24 | ErrorCode.ERR_FILE_NOT_FOUND="Datei nicht gefunden" 25 | ErrorCode.ERR_FAILED="Verbindung fehlgeschalgen" 26 | ErrorCode.ERR_NETWORK_CHANGED="Netzwerk geändert" 27 | ErrorCode.ERR_SSL_VERSION_INTERFERENCE="SSL-Versionsinterferenz. TLS 1.3 ist möglicherweise blockiert oder verändert." 28 | ErrorCode.ERR_SSL_PROTOCOL_ERROR="SSL-Protokollfehler. Es konnte keine sichere Verbindung hergestellt werden." 29 | -------------------------------------------------------------------------------- /data/locale/el-GR.ini: -------------------------------------------------------------------------------- 1 | LocalFile="Τοπικό αρχείο" 2 | URL="Διεύθυνση URL" 3 | Width="Πλάτος" 4 | Height="Ύψος" 5 | FPS="Καρέ ανά δευτερόλεπτο" 6 | CSS="Προσαρμοσμένο CSS" 7 | ShutdownSourceNotVisible="Τερματισμος λειτουργίας πηγής, όταν δεν είναι ορατή" 8 | RefreshBrowserActive="Ανανέωση του προγράμματος περιήγησης, όταν η σκηνή γίνεται ενεργή" 9 | RefreshNoCache="Ανανέωση της μνήμης cache της τρέχουσας σελίδας" 10 | RestartCEF="Επανεκκίνηση του CEF" 11 | BrowserSource="Πρόγραμμα περιήγησης" 12 | CustomFrameRate="Χρήση προσαρμοσμένου ρυθμού καρέ" 13 | RerouteAudio="Έλεγχος ήχου μέσω OBS" 14 | WebpageControlLevel="Δικαιώματα σελίδας" 15 | WebpageControlLevel.Level.None="Καμία πρόσβαση στο OBS" 16 | WebpageControlLevel.Level.ReadOnly="Πρόσβαση μόνο για ανάγνωση στο OBS" 17 | WebpageControlLevel.Level.Basic="Βασική πρόσβαση στο OBS (Αποθήκευση buffer επανάληψης, κλπ.)" 18 | WebpageControlLevel.Level.Advanced="Προηγμένη πρόσβαση στο OBS (Αλλαγή σκηνών, αποθήκη εκκίνησης/διακοπής buffer επανάληψης, κλπ.)" 19 | WebpageControlLevel.Level.All="Πλήρης πρόσβαση στο OBS (Εκκίνηση/Διακοπή ροής χωρίς προειδοποίηση, κλπ.)" 20 | Error.Title="Δεν ήταν δυνατή η φόρτωση της εικόνας" 21 | Error.Description="Βεβαιωθείτε ότι η διεύθυνση είναι σωστή και ότι ο ιστότοπος δεν έχει προβλήματα." 22 | Error.Retry="Κάντε κλικ εδώ, για να προσπαθήσετε ξανά" 23 | Error.Code="Σφάλμα: %1" 24 | Error.URL="Σύνδεσμος: %2" 25 | ErrorCode.ERR_CONNECTION_REFUSED="Ο διακομιστής αρνήθηκε τη σύνδεση" 26 | ErrorCode.ERR_NAME_NOT_RESOLVED="Η διεύθυνση IP του διακομιστή δεν βρέθηκε" 27 | ErrorCode.ERR_CONNECTION_TIMED_OUT="Λήξη χρονικού ορίου σύνδεσης" 28 | ErrorCode.ERR_FILE_NOT_FOUND="Το αρχείο δε βρέθηκε" 29 | ErrorCode.ERR_FAILED="Η σύνδεση απέτυχε" 30 | ErrorCode.ERR_NETWORK_CHANGED="Το δίκτυο άλλαξε" 31 | ErrorCode.ERR_SSL_VERSION_INTERFERENCE="Πρόβλημα έκδοσης SSL. Το TLS 1.3 μπορεί να αποκλειστεί ή να τροποποιηθεί." 32 | ErrorCode.ERR_SSL_PROTOCOL_ERROR="Σφάλμα πρωτοκόλλου SSL. Δεν ήταν δυνατή η ασφαλής σύνδεση." 33 | -------------------------------------------------------------------------------- /data/locale/en-GB.ini: -------------------------------------------------------------------------------- 1 | LocalFile="Local File" 2 | -------------------------------------------------------------------------------- /data/locale/eo-UY.ini: -------------------------------------------------------------------------------- 1 | Error.Title="Ne eblis ŝargi tiun paĝon!" 2 | Error.Description="Certu ke la adreso ĝustas, kaj ke la reto ne havas problemojn" 3 | Error.Retry="Klaku ĉi tie por reprovi" 4 | Error.Code="Eraro: %1" 5 | ErrorCode.ERR_CONNECTION_REFUSED="Servilo rifuzis la konekton" 6 | ErrorCode.ERR_NAME_NOT_RESOLVED="IP adreso de servilo ne trovita" 7 | ErrorCode.ERR_CONNECTION_TIMED_OUT="Tempolimo de konekto" 8 | ErrorCode.ERR_FILE_NOT_FOUND="Dosiero ne trovita" 9 | ErrorCode.ERR_FAILED="Malsukcesis konekto" 10 | ErrorCode.ERR_NETWORK_CHANGED="Reto sanĝiĝis" 11 | -------------------------------------------------------------------------------- /data/locale/es-ES.ini: -------------------------------------------------------------------------------- 1 | LocalFile="Archivo local" 2 | Width="Ancho" 3 | Height="Alto" 4 | CSS="CSS personalizado" 5 | ShutdownSourceNotVisible="Apagar fuente cuando no sea visible" 6 | RefreshBrowserActive="Actualizar el navegador cuando la escena se active" 7 | RefreshNoCache="Actualizar la caché de la página actual" 8 | RestartCEF="Reiniciar CEF" 9 | BrowserSource="Navegador" 10 | CustomFrameRate="Usar frecuencia de imágenes personalizada" 11 | RerouteAudio="Controlar audio vía OBS" 12 | WebpageControlLevel="Permisos de página" 13 | WebpageControlLevel.Level.None="Sin acceso a OBS" 14 | WebpageControlLevel.Level.ReadOnly="Acceso a OBS de solo lectura" 15 | WebpageControlLevel.Level.Basic="Acceso básico a OBS (Guardar búfer de repetición, etc.)" 16 | WebpageControlLevel.Level.Advanced="Acceso avanzado a OBS (Cambiar escenas, Iniciar/Detener búfer de repetición, etc.)" 17 | WebpageControlLevel.Level.All="Acceso completo a OBS (Inicio/Detener transmisión sin previo aviso, etc.)" 18 | Error.Title="¡No se pudo cargar esa página!" 19 | Error.Description="Asegúrese de que la dirección es correcta, y que la web no está teniendo problemas." 20 | Error.Retry="Haz clic aquí para reintentarlo" 21 | ErrorCode.ERR_CONNECTION_REFUSED="El servidor rechazó la conexión" 22 | ErrorCode.ERR_NAME_NOT_RESOLVED="Dirección IP del servidor no encontrada" 23 | ErrorCode.ERR_CONNECTION_TIMED_OUT="Tiempo de conexión agotado" 24 | ErrorCode.ERR_FILE_NOT_FOUND="Archivo no encontrado" 25 | ErrorCode.ERR_FAILED="Error al conectarse" 26 | ErrorCode.ERR_NETWORK_CHANGED="Se ha cambiado de red" 27 | ErrorCode.ERR_SSL_VERSION_INTERFERENCE="Interferencia de versión SSL. TLS 1.3 tal vez sea bloqueado o modificado." 28 | ErrorCode.ERR_SSL_PROTOCOL_ERROR="Error de protocolo SSL. No se pudo hacer una conexión segura." 29 | -------------------------------------------------------------------------------- /data/locale/et-EE.ini: -------------------------------------------------------------------------------- 1 | LocalFile="Kohalik fail" 2 | Width="Laius" 3 | Height="Kõrgus" 4 | CSS="Kohandatud CSS" 5 | BrowserSource="Brauser" 6 | -------------------------------------------------------------------------------- /data/locale/eu-ES.ini: -------------------------------------------------------------------------------- 1 | LocalFile="Bertako fitxategia" 2 | Width="Zabalera" 3 | Height="Altuera" 4 | CSS="CSS pertsonalizatua" 5 | ShutdownSourceNotVisible="Itzali iturburua ikusgai ez dagoenean" 6 | RefreshBrowserActive="Freskatu nabigatzailea eszena aktibatzen denean" 7 | RefreshNoCache="Freskatu uneko orriaren cachea" 8 | RestartCEF="Berrabiarazi CEF" 9 | BrowserSource="Nabigatzailea" 10 | CustomFrameRate="Erabili fotograma-emari pertsonalizatua" 11 | RerouteAudio="Kontrolatu audioa OBS bidez" 12 | Error.Title="Ezin izan da orri hori kargatu!" 13 | Error.Code="Errorea: %1" 14 | ErrorCode.ERR_FILE_NOT_FOUND="Fitxategia ez da aurkitu" 15 | ErrorCode.ERR_FAILED="Ezin izan da konektatu" 16 | -------------------------------------------------------------------------------- /data/locale/fa-IR.ini: -------------------------------------------------------------------------------- 1 | LocalFile="فایل محلی" 2 | URL="آدرس اینترنتی" 3 | Width="عرض" 4 | Height="ارتفاع" 5 | FPS="فریم در ثانیه (اف پی اس)" 6 | CSS="css سفارشی" 7 | ShutdownSourceNotVisible="خاموش کردن منبع وقتی قابل رویت نیست" 8 | RefreshBrowserActive="تازه کردن مرورگر که صحنه فعال می شود" 9 | RefreshNoCache="تازه کردن حافظه نهان صفحه کنونی" 10 | RestartCEF="راه اندازی مجدد CEF" 11 | BrowserSource="مرورگر" 12 | CustomFrameRate="نرخ فریم های سفارشی استفاده" 13 | RerouteAudio="کنترل صدا از طریق OBS" 14 | WebpageControlLevel="دسترسی های صفحه" 15 | WebpageControlLevel.Level.None="دسترسی به OBS ندارد" 16 | WebpageControlLevel.Level.ReadOnly="دسترسی فقط خواندن به OBS" 17 | WebpageControlLevel.Level.Basic="دسترسی های پایه به OBS (ذخیره ریپلی بافر و...)" 18 | WebpageControlLevel.Level.Advanced="دسترسی‌های پیشرفته به OBS (تغییر صحنه‌ها ، قطع و وصل بافر بازپخش و...)" 19 | WebpageControlLevel.Level.All="دسترسی کامل به OBS (قطع و وصل پخش بدون هشدار و...)" 20 | Error.Title="صفحه بارگیری نشد!" 21 | Error.Description="اطمینان حاصل کنید که آدرس صحیح است و سایت با مشکلی روبرو نیست." 22 | Error.Retry="کلیک برای امتحان دوباره" 23 | Error.Code="خطا: %1" 24 | Error.URL="نشانی: %2" 25 | ErrorCode.ERR_CONNECTION_REFUSED="سرور از اتصال خودداری کرد" 26 | ErrorCode.ERR_NAME_NOT_RESOLVED="آدرس IP سرور یافت نشد" 27 | ErrorCode.ERR_CONNECTION_TIMED_OUT="مهلت اتصال پایان یافت" 28 | ErrorCode.ERR_FILE_NOT_FOUND="فایل پیدا نشد" 29 | ErrorCode.ERR_FAILED="اتصال ناموفق بود" 30 | ErrorCode.ERR_NETWORK_CHANGED="شبکه تغییر کرد" 31 | ErrorCode.ERR_SSL_VERSION_INTERFERENCE="تداخل نگارش SSL. ممکن است TLS 1.3 تغییر یافته یا مسدود شده باشد." 32 | ErrorCode.ERR_SSL_PROTOCOL_ERROR="خطای پروتکل SSL. نتوانستیم یک اتصال امن ایجاد کنیم." 33 | -------------------------------------------------------------------------------- /data/locale/fi-FI.ini: -------------------------------------------------------------------------------- 1 | LocalFile="Paikallinen tiedosto" 2 | Width="Leveys" 3 | Height="Korkeus" 4 | CSS="Mukautettu CSS" 5 | ShutdownSourceNotVisible="Sulje lähde kun se ei ole näkyvissä" 6 | RefreshBrowserActive="Lataa selain uudelleen kun skenestä tulee aktiivinen" 7 | RefreshNoCache="Lataa nykyisen sivun välimuisti uudelleen" 8 | RestartCEF="Uudelleenkäynnistä CEF" 9 | BrowserSource="Selain" 10 | CustomFrameRate="Käytä mukautettua ruudunpäivitystä" 11 | RerouteAudio="Hallitse ääntä OBS:n kautta" 12 | WebpageControlLevel="Sivun käyttöoikeudet" 13 | WebpageControlLevel.Level.None="Ei pääsyä OBS:ään" 14 | WebpageControlLevel.Level.ReadOnly="Vain luku -pääsy OBS:ään" 15 | WebpageControlLevel.Level.Basic="Perustason pääsy OBS:ään (tallenna toistopuskuri jne.)" 16 | WebpageControlLevel.Level.Advanced="Edistynyt pääsy OBS:ään (Vaihda skenejä, käynnistä/pysäytä toistopuskuri jne.)" 17 | WebpageControlLevel.Level.All="Täysi pääsy OBS:ään (Käynnistä/lopeta striimaaminen ilman varoitusta jne.)" 18 | Error.Title="Sivua ei voitu lataa!" 19 | Error.Description="Varmista, että osoite on oikea ja että sivustolla ei ole ongelmia." 20 | Error.Retry="Napsauta tästä yrittääksesi uudelleen" 21 | Error.Code="Virhe: %1" 22 | Error.URL="URL-osoite: %2" 23 | ErrorCode.ERR_CONNECTION_REFUSED="Palvelin hylkäsi yhteyden" 24 | ErrorCode.ERR_NAME_NOT_RESOLVED="Palvelimen IP-osoitetta ei löydy" 25 | ErrorCode.ERR_CONNECTION_TIMED_OUT="Yhteys aikakatkaistiin" 26 | ErrorCode.ERR_FILE_NOT_FOUND="Tiedostoa ei löydy" 27 | ErrorCode.ERR_FAILED="Yhdistäminen epäonnistui" 28 | ErrorCode.ERR_NETWORK_CHANGED="Verkko vaihtui" 29 | ErrorCode.ERR_SSL_PROTOCOL_ERROR="SSL-protokollavirhe. Suojattua yhteyttä ei voitu muodostaa." 30 | -------------------------------------------------------------------------------- /data/locale/fil-PH.ini: -------------------------------------------------------------------------------- 1 | LocalFile="Lokal na payl" 2 | Width="Ang Lapad" 3 | Height="Ang Taas" 4 | CSS="Sinadya sa CSS" 5 | ShutdownSourceNotVisible="Patayin ang pinagmulan kapag hindi nakikita" 6 | RefreshBrowserActive="Sariwain ang browser kapag naging aktibo ang eksena" 7 | RefreshNoCache="Sariwain ang cache ng tinututukang pahina" 8 | RestartCEF="I-restart ang CEF" 9 | CustomFrameRate="Gamitin ang pasadyang frame rate" 10 | RerouteAudio="I-kontrol ang dami gamit ang OBS" 11 | WebpageControlLevel="Mga permiso sa pahina" 12 | WebpageControlLevel.Level.None="Walang access sa OBS" 13 | WebpageControlLevel.Level.ReadOnly="Pagbabasa-lang na pag-access sa OBS" 14 | WebpageControlLevel.Level.All="Buong pag-access sa OBS (Magsimula/Tumigil sa pag-stream ng walang babala, atbp.)" 15 | Error.Title="Hindi ma-load ang pahina!" 16 | Error.Retry="Pumindot dito para subukan muli" 17 | Error.Code="Kamalian: %1" 18 | ErrorCode.ERR_CONNECTION_REFUSED="Hindi tinanggap ng server ang koneksyon" 19 | ErrorCode.ERR_NAME_NOT_RESOLVED="Hindi matagpuan ang IP address ng server" 20 | ErrorCode.ERR_CONNECTION_TIMED_OUT="Umantala ang koneksyon" 21 | ErrorCode.ERR_FILE_NOT_FOUND="Hindi natagpuan ang file" 22 | ErrorCode.ERR_FAILED="Bigong kumunekta" 23 | ErrorCode.ERR_NETWORK_CHANGED="Naiba ang network" 24 | -------------------------------------------------------------------------------- /data/locale/fr-FR.ini: -------------------------------------------------------------------------------- 1 | LocalFile="Fichier local" 2 | Width="Largeur" 3 | Height="Hauteur" 4 | FPS="Images par seconde" 5 | CSS="CSS personnalisé" 6 | ShutdownSourceNotVisible="Désactiver la source quand elle n'est pas visible" 7 | RefreshBrowserActive="Rafraîchir le navigateur lorsque la scène devient active" 8 | RefreshNoCache="Rafraîchir le cache de cette page" 9 | RestartCEF="Redémarrer CEF" 10 | BrowserSource="Navigateur" 11 | CustomFrameRate="Utiliser un débit d'images personnalisé" 12 | RerouteAudio="Contrôler l'audio via OBS" 13 | WebpageControlLevel="Permissions de la page" 14 | WebpageControlLevel.Level.None="Aucun accès à OBS" 15 | WebpageControlLevel.Level.ReadOnly="Accès en lecture seule à OBS" 16 | WebpageControlLevel.Level.Basic="Accès basique à OBS (enregistrer le tampon de relecture, etc.)" 17 | WebpageControlLevel.Level.Advanced="Accès avancé à OBS (Changement de scène, Démarrer/Arrêter le tampon de relecture, etc.)" 18 | WebpageControlLevel.Level.All="Accès complet à OBS (Démarrer/Arrêter le stream sans avertissement, etc.)" 19 | Error.Title="Impossible de charger cette page !" 20 | Error.Description="Veuillez vérifier que l'adresse est correcte et que le site n'a pas de problèmes." 21 | Error.Retry="Cliquer ici pour réessayer" 22 | Error.Code="Erreur : %1" 23 | Error.URL="URL : %2" 24 | ErrorCode.ERR_CONNECTION_REFUSED="Le serveur a refusé la connexion" 25 | ErrorCode.ERR_NAME_NOT_RESOLVED="L'adresse IP du serveur est introuvable" 26 | ErrorCode.ERR_CONNECTION_TIMED_OUT="Délai de connexion dépassé" 27 | ErrorCode.ERR_FILE_NOT_FOUND="Fichier introuvable" 28 | ErrorCode.ERR_FAILED="Échec de connexion" 29 | ErrorCode.ERR_NETWORK_CHANGED="Réseau modifié" 30 | ErrorCode.ERR_SSL_VERSION_INTERFERENCE="Interférence avec la version SSL. TLS 1.3 peut être bloqué ou modifié." 31 | ErrorCode.ERR_SSL_PROTOCOL_ERROR="Erreur de protocole SSL. Impossible de créer une connexion sécurisée." 32 | -------------------------------------------------------------------------------- /data/locale/gd-GB.ini: -------------------------------------------------------------------------------- 1 | LocalFile="Faidhle ionadail" 2 | Width="Leud" 3 | Height="Àirde" 4 | CSS="CSS gnàthaichte" 5 | ShutdownSourceNotVisible="Dùin sìos an tùs mura faicear e" 6 | RefreshBrowserActive="Ath-nuadhaich am brabhsair nuair a ghnìomhaicheas an t-sealladh" 7 | RefreshNoCache="Ath-nuadhaich tasgadan na duilleige làithrich" 8 | RestartCEF="Ath-thòisich CEF" 9 | BrowserSource="Brabhsair" 10 | CustomFrameRate="Cleachd reat fhrèamaichean gnàthaichte" 11 | RerouteAudio="Stiùirich an fhuaim le OBS" 12 | WebpageControlLevel="Ceadan na duilleige" 13 | WebpageControlLevel.Level.None="Gun inntrigeadh dha OBS" 14 | WebpageControlLevel.Level.ReadOnly="Inntrigeadh ri leughadh a-mhàin dha OBS" 15 | WebpageControlLevel.Level.Basic="Inntrigeadh bunasach dha OBS (Sàbhail bufair na h-ath-chluiche is msaa.)" 16 | WebpageControlLevel.Level.Advanced="Inntrigeadh adhartach dha OBS (atharraich seallaidhean, tòisich/cuir stad air bufair na h-ath-chluiche is msaa.)" 17 | WebpageControlLevel.Level.All="Làn-inntrigeadh dha OBS (tòisich/cuir stad air sruthadh gun rabhadh is msaa.)" 18 | Error.Title="Cha b’ urrainn dhuinn an duilleag ud a luchdadh!" 19 | Error.Description="Dèan cinnteach gu bheil an seòladh mar bu chòir ’s nach eil duilgheadasan aig an làrach." 20 | Error.Retry="Briog an-seo airson fheuchainn ris a-rithist" 21 | Error.Code="Mearachd: %1" 22 | ErrorCode.ERR_CONNECTION_REFUSED="Dhiùlt am frithealaiche an ceangal" 23 | ErrorCode.ERR_NAME_NOT_RESOLVED="Cha deach seòladh IP an fhrithealaiche a lorg" 24 | ErrorCode.ERR_CONNECTION_TIMED_OUT="Dh'fhalbh an ùine air a' cheangal" 25 | ErrorCode.ERR_FILE_NOT_FOUND="Cha deach am faidhle a lorg" 26 | ErrorCode.ERR_FAILED="Cha deach leinn ceangal a dhèanamh" 27 | ErrorCode.ERR_NETWORK_CHANGED="Dh’atharraich an lìonra" 28 | ErrorCode.ERR_SSL_VERSION_INTERFERENCE="Teagmhail mun tionndadh SSL. Dh’fhaoidte gu bheil TLS 1.3 ’ga bhacadh no air atharrachadh." 29 | ErrorCode.ERR_SSL_PROTOCOL_ERROR="Mearachd pròtacail SSL. Cha b’ urrainn dhuinn ceangal tèarainte a stèidheachadh." 30 | -------------------------------------------------------------------------------- /data/locale/gl-ES.ini: -------------------------------------------------------------------------------- 1 | LocalFile="Ficheiro local" 2 | Width="Largo" 3 | Height="Alto" 4 | CSS="CSS personalizado" 5 | ShutdownSourceNotVisible="Apagar a fonte cando non sexa visíbel" 6 | RefreshBrowserActive="Actualizar o navegador cando se active a escena" 7 | RefreshNoCache="Actualizar a caché da páxina actual" 8 | RestartCEF="Reiniciar CEF" 9 | BrowserSource="Navegador" 10 | CustomFrameRate="Usar unha taxa de fotogramas personalizada" 11 | RerouteAudio="Controlar o son mediante OBS" 12 | -------------------------------------------------------------------------------- /data/locale/he-IL.ini: -------------------------------------------------------------------------------- 1 | LocalFile="קובץ מקומי" 2 | URL="כתובת" 3 | Width="רוחב" 4 | Height="גובה" 5 | CSS="CSS מותאם אישית" 6 | ShutdownSourceNotVisible="כיבוי המקור כאשר אינו גלוי" 7 | RefreshBrowserActive="ריענון הדפדפן בעת הפעלת הסצנה" 8 | RefreshNoCache="ריענון זיכרון מטמון של העמוד הנוכחי" 9 | RestartCEF="אתחול CEF" 10 | BrowserSource="דפדפן" 11 | CustomFrameRate="השתמש בקצב פריימים בהתאמה אישית" 12 | RerouteAudio="בקרת שמע דרך OBS" 13 | WebpageControlLevel="הרשאות דף" 14 | WebpageControlLevel.Level.None="אין גישה ל-OBS" 15 | WebpageControlLevel.Level.ReadOnly="גישת קריאה-בלבד ל-OBS" 16 | WebpageControlLevel.Level.Basic="גישה בסיסית ל-OBS (שמירת אוגר ההילוך החוזר, וכו')" 17 | WebpageControlLevel.Level.Advanced="גישה מתקדמת ל-OBS (שינוי סצינות, התחלת/הפסקת אוגר ההילוך החוזר, וכו')" 18 | WebpageControlLevel.Level.All="גישה מלאה ל-OBS (התחלת/הפסקת שידור חי ללא אזהרה, וכו')" 19 | Error.Title="לא היה ניתן לטעון את העמוד!" 20 | Error.Description="יש לוודא שהכתובת נכונה ושלא קיימות בעיות באתר." 21 | Error.Retry="יש ללחוץ כאן כדי לנסות שוב" 22 | Error.Code="שגיאה: %1" 23 | Error.URL="כתובת: %2" 24 | ErrorCode.ERR_CONNECTION_REFUSED="השרת סירב לחיבור" 25 | ErrorCode.ERR_NAME_NOT_RESOLVED="כתובת ה־IP של השרת לא נמצאה" 26 | ErrorCode.ERR_CONNECTION_TIMED_OUT="זמן החיבור פג" 27 | ErrorCode.ERR_FILE_NOT_FOUND="הקובץ לא נמצא" 28 | ErrorCode.ERR_FAILED="ההתחברות נכשלה" 29 | ErrorCode.ERR_NETWORK_CHANGED="רשת השתנתה" 30 | ErrorCode.ERR_SSL_VERSION_INTERFERENCE="הפרעה לגרסת SSL. TLS 1.3 עשוי להיות חסום או ערוך." 31 | ErrorCode.ERR_SSL_PROTOCOL_ERROR="שגיאת פרוטוקול SSL. לא ניתן היה ליצור חיבור מאובטח" 32 | -------------------------------------------------------------------------------- /data/locale/hi-IN.ini: -------------------------------------------------------------------------------- 1 | LocalFile="लोकल फाइल" 2 | Width="चौड़ाई" 3 | Height="ऊँचाई" 4 | CSS="निर्मित CSS" 5 | ShutdownSourceNotVisible="स्रोत जब ओझल हो तो उसे बंद कर दें" 6 | RefreshBrowserActive="दृश्य सक्रिय होने पर ब्राउज़र रिफ़्रेश करें" 7 | RefreshNoCache="वर्तमान पृष्ठ का कैश ताज़ा करें" 8 | RestartCEF="CEF पुनः आरंभ करें" 9 | BrowserSource="ब्राउज़र" 10 | CustomFrameRate="निर्मित फ़्रेम रेट का प्रयोग करें" 11 | RerouteAudio="ऑडियो OBS के माध्यम से नियंत्रित करें" 12 | WebpageControlLevel="पृष्ठ की अनुमतियां" 13 | WebpageControlLevel.Level.None="OBS तक पहुँच नहीं है" 14 | WebpageControlLevel.Level.ReadOnly="OBS तक केवल-पढ़ने की पहुँच है" 15 | WebpageControlLevel.Level.Basic="OBS तक बुनियादी पहुंच (रिप्ले बफर सहेजें, आदि )" 16 | WebpageControlLevel.Level.Advanced="OBS के लिए उन्नत पहुंच (दृश्य बदलें, रीप्ले बफर प्रारंभ/बंद करें, आदि)" 17 | WebpageControlLevel.Level.All="OBS तक पूर्ण पहुंच (बिना किसी चेतावनी के स्ट्रीमिंग शुरू/बंद करें, आदि)" 18 | Error.Title="उस पेज को लोड नहीं किया जा सका!" 19 | Error.Description="सुनिश्चित करें कि पता सही है और साइट में कोई समस्या नहीं है." 20 | Error.Retry="पुनः प्रयास करने के लिए क्लिक करें" 21 | Error.Code="त्रुटि : %1" 22 | ErrorCode.ERR_CONNECTION_REFUSED="सर्वर ने कनेक्शन से इनकार कर दिया" 23 | ErrorCode.ERR_NAME_NOT_RESOLVED="सर्वर का IP पता नहीं मिला" 24 | ErrorCode.ERR_CONNECTION_TIMED_OUT="कनेक्शन टाइम आउट" 25 | ErrorCode.ERR_FILE_NOT_FOUND="फ़ाइल नहीं मिली" 26 | ErrorCode.ERR_FAILED="जुड़ने में विफल" 27 | ErrorCode.ERR_NETWORK_CHANGED="नेटवर्क बदल गया" 28 | ErrorCode.ERR_SSL_VERSION_INTERFERENCE="SSL संस्करण हस्तक्षेप. TLS 1.3 को अवरुद्ध या संशोधित किया जा सकता है." 29 | ErrorCode.ERR_SSL_PROTOCOL_ERROR="SSL प्रोटोकॉल त्रुटि. सुरक्षित कनेक्शन नहीं बना सका." 30 | -------------------------------------------------------------------------------- /data/locale/hr-HR.ini: -------------------------------------------------------------------------------- 1 | LocalFile="Lokalna datoteka" 2 | URL="Web adresa" 3 | Width="Širina" 4 | Height="Visina" 5 | CSS="Prilagođeni CSS" 6 | ShutdownSourceNotVisible="Isključiti izvor kada nije vidljiv" 7 | RefreshBrowserActive="Osvježi preglednik kada scena postane aktivna" 8 | RefreshNoCache="Osvježi predmemoriju trenutne stranice" 9 | RestartCEF="Ponovno pokreni CEF" 10 | BrowserSource="Preglednik" 11 | CustomFrameRate="Koristite prilagođenu brzinu kadrova" 12 | RerouteAudio="Kontrolirajte zvuk preko OBS-a" 13 | -------------------------------------------------------------------------------- /data/locale/hu-HU.ini: -------------------------------------------------------------------------------- 1 | LocalFile="Helyi fájl" 2 | URL="Webcím" 3 | Width="Szélesség" 4 | Height="Magasság" 5 | CSS="Egyéni CSS" 6 | ShutdownSourceNotVisible="Lekapcsolás, ha nem látható" 7 | RefreshBrowserActive="Böngésző frissítése ha aktívvá válik" 8 | RefreshNoCache="Aktuális oldal gyorsítótárának frissítése" 9 | RestartCEF="CEF újraindítása" 10 | BrowserSource="Böngésző" 11 | CustomFrameRate="Egyéni képkockaráta használata" 12 | RerouteAudio="Hangvezérlés OBS-en keresztül" 13 | WebpageControlLevel="Oldal engedélyei" 14 | WebpageControlLevel.Level.None="Nincs hozzáférés az OBS-hez" 15 | WebpageControlLevel.Level.ReadOnly="Csak olvasható hozzáférés az OBS-hez" 16 | WebpageControlLevel.Level.Basic="Alapvető hozzáférés az OBS-hez (visszajátszási puffer mentése, stb.)" 17 | WebpageControlLevel.Level.Advanced="Speciális hozzáférés az OBS-hez (Jelenetek váltása, lejátszási puffer indítása/leállítása, stb.)" 18 | WebpageControlLevel.Level.All="Teljes hozzáférés az OBS-hez (közvetítés figyelmeztetés nélküli indítása/leállítása, stb.)" 19 | Error.Title="Az oldal nem tölthető be." 20 | Error.Description="Győződjön meg róla, hogy a cím helyes, és hogy nincsenek problémák az oldallal." 21 | Error.Retry="Újrapróbálkozáshoz kattintson ide" 22 | Error.Code="Hiba: %1" 23 | ErrorCode.ERR_CONNECTION_REFUSED="A kiszolgáló megtagadta a kapcsolatot" 24 | ErrorCode.ERR_NAME_NOT_RESOLVED="A kiszolgáló IP-címe nem található" 25 | ErrorCode.ERR_CONNECTION_TIMED_OUT="Kapcsolódási időtúllépés" 26 | ErrorCode.ERR_FILE_NOT_FOUND="A fájl nem található" 27 | ErrorCode.ERR_FAILED="Csatlakozás sikertelen" 28 | ErrorCode.ERR_NETWORK_CHANGED="Hálózat megváltozott" 29 | ErrorCode.ERR_SSL_VERSION_INTERFERENCE="SSL verzióprobléma. A TLS 1.3 lehet hogy blokkolt vagy módosított." 30 | ErrorCode.ERR_SSL_PROTOCOL_ERROR="SSL protokollhiba. A biztonságos kapcsolat nem hozható létre." 31 | -------------------------------------------------------------------------------- /data/locale/id-ID.ini: -------------------------------------------------------------------------------- 1 | LocalFile="Berkas lokal" 2 | Width="Lebar" 3 | Height="Tinggi" 4 | CSS="Sesuaikan CSS" 5 | ShutdownSourceNotVisible="Nonaktifkan sumber ketika tidak terlihat" 6 | RefreshBrowserActive="Muat ulang peramban ketika adegan menjadi aktif" 7 | RefreshNoCache="Muat ulang cache halaman saat ini" 8 | RestartCEF="Aktifkan Ulang CEF" 9 | BrowserSource="Peramban" 10 | CustomFrameRate="Gunakan modifikasi frame rate" 11 | RerouteAudio="Kontrol audio melalui OBS" 12 | WebpageControlLevel="Izin halaman" 13 | WebpageControlLevel.Level.None="Tidak ada akses ke OBS" 14 | WebpageControlLevel.Level.ReadOnly="Akses Hanya-baca ke OBS" 15 | WebpageControlLevel.Level.Basic="Akses dasar ke OBS (Menyimpan buffer replay, dll.)" 16 | WebpageControlLevel.Level.Advanced="Akses lanjutan ke OBS (Mengubah adegan, Mulai/Berhenti buffer replay, dll.)" 17 | WebpageControlLevel.Level.All="Akses penuh ke OBS (Mulai/Berhenti streaming tanpa peringatan, dll.)" 18 | Error.Title="Tidak dapat memuat halaman itu!" 19 | Error.Description="Pastikan alamat situsnya benar, dan situs tersebut sedang tidak mengalami masalah." 20 | Error.Retry="Klik disini untuk mencoba kembali" 21 | Error.Code="Galat: %1" 22 | ErrorCode.ERR_CONNECTION_REFUSED="Server menolak koneksi" 23 | ErrorCode.ERR_NAME_NOT_RESOLVED="Alamat IP server tidak ditemukan" 24 | ErrorCode.ERR_CONNECTION_TIMED_OUT="Waktu koneksi habis" 25 | ErrorCode.ERR_FILE_NOT_FOUND="Berkas tidak ditemukan" 26 | ErrorCode.ERR_FAILED="Gagal terhubung" 27 | ErrorCode.ERR_NETWORK_CHANGED="Jaringan berubah" 28 | ErrorCode.ERR_SSL_VERSION_INTERFERENCE="Gangguan versi SSL. TLS 1.3 mungkin terblokir atau dimodifikasi." 29 | ErrorCode.ERR_SSL_PROTOCOL_ERROR="Kesalahan protokol SSL. Tidak dapat membuat sambungan aman." 30 | -------------------------------------------------------------------------------- /data/locale/it-IT.ini: -------------------------------------------------------------------------------- 1 | LocalFile="File locale" 2 | Width="Larghezza" 3 | Height="Altezza" 4 | FPS="Fotogrammi al secondo" 5 | CSS="CSS personalizzato" 6 | ShutdownSourceNotVisible="Chiudi la fonte quando non è visibile" 7 | RefreshBrowserActive="Ricarica la pagina del browser quando la scena diventa attiva" 8 | RefreshNoCache="Aggiorna la cache della pagina attuale" 9 | RestartCEF="Riavvia il CEF" 10 | CustomFrameRate="Utilizza una velocità dei fotogrammi personalizzata" 11 | RerouteAudio="Controlla audio tramite OBS" 12 | WebpageControlLevel="Permessi pagina" 13 | WebpageControlLevel.Level.None="Nessun accesso a OBS" 14 | WebpageControlLevel.Level.ReadOnly="Accesso in sola lettura a OBS" 15 | WebpageControlLevel.Level.Basic="Accesso di base a OBS (Salva il replay buffer, ecc.)" 16 | WebpageControlLevel.Level.Advanced="Accesso avanzato a OBS (Cambia scene,Avvia/Ferma replay buffer, ecc.)" 17 | WebpageControlLevel.Level.All="Accesso completo a OBS (Avvia/Ferma streaming senza preavviso, ecc.)" 18 | Error.Title="Impossibile caricare quella pagina!" 19 | Error.Description="Assicurarsi che l'indirizzo sia corretto e che il sito non abbia problemi." 20 | Error.Retry="Clicca qui per riprovare" 21 | Error.Code="Errore: %1" 22 | ErrorCode.ERR_CONNECTION_REFUSED="Il server ha rifiutato la connessione" 23 | ErrorCode.ERR_NAME_NOT_RESOLVED="Indirizzo IP del server non trovato" 24 | ErrorCode.ERR_CONNECTION_TIMED_OUT="Connessione scaduta" 25 | ErrorCode.ERR_FILE_NOT_FOUND="File non trovato" 26 | ErrorCode.ERR_FAILED="Impossibile connettersi" 27 | ErrorCode.ERR_NETWORK_CHANGED="Rete modificata" 28 | ErrorCode.ERR_SSL_VERSION_INTERFERENCE="Interferenza della versione SSL. TLS 1.3 potrebbe essere bloccato o modificato." 29 | ErrorCode.ERR_SSL_PROTOCOL_ERROR="Errore del protocollo SSL. Impossibile creare una connessione sicura." 30 | -------------------------------------------------------------------------------- /data/locale/ja-JP.ini: -------------------------------------------------------------------------------- 1 | LocalFile="ローカルファイル" 2 | Width="幅" 3 | Height="高さ" 4 | CSS="カスタム CSS" 5 | ShutdownSourceNotVisible="表示されていないときにソースをシャットダウン" 6 | RefreshBrowserActive="シーンがアクティブになったときにブラウザの表示を更新" 7 | RefreshNoCache="現在のページを再読込" 8 | RestartCEF="CEF を再起動" 9 | BrowserSource="ブラウザ" 10 | CustomFrameRate="カスタムフレームレートを使用" 11 | RerouteAudio="OBSを介して音声を制御する" 12 | WebpageControlLevel="ページ権限" 13 | WebpageControlLevel.Level.None="OBSへのアクセス権無し" 14 | WebpageControlLevel.Level.ReadOnly="OBSへの読み取り専用アクセス" 15 | WebpageControlLevel.Level.Basic="OBSへの基本的なアクセス (リプレイバッファの保存など。)" 16 | WebpageControlLevel.Level.Advanced="OBSへの高度なアクセス (シーンの変更、リプレイバッファの開始/停止など。)" 17 | WebpageControlLevel.Level.All="OBSへのフルアクセス (警告なしで配信を開始/停止するなど。)" 18 | Error.Title="ページを読み込めませんでした。" 19 | Error.Description="URLが正しく、サイトに問題がないことを確認してください。" 20 | Error.Retry="クリックして再試行" 21 | Error.Code="エラー: %1" 22 | ErrorCode.ERR_CONNECTION_REFUSED="サーバーが接続を拒否しました" 23 | ErrorCode.ERR_NAME_NOT_RESOLVED="サーバーの IP アドレスが見つかりません" 24 | ErrorCode.ERR_CONNECTION_TIMED_OUT="接続がタイムアウトしました" 25 | ErrorCode.ERR_FILE_NOT_FOUND="ファイルが見つかりません" 26 | ErrorCode.ERR_FAILED="接続に失敗しました" 27 | ErrorCode.ERR_NETWORK_CHANGED="ネットワークが変更されました" 28 | ErrorCode.ERR_SSL_VERSION_INTERFERENCE="SSLバージョンの干渉。 TLS1.3がブロックまたは変更されている可能性があります。" 29 | ErrorCode.ERR_SSL_PROTOCOL_ERROR="SSLプロトコルエラー。 安全な接続を確立できませんでした。" 30 | -------------------------------------------------------------------------------- /data/locale/ka-GE.ini: -------------------------------------------------------------------------------- 1 | LocalFile="ადგილობრივი ფაილი" 2 | URL="URL-მისამართი" 3 | Width="სიგანე" 4 | Height="სიმაღლე" 5 | CSS="მითითებული CSS" 6 | ShutdownSourceNotVisible="წყაროს გამორთვა, როცა არაა ხილული" 7 | RefreshBrowserActive="ბრაუზერის განახლება, სცენის ამოქმედებისას" 8 | RefreshNoCache="მიმდინარე გვერდის მონაცემების განახლება" 9 | RestartCEF="CEF-ის ხელახლა გაშვება" 10 | BrowserSource="ვებბრაუზერი" 11 | CustomFrameRate="მითითებული კადრის სიხშირე" 12 | RerouteAudio="ხმის მართვა OBS-ით" 13 | WebpageControlLevel="გვერდის ნებართვები" 14 | WebpageControlLevel.Level.None="არაა წვდომა OBS-თან" 15 | WebpageControlLevel.Level.ReadOnly="მხოლოდ წაკითხვით წვდომა OBS-თან" 16 | WebpageControlLevel.Level.Basic="გამარტივებული წვდომა OBS-თან (შენახვა, გადახვევა და ა.შ.)" 17 | WebpageControlLevel.Level.Advanced="გაფართოებული წვდომა OBS-თან (სცენების გადართვა, გადახვევის ჩართვა/გამორთვა და ა.შ.)" 18 | WebpageControlLevel.Level.All="სრული წვდომა OBS-თან (ნაკადის გაშვება/შეწყვეტა გაუფრთხილებლად და ა.შ.)" 19 | Error.Title="გვერდი ვერ ჩაიტვირთა!" 20 | Error.Description="გადაამოწმეთ, მისამართის სისწორე და საიტის გამართულობა." 21 | Error.Retry="გამეორებისთვის დაწკაპეთ აქ" 22 | Error.Code="შეცდომა: %1" 23 | ErrorCode.ERR_CONNECTION_REFUSED="სერვერმა უარყო კავშირი" 24 | ErrorCode.ERR_NAME_NOT_RESOLVED="სერვერის IP-მისამართი ვერ მოიძებნა" 25 | ErrorCode.ERR_CONNECTION_TIMED_OUT="კავშირის დრო ამოიწურა" 26 | ErrorCode.ERR_FILE_NOT_FOUND="ფაილი ვერ მოიძებნა" 27 | ErrorCode.ERR_FAILED="დაკავშირება ვერ მოხერხდა" 28 | ErrorCode.ERR_NETWORK_CHANGED="ქსელი შეიცვალა" 29 | ErrorCode.ERR_SSL_VERSION_INTERFERENCE="SSL-ვერსიის გამო შეფერხება. TLS 1.3 შეზღუდული ან გადაკეთებულია." 30 | ErrorCode.ERR_SSL_PROTOCOL_ERROR="SSL-ოქმის შეცდომა. დაცული კავშირი ვერ შედგა." 31 | -------------------------------------------------------------------------------- /data/locale/kab-KAB.ini: -------------------------------------------------------------------------------- 1 | LocalFile="Afaylu adigan" 2 | Width="Tehri" 3 | Height="Tattayt" 4 | CSS="CSS yugnen" 5 | ShutdownSourceNotVisible="Sens aɣbalu ticki yettban" 6 | RefreshBrowserActive="Sismeḍ iminig mi ara yeqel usayes d urmid" 7 | RefreshNoCache="Sismeḍ tuffirt n usebter amiran" 8 | RestartCEF="Ales asekker n CEF" 9 | BrowserSource="Iminig" 10 | CustomFrameRate="Seqdec atug yugnen n yikataren" 11 | RerouteAudio="Asenqed n umeslaw s ttawil n OBS" 12 | -------------------------------------------------------------------------------- /data/locale/kmr-TR.ini: -------------------------------------------------------------------------------- 1 | LocalFile="Pelê herêmî" 2 | Width="Pehnî" 3 | Height="Bilindî" 4 | CSS="CSS a kesanekirî" 5 | ShutdownSourceNotVisible="Çavkaniyê rawestîne gava ku ne xuyabar be" 6 | RefreshBrowserActive="Gava dîmen çalak bibe gerokê nû bike" 7 | RefreshNoCache="Pêşbirka rûpela heyî nû bike" 8 | RestartCEF="CEF ji nû ve dest pê bike" 9 | BrowserSource="Gerok" 10 | CustomFrameRate="Rêjeya tarika ya kesanekirî bi kar bîne" 11 | RerouteAudio="Kontrolkirina dengê bi riya OBS" 12 | WebpageControlLevel="Mafên rûpelê" 13 | WebpageControlLevel.Level.None="Gihîştina OBS tune ye" 14 | WebpageControlLevel.Level.ReadOnly="Gihîştina OBS-ê tenê ji bo xwendinê" 15 | WebpageControlLevel.Level.Basic="Gihîştina bingehîn a OBS (Tomarkirina dubarekirina bîrgeha demkî, hwd.)" 16 | WebpageControlLevel.Level.Advanced="Gihîştina pêşketî ya OBS-ê (Dîmenan biguherîne, Destpêkirin/Rawestandin dubarekirina bîrgeha demkî, hwd.)" 17 | WebpageControlLevel.Level.All="Gihîştina tevahî ya OBS-ê (Bêyî hişyarî weşanê Destpê bike/Rawestîne, hwd.)" 18 | Error.Title="Nikarê wê rûpelê bar bike!" 19 | Error.Description="Piştrast bike ku navnîşan rast e, û ku malper ne xwediyê pirsgirêkan e." 20 | Error.Retry="Ji bo ji nû ve ceribandinê li vir bitike" 21 | Error.Code="Çewtî: %1" 22 | ErrorCode.ERR_CONNECTION_REFUSED="Rajekar pêwendî red kir" 23 | ErrorCode.ERR_NAME_NOT_RESOLVED="Navnîşana IP ya rajekar nehatin dîtin" 24 | ErrorCode.ERR_CONNECTION_TIMED_OUT="Dema girêdanê bi dawî bû" 25 | ErrorCode.ERR_FILE_NOT_FOUND="Pel nehate dîtin" 26 | ErrorCode.ERR_FAILED="Girêdan pêk nehat" 27 | ErrorCode.ERR_NETWORK_CHANGED="Tor guherî" 28 | ErrorCode.ERR_SSL_VERSION_INTERFERENCE="Navrûya guhertoya SSL. Dibe ku TLS 1.3 were astengkirin an guhertin." 29 | ErrorCode.ERR_SSL_PROTOCOL_ERROR="Çewtiya protokola SSL. Nikaribû girêdaneke ewledar çê bike." 30 | -------------------------------------------------------------------------------- /data/locale/ko-KR.ini: -------------------------------------------------------------------------------- 1 | LocalFile="로컬 파일" 2 | Width="너비" 3 | Height="높이" 4 | CSS="CSS" 5 | ShutdownSourceNotVisible="소스가 보이지 않는 경우 종료" 6 | RefreshBrowserActive="장면이 활성화되면 브라우저를 새로고침" 7 | RefreshNoCache="현재 페이지의 캐시를 새로고침" 8 | RestartCEF="CEF 재시작" 9 | BrowserSource="브라우저" 10 | CustomFrameRate="사용자가 임의로 설정한 프레임 레이트 사용" 11 | RerouteAudio="OBS를 통해 소리조절" 12 | WebpageControlLevel="페이지권한" 13 | WebpageControlLevel.Level.None="OBS에 접근 권한 없음" 14 | WebpageControlLevel.Level.ReadOnly="OBS에 읽기 전용 접근 권한" 15 | WebpageControlLevel.Level.Basic="OBS에 기본 접근 권한 (리플레이 버퍼 저장 등)" 16 | WebpageControlLevel.Level.Advanced="OBS에 고급 접근 권한 (장면 전환, 리플레이 버퍼 시작/멈추기 등)" 17 | WebpageControlLevel.Level.All="OBS에 완전 접근 권한 (경고문 없이 방송 시작/멈추기 등)" 18 | Error.Title="해당 페이지를 불러올 수 없습니다!" 19 | Error.Description="주소가 올바른지, 또는 사이트에 이상이 없는지 확인하십시오" 20 | Error.Retry="다시 시도하려면 여기를 클릭하십시오" 21 | Error.Code="오류: %1" 22 | ErrorCode.ERR_CONNECTION_REFUSED="서버가 연결을 차단했습니다" 23 | ErrorCode.ERR_NAME_NOT_RESOLVED="서버의 IP주소를 찾을 수 없습니다" 24 | ErrorCode.ERR_CONNECTION_TIMED_OUT="연결 시간이 초과되었습니다" 25 | ErrorCode.ERR_FILE_NOT_FOUND="파일을 찾을 수 없음" 26 | ErrorCode.ERR_FAILED="연결실패" 27 | ErrorCode.ERR_NETWORK_CHANGED="네트워크가 변경됨" 28 | ErrorCode.ERR_SSL_VERSION_INTERFERENCE="보안소켓층판방해. TLS1.3은 막히거나 변조될수 있습니다." 29 | ErrorCode.ERR_SSL_PROTOCOL_ERROR="안전소켓층규약오류. 안전한 연결을 할수 없습니다." 30 | -------------------------------------------------------------------------------- /data/locale/lt-LT.ini: -------------------------------------------------------------------------------- 1 | LocalFile="Vietinis failas" 2 | URL="Tinklalapio Adresas" 3 | Width="Plotis" 4 | Height="Aukštis" 5 | FPS="Kadrai per sekundę" 6 | CSS="Išplėstinis CSS" 7 | ShutdownSourceNotVisible="Išjungti šaltinį, kai jis nėra matomas" 8 | RefreshBrowserActive="Perkrauti naršyklę kai scena tampa aktyvi" 9 | RefreshNoCache="Perkrauti dabartinio puslapio talpyklą" 10 | RestartCEF="Perkrauti CEF" 11 | BrowserSource="Naršyklė" 12 | CustomFrameRate="Naudoti pasirinktiną kadrų dažnį" 13 | RerouteAudio="Kontroliuoti garsą per OBS" 14 | WebpageControlLevel="Puslapio leidimai" 15 | WebpageControlLevel.Level.None="Nėra prieigos prie OBS" 16 | WebpageControlLevel.Level.ReadOnly="Tik skaitomoji prieiga prie OBS" 17 | WebpageControlLevel.Level.Basic="Paprasta prieiga prie OBS (Saugoti pakartojimo buferį ir panašiai)" 18 | WebpageControlLevel.Level.Advanced="Pažengusi prieiga prie OBS (Pakeisti scenas, Pradėti/Stabdyti pakartojimo buferį ir panašiai)" 19 | WebpageControlLevel.Level.All="Pilna prieiga prie OBS (Pradėti/Stabdyti transliavimą be įspėjimų ir panašiai)" 20 | Error.Title="Nepavyko užkrauti to puslapio!" 21 | Error.Description="Užtikrinkite, kad adresas yra tikslus, ir, kad svetainė šiuo metu neturi problemų." 22 | Error.Retry="Spustelėkite čia, kad pabandyti iš naujo" 23 | Error.Code="Klaida: %1" 24 | Error.URL="Adresas: %2" 25 | ErrorCode.ERR_CONNECTION_REFUSED="Serveris atisakė prisijungti" 26 | ErrorCode.ERR_NAME_NOT_RESOLVED="Nerastas serverio IP adresas" 27 | ErrorCode.ERR_CONNECTION_TIMED_OUT="Prijungimo laikas baigėsi" 28 | ErrorCode.ERR_FILE_NOT_FOUND="Failas nerastas" 29 | ErrorCode.ERR_FAILED="Nepavyko prisijungti" 30 | ErrorCode.ERR_NETWORK_CHANGED="Pakeistas tinklas" 31 | ErrorCode.ERR_SSL_VERSION_INTERFERENCE="SSL versijos trukdžiai. TLS 1.3 gali būti užblokuotas arba modifikuotas." 32 | ErrorCode.ERR_SSL_PROTOCOL_ERROR="SSL protokolo klaida. Nepavyko užtikrinti saugaus prisijungimo." 33 | -------------------------------------------------------------------------------- /data/locale/mn-MN.ini: -------------------------------------------------------------------------------- 1 | LocalFile="Дотоод файл" 2 | Width="Өргөн" 3 | Height="Өндөр" 4 | CSS="CSS тохиргоо" 5 | ShutdownSourceNotVisible="Харагдахгүй байгаа үед эх үүсвэрийг унтраах" 6 | RefreshBrowserActive="Хөшиг идэвхтэй болох үед хөтчийг дахин сэргээх" 7 | RefreshNoCache="Байгай хуудасныхаа кэйшийг сэргээх" 8 | RestartCEF="CEF-ийг Дахин ачааллах" 9 | BrowserSource="Хөтөч" 10 | -------------------------------------------------------------------------------- /data/locale/ms-MY.ini: -------------------------------------------------------------------------------- 1 | LocalFile="Fail setempat" 2 | Width="Lebar" 3 | Height="Tinggi" 4 | CSS="CSS Suai" 5 | ShutdownSourceNotVisible="Matikan sumber apabila tidak kelihatan" 6 | RefreshBrowserActive="Segar semula pelayar ketika adegan menjadi aktif" 7 | RefreshNoCache="Segar semula cache bagi halaman semasa" 8 | RestartCEF="Mula semula CEF" 9 | BrowserSource="Pelayar" 10 | CustomFrameRate="Guna kadar bingkai suai" 11 | RerouteAudio="Kawal audio melalui OBS" 12 | WebpageControlLevel="Keizinan halaman" 13 | WebpageControlLevel.Level.None="Tiada capaian ke OBS" 14 | WebpageControlLevel.Level.ReadOnly="Capaian baca-sahaja ke OBS" 15 | WebpageControlLevel.Level.Basic="Capaian asas ke OBS (Simpan penimbal main semula, dll.)" 16 | WebpageControlLevel.Level.Advanced="Capaian lanjutan ke OBS (Ubah adegan, Mula/Henti penimbal main semula, dll.)" 17 | WebpageControlLevel.Level.All="Capaian penuh ke OBS (Mula/Henti penstriman tanpa amaran, dll.)" 18 | Error.Title="Tidak dapat memuatkan halaman tersebut!" 19 | Error.Description="Pastikan alamat adalah betul, dan tapak tiada hadapi masalah." 20 | Error.Retry="Klik di sini untuk cuba lagi" 21 | Error.Code="Ralat: %1" 22 | ErrorCode.ERR_CONNECTION_REFUSED="Pelayan menolak sambungan" 23 | ErrorCode.ERR_NAME_NOT_RESOLVED="Alamat IP pelayan tidak ditemui" 24 | ErrorCode.ERR_CONNECTION_TIMED_OUT="Sambungan tamat masa" 25 | ErrorCode.ERR_FILE_NOT_FOUND="Fail tidak ditemui" 26 | ErrorCode.ERR_FAILED="Sambungan gagal" 27 | ErrorCode.ERR_NETWORK_CHANGED="Rangkaian berubah" 28 | ErrorCode.ERR_SSL_VERSION_INTERFERENCE="Antara muka versi SSL. TLS 1.3 mungkin disekat atau diubah suai." 29 | ErrorCode.ERR_SSL_PROTOCOL_ERROR="Ralat protokol SSL. Gagal menjalinkan sambungan selamat." 30 | -------------------------------------------------------------------------------- /data/locale/nb-NO.ini: -------------------------------------------------------------------------------- 1 | LocalFile="Lokal fil" 2 | Width="Bredde" 3 | Height="Høyde" 4 | CSS="Egendefinert CSS" 5 | ShutdownSourceNotVisible="Deaktiver kilde når ikke synlig" 6 | RefreshBrowserActive="Oppdater nettleseren når scenen blir aktiv" 7 | RefreshNoCache="Oppdater bufferen for denne siden" 8 | BrowserSource="Nettleser" 9 | CustomFrameRate="Bruk tilpasset bildefrekvens" 10 | RerouteAudio="Kontroller lyden gjennom OBS" 11 | WebpageControlLevel="Side tillatelser" 12 | WebpageControlLevel.Level.None="Ingen tilgang til OBS" 13 | WebpageControlLevel.Level.ReadOnly="Kun lesetilgang til OBS" 14 | WebpageControlLevel.Level.Basic="Basistilgang til OBS (Lagre omspillingsbuffer, osv.)" 15 | WebpageControlLevel.Level.Advanced="Avansert tilgang til OBS (endre sener, start/stopp omspillingsbuffer, osv.)" 16 | WebpageControlLevel.Level.All="Full tilgang til OBS (Start/stopp kringkasting uten advarsel, osv.)" 17 | Error.Title="Kunne ikke laste inn den siden!" 18 | Error.Description="Kontroller at adressen er riktig, og at nettstedet ikke har problemer." 19 | Error.Retry="Klikk her for å prøve igjen." 20 | Error.Code="Feil: %1" 21 | ErrorCode.ERR_CONNECTION_REFUSED="Serveren nektet tilkoblingen" 22 | ErrorCode.ERR_NAME_NOT_RESOLVED="Serverens IP-adresse ble ikke funnet" 23 | ErrorCode.ERR_CONNECTION_TIMED_OUT="Tilkoblingen ble tidsavbrutt" 24 | ErrorCode.ERR_FILE_NOT_FOUND="Fant ikke filen" 25 | ErrorCode.ERR_FAILED="Tilkobling mislyktes" 26 | ErrorCode.ERR_NETWORK_CHANGED="Nettverk er endret" 27 | -------------------------------------------------------------------------------- /data/locale/nl-NL.ini: -------------------------------------------------------------------------------- 1 | LocalFile="Lokaal bestand" 2 | Width="Breedte" 3 | Height="Hoogte" 4 | CSS="Aangepaste CSS" 5 | ShutdownSourceNotVisible="Schakel bron uit wanneer deze niet zichtbaar is" 6 | RefreshBrowserActive="Vernieuw browser wanneer een scène actief wordt" 7 | RefreshNoCache="Cache van de huidige pagina vernieuwen" 8 | RestartCEF="CEF herstarten" 9 | CustomFrameRate="Gebruik aangepaste frame rate" 10 | RerouteAudio="Bedien geluid via OBS" 11 | WebpageControlLevel="Pagina rechten" 12 | WebpageControlLevel.Level.None="Geen toegang tot OBS" 13 | WebpageControlLevel.Level.ReadOnly="Alleen-lezen toegang tot OBS" 14 | WebpageControlLevel.Level.Basic="Basis toegang tot OBS (Opslaan replay buffer, etc.)" 15 | WebpageControlLevel.Level.Advanced="Geavanceerde toegang tot OBS (Verander scènes, Start/Stop replay buffer, etc.)" 16 | WebpageControlLevel.Level.All="Volledige toegang tot OBS (Start/Stop streamen zonder waarschuwing, etc.)" 17 | Error.Title="Kon pagina niet laden!" 18 | Error.Description="Controleer dat het adres correct is en dat de website geen problemen heeft." 19 | Error.Retry="Klik hier om opnieuw te proberen" 20 | Error.Code="Fout: %1" 21 | ErrorCode.ERR_CONNECTION_REFUSED="Server heeft de verbinding geweigerd" 22 | ErrorCode.ERR_NAME_NOT_RESOLVED="Server's IP-adres niet gevonden" 23 | ErrorCode.ERR_CONNECTION_TIMED_OUT="Connectie time-out" 24 | ErrorCode.ERR_FILE_NOT_FOUND="Bestand niet gevonden" 25 | ErrorCode.ERR_FAILED="Kan geen verbinding maken" 26 | ErrorCode.ERR_NETWORK_CHANGED="Netwerk gewijzigd" 27 | ErrorCode.ERR_SSL_VERSION_INTERFERENCE="SSL versie interferentie. TLS 1.3 kan geblokkeerd of aangepast worden." 28 | ErrorCode.ERR_SSL_PROTOCOL_ERROR="SSL-protocol fout. Kan geen beveiligde verbinding maken." 29 | -------------------------------------------------------------------------------- /data/locale/nn-NO.ini: -------------------------------------------------------------------------------- 1 | LocalFile="Lokal fil" 2 | Height="Høgde" 3 | BrowserSource="Nettlesar" 4 | Error.Code="Feil: %1" 5 | ErrorCode.ERR_FILE_NOT_FOUND="Fann ikkje fila" 6 | ErrorCode.ERR_NETWORK_CHANGED="Nettverk endra" 7 | -------------------------------------------------------------------------------- /data/locale/oc-FR.ini: -------------------------------------------------------------------------------- 1 | BrowserSource="Navegador" 2 | -------------------------------------------------------------------------------- /data/locale/pl-PL.ini: -------------------------------------------------------------------------------- 1 | LocalFile="Plik lokalny" 2 | URL="Adres URL" 3 | Width="Szerokość" 4 | Height="Wysokość" 5 | CSS="Własny CSS" 6 | ShutdownSourceNotVisible="Zamknij źródło, gdy niewidoczne" 7 | RefreshBrowserActive="Odśwież przeglądarkę, gdy scena zostanie aktywowana" 8 | RefreshNoCache="Odśwież pamięć podręczną bieżącej strony" 9 | RestartCEF="Uruchom ponownie CEF" 10 | BrowserSource="Przeglądarka" 11 | CustomFrameRate="Własne ustawienia FPS" 12 | RerouteAudio="Kontroluj audio przez OBSa" 13 | WebpageControlLevel="Uprawnienia strony" 14 | WebpageControlLevel.Level.None="Brak dostępu do OBS" 15 | WebpageControlLevel.Level.ReadOnly="Dostęp do OBS tylko do odczytu" 16 | WebpageControlLevel.Level.Basic="Podstawowy dostęp do OBS (Zapisz bufor powtórki, etc.)" 17 | WebpageControlLevel.Level.Advanced="Zaawansowany dostęp do OBS (Zmiana ekranów, Rozpoczęcie/Zatrzymanie bufora powtórki, etc.)" 18 | WebpageControlLevel.Level.All="Pełny dostęp do OBS (Rozpocznij/Zakończ nadawanie bez ostrzeżenia, etc.)" 19 | Error.Title="Nie można załadować strony!" 20 | Error.Description="Upewnij się, że adres jest poprawny i nie ma problemów ze stroną." 21 | Error.Retry="Kliknij, aby spróbować ponownie" 22 | Error.Code="Błąd: %1" 23 | ErrorCode.ERR_CONNECTION_REFUSED="Serwer odmówił połączenia" 24 | ErrorCode.ERR_NAME_NOT_RESOLVED="Nie znaleziono adresu IP serwera" 25 | ErrorCode.ERR_CONNECTION_TIMED_OUT="Upłynął limit czasu połączenia" 26 | ErrorCode.ERR_FILE_NOT_FOUND="Nie znaleziono pliku" 27 | ErrorCode.ERR_FAILED="Nie udało się połączyć" 28 | ErrorCode.ERR_NETWORK_CHANGED="Konfiguracja sieci zmieniła się" 29 | ErrorCode.ERR_SSL_VERSION_INTERFERENCE="Problemy z wersją SSL. TLS 1.3 może być zablokowany lub zmodyfikowany." 30 | ErrorCode.ERR_SSL_PROTOCOL_ERROR="Błąd protokołu SSL. Nie można nawiązać bezpiecznego połączenia." 31 | -------------------------------------------------------------------------------- /data/locale/pt-BR.ini: -------------------------------------------------------------------------------- 1 | LocalFile="Arquivo local" 2 | Width="Largura" 3 | Height="Altura" 4 | CSS="CSS Personalizado" 5 | ShutdownSourceNotVisible="Desativar fonte quando invisível" 6 | RefreshBrowserActive="Atualizar o navegador quando a cena se tornar ativa" 7 | RefreshNoCache="Atualizar o cache da página atual" 8 | RestartCEF="Reiniciar o CEF" 9 | BrowserSource="Navegador" 10 | CustomFrameRate="Usar taxa de quadros personalizada" 11 | RerouteAudio="Controlar áudio via OBS" 12 | WebpageControlLevel="Permissões da página" 13 | WebpageControlLevel.Level.None="Sem acesso ao OBS" 14 | WebpageControlLevel.Level.ReadOnly="Acesso somente leitura ao OBS" 15 | WebpageControlLevel.Level.Basic="Acesso básico ao OBS (salvar buffer de repetição, etc.)" 16 | WebpageControlLevel.Level.Advanced="Acesso avançado ao OBS (mudar cenas, iniciar ou interromper buffer de repetição, etc.)" 17 | WebpageControlLevel.Level.All="Acesso completo ao OBS (Iniciar/Parar transmissão sem aviso, etc.)" 18 | Error.Title="Não foi possível carregar essa página!" 19 | Error.Description="Verifique se o endereço está correto e se o site não está com problemas." 20 | Error.Retry="Clique aqui para tentar novamente" 21 | Error.Code="Erro: %1" 22 | ErrorCode.ERR_CONNECTION_REFUSED="O servidor recusou a conexão" 23 | ErrorCode.ERR_NAME_NOT_RESOLVED="Endereço IP do servidor não encontrado" 24 | ErrorCode.ERR_CONNECTION_TIMED_OUT="Conexão expirada" 25 | ErrorCode.ERR_FILE_NOT_FOUND="Arquivo não foi encontrado" 26 | ErrorCode.ERR_FAILED="Falha ao conectar" 27 | ErrorCode.ERR_NETWORK_CHANGED="Rede alterada" 28 | ErrorCode.ERR_SSL_VERSION_INTERFERENCE="Interferência na versão SSL. TLS 1.3 pode ser bloqueado ou modificado." 29 | ErrorCode.ERR_SSL_PROTOCOL_ERROR="Erro de protocolo SSL. Não foi possível fazer uma conexão segura." 30 | -------------------------------------------------------------------------------- /data/locale/pt-PT.ini: -------------------------------------------------------------------------------- 1 | LocalFile="Ficheiro local" 2 | Width="Largura" 3 | Height="Altura" 4 | CSS="CSS personalizada" 5 | ShutdownSourceNotVisible="Desligar fonte quando invisível" 6 | RefreshBrowserActive="Atualizar o navegador quando a cena se ativar" 7 | RefreshNoCache="Atualizar memória da página atual" 8 | RestartCEF="Reiniciar CEF" 9 | BrowserSource="Navegador" 10 | CustomFrameRate="Usar taxa de fotogramas personalizada" 11 | RerouteAudio="Controlar áudio via OBS" 12 | WebpageControlLevel="Permissões da página" 13 | WebpageControlLevel.Level.None="Sem acesso ao OBS" 14 | WebpageControlLevel.Level.ReadOnly="Acesso só leitura ao OBS" 15 | WebpageControlLevel.Level.Basic="Acesso básico ao OBS (guardar memória de repetição, etc.)" 16 | WebpageControlLevel.Level.Advanced="Acesso avançado ao OBS (mudar cenas, iniciar/parar memória de reprodução, etc.)" 17 | WebpageControlLevel.Level.All="Acesso completo ao OBS (iniciar/parar transmissão sem aviso, etc.)" 18 | Error.Title="Impossível carregar a página!" 19 | Error.Description="Verifique se o endereço está correto e se a página não tem problemas." 20 | Error.Retry="Clique aqui para tentar novamente" 21 | Error.Code="Erro: %1" 22 | ErrorCode.ERR_CONNECTION_REFUSED="O servidor recusou a ligação" 23 | ErrorCode.ERR_NAME_NOT_RESOLVED="Endereço IP do servidor não encontrado" 24 | ErrorCode.ERR_CONNECTION_TIMED_OUT="A ligação expirou" 25 | ErrorCode.ERR_FILE_NOT_FOUND="Ficheiro não encontrado" 26 | ErrorCode.ERR_FAILED="Falha ao ligar" 27 | ErrorCode.ERR_NETWORK_CHANGED="Rede alterada" 28 | ErrorCode.ERR_SSL_VERSION_INTERFERENCE="interferência na versão SSL. TLS 1.3 pode estar bloqueado ou modificado." 29 | ErrorCode.ERR_SSL_PROTOCOL_ERROR="Erro de protocolo SSL. Impossível fazer uma ligação segura." 30 | -------------------------------------------------------------------------------- /data/locale/ro-RO.ini: -------------------------------------------------------------------------------- 1 | LocalFile="Fișier local" 2 | Width="Lățime" 3 | Height="Înălțime" 4 | CSS="CSS personalizat" 5 | ShutdownSourceNotVisible="Închide sursa când nu este vizibilă" 6 | RefreshBrowserActive="Reîmprospătează browserul când scena devine activă" 7 | RefreshNoCache="Reîmprospătează memoria cache a paginii actuale" 8 | RestartCEF="Repornește CEF" 9 | CustomFrameRate="Folosește o frecvență de cadre personalizată" 10 | RerouteAudio="Controlează sistemul audio prin OBS" 11 | WebpageControlLevel="Permisiunile paginii" 12 | WebpageControlLevel.Level.None="Nu există acces la OBS" 13 | WebpageControlLevel.Level.ReadOnly="Accesul numai pentru citire la OBS" 14 | WebpageControlLevel.Level.Basic="Acces de bază la OBS (Salvați tamponul de reluare etc.)" 15 | WebpageControlLevel.Level.Advanced="Acces avansat la OBS (Schimbarea scenei, Start/Stop tampon reluare, etc.)" 16 | WebpageControlLevel.Level.All="Acces complet la OBS (Start/Stop transmisiune fără avertisment, etc.)" 17 | Error.Title="Nu s-a putut încărca acea pagină!" 18 | Error.Description="Asigurați-vă că adresa este corectă și că site-ul nu are probleme." 19 | Error.Retry="Click aici pentru a reîncerca" 20 | Error.Code="Eroare: %1" 21 | ErrorCode.ERR_CONNECTION_REFUSED="Serverul a refuzat conexiunea" 22 | ErrorCode.ERR_NAME_NOT_RESOLVED="Adresa IP a serverului nu a fost găsită" 23 | ErrorCode.ERR_CONNECTION_TIMED_OUT="Conexiunea a expirat" 24 | ErrorCode.ERR_FILE_NOT_FOUND="Fișier negăsit" 25 | ErrorCode.ERR_FAILED="Conectare nereușită" 26 | ErrorCode.ERR_NETWORK_CHANGED="Rețea schimbată" 27 | ErrorCode.ERR_SSL_VERSION_INTERFERENCE="Interferența versiunii SSL. TLS 1.3 poate fi blocată sau modificată." 28 | ErrorCode.ERR_SSL_PROTOCOL_ERROR="Eroare de protocol SSL. Nu s-a putut realiza o conexiune securizată." 29 | -------------------------------------------------------------------------------- /data/locale/ru-RU.ini: -------------------------------------------------------------------------------- 1 | LocalFile="Локальный файл" 2 | URL="Адрес URL" 3 | Width="Ширина" 4 | Height="Высота" 5 | CSS="CSS" 6 | ShutdownSourceNotVisible="Отключать, когда не видим" 7 | RefreshBrowserActive="Обновить браузер, когда сцена становится активной" 8 | RefreshNoCache="Обновить кэш текущей страницы" 9 | RestartCEF="Перезапустить CEF" 10 | BrowserSource="Браузер" 11 | CustomFrameRate="Использовать настраиваемую частоту кадров" 12 | RerouteAudio="Управление аудио через OBS" 13 | WebpageControlLevel="Разрешение страницы" 14 | WebpageControlLevel.Level.None="Нет доступа к OBS" 15 | WebpageControlLevel.Level.ReadOnly="Доступ к OBS только для чтения" 16 | WebpageControlLevel.Level.Basic="Базовый доступ к OBS (Сохранение буфер видео и т.д.)" 17 | WebpageControlLevel.Level.Advanced="Продвинутый доступ к OBS (Изменение сцен, Начало/Остановка буфера записи и т.д.)" 18 | WebpageControlLevel.Level.All="Полный доступ к OBS (Начало/Остановка прямого эфира без предупреждения и т.д.)" 19 | Error.Title="Не удалось загрузить эту страницу!" 20 | Error.Description="Проверьте правильность адреса и что сайт доступен." 21 | Error.Retry="Нажмите здесь, чтобы повторить попытку" 22 | Error.Code="Ошибка: %1" 23 | Error.URL="URL-адрес: %2" 24 | ErrorCode.ERR_CONNECTION_REFUSED="Сервер отклонил подключение" 25 | ErrorCode.ERR_NAME_NOT_RESOLVED="IP-адрес сервера не найден" 26 | ErrorCode.ERR_CONNECTION_TIMED_OUT="Время ожидания соединения истекло" 27 | ErrorCode.ERR_FILE_NOT_FOUND="Файл не найден" 28 | ErrorCode.ERR_FAILED="Не удалось подключиться" 29 | ErrorCode.ERR_NETWORK_CHANGED="Смена сети" 30 | ErrorCode.ERR_SSL_VERSION_INTERFERENCE="Вмешательство в версию SSL. Возможно TLS 1.3 заблокирован или модифицирован." 31 | ErrorCode.ERR_SSL_PROTOCOL_ERROR="Ошибка протокола SSL. Не удалось установить защищенное соединение." 32 | -------------------------------------------------------------------------------- /data/locale/si-LK.ini: -------------------------------------------------------------------------------- 1 | LocalFile="ස්ථානීය ගොනුව" 2 | URL="ඒ.ස.නි." 3 | Width="පළල" 4 | Height="උස" 5 | CSS="අභිරුචි සීඑස්එස්" 6 | BrowserSource="අතිරික්සුව" 7 | WebpageControlLevel.Level.None="ඕබීඑස් වෙත ප්‍රවේශය නැත" 8 | WebpageControlLevel.Level.ReadOnly="ඕබීඑස් වෙත කියවීමට-පමණි ප්‍රවේශය" 9 | Error.Title="පිටුව පූරණය කිරීමට නොහැකි විය!" 10 | Error.Retry="යළි උත්සාහයට ඔබන්න" 11 | Error.Code="දෝෂය: %1" 12 | Error.URL="ඒ.ස.නි.: %2" 13 | ErrorCode.ERR_FAILED="සම්බන්ධ වීමට අසමත් විය" 14 | ErrorCode.ERR_NETWORK_CHANGED="ජාලය වෙනස් විණි" 15 | -------------------------------------------------------------------------------- /data/locale/sk-SK.ini: -------------------------------------------------------------------------------- 1 | LocalFile="Lokálny súbor" 2 | URL="URL adresa" 3 | Width="Šírka" 4 | Height="Výška" 5 | CSS="Vlastné CSS" 6 | ShutdownSourceNotVisible="Vypnúť zdroj, keď nie je viditeľný" 7 | RefreshBrowserActive="Obnoviť prehliadač, keď sa scéna stane aktívna" 8 | RefreshNoCache="Vyčistiť medzi-pamäť aktuálnej stránky" 9 | RestartCEF="Reštartovať CEF" 10 | BrowserSource="Prehliadač" 11 | CustomFrameRate="Použiť vlastnú snímkovú rýchlosť" 12 | RerouteAudio="Ovládať zvuk cez OBS" 13 | WebpageControlLevel="Oprávnenia stránky" 14 | WebpageControlLevel.Level.None="Žiaden prístup k OBS" 15 | WebpageControlLevel.Level.ReadOnly="Prístup iba na čítanie k OBS" 16 | WebpageControlLevel.Level.Basic="Základný prístup k OBS (Uložiť záznam do pamäte, atď.)" 17 | WebpageControlLevel.Level.Advanced="Pokročilý prístup k OBS (Zmeniť scény, Začať/Zastaviť záznam do pamäte, atď.)" 18 | WebpageControlLevel.Level.All="Plný prístup k OBS (Začať/Zastaviť streamovanie bez varovania, atď.)" 19 | Error.Title="Nepodarilo sa načítať túto stránku!" 20 | Error.Description="Uistite sa, že adresa je správna a že stránka nemá problémy." 21 | Error.Retry="Ak to chcete skúsiť znova, kliknite sem" 22 | Error.Code="Chyba: %1" 23 | ErrorCode.ERR_CONNECTION_REFUSED="Server odmietol pripojenie" 24 | ErrorCode.ERR_NAME_NOT_RESOLVED="IP adresa servera nenájdená" 25 | ErrorCode.ERR_CONNECTION_TIMED_OUT="Vypršal časový limit pripojenia" 26 | ErrorCode.ERR_FILE_NOT_FOUND="Súbor nenájdený" 27 | ErrorCode.ERR_FAILED="Nepodarilo sa pripojiť" 28 | ErrorCode.ERR_NETWORK_CHANGED="Sieť zmenená" 29 | ErrorCode.ERR_SSL_VERSION_INTERFERENCE="Problém s SSL verziou. TLS 1.3 môže byť zablokovaná alebo upravená." 30 | ErrorCode.ERR_SSL_PROTOCOL_ERROR="Chyba SSL protokolu. Nebolo možné vytvoriť zabezpečené pripojenie." 31 | -------------------------------------------------------------------------------- /data/locale/sl-SI.ini: -------------------------------------------------------------------------------- 1 | LocalFile="Lokalna datoteka" 2 | Width="Širina" 3 | Height="Višina" 4 | FPS="sl./s" 5 | CSS="CSS po meri" 6 | ShutdownSourceNotVisible="Izklopi vir, ko ni viden" 7 | RefreshBrowserActive="Osveži brskalnik, ko prizor postane dejaven" 8 | RefreshNoCache="Osveži medpomnilnik trenutne strani" 9 | RestartCEF="Ponovno zaženi CEF" 10 | BrowserSource="Brskalnik" 11 | CustomFrameRate="Uporabi hitrost sličic po meri" 12 | RerouteAudio="Nadziraj zvok preko OBS-a" 13 | WebpageControlLevel="Dovoljenja strani" 14 | WebpageControlLevel.Level.None="Ni dostopa do OBS" 15 | WebpageControlLevel.Level.ReadOnly="Dostop do OBS je samo za branje" 16 | WebpageControlLevel.Level.Basic="Osnovni dostop do OBS (snemanje medpomnilnika za ponovitve, itd.)" 17 | WebpageControlLevel.Level.Advanced="Napredni dostop do OBS (spreminjanje scen, zagon/zaustavitev medpomnilnika s ponovitvami, itd.)" 18 | WebpageControlLevel.Level.All="Poln dostop do OBS (zagon in zaustavitev pretkoa brez opozoril, itd.)" 19 | Error.Title="Strani ni bilo mogoče naložiti!" 20 | Error.Description="Preverite pravilnost naslova strani in da stran nima težav." 21 | Error.Retry="Kliknite sem za ponoven poskus" 22 | Error.Code="Napaka: %1" 23 | Error.URL="URL naslov: %2" 24 | ErrorCode.ERR_CONNECTION_REFUSED="Strežnik je zavrnil povezavo" 25 | ErrorCode.ERR_NAME_NOT_RESOLVED="IP naslov strežnika ni bil najden" 26 | ErrorCode.ERR_CONNECTION_TIMED_OUT="Čas za povezovanje se je iztekel" 27 | ErrorCode.ERR_FILE_NOT_FOUND="Datoteke ni mogoče najti" 28 | ErrorCode.ERR_FAILED="Vzpostavljanje povezave ni uspelo" 29 | ErrorCode.ERR_NETWORK_CHANGED="Omrežje je bilo zamenjano" 30 | ErrorCode.ERR_SSL_VERSION_INTERFERENCE="Interferenca v SSL različici. TLS 1.3 je lahko blokiran ali spremenjen." 31 | ErrorCode.ERR_SSL_PROTOCOL_ERROR="Napaka v SSL protokolu. Varne povezave ni bilo mogoče vzpostaviti." 32 | -------------------------------------------------------------------------------- /data/locale/sr-CS.ini: -------------------------------------------------------------------------------- 1 | LocalFile="Lokalni fajl" 2 | URL="URL Adresa" 3 | Width="Širina" 4 | Height="Visina" 5 | CSS="Prilagođeni CSS" 6 | ShutdownSourceNotVisible="Isključi izvor kada nije vidljiv" 7 | RefreshBrowserActive="Osveži pretraživač kada scena postane aktivna" 8 | RefreshNoCache="Osveži keš memoriju trenutne stranice" 9 | RestartCEF="Pokreni ponovo CEF" 10 | BrowserSource="Pretraživač" 11 | CustomFrameRate="Koristi podešenu brzinu frejma" 12 | -------------------------------------------------------------------------------- /data/locale/sr-SP.ini: -------------------------------------------------------------------------------- 1 | LocalFile="Локални фајл" 2 | URL="URL адреса" 3 | Width="Ширина" 4 | Height="Висина" 5 | CSS="Прилагођени CSS" 6 | ShutdownSourceNotVisible="Искључи извор када није видљив" 7 | RefreshBrowserActive="Освежи претраживач када сцена постане активна" 8 | RefreshNoCache="Освежи кеш меморију тренутне странице" 9 | RestartCEF="Покрени поново CEF" 10 | BrowserSource="Претраживач" 11 | CustomFrameRate="Користи подешену брзину фрејма" 12 | -------------------------------------------------------------------------------- /data/locale/sv-SE.ini: -------------------------------------------------------------------------------- 1 | LocalFile="Lokal fil" 2 | Width="Bredd" 3 | Height="Höjd" 4 | FPS="Bildfrekvens" 5 | CSS="Anpassad CSS" 6 | ShutdownSourceNotVisible="Stäng ned källor som inte visas" 7 | RefreshBrowserActive="Uppdatera webbläsaren när scenen blir aktiv" 8 | RefreshNoCache="Uppdatera cachen för aktuell sida" 9 | RestartCEF="Uppdatera CEF" 10 | BrowserSource="Webbläsare" 11 | CustomFrameRate="Använd anpassad bildfrekvens" 12 | RerouteAudio="Kontrollera ljudet via OBS" 13 | WebpageControlLevel="Sidbehörigheter" 14 | WebpageControlLevel.Level.None="Ingen åtkomst till OBS" 15 | WebpageControlLevel.Level.ReadOnly="Skrivskyddad åtkomst till OBS" 16 | WebpageControlLevel.Level.Basic="Grundläggande åtkomst till OBS (spara reprisbuffert, etc.)" 17 | WebpageControlLevel.Level.Advanced="Avancerad åtkomst till OBS (ändra scener, starta/stoppa reprisbuffert, osv.)" 18 | WebpageControlLevel.Level.All="Full åtkomst till OBS (starta/stoppa strömmar utan förvarning, etc.)" 19 | Error.Title="Kunde inte ladda sidan!" 20 | Error.Description="Se till att adressen är korrekt, och att webbplatsen inte har problem." 21 | Error.Retry="Klicka här för att försöka igen" 22 | Error.Code="Fel: %1" 23 | ErrorCode.ERR_CONNECTION_REFUSED="Servern nekade anslutningen" 24 | ErrorCode.ERR_NAME_NOT_RESOLVED="Serverns IP-adress hittades inte" 25 | ErrorCode.ERR_CONNECTION_TIMED_OUT="Anslutningen tog för lång tid" 26 | ErrorCode.ERR_FILE_NOT_FOUND="Filen hittades inte" 27 | ErrorCode.ERR_FAILED="Det gick inte att ansluta" 28 | ErrorCode.ERR_NETWORK_CHANGED="Nätverket ändrades" 29 | ErrorCode.ERR_SSL_VERSION_INTERFERENCE="Versionskonflikt för SSL. TLS 1.3 kanske har blockerats eller ändrats." 30 | ErrorCode.ERR_SSL_PROTOCOL_ERROR="Protokollfel för SSL. Kunde inte skapa en säker anslutning." 31 | -------------------------------------------------------------------------------- /data/locale/szl-PL.ini: -------------------------------------------------------------------------------- 1 | LocalFile="Zbiōr lokalny" 2 | Width="Szyrokość" 3 | Height="Wysokość" 4 | CSS="Włosny CSS" 5 | ShutdownSourceNotVisible="Zawrzij zdrzōdło, kej je niywidzialne" 6 | RefreshBrowserActive="Ôdświyż przeziyroczka, kej bina je aktywowano" 7 | RefreshNoCache="Ôdświyż podrynczno spamiyńć teroźnyj zajty" 8 | RestartCEF="Resztartuj CEF" 9 | BrowserSource="Przeziyroczka" 10 | CustomFrameRate="Włosne ôpcyje FPS" 11 | RerouteAudio="Kōntroluj audio bez OBSa" 12 | Error.Title="Niy idzie zaladować zajty!" 13 | Error.Description="Dej pozōr, eli adresa je dobro, iże zajta tyż funguje dobrze." 14 | Error.Retry="Kliknij, coby sprōbować zaś" 15 | Error.Code="Feler: %1" 16 | ErrorCode.ERR_CONNECTION_REFUSED="Serwer ôdkozoł połōnczynio" 17 | ErrorCode.ERR_NAME_NOT_RESOLVED="Niy idzie znojść adresy IP ôd serwera" 18 | ErrorCode.ERR_CONNECTION_TIMED_OUT="Upłynōł limit czasu połōnczynio" 19 | ErrorCode.ERR_FILE_NOT_FOUND="Niy idzie znojść zbioru" 20 | ErrorCode.ERR_FAILED="Niy idzie sie połōnczyć" 21 | ErrorCode.ERR_NETWORK_CHANGED="Nec je zmiyniōny" 22 | -------------------------------------------------------------------------------- /data/locale/ta-IN.ini: -------------------------------------------------------------------------------- 1 | LocalFile="உள்நோக்குக் கோப்பு" 2 | Width="அகலம்" 3 | Height="உயரம்" 4 | CSS="தனிப்பயன் CSS" 5 | ShutdownSourceNotVisible="காண்பிக்கபடாதபோது நிறுத்தி வைக்க" 6 | RefreshBrowserActive="காண்பிக்கும்போது போது உலாவியைப் புதுப்பிக்கவும்" 7 | RefreshNoCache="தற்போதைய பக்கத்தின் தற்காலிக சேமிப்பை புதுப்பிக்கவும்" 8 | RestartCEF="CEP ஐ மறுதொடக்கம் செய்" 9 | BrowserSource="உலாவி" 10 | CustomFrameRate="தனிப்பயன் பிரேம் வீதத்தைப் பயன்படுத்தவும்" 11 | RerouteAudio="OBS மூலம் ஒலியைக் கட்டுப்படுத்து" 12 | WebpageControlLevel="பக்க அனுமதிகள்" 13 | WebpageControlLevel.Level.None="OBS க்கு அணுகல் இல்லை" 14 | -------------------------------------------------------------------------------- /data/locale/th-TH.ini: -------------------------------------------------------------------------------- 1 | LocalFile="ไฟล์ในเครื่อง" 2 | Width="ความกว้าง" 3 | Height="ความสูง" 4 | FPS="อัตราเฟรม" 5 | CSS="CSS ที่กำหนดเอง" 6 | ShutdownSourceNotVisible="วิดีโอจะหยุดทำงานถ้าคุณซ่อนแหล่งที่มา " 7 | RefreshBrowserActive="วิดีโอที่จะทำงานต่อไปแม้จะไม่ปรากฏบนหน้าจอ" 8 | RefreshNoCache="รีเฟรชแคชของหน้าปัจจุบัน" 9 | RestartCEF="รีสตาร์ท CEF" 10 | BrowserSource="เว็บเบราว์เซอร์" 11 | CustomFrameRate="ใช้อัตราเฟรมที่กำหนดเอง" 12 | RerouteAudio="ควบคุมเสียงผ่าน OBS" 13 | WebpageControlLevel="การอนุญาตเพจ" 14 | WebpageControlLevel.Level.None="ไม่มีการเข้าถึง OBS" 15 | WebpageControlLevel.Level.ReadOnly="การเข้าถึง OBS แบบอ่าน" 16 | WebpageControlLevel.Level.Basic="การเข้าถึง OBS ขั้นพื้นฐาน (บันทึก บัฟเฟอร์ การเล่นซ้ำ ฯลฯ )" 17 | WebpageControlLevel.Level.Advanced="การเข้าถึง OBS ขั้นสูง (เปลี่ยนฉาก บัฟเฟอร์ เริ่ม/หยุด เล่นซ้ำ ฯลฯ)" 18 | WebpageControlLevel.Level.All="เข้าถึง OBS อย่างเต็มรูปแบบ (เริ่ม/หยุด การสตรีม โดยไม่มีการแจ้งเตือน ฯลฯ)" 19 | Error.Title="ไม่สามารถโหลดหน้านี้ได้!" 20 | Error.Description="ตรวจสอบให้แน่ใจว่าที่อยู่ถูกต้อง และเว็บไซต์ไม่มีปัญหา" 21 | Error.Retry="คลิกเพื่อลองอีกครั้ง" 22 | Error.Code="ผิดพลาด: %1" 23 | ErrorCode.ERR_CONNECTION_REFUSED="เซิร์ฟเวอร์ปฏิเสธการเชื่อมต่อ" 24 | ErrorCode.ERR_NAME_NOT_RESOLVED="ไม่พบที่อยู่ IP ของเซิร์ฟเวอร์" 25 | ErrorCode.ERR_CONNECTION_TIMED_OUT="หมดเวลาการเชื่อมต่อ" 26 | ErrorCode.ERR_FILE_NOT_FOUND="ไม่พบไฟล์" 27 | ErrorCode.ERR_FAILED="การเชื่อมต่อล้มเหลว" 28 | ErrorCode.ERR_NETWORK_CHANGED="เปลี่ยนเครือข่าย" 29 | ErrorCode.ERR_SSL_VERSION_INTERFERENCE="การรบกวนเวอร์ชัน SSL TLS 1.3 อาจถูกบล็อกหรือแก้ไข" 30 | ErrorCode.ERR_SSL_PROTOCOL_ERROR="ข้อผิดพลาดของโปรโตคอล SSL ไม่สามารถทำการเชื่อมต่อที่ปลอดภัย" 31 | -------------------------------------------------------------------------------- /data/locale/tr-TR.ini: -------------------------------------------------------------------------------- 1 | LocalFile="Yerel dosya" 2 | Width="Genişlik" 3 | Height="Yükseklik" 4 | CSS="Özel CSS" 5 | ShutdownSourceNotVisible="Görünür değilken kaynağı kapat" 6 | RefreshBrowserActive="Sahne etkin olduğunda tarayıcıyı yenile" 7 | RefreshNoCache="Geçerli sayfanın önbelleğini yenile" 8 | RestartCEF="CEF'i Yeniden Başlat" 9 | BrowserSource="Tarayıcı" 10 | CustomFrameRate="Özel kare hızı kullan" 11 | RerouteAudio="OBS ile sesi kontrol etme" 12 | WebpageControlLevel="Sayfa İzinleri" 13 | WebpageControlLevel.Level.None="OBS'ye erişim yok" 14 | WebpageControlLevel.Level.ReadOnly="OBS'ye salt-okunur erişim" 15 | WebpageControlLevel.Level.Basic="OBS'ye basit erişim (Tekrar oynatma arabelleği kaybetme, vb.)" 16 | WebpageControlLevel.Level.Advanced="OBS'ye gelişmiş erişim (Sahne değiştirme, Tekrar oynatma arabelleğini durdurma/başlatma, vb.)" 17 | WebpageControlLevel.Level.All="OBS'ye tam erişim (Uyarı vermeden yayın başlatma/durdurma, vb.)" 18 | Error.Title="Sayfa yüklenemedi!" 19 | Error.Description="Adresin doğruluğunu ve sitenin sorunları olmadığından emin olun." 20 | Error.Retry="Yeniden denemek için buraya tıklayın" 21 | Error.Code="Hata: %1" 22 | ErrorCode.ERR_CONNECTION_REFUSED="Sunucu bağlantıyı reddetti." 23 | ErrorCode.ERR_NAME_NOT_RESOLVED="Sunucunun IP adresi bulunamadı" 24 | ErrorCode.ERR_CONNECTION_TIMED_OUT="Bağlantı zaman aşımına uğradı" 25 | ErrorCode.ERR_FILE_NOT_FOUND="Dosya bulunamadı" 26 | ErrorCode.ERR_FAILED="Bağlantı kurulamadı" 27 | ErrorCode.ERR_NETWORK_CHANGED="Ağ değişti" 28 | ErrorCode.ERR_SSL_VERSION_INTERFERENCE="SSL versiyon arayüzü. TLS 1.3 engellenmiş veya düzenlenmiş olabilir." 29 | ErrorCode.ERR_SSL_PROTOCOL_ERROR="SSL protokol hatası. Güvenli iletişim sağlanamadı." 30 | -------------------------------------------------------------------------------- /data/locale/uk-UA.ini: -------------------------------------------------------------------------------- 1 | LocalFile="Локальний файл" 2 | URL="URL-адреса" 3 | Width="Ширина" 4 | Height="Висота" 5 | CSS="Власний CSS" 6 | ShutdownSourceNotVisible="Вимикати джерело, коли воно не видиме" 7 | RefreshBrowserActive="Оновити браузер, коли сцена стає активною" 8 | RefreshNoCache="Оновити кеш поточної сторінки" 9 | RestartCEF="Перезапустити CEF" 10 | BrowserSource="Браузер" 11 | CustomFrameRate="Використовувати власну частоту кадрів" 12 | RerouteAudio="Керувати звуком через OBS" 13 | WebpageControlLevel="Дозволи сторінки" 14 | WebpageControlLevel.Level.None="Немає доступу до OBS" 15 | WebpageControlLevel.Level.ReadOnly="Доступ до OBS лише для читання" 16 | WebpageControlLevel.Level.Basic="Базовий доступ до OBS (Зберегти буфер повтору тощо)" 17 | WebpageControlLevel.Level.Advanced="Розширений доступ до OBS (Змінити сцени, Запуск/зупинка буферу повторів тощо)" 18 | WebpageControlLevel.Level.All="Повний доступ до OBS (Запуск/зупинка трансляції без попереджень тощо)" 19 | Error.Title="Не вдалося завантажити цю сторінку!" 20 | Error.Description="Переконайтеся, що адреса правильна, а сайт не має проблем." 21 | Error.Retry="Натисніть сюди, щоб повторити спробу" 22 | Error.Code="Помилка: %1" 23 | ErrorCode.ERR_CONNECTION_REFUSED="Сервер відхилив з’єднання" 24 | ErrorCode.ERR_NAME_NOT_RESOLVED="IP-адреси сервера не знайдено" 25 | ErrorCode.ERR_CONNECTION_TIMED_OUT="Час очікування з'єднання минув" 26 | ErrorCode.ERR_FILE_NOT_FOUND="Файл не знайдено" 27 | ErrorCode.ERR_FAILED="Не вдалося з'єднатися" 28 | ErrorCode.ERR_NETWORK_CHANGED="Мережу змінено" 29 | ErrorCode.ERR_SSL_VERSION_INTERFERENCE="Конфлікт версій SSL. Можливе блокування або змінення TLS 1.3." 30 | ErrorCode.ERR_SSL_PROTOCOL_ERROR="Помилка протоколу SSL. Не вдалося здійснити безпечне з'єднання." 31 | -------------------------------------------------------------------------------- /data/locale/vi-VN.ini: -------------------------------------------------------------------------------- 1 | LocalFile="Tập tin cục bộ" 2 | Width="Chiều rộng" 3 | Height="Chiều cao" 4 | CSS="CSS tùy chỉnh" 5 | ShutdownSourceNotVisible="Tắt máy khi không hiển thị" 6 | RefreshBrowserActive="Làm mới trình duyệt khi cảnh bắt đầu hoạt động" 7 | RefreshNoCache="Làm mới cache trang hiện tại" 8 | RestartCEF="Khởi động lại CEF" 9 | BrowserSource="Trình duyệt" 10 | CustomFrameRate="Dùng tốc độ khung hình tùy chọn" 11 | RerouteAudio="Kiểm soát âm thanh qua OBS" 12 | WebpageControlLevel.Level.None="Không được truy cập OBS" 13 | WebpageControlLevel.Level.ReadOnly="Truy cập chỉ-đọc vào OBS" 14 | WebpageControlLevel.Level.Basic="Truy cập cơ bản vào OBS (Lưu bộ đệm xem lại, v.v..)" 15 | WebpageControlLevel.Level.Advanced="Truy cập nâng cao vào OBS (Thay đổi cảnh, Bắt đầu/Dừng bộ đệm phát lại, v.v..)" 16 | WebpageControlLevel.Level.All="Truy cập toàn bộ vào OBS (Bắt đầu/Dừng phát luồng mà không có cảnh báo, v.v..)" 17 | Error.Title="Không thể tải trang này!" 18 | Error.Description="Hãy đảm bảo địa chỉ đúng, và trang đó không gặp vấn đề." 19 | Error.Retry="Nhấn vào đây để tìm kiếm" 20 | Error.Code="Lỗi: %1" 21 | ErrorCode.ERR_CONNECTION_REFUSED="Máy chủ đã từ chối kết nối" 22 | ErrorCode.ERR_NAME_NOT_RESOLVED="Không tìm thấy địa chỉ IP của máy chủ" 23 | ErrorCode.ERR_CONNECTION_TIMED_OUT="Kết nối đã hết hạn" 24 | ErrorCode.ERR_FILE_NOT_FOUND="Không tìm thấy tệp" 25 | ErrorCode.ERR_FAILED="Không thể kết nối" 26 | ErrorCode.ERR_NETWORK_CHANGED="Mạng đã bị thay đổi" 27 | ErrorCode.ERR_SSL_VERSION_INTERFERENCE="Có sự can thiệp phiên bản SSL. TLS 1.3 có lẽ đã bị khoá lại hoặc chỉnh sửa." 28 | ErrorCode.ERR_SSL_PROTOCOL_ERROR="Lỗi giao thức SSL. Không thể tạo một kết nối an toàn." 29 | -------------------------------------------------------------------------------- /data/locale/zh-CN.ini: -------------------------------------------------------------------------------- 1 | LocalFile="本地文件" 2 | Width="宽度" 3 | Height="高度" 4 | CSS="自定义 CSS" 5 | ShutdownSourceNotVisible="不可见时关闭源" 6 | RefreshBrowserActive="场景变为活动状态时,刷新浏览器" 7 | RefreshNoCache="刷新当前页面缓存" 8 | RestartCEF="重启 CEF" 9 | BrowserSource="浏览器" 10 | CustomFrameRate="使用自定义帧率" 11 | RerouteAudio="通过 OBS 控制音频" 12 | WebpageControlLevel="页面权限" 13 | WebpageControlLevel.Level.None="没有访问OBS的权限" 14 | WebpageControlLevel.Level.ReadOnly="OBS 的只读权限" 15 | WebpageControlLevel.Level.Basic="OBS的基本访问权限(保存回放缓冲区等)" 16 | WebpageControlLevel.Level.Advanced="OBS的高级访问权限 (更改场景,启动或停止播放缓冲区,等等)" 17 | WebpageControlLevel.Level.All="OBS的完全访问权限(启动或停止串流时不显示警告等)" 18 | Error.Title="无法加载该页面!" 19 | Error.Description="请确保地址正确,且网站没有问题。" 20 | Error.Retry="点此重试" 21 | Error.Code="错误:%1" 22 | ErrorCode.ERR_CONNECTION_REFUSED="服务器拒绝了连接" 23 | ErrorCode.ERR_NAME_NOT_RESOLVED="找不到服务器 IP 地址" 24 | ErrorCode.ERR_CONNECTION_TIMED_OUT="连接超时" 25 | ErrorCode.ERR_FILE_NOT_FOUND="找不到文件" 26 | ErrorCode.ERR_FAILED="连接失败" 27 | ErrorCode.ERR_NETWORK_CHANGED="发生网络变化" 28 | ErrorCode.ERR_SSL_VERSION_INTERFERENCE="SSL 版本干扰问题。TLS 1.3 可能被阻止或修改。" 29 | ErrorCode.ERR_SSL_PROTOCOL_ERROR="SSL 协议错误。无法建立安全连接。" 30 | -------------------------------------------------------------------------------- /data/locale/zh-TW.ini: -------------------------------------------------------------------------------- 1 | LocalFile="本機檔案" 2 | URL="網址" 3 | Width="寬度" 4 | Height="高度" 5 | FPS="FPS (影格率)" 6 | CSS="自訂 CSS" 7 | ShutdownSourceNotVisible="不可見時關閉來源" 8 | RefreshBrowserActive="取得焦點時更新瀏覽器" 9 | RefreshNoCache="更新當前頁面快取" 10 | RestartCEF="重新啟動 CEF" 11 | BrowserSource="瀏覽器" 12 | CustomFrameRate="使用自訂的畫面速率" 13 | RerouteAudio="使用 OBS 控制音訊" 14 | WebpageControlLevel="頁面權限" 15 | WebpageControlLevel.Level.None="沒有存取 OBS 的權限" 16 | WebpageControlLevel.Level.ReadOnly="對 OBS 只有唯讀權限" 17 | WebpageControlLevel.Level.Basic="對 OBS 只有基本存取權限(重放緩衝區等)" 18 | WebpageControlLevel.Level.Advanced="對 OBS 有進階存取權限(切換場景、開始或停止播放緩衝區等)" 19 | WebpageControlLevel.Level.All="對 OBS 有完整存取權限(逕行開始或停止串流而不先警告等等)" 20 | Error.Title="無法載入頁面!" 21 | Error.Description="請確定網址是否正確,且網站沒有出狀況。" 22 | Error.Retry="按此重試" 23 | Error.Code="錯誤:%1" 24 | Error.URL="URL:%2" 25 | ErrorCode.ERR_CONNECTION_REFUSED="伺服器拒絕連線" 26 | ErrorCode.ERR_NAME_NOT_RESOLVED="找不到伺服器的 IP 地址" 27 | ErrorCode.ERR_CONNECTION_TIMED_OUT="連線逾時" 28 | ErrorCode.ERR_FILE_NOT_FOUND="找不到檔案" 29 | ErrorCode.ERR_FAILED="無法連線" 30 | ErrorCode.ERR_NETWORK_CHANGED="網路已變更" 31 | ErrorCode.ERR_SSL_VERSION_INTERFERENCE="SSL 版本發生干擾。TLS 1.3 可能已經被封鎖或修改過。" 32 | ErrorCode.ERR_SSL_PROTOCOL_ERROR="SSL 協定通訊失敗。無法建立安全連線。" 33 | -------------------------------------------------------------------------------- /deps/base64/.clang-format: -------------------------------------------------------------------------------- 1 | Language: Cpp 2 | SortIncludes: false 3 | DisableFormat: true 4 | -------------------------------------------------------------------------------- /deps/base64/base64.cpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StreamElements/obs-browser/86ff8434f1f757ca7909be37e07f0d2bdcb7f586/deps/base64/base64.cpp -------------------------------------------------------------------------------- /deps/base64/base64.hpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | std::string base64_encode(unsigned char const*, unsigned int len); 4 | std::string base64_decode(std::string const& s); 5 | 6 | static inline std::string base64_encode(const char *str, unsigned int len) 7 | { 8 | return base64_encode((unsigned const char *)str, len); 9 | } 10 | 11 | static inline std::string base64_encode(const std::string &str) 12 | { 13 | return base64_encode(str.c_str(), (unsigned int)str.size()); 14 | } 15 | -------------------------------------------------------------------------------- /deps/json11/.clang-format: -------------------------------------------------------------------------------- 1 | Language: Cpp 2 | SortIncludes: false 3 | DisableFormat: true 4 | -------------------------------------------------------------------------------- /deps/json11/LICENSE.txt: -------------------------------------------------------------------------------- 1 | Copyright (c) 2013 Dropbox, Inc. 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 | THE SOFTWARE. 20 | -------------------------------------------------------------------------------- /deps/obs-websocket-api/.clang-format: -------------------------------------------------------------------------------- 1 | Language: Cpp 2 | SortIncludes: false 3 | DisableFormat: true 4 | -------------------------------------------------------------------------------- /deps/wide-string.cpp: -------------------------------------------------------------------------------- 1 | /****************************************************************************** 2 | Copyright (C) 2018 by Hugh Bailey ("Jim") 3 | 4 | This program is free software: you can redistribute it and/or modify 5 | it under the terms of the GNU General Public License as published by 6 | the Free Software Foundation, either version 2 of the License, or 7 | (at your option) any later version. 8 | 9 | This program is distributed in the hope that it will be useful, 10 | but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | GNU General Public License for more details. 13 | 14 | You should have received a copy of the GNU General Public License 15 | along with this program. If not, see . 16 | ******************************************************************************/ 17 | 18 | #include "wide-string.hpp" 19 | #include 20 | #include 21 | 22 | using namespace std; 23 | 24 | wstring to_wide(const char *utf8) 25 | { 26 | if (!utf8 || !*utf8) 27 | return wstring(); 28 | 29 | size_t isize = strlen(utf8); 30 | size_t osize = os_utf8_to_wcs(utf8, isize, nullptr, 0); 31 | 32 | if (!osize) 33 | return wstring(); 34 | 35 | wstring wide; 36 | wide.resize(osize); 37 | os_utf8_to_wcs(utf8, isize, &wide[0], osize + 1); 38 | return wide; 39 | } 40 | 41 | wstring to_wide(const std::string &utf8) 42 | { 43 | if (utf8.empty()) 44 | return wstring(); 45 | 46 | size_t osize = os_utf8_to_wcs(utf8.c_str(), utf8.size(), nullptr, 0); 47 | 48 | if (!osize) 49 | return wstring(); 50 | 51 | wstring wide; 52 | wide.resize(osize); 53 | os_utf8_to_wcs(utf8.c_str(), utf8.size(), &wide[0], osize + 1); 54 | return wide; 55 | } 56 | -------------------------------------------------------------------------------- /deps/wide-string.hpp: -------------------------------------------------------------------------------- 1 | /****************************************************************************** 2 | Copyright (C) 2018 by Hugh Bailey ("Jim") 3 | 4 | This program is free software: you can redistribute it and/or modify 5 | it under the terms of the GNU General Public License as published by 6 | the Free Software Foundation, either version 2 of the License, or 7 | (at your option) any later version. 8 | 9 | This program is distributed in the hope that it will be useful, 10 | but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | GNU General Public License for more details. 13 | 14 | You should have received a copy of the GNU General Public License 15 | along with this program. If not, see . 16 | ******************************************************************************/ 17 | 18 | #pragma once 19 | 20 | #include 21 | 22 | extern std::wstring to_wide(const char *utf8); 23 | extern std::wstring to_wide(const std::string &utf8); 24 | -------------------------------------------------------------------------------- /formatcode.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | # Original source https://github.com/Project-OSRM/osrm-backend/blob/master/scripts/format.sh 3 | 4 | set +x 5 | set -o errexit 6 | set -o pipefail 7 | set -o nounset 8 | 9 | # Runs the Clang Formatter in parallel on the code base. 10 | # Return codes: 11 | # - 1 there are files to be formatted 12 | # - 0 everything looks fine 13 | 14 | # Get CPU count 15 | OS=$(uname) 16 | NPROC=1 17 | if [[ $OS = "Linux" || $OS = "Darwin" ]] ; then 18 | NPROC=$(getconf _NPROCESSORS_ONLN) 19 | fi 20 | 21 | # Discover clang-format 22 | if type clang-format-12 2> /dev/null ; then 23 | CLANG_FORMAT=clang-format-12 24 | elif type clang-format-10 2> /dev/null ; then 25 | CLANG_FORMAT=clang-format-10 26 | elif type clang-format-8 2> /dev/null ; then 27 | CLANG_FORMAT=clang-format-8 28 | else 29 | CLANG_FORMAT=clang-format 30 | fi 31 | 32 | find . -type d -type f -o -name '*.h' -or -name '*.hpp' -or -name '*.m' -or -name '*.mm' -or -name '*.c' -or -name '*.cpp' \ 33 | | xargs -I{} -P ${NPROC} ${CLANG_FORMAT} -i -style=file -fallback-style=none {} -------------------------------------------------------------------------------- /helper-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleDisplayName 8 | ${EXECUTABLE_NAME} 9 | CFBundleExecutable 10 | ${EXECUTABLE_NAME} 11 | CFBundleIdentifier 12 | com.obsproject.obs-studio.helper${BUNDLE_ID_SUFFIX} 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | ${PRODUCT_NAME} 17 | CFBundlePackageType 18 | APPL 19 | CFBundleSignature 20 | ???? 21 | LSEnvironment 22 | 23 | MallocNanoZone 24 | 0 25 | 26 | LSFileQuarantineEnabled 27 | 28 | LSMinimumSystemVersion 29 | 10.13.0 30 | LSUIElement 31 | 1 32 | NSSupportsAutomaticGraphicsSwitching 33 | 34 | 35 | -------------------------------------------------------------------------------- /macutil.mm: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | bool atLeast10_15(void) 4 | { 5 | NSProcessInfo *processInfo = [[NSProcessInfo alloc] init]; 6 | bool atLeast = [processInfo 7 | isOperatingSystemAtLeastVersion:(NSOperatingSystemVersion){ 8 | 10, 15, 0}]; 9 | [processInfo release]; 10 | 11 | return atLeast; 12 | } -------------------------------------------------------------------------------- /obs-browser-page.manifest: -------------------------------------------------------------------------------- 1 | 2 | 3 | OBS Browser Page (CEF) 4 | 5 | 6 | 7 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /obs-browser-page_autogen/include_RelWithDebInfo/EWIEGA46WW/moc_browser-app.cpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StreamElements/obs-browser/86ff8434f1f757ca7909be37e07f0d2bdcb7f586/obs-browser-page_autogen/include_RelWithDebInfo/EWIEGA46WW/moc_browser-app.cpp -------------------------------------------------------------------------------- /obs-browser-page_autogen/mocs_compilation.cpp: -------------------------------------------------------------------------------- 1 | // This file is autogenerated. Changes will be overwritten. 2 | #include 3 | -------------------------------------------------------------------------------- /obs-browser-source-audio.cpp: -------------------------------------------------------------------------------- 1 | /****************************************************************************** 2 | Copyright (C) 2019 by Hugh Bailey ("Jim") 3 | 4 | This program is free software: you can redistribute it and/or modify 5 | it under the terms of the GNU General Public License as published by 6 | the Free Software Foundation, either version 2 of the License, or 7 | (at your option) any later version. 8 | 9 | This program is distributed in the hope that it will be useful, 10 | but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | GNU General Public License for more details. 13 | 14 | You should have received a copy of the GNU General Public License 15 | along with this program. If not, see . 16 | ******************************************************************************/ 17 | 18 | #include "obs-browser-source.hpp" 19 | #if CHROME_VERSION_BUILD < 4103 20 | void BrowserSource::EnumAudioStreams(obs_source_enum_proc_t cb, void *param) 21 | { 22 | std::lock_guard lock(audio_sources_mutex); 23 | for (obs_source_t *audio_source : audio_sources) { 24 | cb(source, audio_source, param); 25 | } 26 | } 27 | 28 | static inline void mix_audio(float *__restrict p_out, 29 | const float *__restrict p_in, size_t pos, 30 | size_t count) 31 | { 32 | float *__restrict out = p_out; 33 | const float *__restrict in = p_in + pos; 34 | const float *__restrict end = in + count; 35 | 36 | while (in < end) 37 | *out++ += *in++; 38 | } 39 | 40 | bool BrowserSource::AudioMix(uint64_t *ts_out, 41 | struct audio_output_data *audio_output, 42 | size_t channels, size_t sample_rate) 43 | { 44 | uint64_t timestamp = 0; 45 | struct obs_source_audio_mix child_audio; 46 | 47 | std::lock_guard lock(audio_sources_mutex); 48 | for (obs_source_t *s : audio_sources) { 49 | if (!obs_source_audio_pending(s)) { 50 | uint64_t source_ts = obs_source_get_audio_timestamp(s); 51 | 52 | if (source_ts && (!timestamp || source_ts < timestamp)) 53 | timestamp = source_ts; 54 | } 55 | } 56 | 57 | if (!timestamp) 58 | return false; 59 | 60 | for (obs_source_t *s : audio_sources) { 61 | uint64_t source_ts; 62 | size_t pos, count; 63 | 64 | if (obs_source_audio_pending(s)) { 65 | continue; 66 | } 67 | 68 | source_ts = obs_source_get_audio_timestamp(s); 69 | if (!source_ts) { 70 | continue; 71 | } 72 | 73 | pos = (size_t)ns_to_audio_frames(sample_rate, 74 | source_ts - timestamp); 75 | count = AUDIO_OUTPUT_FRAMES - pos; 76 | 77 | obs_source_get_audio_mix(s, &child_audio); 78 | for (size_t ch = 0; ch < channels; ch++) { 79 | float *out = audio_output->data[ch]; 80 | float *in = child_audio.output[0].data[ch]; 81 | 82 | mix_audio(out, in, pos, count); 83 | } 84 | } 85 | 86 | *ts_out = timestamp; 87 | return true; 88 | } 89 | #endif 90 | -------------------------------------------------------------------------------- /obs-browser-streamelements-restore-script-host_autogen/mocs_compilation.cpp: -------------------------------------------------------------------------------- 1 | // This file is autogenerated. Changes will be overwritten. 2 | // No files found that require moc or the moc files are included 3 | enum some_compilers { need_more_than_nothing }; 4 | -------------------------------------------------------------------------------- /obs-browser_autogen/include_RelWithDebInfo/EWIEGA46WW/moc_browser-app.cpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StreamElements/obs-browser/86ff8434f1f757ca7909be37e07f0d2bdcb7f586/obs-browser_autogen/include_RelWithDebInfo/EWIEGA46WW/moc_browser-app.cpp -------------------------------------------------------------------------------- /obs-browser_autogen/mocs_compilation.cpp: -------------------------------------------------------------------------------- 1 | // This file is autogenerated. Changes will be overwritten. 2 | #include 3 | #include <2M4IF6KQHC/moc_browser-panel-internal.cpp> 4 | #include <2M4IF6KQHC/moc_browser-panel.cpp> 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | -------------------------------------------------------------------------------- /panel/browser-panel-internal.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | #include 5 | #include "browser-panel.hpp" 6 | #include "cef-headers.hpp" 7 | 8 | #include 9 | #include 10 | 11 | struct PopupWhitelistInfo { 12 | std::string url; 13 | QPointer obj; 14 | 15 | inline PopupWhitelistInfo(const std::string &url_, QObject *obj_) 16 | : url(url_), obj(obj_) 17 | { 18 | } 19 | }; 20 | 21 | extern std::mutex popup_whitelist_mutex; 22 | extern std::vector popup_whitelist; 23 | extern std::vector forced_popups; 24 | 25 | /* ------------------------------------------------------------------------- */ 26 | 27 | class QCefWidgetInternal : public QCefWidget { 28 | Q_OBJECT 29 | 30 | public: 31 | QCefWidgetInternal(QWidget *parent, const std::string &url, 32 | CefRefPtr rqc); 33 | ~QCefWidgetInternal(); 34 | 35 | CefRefPtr cefBrowser; 36 | std::string url; 37 | std::string script; 38 | CefRefPtr rqc; 39 | QTimer timer; 40 | #ifndef __APPLE__ 41 | QPointer window; 42 | QPointer container; 43 | #endif 44 | bool allowAllPopups_ = false; 45 | 46 | virtual void resizeEvent(QResizeEvent *event) override; 47 | virtual void showEvent(QShowEvent *event) override; 48 | virtual QPaintEngine *paintEngine() const override; 49 | 50 | virtual void setURL(const std::string &url) override; 51 | virtual void setStartupScript(const std::string &script) override; 52 | virtual void allowAllPopups(bool allow) override; 53 | virtual void closeBrowser() override; 54 | virtual void reloadPage() override; 55 | 56 | void Resize(); 57 | 58 | #ifdef __linux__ 59 | private: 60 | bool needsDeleteXdndProxy = true; 61 | void unsetToplevelXdndProxy(); 62 | #endif 63 | 64 | public slots: 65 | void Init(); 66 | }; 67 | -------------------------------------------------------------------------------- /streamelements/StreamElementsAnalyticsEventsManager.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "StreamElementsUtils.hpp" 4 | #include "deps/moodycamel/concurrentqueue.h" 5 | #include "deps/moodycamel/blockingconcurrentqueue.h" 6 | #include "json11/json11.hpp" 7 | 8 | #include 9 | #include 10 | #include 11 | 12 | #include 13 | 14 | class StreamElementsAnalyticsEventsManager 15 | { 16 | public: 17 | StreamElementsAnalyticsEventsManager(size_t numWorkers = 4); 18 | ~StreamElementsAnalyticsEventsManager(); 19 | 20 | void trackSynchronousEvent(const char* eventName, json11::Json::object props = json11::Json::object{}) { 21 | if (!eventName) { 22 | return; 23 | } 24 | 25 | std::string event = std::string("OBS.Live Plugin: ") + eventName; 26 | 27 | AddRawEvent(event.c_str(), props, true); 28 | } 29 | 30 | void trackEvent(const char* eventName, json11::Json::object props = json11::Json::object{}) { 31 | if (!eventName) { 32 | return; 33 | } 34 | 35 | std::string event = std::string("OBS.Live Plugin: ") + eventName; 36 | 37 | AddRawEvent(event.c_str(), props, false); 38 | } 39 | 40 | void trackDockWidgetEvent(QDockWidget* widget, const char* eventName, json11::Json::object props = json11::Json::object{}) 41 | { 42 | if (!widget || !eventName) { 43 | return; 44 | } 45 | 46 | std::string event = std::string("DockWidget: ") + widget->windowTitle().toStdString() + ": " + std::string(eventName); 47 | 48 | trackEvent(event.c_str(), props); 49 | } 50 | 51 | std::string identity() { return m_identity; } 52 | std::string sessionId() { return m_sessionId; } 53 | 54 | protected: 55 | typedef std::function task_queue_item_t; 56 | 57 | void Enqueue(task_queue_item_t task); 58 | void AddRawEvent(const char* eventName, json11::Json::object propertiesJson = json11::Json::object{}, bool synchronous = false); 59 | 60 | private: 61 | uint64_t m_startTime; 62 | uint64_t m_prevEventTime; 63 | std::string m_appId; 64 | std::string m_sessionId; 65 | std::string m_identity; 66 | 67 | moodycamel::BlockingConcurrentQueue m_taskQueue; 68 | bool m_taskConsumersKeepRunning; 69 | std::vector m_taskConsumers; 70 | }; 71 | -------------------------------------------------------------------------------- /streamelements/StreamElementsAsyncTaskQueue.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | 9 | /// 10 | // Asynchronous task queue processed by a worker thread 11 | // 12 | class StreamElementsAsyncTaskQueue 13 | { 14 | private: 15 | /// 16 | // Internal class, describes a single task in the queue 17 | // 18 | class Task 19 | { 20 | public: 21 | /// 22 | // Class constructor 23 | // 24 | // @param task_proc Task callback 25 | // @param args Task callback argument 26 | // 27 | Task(void(*task_proc)(void*), void* args) : 28 | task_proc(task_proc), 29 | args(args) 30 | { 31 | } 32 | 33 | // Task callback 34 | void(*task_proc)(void*); 35 | 36 | // Task callback arg 37 | void* args; 38 | }; 39 | 40 | private: 41 | // Task queue 42 | std::vector m_queue; 43 | 44 | // Task queue lock mutex 45 | pthread_mutex_t m_dispatchLock; 46 | 47 | // This event will be raised when an item is added to the queue 48 | os_event_t *m_dispatchEvent; 49 | 50 | // This event will be raised when the worker thread stops 51 | os_event_t *m_doneEvent; 52 | 53 | // Worker thread 54 | pthread_t m_worker_thread; 55 | 56 | // The worker thread will be running while the value of this variable is true 57 | bool m_continue_running; 58 | 59 | // Thread label 60 | std::string m_label; 61 | 62 | // Is currently busy? 63 | bool m_asyncBusy = false; 64 | 65 | public: 66 | /// 67 | // Class constructor 68 | // 69 | StreamElementsAsyncTaskQueue(const char* const label = nullptr); 70 | 71 | /// 72 | // Class destructor 73 | // 74 | ~StreamElementsAsyncTaskQueue(); 75 | 76 | /// 77 | // Add task to the processing queue 78 | // 79 | // @param task_proc Task callback 80 | // @param args Task argument 81 | // 82 | void Enqueue(void(*task_proc)(void*), void* args); 83 | 84 | /// 85 | // Add task to the processing queue 86 | // 87 | // @param task_proc Task callback 88 | // 89 | void Enqueue(std::function task_proc); 90 | 91 | /// 92 | // Remove all pending tasks 93 | // 94 | void RemoveAll(); 95 | 96 | /// 97 | // Is busy? 98 | // 99 | bool IsBusy() 100 | { 101 | // Lock queue access mutex 102 | pthread_mutex_lock(&m_dispatchLock); 103 | 104 | bool result = m_asyncBusy; 105 | 106 | // Unlock queue access mutex 107 | pthread_mutex_unlock(&m_dispatchLock); 108 | 109 | return result; 110 | } 111 | }; 112 | -------------------------------------------------------------------------------- /streamelements/StreamElementsBackupManager.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "cef-headers.hpp" 4 | #include 5 | 6 | class StreamElementsBackupManager 7 | { 8 | public: 9 | StreamElementsBackupManager(); 10 | ~StreamElementsBackupManager(); 11 | 12 | public: 13 | void 14 | QueryLocalBackupPackageReferencedFiles(CefRefPtr input, 15 | CefRefPtr &output); 16 | 17 | void CreateLocalBackupPackage(CefRefPtr input, 18 | CefRefPtr &output); 19 | 20 | void QueryBackupPackageContent(CefRefPtr input, 21 | CefRefPtr &output); 22 | 23 | void RestoreBackupPackageContent(CefRefPtr input, 24 | CefRefPtr &output); 25 | 26 | private: 27 | std::recursive_mutex m_mutex; 28 | }; 29 | -------------------------------------------------------------------------------- /streamelements/StreamElementsBandwidthTestManager.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "StreamElementsBandwidthTestClient.hpp" 4 | 5 | #include "../cef-headers.hpp" 6 | 7 | #include 8 | 9 | class StreamElementsBandwidthTestManager 10 | { 11 | public: 12 | StreamElementsBandwidthTestManager(); 13 | virtual ~StreamElementsBandwidthTestManager(); 14 | 15 | bool BeginBandwidthTest(CefRefPtr settingsValue, CefRefPtr serversValue, CefRefPtr browser); 16 | CefRefPtr EndBandwidthTest(CefRefPtr options); 17 | CefRefPtr GetBandwidthTestStatus(); 18 | 19 | private: 20 | std::mutex m_mutex; 21 | 22 | bool m_isTestInProgress; 23 | StreamElementsBandwidthTestClient* m_client = new StreamElementsBandwidthTestClient(); 24 | 25 | std::vector m_last_test_servers; 26 | std::vector m_last_test_results; 27 | }; 28 | -------------------------------------------------------------------------------- /streamelements/StreamElementsBrowserDialog.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | 5 | #include "cef-headers.hpp" 6 | 7 | #include 8 | 9 | #include "StreamElementsUtils.hpp" 10 | #include "StreamElementsBrowserWidget.hpp" 11 | 12 | class StreamElementsDialogApiMessageHandler; 13 | 14 | class StreamElementsBrowserDialog: public QDialog 15 | { 16 | friend StreamElementsDialogApiMessageHandler; 17 | 18 | public: 19 | StreamElementsBrowserDialog(QWidget* parent, std::string url, std::string executeJavaScriptOnLoad, bool isIncognito); 20 | ~StreamElementsBrowserDialog(); 21 | 22 | std::string result() { return m_result; } 23 | 24 | public Q_SLOTS: 25 | virtual int exec() override; 26 | 27 | private: 28 | StreamElementsBrowserWidget* m_browser; 29 | std::string m_result; 30 | 31 | std::string m_url; 32 | std::string m_executeJavaScriptOnLoad; 33 | 34 | bool m_isIncognito = false; 35 | }; 36 | -------------------------------------------------------------------------------- /streamelements/StreamElementsBrowserMessageHandler.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "../cef-headers.hpp" 4 | 5 | class StreamElementsBrowserMessageHandler: 6 | public CefBaseRefCounted 7 | { 8 | public: 9 | virtual bool OnProcessMessageReceived( 10 | CefRefPtr browser, 11 | #if CHROME_VERSION_BUILD >= 3770 12 | CefRefPtr frame, 13 | #endif 14 | CefProcessId source_process, 15 | CefRefPtr message, 16 | const long cefClientId) = 0; 17 | }; 18 | -------------------------------------------------------------------------------- /streamelements/StreamElementsBrowserSourceApiMessageHandler.cpp: -------------------------------------------------------------------------------- 1 | #include "StreamElementsBrowserSourceApiMessageHandler.hpp" 2 | #include "StreamElementsMessageBus.hpp" 3 | 4 | #include 5 | 6 | static std::recursive_mutex s_sync_api_call_mutex; 7 | 8 | #define API_HANDLER_BEGIN(name) \ 9 | RegisterIncomingApiCallHandler(name, []( \ 10 | StreamElementsApiMessageHandler*, \ 11 | CefRefPtr message, \ 12 | CefRefPtr args, \ 13 | CefRefPtr& result, \ 14 | CefRefPtr browser, \ 15 | const long cefClientId, \ 16 | std::function complete_callback) \ 17 | { \ 18 | (void)message; \ 19 | (void)args; \ 20 | (void)result; \ 21 | (void)browser; \ 22 | (void)cefClientId; \ 23 | (void)complete_callback; \ 24 | std::lock_guard _api_sync_guard(s_sync_api_call_mutex); 25 | #define API_HANDLER_END() \ 26 | complete_callback(); \ 27 | }); 28 | 29 | StreamElementsBrowserSourceApiMessageHandler::StreamElementsBrowserSourceApiMessageHandler() 30 | { 31 | 32 | } 33 | 34 | StreamElementsBrowserSourceApiMessageHandler::~StreamElementsBrowserSourceApiMessageHandler() 35 | { 36 | 37 | } 38 | 39 | void StreamElementsBrowserSourceApiMessageHandler::RegisterIncomingApiCallHandlers() 40 | { 41 | API_HANDLER_BEGIN("broadcastMessage") 42 | if (args->GetSize()) { 43 | StreamElementsMessageBus::GetInstance()->NotifyAllMessageListeners( 44 | StreamElementsMessageBus::DEST_ALL_LOCAL, 45 | StreamElementsMessageBus::SOURCE_WEB, 46 | browser->GetMainFrame()->GetURL().ToString(), 47 | args->GetValue(0)); 48 | 49 | result->SetBool(true); 50 | } 51 | API_HANDLER_END() 52 | } 53 | -------------------------------------------------------------------------------- /streamelements/StreamElementsBrowserSourceApiMessageHandler.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "StreamElementsApiMessageHandler.hpp" 4 | 5 | // Exposes a limited subset of API calls to Browser Sources 6 | // 7 | class StreamElementsBrowserSourceApiMessageHandler : 8 | public StreamElementsApiMessageHandler 9 | { 10 | public: 11 | StreamElementsBrowserSourceApiMessageHandler(); 12 | virtual ~StreamElementsBrowserSourceApiMessageHandler(); 13 | 14 | protected: 15 | virtual void RegisterIncomingApiCallHandlers() override; 16 | }; 17 | -------------------------------------------------------------------------------- /streamelements/StreamElementsCleanupManager.cpp: -------------------------------------------------------------------------------- 1 | #include "StreamElementsCleanupManager.hpp" 2 | 3 | #include 4 | #include 5 | #include 6 | 7 | StreamElementsCleanupManager::StreamElementsCleanupManager() 8 | { 9 | } 10 | 11 | StreamElementsCleanupManager ::~StreamElementsCleanupManager() 12 | { 13 | Clean(); 14 | } 15 | 16 | void StreamElementsCleanupManager::AddPath(std::string path) 17 | { 18 | std::lock_guard guard(m_mutex); 19 | 20 | m_paths.push_back(path); 21 | } 22 | 23 | void StreamElementsCleanupManager::Clean() 24 | { 25 | std::lock_guard guard(m_mutex); 26 | 27 | if (m_paths.empty()) 28 | return; 29 | 30 | for (auto path : m_paths) { 31 | if (!os_file_exists(path.c_str())) 32 | continue; 33 | 34 | struct stat st; 35 | 36 | if (os_stat(path.c_str(), &st) < 0) 37 | continue; 38 | 39 | if (st.st_mode & S_IFDIR) { 40 | if (0 == os_rmdir(path.c_str())) { 41 | blog(LOG_INFO, 42 | "obs-browser: StreamElementsCleanupManager: removed folder: %s", 43 | path.c_str()); 44 | } else { 45 | blog(LOG_ERROR, 46 | "obs-browser: StreamElementsCleanupManager: failed removing folder: %s", 47 | path.c_str()); 48 | } 49 | } else { 50 | if (0 == os_unlink(path.c_str())) { 51 | blog(LOG_INFO, 52 | "obs-browser: StreamElementsCleanupManager: removed file: %s", 53 | path.c_str()); 54 | } else { 55 | blog(LOG_ERROR, 56 | "obs-browser: StreamElementsCleanupManager: failed removing file: %s", 57 | path.c_str()); 58 | } 59 | } 60 | } 61 | 62 | m_paths.clear(); 63 | } 64 | -------------------------------------------------------------------------------- /streamelements/StreamElementsCleanupManager.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | #include 5 | #include 6 | 7 | class StreamElementsCleanupManager { 8 | public: 9 | StreamElementsCleanupManager(); 10 | ~StreamElementsCleanupManager(); 11 | 12 | public: 13 | void AddPath(std::string path); 14 | 15 | public: 16 | void Clean(); 17 | 18 | private: 19 | std::vector m_paths; 20 | 21 | std::mutex m_mutex; 22 | }; 23 | -------------------------------------------------------------------------------- /streamelements/StreamElementsConfig.cpp: -------------------------------------------------------------------------------- 1 | #include "StreamElementsConfig.hpp" 2 | #include "Version.hpp" 3 | 4 | StreamElementsConfig* StreamElementsConfig::s_instance = nullptr; 5 | 6 | StreamElementsConfig::StreamElementsConfig(): 7 | m_config(nullptr) 8 | { 9 | 10 | } 11 | 12 | StreamElementsConfig::~StreamElementsConfig() 13 | { 14 | SaveConfig(); 15 | } 16 | 17 | 18 | config_t* StreamElementsConfig::GetConfig() 19 | { 20 | if (!m_config) { 21 | char *configPath = obs_module_config_path(CONFIG_FILE_NAME); 22 | config_open( 23 | &m_config, configPath, 24 | CONFIG_OPEN_ALWAYS); 25 | bfree(configPath); 26 | 27 | config_set_default_uint(m_config, "Header", "Version", STREAMELEMENTS_PLUGIN_VERSION); 28 | config_set_default_uint(m_config, "Startup", "Flags", STARTUP_FLAGS_ONBOARDING_MODE); 29 | config_set_default_string(m_config, "Startup", "State", ""); 30 | config_set_default_bool(m_config, "Startup", 31 | "ShowBuiltInMenuItems", true); 32 | } 33 | 34 | return m_config; 35 | } 36 | 37 | void StreamElementsConfig::SaveConfig() 38 | { 39 | if (!m_config) return; 40 | 41 | config_set_uint(m_config, "Header", "Version", STREAMELEMENTS_PLUGIN_VERSION); 42 | 43 | config_save_safe(m_config, "tmp", "bak"); 44 | } 45 | 46 | std::string StreamElementsConfig::GetHeapAnalyticsAppId() 47 | { 48 | std::string result = "413792583"; 49 | 50 | #ifdef WIN32 51 | const char* REG_KEY_PATH = "SOFTWARE\\StreamElements"; 52 | const char* REG_VALUE_NAME = "HeapAnalyticsAppId"; 53 | 54 | DWORD bufLen = 16384; 55 | char* buffer = new char[bufLen]; 56 | 57 | if (ERROR_SUCCESS != RegGetValueA( 58 | HKEY_LOCAL_MACHINE, 59 | REG_KEY_PATH, 60 | REG_VALUE_NAME, 61 | RRF_RT_REG_SZ | RRF_SUBKEY_WOW6464KEY, 62 | NULL, 63 | buffer, 64 | &bufLen)) { 65 | if (ERROR_SUCCESS == RegGetValueA( 66 | HKEY_LOCAL_MACHINE, 67 | REG_KEY_PATH, 68 | REG_VALUE_NAME, 69 | RRF_RT_REG_SZ | RRF_SUBKEY_WOW6432KEY, 70 | NULL, 71 | buffer, 72 | &bufLen)) { 73 | if (buffer[0]) { 74 | result = buffer; 75 | } 76 | } 77 | } 78 | else { 79 | if (buffer[0]) { 80 | result = buffer; 81 | } 82 | } 83 | 84 | delete[] buffer; 85 | #endif 86 | 87 | return result; 88 | } 89 | -------------------------------------------------------------------------------- /streamelements/StreamElementsControllerServer.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "cef-headers.hpp" 4 | 5 | #ifdef _WIN32 6 | #include "deps/server/NamedPipesServer.hpp" 7 | #endif 8 | 9 | class StreamElementsMessageBus; 10 | 11 | /////////////////////////////////////////////////////////////////////// 12 | // 13 | // Listens for JSON messages over a network connection (currently 14 | // implemented as Named Pipes server). 15 | // 16 | // In case the messages are properly structured, dispatches them to 17 | // all browsers except Browser Sources as an onHostMessageReceived 18 | // event. 19 | // 20 | // For the message to be properly structured, it must contain the 21 | // following root-level properties: 22 | // 23 | // version - number. protocol version (1) 24 | // source - object 25 | // target - object ({ scope: "broadcast" }) 26 | // payload - object. the message payload. 27 | // 28 | // In case of a command message, the "payload" property value is 29 | // structured as follows: 30 | // 31 | // class - string. "command" 32 | // command - object. ({ name: "command-name", "data": object }) 33 | // 34 | // The primary purpose of this class is to support integration with 35 | // external controllers, such as Elgato Streamdeck. 36 | // 37 | class StreamElementsControllerServer 38 | { 39 | public: 40 | StreamElementsControllerServer(StreamElementsMessageBus* bus); 41 | virtual ~StreamElementsControllerServer(); 42 | 43 | public: 44 | /// 45 | // Send a message with specified payload to all connected clients 46 | // 47 | // source - message source type 48 | // sourceAddress - message source address 49 | // payload - message payload 50 | // 51 | void NotifyAllClients( 52 | std::string source, 53 | std::string sourceAddress, 54 | CefRefPtr payload); 55 | 56 | /// 57 | // Send an event message to all connected clients 58 | // 59 | // source - message source type 60 | // sourceAddress - message source address 61 | // eventName - event name 62 | // eventData - event data 63 | // 64 | void SendEventAllClients( 65 | std::string source, 66 | std::string sourceAddress, 67 | std::string eventName, 68 | CefRefPtr eventData); 69 | 70 | /// 71 | // Send a generic message to all connected clients 72 | // 73 | // source - message source type 74 | // sourceAddress - message source address 75 | // message - message data 76 | // 77 | void SendMessageAllClients( 78 | std::string source, 79 | std::string sourceAddress, 80 | CefRefPtr message); 81 | 82 | private: 83 | void OnMsgReceivedInternal(std::string& msg); 84 | 85 | private: 86 | StreamElementsMessageBus* m_bus = nullptr; 87 | #ifdef _WIN32 88 | NamedPipesServer *m_server = nullptr; 89 | #endif 90 | }; 91 | -------------------------------------------------------------------------------- /streamelements/StreamElementsCookieManager.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "cef-headers.hpp" 4 | 5 | #include 6 | 7 | class StreamElementsCookieManager { 8 | public: 9 | StreamElementsCookieManager(std::string storagePath); 10 | virtual ~StreamElementsCookieManager(); 11 | 12 | CefRefPtr GetCefCookieManager(); 13 | CefRefPtr GetCefRequestContext(); 14 | 15 | private: 16 | std::string m_storagePath; 17 | CefRefPtr m_cookieManager; 18 | CefRefPtr m_requestContext; 19 | }; 20 | -------------------------------------------------------------------------------- /streamelements/StreamElementsCrashHandler.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | class StreamElementsCrashHandler 4 | { 5 | public: 6 | StreamElementsCrashHandler(); 7 | ~StreamElementsCrashHandler(); 8 | }; 9 | -------------------------------------------------------------------------------- /streamelements/StreamElementsDeferredExecutive.cpp: -------------------------------------------------------------------------------- 1 | #include "StreamElementsDeferredExecutive.hpp" 2 | #include "StreamElementsUtils.hpp" 3 | 4 | StreamElementsDeferredExecutive::StreamElementsDeferredExecutive() {} 5 | 6 | StreamElementsDeferredExecutive::~StreamElementsDeferredExecutive() 7 | { 8 | Cancel(); 9 | } 10 | 11 | void StreamElementsDeferredExecutive::Cancel() 12 | { 13 | if (!m_timer) 14 | return; 15 | 16 | std::lock_guard guard(m_mutex); 17 | 18 | m_timer->stop(); 19 | m_timer->deleteLater(); 20 | m_timer = nullptr; 21 | } 22 | 23 | void StreamElementsDeferredExecutive::Signal(std::function callback, 24 | int delayMilliseconds) 25 | { 26 | Cancel(); 27 | 28 | m_callback = callback; 29 | 30 | m_timer = new QTimer(); 31 | m_timer->moveToThread(qApp->thread()); 32 | m_timer->setSingleShot(true); 33 | m_timer->setInterval(delayMilliseconds); 34 | 35 | QObject::connect(m_timer, &QTimer::timeout, [&]() { 36 | std::lock_guard guard(m_mutex); 37 | 38 | m_timer->deleteLater(); 39 | m_timer = nullptr; 40 | 41 | m_callback(); 42 | }); 43 | 44 | QMetaObject::invokeMethod(m_timer, "start", Qt::QueuedConnection, 45 | Q_ARG(int, 0)); 46 | } 47 | -------------------------------------------------------------------------------- /streamelements/StreamElementsDeferredExecutive.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | 5 | #include 6 | #include 7 | 8 | class StreamElementsDeferredExecutive 9 | { 10 | public: 11 | StreamElementsDeferredExecutive(); 12 | ~StreamElementsDeferredExecutive(); 13 | 14 | public: 15 | void Cancel(); 16 | void Signal(std::function callback, int delayMilliseconds); 17 | 18 | private: 19 | QTimer *m_timer = nullptr; 20 | std::function m_callback; 21 | std::recursive_mutex m_mutex; 22 | }; 23 | -------------------------------------------------------------------------------- /streamelements/StreamElementsExternalSceneDataProviderManager.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "StreamElementsExternalSceneDataProvider.hpp" 4 | #include "StreamElementsExternalSceneDataProviderSlobsClient.hpp" 5 | 6 | #include 7 | #include 8 | #include "cef-headers.hpp" 9 | 10 | class StreamElementsExternalSceneDataProviderManager 11 | { 12 | public: 13 | StreamElementsExternalSceneDataProviderManager() 14 | { 15 | m_providers["slobs-client"] = 16 | std::make_shared( 17 | "slobs-client"); 18 | } 19 | 20 | void SerializeProviders(CefRefPtr result) 21 | { 22 | CefRefPtr list = CefListValue::Create(); 23 | 24 | for (auto provider : m_providers) { 25 | CefRefPtr d = CefDictionaryValue::Create(); 26 | 27 | d->SetString("providerId", provider.first.c_str()); 28 | d->SetString("name", provider.second->name().c_str()); 29 | 30 | list->SetDictionary(list->GetSize(), d); 31 | } 32 | 33 | result->SetList(list); 34 | } 35 | 36 | bool SerializeProviderSceneCollections( 37 | CefRefPtr input, 38 | CefRefPtr result) 39 | { 40 | if (input->GetType() != VTYPE_DICTIONARY) { 41 | return false; 42 | } 43 | 44 | CefRefPtr d = input->GetDictionary(); 45 | 46 | if (!d->HasKey("providerId") || d->GetType("providerId") != VTYPE_STRING) { 47 | return false; 48 | } 49 | 50 | std::string providerId = d->GetString("providerId"); 51 | 52 | if (m_providers.count(providerId)) { 53 | auto provider = m_providers[providerId]; 54 | 55 | return provider->SerializeSceneCollections(result); 56 | } 57 | else { 58 | return false; 59 | } 60 | } 61 | 62 | bool SerializeProviderSceneColletion( 63 | CefRefPtr input, 64 | CefRefPtr result) 65 | { 66 | if (input->GetType() != VTYPE_DICTIONARY) { 67 | return false; 68 | } 69 | 70 | CefRefPtr d = input->GetDictionary(); 71 | 72 | if (!d->HasKey("providerId") || d->GetType("providerId") != VTYPE_STRING) { 73 | return false; 74 | } 75 | 76 | if (!d->HasKey("collectionId") || d->GetType("collectionId") != VTYPE_STRING) { 77 | return false; 78 | } 79 | 80 | std::string providerId = d->GetString("providerId"); 81 | 82 | if (m_providers.count(providerId)) { 83 | auto provider = m_providers[providerId]; 84 | 85 | std::string collectionId = d->GetString("collectionId"); 86 | 87 | return provider->SerializeSceneCollection(collectionId, result); 88 | } 89 | else { 90 | return false; 91 | } 92 | } 93 | private: 94 | std::map> m_providers; 95 | }; 96 | -------------------------------------------------------------------------------- /streamelements/StreamElementsExternalSceneDataProviderSlobsClient.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "StreamElementsExternalSceneDataProvider.hpp" 4 | #include 5 | #include 6 | #include 7 | 8 | #ifndef WIN32 9 | #include 10 | #define MAX_PATH FILENAME_MAX 11 | #endif 12 | 13 | class StreamElementsExternalSceneDataProviderSlobsClient : 14 | public StreamElementsExternalSceneDataProvider 15 | { 16 | public: 17 | StreamElementsExternalSceneDataProviderSlobsClient(std::string providerId) : 18 | StreamElementsExternalSceneDataProvider(providerId, "Streamlabs OBS") 19 | { 20 | char* path = new char[MAX_PATH]; 21 | 22 | if (os_get_config_path(path, MAX_PATH, "slobs-client/SceneCollections") >= 0) { 23 | m_basePath = path; 24 | 25 | std::replace(m_basePath.begin(), m_basePath.end(), '\\', '/'); 26 | 27 | if (!std::filesystem::is_directory( 28 | m_basePath)) { 29 | blog(LOG_INFO, 30 | "obs-browser: StreamElementsExternalSceneDataProviderSlobsClient: path does not exist: %s", 31 | m_basePath.c_str()); 32 | 33 | m_basePath = ""; 34 | } 35 | } 36 | else { 37 | m_basePath = ""; 38 | } 39 | 40 | delete[] path; 41 | } 42 | 43 | protected: 44 | virtual bool GetSceneCollections( 45 | std::vector& result) override; 46 | 47 | virtual bool GetSceneCollection( 48 | std::string collectionId, 49 | scene_collection_content_t& result) override; 50 | 51 | private: 52 | std::string m_basePath; 53 | }; 54 | -------------------------------------------------------------------------------- /streamelements/StreamElementsHotkeyManager.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "obs.h" 4 | #include "obs-hotkey.h" 5 | #include "cef-headers.hpp" 6 | 7 | #include 8 | #include 9 | 10 | class StreamElementsHotkeyManager 11 | { 12 | public: 13 | StreamElementsHotkeyManager(); 14 | ~StreamElementsHotkeyManager(); 15 | 16 | bool SerializeHotkeyBindings(CefRefPtr& result, bool onlyManagedBindings = false); 17 | bool DeserializeHotkeyBindings(CefRefPtr input); 18 | 19 | obs_hotkey_id DeserializeSingleHotkeyBinding(CefRefPtr input); 20 | 21 | bool RemoveHotkeyBindingById(obs_hotkey_id id); 22 | void RemoveAllManagedHotkeyBindings(); 23 | 24 | public: 25 | virtual void keyCombinationTriggered(CefRefPtr browser, obs_key_combination_t combination, bool pressed); 26 | 27 | protected: 28 | virtual void hotkeyTriggered(obs_hotkey_id id, obs_hotkey_t *hotkey, bool pressed); 29 | 30 | private: 31 | std::recursive_mutex m_mutex; 32 | 33 | std::map m_registeredHotkeyNamesToHotkeyIds; 34 | std::map m_registeredHotkeyIdsToNames; 35 | std::map> m_registeredHotkeySerializedValues; 36 | std::map m_registeredHotkeyDataString; 37 | 38 | private: 39 | static void hotkey_change_handler(void*, calldata_t*); 40 | }; 41 | -------------------------------------------------------------------------------- /streamelements/StreamElementsHttpClient.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "cef-headers.hpp" 4 | 5 | class StreamElementsHttpClient 6 | { 7 | public: 8 | StreamElementsHttpClient() {} 9 | ~StreamElementsHttpClient() {} 10 | 11 | public: 12 | void DeserializeHttpRequestText( 13 | CefRefPtr input, 14 | CefRefPtr output); 15 | }; 16 | -------------------------------------------------------------------------------- /streamelements/StreamElementsHttpServerManager.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "deps/server/HttpServer.hpp" 4 | 5 | #include 6 | #include 7 | #include 8 | 9 | #include "cef-headers.hpp" 10 | 11 | class StreamElementsHttpServerManager 12 | { 13 | public: 14 | StreamElementsHttpServerManager(HttpServer::request_handler_t handler); 15 | ~StreamElementsHttpServerManager(); 16 | 17 | void DeserializeHttpServer(CefRefPtr input, 18 | CefRefPtr &output); 19 | 20 | void SerializeHttpServers(CefRefPtr &output); 21 | 22 | void RemoveHttpServersByIds(CefRefPtr input, 23 | CefRefPtr &output); 24 | 25 | private: 26 | std::recursive_mutex m_mutex; 27 | std::map> m_servers; 28 | HttpServer::request_handler_t m_handler; 29 | }; 30 | -------------------------------------------------------------------------------- /streamelements/StreamElementsLocalWebFilesServer.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | #include 5 | #include "cef-headers.hpp" 6 | 7 | #include "StreamElementsFileSystemMapper.hpp" 8 | 9 | class StreamElementsLocalWebFilesServer 10 | { 11 | public: 12 | StreamElementsLocalWebFilesServer(std::string rootFolder); 13 | ~StreamElementsLocalWebFilesServer(); 14 | 15 | /// 16 | // Check if host is mapped to a local folder. 17 | // 18 | bool HasHost(std::string host); 19 | 20 | /// 21 | // Map host & request path to local file absolute_path 22 | // 23 | bool MapRequestPath(std::string host, std::string relative, std::string& absolute_path); 24 | 25 | /// 26 | // Map CEF request to a CefResourceHandler. 27 | // 28 | // This is the method which should be called to map a 29 | // CefRequest to local files CefResourceHandler 30 | // implementation. 31 | // 32 | CefRefPtr GetCefResourceHandler( 33 | CefRefPtr browser, 34 | CefRefPtr frame, 35 | CefRefPtr request); 36 | 37 | private: 38 | std::string m_rootFolder; 39 | std::map> m_hostsMap; 40 | }; 41 | -------------------------------------------------------------------------------- /streamelements/StreamElementsMenuManager.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "cef-headers.hpp" 4 | 5 | #include "StreamElementsApiMessageHandler.hpp" 6 | #include "StreamElementsBrowserWidget.hpp" 7 | 8 | #include 9 | #include 10 | #include 11 | #include 12 | 13 | #include 14 | #include 15 | 16 | class StreamElementsMenuManager : 17 | public QObject 18 | { 19 | Q_OBJECT; 20 | 21 | private: 22 | enum aux_menu_item_type_t { Command, Separator, Container }; 23 | 24 | public: 25 | StreamElementsMenuManager(QMainWindow* parent); 26 | virtual ~StreamElementsMenuManager(); 27 | 28 | public: 29 | void Update(); 30 | 31 | bool DeserializeAuxiliaryMenuItems(CefRefPtr input); 32 | void SerializeAuxiliaryMenuItems(CefRefPtr& output); 33 | 34 | void Reset(); 35 | 36 | void SetShowBuiltInMenuItems(bool show); 37 | bool GetShowBuiltInMenuItems(); 38 | 39 | void SetFocusedBrowserWidget(StreamElementsBrowserWidget *widget); 40 | 41 | protected: 42 | QMainWindow* mainWindow() { return m_mainWindow; } 43 | 44 | void SaveConfig(); 45 | void LoadConfig(); 46 | 47 | private: 48 | void UpdateInternal(); 49 | void UpdateOBSEditMenuInternal(); 50 | 51 | void HandleFocusedBrowserWidgetDOMNodeEditableChanged(bool isEditable); 52 | void HandleClipboardDataChanged(); 53 | 54 | void HandleCefCopy(); 55 | void HandleCefCut(); 56 | void HandleCefPaste(); 57 | void HandleCefSelectAll(); 58 | 59 | void AddOBSEditMenuActions(); 60 | void RemoveOBSEditMenuActions(); 61 | 62 | private: 63 | QMainWindow* m_mainWindow; 64 | QMenu *m_menu; 65 | 66 | // 67 | // OBS-native Edit menu. 68 | // 69 | QMenu *m_editMenu; 70 | 71 | // 72 | // Our actions to be added under OBS-native Edit 73 | // menu when appropriate (see m_focusedBrowserWidget 74 | // below for further details). 75 | // 76 | std::vector m_cefOBSEditMenuActions; 77 | QAction *m_cefOBSEditMenuActionCopy = nullptr; 78 | QAction *m_cefOBSEditMenuActionCut = nullptr; 79 | QAction *m_cefOBSEditMenuActionPaste = nullptr; 80 | QAction *m_cefOBSEditMenuActionSelectAll = nullptr; 81 | 82 | // 83 | // OBS-native Edit->Copy menu item. 84 | // 85 | QAction *m_nativeOBSEditMenuCopySourceAction = nullptr; 86 | 87 | // 88 | // Indicates which browser widget is currently in focus. 89 | // 90 | // When a browser widget is in focus and it's internally 91 | // focused DOM node is an editable element, we'll show 92 | // Cut/Copy/Paste/Select All items under the OBS native 93 | // "Edit" menu. We'll also hide & disable the OBS-native 94 | // "Copy" action. 95 | // 96 | StreamElementsBrowserWidget *m_focusedBrowserWidget = nullptr; 97 | 98 | CefRefPtr m_auxMenuItems = CefValue::Create(); 99 | bool m_showBuiltInMenuItems = true; 100 | }; 101 | -------------------------------------------------------------------------------- /streamelements/StreamElementsObsAppMonitor.cpp: -------------------------------------------------------------------------------- 1 | #include "StreamElementsObsAppMonitor.hpp" 2 | -------------------------------------------------------------------------------- /streamelements/StreamElementsObsAppMonitor.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | 5 | class StreamElementsObsAppMonitor 6 | { 7 | public: 8 | StreamElementsObsAppMonitor() 9 | { 10 | Connect(); 11 | } 12 | 13 | ~StreamElementsObsAppMonitor() 14 | { 15 | Disconnect(); 16 | } 17 | 18 | protected: 19 | virtual void OnObsExit() = 0; 20 | 21 | private: 22 | void Connect() 23 | { 24 | obs_frontend_add_event_callback(obs_frontend_event_handler, this); 25 | } 26 | 27 | void Disconnect() 28 | { 29 | obs_frontend_remove_event_callback(obs_frontend_event_handler, this); 30 | } 31 | 32 | 33 | static void obs_frontend_event_handler(enum obs_frontend_event event, void *data) 34 | { 35 | StreamElementsObsAppMonitor* self = (StreamElementsObsAppMonitor*)data; 36 | 37 | switch (event) { 38 | case OBS_FRONTEND_EVENT_EXIT: 39 | self->OnObsExit(); 40 | break; 41 | } 42 | } 43 | }; 44 | -------------------------------------------------------------------------------- /streamelements/StreamElementsObsBandwidthTestClient.cpp: -------------------------------------------------------------------------------- 1 | #include "StreamElementsObsBandwidthTestClient.hpp" 2 | 3 | StreamElementsObsBandwidthTestClient::StreamElementsObsBandwidthTestClient() 4 | { 5 | } 6 | 7 | StreamElementsObsBandwidthTestClient::~StreamElementsObsBandwidthTestClient() 8 | { 9 | } 10 | 11 | void StreamElementsObsBandwidthTestClient::OnObsExit() 12 | { 13 | CancelAll(); 14 | } 15 | -------------------------------------------------------------------------------- /streamelements/StreamElementsObsBandwidthTestClient.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "StreamElementsBandwidthTestClient.hpp" 4 | #include "StreamElementsObsAppMonitor.hpp" 5 | 6 | class StreamElementsObsBandwidthTestClient : 7 | public StreamElementsBandwidthTestClient, 8 | public StreamElementsObsAppMonitor 9 | { 10 | public: 11 | StreamElementsObsBandwidthTestClient(); 12 | virtual ~StreamElementsObsBandwidthTestClient(); 13 | 14 | protected: 15 | virtual void OnObsExit() override; 16 | }; 17 | -------------------------------------------------------------------------------- /streamelements/StreamElementsOutputSettingsManager.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | #include "../cef-headers.hpp" 5 | 6 | class StreamElementsOutputSettingsManager 7 | { 8 | public: 9 | StreamElementsOutputSettingsManager(); 10 | virtual ~StreamElementsOutputSettingsManager(); 11 | 12 | public: 13 | void GetAvailableEncoders(CefRefPtr& result, obs_encoder_type* encoder_type = nullptr); 14 | 15 | bool SetStreamingSettings(CefRefPtr input); 16 | 17 | bool SetEncodingSettings(CefRefPtr input); 18 | bool GetEncodingSettings(CefRefPtr& output); 19 | 20 | private: 21 | void StopAllOutputs(); 22 | }; 23 | -------------------------------------------------------------------------------- /streamelements/StreamElementsPerformanceHistoryTracker.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #ifdef WIN32 4 | #include 5 | #endif 6 | 7 | #include 8 | #include 9 | #include 10 | #include 11 | 12 | class StreamElementsPerformanceHistoryTracker 13 | { 14 | public: 15 | typedef long double seconds_t; 16 | 17 | struct CpuTime 18 | { 19 | seconds_t totalSeconds; 20 | seconds_t idleSeconds; 21 | seconds_t busySeconds; 22 | }; 23 | 24 | typedef CpuTime cpu_usage_t; 25 | #ifdef WIN32 26 | typedef MEMORYSTATUSEX memory_usage_t; 27 | #else 28 | struct memory_usage_t { 29 | unsigned int dwMemoryLoad; // Usage % 30 | }; 31 | #endif 32 | 33 | public: 34 | StreamElementsPerformanceHistoryTracker(); 35 | ~StreamElementsPerformanceHistoryTracker(); 36 | 37 | std::vector getMemoryUsageSnapshot(); 38 | std::vector getCpuUsageSnapshot(); 39 | 40 | private: 41 | std::recursive_mutex m_mutex; 42 | 43 | os_event_t* m_quit_event; 44 | os_event_t* m_done_event; 45 | 46 | std::vector m_cpu_usage; 47 | std::vector m_memory_usage; 48 | }; 49 | -------------------------------------------------------------------------------- /streamelements/StreamElementsPleaseWaitWindow.cpp: -------------------------------------------------------------------------------- 1 | #include "StreamElementsPleaseWaitWindow.hpp" 2 | #include "ui_streamelementspleasewaitwindow.h" 3 | 4 | #include "StreamElementsUtils.hpp" 5 | 6 | #include 7 | 8 | #include 9 | #include 10 | 11 | #include 12 | 13 | StreamElementsPleaseWaitWindow *StreamElementsPleaseWaitWindow::s_instance = nullptr; 14 | 15 | StreamElementsPleaseWaitWindow::StreamElementsPleaseWaitWindow(QWidget *parent) : QDialog(parent), 16 | ui(new Ui::StreamElementsPleaseWaitWindow) 17 | { 18 | ui->setupUi(this); 19 | 20 | // Remove title bar 21 | setWindowFlags(Qt::CustomizeWindowHint); 22 | setWindowModality(Qt::ApplicationModal); 23 | setModal(true); 24 | } 25 | 26 | StreamElementsPleaseWaitWindow::~StreamElementsPleaseWaitWindow() 27 | { 28 | delete ui; 29 | } 30 | 31 | StreamElementsPleaseWaitWindow* StreamElementsPleaseWaitWindow::GetInstance() 32 | { 33 | static std::mutex s_mutex; 34 | 35 | if (!s_instance) { 36 | std::lock_guard guard(s_mutex); 37 | 38 | if (!s_instance) { 39 | QMainWindow *mainWindow = 40 | (QMainWindow *)obs_frontend_get_main_window(); 41 | 42 | s_instance = new StreamElementsPleaseWaitWindow(mainWindow); 43 | } 44 | } 45 | 46 | return s_instance; 47 | } 48 | 49 | void StreamElementsPleaseWaitWindow::Show() 50 | { 51 | if (os_atomic_inc_long(&m_showCount) == 1) { 52 | QtPostTask([this]() { this->open(); }); 53 | } 54 | } 55 | 56 | void StreamElementsPleaseWaitWindow::Hide() 57 | { 58 | if (os_atomic_dec_long(&m_showCount) == 0) { 59 | QtPostTask([this]() { this->hide(); }); 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /streamelements/StreamElementsPleaseWaitWindow.hpp: -------------------------------------------------------------------------------- 1 | #ifndef STREAMELEMENTSPLEASEWAITWINDOW_H 2 | #define STREAMELEMENTSPLEASEWAITWINDOW_H 3 | 4 | #include 5 | #include 6 | 7 | #include 8 | 9 | namespace Ui { 10 | class StreamElementsPleaseWaitWindow; 11 | } 12 | 13 | class StreamElementsPleaseWaitWindow : public QDialog { 14 | Q_OBJECT 15 | 16 | public: 17 | static StreamElementsPleaseWaitWindow *GetInstance(); 18 | 19 | void Show(); 20 | void Hide(); 21 | 22 | protected: 23 | explicit StreamElementsPleaseWaitWindow(QWidget *parent = 0); 24 | ~StreamElementsPleaseWaitWindow(); 25 | 26 | private: 27 | Ui::StreamElementsPleaseWaitWindow *ui; 28 | 29 | long m_showCount = 0; 30 | 31 | private: 32 | static StreamElementsPleaseWaitWindow *s_instance; 33 | }; 34 | 35 | #endif // STREAMELEMENTSPLEASEWAITWINDOW_H 36 | -------------------------------------------------------------------------------- /streamelements/StreamElementsPleaseWaitWindow.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | StreamElementsPleaseWaitWindow 4 | 5 | 6 | 7 | 0 8 | 0 9 | 415 10 | 143 11 | 12 | 13 | 14 | Form 15 | 16 | 17 | 18 | 19 | 0 20 | 0 21 | 415 22 | 143 23 | 24 | 25 | 26 | 27 | 0 28 | 0 29 | 30 | 31 | 32 | 33 | 200 34 | 100 35 | 36 | 37 | 38 | 39 | 19 40 | 50 41 | false 42 | true 43 | 44 | 45 | 46 | WaitCursor 47 | 48 | 49 | Qt::NoContextMenu 50 | 51 | 52 | Please wait... 53 | 54 | 55 | Qt::AlignCenter 56 | 57 | 58 | 59 | 60 | 61 | 62 | -------------------------------------------------------------------------------- /streamelements/StreamElementsPreviewManager.cpp: -------------------------------------------------------------------------------- 1 | #include "StreamElementsPreviewManager.hpp" 2 | 3 | #include 4 | #include 5 | 6 | #include 7 | #include 8 | 9 | #include "StreamElementsCefClient.hpp" 10 | #include "StreamElementsObsAppMonitor.hpp" 11 | 12 | static class PreviewMouseEventFilter : public QObject { 13 | private: 14 | QMainWindow *m_mainWindow; 15 | 16 | public: 17 | PreviewMouseEventFilter(QMainWindow *mainWindow) 18 | : m_mainWindow(mainWindow) 19 | { 20 | QCoreApplication::instance()->installEventFilter(this); 21 | } 22 | 23 | virtual ~PreviewMouseEventFilter() 24 | { 25 | QCoreApplication::instance()->removeEventFilter(this); 26 | } 27 | 28 | virtual bool eventFilter(QObject *o, QEvent *e) override 29 | { 30 | QWidget *centralWidget = m_mainWindow->centralWidget(); 31 | 32 | switch (e->type()) { 33 | case QEvent::MouseButtonDblClick: 34 | if (QApplication::keyboardModifiers() == 35 | Qt::NoModifier) { 36 | if (o->objectName() == 37 | QString("previewWindow")) { 38 | StreamElementsCefClient::DispatchJSEvent( 39 | "hostVideoPreviewMouseDoubleClicked", 40 | "null"); 41 | } else if (o->objectName() == 42 | QString("sourcesDockWindow")) { 43 | StreamElementsCefClient::DispatchJSEvent( 44 | "hostCurrentSceneItemsListMouseDoubleClicked", 45 | "null"); 46 | } 47 | } 48 | break; 49 | 50 | case QEvent::FocusAboutToChange: 51 | if (o->objectName() == "OBSBasicWindow") { 52 | StreamElementsCefClient::DispatchJSEvent( 53 | "hostBeforeFocusChange", "null"); 54 | } 55 | break; 56 | } 57 | 58 | return QObject::eventFilter(o, e); 59 | } 60 | }; 61 | 62 | StreamElementsPreviewManager::StreamElementsPreviewManager(QMainWindow *parent) 63 | : m_parent(parent) 64 | { 65 | m_eventFilter = new PreviewMouseEventFilter(m_parent); 66 | } 67 | 68 | StreamElementsPreviewManager::~StreamElementsPreviewManager() 69 | { 70 | if (m_eventFilter) { 71 | delete m_eventFilter; 72 | 73 | m_eventFilter = nullptr; 74 | } 75 | } 76 | 77 | void StreamElementsPreviewManager::OnObsExit() 78 | { 79 | if (m_eventFilter) { 80 | delete m_eventFilter; 81 | 82 | m_eventFilter = nullptr; 83 | } 84 | } 85 | -------------------------------------------------------------------------------- /streamelements/StreamElementsPreviewManager.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | #include 5 | 6 | #include "StreamElementsObsAppMonitor.hpp" 7 | 8 | class StreamElementsPreviewManager : public StreamElementsObsAppMonitor { 9 | public: 10 | StreamElementsPreviewManager(QMainWindow *parent); 11 | virtual ~StreamElementsPreviewManager(); 12 | 13 | protected: 14 | virtual void OnObsExit(); 15 | 16 | private: 17 | QMainWindow *m_parent; 18 | QObject *m_eventFilter; 19 | }; 20 | -------------------------------------------------------------------------------- /streamelements/StreamElementsProfilesManager.cpp: -------------------------------------------------------------------------------- 1 | #include "StreamElementsProfilesManager.hpp" 2 | #include "StreamElementsUtils.hpp" 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | 9 | #ifndef WIN32 10 | #define stricmp strcasecmp 11 | #endif 12 | 13 | StreamElementsProfilesManager::StreamElementsProfilesManager() {} 14 | 15 | StreamElementsProfilesManager::~StreamElementsProfilesManager() {} 16 | 17 | void StreamElementsProfilesManager::SerializeAllProfiles( 18 | CefRefPtr &output) 19 | { 20 | std::lock_guard guard(m_mutex); 21 | 22 | CefRefPtr list = CefListValue::Create(); 23 | 24 | std::map profiles; 25 | ReadListOfObsProfiles(profiles); 26 | 27 | for (auto profile : profiles) { 28 | CefRefPtr d = CefDictionaryValue::Create(); 29 | 30 | d->SetString("id", profile.first); 31 | d->SetString("name", profile.second); 32 | 33 | list->SetDictionary(list->GetSize(), d); 34 | } 35 | 36 | output->SetList(list); 37 | } 38 | 39 | void StreamElementsProfilesManager::SerializeCurrentProfile( 40 | CefRefPtr &output) 41 | { 42 | std::lock_guard guard(m_mutex); 43 | 44 | char *currentProfile = obs_frontend_get_current_profile(); 45 | 46 | std::string id = currentProfile; 47 | 48 | std::map profiles; 49 | ReadListOfObsProfiles(profiles); 50 | 51 | for (auto profile : profiles) { 52 | if (profile.second == currentProfile) { 53 | id = profile.first; 54 | break; 55 | } 56 | } 57 | 58 | CefRefPtr d = CefDictionaryValue::Create(); 59 | 60 | d->SetString("id", id); 61 | d->SetString("name", currentProfile); 62 | 63 | bfree(currentProfile); 64 | 65 | output->SetDictionary(d); 66 | } 67 | 68 | bool StreamElementsProfilesManager::DeserializeCurrentProfileById( 69 | CefRefPtr input) 70 | { 71 | if (obs_frontend_streaming_active() || obs_frontend_recording_active()) 72 | return false; 73 | 74 | if (input->GetType() != VTYPE_DICTIONARY) 75 | return false; 76 | 77 | CefRefPtr d = input->GetDictionary(); 78 | 79 | if (!d->HasKey("id") || d->GetType("id") != VTYPE_STRING) 80 | return false; 81 | 82 | std::string id = d->GetString("id").ToString(); 83 | 84 | if (!id.size()) 85 | return false; 86 | 87 | std::lock_guard guard(m_mutex); 88 | 89 | std::string actualId = ""; 90 | 91 | char **profiles = obs_frontend_get_profiles(); 92 | 93 | for (size_t index = 0; profiles[index] && !actualId.size(); ++index) { 94 | if (stricmp(profiles[index], id.c_str()) == 0) { 95 | actualId = profiles[index]; 96 | break; 97 | } 98 | } 99 | 100 | bfree(profiles); 101 | 102 | if (!actualId.size()) 103 | return false; 104 | 105 | obs_frontend_set_current_profile(actualId.c_str()); 106 | 107 | return true; 108 | } 109 | -------------------------------------------------------------------------------- /streamelements/StreamElementsProfilesManager.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "cef-headers.hpp" 4 | #include 5 | 6 | class StreamElementsProfilesManager { 7 | public: 8 | StreamElementsProfilesManager(); 9 | ~StreamElementsProfilesManager(); 10 | 11 | public: 12 | void SerializeAllProfiles(CefRefPtr &output); 13 | void SerializeCurrentProfile(CefRefPtr &output); 14 | bool DeserializeCurrentProfileById(CefRefPtr input); 15 | 16 | private: 17 | std::recursive_mutex m_mutex; 18 | }; 19 | -------------------------------------------------------------------------------- /streamelements/StreamElementsProgressDialog.cpp: -------------------------------------------------------------------------------- 1 | #include "StreamElementsProgressDialog.hpp" 2 | #include "ui_StreamElementsProgressDialog.h" 3 | 4 | StreamElementsProgressDialog::StreamElementsProgressDialog(QWidget *parent) : 5 | QDialog(parent), 6 | ui(new Ui::StreamElementsProgressDialog) 7 | { 8 | ui->setupUi(this); 9 | } 10 | 11 | StreamElementsProgressDialog::~StreamElementsProgressDialog() 12 | { 13 | delete ui; 14 | } 15 | 16 | void StreamElementsProgressDialog::accept() 17 | { 18 | QDialog::accept(); 19 | } 20 | 21 | void StreamElementsProgressDialog::reject() 22 | { 23 | m_cancelled = true; 24 | 25 | QDialog::reject(); 26 | } 27 | 28 | void StreamElementsProgressDialog::setEnableCancel(bool enable) 29 | { 30 | QMetaObject::invokeMethod(ui->cmdCancel, "setEnabled", Qt::QueuedConnection, Q_ARG(bool, enable)); 31 | } 32 | 33 | void StreamElementsProgressDialog::setMessage(std::string msg) 34 | { 35 | QMetaObject::invokeMethod(ui->txtOp, "setText", Qt::QueuedConnection, Q_ARG(QString, QString(msg.c_str()))); 36 | } 37 | 38 | void StreamElementsProgressDialog::setProgress(int min, int max, int value) 39 | { 40 | if (ui->progressBar->minimum() != min) { 41 | QMetaObject::invokeMethod(ui->progressBar, "setMinimum", Qt::QueuedConnection, Q_ARG(int, min)); 42 | } 43 | 44 | if (ui->progressBar->maximum() != max) { 45 | QMetaObject::invokeMethod(ui->progressBar, "setMaximum", Qt::QueuedConnection, Q_ARG(int, max)); 46 | } 47 | 48 | if (ui->progressBar->value() != value) { 49 | QMetaObject::invokeMethod(ui->progressBar, "setValue", Qt::QueuedConnection, Q_ARG(int, value)); 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /streamelements/StreamElementsProgressDialog.hpp: -------------------------------------------------------------------------------- 1 | #ifndef STREAMELEMENTSPROGRESSDIALOG_HPP 2 | #define STREAMELEMENTSPROGRESSDIALOG_HPP 3 | 4 | #include 5 | 6 | namespace Ui { 7 | class StreamElementsProgressDialog; 8 | } 9 | 10 | class StreamElementsProgressDialog : public QDialog 11 | { 12 | Q_OBJECT 13 | 14 | public: 15 | explicit StreamElementsProgressDialog(QWidget *parent = 0); 16 | ~StreamElementsProgressDialog(); 17 | 18 | public: 19 | virtual void accept(); 20 | virtual void reject(); 21 | 22 | bool cancelled() { return m_cancelled; } 23 | 24 | public slots: 25 | void setEnableCancel(bool enable); 26 | void setMessage(std::string msg); 27 | void setProgress(int min, int max, int value); 28 | 29 | private: 30 | bool m_cancelled = false; 31 | 32 | private: 33 | Ui::StreamElementsProgressDialog *ui; 34 | }; 35 | 36 | #endif // STREAMELEMENTSPROGRESSDIALOG_HPP 37 | -------------------------------------------------------------------------------- /streamelements/StreamElementsRemoteIconLoader.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "StreamElementsUtils.hpp" 4 | #include 5 | #include 6 | 7 | #include 8 | 9 | static class StreamElementsRemoteIconLoader : public CefBaseRefCounted { 10 | public: 11 | typedef std::function setIcon_callback_t; 12 | 13 | public: 14 | static CefRefPtr 15 | Create(setIcon_callback_t setIcon, const char *url = nullptr, 16 | QPixmap *defaultPixmap = nullptr, bool requireQtPostTaskOnCached = true); 17 | 18 | private: 19 | StreamElementsRemoteIconLoader(setIcon_callback_t setIcon, 20 | const char *url, QPixmap *defaultPixmap, 21 | bool requireQtPostTaskOnCached); 22 | ~StreamElementsRemoteIconLoader(); 23 | 24 | void LoadUrlInternal(const char *url, bool requireQtPostTaskOnCached); 25 | 26 | public: 27 | void Cancel(); 28 | void LoadUrl(const char *url); 29 | 30 | private: 31 | std::recursive_mutex m_mutex; 32 | CefRefPtr m_request = nullptr; 33 | CefRefPtr m_task = nullptr; 34 | setIcon_callback_t m_setIcon; 35 | bool m_cancelled = false; 36 | 37 | IMPLEMENT_REFCOUNTING(StreamElementsRemoteIconLoader); 38 | }; 39 | -------------------------------------------------------------------------------- /streamelements/StreamElementsReportIssueDialog.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #ifndef STREAMELEMENTSREPORTISSUEDIALOG_H 4 | #define STREAMELEMENTSREPORTISSUEDIALOG_H 5 | 6 | #include 7 | 8 | namespace Ui { 9 | class StreamElementsReportIssueDialog; 10 | } 11 | 12 | class StreamElementsReportIssueDialog : public QDialog 13 | { 14 | Q_OBJECT 15 | 16 | public: 17 | explicit StreamElementsReportIssueDialog(QWidget *parent = 0); 18 | ~StreamElementsReportIssueDialog(); 19 | 20 | public slots: 21 | virtual void update(); 22 | virtual void accept(); 23 | 24 | private: 25 | Ui::StreamElementsReportIssueDialog *ui; 26 | }; 27 | 28 | #endif // STREAMELEMENTSREPORTISSUEDIALOG_H 29 | -------------------------------------------------------------------------------- /streamelements/StreamElementsScenesListWidgetManager.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "StreamElementsDeferredExecutive.hpp" 4 | #include "StreamElementsUtils.hpp" 5 | 6 | #include 7 | 8 | #include "cef-headers.hpp" 9 | 10 | #include 11 | #include 12 | #include 13 | #include 14 | 15 | class StreamElementsScenesListWidgetManager : public QObject { 16 | public: 17 | StreamElementsScenesListWidgetManager(QMainWindow *mainWindow); 18 | virtual ~StreamElementsScenesListWidgetManager(); 19 | 20 | public: 21 | static CefRefPtr GetScenePropertyValue(obs_source_t *scene, 22 | const char *key); 23 | 24 | void SetScenePropertyValue(obs_source_t *scene, const char *key, 25 | CefRefPtr value, 26 | bool triggerUpdate = true); 27 | 28 | static CefRefPtr GetSceneAuxiliaryData(obs_source_t *scene); 29 | 30 | void SetSceneAuxiliaryData(obs_source_t *scene, 31 | CefRefPtr data); 32 | 33 | static CefRefPtr GetSceneIcon(obs_source_t *scene); 34 | 35 | void SetSceneIcon(obs_source_t *scene, CefRefPtr icon); 36 | 37 | static CefRefPtr GetSceneDefaultAction(obs_source_t *scene); 38 | 39 | void SetSceneDefaultAction(obs_source_t *scene, 40 | CefRefPtr icon); 41 | 42 | static CefRefPtr GetSceneContextMenu(obs_source_t *scene); 43 | 44 | void SetSceneContextMenu(obs_source_t *scene, CefRefPtr icon); 45 | 46 | bool InvokeCurrentSceneDefaultAction(); 47 | bool InvokeCurrentSceneDefaultContextMenu(); 48 | 49 | bool DeserializeScenesAuxiliaryActions(CefRefPtr m_actions) 50 | { 51 | m_scenesToolBarActions = m_actions->Copy(); 52 | 53 | UpdateScenesToolbar(); 54 | 55 | return true; 56 | } 57 | 58 | void SerializeScenesAuxiliaryActions(CefRefPtr &output) 59 | { 60 | output = m_scenesToolBarActions->Copy(); 61 | } 62 | 63 | void Update() { ScheduleUpdateWidgets(); } 64 | 65 | QListWidget *GetScenesListWidget() { return m_nativeWidget; } 66 | 67 | void CheckViewMode(); 68 | 69 | private: 70 | void HandleScenesModelReset(); 71 | void HandleScenesModelItemInsertedRemoved(const QModelIndex &, int, 72 | int); 73 | void HandleScenesModelItemMoved(const QModelIndex &, int, int, 74 | const QModelIndex &, int); 75 | 76 | static void HandleSceneRename(void *data, calldata_t *params); 77 | 78 | void HandleScenesItemDoubleClicked(QListWidgetItem *item); 79 | 80 | void ScheduleUpdateWidgets(); 81 | void UpdateWidgets(); 82 | 83 | void UpdateScenesToolbar(); 84 | 85 | private: 86 | QMainWindow *m_mainWindow = nullptr; 87 | QListWidget *m_nativeWidget = nullptr; 88 | bool m_enableSignals = false; 89 | StreamElementsDeferredExecutive m_updateWidgetsDeferredExecutive; 90 | QAbstractItemDelegate *m_editDelegate; 91 | QAbstractItemDelegate *m_prevEditDelegate; 92 | CefRefPtr m_scenesToolBarActions = CefValue::Create(); 93 | QToolBar *m_scenesToolBar = nullptr; 94 | QObject *m_eventFilter = nullptr; 95 | QListWidget::ViewMode m_prevViewMode = QListView::ListMode; 96 | }; 97 | -------------------------------------------------------------------------------- /streamelements/StreamElementsWorkerManager.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "StreamElementsUtils.hpp" 4 | #include "StreamElementsObsAppMonitor.hpp" 5 | #include "StreamElementsBrowserWidget.hpp" 6 | 7 | #include "cef-headers.hpp" 8 | 9 | #include 10 | #include 11 | #include 12 | 13 | class StreamElementsWorkerManager : 14 | public StreamElementsObsAppMonitor 15 | { 16 | private: 17 | class StreamElementsWorker; 18 | 19 | public: 20 | StreamElementsWorkerManager(); 21 | ~StreamElementsWorkerManager(); 22 | 23 | public: 24 | void RemoveAll(); 25 | std::string Add(std::string requestedId, 26 | std::string url, std::string executeJavascriptOnLoad); 27 | void Remove(std::string id); 28 | std::string GetContent(std::string id); 29 | void GetIdentifiers(std::vector& result); 30 | 31 | public: 32 | void Serialize(CefRefPtr& output); 33 | void Deserialize(CefRefPtr& input); 34 | 35 | bool SerializeOne(std::string id, CefRefPtr& output); 36 | std::string DeserializeOne(CefRefPtr input); 37 | 38 | protected: 39 | virtual void OnObsExit(); 40 | 41 | private: 42 | std::recursive_mutex m_mutex; 43 | 44 | std::map m_items; 45 | }; 46 | -------------------------------------------------------------------------------- /streamelements/Version.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include "Version.hpp" 3 | 4 | MODULE_EXPORT int64_t streamelements_get_version_number(void) 5 | { 6 | return STREAMELEMENTS_PLUGIN_VERSION; 7 | } 8 | -------------------------------------------------------------------------------- /streamelements/Version.generated.hpp: -------------------------------------------------------------------------------- 1 | #define STREAMELEMENTS_PLUGIN_VERSION 20300506099999L 2 | -------------------------------------------------------------------------------- /streamelements/Version.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | /* Numeric value indicating the current major version of the API. 4 | * This value must be incremented each time a breaking change to 5 | * the API is introduced(change of existing API methods/properties 6 | * signatures). 7 | */ 8 | #ifndef HOST_API_VERSION_MAJOR 9 | #define HOST_API_VERSION_MAJOR 2 10 | #endif 11 | 12 | /* Numeric value indicating the current minor version of the API. 13 | * This value will be incremented each time a non-breaking change 14 | * to the API is introduced (additional functionality, bugfixes 15 | * of existing functionality). 16 | */ 17 | #ifndef HOST_API_VERSION_MINOR 18 | #define HOST_API_VERSION_MINOR 3 19 | #endif 20 | 21 | /* Numeric value in the YYYYMMDDHHmmss format, indicating the current 22 | * version of the plugin. 23 | * 24 | * This version number is used by obs-streamelements plug-in to 25 | * determine whether an update is available and should be offered to 26 | * the user. 27 | * 28 | * This value should be set as part of the build process. 29 | */ 30 | #ifndef STREAMELEMENTS_PLUGIN_VERSION 31 | #include "Version.generated.hpp" 32 | #endif 33 | -------------------------------------------------------------------------------- /streamelements/deps/StackWalker/LICENSE: -------------------------------------------------------------------------------- 1 | BSD-2-Clause 2 | 3 | Copyright (c) 2005 - 2019, Jochen Kalmbach 4 | All rights reserved. 5 | 6 | Redistribution and use in source and binary forms, with or without 7 | modification, are permitted provided that the following conditions are met: 8 | 9 | 1. Redistributions of source code must retain the above copyright notice, this 10 | list of conditions and the following disclaimer. 11 | 12 | 2. Redistributions in binary form must reproduce the above copyright notice, 13 | this list of conditions and the following disclaimer in the documentation 14 | and/or other materials provided with the distribution. 15 | 16 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 17 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 19 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 20 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 22 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 23 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 24 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 25 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -------------------------------------------------------------------------------- /streamelements/deps/cpp-httplib/LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2017 yhirose 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /streamelements/deps/cpp-httplib/example/benchmark.cc: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | 5 | using namespace std; 6 | 7 | struct StopWatch { 8 | StopWatch(const string &label) : label_(label) { 9 | start_ = chrono::system_clock::now(); 10 | } 11 | ~StopWatch() { 12 | auto end = chrono::system_clock::now(); 13 | auto diff = end - start_; 14 | auto count = chrono::duration_cast(diff).count(); 15 | cout << label_ << ": " << count << " millisec." << endl; 16 | } 17 | string label_; 18 | chrono::system_clock::time_point start_; 19 | }; 20 | 21 | int main(void) { 22 | string body(1024 * 5, 'a'); 23 | 24 | httplib::Client cli("httpbin.org", 80); 25 | 26 | for (int i = 0; i < 3; i++) { 27 | StopWatch sw(to_string(i).c_str()); 28 | auto res = cli.Post("/post", body, "application/octet-stream"); 29 | assert(res->status == 200); 30 | } 31 | 32 | return 0; 33 | } 34 | -------------------------------------------------------------------------------- /streamelements/deps/cpp-httplib/example/client.cc: -------------------------------------------------------------------------------- 1 | // 2 | // client.cc 3 | // 4 | // Copyright (c) 2019 Yuji Hirose. All rights reserved. 5 | // MIT License 6 | // 7 | 8 | #include 9 | #include 10 | 11 | #define CA_CERT_FILE "./ca-bundle.crt" 12 | 13 | using namespace std; 14 | 15 | int main(void) { 16 | #ifdef CPPHTTPLIB_OPENSSL_SUPPORT 17 | httplib::SSLClient cli("localhost", 8080); 18 | // httplib::SSLClient cli("google.com"); 19 | // httplib::SSLClient cli("www.youtube.com"); 20 | cli.set_ca_cert_path(CA_CERT_FILE); 21 | cli.enable_server_certificate_verification(true); 22 | #else 23 | httplib::Client cli("localhost", 8080); 24 | #endif 25 | 26 | if (auto res = cli.Get("/hi")) { 27 | cout << res->status << endl; 28 | cout << res->get_header_value("Content-Type") << endl; 29 | cout << res->body << endl; 30 | } else { 31 | cout << "error code: " << res.error() << std::endl; 32 | #ifdef CPPHTTPLIB_OPENSSL_SUPPORT 33 | auto result = cli.get_openssl_verify_result(); 34 | if (result) { 35 | cout << "verify error: " << X509_verify_cert_error_string(result) << endl; 36 | } 37 | #endif 38 | } 39 | 40 | return 0; 41 | } 42 | -------------------------------------------------------------------------------- /streamelements/deps/cpp-httplib/example/example.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio 15 4 | VisualStudioVersion = 15.0.27703.2047 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "server", "server.vcxproj", "{864CD288-050A-4C8B-9BEF-3048BD876C5B}" 7 | EndProject 8 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "client", "client.vcxproj", "{6DB1FC63-B153-4279-92B7-D8A11AF285D6}" 9 | EndProject 10 | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{280E605F-0CB8-4336-8D9F-CE50A9472AE2}" 11 | ProjectSection(SolutionItems) = preProject 12 | ..\README.md = ..\README.md 13 | EndProjectSection 14 | EndProject 15 | Global 16 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 17 | Debug|Win32 = Debug|Win32 18 | Debug|x64 = Debug|x64 19 | Release|Win32 = Release|Win32 20 | Release|x64 = Release|x64 21 | EndGlobalSection 22 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 23 | {864CD288-050A-4C8B-9BEF-3048BD876C5B}.Debug|Win32.ActiveCfg = Debug|Win32 24 | {864CD288-050A-4C8B-9BEF-3048BD876C5B}.Debug|Win32.Build.0 = Debug|Win32 25 | {864CD288-050A-4C8B-9BEF-3048BD876C5B}.Debug|x64.ActiveCfg = Debug|x64 26 | {864CD288-050A-4C8B-9BEF-3048BD876C5B}.Debug|x64.Build.0 = Debug|x64 27 | {864CD288-050A-4C8B-9BEF-3048BD876C5B}.Release|Win32.ActiveCfg = Release|Win32 28 | {864CD288-050A-4C8B-9BEF-3048BD876C5B}.Release|Win32.Build.0 = Release|Win32 29 | {864CD288-050A-4C8B-9BEF-3048BD876C5B}.Release|x64.ActiveCfg = Release|x64 30 | {864CD288-050A-4C8B-9BEF-3048BD876C5B}.Release|x64.Build.0 = Release|x64 31 | {6DB1FC63-B153-4279-92B7-D8A11AF285D6}.Debug|Win32.ActiveCfg = Debug|Win32 32 | {6DB1FC63-B153-4279-92B7-D8A11AF285D6}.Debug|Win32.Build.0 = Debug|Win32 33 | {6DB1FC63-B153-4279-92B7-D8A11AF285D6}.Debug|x64.ActiveCfg = Debug|x64 34 | {6DB1FC63-B153-4279-92B7-D8A11AF285D6}.Debug|x64.Build.0 = Debug|x64 35 | {6DB1FC63-B153-4279-92B7-D8A11AF285D6}.Release|Win32.ActiveCfg = Release|Win32 36 | {6DB1FC63-B153-4279-92B7-D8A11AF285D6}.Release|Win32.Build.0 = Release|Win32 37 | {6DB1FC63-B153-4279-92B7-D8A11AF285D6}.Release|x64.ActiveCfg = Release|x64 38 | {6DB1FC63-B153-4279-92B7-D8A11AF285D6}.Release|x64.Build.0 = Release|x64 39 | EndGlobalSection 40 | GlobalSection(SolutionProperties) = preSolution 41 | HideSolutionNode = FALSE 42 | EndGlobalSection 43 | GlobalSection(ExtensibilityGlobals) = postSolution 44 | SolutionGuid = {7097C9E4-07F8-48C6-A888-BBA9EBB5D17D} 45 | EndGlobalSection 46 | EndGlobal 47 | -------------------------------------------------------------------------------- /streamelements/deps/cpp-httplib/example/hello.cc: -------------------------------------------------------------------------------- 1 | // 2 | // hello.cc 3 | // 4 | // Copyright (c) 2019 Yuji Hirose. All rights reserved. 5 | // MIT License 6 | // 7 | 8 | #include 9 | using namespace httplib; 10 | 11 | int main(void) { 12 | Server svr; 13 | 14 | svr.Get("/hi", [](const Request & /*req*/, Response &res) { 15 | res.set_content("Hello World!", "text/plain"); 16 | }); 17 | 18 | svr.listen("localhost", 8080); 19 | } 20 | -------------------------------------------------------------------------------- /streamelements/deps/cpp-httplib/example/redirect.cc: -------------------------------------------------------------------------------- 1 | // 2 | // redirect.cc 3 | // 4 | // Copyright (c) 2019 Yuji Hirose. All rights reserved. 5 | // MIT License 6 | // 7 | 8 | #include 9 | 10 | #define SERVER_CERT_FILE "./cert.pem" 11 | #define SERVER_PRIVATE_KEY_FILE "./key.pem" 12 | 13 | using namespace httplib; 14 | 15 | int main(void) { 16 | // HTTP server 17 | Server http; 18 | #ifdef CPPHTTPLIB_OPENSSL_SUPPORT 19 | SSLServer https(SERVER_CERT_FILE, SERVER_PRIVATE_KEY_FILE); 20 | #endif 21 | 22 | http.Get("/test", [](const Request & /*req*/, Response &res) { 23 | res.set_content("Test\n", "text/plain"); 24 | }); 25 | 26 | http.set_error_handler([](const Request & /*req*/, Response &res) { 27 | res.set_redirect("https://localhost:8081/"); 28 | }); 29 | 30 | // HTTPS server 31 | #ifdef CPPHTTPLIB_OPENSSL_SUPPORT 32 | https.Get("/", [=](const Request & /*req*/, Response &res) { 33 | res.set_redirect("/hi"); 34 | }); 35 | 36 | https.Get("/hi", [](const Request & /*req*/, Response &res) { 37 | res.set_content("Hello World!\n", "text/plain"); 38 | }); 39 | 40 | https.Get("/stop", [&](const Request & /*req*/, Response & /*res*/) { 41 | https.stop(); 42 | http.stop(); 43 | }); 44 | #endif 45 | 46 | // Run servers 47 | auto httpThread = std::thread([&]() { http.listen("localhost", 8080); }); 48 | 49 | #ifdef CPPHTTPLIB_OPENSSL_SUPPORT 50 | auto httpsThread = std::thread([&]() { https.listen("localhost", 8081); }); 51 | #endif 52 | 53 | httpThread.join(); 54 | 55 | #ifdef CPPHTTPLIB_OPENSSL_SUPPORT 56 | httpsThread.join(); 57 | #endif 58 | 59 | return 0; 60 | } 61 | -------------------------------------------------------------------------------- /streamelements/deps/cpp-httplib/example/simplecli.cc: -------------------------------------------------------------------------------- 1 | // 2 | // simplecli.cc 3 | // 4 | // Copyright (c) 2019 Yuji Hirose. All rights reserved. 5 | // MIT License 6 | // 7 | 8 | #include 9 | #include 10 | 11 | using namespace std; 12 | 13 | int main(void) { 14 | #ifdef CPPHTTPLIB_OPENSSL_SUPPORT 15 | auto scheme_host_port = "https://localhost:8080"; 16 | #else 17 | auto scheme_host_port = "http://localhost:8080"; 18 | #endif 19 | 20 | if (auto res = httplib::Client(scheme_host_port).Get("/hi")) { 21 | cout << res->status << endl; 22 | cout << res->get_header_value("Content-Type") << endl; 23 | cout << res->body << endl; 24 | } else { 25 | cout << res.error() << endl; 26 | } 27 | 28 | return 0; 29 | } 30 | -------------------------------------------------------------------------------- /streamelements/deps/cpp-httplib/example/upload.cc: -------------------------------------------------------------------------------- 1 | // 2 | // upload.cc 3 | // 4 | // Copyright (c) 2019 Yuji Hirose. All rights reserved. 5 | // MIT License 6 | // 7 | 8 | #include 9 | #include 10 | #include 11 | using namespace httplib; 12 | using namespace std; 13 | 14 | const char *html = R"( 15 |
16 | 17 | 18 | 19 |
20 | 30 | )"; 31 | 32 | int main(void) { 33 | Server svr; 34 | 35 | svr.Get("/", [](const Request & /*req*/, Response &res) { 36 | res.set_content(html, "text/html"); 37 | }); 38 | 39 | svr.Post("/post", [](const Request &req, Response &res) { 40 | auto image_file = req.get_file_value("image_file"); 41 | auto text_file = req.get_file_value("text_file"); 42 | 43 | cout << "image file length: " << image_file.content.length() << endl 44 | << "image file name: " << image_file.filename << endl 45 | << "text file length: " << text_file.content.length() << endl 46 | << "text file name: " << text_file.filename << endl; 47 | 48 | { 49 | ofstream ofs(image_file.filename, ios::binary); 50 | ofs << image_file.content; 51 | } 52 | { 53 | ofstream ofs(text_file.filename); 54 | ofs << text_file.content; 55 | } 56 | 57 | res.set_content("done", "text/plain"); 58 | }); 59 | 60 | svr.listen("localhost", 1234); 61 | } 62 | -------------------------------------------------------------------------------- /streamelements/deps/cpp-httplib/split.py: -------------------------------------------------------------------------------- 1 | import os 2 | import sys 3 | 4 | border = '// ----------------------------------------------------------------------------' 5 | 6 | PythonVersion = sys.version_info[0]; 7 | 8 | with open('httplib.h') as f: 9 | lines = f.readlines() 10 | inImplementation = False 11 | 12 | if PythonVersion < 3: 13 | os.makedirs('out') 14 | else: 15 | os.makedirs('out', exist_ok=True) 16 | 17 | with open('out/httplib.h', 'w') as fh: 18 | with open('out/httplib.cc', 'w') as fc: 19 | fc.write('#include "httplib.h"\n') 20 | fc.write('namespace httplib {\n') 21 | for line in lines: 22 | isBorderLine = border in line 23 | if isBorderLine: 24 | inImplementation = not inImplementation 25 | else: 26 | if inImplementation: 27 | fc.write(line.replace('inline ', '')) 28 | pass 29 | else: 30 | fh.write(line) 31 | pass 32 | fc.write('} // namespace httplib\n') 33 | -------------------------------------------------------------------------------- /streamelements/deps/cpp-httplib/test/Makefile.fuzz_test: -------------------------------------------------------------------------------- 1 | 2 | #CXX = clang++ 3 | CXXFLAGS += -ggdb -O0 -std=c++11 -DGTEST_USE_OWN_TR1_TUPLE -I.. -I. -Wall -Wextra -Wtype-limits -Wconversion 4 | 5 | OPENSSL_DIR = /usr/local/opt/openssl@1.1 6 | OPENSSL_SUPPORT = -DCPPHTTPLIB_OPENSSL_SUPPORT -I$(OPENSSL_DIR)/include -L$(OPENSSL_DIR)/lib -lssl -lcrypto 7 | 8 | ZLIB_SUPPORT = -DCPPHTTPLIB_ZLIB_SUPPORT -lz 9 | 10 | BROTLI_DIR = /usr/local/opt/brotli 11 | BROTLI_SUPPORT = -DCPPHTTPLIB_BROTLI_SUPPORT -I$(BROTLI_DIR)/include -L$(BROTLI_DIR)/lib -lbrotlicommon -lbrotlienc -lbrotlidec 12 | 13 | # By default, use standalone_fuzz_target_runner. 14 | # This runner does no fuzzing, but simply executes the inputs 15 | # provided via parameters. 16 | # Run e.g. "make all LIB_FUZZING_ENGINE=/path/to/libFuzzer.a" 17 | # to link the fuzzer(s) against a real fuzzing engine. 18 | # OSS-Fuzz will define its own value for LIB_FUZZING_ENGINE. 19 | LIB_FUZZING_ENGINE ?= standalone_fuzz_target_runner.o 20 | 21 | # Runs server_fuzzer.cc based on value of $(LIB_FUZZING_ENGINE). 22 | # Usage: make fuzz_test LIB_FUZZING_ENGINE=/path/to/libFuzzer 23 | all fuzz_test: server_fuzzer 24 | ./server_fuzzer fuzzing/corpus/* 25 | 26 | # Fuzz target, so that you can choose which $(LIB_FUZZING_ENGINE) to use. 27 | server_fuzzer : fuzzing/server_fuzzer.cc ../httplib.h standalone_fuzz_target_runner.o 28 | $(CXX) $(CXXFLAGS) -o $@ $< $(OPENSSL_SUPPORT) $(ZLIB_SUPPORT) $(BROTLI_SUPPORT) $(LIB_FUZZING_ENGINE) -pthread 29 | 30 | # Standalone fuzz runner, which just reads inputs from fuzzing/corpus/ dir and 31 | # feeds it to server_fuzzer. 32 | standalone_fuzz_target_runner.o : fuzzing/standalone_fuzz_target_runner.cpp 33 | $(CXX) $(CXXFLAGS) -c -o $@ $< 34 | 35 | clean: 36 | rm -f server_fuzzer pem *.0 *.o *.1 *.srl *.zip 37 | -------------------------------------------------------------------------------- /streamelements/deps/cpp-httplib/test/fuzzing/corpus/1: -------------------------------------------------------------------------------- 1 | PUT /search/sample?a=12 HTTP/1.1 -------------------------------------------------------------------------------- /streamelements/deps/cpp-httplib/test/fuzzing/corpus/2: -------------------------------------------------------------------------------- 1 | GET /hello.htm HTTP/1.1 2 | User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT) 3 | Accept-Language: en-us 4 | Accept-Encoding: gzip, deflate 5 | Connection: Keep-Alive -------------------------------------------------------------------------------- /streamelements/deps/cpp-httplib/test/fuzzing/standalone_fuzz_target_runner.cpp: -------------------------------------------------------------------------------- 1 | // Copyright 2017 Google Inc. All Rights Reserved. 2 | // Licensed under the Apache License, Version 2.0 (the "License"); 3 | 4 | // This runner does not do any fuzzing, but allows us to run the fuzz target 5 | // on the test corpus or on a single file, 6 | // e.g. the one that comes from a bug report. 7 | 8 | #include 9 | #include 10 | #include 11 | #include 12 | 13 | // Forward declare the "fuzz target" interface. 14 | // We deliberately keep this inteface simple and header-free. 15 | extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size); 16 | 17 | // It reads all files passed as parameters and feeds their contents 18 | // one by one into the fuzz target (LLVMFuzzerTestOneInput). 19 | int main(int argc, char **argv) { 20 | for (int i = 1; i < argc; i++) { 21 | std::ifstream in(argv[i]); 22 | in.seekg(0, in.end); 23 | size_t length = in.tellg(); 24 | in.seekg (0, in.beg); 25 | std::cout << "Reading " << length << " bytes from " << argv[i] << std::endl; 26 | // Allocate exactly length bytes so that we reliably catch buffer overflows. 27 | std::vector bytes(length); 28 | in.read(bytes.data(), bytes.size()); 29 | LLVMFuzzerTestOneInput(reinterpret_cast(bytes.data()), 30 | bytes.size()); 31 | std::cout << "Execution successful" << std::endl; 32 | } 33 | std::cout << "Execution finished" << std::endl; 34 | return 0; 35 | } -------------------------------------------------------------------------------- /streamelements/deps/cpp-httplib/test/gtest/gtest_main.cc: -------------------------------------------------------------------------------- 1 | // Copyright 2006, Google Inc. 2 | // All rights reserved. 3 | // 4 | // Redistribution and use in source and binary forms, with or without 5 | // modification, are permitted provided that the following conditions are 6 | // met: 7 | // 8 | // * Redistributions of source code must retain the above copyright 9 | // notice, this list of conditions and the following disclaimer. 10 | // * Redistributions in binary form must reproduce the above 11 | // copyright notice, this list of conditions and the following disclaimer 12 | // in the documentation and/or other materials provided with the 13 | // distribution. 14 | // * Neither the name of Google Inc. nor the names of its 15 | // contributors may be used to endorse or promote products derived from 16 | // this software without specific prior written permission. 17 | // 18 | // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19 | // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20 | // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21 | // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22 | // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23 | // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24 | // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25 | // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26 | // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27 | // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28 | // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 | 30 | #include 31 | 32 | #include "gtest/gtest.h" 33 | 34 | GTEST_API_ int main(int argc, char **argv) { 35 | std::cout << "Running main() from gtest_main.cc\n"; 36 | 37 | testing::InitGoogleTest(&argc, argv); 38 | return RUN_ALL_TESTS(); 39 | } 40 | -------------------------------------------------------------------------------- /streamelements/deps/cpp-httplib/test/image.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StreamElements/obs-browser/86ff8434f1f757ca7909be37e07f0d2bdcb7f586/streamelements/deps/cpp-httplib/test/image.jpg -------------------------------------------------------------------------------- /streamelements/deps/cpp-httplib/test/proxy/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM centos:7 2 | 3 | ARG auth="basic" 4 | ARG port="3128" 5 | 6 | RUN yum install -y squid 7 | 8 | COPY ./${auth}_squid.conf /etc/squid/squid.conf 9 | COPY ./${auth}_passwd /etc/squid/passwd 10 | 11 | EXPOSE ${port} 12 | 13 | CMD ["/usr/sbin/squid", "-N"] 14 | -------------------------------------------------------------------------------- /streamelements/deps/cpp-httplib/test/proxy/basic_passwd: -------------------------------------------------------------------------------- 1 | hello:$apr1$O6S28OBL$8dr3ixl4Mohf97hgsYvLy/ 2 | -------------------------------------------------------------------------------- /streamelements/deps/cpp-httplib/test/proxy/basic_squid.conf: -------------------------------------------------------------------------------- 1 | # 2 | # Recommended minimum configuration: 3 | # 4 | 5 | # Example rule allowing access from your local networks. 6 | # Adapt to list your (internal) IP networks from where browsing 7 | # should be allowed 8 | acl localnet src 0.0.0.1-0.255.255.255 # RFC 1122 "this" network (LAN) 9 | acl localnet src 10.0.0.0/8 # RFC 1918 local private network (LAN) 10 | acl localnet src 100.64.0.0/10 # RFC 6598 shared address space (CGN) 11 | acl localnet src 169.254.0.0/16 # RFC 3927 link-local (directly plugged) machines 12 | acl localnet src 172.16.0.0/12 # RFC 1918 local private network (LAN) 13 | acl localnet src 192.168.0.0/16 # RFC 1918 local private network (LAN) 14 | acl localnet src fc00::/7 # RFC 4193 local private network range 15 | acl localnet src fe80::/10 # RFC 4291 link-local (directly plugged) machines 16 | 17 | acl SSL_ports port 443 18 | acl Safe_ports port 80 # http 19 | acl Safe_ports port 21 # ftp 20 | acl Safe_ports port 443 # https 21 | acl Safe_ports port 70 # gopher 22 | acl Safe_ports port 210 # wais 23 | acl Safe_ports port 1025-65535 # unregistered ports 24 | acl Safe_ports port 280 # http-mgmt 25 | acl Safe_ports port 488 # gss-http 26 | acl Safe_ports port 591 # filemaker 27 | acl Safe_ports port 777 # multiling http 28 | acl CONNECT method CONNECT 29 | 30 | auth_param basic program /usr/lib64/squid/basic_ncsa_auth /etc/squid/passwd 31 | auth_param basic realm proxy 32 | acl authenticated proxy_auth REQUIRED 33 | http_access allow authenticated 34 | 35 | # 36 | # Recommended minimum Access Permission configuration: 37 | # 38 | # Deny requests to certain unsafe ports 39 | http_access deny !Safe_ports 40 | 41 | # Deny CONNECT to other than secure SSL ports 42 | http_access deny CONNECT !SSL_ports 43 | 44 | # Only allow cachemgr access from localhost 45 | http_access allow localhost manager 46 | http_access deny manager 47 | 48 | # We strongly recommend the following be uncommented to protect innocent 49 | # web applications running on the proxy server who think the only 50 | # one who can access services on "localhost" is a local user 51 | #http_access deny to_localhost 52 | 53 | # 54 | # INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS 55 | # 56 | 57 | # Example rule allowing access from your local networks. 58 | # Adapt localnet in the ACL section to list your (internal) IP networks 59 | # from where browsing should be allowed 60 | http_access allow localnet 61 | http_access allow localhost 62 | 63 | # And finally deny all other access to this proxy 64 | http_access deny all 65 | 66 | # Squid normally listens to port 3128 67 | http_port 3128 68 | 69 | # Uncomment and adjust the following to add a disk cache directory. 70 | #cache_dir ufs /var/spool/squid 100 16 256 71 | 72 | # Leave coredumps in the first cache dir 73 | coredump_dir /var/spool/squid 74 | 75 | # 76 | # Add any of your own refresh_pattern entries above these. 77 | # 78 | refresh_pattern ^ftp: 1440 20% 10080 79 | refresh_pattern ^gopher: 1440 0% 1440 80 | refresh_pattern -i (/cgi-bin/|\?) 0 0% 0 81 | refresh_pattern . 0 20% 4320 82 | -------------------------------------------------------------------------------- /streamelements/deps/cpp-httplib/test/proxy/digest_passwd: -------------------------------------------------------------------------------- 1 | hello:world 2 | -------------------------------------------------------------------------------- /streamelements/deps/cpp-httplib/test/proxy/digest_squid.conf: -------------------------------------------------------------------------------- 1 | # 2 | # Recommended minimum configuration: 3 | # 4 | 5 | # Example rule allowing access from your local networks. 6 | # Adapt to list your (internal) IP networks from where browsing 7 | # should be allowed 8 | acl localnet src 0.0.0.1-0.255.255.255 # RFC 1122 "this" network (LAN) 9 | acl localnet src 10.0.0.0/8 # RFC 1918 local private network (LAN) 10 | acl localnet src 100.64.0.0/10 # RFC 6598 shared address space (CGN) 11 | acl localnet src 169.254.0.0/16 # RFC 3927 link-local (directly plugged) machines 12 | acl localnet src 172.16.0.0/12 # RFC 1918 local private network (LAN) 13 | acl localnet src 192.168.0.0/16 # RFC 1918 local private network (LAN) 14 | acl localnet src fc00::/7 # RFC 4193 local private network range 15 | acl localnet src fe80::/10 # RFC 4291 link-local (directly plugged) machines 16 | 17 | acl SSL_ports port 443 18 | acl Safe_ports port 80 # http 19 | acl Safe_ports port 21 # ftp 20 | acl Safe_ports port 443 # https 21 | acl Safe_ports port 70 # gopher 22 | acl Safe_ports port 210 # wais 23 | acl Safe_ports port 1025-65535 # unregistered ports 24 | acl Safe_ports port 280 # http-mgmt 25 | acl Safe_ports port 488 # gss-http 26 | acl Safe_ports port 591 # filemaker 27 | acl Safe_ports port 777 # multiling http 28 | acl CONNECT method CONNECT 29 | 30 | auth_param digest program /usr/lib64/squid/digest_file_auth /etc/squid/passwd 31 | auth_param digest realm proxy 32 | acl authenticated proxy_auth REQUIRED 33 | http_access allow authenticated 34 | 35 | # 36 | # Recommended minimum Access Permission configuration: 37 | # 38 | # Deny requests to certain unsafe ports 39 | http_access deny !Safe_ports 40 | 41 | # Deny CONNECT to other than secure SSL ports 42 | http_access deny CONNECT !SSL_ports 43 | 44 | # Only allow cachemgr access from localhost 45 | http_access allow localhost manager 46 | http_access deny manager 47 | 48 | # We strongly recommend the following be uncommented to protect innocent 49 | # web applications running on the proxy server who think the only 50 | # one who can access services on "localhost" is a local user 51 | #http_access deny to_localhost 52 | 53 | # 54 | # INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS 55 | # 56 | 57 | # Example rule allowing access from your local networks. 58 | # Adapt localnet in the ACL section to list your (internal) IP networks 59 | # from where browsing should be allowed 60 | http_access allow localnet 61 | http_access allow localhost 62 | 63 | # And finally deny all other access to this proxy 64 | http_access deny all 65 | 66 | # Squid normally listens to port 3128 67 | http_port 3129 68 | 69 | # Uncomment and adjust the following to add a disk cache directory. 70 | #cache_dir ufs /var/spool/squid 100 16 256 71 | 72 | # Leave coredumps in the first cache dir 73 | coredump_dir /var/spool/squid 74 | 75 | # 76 | # Add any of your own refresh_pattern entries above these. 77 | # 78 | refresh_pattern ^ftp: 1440 20% 10080 79 | refresh_pattern ^gopher: 1440 0% 1440 80 | refresh_pattern -i (/cgi-bin/|\?) 0 0% 0 81 | refresh_pattern . 0 20% 4320 82 | -------------------------------------------------------------------------------- /streamelements/deps/cpp-httplib/test/proxy/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '2' 2 | 3 | services: 4 | squid_basic: 5 | image: squid_basic 6 | restart: always 7 | ports: 8 | - "3128:3128" 9 | build: 10 | context: ./ 11 | args: 12 | auth: basic 13 | 14 | squid_digest: 15 | image: squid_digest 16 | restart: always 17 | ports: 18 | - "3129:3129" 19 | build: 20 | context: ./ 21 | args: 22 | auth: digest 23 | -------------------------------------------------------------------------------- /streamelements/deps/cpp-httplib/test/proxy/down.sh: -------------------------------------------------------------------------------- 1 | docker-compose down --rmi all 2 | -------------------------------------------------------------------------------- /streamelements/deps/cpp-httplib/test/proxy/up.sh: -------------------------------------------------------------------------------- 1 | docker-compose up -d 2 | -------------------------------------------------------------------------------- /streamelements/deps/cpp-httplib/test/test.conf: -------------------------------------------------------------------------------- 1 | [req] 2 | default_bits = 2048 3 | distinguished_name = req_distinguished_name 4 | attributes = req_attributes 5 | prompt = no 6 | output_password = mypass 7 | 8 | [req_distinguished_name] 9 | C = US 10 | ST = Test State or Province 11 | L = Test Locality 12 | O = Organization Name 13 | OU = Organizational Unit Name 14 | CN = Common Name 15 | emailAddress = test@email.address 16 | 17 | [req_attributes] 18 | challengePassword = 1234 19 | 20 | [SAN] 21 | subjectAltName=IP:127.0.0.1 22 | -------------------------------------------------------------------------------- /streamelements/deps/cpp-httplib/test/test.rootCA.conf: -------------------------------------------------------------------------------- 1 | [req] 2 | default_bits = 2048 3 | distinguished_name = req_distinguished_name 4 | attributes = req_attributes 5 | prompt = no 6 | output_password = mypass 7 | 8 | [req_distinguished_name] 9 | C = US 10 | ST = Test State or Province 11 | L = Test Locality 12 | O = Organization Name 13 | OU = Organizational Unit Name 14 | CN = Root CA Name 15 | emailAddress = test@email.address 16 | 17 | [req_attributes] 18 | challengePassword = 1234 19 | -------------------------------------------------------------------------------- /streamelements/deps/cpp-httplib/test/test.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Express 2013 for Windows Desktop 4 | VisualStudioVersion = 12.0.20617.1 PREVIEW 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test", "test.vcxproj", "{6B3E6769-052D-4BC0-9D2C-E9127C3DBB26}" 7 | EndProject 8 | Global 9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 10 | Debug|Win32 = Debug|Win32 11 | Debug|x64 = Debug|x64 12 | Release|Win32 = Release|Win32 13 | Release|x64 = Release|x64 14 | EndGlobalSection 15 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 16 | {6B3E6769-052D-4BC0-9D2C-E9127C3DBB26}.Debug|Win32.ActiveCfg = Debug|Win32 17 | {6B3E6769-052D-4BC0-9D2C-E9127C3DBB26}.Debug|Win32.Build.0 = Debug|Win32 18 | {6B3E6769-052D-4BC0-9D2C-E9127C3DBB26}.Debug|x64.ActiveCfg = Debug|x64 19 | {6B3E6769-052D-4BC0-9D2C-E9127C3DBB26}.Debug|x64.Build.0 = Debug|x64 20 | {6B3E6769-052D-4BC0-9D2C-E9127C3DBB26}.Release|Win32.ActiveCfg = Release|Win32 21 | {6B3E6769-052D-4BC0-9D2C-E9127C3DBB26}.Release|Win32.Build.0 = Release|Win32 22 | {6B3E6769-052D-4BC0-9D2C-E9127C3DBB26}.Release|x64.ActiveCfg = Release|x64 23 | {6B3E6769-052D-4BC0-9D2C-E9127C3DBB26}.Release|x64.Build.0 = Release|x64 24 | EndGlobalSection 25 | GlobalSection(SolutionProperties) = preSolution 26 | HideSolutionNode = FALSE 27 | EndGlobalSection 28 | EndGlobal 29 | -------------------------------------------------------------------------------- /streamelements/deps/cpp-httplib/test/www/dir/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Test 6 | hi 7 | 8 | 9 | -------------------------------------------------------------------------------- /streamelements/deps/cpp-httplib/test/www/dir/test.abcde: -------------------------------------------------------------------------------- 1 | abcde -------------------------------------------------------------------------------- /streamelements/deps/cpp-httplib/test/www/dir/test.html: -------------------------------------------------------------------------------- 1 | test.html -------------------------------------------------------------------------------- /streamelements/deps/cpp-httplib/test/www2/dir/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Test 6 | hi 7 | 8 | 9 | -------------------------------------------------------------------------------- /streamelements/deps/cpp-httplib/test/www2/dir/test.html: -------------------------------------------------------------------------------- 1 | test.html -------------------------------------------------------------------------------- /streamelements/deps/cpp-httplib/test/www3/dir/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Test 6 | hi 7 | 8 | 9 | -------------------------------------------------------------------------------- /streamelements/deps/cpp-httplib/test/www3/dir/test.html: -------------------------------------------------------------------------------- 1 | test.html -------------------------------------------------------------------------------- /streamelements/deps/moodycamel/blockingconcurrentqueue.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StreamElements/obs-browser/86ff8434f1f757ca7909be37e07f0d2bdcb7f586/streamelements/deps/moodycamel/blockingconcurrentqueue.h -------------------------------------------------------------------------------- /streamelements/deps/server/HttpServer.cpp: -------------------------------------------------------------------------------- 1 | #include "HttpServer.hpp" 2 | 3 | 4 | HttpServer::HttpServer(request_handler_t requestHandler) : m_requestHandler(requestHandler) 5 | { 6 | auto reqHandler = [this](const httplib::Request& req, 7 | httplib::Response& res) -> void { 8 | if (req.has_header("Origin")) { 9 | std::string origin = req.get_header_value("Origin"); 10 | 11 | res.set_header("Access-Control-Allow-Origin", origin.c_str()); 12 | } else { 13 | res.set_header("Access-Control-Allow-Origin", "*"); 14 | } 15 | 16 | res.set_header("Access-Control-Allow-Methods", "*"); 17 | res.set_header("Access-Control-Allow-Credentials", "true"); 18 | 19 | m_requestHandler(req, res); 20 | }; 21 | 22 | m_server.Get(".*", reqHandler); 23 | m_server.Post(".*", reqHandler); 24 | m_server.Delete(".*", reqHandler); 25 | m_server.Put(".*", reqHandler); 26 | m_server.Patch(".*", reqHandler); 27 | m_server.Options(".*", reqHandler); 28 | } 29 | 30 | HttpServer::~HttpServer() 31 | { 32 | Stop(); 33 | } 34 | 35 | void HttpServer::Stop() 36 | { 37 | std::lock_guard guard(m_mutex); 38 | 39 | m_running = false; 40 | 41 | if (m_server.is_running()) { 42 | m_server.stop(); 43 | 44 | m_thread.join(); 45 | } 46 | } 47 | 48 | int HttpServer::Start(int bindToPort /*= 0*/, 49 | std::string bindToIpAddress /*= "127.0.0.1"*/) 50 | { 51 | std::lock_guard guard(m_mutex); 52 | 53 | if (m_running) { 54 | // Already running 55 | return 0; 56 | } 57 | 58 | int port = bindToPort; 59 | 60 | if (port > 0) { 61 | if (!m_server.bind_to_port(bindToIpAddress.c_str(), port)) { 62 | port = 0; 63 | } 64 | } else { 65 | port = m_server.bind_to_any_port(bindToIpAddress.c_str()); 66 | } 67 | 68 | if (port <= 0) { 69 | return 0; 70 | } 71 | 72 | m_portNumber = port; 73 | m_ipAddress = bindToIpAddress; 74 | 75 | m_running = true; 76 | 77 | m_thread = std::thread([this]() { 78 | m_server.listen_after_bind(); 79 | 80 | m_running = false; 81 | }); 82 | 83 | return port; 84 | } 85 | -------------------------------------------------------------------------------- /streamelements/deps/server/HttpServer.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | #include 5 | #include 6 | #include 7 | 8 | #include "../cpp-httplib/httplib.h" 9 | 10 | class HttpServer 11 | { 12 | public: 13 | typedef httplib::Request request_t; 14 | typedef httplib::Response response_t; 15 | typedef std::function request_handler_t; 16 | 17 | public: 18 | HttpServer(request_handler_t requestHandler); 19 | ~HttpServer(); 20 | 21 | int Start(int bindToPort = 0, 22 | std::string bindToIpAddress = "127.0.0.1"); 23 | void Stop(); 24 | 25 | const int GetPortNumber() const { return m_portNumber; } 26 | const std::string GetIpAddress() const { return m_ipAddress; } 27 | 28 | private: 29 | std::recursive_mutex m_mutex; 30 | std::thread m_thread; 31 | bool m_running = false; 32 | 33 | request_handler_t m_requestHandler; 34 | 35 | httplib::Server m_server; 36 | 37 | int m_portNumber = 0; 38 | std::string m_ipAddress = "127.0.0.1"; 39 | }; 40 | -------------------------------------------------------------------------------- /streamelements/deps/server/NamedPipesServer.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #ifdef _WIN32 4 | 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | 12 | #include "NamedPipesServerClientHandler.hpp" 13 | 14 | // Multi-threaded named pipes server. 15 | // 16 | // Accepts connections on a specified named pipe path. 17 | // Provides facilities to send a message to all connected clients. 18 | // Provides callback for handling incoming messages from connected clients. 19 | // 20 | // Named pipe operates in MESSAGE mode. 21 | // 22 | class NamedPipesServer 23 | { 24 | public: 25 | NamedPipesServer( 26 | const char* const pipeName, 27 | NamedPipesServerClientHandler::msg_handler_t msgHandler, 28 | size_t maxClients = 5); 29 | 30 | virtual ~NamedPipesServer(); 31 | 32 | public: 33 | void Start(); 34 | void Stop(); 35 | bool IsRunning(); 36 | 37 | void WriteMessage(const char* const buffer, const size_t length); 38 | 39 | private: 40 | void ThreadProc(); 41 | bool CanAddHandler(); 42 | void RemoveDisconnectedClients(); 43 | void DisconnectAllClients(); 44 | 45 | private: 46 | size_t m_maxClients; 47 | std::recursive_mutex m_mutex; 48 | std::string m_pipeName; 49 | bool m_running; 50 | std::thread m_thread; 51 | NamedPipesServerClientHandler::msg_handler_t m_msgHandler; 52 | 53 | std::list m_clients; 54 | }; 55 | 56 | #endif 57 | -------------------------------------------------------------------------------- /streamelements/deps/server/NamedPipesServerClientHandler.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #ifdef _WIN32 4 | 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include "streamelements/deps/moodycamel/blockingconcurrentqueue.h" 12 | 13 | // Single named pipes client handler. 14 | // 15 | // Instantiated and managed by NamedPipesServer class. 16 | // 17 | // Provides facility to send messages to the connected client. 18 | // Provides callback to handle incoming message from client. 19 | // 20 | class NamedPipesServerClientHandler 21 | { 22 | public: 23 | typedef std::function msg_handler_t; 24 | 25 | public: 26 | NamedPipesServerClientHandler(HANDLE hPipe, msg_handler_t msgHandler); 27 | virtual ~NamedPipesServerClientHandler(); 28 | 29 | public: 30 | bool IsConnected(); 31 | void Disconnect(); 32 | bool WriteMessage(const char* const buffer, size_t length); 33 | 34 | private: 35 | void CallbackThreadProc(); 36 | void ThreadProc(); 37 | 38 | private: 39 | HANDLE m_hPipe; 40 | std::thread m_thread; 41 | std::thread m_callback_thread; 42 | msg_handler_t m_msgHandler; 43 | std::recursive_mutex m_mutex; 44 | 45 | moodycamel::BlockingConcurrentQueue> m_writeQueue; 46 | moodycamel::BlockingConcurrentQueue> m_readQueue; 47 | }; 48 | 49 | #endif 50 | -------------------------------------------------------------------------------- /streamelements/deps/utf8.h: -------------------------------------------------------------------------------- 1 | // Copyright 2006 Nemanja Trifunovic 2 | 3 | /* 4 | Permission is hereby granted, free of charge, to any person or organization 5 | obtaining a copy of the software and accompanying documentation covered by 6 | this license (the "Software") to use, reproduce, display, distribute, 7 | execute, and transmit the Software, and to prepare derivative works of the 8 | Software, and to permit third-parties to whom the Software is furnished to 9 | do so, all subject to the following: 10 | 11 | The copyright notices in the Software and this entire statement, including 12 | the above license grant, this restriction and the following disclaimer, 13 | must be included in all copies of the Software, in whole or in part, and 14 | all derivative works of the Software, unless such copies or derivative 15 | works are solely in the form of machine-executable object code generated by 16 | a source language processor. 17 | 18 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 19 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 20 | FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT 21 | SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE 22 | FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, 23 | ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 24 | DEALINGS IN THE SOFTWARE. 25 | */ 26 | 27 | 28 | #ifndef UTF8_FOR_CPP_2675DCD0_9480_4c0c_B92A_CC14C027B731 29 | #define UTF8_FOR_CPP_2675DCD0_9480_4c0c_B92A_CC14C027B731 30 | 31 | #include "utf8/checked.h" 32 | #include "utf8/unchecked.h" 33 | 34 | #endif // header guard 35 | -------------------------------------------------------------------------------- /streamelements/html/loading.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10 | 11 | 12 | 13 | 14 |
15 | 16 |
17 |
18 | 87 |
88 |
89 | 90 | 91 | -------------------------------------------------------------------------------- /streamelements/images/icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StreamElements/obs-browser/86ff8434f1f757ca7909be37e07f0d2bdcb7f586/streamelements/images/icon.ico -------------------------------------------------------------------------------- /streamelements/images/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StreamElements/obs-browser/86ff8434f1f757ca7909be37e07f0d2bdcb7f586/streamelements/images/icon.png -------------------------------------------------------------------------------- /streamelements/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StreamElements/obs-browser/86ff8434f1f757ca7909be37e07f0d2bdcb7f586/streamelements/images/logo.png -------------------------------------------------------------------------------- /streamelements/images/logo_100x30.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StreamElements/obs-browser/86ff8434f1f757ca7909be37e07f0d2bdcb7f586/streamelements/images/logo_100x30.png -------------------------------------------------------------------------------- /streamelements/images/logo_137x30.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StreamElements/obs-browser/86ff8434f1f757ca7909be37e07f0d2bdcb7f586/streamelements/images/logo_137x30.png -------------------------------------------------------------------------------- /streamelements/images/toolbar/back.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StreamElements/obs-browser/86ff8434f1f757ca7909be37e07f0d2bdcb7f586/streamelements/images/toolbar/back.ico -------------------------------------------------------------------------------- /streamelements/images/toolbar/close.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StreamElements/obs-browser/86ff8434f1f757ca7909be37e07f0d2bdcb7f586/streamelements/images/toolbar/close.png -------------------------------------------------------------------------------- /streamelements/images/toolbar/dockToggle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StreamElements/obs-browser/86ff8434f1f757ca7909be37e07f0d2bdcb7f586/streamelements/images/toolbar/dockToggle.png -------------------------------------------------------------------------------- /streamelements/images/toolbar/forward.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StreamElements/obs-browser/86ff8434f1f757ca7909be37e07f0d2bdcb7f586/streamelements/images/toolbar/forward.ico -------------------------------------------------------------------------------- /streamelements/images/toolbar/home.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StreamElements/obs-browser/86ff8434f1f757ca7909be37e07f0d2bdcb7f586/streamelements/images/toolbar/home.ico -------------------------------------------------------------------------------- /streamelements/images/toolbar/reload.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StreamElements/obs-browser/86ff8434f1f757ca7909be37e07f0d2bdcb7f586/streamelements/images/toolbar/reload.ico -------------------------------------------------------------------------------- /streamelements/images/toolbar/reload.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StreamElements/obs-browser/86ff8434f1f757ca7909be37e07f0d2bdcb7f586/streamelements/images/toolbar/reload.png -------------------------------------------------------------------------------- /streamelements/qt.conf: -------------------------------------------------------------------------------- 1 | [Platforms] 2 | WindowsArguments = dpiawareness=2 3 | -------------------------------------------------------------------------------- /streamelements/restore-script-host/ScriptEngine.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | // Include the definitions of the script library and the add-ons we'll use. 4 | // The project settings may need to be configured to let the compiler where 5 | // to find these headers. Don't forget to add the source modules for the 6 | // add-ons to your project as well so that they will be compiled into the 7 | // application. 8 | #include 9 | #include 10 | 11 | #include 12 | 13 | class ScriptEngine { 14 | public: 15 | ScriptEngine(); 16 | ~ScriptEngine(); 17 | 18 | public: 19 | bool ExecuteString(const char *script); 20 | bool ExecuteFile(const char *path); 21 | 22 | public: 23 | const char *GetLastErrorText() { return m_lastErrorText.c_str(); } 24 | 25 | private: 26 | asIScriptEngine *m_engine; 27 | std::string m_lastErrorText; 28 | }; 29 | -------------------------------------------------------------------------------- /streamelements/restore-script-host/main.cpp: -------------------------------------------------------------------------------- 1 | #include "main.hpp" 2 | 3 | #include 4 | 5 | int main(int argc, char **argv) 6 | { 7 | if (argc != 2) { 8 | printf("Usage: %s --|path\n", argv[0]); 9 | 10 | return 255; 11 | } 12 | 13 | std::string filePath(argv[1]); 14 | 15 | ScriptEngine engine; 16 | bool result = false; 17 | 18 | if (filePath == "--") { 19 | std::string script; 20 | 21 | char buffer[32768 + 1]; 22 | 23 | while (!feof(stdin) && 24 | fgets(buffer, sizeof(buffer) - 1, stdin)) { 25 | buffer[sizeof(buffer) - 1] = 0; 26 | script += buffer; 27 | } 28 | 29 | result = engine.ExecuteString(script.c_str()); 30 | } else { 31 | result = engine.ExecuteFile(argv[1]); 32 | } 33 | 34 | return result ? 0 : 1; 35 | } 36 | 37 | #include 38 | #include 39 | 40 | int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, 41 | int nShowCmd) 42 | { 43 | std::wstring_convert> myconv; 44 | 45 | WCHAR *wCommandLine = GetCommandLineW(); 46 | 47 | int argc; 48 | LPWSTR *wArgv = CommandLineToArgvW(wCommandLine, &argc); 49 | 50 | std::vector stdArgv; 51 | for (int i = 0; i < argc; ++i) { 52 | stdArgv.emplace_back(myconv.to_bytes(wArgv[i])); 53 | } 54 | 55 | LocalFree(wArgv); 56 | 57 | char **argv = (char **)malloc(sizeof(char *) * argc); 58 | 59 | for (int i = 0; i < stdArgv.size(); ++i) { 60 | argv[i] = (char*)stdArgv[i].data(); 61 | } 62 | 63 | int retVal = main(argc, argv); 64 | 65 | free(argv); 66 | 67 | return retVal; 68 | } 69 | -------------------------------------------------------------------------------- /streamelements/restore-script-host/main.hpp: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include "ScriptEngine.hpp" 4 | -------------------------------------------------------------------------------- /streamelements/restore-script-host/main.rc: -------------------------------------------------------------------------------- 1 | IDI_ICON1 ICON DISCARDABLE "streamelements.ico" 2 | -------------------------------------------------------------------------------- /streamelements/restore-script-host/streamelements.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StreamElements/obs-browser/86ff8434f1f757ca7909be37e07f0d2bdcb7f586/streamelements/restore-script-host/streamelements.ico -------------------------------------------------------------------------------- /streamelements/streamelements.qrc: -------------------------------------------------------------------------------- 1 | 2 | 3 | images/logo.png 4 | images/icon.png 5 | images/icon.ico 6 | images/logo_137x30.png 7 | images/logo_100x30.png 8 | 9 | images/toolbar/back.ico 10 | images/toolbar/forward.ico 11 | images/toolbar/home.ico 12 | images/toolbar/reload.ico 13 | images/toolbar/reload.png 14 | images/toolbar/close.png 15 | images/toolbar/dockToggle.png 16 | 17 | html/error.html 18 | html/loading.html 19 | 20 | 21 | -------------------------------------------------------------------------------- /streamelements/streamelements.qrc.depends: -------------------------------------------------------------------------------- 1 | 2 | 3 | images/logo.png 4 | images/icon.png 5 | images/icon.ico 6 | images/logo_137x30.png 7 | images/logo_100x30.png 8 | 9 | images/toolbar/back.ico 10 | images/toolbar/forward.ico 11 | images/toolbar/home.ico 12 | images/toolbar/reload.ico 13 | images/toolbar/reload.png 14 | images/toolbar/close.png 15 | images/toolbar/dockToggle.png 16 | 17 | html/error.html 18 | html/loading.html 19 | 20 | 21 | --------------------------------------------------------------------------------