diff --git a/src/api/api_dvr.c b/src/api/api_dvr.c index 8d8185b0..ac01c51d 100644 --- a/src/api/api_dvr.c +++ b/src/api/api_dvr.c @@ -22,33 +22,6 @@ #include "epg.h" #include "api.h" -static const char * -api_dvr_config_name( access_t *perm, const char *config_uuid ) -{ - dvr_config_t *cfg = NULL; - htsmsg_field_t *f; - const char *uuid; - - lock_assert(&global_lock); - - if (perm->aa_dvrcfgs == NULL) - return config_uuid; /* no change */ - - config_uuid = config_uuid ?: ""; - HTSMSG_FOREACH(f, perm->aa_dvrcfgs) { - uuid = htsmsg_field_get_str(f) ?: ""; - if (strcmp(uuid, config_uuid) == 0) - return config_uuid; - if (!cfg) - cfg = dvr_config_find_by_uuid(uuid); - } - - if (!cfg && perm->aa_username) - tvhlog(LOG_INFO, "dvr", "User '%s' has no valid dvr config in ACL, using default...", perm->aa_username); - - return cfg ? idnode_uuid_as_str(&cfg->dvr_id) : NULL; -} - /* * */ @@ -156,26 +129,31 @@ api_dvr_entry_create ( access_t *perm, void *opaque, const char *op, htsmsg_t *args, htsmsg_t **resp ) { dvr_entry_t *de; + dvr_config_t *cfg; htsmsg_t *conf; - const char *s1, *s2; + const char *s1; + int res = EPERM; if (!(conf = htsmsg_get_map(args, "conf"))) return EINVAL; pthread_mutex_lock(&global_lock); s1 = htsmsg_get_str(conf, "config_name"); - s2 = api_dvr_config_name(perm, s1); - if (strcmp(s1 ?: "", s2 ?: "")) - htsmsg_set_str(conf, "config_name", s2 ?: ""); + cfg = dvr_config_find_by_list(perm->aa_dvrcfgs, s1); + if (cfg) { + htsmsg_set_str(conf, "config_name", idnode_uuid_as_str(&cfg->dvr_id)); - if (perm->aa_representative) - htsmsg_set_str(conf, "creator", perm->aa_representative); + if (perm->aa_representative) + htsmsg_set_str(conf, "creator", perm->aa_representative); - if ((de = dvr_entry_create(NULL, conf))) - dvr_entry_save(de); + if ((de = dvr_entry_create(NULL, conf))) + dvr_entry_save(de); + + res = 0; + } pthread_mutex_unlock(&global_lock); - return 0; + return res; } static htsmsg_t * @@ -224,11 +202,14 @@ api_dvr_entry_create_by_event pthread_mutex_lock(&global_lock); if ((e = epg_broadcast_find_by_id(strtoll(s, NULL, 10)))) { - de = dvr_entry_create_by_event(api_dvr_config_name(perm, config_uuid), - e, 0, 0, perm->aa_representative, - NULL, DVR_PRIO_NORMAL, 0); - if (de) - dvr_entry_save(de); + dvr_config_t *cfg = dvr_config_find_by_list(perm->aa_dvrcfgs, config_uuid); + if (cfg) { + de = dvr_entry_create_by_event(idnode_uuid_as_str(&cfg->dvr_id), + e, 0, 0, perm->aa_representative, + NULL, DVR_PRIO_NORMAL, 0); + if (de) + dvr_entry_save(de); + } } pthread_mutex_unlock(&global_lock); count++; @@ -313,12 +294,15 @@ api_dvr_autorec_create_by_series pthread_mutex_lock(&global_lock); if ((e = epg_broadcast_find_by_id(strtoll(s, NULL, 10)))) { - dae = dvr_autorec_add_series_link(api_dvr_config_name(perm, config_uuid), - e, perm->aa_representative, - "Created from EPG query"); - if (dae) { - dvr_autorec_save(dae); - dvr_autorec_changed(dae, 1); + dvr_config_t *cfg = dvr_config_find_by_list(perm->aa_dvrcfgs, config_uuid); + if (cfg) { + dae = dvr_autorec_add_series_link(idnode_uuid_as_str(&cfg->dvr_id), + e, perm->aa_representative, + "Created from EPG query"); + if (dae) { + dvr_autorec_save(dae); + dvr_autorec_changed(dae, 1); + } } } pthread_mutex_unlock(&global_lock); diff --git a/src/dvr/dvr.h b/src/dvr/dvr.h index 2a3e23ec..a525db11 100644 --- a/src/dvr/dvr.h +++ b/src/dvr/dvr.h @@ -340,6 +340,8 @@ dvr_config_t *dvr_config_find_by_name(const char *name); dvr_config_t *dvr_config_find_by_name_default(const char *name); +dvr_config_t *dvr_config_find_by_list(htsmsg_t *list, const char *name); + dvr_config_t *dvr_config_create(const char *name, const char *uuid, htsmsg_t *conf); static inline dvr_config_t *dvr_config_find_by_uuid(const char *uuid) diff --git a/src/dvr/dvr_config.c b/src/dvr/dvr_config.c index f5ceeaef..11e5f801 100644 --- a/src/dvr/dvr_config.c +++ b/src/dvr/dvr_config.c @@ -52,7 +52,7 @@ dvr_config_find_by_name(const char *name) name = ""; LIST_FOREACH(cfg, &dvrconfigs, config_link) - if (!strcmp(name, cfg->dvr_config_name)) + if (cfg->dvr_enabled && !strcmp(name, cfg->dvr_config_name)) return cfg; return NULL; @@ -93,6 +93,37 @@ dvr_config_find_by_name_default(const char *name) return cfg; } +/* + * find a dvr config by name using a filter list, + * return the first config from list if name is not valid + * return the default config if not found + */ +dvr_config_t * +dvr_config_find_by_list(htsmsg_t *uuids, const char *name) +{ + dvr_config_t *cfg, *res = NULL; + htsmsg_field_t *f; + const char *uuid, *uuid2; + + cfg = dvr_config_find_by_name(name); + uuid = idnode_uuid_as_str(&cfg->dvr_id); + if (uuids) { + HTSMSG_FOREACH(f, uuids) { + uuid2 = htsmsg_field_get_str(f) ?: ""; + if (strcmp(uuid, uuid2) == 0) + return cfg; + if (!res) { + res = dvr_config_find_by_uuid(uuid2); + if (!res->dvr_enabled) + res = NULL; + } + } + } + if (!res) + res = dvr_config_find_by_name_default(NULL); + return res; +} + /** * */ diff --git a/src/profile.c b/src/profile.c index 89cd9768..65b25555 100644 --- a/src/profile.c +++ b/src/profile.c @@ -340,7 +340,7 @@ profile_find_by_list(htsmsg_t *uuids, const char *name, const char *alt) HTSMSG_FOREACH(f, uuids) { uuid2 = htsmsg_field_get_str(f) ?: ""; if (strcmp(uuid, uuid2) == 0) - return res; + return pro; if (!res) { res = profile_find_by_uuid(uuid2); if (!res->pro_enabled)