Skip to content

Commit

Permalink
Merge branch 'main' into 30.0.0-rc1
Browse files Browse the repository at this point in the history
  • Loading branch information
stevensoftware52 committed Jul 25, 2024
2 parents 194a77c + f1571b3 commit 61ad3ad
Show file tree
Hide file tree
Showing 4 changed files with 303 additions and 5 deletions.
12 changes: 11 additions & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,10 +1,20 @@
cmake_minimum_required(VERSION 3.16...3.25)

# OBS 28.x.x?
if (NOT COMMAND legacy_check)
if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/cmake/legacy.cmake)
include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/legacy.cmake)
endif()
return()
endif()

legacy_check()

find_package(CEF REQUIRED)
find_package(ZLIB REQUIRED)
find_package(Detours REQUIRED)

find_qt(COMPONENTS Widgets)
find_package(Qt6 REQUIRED Widgets)

include(FindGRPC.cmake)

Expand Down
31 changes: 27 additions & 4 deletions PluginJsHandler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2009,16 +2009,18 @@ void PluginJsHandler::JS_GET_LOGS_REPORT_STRING(const json11::Json& params, std:

namespace fs = std::filesystem;

#define maxLogFileSize 2097152

auto processLogFile = [](const fs::path &filePath, std::string &fullReport)
{
std::ifstream file(filePath, std::ios::binary | std::ios::ate);
auto fileSize = file.tellg();

if (fileSize > 2097152)
if (fileSize > maxLogFileSize)
{
// File size is greater than 2 MB
// Move to 2 MB before the end of the file
file.seekg(-2097152, std::ios::end);
file.seekg(-maxLogFileSize, std::ios::end);
}
else
{
Expand All @@ -2041,15 +2043,35 @@ void PluginJsHandler::JS_GET_LOGS_REPORT_STRING(const json11::Json& params, std:

try
{
std::size_t currentLogDirSize = 0;

// Process OBS log files
if (fs::exists(logDir) && fs::is_directory(logDir))
{
for (const auto &entry : fs::directory_iterator(logDir))
std::vector<fs::directory_entry> entries(fs::directory_iterator(logDir), {});
std::sort(entries.begin(), entries.end(), [](const fs::directory_entry &a, const fs::directory_entry &b) { return fs::last_write_time(a) > fs::last_write_time(b); });

for (const auto &entry : entries)
{
const auto &path = entry.path();

if (path.extension() == ".txt")
{
std::ifstream file(path, std::ios::binary | std::ios::ate);
auto fileSize = file.tellg();

if (currentLogDirSize + fileSize > maxLogFileSize)
{
fullReport += "-- " + path.filename().string() + " --\n\n";
fullReport += "File too large to fit in report.\n\n";
continue;
}

processLogFile(path, fullReport);
currentLogDirSize += fileSize;

if (currentLogDirSize >= maxLogFileSize)
break;
}
}
}

Expand Down Expand Up @@ -2090,6 +2112,7 @@ void PluginJsHandler::JS_GET_LOGS_REPORT_STRING(const json11::Json& params, std:
out_jsonReturn = Json(Json::object({{"content", fullReport}})).dump();
}


void PluginJsHandler::JS_QUERY_DOWNLOADS_FOLDER(const Json &params, std::string &out_jsonReturn)
{
std::wstring downloadsFolderFullPath = getDownloadsDir();
Expand Down
62 changes: 62 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
# Building
Only building for Windows is currently possible.

## Windows

### Prerequisites
You will need to have the following installed:

TODO

### Example Build

1. Clone OBS-Studio

git clone --recurse-submodules https:/obsproject/obs-studio.git

2. Enter the obs-studio folder

cd obs-studio

3. Choose the OBS-Studio version you want to build the plugin for (https:/obsproject/obs-studio/tags)

git checkout 30.1.2

4. Update submodules for the version

git submodule update

5. Clone the plugin into the plugins subfolder

git clone --recurse-submodules [email protected]:stream-labs/obs-sl-browser.git plugins\obs-sl-browser

6. Download and unpack the plugin dependencies (use the version from https:/stream-labs/obs-sl-browser/blob/main/.github/workflows/main.yml)

set GRPC_VERSION=v1.58.0

start /WAIT /B /D %CD%\plugins\obs-sl-browser CI\install_deps.cmd

8. Set environment variables to specify dependency paths

set PROTOBUF_DIR=%CD%\plugins\obs-sl-browser\grpc_dist\cmake

set ABSL_DIR=%CD%\plugins\obs-sl-browser\grpc_dist\lib\cmake\absl

set GRPC_DIR=%CD%\plugins\obs-sl-browser\grpc_dist\lib\cmake\grpc

set UTF8_RANGE_DIR=%CD%\plugins\obs-sl-browser\grpc_dist\lib\cmake\utf8_range

9. Add the plugin in the OBS-Studio CMake script (do it manually if the example commands below do not work)

powershell -command "(Get-Content plugins\CMakeLists.txt).Replace('add_obs_plugin(win-capture PLATFORMS WINDOWS)', \\"add_obs_plugin(win-capture PLATFORMS WINDOWS)\`r\`n add_obs_plugin(obs-sl-browser PLATFORMS WINDOWS)\\") | Set-Content plugins\CMakeLists.txt"

powershell -command "(Get-Content plugins\CMakeLists.txt).Replace('add_subdirectory(win-capture)', \\"add_subdirectory(win-capture)\`r\`n add_subdirectory(obs-sl-browser)\\") | Set-Content plugins\CMakeLists.txt"

10. Configure OBS-Studio the regular way (check https:/obsproject/obs-studio/wiki/build-instructions-for-windows)

cmake --preset windows-x64

11. Start building

cmake --build --preset windows-x64

203 changes: 203 additions & 0 deletions cmake/legacy.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,203 @@
cmake_minimum_required(VERSION 3.16...3.25)

find_package(CEF REQUIRED)
find_package(ZLIB REQUIRED)
find_package(Detours REQUIRED)

find_qt(COMPONENTS Widgets)

include(FindGRPC.cmake)

## -- Grpc between plugin and proxy

# Proto file
get_filename_component(papi_proto "sl_browser_api.proto" ABSOLUTE)
get_filename_component(papi_proto_path "${papi_proto}" PATH)

message ("${CMAKE_CURRENT_BINARY_DIR}")

# Generated sources
set(papi_proto_srcs "${CMAKE_CURRENT_BINARY_DIR}/sl_browser_api.pb.cc")
set(papi_proto_hdrs "${CMAKE_CURRENT_BINARY_DIR}/sl_browser_api.pb.h")
set(papi_grpc_srcs "${CMAKE_CURRENT_BINARY_DIR}/sl_browser_api.grpc.pb.cc")
set(papi_grpc_hdrs "${CMAKE_CURRENT_BINARY_DIR}/sl_browser_api.grpc.pb.h")

add_custom_command(
OUTPUT "${papi_proto_srcs}" "${papi_proto_hdrs}" "${papi_grpc_srcs}" "${papi_grpc_hdrs}"
COMMAND ${CMAKE_COMMAND} -E echo "Running protoc"
COMMAND ${_PROTOBUF_PROTOC}
ARGS --grpc_out "${CMAKE_CURRENT_BINARY_DIR}"
--cpp_out "${CMAKE_CURRENT_BINARY_DIR}"
-I "${papi_proto_path}"
--plugin=protoc-gen-grpc="${_GRPC_CPP_PLUGIN_EXECUTABLE}"
"${papi_proto}"
DEPENDS "${papi_proto}")

include_directories("${CMAKE_CURRENT_BINARY_DIR}")

# papi_grpc_proto
add_library(papi_grpc_proto
${papi_grpc_srcs}
${papi_grpc_hdrs}
${papi_proto_srcs}
${papi_proto_hdrs})
target_link_libraries(papi_grpc_proto
${_REFLECTION}
${_GRPC_GRPCPP}
${_PROTOBUF_LIBPROTOBUF})

## -- Browser Proxy Process

add_executable(sl-browser WIN32)

#target_compile_definitions(sl-browser PRIVATE SL_OBS_VERSION="")
#target_compile_definitions(sl-browser PRIVATE GITHUB_REVISION="")
#target_compile_definitions(sl-browser PRIVATE SL_REVISION="")
target_compile_options(sl-browser PRIVATE $<IF:$<CONFIG:DEBUG>,/MTd,/MT>)
target_link_options(sl-browser PRIVATE /NODEFAULTLIB:msvcrt)

set_target_properties(sl-browser PROPERTIES LINK_FLAGS_DEBUG "/NODEFAULTLIB:msvcrtd.lib")

if (CMAKE_BUILD_TYPE MATCHES Debug)
target_link_options(sl-browser PRIVATE /NODEFAULTLIB:msvcrtd.lib)
endif()

target_sources(
sl-browser
PRIVATE main.cpp
GrpcBrowser.cpp
SlBrowser.cpp
SlBrowserWidget.cpp
browser-app.cpp
browser-app.hpp
browser-client.cpp
browser-client.hpp
browser-scheme.cpp
browser-scheme.hpp
browser-version.h
cef-headers.hpp
deps/json11/json11.cpp
deps/json11/json11.hpp
deps/base64/base64.cpp
deps/base64/base64.hpp
deps/signal-restore.cpp
deps/signal-restore.hpp
${papi_proto_srcs}
${papi_grpc_srcs})

target_include_directories(sl-browser PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/deps")

target_compile_features(sl-browser PRIVATE cxx_std_17)

target_link_libraries(sl-browser PRIVATE CEF::Wrapper CEF::Library d3d11 dxgi)
target_link_libraries(sl-browser PRIVATE Qt::Widgets Qt::Core Qt::Gui)
target_link_libraries(sl-browser PRIVATE Detours::Detours)

target_link_libraries(sl-browser PRIVATE
papi_grpc_proto
${_REFLECTION}
${_GRPC_GRPCPP}
${_PROTOBUF_LIBPROTOBUF})

target_link_options(sl-browser PRIVATE
"/IGNORE:4099" # Ignore PDB warnings
"/IGNORE:4098"
)

target_compile_options(sl-browser PRIVATE $<IF:$<CONFIG:DEBUG>,/MTd,/MT>)
target_compile_definitions(sl-browser PRIVATE NOMINMAX)

add_custom_command(
TARGET sl-browser POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy
${CMAKE_CURRENT_SOURCE_DIR}/streamlabs-app-icon.png
$<TARGET_FILE_DIR:sl-browser>/streamlabs-app-icon.png
)

## -- Plugin loaded by obs

add_library(sl-browser-plugin MODULE)

target_sources(
sl-browser-plugin
PRIVATE sl-browser-plugin.cpp
GrpcPlugin.cpp
PluginJsHandler.cpp
QtGuiModifications.cpp
WebServer.cpp
WebServer.cpp
SlBrowserDock.cpp
deps/json11/json11.cpp
deps/minizip/ioapi.c
deps/minizip/iowin32.c
deps/minizip/mztools.c
deps/minizip/unzip.c
deps/minizip/zip.c
${papi_proto_srcs}
${papi_grpc_srcs}
)

target_link_libraries(sl-browser-plugin PRIVATE Detours::Detours)
target_link_libraries(sl-browser-plugin PRIVATE ZLIB::ZLIB)
target_link_libraries(sl-browser-plugin PRIVATE Qt::Widgets)
target_link_libraries(sl-browser-plugin PRIVATE Qt::Core)
target_link_libraries(sl-browser-plugin PRIVATE Qt::Gui)
target_link_libraries(sl-browser-plugin PRIVATE CEF::Wrapper CEF::Library) # The plugin uses ->setURL etc files that are CEF based

target_include_directories(sl-browser-plugin PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/deps")
target_include_directories(sl-browser-plugin PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/deps/json11")
target_include_directories(sl-browser-plugin PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/../obs-browser/panel")
target_include_directories(sl-browser-plugin PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/UI")

target_compile_features(sl-browser-plugin PRIVATE cxx_std_17)
target_compile_definitions(sl-browser-plugin PRIVATE BROWSER_AVAILABLE)
#target_compile_definitions(sl-browser-plugin PRIVATE SL_OBS_VERSION="")
#target_compile_definitions(sl-browser-plugin PRIVATE GITHUB_REVISION="")
#target_compile_definitions(sl-browser-plugin PRIVATE SL_REVISION="")

target_link_libraries(sl-browser-plugin PRIVATE OBS::libobs OBS::frontend-api)
target_link_libraries(sl-browser-plugin PRIVATE ZLIB::ZLIB)

target_link_libraries(sl-browser-plugin PRIVATE
papi_grpc_proto
${_REFLECTION}
${_GRPC_GRPCPP}
${_PROTOBUF_LIBPROTOBUF})

target_link_options(sl-browser-plugin PRIVATE
"/IGNORE:4099" # Ignore PDB warnings
"/IGNORE:4098"
)
target_compile_options(sl-browser-plugin PRIVATE
"/wd4996" # 'obs_frontend_add_dock': was declared deprecated
)

target_compile_options(sl-browser-plugin PRIVATE $<IF:$<CONFIG:DEBUG>,/MTd,/MT>)
target_compile_definitions(sl-browser-plugin PRIVATE NOMINMAX)

## -- Helper proxy children

add_executable(sl-browser-page)

target_sources(sl-browser-page PRIVATE cef-headers.hpp sl-browser-page/sl-browser-page-main.cpp browser-app.cpp
browser-app.hpp deps/json11/json11.cpp deps/json11/json11.hpp)

target_link_libraries(sl-browser-page PRIVATE CEF::Library)

target_include_directories(sl-browser-page PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/deps
${CMAKE_CURRENT_SOURCE_DIR}/sl-browser-page)

target_sources(sl-browser-page PRIVATE sl-browser-page.manifest)

target_compile_features(sl-browser-page PRIVATE cxx_std_17)

if(TARGET CEF::Wrapper_Debug)
target_link_libraries(sl-browser-page PRIVATE optimized CEF::Wrapper)
target_link_libraries(sl-browser-page PRIVATE debug CEF::Wrapper_Debug)
else()
target_link_libraries(sl-browser-page PRIVATE CEF::Wrapper)
endif()

target_compile_definitions(sl-browser-page PRIVATE ENABLE_BROWSER_SHARED_TEXTURE)
target_compile_options(sl-browser-page PRIVATE $<IF:$<CONFIG:DEBUG>,/MTd,/MT>)
target_link_options(sl-browser-page PRIVATE "LINKER:/IGNORE:4099" "LINKER:/SUBSYSTEM:WINDOWS")

0 comments on commit 61ad3ad

Please sign in to comment.