diff --git a/src/iptv_input.c b/src/iptv_input.c index 0bfc3112..218d6db0 100644 --- a/src/iptv_input.c +++ b/src/iptv_input.c @@ -414,6 +414,9 @@ iptv_service_save(service_t *t) htsmsg_add_u32(m, "pmt", t->s_pmt_pid); + if(t->s_servicetype) + htsmsg_add_u32(m, "stype", t->s_servicetype); + if(t->s_iptv_port) htsmsg_add_u32(m, "port", t->s_iptv_port); @@ -591,6 +594,9 @@ iptv_service_load(void) if(!htsmsg_get_u32(c, "port", &u32)) t->s_iptv_port = u32; + if(!htsmsg_get_u32(c, "stype", &u32)) + t->s_servicetype = u32; + pthread_mutex_lock(&t->s_stream_mutex); service_make_nicename(t); psi_load_service_settings(c, t); diff --git a/src/service.c b/src/service.c index 1904530e..562d4ac8 100644 --- a/src/service.c +++ b/src/service.c @@ -1153,3 +1153,20 @@ service_is_primary_epg(service_t *svc) } return !ret ? 0 : (ret->s_dvb_service_id == svc->s_dvb_service_id); } + +/* + * list of known service types + */ +htsmsg_t *servicetype_list ( void ) +{ + htsmsg_t *ret, *e; + int i; + ret = htsmsg_create_list(); + for (i = 0; i < sizeof(stypetab) / sizeof(stypetab[0]); i++ ) { + e = htsmsg_create_map(); + htsmsg_add_u32(e, "val", stypetab[i].val); + htsmsg_add_str(e, "str", stypetab[i].str); + htsmsg_add_msg(ret, NULL, e); + } + return ret; +} diff --git a/src/service.h b/src/service.h index 9d2931b9..d2c1e313 100644 --- a/src/service.h +++ b/src/service.h @@ -578,4 +578,6 @@ void service_set_dvb_eit_enable(service_t *t, int dvb_eit_enable); int service_is_primary_epg (service_t *t); +htsmsg_t *servicetype_list (void); + #endif // SERVICE_H__ diff --git a/src/webui/extjs.c b/src/webui/extjs.c index 3bb5fde1..68cb14b6 100644 --- a/src/webui/extjs.c +++ b/src/webui/extjs.c @@ -1502,6 +1502,11 @@ service_update_iptv(htsmsg_t *in) save = 1; } + if (!htsmsg_get_u32(c, "stype", &u32)) { + t->s_servicetype = u32; + save = 1; + } + if((s = htsmsg_get_str(c, "group")) != NULL) { if(!inet_pton(AF_INET, s, &t->s_iptv_group.s_addr)){ inet_pton(AF_INET6, s, &t->s_iptv_group6.s6_addr); @@ -1542,6 +1547,7 @@ build_record_iptv(service_t *t) } htsmsg_add_u32(r, "port", t->s_iptv_port); + htsmsg_add_u32(r, "stype", t->s_servicetype); htsmsg_add_u32(r, "enabled", t->s_enabled); return r; } @@ -1613,6 +1619,11 @@ extjs_iptvservices(http_connection_t *hc, const char *remain, void *opaque) out = htsmsg_create_map(); + } else if (!strcmp(op, "servicetypeList")) { + out = htsmsg_create_map(); + array = servicetype_list(); + htsmsg_add_msg(out, "entries", array); + } else { pthread_mutex_unlock(&global_lock); htsmsg_destroy(in); diff --git a/src/webui/static/app/iptv.js b/src/webui/static/app/iptv.js index acdbfc0f..397df19a 100644 --- a/src/webui/static/app/iptv.js +++ b/src/webui/static/app/iptv.js @@ -1,3 +1,12 @@ +tvheadend.servicetypeStore = new Ext.data.JsonStore({ + root : 'entries', + id : 'val', + url : '/iptv/services', + baseParams : { op : 'servicetypeList' }, + fields : [ 'val', 'str' ], + autoLoad : true, +}); + /** * IPTV service grid */ @@ -88,7 +97,27 @@ tvheadend.iptv = function(adapterId) { width: 50, hidden: true }, - { + { + header : 'Service Type', + width : 100, + dataIndex : 'stype', + hidden : true, + editor : new fm.ComboBox({ + valueField : 'val', + displayField : 'str', + forceSelection : false, + editable : false, + mode : 'local', + triggerAction : 'all', + store : tvheadend.servicetypeStore, + }), + renderer: function(value, metadata, record, row, col, store) { + var val = value ? tvheadend.servicetypeStore.getById(value) : null; + return val ? val.get('str') : + 'Unset'; + }, + }, + { header: "PMT PID", dataIndex: 'pmt', width: 50, @@ -106,7 +135,7 @@ tvheadend.iptv = function(adapterId) { var rec = Ext.data.Record.create([ 'id', 'enabled', 'channelname', 'interface', 'group', 'port', - 'sid', 'pmt', 'pcr' + 'sid', 'pmt', 'pcr', 'stype' ]); var store = new Ext.data.JsonStore({