webui: starting to get a slightly more usable idnode grid framework
The layout of the grid and filtering etc. is now auto-setup from the idnode class definition. I think I need to extend idnode to allow it to be used more for this context.
This commit is contained in:
parent
e9631fa6ed
commit
331a63c6de
6 changed files with 231 additions and 1014 deletions
|
@ -142,10 +142,11 @@ extjs_root(http_connection_t *hc, const char *remain, void *opaque)
|
||||||
extjs_load(hq, "static/app/cwceditor.js");
|
extjs_load(hq, "static/app/cwceditor.js");
|
||||||
extjs_load(hq, "static/app/capmteditor.js");
|
extjs_load(hq, "static/app/capmteditor.js");
|
||||||
extjs_load(hq, "static/app/tvadapters.js");
|
extjs_load(hq, "static/app/tvadapters.js");
|
||||||
|
extjs_load(hq, "static/app/idnode.js");
|
||||||
#if ENABLE_LINUXDVB
|
#if ENABLE_LINUXDVB
|
||||||
extjs_load(hq, "static/app/dvb.js");
|
extjs_load(hq, "static/app/dvb.js");
|
||||||
extjs_load(hq, "static/app/dvb_networks.js");
|
extjs_load(hq, "static/app/dvb_networks.js");
|
||||||
extjs_load(hq, "static/app/networks.js");
|
extjs_load(hq, "static/app/mpegts.js");
|
||||||
#endif
|
#endif
|
||||||
extjs_load(hq, "static/app/iptv.js");
|
extjs_load(hq, "static/app/iptv.js");
|
||||||
#if ENABLE_V4L
|
#if ENABLE_V4L
|
||||||
|
|
|
@ -65,683 +65,6 @@ extjs_grid_conf
|
||||||
conf->filter = NULL;
|
conf->filter = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
static int
|
|
||||||
extjs_dvblocations(http_connection_t *hc, const char *remain, void *opaque)
|
|
||||||
{
|
|
||||||
htsbuf_queue_t *hq = &hc->hc_reply;
|
|
||||||
const char *s = http_arg_get(&hc->hc_req_args, "node");
|
|
||||||
const char *a = http_arg_get(&hc->hc_req_args, "adapter");
|
|
||||||
th_dvb_adapter_t *tda;
|
|
||||||
htsmsg_t *out = NULL;
|
|
||||||
|
|
||||||
if(s == NULL || a == NULL)
|
|
||||||
return HTTP_STATUS_BAD_REQUEST;
|
|
||||||
|
|
||||||
pthread_mutex_lock(&global_lock);
|
|
||||||
|
|
||||||
if(http_access_verify(hc, ACCESS_ADMIN)) {
|
|
||||||
pthread_mutex_unlock(&global_lock);
|
|
||||||
return HTTP_STATUS_UNAUTHORIZED;
|
|
||||||
}
|
|
||||||
|
|
||||||
if((tda = dvb_adapter_find_by_identifier(a)) == NULL) {
|
|
||||||
pthread_mutex_unlock(&global_lock);
|
|
||||||
return HTTP_STATUS_BAD_REQUEST;
|
|
||||||
}
|
|
||||||
|
|
||||||
pthread_mutex_unlock(&global_lock);
|
|
||||||
|
|
||||||
if((out = dvb_mux_preconf_get_node(tda->tda_fe_type, s)) == NULL)
|
|
||||||
return 404;
|
|
||||||
|
|
||||||
htsmsg_json_serialize(out, hq, 0);
|
|
||||||
htsmsg_destroy(out);
|
|
||||||
http_output_content(hc, "text/x-json; charset=UTF-8");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
static htsmsg_t *
|
|
||||||
json_single_record(htsmsg_t *rec, const char *root)
|
|
||||||
{
|
|
||||||
htsmsg_t *out, *array;
|
|
||||||
|
|
||||||
out = htsmsg_create_map();
|
|
||||||
array = htsmsg_create_list();
|
|
||||||
|
|
||||||
htsmsg_add_msg(array, NULL, rec);
|
|
||||||
htsmsg_add_msg(out, root, array);
|
|
||||||
return out;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
static int
|
|
||||||
extjs_dvbadapter(http_connection_t *hc, const char *remain, void *opaque)
|
|
||||||
{
|
|
||||||
htsbuf_queue_t *hq = &hc->hc_reply;
|
|
||||||
th_dvb_adapter_t *tda, *ref;
|
|
||||||
htsmsg_t *out, *array, *r;
|
|
||||||
const char *op = http_arg_get(&hc->hc_req_args, "op");
|
|
||||||
const char *sibling = http_arg_get(&hc->hc_req_args, "sibling");
|
|
||||||
const char *s;
|
|
||||||
|
|
||||||
pthread_mutex_lock(&global_lock);
|
|
||||||
|
|
||||||
if(remain == NULL) {
|
|
||||||
/* Just list all adapters */
|
|
||||||
|
|
||||||
ref = sibling != NULL ? dvb_adapter_find_by_identifier(sibling) : NULL;
|
|
||||||
|
|
||||||
array = htsmsg_create_list();
|
|
||||||
|
|
||||||
TAILQ_FOREACH(tda, &dvb_adapters, tda_global_link) {
|
|
||||||
if(ref == NULL || (ref != tda && ref->tda_fe_type == tda->tda_fe_type))
|
|
||||||
htsmsg_add_msg(array, NULL, dvb_adapter_build_msg(tda));
|
|
||||||
}
|
|
||||||
pthread_mutex_unlock(&global_lock);
|
|
||||||
out = htsmsg_create_map();
|
|
||||||
htsmsg_add_msg(out, "entries", array);
|
|
||||||
|
|
||||||
htsmsg_json_serialize(out, hq, 0);
|
|
||||||
htsmsg_destroy(out);
|
|
||||||
http_output_content(hc, "text/x-json; charset=UTF-8");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if((tda = dvb_adapter_find_by_identifier(remain)) == NULL) {
|
|
||||||
pthread_mutex_unlock(&global_lock);
|
|
||||||
return 404;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!strcmp(op, "load")) {
|
|
||||||
r = htsmsg_create_map();
|
|
||||||
htsmsg_add_str(r, "id", tda->tda_identifier);
|
|
||||||
htsmsg_add_u32(r, "enabled", tda->tda_enabled);
|
|
||||||
htsmsg_add_str(r, "device", tda->tda_rootpath ?: "No hardware attached");
|
|
||||||
htsmsg_add_str(r, "name", tda->tda_displayname);
|
|
||||||
htsmsg_add_u32(r, "skip_initialscan", tda->tda_skip_initialscan);
|
|
||||||
htsmsg_add_u32(r, "idleclose", tda->tda_idleclose);
|
|
||||||
htsmsg_add_u32(r, "qmon", tda->tda_qmon);
|
|
||||||
htsmsg_add_u32(r, "poweroff", tda->tda_poweroff);
|
|
||||||
htsmsg_add_u32(r, "sidtochan", tda->tda_sidtochan);
|
|
||||||
htsmsg_add_u32(r, "full_mux_rx", tda->tda_full_mux_rx+1);
|
|
||||||
htsmsg_add_u32(r, "grace_period", tda->tda_grace_period);
|
|
||||||
htsmsg_add_str(r, "diseqcversion",
|
|
||||||
((const char *[]){"DiSEqC 1.0 / 2.0",
|
|
||||||
"DiSEqC 1.1 / 2.1"})
|
|
||||||
[tda->tda_diseqc_version % 2]);
|
|
||||||
htsmsg_add_str(r, "diseqcrepeats",
|
|
||||||
((const char *[]){"0", "1", "3"})
|
|
||||||
[tda->tda_diseqc_repeats % 3]);
|
|
||||||
htsmsg_add_u32(r, "extrapriority", tda->tda_extrapriority);
|
|
||||||
|
|
||||||
out = json_single_record(r, "dvbadapters");
|
|
||||||
} else if(!strcmp(op, "save")) {
|
|
||||||
|
|
||||||
if((s = http_arg_get(&hc->hc_req_args, "name")) != NULL)
|
|
||||||
dvb_adapter_set_displayname(tda, s);
|
|
||||||
|
|
||||||
s = http_arg_get(&hc->hc_req_args, "enabled");
|
|
||||||
dvb_adapter_set_enabled(tda, !!s);
|
|
||||||
|
|
||||||
s = http_arg_get(&hc->hc_req_args, "automux");
|
|
||||||
dvb_adapter_set_auto_discovery(tda, !!s);
|
|
||||||
|
|
||||||
s = http_arg_get(&hc->hc_req_args, "skip_initialscan");
|
|
||||||
dvb_adapter_set_skip_initialscan(tda, !!s);
|
|
||||||
|
|
||||||
s = http_arg_get(&hc->hc_req_args, "idleclose");
|
|
||||||
dvb_adapter_set_idleclose(tda, !!s);
|
|
||||||
|
|
||||||
s = http_arg_get(&hc->hc_req_args, "qmon");
|
|
||||||
dvb_adapter_set_qmon(tda, !!s);
|
|
||||||
|
|
||||||
s = http_arg_get(&hc->hc_req_args, "poweroff");
|
|
||||||
dvb_adapter_set_poweroff(tda, !!s);
|
|
||||||
|
|
||||||
s = http_arg_get(&hc->hc_req_args, "sidtochan");
|
|
||||||
dvb_adapter_set_sidtochan(tda, !!s);
|
|
||||||
|
|
||||||
s = http_arg_get(&hc->hc_req_args, "full_mux_rx");
|
|
||||||
dvb_adapter_set_full_mux_rx(tda, atoi(s)-1);
|
|
||||||
|
|
||||||
s = http_arg_get(&hc->hc_req_args, "grace_period");
|
|
||||||
dvb_adapter_set_grace_period(tda, atoi(s));
|
|
||||||
|
|
||||||
if((s = http_arg_get(&hc->hc_req_args, "nitoid")) != NULL)
|
|
||||||
dvb_adapter_set_nitoid(tda, atoi(s));
|
|
||||||
|
|
||||||
if((s = http_arg_get(&hc->hc_req_args, "diseqcversion")) != NULL) {
|
|
||||||
if(!strcmp(s, "DiSEqC 1.0 / 2.0"))
|
|
||||||
dvb_adapter_set_diseqc_version(tda, 0);
|
|
||||||
else if(!strcmp(s, "DiSEqC 1.1 / 2.1"))
|
|
||||||
dvb_adapter_set_diseqc_version(tda, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if((s = http_arg_get(&hc->hc_req_args, "diseqcrepeats")) != NULL) {
|
|
||||||
if(!strcmp(s, "0"))
|
|
||||||
dvb_adapter_set_diseqc_repeats(tda, 0);
|
|
||||||
else if(!strcmp(s, "1"))
|
|
||||||
dvb_adapter_set_diseqc_repeats(tda, 1);
|
|
||||||
else if(!strcmp(s, "2"))
|
|
||||||
dvb_adapter_set_diseqc_repeats(tda, 2);
|
|
||||||
}
|
|
||||||
if((s = http_arg_get(&hc->hc_req_args, "extrapriority")) != NULL)
|
|
||||||
dvb_adapter_set_extrapriority(tda, atoi(s));
|
|
||||||
|
|
||||||
out = htsmsg_create_map();
|
|
||||||
htsmsg_add_u32(out, "success", 1);
|
|
||||||
} else if(!strcmp(op, "addnetwork")) {
|
|
||||||
|
|
||||||
// sc = http_arg_get(&hc->hc_req_args, "satconf");
|
|
||||||
|
|
||||||
if((s = http_arg_get(&hc->hc_req_args, "network")) != NULL)
|
|
||||||
dvb_mux_preconf_add_network(tda->tda_dn, s);
|
|
||||||
|
|
||||||
out = htsmsg_create_map();
|
|
||||||
htsmsg_add_u32(out, "success", 1);
|
|
||||||
|
|
||||||
} else if(!strcmp(op, "serviceprobe")) {
|
|
||||||
|
|
||||||
tvhlog(LOG_NOTICE, "web interface",
|
|
||||||
"Service probe started on \"%s\"", tda->tda_displayname);
|
|
||||||
|
|
||||||
dvb_mux_t *dm;
|
|
||||||
service_t *s;
|
|
||||||
|
|
||||||
LIST_FOREACH(dm, &tda->tda_dn->dn_muxes, dm_network_link) {
|
|
||||||
LIST_FOREACH(s, &dm->dm_services, s_group_link) {
|
|
||||||
if(s->s_enabled)
|
|
||||||
serviceprobe_enqueue(s);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
out = htsmsg_create_map();
|
|
||||||
htsmsg_add_u32(out, "success", 1);
|
|
||||||
|
|
||||||
} else {
|
|
||||||
pthread_mutex_unlock(&global_lock);
|
|
||||||
return HTTP_STATUS_BAD_REQUEST;
|
|
||||||
}
|
|
||||||
pthread_mutex_unlock(&global_lock);
|
|
||||||
|
|
||||||
htsmsg_json_serialize(out, hq, 0);
|
|
||||||
htsmsg_destroy(out);
|
|
||||||
|
|
||||||
http_output_content(hc, "text/x-json; charset=UTF-8");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
static void
|
|
||||||
mux_update(htsmsg_t *in)
|
|
||||||
{
|
|
||||||
htsmsg_field_t *f;
|
|
||||||
htsmsg_t *c;
|
|
||||||
th_dvb_mux_instance_t *tdmi;
|
|
||||||
uint32_t u32;
|
|
||||||
const char *id;
|
|
||||||
|
|
||||||
TAILQ_FOREACH(f, &in->hm_fields, hmf_link) {
|
|
||||||
if((c = htsmsg_get_map_by_field(f)) == NULL ||
|
|
||||||
(id = htsmsg_get_str(c, "id")) == NULL)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if((tdmi = dvb_mux_find_by_identifier(id)) == NULL)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if(!htsmsg_get_u32(c, "enabled", &u32))
|
|
||||||
dvb_mux_set_enable(tdmi, u32);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
static void
|
|
||||||
mux_delete(htsmsg_t *in)
|
|
||||||
{
|
|
||||||
htsmsg_field_t *f;
|
|
||||||
th_dvb_mux_instance_t *tdmi;
|
|
||||||
const char *id;
|
|
||||||
|
|
||||||
TAILQ_FOREACH(f, &in->hm_fields, hmf_link) {
|
|
||||||
if((id = htsmsg_field_get_string(f)) != NULL &&
|
|
||||||
(tdmi = dvb_mux_find_by_identifier(id)) != NULL)
|
|
||||||
dvb_mux_destroy(tdmi);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
static int
|
|
||||||
extjs_dvbmuxes(http_connection_t *hc, const char *remain, void *opaque)
|
|
||||||
{
|
|
||||||
htsbuf_queue_t *hq = &hc->hc_reply;
|
|
||||||
th_dvb_adapter_t *tda;
|
|
||||||
htsmsg_t *out, *array, *in;
|
|
||||||
const char *op = http_arg_get(&hc->hc_req_args, "op");
|
|
||||||
const char *entries = http_arg_get(&hc->hc_req_args, "entries");
|
|
||||||
th_dvb_mux_instance_t *tdmi;
|
|
||||||
|
|
||||||
pthread_mutex_lock(&global_lock);
|
|
||||||
|
|
||||||
if(remain == NULL ||
|
|
||||||
(tda = dvb_adapter_find_by_identifier(remain)) == NULL) {
|
|
||||||
pthread_mutex_unlock(&global_lock);
|
|
||||||
return 404;
|
|
||||||
}
|
|
||||||
|
|
||||||
in = entries != NULL ? htsmsg_json_deserialize(entries) : NULL;
|
|
||||||
|
|
||||||
out = htsmsg_create_map();
|
|
||||||
|
|
||||||
if(!strcmp(op, "get")) {
|
|
||||||
array = htsmsg_create_list();
|
|
||||||
|
|
||||||
LIST_FOREACH(tdmi, &tda->tda_dn->dn_mux_instances, tdmi_adapter_link)
|
|
||||||
htsmsg_add_msg(array, NULL, dvb_mux_build_msg(tdmi));
|
|
||||||
|
|
||||||
htsmsg_add_msg(out, "entries", array);
|
|
||||||
} else if(!strcmp(op, "update")) {
|
|
||||||
if(in != NULL)
|
|
||||||
mux_update(in);
|
|
||||||
|
|
||||||
out = htsmsg_create_map();
|
|
||||||
|
|
||||||
} else if(!strcmp(op, "delete")) {
|
|
||||||
if(in != NULL)
|
|
||||||
mux_delete(in);
|
|
||||||
|
|
||||||
out = htsmsg_create_map();
|
|
||||||
|
|
||||||
} else {
|
|
||||||
pthread_mutex_unlock(&global_lock);
|
|
||||||
if(in != NULL)
|
|
||||||
htsmsg_destroy(in);
|
|
||||||
htsmsg_destroy(out);
|
|
||||||
return HTTP_STATUS_BAD_REQUEST;
|
|
||||||
}
|
|
||||||
|
|
||||||
pthread_mutex_unlock(&global_lock);
|
|
||||||
|
|
||||||
htsmsg_json_serialize(out, hq, 0);
|
|
||||||
htsmsg_destroy(out);
|
|
||||||
http_output_content(hc, "text/x-json; charset=UTF-8");
|
|
||||||
|
|
||||||
if(in != NULL)
|
|
||||||
htsmsg_destroy(in);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
static int
|
|
||||||
transportcmp(const void *A, const void *B)
|
|
||||||
{
|
|
||||||
service_t *a = *(service_t **)A;
|
|
||||||
service_t *b = *(service_t **)B;
|
|
||||||
|
|
||||||
return strcasecmp(a->s_svcname ?: "\0377", b->s_svcname ?: "\0377");
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
static int
|
|
||||||
extjs_dvbservices(http_connection_t *hc, const char *remain, void *opaque)
|
|
||||||
{
|
|
||||||
htsbuf_queue_t *hq = &hc->hc_reply;
|
|
||||||
th_dvb_adapter_t *tda;
|
|
||||||
htsmsg_t *out, *array, *in;
|
|
||||||
const char *op = http_arg_get(&hc->hc_req_args, "op");
|
|
||||||
const char *entries = http_arg_get(&hc->hc_req_args, "entries");
|
|
||||||
th_dvb_mux_instance_t *tdmi;
|
|
||||||
service_t *t, **tvec;
|
|
||||||
int count = 0, i = 0;
|
|
||||||
|
|
||||||
pthread_mutex_lock(&global_lock);
|
|
||||||
|
|
||||||
if(remain == NULL ||
|
|
||||||
(tda = dvb_adapter_find_by_identifier(remain)) == NULL) {
|
|
||||||
pthread_mutex_unlock(&global_lock);
|
|
||||||
return 404;
|
|
||||||
}
|
|
||||||
|
|
||||||
in = entries != NULL ? htsmsg_json_deserialize(entries) : NULL;
|
|
||||||
|
|
||||||
if(!strcmp(op, "get")) {
|
|
||||||
|
|
||||||
out = htsmsg_create_map();
|
|
||||||
array = htsmsg_create_list();
|
|
||||||
|
|
||||||
LIST_FOREACH(tdmi, &tda->tda_dn->dn_mux_instances, tdmi_adapter_link) {
|
|
||||||
LIST_FOREACH(t, &tdmi->tdmi_mux->dm_services, s_group_link) {
|
|
||||||
count++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
tvec = alloca(sizeof(service_t *) * count);
|
|
||||||
|
|
||||||
LIST_FOREACH(tdmi, &tda->tda_dn->dn_mux_instances, tdmi_adapter_link) {
|
|
||||||
LIST_FOREACH(t, &tdmi->tdmi_mux->dm_services, s_group_link) {
|
|
||||||
tvec[i++] = t;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
qsort(tvec, count, sizeof(service_t *), transportcmp);
|
|
||||||
|
|
||||||
for(i = 0; i < count; i++)
|
|
||||||
htsmsg_add_msg(array, NULL, dvb_service_build_msg(tvec[i]));
|
|
||||||
|
|
||||||
htsmsg_add_msg(out, "entries", array);
|
|
||||||
|
|
||||||
} else if(!strcmp(op, "update")) {
|
|
||||||
if(in != NULL)
|
|
||||||
extjs_service_update(in);
|
|
||||||
|
|
||||||
out = htsmsg_create_map();
|
|
||||||
|
|
||||||
} else {
|
|
||||||
pthread_mutex_unlock(&global_lock);
|
|
||||||
htsmsg_destroy(in);
|
|
||||||
return HTTP_STATUS_BAD_REQUEST;
|
|
||||||
}
|
|
||||||
|
|
||||||
htsmsg_destroy(in);
|
|
||||||
|
|
||||||
pthread_mutex_unlock(&global_lock);
|
|
||||||
|
|
||||||
htsmsg_json_serialize(out, hq, 0);
|
|
||||||
htsmsg_destroy(out);
|
|
||||||
http_output_content(hc, "text/x-json; charset=UTF-8");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
static int
|
|
||||||
extjs_lnbtypes(http_connection_t *hc, const char *remain, void *opaque)
|
|
||||||
{
|
|
||||||
htsbuf_queue_t *hq = &hc->hc_reply;
|
|
||||||
htsmsg_t *out;
|
|
||||||
|
|
||||||
out = htsmsg_create_map();
|
|
||||||
|
|
||||||
htsmsg_add_msg(out, "entries", dvb_lnblist_get());
|
|
||||||
|
|
||||||
htsmsg_json_serialize(out, hq, 0);
|
|
||||||
htsmsg_destroy(out);
|
|
||||||
http_output_content(hc, "text/x-json; charset=UTF-8");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
static int
|
|
||||||
extjs_dvbsatconf(http_connection_t *hc, const char *remain, void *opaque)
|
|
||||||
{
|
|
||||||
htsbuf_queue_t *hq = &hc->hc_reply;
|
|
||||||
th_dvb_adapter_t *tda;
|
|
||||||
htsmsg_t *out;
|
|
||||||
const char *adapter = http_arg_get(&hc->hc_req_args, "adapter");
|
|
||||||
|
|
||||||
pthread_mutex_lock(&global_lock);
|
|
||||||
|
|
||||||
if((remain == NULL ||
|
|
||||||
(tda = dvb_adapter_find_by_identifier(remain)) == NULL) &&
|
|
||||||
(adapter == NULL ||
|
|
||||||
(tda = dvb_adapter_find_by_identifier(adapter)) == NULL)) {
|
|
||||||
pthread_mutex_unlock(&global_lock);
|
|
||||||
return 404;
|
|
||||||
}
|
|
||||||
|
|
||||||
out = htsmsg_create_map();
|
|
||||||
htsmsg_add_msg(out, "entries", dvb_satconf_list(tda));
|
|
||||||
|
|
||||||
pthread_mutex_unlock(&global_lock);
|
|
||||||
|
|
||||||
htsmsg_json_serialize(out, hq, 0);
|
|
||||||
htsmsg_destroy(out);
|
|
||||||
|
|
||||||
http_output_content(hc, "text/x-json; charset=UTF-8");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
static int
|
|
||||||
extjs_dvb_feopts(http_connection_t *hc, const char *remain, void *opaque)
|
|
||||||
{
|
|
||||||
htsbuf_queue_t *hq = &hc->hc_reply;
|
|
||||||
char *a, *r;
|
|
||||||
th_dvb_adapter_t *tda;
|
|
||||||
htsmsg_t *e, *out;
|
|
||||||
|
|
||||||
if(remain == NULL)
|
|
||||||
return 400;
|
|
||||||
|
|
||||||
r = tvh_strdupa(remain);
|
|
||||||
if((a = strchr(r, '/')) == NULL)
|
|
||||||
return 400;
|
|
||||||
*a++ = 0;
|
|
||||||
|
|
||||||
pthread_mutex_lock(&global_lock);
|
|
||||||
|
|
||||||
if((tda = dvb_adapter_find_by_identifier(a)) == NULL) {
|
|
||||||
pthread_mutex_unlock(&global_lock);
|
|
||||||
return 404;
|
|
||||||
}
|
|
||||||
|
|
||||||
e = dvb_fe_opts(tda, r);
|
|
||||||
|
|
||||||
if(e == NULL) {
|
|
||||||
pthread_mutex_unlock(&global_lock);
|
|
||||||
return 400;
|
|
||||||
}
|
|
||||||
|
|
||||||
out = htsmsg_create_map();
|
|
||||||
htsmsg_add_msg(out, "entries", e);
|
|
||||||
|
|
||||||
pthread_mutex_unlock(&global_lock);
|
|
||||||
|
|
||||||
htsmsg_json_serialize(out, hq, 0);
|
|
||||||
http_output_content(hc, "text/x-json; charset=UTF-8");
|
|
||||||
htsmsg_destroy(out);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
static int
|
|
||||||
extjs_dvb_addmux(http_connection_t *hc, const char *remain, void *opaque)
|
|
||||||
{
|
|
||||||
htsmsg_t *out;
|
|
||||||
htsbuf_queue_t *hq = &hc->hc_reply;
|
|
||||||
struct http_arg_list *args = &hc->hc_req_args;
|
|
||||||
th_dvb_adapter_t *tda;
|
|
||||||
const char *err;
|
|
||||||
pthread_mutex_lock(&global_lock);
|
|
||||||
|
|
||||||
if(remain == NULL ||
|
|
||||||
(tda = dvb_adapter_find_by_identifier(remain)) == NULL) {
|
|
||||||
pthread_mutex_unlock(&global_lock);
|
|
||||||
return 404;
|
|
||||||
}
|
|
||||||
|
|
||||||
err =
|
|
||||||
dvb_mux_add_by_params(tda,
|
|
||||||
atoi(http_arg_get(args, "frequency")?:"-1"),
|
|
||||||
atoi(http_arg_get(args, "symbolrate")?: "-1"),
|
|
||||||
atoi(http_arg_get(args, "bandwidthID")?: "-1"),
|
|
||||||
atoi(http_arg_get(args, "constellationID")?: "-1"),
|
|
||||||
atoi(http_arg_get(args, "delsysID")?: "-1"),
|
|
||||||
atoi(http_arg_get(args, "tmodeID")?: "-1"),
|
|
||||||
atoi(http_arg_get(args, "guardintervalID")?: "-1"),
|
|
||||||
atoi(http_arg_get(args, "hierarchyID")?: "-1"),
|
|
||||||
atoi(http_arg_get(args, "fechiID")?: "-1"),
|
|
||||||
atoi(http_arg_get(args, "fecloID")?: "-1"),
|
|
||||||
atoi(http_arg_get(args, "fecID")?: "-1"),
|
|
||||||
atoi(http_arg_get(args, "polarisationID")?: "-1"),
|
|
||||||
http_arg_get(args, "satconfID") ?: NULL);
|
|
||||||
|
|
||||||
if(err != NULL)
|
|
||||||
tvhlog(LOG_ERR, "web interface",
|
|
||||||
"Unable to create mux on %s: %s",
|
|
||||||
tda->tda_displayname, err);
|
|
||||||
|
|
||||||
pthread_mutex_unlock(&global_lock);
|
|
||||||
|
|
||||||
out = htsmsg_create_map();
|
|
||||||
htsmsg_json_serialize(out, hq, 0);
|
|
||||||
http_output_content(hc, "text/x-json; charset=UTF-8");
|
|
||||||
htsmsg_destroy(out);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
static int
|
|
||||||
extjs_dvb_copymux(http_connection_t *hc, const char *remain, void *opaque)
|
|
||||||
{
|
|
||||||
htsmsg_t *out;
|
|
||||||
htsbuf_queue_t *hq = &hc->hc_reply;
|
|
||||||
th_dvb_adapter_t *tda;
|
|
||||||
htsmsg_t *in;
|
|
||||||
const char *entries = http_arg_get(&hc->hc_req_args, "entries");
|
|
||||||
const char *satconf = http_arg_get(&hc->hc_req_args, "satconf");
|
|
||||||
const char *id;
|
|
||||||
htsmsg_field_t *f;
|
|
||||||
th_dvb_mux_instance_t *tdmi;
|
|
||||||
dvb_satconf_t *sc = NULL;
|
|
||||||
|
|
||||||
in = entries != NULL ? htsmsg_json_deserialize(entries) : NULL;
|
|
||||||
|
|
||||||
if(in == NULL)
|
|
||||||
return 400;
|
|
||||||
|
|
||||||
pthread_mutex_lock(&global_lock);
|
|
||||||
|
|
||||||
if(remain == NULL ||
|
|
||||||
(tda = dvb_adapter_find_by_identifier(remain)) == NULL) {
|
|
||||||
pthread_mutex_unlock(&global_lock);
|
|
||||||
return 404;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (satconf) {
|
|
||||||
sc = dvb_satconf_entry_find(tda, satconf, 0);
|
|
||||||
if (sc == NULL) {
|
|
||||||
pthread_mutex_unlock(&global_lock);
|
|
||||||
return 404;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
TAILQ_FOREACH(f, &in->hm_fields, hmf_link) {
|
|
||||||
if((id = htsmsg_field_get_string(f)) != NULL &&
|
|
||||||
(tdmi = dvb_mux_find_by_identifier(id)) != NULL &&
|
|
||||||
tda != tdmi->tdmi_adapter) {
|
|
||||||
|
|
||||||
if(dvb_mux_copy(tda, tdmi, sc)) {
|
|
||||||
char buf[100];
|
|
||||||
dvb_mux_nicename(buf, sizeof(buf), tdmi);
|
|
||||||
|
|
||||||
tvhlog(LOG_NOTICE, "DVB",
|
|
||||||
"Skipped copy of mux %s to adapter %s, mux already exist",
|
|
||||||
buf, tda->tda_displayname);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pthread_mutex_unlock(&global_lock);
|
|
||||||
|
|
||||||
out = htsmsg_create_map();
|
|
||||||
htsmsg_json_serialize(out, hq, 0);
|
|
||||||
http_output_content(hc, "text/x-json; charset=UTF-8");
|
|
||||||
htsmsg_destroy(out);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#if 0
|
|
||||||
static int
|
|
||||||
extjs_dvbnetworks(http_connection_t *hc, const char *remain, void *opaque)
|
|
||||||
{
|
|
||||||
return extjs_get_idnode(hc, remain, opaque, &dvb_network_root);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
static int
|
|
||||||
extjs_mpegts_services_filter
|
|
||||||
(mpegts_service_t *s, htsmsg_t *filter)
|
|
||||||
{
|
|
||||||
htsmsg_t *e;
|
|
||||||
htsmsg_field_t *f;
|
|
||||||
const char *n;
|
|
||||||
HTSMSG_FOREACH(f, filter) {
|
|
||||||
if (!(e = htsmsg_get_map_by_field(f))) continue;
|
|
||||||
if (!(n = htsmsg_get_str(e, "field"))) continue;
|
|
||||||
if (!strcmp(n, "name"))
|
|
||||||
if (!strstr(s->s_dvb_svcname ?: "", htsmsg_get_str(e, "value") ?: "")) return 1;
|
|
||||||
if (!strcmp(n, "sid")) {
|
|
||||||
const char *t = htsmsg_get_str(e, "comparison");
|
|
||||||
const char *v = htsmsg_get_str(e, "value");
|
|
||||||
if (!strcmp(t ?: "", "gt")) {
|
|
||||||
if (s->s_dvb_service_id < atoi(v)) return 1;
|
|
||||||
} else if (!strcmp(t ?: "", "lt")) {
|
|
||||||
if (s->s_dvb_service_id > atoi(v)) return 1;
|
|
||||||
} else if (!strcmp(t ?: "", "eq")) {
|
|
||||||
if (s->s_dvb_service_id != atoi(v)) return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
extjs_idnode_filter
|
extjs_idnode_filter
|
||||||
( idnode_t *in, htsmsg_t *filter )
|
( idnode_t *in, htsmsg_t *filter )
|
||||||
|
@ -777,11 +100,22 @@ extjs_idnode_filter
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static htsmsg_t *
|
||||||
|
extjs_idnode_class ( const idclass_t *idc )
|
||||||
|
{
|
||||||
|
htsmsg_t *ret = htsmsg_create_list();
|
||||||
|
while (idc) {
|
||||||
|
prop_add_params_to_msg(NULL, idc->ic_properties, ret);
|
||||||
|
idc = idc->ic_super;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
extjs_mpegts_services
|
extjs_mpegts_services
|
||||||
(http_connection_t *hc, const char *remain, void *opaque)
|
(http_connection_t *hc, const char *remain, void *opaque)
|
||||||
{
|
{
|
||||||
char buf[256];
|
//char buf[256];
|
||||||
mpegts_network_t *mn;
|
mpegts_network_t *mn;
|
||||||
mpegts_mux_t *mm;
|
mpegts_mux_t *mm;
|
||||||
mpegts_service_t *ms;
|
mpegts_service_t *ms;
|
||||||
|
@ -807,21 +141,7 @@ extjs_mpegts_services
|
||||||
conf.limit--;
|
conf.limit--;
|
||||||
htsmsg_t *e = htsmsg_create_map();
|
htsmsg_t *e = htsmsg_create_map();
|
||||||
htsmsg_add_str(e, "uuid", idnode_uuid_as_str(&ms->s_id));
|
htsmsg_add_str(e, "uuid", idnode_uuid_as_str(&ms->s_id));
|
||||||
mm->mm_display_name(mm, buf, sizeof(buf));
|
idnode_save(&ms->s_id, e);
|
||||||
htsmsg_add_str(e, "mux", buf);
|
|
||||||
htsmsg_add_bool(e, "enabled", ms->s_enabled);
|
|
||||||
htsmsg_add_u32(e, "sid", ms->s_dvb_service_id);
|
|
||||||
htsmsg_add_u32(e, "pmt", ms->s_pmt_pid);
|
|
||||||
htsmsg_add_u32(e, "lcn", ms->s_dvb_channel_num);
|
|
||||||
if (ms->s_dvb_svcname)
|
|
||||||
htsmsg_add_str(e, "name", ms->s_dvb_svcname);
|
|
||||||
if (ms->s_dvb_provider)
|
|
||||||
htsmsg_add_str(e, "provider", ms->s_dvb_provider);
|
|
||||||
if (ms->s_dvb_cridauth)
|
|
||||||
htsmsg_add_str(e, "crid_auth", ms->s_dvb_cridauth);
|
|
||||||
if (ms->s_dvb_charset)
|
|
||||||
htsmsg_add_str(e, "charset", ms->s_dvb_charset);
|
|
||||||
htsmsg_add_u32(e, "type", ms->s_dvb_servicetype);
|
|
||||||
htsmsg_add_msg(list, NULL, e);
|
htsmsg_add_msg(list, NULL, e);
|
||||||
conf.limit--;
|
conf.limit--;
|
||||||
}
|
}
|
||||||
|
@ -831,6 +151,10 @@ extjs_mpegts_services
|
||||||
pthread_mutex_unlock(&global_lock);
|
pthread_mutex_unlock(&global_lock);
|
||||||
htsmsg_add_msg(out, "entries", list);
|
htsmsg_add_msg(out, "entries", list);
|
||||||
htsmsg_add_u32(out, "total", total);
|
htsmsg_add_u32(out, "total", total);
|
||||||
|
} else if (!strcmp(op, "class")) {
|
||||||
|
extern const idclass_t mpegts_service_class;
|
||||||
|
htsmsg_t *list= extjs_idnode_class(&mpegts_service_class);
|
||||||
|
htsmsg_add_msg(out, "entries", list);
|
||||||
}
|
}
|
||||||
|
|
||||||
htsmsg_json_serialize(out, hq, 0);
|
htsmsg_json_serialize(out, hq, 0);
|
||||||
|
@ -849,33 +173,48 @@ extjs_mpegts_muxes
|
||||||
mpegts_network_t *mn;
|
mpegts_network_t *mn;
|
||||||
mpegts_mux_t *mm;
|
mpegts_mux_t *mm;
|
||||||
mpegts_service_t *ms;
|
mpegts_service_t *ms;
|
||||||
int s;
|
|
||||||
htsmsg_t *out, *list = htsmsg_create_list();
|
|
||||||
htsbuf_queue_t *hq = &hc->hc_reply;
|
htsbuf_queue_t *hq = &hc->hc_reply;
|
||||||
|
const char *op = http_arg_get(&hc->hc_req_args, "op");
|
||||||
|
htsmsg_t *out = htsmsg_create_map();
|
||||||
|
extjs_grid_conf_t conf;
|
||||||
|
int s, total = 0;
|
||||||
|
|
||||||
|
if (!strcmp(op, "list")) {
|
||||||
|
htsmsg_t *list = htsmsg_create_list();
|
||||||
|
extjs_grid_conf(&hc->hc_req_args, &conf);
|
||||||
|
|
||||||
pthread_mutex_lock(&global_lock);
|
pthread_mutex_lock(&global_lock);
|
||||||
LIST_FOREACH(mn, &mpegts_network_all, mn_global_link) {
|
LIST_FOREACH(mn, &mpegts_network_all, mn_global_link) {
|
||||||
LIST_FOREACH(mm, &mn->mn_muxes, mm_network_link) {
|
LIST_FOREACH(mm, &mn->mn_muxes, mm_network_link) {
|
||||||
|
if (conf.filter && !extjs_idnode_filter(&mm->mm_id, conf.filter))
|
||||||
|
continue;
|
||||||
|
total++;
|
||||||
|
if (conf.start-- > 0)
|
||||||
|
continue;
|
||||||
|
if (conf.limit) {
|
||||||
s = 0;
|
s = 0;
|
||||||
|
conf.limit--;
|
||||||
htsmsg_t *e = htsmsg_create_map();
|
htsmsg_t *e = htsmsg_create_map();
|
||||||
htsmsg_add_str(e, "uuid", idnode_uuid_as_str(&mm->mm_id));
|
htsmsg_add_str(e, "uuid", idnode_uuid_as_str(&mm->mm_id));
|
||||||
|
idnode_save(&mm->mm_id, e);
|
||||||
mn->mn_display_name(mn, buf, sizeof(buf));
|
mn->mn_display_name(mn, buf, sizeof(buf));
|
||||||
htsmsg_add_str(e, "network", buf);
|
htsmsg_add_str(e, "network", buf);
|
||||||
mm->mm_display_name(mm, buf, sizeof(buf));
|
|
||||||
htsmsg_add_str(e, "name", buf);
|
|
||||||
htsmsg_add_bool(e, "enabled", mm->mm_enabled);
|
|
||||||
htsmsg_add_u32(e, "onid", mm->mm_onid);
|
|
||||||
htsmsg_add_u32(e, "tsid", mm->mm_tsid);
|
|
||||||
htsmsg_add_bool(e, "initscan", mm->mm_initial_scan_done);
|
|
||||||
htsmsg_add_str(e, "crid_auth", mm->mm_crid_authority ?: "");
|
|
||||||
LIST_FOREACH(ms, &mm->mm_services, s_dvb_mux_link)
|
LIST_FOREACH(ms, &mm->mm_services, s_dvb_mux_link)
|
||||||
s++;
|
s++;
|
||||||
htsmsg_add_u32(e, "num_svc", s);
|
htsmsg_add_u32(e, "num_svc", s);
|
||||||
htsmsg_add_msg(list, NULL, e);
|
htsmsg_add_msg(list, NULL, e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
pthread_mutex_unlock(&global_lock);
|
pthread_mutex_unlock(&global_lock);
|
||||||
out = htsmsg_create_map();
|
|
||||||
htsmsg_add_msg(out, "entries", list);
|
htsmsg_add_msg(out, "entries", list);
|
||||||
|
htsmsg_add_u32(out, "total", total);
|
||||||
|
} else if (!strcmp(op, "class")) {
|
||||||
|
extern const idclass_t mpegts_mux_class;
|
||||||
|
htsmsg_t *list= extjs_idnode_class(&mpegts_mux_class);
|
||||||
|
htsmsg_add_msg(out, "entries", list);
|
||||||
|
}
|
||||||
|
|
||||||
htsmsg_json_serialize(out, hq, 0);
|
htsmsg_json_serialize(out, hq, 0);
|
||||||
http_output_content(hc, "text/x-json; charset=UTF-8");
|
http_output_content(hc, "text/x-json; charset=UTF-8");
|
||||||
htsmsg_destroy(out);
|
htsmsg_destroy(out);
|
||||||
|
@ -887,23 +226,32 @@ static int
|
||||||
extjs_mpegts_networks
|
extjs_mpegts_networks
|
||||||
(http_connection_t *hc, const char *remain, void *opaque)
|
(http_connection_t *hc, const char *remain, void *opaque)
|
||||||
{
|
{
|
||||||
char buf[256];
|
|
||||||
mpegts_network_t *mn;
|
mpegts_network_t *mn;
|
||||||
mpegts_mux_t *mm;
|
mpegts_mux_t *mm;
|
||||||
mpegts_service_t *ms;
|
mpegts_service_t *ms;
|
||||||
int m, s;
|
|
||||||
htsmsg_t *out, *list = htsmsg_create_list();
|
|
||||||
htsbuf_queue_t *hq = &hc->hc_reply;
|
htsbuf_queue_t *hq = &hc->hc_reply;
|
||||||
|
const char *op = http_arg_get(&hc->hc_req_args, "op");
|
||||||
|
htsmsg_t *out = htsmsg_create_map();
|
||||||
|
extjs_grid_conf_t conf;
|
||||||
|
int s, m, total = 0;
|
||||||
|
|
||||||
|
if (!strcmp(op, "list")) {
|
||||||
|
htsmsg_t *list = htsmsg_create_list();
|
||||||
|
extjs_grid_conf(&hc->hc_req_args, &conf);
|
||||||
|
|
||||||
pthread_mutex_lock(&global_lock);
|
pthread_mutex_lock(&global_lock);
|
||||||
LIST_FOREACH(mn, &mpegts_network_all, mn_global_link) {
|
LIST_FOREACH(mn, &mpegts_network_all, mn_global_link) {
|
||||||
m = s = 0;
|
if (conf.filter && !extjs_idnode_filter(&mn->mn_id, conf.filter))
|
||||||
|
continue;
|
||||||
|
total++;
|
||||||
|
if (conf.start-- > 0)
|
||||||
|
continue;
|
||||||
|
if (conf.limit) {
|
||||||
|
s = m = 0;
|
||||||
|
conf.limit--;
|
||||||
htsmsg_t *e = htsmsg_create_map();
|
htsmsg_t *e = htsmsg_create_map();
|
||||||
htsmsg_add_str(e, "uuid", idnode_uuid_as_str(&mn->mn_id));
|
htsmsg_add_str(e, "uuid", idnode_uuid_as_str(&mn->mn_id));
|
||||||
mn->mn_display_name(mn, buf, sizeof(buf));
|
idnode_save(&mn->mn_id, e);
|
||||||
htsmsg_add_str(e, "name", buf);
|
|
||||||
htsmsg_add_u32(e, "nid", mn->mn_nid);
|
|
||||||
htsmsg_add_u32(e, "autodiscovery", mn->mn_autodiscovery);
|
|
||||||
htsmsg_add_u32(e, "skipinitscan", mn->mn_skipinitscan);
|
|
||||||
LIST_FOREACH(mm, &mn->mn_muxes, mm_network_link) {
|
LIST_FOREACH(mm, &mn->mn_muxes, mm_network_link) {
|
||||||
m++;
|
m++;
|
||||||
LIST_FOREACH(ms, &mm->mm_services, s_dvb_mux_link)
|
LIST_FOREACH(ms, &mm->mm_services, s_dvb_mux_link)
|
||||||
|
@ -913,9 +261,16 @@ extjs_mpegts_networks
|
||||||
htsmsg_add_u32(e, "num_svc", s);
|
htsmsg_add_u32(e, "num_svc", s);
|
||||||
htsmsg_add_msg(list, NULL, e);
|
htsmsg_add_msg(list, NULL, e);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
pthread_mutex_unlock(&global_lock);
|
pthread_mutex_unlock(&global_lock);
|
||||||
out = htsmsg_create_map();
|
|
||||||
htsmsg_add_msg(out, "entries", list);
|
htsmsg_add_msg(out, "entries", list);
|
||||||
|
htsmsg_add_u32(out, "total", total);
|
||||||
|
} else if (!strcmp(op, "class")) {
|
||||||
|
extern const idclass_t mpegts_network_class;
|
||||||
|
htsmsg_t *list= extjs_idnode_class(&mpegts_network_class);
|
||||||
|
htsmsg_add_msg(out, "entries", list);
|
||||||
|
}
|
||||||
|
|
||||||
htsmsg_json_serialize(out, hq, 0);
|
htsmsg_json_serialize(out, hq, 0);
|
||||||
http_output_content(hc, "text/x-json; charset=UTF-8");
|
http_output_content(hc, "text/x-json; charset=UTF-8");
|
||||||
htsmsg_destroy(out);
|
htsmsg_destroy(out);
|
||||||
|
@ -931,11 +286,11 @@ void
|
||||||
extjs_start_dvb(void)
|
extjs_start_dvb(void)
|
||||||
{
|
{
|
||||||
printf("extjs_start_dvb()\n");
|
printf("extjs_start_dvb()\n");
|
||||||
http_path_add("/api/mpegts/networks",
|
http_path_add("/api/mpegts/network",
|
||||||
NULL, extjs_mpegts_networks, ACCESS_WEB_INTERFACE);
|
NULL, extjs_mpegts_networks, ACCESS_WEB_INTERFACE);
|
||||||
http_path_add("/api/mpegts/muxes",
|
http_path_add("/api/mpegts/mux",
|
||||||
NULL, extjs_mpegts_muxes, ACCESS_WEB_INTERFACE);
|
NULL, extjs_mpegts_muxes, ACCESS_WEB_INTERFACE);
|
||||||
http_path_add("/api/mpegts/services",
|
http_path_add("/api/mpegts/service",
|
||||||
NULL, extjs_mpegts_services, ACCESS_WEB_INTERFACE);
|
NULL, extjs_mpegts_services, ACCESS_WEB_INTERFACE);
|
||||||
#if 0
|
#if 0
|
||||||
http_path_add("/dvb/locations",
|
http_path_add("/dvb/locations",
|
||||||
|
|
93
src/webui/static/app/idnode.js
Normal file
93
src/webui/static/app/idnode.js
Normal file
|
@ -0,0 +1,93 @@
|
||||||
|
/*
|
||||||
|
* IDnode grid
|
||||||
|
*/
|
||||||
|
tvheadend.idnode_grid = function(panel, conf)
|
||||||
|
{
|
||||||
|
function build (d)
|
||||||
|
{
|
||||||
|
if (d && d.responseText) {
|
||||||
|
d = Ext.util.JSON.decode(d.responseText)
|
||||||
|
d = d.entries;
|
||||||
|
} else
|
||||||
|
d = []
|
||||||
|
|
||||||
|
/* Process object */
|
||||||
|
var columns = [];
|
||||||
|
var filters = [];
|
||||||
|
var fields = [];
|
||||||
|
for (i = 0; i < d.length; i++) {
|
||||||
|
var type = 'string';
|
||||||
|
if (d[i].type == 'int' || d[i].type == 'u16' || d[i].type == 'u32')
|
||||||
|
type = 'numeric';
|
||||||
|
else if (d[i].type == 'bool')
|
||||||
|
type = 'boolean';
|
||||||
|
fields.push(d[i].id)
|
||||||
|
columns.push({
|
||||||
|
dataIndex: d[i].id,
|
||||||
|
header : d[i].caption,
|
||||||
|
sortable : true
|
||||||
|
});
|
||||||
|
filters.push({
|
||||||
|
type : type,
|
||||||
|
dataIndex : d[i].id
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Filters */
|
||||||
|
var filter = new Ext.ux.grid.GridFilters({
|
||||||
|
encode : true,
|
||||||
|
local : false,
|
||||||
|
filters : filters
|
||||||
|
});
|
||||||
|
|
||||||
|
/* Store */
|
||||||
|
var store = new Ext.data.JsonStore({
|
||||||
|
root : 'entries',
|
||||||
|
url : conf.url,
|
||||||
|
autoLoad : true,
|
||||||
|
id : 'uuid',
|
||||||
|
totalProperty : 'total',
|
||||||
|
fields : fields,
|
||||||
|
baseParams : {
|
||||||
|
op : 'list',
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
/* Model */
|
||||||
|
var model = new Ext.grid.ColumnModel({
|
||||||
|
defaultSortable : true,
|
||||||
|
columns : columns
|
||||||
|
});
|
||||||
|
|
||||||
|
/* Grid Panel */
|
||||||
|
var grid = new Ext.grid.EditorGridPanel({
|
||||||
|
stripeRows : true,
|
||||||
|
title : conf.title,
|
||||||
|
store : store,
|
||||||
|
cm : model,
|
||||||
|
plugins : [
|
||||||
|
filter
|
||||||
|
],
|
||||||
|
viewConfig : {
|
||||||
|
forceFit : true
|
||||||
|
},
|
||||||
|
bbar : new Ext.PagingToolbar({
|
||||||
|
store : store,
|
||||||
|
pageSize : 50,
|
||||||
|
displayInfo : true,
|
||||||
|
displayMsg : conf.title + ' {0} - {1} of {2}',
|
||||||
|
emptyMsg : 'No ' + conf.title.toLowerCase() + ' to display'
|
||||||
|
})
|
||||||
|
});
|
||||||
|
|
||||||
|
panel.add(grid);
|
||||||
|
}
|
||||||
|
|
||||||
|
Ext.Ajax.request({
|
||||||
|
url : conf.url,
|
||||||
|
success : build,
|
||||||
|
params : {
|
||||||
|
op: 'class'
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
31
src/webui/static/app/mpegts.js
Normal file
31
src/webui/static/app/mpegts.js
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
/*
|
||||||
|
* IDnode stuff
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* DVB network
|
||||||
|
*/
|
||||||
|
|
||||||
|
tvheadend.networks = function(panel)
|
||||||
|
{
|
||||||
|
tvheadend.idnode_grid(panel, {
|
||||||
|
url : 'api/mpegts/network',
|
||||||
|
title: 'Networks'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
tvheadend.muxes = function(panel)
|
||||||
|
{
|
||||||
|
tvheadend.idnode_grid(panel, {
|
||||||
|
url : 'api/mpegts/mux',
|
||||||
|
title: 'Muxes'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
tvheadend.services = function(panel)
|
||||||
|
{
|
||||||
|
tvheadend.idnode_grid(panel, {
|
||||||
|
url : 'api/mpegts/service',
|
||||||
|
title: 'Services'
|
||||||
|
});
|
||||||
|
}
|
|
@ -1,263 +0,0 @@
|
||||||
/*
|
|
||||||
* DVB Networks
|
|
||||||
*/
|
|
||||||
|
|
||||||
tvheadend.networks = function()
|
|
||||||
{
|
|
||||||
// TODO: build this from mpegts_network_class?
|
|
||||||
|
|
||||||
var model = new Ext.grid.ColumnModel({
|
|
||||||
defaultSortable: true,
|
|
||||||
columns : [
|
|
||||||
{
|
|
||||||
header : 'Name',
|
|
||||||
dataIndex : 'name',
|
|
||||||
width : 200,
|
|
||||||
editor : new Ext.form.TextField({
|
|
||||||
allowBlank : true
|
|
||||||
})
|
|
||||||
},
|
|
||||||
{
|
|
||||||
header : 'Network ID',
|
|
||||||
dataIndex : 'nid',
|
|
||||||
width : 100,
|
|
||||||
editor : new Ext.form.NumberField({
|
|
||||||
minValue : 0,
|
|
||||||
maxValue : 65536
|
|
||||||
})
|
|
||||||
},
|
|
||||||
{
|
|
||||||
header : 'Auto Discovery',
|
|
||||||
dataIndex : 'autodiscovery',
|
|
||||||
width : 50,
|
|
||||||
editor : new Ext.form.Checkbox({})
|
|
||||||
},
|
|
||||||
{
|
|
||||||
header : 'Auto Discovery',
|
|
||||||
dataIndex : 'skipinitscan',
|
|
||||||
width : 50,
|
|
||||||
editor : new Ext.form.Checkbox({})
|
|
||||||
},
|
|
||||||
{
|
|
||||||
header : '# Muxes',
|
|
||||||
dataIndex : 'num_mux',
|
|
||||||
width : 100,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
header : '# Services',
|
|
||||||
dataIndex : 'num_svc',
|
|
||||||
width : 100,
|
|
||||||
},
|
|
||||||
]
|
|
||||||
});
|
|
||||||
|
|
||||||
var store = new Ext.data.JsonStore({
|
|
||||||
root : 'entries',
|
|
||||||
url : 'api/mpegts/networks',
|
|
||||||
autoLoad : true,
|
|
||||||
id : 'uuid',
|
|
||||||
fields : [
|
|
||||||
'uuid', 'name', 'nid', 'autodiscovery', 'skipinitscan', 'num_mux', 'num_svc'
|
|
||||||
],
|
|
||||||
baseParams : {
|
|
||||||
op : 'list',
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
var grid = new Ext.grid.EditorGridPanel({
|
|
||||||
stripeRows : true,
|
|
||||||
title : 'Networks',
|
|
||||||
store : store,
|
|
||||||
cm : model,
|
|
||||||
viewConfig : {
|
|
||||||
forceFit : true
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
return grid;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* DVB Muxes
|
|
||||||
*/
|
|
||||||
|
|
||||||
tvheadend.muxes = function()
|
|
||||||
{
|
|
||||||
// TODO: build this from mpegts_network_class?
|
|
||||||
|
|
||||||
var model = new Ext.grid.ColumnModel({
|
|
||||||
defaultSortable: true,
|
|
||||||
columns : [
|
|
||||||
{
|
|
||||||
header : 'Enabled',
|
|
||||||
dataIndex : 'enabled',
|
|
||||||
width : 50,
|
|
||||||
editor : new Ext.form.Checkbox({})
|
|
||||||
},
|
|
||||||
{
|
|
||||||
header : 'Name',
|
|
||||||
dataIndex : 'name',
|
|
||||||
width : 100,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
header : 'ONID',
|
|
||||||
dataIndex : 'onid',
|
|
||||||
width : 50,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
header : 'TSID',
|
|
||||||
dataIndex : 'tsid',
|
|
||||||
width : 50,
|
|
||||||
editor : new Ext.form.Checkbox({})
|
|
||||||
},
|
|
||||||
{
|
|
||||||
header : 'CRID Authority',
|
|
||||||
dataIndex : 'crid_auth',
|
|
||||||
width : 100,
|
|
||||||
editor : new Ext.form.Checkbox({})
|
|
||||||
},
|
|
||||||
{
|
|
||||||
header : 'Initial Scan',
|
|
||||||
dataIndex : 'initscan',
|
|
||||||
width : 50,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
header : '# Services',
|
|
||||||
dataIndex : 'num_svc',
|
|
||||||
width : 50,
|
|
||||||
},
|
|
||||||
]
|
|
||||||
});
|
|
||||||
|
|
||||||
var store = new Ext.data.JsonStore({
|
|
||||||
root : 'entries',
|
|
||||||
url : 'api/mpegts/muxes',
|
|
||||||
autoLoad : true,
|
|
||||||
id : 'uuid',
|
|
||||||
fields : [
|
|
||||||
'uuid', 'network', 'name', 'onid', 'tsid', 'initscan', 'crid_auth', 'num_svc'
|
|
||||||
],
|
|
||||||
baseParams : {
|
|
||||||
op : 'list',
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
var grid = new Ext.grid.EditorGridPanel({
|
|
||||||
stripeRows : true,
|
|
||||||
title : 'Muxes',
|
|
||||||
store : store,
|
|
||||||
cm : model,
|
|
||||||
viewConfig : {
|
|
||||||
forceFit : true
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
return grid;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* DVB Services
|
|
||||||
*/
|
|
||||||
|
|
||||||
tvheadend.services = function()
|
|
||||||
{
|
|
||||||
// TODO: build this from mpegts_network_class?
|
|
||||||
|
|
||||||
var filter = new Ext.ux.grid.GridFilters({
|
|
||||||
encode : true,
|
|
||||||
local : false,
|
|
||||||
filters : [
|
|
||||||
{ type: 'string', dataIndex: 'name' },
|
|
||||||
{ type: 'numeric', dataIndex: 'sid' }
|
|
||||||
]
|
|
||||||
});
|
|
||||||
|
|
||||||
var model = new Ext.grid.ColumnModel({
|
|
||||||
defaultSortable: true,
|
|
||||||
columns : [
|
|
||||||
{
|
|
||||||
header : 'Enabled',
|
|
||||||
dataIndex : 'enabled',
|
|
||||||
width : 50,
|
|
||||||
editor : new Ext.form.Checkbox({})
|
|
||||||
},
|
|
||||||
{
|
|
||||||
header : 'Name',
|
|
||||||
dataIndex : 'name',
|
|
||||||
width : 100,
|
|
||||||
filterable : true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
header : 'Mux',
|
|
||||||
dataIndex : 'mux',
|
|
||||||
width : 100,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
header : 'SID',
|
|
||||||
dataIndex : 'sid',
|
|
||||||
width : 50,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
header : 'PMT PID',
|
|
||||||
dataIndex : 'pmt',
|
|
||||||
width : 50,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
header : 'Type',
|
|
||||||
dataIndex : 'type',
|
|
||||||
width : 50,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
header : 'Provider',
|
|
||||||
dataIndex : 'provider',
|
|
||||||
width : 100,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
header : 'CRID Authority',
|
|
||||||
dataIndex : 'crid_auth',
|
|
||||||
width : 100,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
header : 'Charset',
|
|
||||||
dataIndex : 'charset',
|
|
||||||
width : 100,
|
|
||||||
},
|
|
||||||
]
|
|
||||||
});
|
|
||||||
|
|
||||||
var store = new Ext.data.JsonStore({
|
|
||||||
root : 'entries',
|
|
||||||
url : 'api/mpegts/services',
|
|
||||||
autoLoad : true,
|
|
||||||
id : 'uuid',
|
|
||||||
totalProperty: 'total',
|
|
||||||
fields : [
|
|
||||||
'uuid', 'mux', 'name', 'sid', 'pmt', 'type', 'provider', 'crid_auth', 'charset'
|
|
||||||
],
|
|
||||||
baseParams : {
|
|
||||||
op : 'list',
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
var grid = new Ext.grid.EditorGridPanel({
|
|
||||||
stripeRows : true,
|
|
||||||
title : 'Services',
|
|
||||||
store : store,
|
|
||||||
cm : model,
|
|
||||||
plugins : [
|
|
||||||
filter
|
|
||||||
],
|
|
||||||
viewConfig : {
|
|
||||||
forceFit : true
|
|
||||||
},
|
|
||||||
bbar : new Ext.PagingToolbar({
|
|
||||||
store: store,
|
|
||||||
pageSize: 50,
|
|
||||||
displayInfo: true,
|
|
||||||
displayMsg: 'Services {0} - {1} of {2}',
|
|
||||||
emptyMsg: 'No services to display'
|
|
||||||
})
|
|
||||||
});
|
|
||||||
|
|
||||||
return grid;
|
|
||||||
}
|
|
|
@ -268,9 +268,6 @@ function accessUpdate(o) {
|
||||||
tabs2.push(new tvheadend.tvadapters);
|
tabs2.push(new tvheadend.tvadapters);
|
||||||
}
|
}
|
||||||
tabs2.push(new tvheadend.iptv);
|
tabs2.push(new tvheadend.iptv);
|
||||||
tabs2.push(new tvheadend.networks);
|
|
||||||
tabs2.push(new tvheadend.muxes);
|
|
||||||
tabs2.push(new tvheadend.services);
|
|
||||||
tvheadend.conf_dvbin = new Ext.TabPanel({
|
tvheadend.conf_dvbin = new Ext.TabPanel({
|
||||||
activeTab: 0,
|
activeTab: 0,
|
||||||
autoScroll: true,
|
autoScroll: true,
|
||||||
|
@ -278,6 +275,9 @@ function accessUpdate(o) {
|
||||||
iconCls: 'hardware',
|
iconCls: 'hardware',
|
||||||
items : tabs2
|
items : tabs2
|
||||||
});
|
});
|
||||||
|
tvheadend.networks(tvheadend.conf_dvbin);
|
||||||
|
tvheadend.muxes(tvheadend.conf_dvbin);
|
||||||
|
tvheadend.services(tvheadend.conf_dvbin);
|
||||||
tabs1.push(tvheadend.conf_dvbin);
|
tabs1.push(tvheadend.conf_dvbin);
|
||||||
|
|
||||||
/* Channel / EPG */
|
/* Channel / EPG */
|
||||||
|
|
Loading…
Add table
Reference in a new issue