diff --git a/CI/before-deploy-osx.sh b/CI/before-deploy-osx.sh index 4bb61885d..fa84613e7 100755 --- a/CI/before-deploy-osx.sh +++ b/CI/before-deploy-osx.sh @@ -8,9 +8,12 @@ hr() { set -e # Generate file name variables +export GIT_TAG=$(git describe --abbrev=0) export GIT_HASH=$(git rev-parse --short HEAD) export FILE_DATE=$(date +%Y-%m-%d.%H-%M-%S) -export FILENAME=$FILE_DATE-$GIT_HASH-$TRAVIS_BRANCH-osx.pkg +export FILENAME=$FILE_DATE-$GIT_HASH-$TRAVIS_BRANCH-osx.dmg + +echo "git tag: $GIT_TAG" cd ./build @@ -30,32 +33,44 @@ if [ -n "${TRAVIS_TAG}" ]; then STABLE=true fi -sudo python ../CI/install/osx/build_app.py --public-key ../CI/install/osx/OBSPublicDSAKey.pem --sparkle-framework ../../sparkle/Sparkle.framework --stable=$STABLE +#sudo python ../CI/install/osx/build_app.py --public-key ../CI/install/osx/OBSPublicDSAKey.pem --sparkle-framework ../../sparkle/Sparkle.framework --stable=$STABLE + +../CI/install/osx/packageApp.sh + +# fix obs outputs +cp /usr/local/opt/mbedtls/lib/libmbedtls.12.dylib ./OBS.app/Contents/Frameworks/ +cp /usr/local/opt/mbedtls/lib/libmbedcrypto.3.dylib ./OBS.app/Contents/Frameworks/ +cp /usr/local/opt/mbedtls/lib/libmbedx509.0.dylib ./OBS.app/Contents/Frameworks/ +install_name_tool -change /usr/local/opt/mbedtls/lib/libmbedtls.12.dylib @executable_path/../Frameworks/libmbedtls.12.dylib ./OBS.app/Contents/Plugins/obs-outputs.so +install_name_tool -change /usr/local/opt/mbedtls/lib/libmbedcrypto.3.dylib @executable_path/../Frameworks/libmbedcrypto.3.dylib ./OBS.app/Contents/Plugins/obs-outputs.so +install_name_tool -change /usr/local/opt/mbedtls/lib/libmbedx509.0.dylib @executable_path/../Frameworks/libmbedx509.0.dylib ./OBS.app/Contents/Plugins/obs-outputs.so +install_name_tool -change /usr/local/opt/curl/lib/libcurl.4.dylib @executable_path/../Frameworks/libcurl.4.dylib ./OBS.app/Contents/Plugins/obs-outputs.so +install_name_tool -change @rpath/libobs.0.dylib @executable_path/../Frameworks/libobs.0.dylib ./OBS.app/Contents/Plugins/obs-outputs.so + +# copy sparkle into the app +hr "Copying Sparkle.framework" +cp -r ../../sparkle/Sparkle.framework ./OBS.app/Contents/Frameworks/ +install_name_tool -change @rpath/Sparkle.framework/Versions/A/Sparkle @executable_path/../Frameworks/Sparkle.framework/Versions/A/Sparkle ./OBS.app/Contents/MacOS/obs # Copy Chromium embedded framework to app Frameworks directory hr "Copying Chromium Embedded Framework.framework" sudo mkdir -p OBS.app/Contents/Frameworks sudo cp -r ../../cef_binary_${CEF_BUILD_VERSION}_macosx64/Release/Chromium\ Embedded\ Framework.framework OBS.app/Contents/Frameworks/ -sudo install_name_tool -change \ - @rpath/Frameworks/Chromium\ Embedded\ Framework.framework/Chromium\ Embedded\ Framework \ - ../../Frameworks/Chromium\ Embedded\ Framework.framework/Chromium\ Embedded\ Framework \ - OBS.app/Contents/Resources/obs-plugins/obs-browser.so -sudo install_name_tool -change \ - @executable_path/../Frameworks/Chromium\ Embedded\ Framework.framework/Chromium\ Embedded\ Framework \ - ../../Frameworks/Chromium\ Embedded\ Framework.framework/Chromium\ Embedded\ Framework \ - OBS.app/Contents/Resources/obs-plugins/obs-browser.so -sudo install_name_tool -change \ - @rpath/Frameworks/Chromium\ Embedded\ Framework.framework/Chromium\ Embedded\ Framework \ - ../../Frameworks/Chromium\ Embedded\ Framework.framework/Chromium\ Embedded\ Framework \ - OBS.app/Contents/Resources/obs-plugins/obs-browser-page -sudo install_name_tool -change \ - @executable_path/../Frameworks/Chromium\ Embedded\ Framework.framework/Chromium\ Embedded\ Framework \ - ../../Frameworks/Chromium\ Embedded\ Framework.framework/Chromium\ Embedded\ Framework \ - OBS.app/Contents/Resources/obs-plugins/obs-browser-page -# Package app -hr "Generating .pkg" -packagesbuild ../CI/install/osx/CMakeLists.pkgproj +install_name_tool -change /usr/local/opt/qt/lib/QtGui.framework/Versions/5/QtGui @executable_path/../Frameworks/QtGui.framework/Versions/5/QtGui ./OBS.app/Contents/Plugins/obs-browser.so +install_name_tool -change /usr/local/opt/qt/lib/QtCore.framework/Versions/5/QtCore @executable_path/../Frameworks/QtCore.framework/Versions/5/QtCore ./OBS.app/Contents/Plugins/obs-browser.so +install_name_tool -change /usr/local/opt/qt/lib/QtWidgets.framework/Versions/5/QtWidgets @executable_path/../Frameworks/QtWidgets.framework/Versions/5/QtWidgets ./OBS.app/Contents/Plugins/obs-browser.so + +cp ../CI/install/osx/OBSPublicDSAKey.pem OBS.app/Contents/Resources + +# edit plist +plutil -insert CFBundleVersion -string $GIT_TAG ./OBS.app/Contents/Info.plist +plutil -insert CFBundleShortVersionString -string $GIT_TAG ./OBS.app/Contents/Info.plist +plutil -insert OBSFeedsURL -string https://obsproject.com/osx_update/feeds.xml ./OBS.app/Contents/Info.plist +plutil -insert SUFeedURL -string https://obsproject.com/osx_update/stable/updates.xml ./OBS.app/Contents/Info.plist +plutil -insert SUPublicDSAKeyFile -string OBSPublicDSAKey.pem ./OBS.app/Contents/Info.plist + +dmgbuild -s ../CI/install/osx/settings.json "OBS" obs.dmg if [ -v "$TRAVIS" ]; then # Signing stuff @@ -70,12 +85,10 @@ if [ -v "$TRAVIS" ]; then security import ./Certificates.p12 -k build.keychain -T /usr/bin/productsign -P "" # macOS 10.12+ security set-key-partition-list -S apple-tool:,apple: -s -k mysecretpassword build.keychain - hr "Signing Package" - productsign --sign 2MMRE5MTB8 ./OBS.pkg ./$FILENAME -else - cp ./OBS.pkg ./$FILENAME fi +cp ./OBS.dmg ./$FILENAME + # Move to the folder that travis uses to upload artifacts from hr "Moving package to nightly folder for distribution" mkdir ../nightly diff --git a/CI/install-dependencies-osx.sh b/CI/install-dependencies-osx.sh index c37d58843..ad398e48c 100755 --- a/CI/install-dependencies-osx.sh +++ b/CI/install-dependencies-osx.sh @@ -16,6 +16,8 @@ else /bin/bash -c "sudo xcode-select -s /Applications/Xcode_9.4.1.app/Contents/Developer" fi +git fetch origin --tags + # Leave obs-studio folder cd ../ @@ -28,10 +30,12 @@ sudo installer -pkg ./Packages.pkg -target / brew update #Base OBS Deps and ccache -brew install jack speexdsp ccache mbedtls clang-format +brew install jack speexdsp ccache mbedtls clang-format freetype fdk-aac brew install https://gist.githubusercontent.com/DDRBoxman/b3956fab6073335a4bf151db0dcbd4ad/raw/ed1342a8a86793ea8c10d8b4d712a654da121ace/qt.rb brew install https://gist.githubusercontent.com/DDRBoxman/4cada55c51803a2f963fa40ce55c9d3e/raw/572c67e908bfbc1bcb8c476ea77ea3935133f5b5/swig.rb +pip install dmgbuild + export PATH=/usr/local/opt/ccache/libexec:$PATH ccache -s || echo "CCache is not available." diff --git a/CI/install/osx/Info.plist b/CI/install/osx/Info.plist new file mode 100644 index 000000000..7eed962ad --- /dev/null +++ b/CI/install/osx/Info.plist @@ -0,0 +1,30 @@ + + + + + CFBundleIconFile + obs.icns + CFBundleName + OBS + CFBundleGetInfoString + OBS - Free and Open Source Streaming/Recording Software + CFBundleExecutable + OBS + CFBundleIdentifier + com.obsproject.obs-studio + CFBundlePackageType + APPL + CFBundleSignature + ???? + LSMinimumSystemVersion + 10.8.5 + NSHighResolutionCapable + + LSAppNapIsDisabled + + NSCameraUsageDescription + OBS needs to access the camera to enable camera sources to work. + NSMicrophoneUsageDescription + OBS needs to access the microphone to enable audio input. + + diff --git a/CI/install/osx/background.png b/CI/install/osx/background.png new file mode 100644 index 000000000..02c4d5501 Binary files /dev/null and b/CI/install/osx/background.png differ diff --git a/CI/install/osx/background.pxd/QuickLook/Icon.tiff b/CI/install/osx/background.pxd/QuickLook/Icon.tiff new file mode 100644 index 000000000..4ef96a409 Binary files /dev/null and b/CI/install/osx/background.pxd/QuickLook/Icon.tiff differ diff --git a/CI/install/osx/background.pxd/QuickLook/Preview.tiff b/CI/install/osx/background.pxd/QuickLook/Preview.tiff new file mode 100644 index 000000000..b28ab1ec4 Binary files /dev/null and b/CI/install/osx/background.pxd/QuickLook/Preview.tiff differ diff --git a/CI/install/osx/background.pxd/QuickLook/Thumbnail.tiff b/CI/install/osx/background.pxd/QuickLook/Thumbnail.tiff new file mode 100644 index 000000000..1bd46a7ea Binary files /dev/null and b/CI/install/osx/background.pxd/QuickLook/Thumbnail.tiff differ diff --git a/CI/install/osx/background.pxd/data/556CF265-5721-4F18-BE83-8CF39483B4C2 b/CI/install/osx/background.pxd/data/556CF265-5721-4F18-BE83-8CF39483B4C2 new file mode 100644 index 000000000..3036891ae Binary files /dev/null and b/CI/install/osx/background.pxd/data/556CF265-5721-4F18-BE83-8CF39483B4C2 differ diff --git a/CI/install/osx/background.pxd/data/8CA689C3-ED2A-459E-952C-E08026CFCD07 b/CI/install/osx/background.pxd/data/8CA689C3-ED2A-459E-952C-E08026CFCD07 new file mode 100644 index 000000000..52d94b97c Binary files /dev/null and b/CI/install/osx/background.pxd/data/8CA689C3-ED2A-459E-952C-E08026CFCD07 differ diff --git a/CI/install/osx/background.pxd/metadata.info b/CI/install/osx/background.pxd/metadata.info new file mode 100644 index 000000000..6054a580b Binary files /dev/null and b/CI/install/osx/background.pxd/metadata.info differ diff --git a/CI/install/osx/background.tiff b/CI/install/osx/background.tiff new file mode 100644 index 000000000..454874005 Binary files /dev/null and b/CI/install/osx/background.tiff differ diff --git a/CI/install/osx/background@2x.png b/CI/install/osx/background@2x.png new file mode 100644 index 000000000..a001edf36 Binary files /dev/null and b/CI/install/osx/background@2x.png differ diff --git a/CI/install/osx/buildDMG b/CI/install/osx/buildDMG new file mode 100755 index 000000000..af2c798e4 --- /dev/null +++ b/CI/install/osx/buildDMG @@ -0,0 +1 @@ +dmgbuild -s ./settings.json "OBS" obs.dmg diff --git a/CI/install/osx/dylibBundler b/CI/install/osx/dylibBundler new file mode 100755 index 000000000..a28f20985 Binary files /dev/null and b/CI/install/osx/dylibBundler differ diff --git a/CI/install/osx/makeRetinaBG b/CI/install/osx/makeRetinaBG new file mode 100755 index 000000000..5d7f309b5 --- /dev/null +++ b/CI/install/osx/makeRetinaBG @@ -0,0 +1 @@ +tiffutil -cathidpicheck background.png background@2x.png -out background.tiff diff --git a/CI/install/osx/obs.icns b/CI/install/osx/obs.icns new file mode 100644 index 000000000..6f878d6a3 Binary files /dev/null and b/CI/install/osx/obs.icns differ diff --git a/CI/install/osx/packageApp.sh b/CI/install/osx/packageApp.sh new file mode 100755 index 000000000..ec19c1ce5 --- /dev/null +++ b/CI/install/osx/packageApp.sh @@ -0,0 +1,66 @@ +rm -rf ./OBS.app + +mkdir OBS.app +mkdir OBS.app/Contents +mkdir OBS.app/Contents/MacOS +mkdir OBS.app/Contents/Plugins +mkdir OBS.app/Contents/Resources + +cp -r rundir/RelWithDebInfo/bin/ ./OBS.app/Contents/MacOS +cp -r rundir/RelWithDebInfo/data ./OBS.app/Contents/Resources +cp ../CI/install/osx/obs.icns ./OBS.app/Contents/Resources +cp -r rundir/RelWithDebInfo/obs-plugins/ ./OBS.app/Contents/Plugins +cp ../CI/install/osx/Info.plist ./OBS.app/Contents + +../CI/install/osx/dylibBundler -b -cd -d ./OBS.app/Contents/Frameworks -p @executable_path/../Frameworks/ \ +-s ./OBS.app/Contents/MacOS \ +-s /usr/local/opt/mbedtls/lib/ \ +-x ./OBS.app/Contents/Plugins/coreaudio-encoder.so \ +-x ./OBS.app/Contents/Plugins/decklink-ouput-ui.so \ +-x ./OBS.app/Contents/Plugins/frontend-tools.so \ +-x ./OBS.app/Contents/Plugins/image-source.so \ +-x ./OBS.app/Contents/Plugins/linux-jack.so \ +-x ./OBS.app/Contents/Plugins/mac-avcapture.so \ +-x ./OBS.app/Contents/Plugins/mac-capture.so \ +-x ./OBS.app/Contents/Plugins/mac-decklink.so \ +-x ./OBS.app/Contents/Plugins/mac-syphon.so \ +-x ./OBS.app/Contents/Plugins/mac-vth264.so \ +-x ./OBS.app/Contents/Plugins/obs-browser.so \ +-x ./OBS.app/Contents/Plugins/obs-browser-page \ +-x ./OBS.app/Contents/Plugins/obs-ffmpeg.so \ +-x ./OBS.app/Contents/Plugins/obs-filters.so \ +-x ./OBS.app/Contents/Plugins/obs-transitions.so \ +-x ./OBS.app/Contents/Plugins/obs-vst.so \ +-x ./OBS.app/Contents/Plugins/rtmp-services.so \ +-x ./OBS.app/Contents/MacOS/obs \ +-x ./OBS.app/Contents/MacOS/obs-ffmpeg-mux \ +-x ./OBS.app/Contents/MacOS/obslua.so \ +-x ./OBS.app/Contents/Plugins/obs-x264.so \ +-x ./OBS.app/Contents/Plugins/text-freetype2.so \ +-x ./OBS.app/Contents/Plugins/obs-libfdk.so +# -x ./OBS.app/Contents/Plugins/obs-outputs.so \ + +/usr/local/Cellar/qt/5.10.1/bin/macdeployqt ./OBS.app + +mv ./OBS.app/Contents/MacOS/libobs-opengl.so ./OBS.app/Contents/Frameworks + +# put qt network in here becasuse streamdeck uses it +cp -r /usr/local/opt/qt/lib/QtNetwork.framework ./OBS.app/Contents/Frameworks +chmod +w ./OBS.app/Contents/Frameworks/QtNetwork.framework/Versions/5/QtNetwork +install_name_tool -change /usr/local/Cellar/qt/5.10.1/lib/QtCore.framework/Versions/5/QtCore @executable_path/../Frameworks/QtCore.framework/Versions/5/QtCore ./OBS.app/Contents/Frameworks/QtNetwork.framework/Versions/5/QtNetwork + +# decklink ui qt +install_name_tool -change /usr/local/opt/qt/lib/QtGui.framework/Versions/5/QtGui @executable_path/../Frameworks/QtGui.framework/Versions/5/QtGui ./OBS.app/Contents/Plugins/decklink-ouput-ui.so +install_name_tool -change /usr/local/opt/qt/lib/QtCore.framework/Versions/5/QtCore @executable_path/../Frameworks/QtCore.framework/Versions/5/QtCore ./OBS.app/Contents/Plugins/decklink-ouput-ui.so +install_name_tool -change /usr/local/opt/qt/lib/QtWidgets.framework/Versions/5/QtWidgets @executable_path/../Frameworks/QtWidgets.framework/Versions/5/QtWidgets ./OBS.app/Contents/Plugins/decklink-ouput-ui.so + +# frontend tools qt +install_name_tool -change /usr/local/opt/qt/lib/QtGui.framework/Versions/5/QtGui @executable_path/../Frameworks/QtGui.framework/Versions/5/QtGui ./OBS.app/Contents/Plugins/frontend-tools.so +install_name_tool -change /usr/local/opt/qt/lib/QtCore.framework/Versions/5/QtCore @executable_path/../Frameworks/QtCore.framework/Versions/5/QtCore ./OBS.app/Contents/Plugins/frontend-tools.so +install_name_tool -change /usr/local/opt/qt/lib/QtWidgets.framework/Versions/5/QtWidgets @executable_path/../Frameworks/QtWidgets.framework/Versions/5/QtWidgets ./OBS.app/Contents/Plugins/frontend-tools.so + +# vst qt +install_name_tool -change /usr/local/opt/qt/lib/QtGui.framework/Versions/5/QtGui @executable_path/../Frameworks/QtGui.framework/Versions/5/QtGui ./OBS.app/Contents/Plugins/obs-vst.so +install_name_tool -change /usr/local/opt/qt/lib/QtCore.framework/Versions/5/QtCore @executable_path/../Frameworks/QtCore.framework/Versions/5/QtCore ./OBS.app/Contents/Plugins/obs-vst.so +install_name_tool -change /usr/local/opt/qt/lib/QtWidgets.framework/Versions/5/QtWidgets @executable_path/../Frameworks/QtWidgets.framework/Versions/5/QtWidgets ./OBS.app/Contents/Plugins/obs-vst.so +install_name_tool -change /usr/local/opt/qt/lib/QtMacExtras.framework/Versions/5/QtMacExtras @executable_path/../Frameworks/QtMacExtras.framework/Versions/5/QtMacExtras ./OBS.app/Contents/Plugins/obs-vst.so diff --git a/CI/install/osx/settings.json b/CI/install/osx/settings.json new file mode 100644 index 000000000..34fbc2ff4 --- /dev/null +++ b/CI/install/osx/settings.json @@ -0,0 +1,13 @@ +{ + "title": "OBS", + "background": "../CI/install/osx/background.tiff", + "format": "UDZO", + "compression-level": 9, + "window": { "position": { "x": 100, "y": 100 }, + "size": { "width": 540, "height": 380 } }, + "contents": [ + { "x": 120, "y": 180, "type": "file", + "path": "./OBS.app" }, + { "x": 420, "y": 180, "type": "link", "path": "/Applications" } + ] +} diff --git a/UI/platform-osx.mm b/UI/platform-osx.mm index bc400f5d2..3d0c5334f 100644 --- a/UI/platform-osx.mm +++ b/UI/platform-osx.mm @@ -28,11 +28,29 @@ using namespace std; +bool isInBundle() +{ + NSRunningApplication *app = [NSRunningApplication currentApplication]; + return [app bundleIdentifier] != nil; +} + bool GetDataFilePath(const char *data, string &output) { - stringstream str; - str << OBS_DATA_PATH "/obs-studio/" << data; - output = str.str(); + if (isInBundle()) { + NSRunningApplication *app = + [NSRunningApplication currentApplication]; + NSURL *bundleURL = [app bundleURL]; + NSString *path = [NSString + stringWithFormat:@"Contents/Resources/data/obs-studio/%@", + [NSString stringWithUTF8String:data]]; + NSURL *dataURL = [bundleURL URLByAppendingPathComponent:path]; + output = [[dataURL path] UTF8String]; + } else { + stringstream str; + str << OBS_DATA_PATH "/obs-studio/" << data; + output = str.str(); + } + return !access(output.c_str(), R_OK); } diff --git a/deps/obs-scripting/CMakeLists.txt b/deps/obs-scripting/CMakeLists.txt index 6d1139016..0421ec964 100644 --- a/deps/obs-scripting/CMakeLists.txt +++ b/deps/obs-scripting/CMakeLists.txt @@ -17,6 +17,11 @@ if(MSVC) w32-pthreads) endif() +if(APPLE) + set(obs-scripting_PLATFORM_DEPS + objc) +endif() + option(DISABLE_LUA "Disable Lua scripting support" OFF) option(DISABLE_PYTHON "Disable Python scripting support" OFF) diff --git a/deps/obs-scripting/obs-scripting-lua.c b/deps/obs-scripting/obs-scripting-lua.c index a626555da..efdba345b 100644 --- a/deps/obs-scripting/obs-scripting-lua.c +++ b/deps/obs-scripting/obs-scripting-lua.c @@ -43,7 +43,7 @@ static const char *startup_script_template = "\ for val in pairs(package.preload) do\n\ package.preload[val] = nil\n\ end\n\ -package.cpath = package.cpath .. \";\" .. \"%s\" .. \"/?." SO_EXT "\"\n\ +package.cpath = package.cpath .. \";\" .. \"%s/Contents/MacOS/?.so\" .. \";\" .. \"%s\" .. \"/?." SO_EXT "\"\n\ require \"obslua\"\n"; static const char *get_script_path_func = "\ @@ -1310,7 +1310,31 @@ void obs_lua_load(void) /* ---------------------------------------------- */ /* Initialize Lua startup script */ - dstr_printf(&tmp, startup_script_template, SCRIPT_DIR); +char* bundlePath = "./"; + +#ifdef __APPLE__ + Class nsRunningApplication = objc_lookUpClass("NSRunningApplication"); + SEL currentAppSel = sel_getUid("currentApplication"); + + typedef id (*running_app_func)(Class, SEL); + running_app_func operatingSystemName = (running_app_func)objc_msgSend; + id app = operatingSystemName(nsRunningApplication, currentAppSel); + + typedef id (*bundle_url_func)(id, SEL); + bundle_url_func bundleURL = (bundle_url_func)objc_msgSend; + id url = bundleURL(app, sel_getUid("bundleURL")); + + typedef id (*url_path_func)(id, SEL); + url_path_func urlPath = (url_path_func)objc_msgSend; + + id path = urlPath(url, sel_getUid("path")); + + typedef id (*string_func)(id, SEL); + string_func utf8String = (string_func)objc_msgSend; + bundlePath = (char *)utf8String(path, sel_registerName("UTF8String")); +#endif + + dstr_printf(&tmp, startup_script_template, bundlePath, SCRIPT_DIR); startup_script = tmp.array; dstr_free(&dep_paths); diff --git a/libobs/CMakeLists.txt b/libobs/CMakeLists.txt index 868114816..0eabf608c 100644 --- a/libobs/CMakeLists.txt +++ b/libobs/CMakeLists.txt @@ -110,7 +110,7 @@ if(WIN32) endif() elseif(APPLE) set(libobs_PLATFORM_SOURCES - obs-cocoa.c + obs-cocoa.m util/threading-posix.c util/pipe-posix.c util/platform-nix.c diff --git a/libobs/obs-cocoa.c b/libobs/obs-cocoa.m similarity index 97% rename from libobs/obs-cocoa.c rename to libobs/obs-cocoa.m index 44e69eff1..7f261d093 100644 --- a/libobs/obs-cocoa.c +++ b/libobs/obs-cocoa.m @@ -29,6 +29,14 @@ #include #include +#import + +bool is_in_bundle() +{ + NSRunningApplication *app = [NSRunningApplication currentApplication]; + return [app bundleIdentifier] != nil; +} + const char *get_module_extension(void) { return ".so"; @@ -51,12 +59,45 @@ void add_default_module_paths(void) { for (int i = 0; i < module_patterns_size; i++) obs_add_module_path(module_bin[i], module_data[i]); + + if (is_in_bundle()) { + NSRunningApplication *app = + [NSRunningApplication currentApplication]; + NSURL *bundleURL = [app bundleURL]; + NSURL *pluginsURL = [bundleURL + URLByAppendingPathComponent:@"Contents/Plugins"]; + NSURL *dataURL = [bundleURL + URLByAppendingPathComponent: + @"Contents/Resources/data/obs-plugins/%module%"]; + + const char *binPath = [[pluginsURL path] + cStringUsingEncoding:NSUTF8StringEncoding]; + const char *dataPath = [[dataURL path] + cStringUsingEncoding:NSUTF8StringEncoding]; + + obs_add_module_path(binPath, dataPath); + } } char *find_libobs_data_file(const char *file) { struct dstr path; - dstr_init_copy(&path, OBS_INSTALL_DATA_PATH "/libobs/"); + + if (is_in_bundle()) { + NSRunningApplication *app = + [NSRunningApplication currentApplication]; + NSURL *bundleURL = [app bundleURL]; + NSURL *libobsDataURL = + [bundleURL URLByAppendingPathComponent: + @"Contents/Resources/data/libobs/"]; + const char *libobsDataPath = [[libobsDataURL path] + cStringUsingEncoding:NSUTF8StringEncoding]; + dstr_init_copy(&path, libobsDataPath); + dstr_cat(&path, "/"); + } else { + dstr_init_copy(&path, OBS_INSTALL_DATA_PATH "/libobs/"); + } + dstr_cat(&path, file); return path.array; }