rtmp-services: Allow seamless service renaming

Allows the ability for services to specify alternate or old names that
they used to have in the json service list so they can safely be renamed
seamlessly and use the proper service settings.  This way, if a user is
using an older service in their configuration, it can still detect which
service it's supposed to be using and apply those service-specific
settings for that user.
This commit is contained in:
jp9000 2018-12-03 07:36:10 -08:00
parent bfe934f0f8
commit d7e80f87e7

View File

@ -21,7 +21,8 @@ static const char *rtmp_common_getname(void *unused)
}
static json_t *open_services_file(void);
static inline json_t *find_service(json_t *root, const char *name);
static inline json_t *find_service(json_t *root, const char *name,
const char **p_new_name);
static inline const char *get_string_val(json_t *service, const char *key);
extern void twitch_ingests_refresh(int seconds);
@ -75,7 +76,14 @@ static void rtmp_common_update(void *data, obs_data_t *settings)
json_t *root = open_services_file();
if (root) {
json_t *serv = find_service(root, service->service);
const char *new_name;
json_t *serv = find_service(root, service->service, &new_name);
if (new_name) {
bfree(service->service);
service->service = bstrdup(new_name);
}
if (serv) {
json_t *rec = json_object_get(serv, "recommended");
if (rec && json_is_object(rec)) {
@ -191,7 +199,7 @@ static void add_services(obs_property_t *list, json_t *root, bool show_all,
add_service(list, service, show_all, cur_service);
}
service = find_service(root, cur_service);
service = find_service(root, cur_service, NULL);
if (!service && cur_service && *cur_service) {
obs_property_list_insert_string(list, 0, cur_service,
cur_service);
@ -346,16 +354,32 @@ static void fill_servers(obs_property_t *servers_prop, json_t *service,
}
}
static inline json_t *find_service(json_t *root, const char *name)
static inline json_t *find_service(json_t *root, const char *name,
const char **p_new_name)
{
size_t index;
json_t *service;
if (p_new_name) *p_new_name = NULL;
json_array_foreach (root, index, service) {
const char *cur_name = get_string_val(service, "name");
if (strcmp(name, cur_name) == 0)
return service;
/* check for alternate names */
json_t *alt_names = json_object_get(service, "alt_names");
size_t alt_name_idx;
json_t *alt_name_obj;
json_array_foreach (alt_names, alt_name_idx, alt_name_obj) {
const char *alt_name = json_string_value(alt_name_obj);
if (alt_name && strcmp(name, alt_name) == 0) {
if (p_new_name) *p_new_name = cur_name;
return service;
}
}
}
return NULL;
@ -367,11 +391,12 @@ static bool service_selected(obs_properties_t *props, obs_property_t *p,
const char *name = obs_data_get_string(settings, "service");
json_t *root = obs_properties_get_param(props);
json_t *service;
const char *new_name;
if (!name || !*name)
return false;
service = find_service(root, name);
service = find_service(root, name, &new_name);
if (!service) {
const char *server = obs_data_get_string(settings, "server");
@ -383,6 +408,10 @@ static bool service_selected(obs_properties_t *props, obs_property_t *p,
obs_property_list_item_disable(p, 0, true);
return true;
}
if (new_name) {
name = new_name;
obs_data_set_string(settings, "service", name);
}
fill_servers(obs_properties_get(props, "server"), service, name);
@ -498,7 +527,7 @@ static void apply_audio_encoder_settings(obs_data_t *settings,
static void initialize_output(struct rtmp_common *service, json_t *root,
obs_data_t *video_settings, obs_data_t *audio_settings)
{
json_t *json_service = find_service(root, service->service);
json_t *json_service = find_service(root, service->service, NULL);
json_t *recommended;
if (!json_service) {