diff --git a/obs/obs-app.cpp b/obs/obs-app.cpp index a1ae24687..84ce19075 100644 --- a/obs/obs-app.cpp +++ b/obs/obs-app.cpp @@ -59,6 +59,8 @@ static string lastLogFile; static bool portable_mode = false; bool opt_start_streaming = false; bool opt_start_recording = false; +string opt_starting_collection; +string opt_starting_profile; string opt_starting_scene; QObject *CreateShortcutFilter() @@ -421,6 +423,97 @@ static bool MakeUserProfileDirs() return true; } +static string GetProfileDirFromName(const char *name) +{ + string outputPath; + os_glob_t *glob; + char path[512]; + + if (GetConfigPath(path, sizeof(path), "obs-studio/basic/profiles") <= 0) + return outputPath; + + strcat(path, "/*.*"); + + if (os_glob(path, 0, &glob) != 0) + return outputPath; + + for (size_t i = 0; i < glob->gl_pathc; i++) { + struct os_globent ent = glob->gl_pathv[i]; + if (!ent.directory) + continue; + + strcpy(path, ent.path); + strcat(path, "/basic.ini"); + + ConfigFile config; + if (config.Open(path, CONFIG_OPEN_EXISTING) != 0) + continue; + + const char *curName = config_get_string(config, "General", + "Name"); + if (astrcmpi(curName, name) == 0) { + outputPath = ent.path; + break; + } + } + + os_globfree(glob); + + if (!outputPath.empty()) { + replace(outputPath.begin(), outputPath.end(), '\\', '/'); + const char *start = strrchr(outputPath.c_str(), '/'); + if (start) + outputPath.erase(0, start - outputPath.c_str() + 1); + } + + return outputPath; +} + +static string GetSceneCollectionFileFromName(const char *name) +{ + string outputPath; + os_glob_t *glob; + char path[512]; + + if (GetConfigPath(path, sizeof(path), "obs-studio/basic/scenes") <= 0) + return outputPath; + + strcat(path, "/*.json"); + + if (os_glob(path, 0, &glob) != 0) + return outputPath; + + for (size_t i = 0; i < glob->gl_pathc; i++) { + struct os_globent ent = glob->gl_pathv[i]; + if (ent.directory) + continue; + + obs_data_t *data = + obs_data_create_from_json_file_safe(ent.path, "bak"); + const char *curName = obs_data_get_string(data, "name"); + + if (astrcmpi(name, curName) == 0) { + outputPath = ent.path; + obs_data_release(data); + break; + } + + obs_data_release(data); + } + + os_globfree(glob); + + if (!outputPath.empty()) { + outputPath.resize(outputPath.size() - 5); + replace(outputPath.begin(), outputPath.end(), '\\', '/'); + const char *start = strrchr(outputPath.c_str(), '/'); + if (start) + outputPath.erase(0, start - outputPath.c_str() + 1); + } + + return outputPath; +} + bool OBSApp::InitGlobalConfig() { char path[512]; @@ -437,6 +530,30 @@ bool OBSApp::InitGlobalConfig() return false; } + if (!opt_starting_collection.empty()) { + string path = GetSceneCollectionFileFromName( + opt_starting_collection.c_str()); + if (!path.empty()) { + config_set_string(globalConfig, + "Basic", "SceneCollection", + opt_starting_collection.c_str()); + config_set_string(globalConfig, + "Basic", "SceneCollectionFile", + path.c_str()); + } + } + + if (!opt_starting_profile.empty()) { + string path = GetProfileDirFromName( + opt_starting_profile.c_str()); + if (!path.empty()) { + config_set_string(globalConfig, "Basic", "Profile", + opt_starting_profile.c_str()); + config_set_string(globalConfig, "Basic", "ProfileDir", + path.c_str()); + } + } + return InitGlobalConfigDefaults(); } @@ -1563,6 +1680,12 @@ int main(int argc, char *argv[]) } else if (arg_is(argv[i], "--startrecording", nullptr)) { opt_start_recording = true; + } else if (arg_is(argv[i], "--collection", nullptr)) { + if (++i < argc) opt_starting_collection = argv[i]; + + } else if (arg_is(argv[i], "--profile", nullptr)) { + if (++i < argc) opt_starting_profile = argv[i]; + } else if (arg_is(argv[i], "--scene", nullptr)) { if (++i < argc) opt_starting_scene = argv[i]; }