diff --git a/src/dvb/dvb_multiplex.c b/src/dvb/dvb_multiplex.c index 9358443f..64ea7945 100644 --- a/src/dvb/dvb_multiplex.c +++ b/src/dvb/dvb_multiplex.c @@ -1177,8 +1177,8 @@ dvb_mux_copy(th_dvb_adapter_t *dst, th_dvb_mux_instance_t *tdmi_src, if(t_src->s_svcname != NULL) t_dst->s_svcname = strdup(t_src->s_svcname); - if(t_src->s_dvb_default_charset != NULL) - t_dst->s_dvb_default_charset = strdup(t_src->s_dvb_default_charset); + if(t_src->s_dvb_charset != NULL) + t_dst->s_dvb_charset = strdup(t_src->s_dvb_charset); if(t_src->s_ch != NULL) service_map_channel(t_dst, t_src->s_ch, 0); diff --git a/src/dvb/dvb_support.c b/src/dvb/dvb_support.c index e1066c0c..73b7c4b7 100644 --- a/src/dvb/dvb_support.c +++ b/src/dvb/dvb_support.c @@ -202,7 +202,7 @@ static inline size_t dvb_convert(int conv, */ int -dvb_get_string(char *dst, size_t dstlen, const uint8_t *src, size_t srclen, char *dvb_default_charset, dvb_string_conv_t *conv) +dvb_get_string(char *dst, size_t dstlen, const uint8_t *src, size_t srclen, char *dvb_charset, dvb_string_conv_t *conv) { int ic; size_t len, outlen; @@ -220,6 +220,7 @@ dvb_get_string(char *dst, size_t dstlen, const uint8_t *src, size_t srclen, char conv++; } + // automatic charset detection switch(src[0]) { case 0: return -1; @@ -250,16 +251,17 @@ dvb_get_string(char *dst, size_t dstlen, const uint8_t *src, size_t srclen, char return -1; default: - if (dvb_default_charset != NULL && sscanf(dvb_default_charset, "ISO8859-%d", &i) > 0) { - if (i > 0 && i < 16) { - ic = convert_iso_8859[i]; - } else { - ic = convert_iso6937; - } + ic = convert_iso6937; + break; + } + + // manual charset override + if (dvb_charset != NULL && dvb_charset[0] != 0) { + if (sscanf(dvb_charset, "ISO8859-%d", &i) > 0 && i > 0 && i < 16) { + ic = convert_iso_8859[i]; } else { ic = convert_iso6937; } - break; } if(srclen < 1) { @@ -284,7 +286,7 @@ dvb_get_string(char *dst, size_t dstlen, const uint8_t *src, size_t srclen, char int dvb_get_string_with_len(char *dst, size_t dstlen, - const uint8_t *buf, size_t buflen, char *dvb_default_charset, + const uint8_t *buf, size_t buflen, char *dvb_charset, dvb_string_conv_t *conv) { int l = buf[0]; @@ -292,7 +294,7 @@ dvb_get_string_with_len(char *dst, size_t dstlen, if(l + 1 > buflen) return -1; - if(dvb_get_string(dst, dstlen, buf + 1, l, dvb_default_charset, conv)) + if(dvb_get_string(dst, dstlen, buf + 1, l, dvb_charset, conv)) return -1; return l + 1; diff --git a/src/dvb/dvb_support.h b/src/dvb/dvb_support.h index f138f388..f4726cda 100644 --- a/src/dvb/dvb_support.h +++ b/src/dvb/dvb_support.h @@ -62,11 +62,11 @@ typedef struct dvb_string_conv } dvb_string_conv_t; int dvb_get_string(char *dst, size_t dstlen, const uint8_t *src, - const size_t srclen, char *dvb_default_charset, + const size_t srclen, char *dvb_charset, dvb_string_conv_t *conv); int dvb_get_string_with_len(char *dst, size_t dstlen, - const uint8_t *buf, size_t buflen, char *dvb_default_charset, + const uint8_t *buf, size_t buflen, char *dvb_charset, dvb_string_conv_t *conv); #define bcdtoint(i) ((((i & 0xf0) >> 4) * 10) + (i & 0x0f)) diff --git a/src/dvb/dvb_transport.c b/src/dvb/dvb_transport.c index 6499d3cd..cf27b231 100644 --- a/src/dvb/dvb_transport.c +++ b/src/dvb/dvb_transport.c @@ -237,8 +237,8 @@ dvb_transport_load(th_dvb_mux_instance_t *tdmi) psi_load_service_settings(c, t); pthread_mutex_unlock(&t->s_stream_mutex); - s = htsmsg_get_str(c, "dvb_default_charset"); - t->s_dvb_default_charset = s ? strdup(s) : NULL; + s = htsmsg_get_str(c, "dvb_charset"); + t->s_dvb_charset = s ? strdup(s) : NULL; s = htsmsg_get_str(c, "default_authority"); t->s_default_authority = s ? strdup(s) : NULL; @@ -284,8 +284,8 @@ dvb_transport_save(service_t *t) htsmsg_add_u32(m, "mapped", 1); } - if(t->s_dvb_default_charset != NULL) - htsmsg_add_str(m, "dvb_default_charset", t->s_dvb_default_charset); + if(t->s_dvb_charset != NULL) + htsmsg_add_str(m, "dvb_charset", t->s_dvb_charset); htsmsg_add_u32(m, "dvb_eit_enable", t->s_dvb_eit_enable); @@ -459,8 +459,8 @@ dvb_transport_build_msg(service_t *t) if(t->s_ch != NULL) htsmsg_add_str(m, "channelname", t->s_ch->ch_name); - if(t->s_dvb_default_charset != NULL) - htsmsg_add_str(m, "dvb_default_charset", t->s_dvb_default_charset); + if(t->s_dvb_charset != NULL) + htsmsg_add_str(m, "dvb_charset", t->s_dvb_charset); htsmsg_add_u32(m, "dvb_eit_enable", t->s_dvb_eit_enable); diff --git a/src/epggrab/module/eit.c b/src/epggrab/module/eit.c index 12b52b0c..792b9671 100644 --- a/src/epggrab/module/eit.c +++ b/src/epggrab/module/eit.c @@ -534,7 +534,7 @@ static int _eit_process_event /* Process tags */ memset(&ev, 0, sizeof(ev)); - ev.default_charset = svc->s_dvb_default_charset; + ev.default_charset = svc->s_dvb_charset; while (dllen > 2) { int r; dtag = ptr[0]; diff --git a/src/service.c b/src/service.c index 52936d66..f9224eb8 100644 --- a/src/service.c +++ b/src/service.c @@ -485,7 +485,7 @@ service_destroy(service_t *t) free(t->s_identifier); free(t->s_svcname); free(t->s_provider); - free(t->s_dvb_default_charset); + free(t->s_dvb_charset); while((st = TAILQ_FIRST(&t->s_components)) != NULL) { TAILQ_REMOVE(&t->s_components, st, es_link); @@ -524,7 +524,7 @@ service_create(const char *identifier, int type, int source_type) t->s_refcount = 1; t->s_enabled = 1; t->s_pcr_last = PTS_UNSET; - t->s_dvb_default_charset = NULL; + t->s_dvb_charset = NULL; t->s_dvb_eit_enable = 1; TAILQ_INIT(&t->s_components); @@ -702,15 +702,15 @@ service_map_channel(service_t *t, channel_t *ch, int save) * */ void -service_set_dvb_default_charset(service_t *t, const char *dvb_default_charset) +service_set_dvb_charset(service_t *t, const char *dvb_charset) { lock_assert(&global_lock); - if(t->s_dvb_default_charset != NULL && !strcmp(t->s_dvb_default_charset, dvb_default_charset)) + if(t->s_dvb_charset != NULL && !strcmp(t->s_dvb_charset, dvb_charset)) return; - free(t->s_dvb_default_charset); - t->s_dvb_default_charset = strdup(dvb_default_charset); + free(t->s_dvb_charset); + t->s_dvb_charset = strdup(dvb_charset); t->s_config_save(t); } diff --git a/src/service.h b/src/service.h index 81af6208..692157d7 100644 --- a/src/service.h +++ b/src/service.h @@ -492,7 +492,7 @@ typedef struct service { * DVB default charset * used to overide the default ISO6937 per service */ - char *s_dvb_default_charset; + char *s_dvb_charset; /** * Set if EIT grab is enabled for DVB service (the default). @@ -584,7 +584,7 @@ int tss2errcode(int tss); uint16_t service_get_encryption(service_t *t); -void service_set_dvb_default_charset(service_t *t, const char *dvb_default_charset); +void service_set_dvb_charset(service_t *t, const char *dvb_charset); void service_set_dvb_eit_enable(service_t *t, int dvb_eit_enable); diff --git a/src/webui/extjs.c b/src/webui/extjs.c index 2832c155..cf318fc5 100644 --- a/src/webui/extjs.c +++ b/src/webui/extjs.c @@ -1415,7 +1415,7 @@ service_update(htsmsg_t *in) uint32_t u32; const char *id; const char *chname; - const char *dvb_default_charset; + const char *dvb_charset; TAILQ_FOREACH(f, &in->hm_fields, hmf_link) { if((c = htsmsg_get_map_by_field(f)) == NULL || @@ -1431,8 +1431,8 @@ service_update(htsmsg_t *in) if((chname = htsmsg_get_str(c, "channelname")) != NULL) service_map_channel(t, channel_find_by_name(chname, 1, 0), 1); - if((dvb_default_charset = htsmsg_get_str(c, "dvb_default_charset")) != NULL) - service_set_dvb_default_charset(t, dvb_default_charset); + if((dvb_charset = htsmsg_get_str(c, "dvb_charset")) != NULL) + service_set_dvb_charset(t, dvb_charset); if(!htsmsg_get_u32(c, "dvb_eit_enable", &u32)) service_set_dvb_eit_enable(t, u32); @@ -1517,8 +1517,8 @@ extjs_servicedetails(http_connection_t *hc, htsmsg_add_msg(out, "streams", streams); - if(t->s_dvb_default_charset != NULL) - htsmsg_add_str(out, "dvb_default_charset", t->s_dvb_default_charset); + if(t->s_dvb_charset != NULL) + htsmsg_add_str(out, "dvb_charset", t->s_dvb_charset); htsmsg_add_u32(out, "dvb_eit_enable", t->s_dvb_eit_enable); @@ -1749,7 +1749,7 @@ extjs_service_update(htsmsg_t *in) uint32_t u32; const char *id; const char *chname; - const char *dvb_default_charset; + const char *dvb_charset; TAILQ_FOREACH(f, &in->hm_fields, hmf_link) { if((c = htsmsg_get_map_by_field(f)) == NULL || @@ -1765,8 +1765,8 @@ extjs_service_update(htsmsg_t *in) if((chname = htsmsg_get_str(c, "channelname")) != NULL) service_map_channel(t, channel_find_by_name(chname, 1, 0), 1); - if((dvb_default_charset = htsmsg_get_str(c, "dvb_default_charset")) != NULL) - service_set_dvb_default_charset(t, dvb_default_charset); + if((dvb_charset = htsmsg_get_str(c, "dvb_charset")) != NULL) + service_set_dvb_charset(t, dvb_charset); if(!htsmsg_get_u32(c, "dvb_eit_enable", &u32)) service_set_dvb_eit_enable(t, u32); diff --git a/src/webui/static/app/dvb.js b/src/webui/static/app/dvb.js index a483753b..d1806e67 100644 --- a/src/webui/static/app/dvb.js +++ b/src/webui/static/app/dvb.js @@ -444,18 +444,18 @@ tvheadend.dvb_services = function(adapterId) { }) }, { - header : "DVB default charset", - dataIndex : 'dvb_default_charset', + header : "DVB charset", + dataIndex : 'dvb_charset', width : 200, renderer : function(value, metadata, record, row, col, store) { return value ? value - : 'ISO6937'; + : 'auto'; }, editor : new fm.ComboBox({ mode : 'local', store : new Ext.data.SimpleStore({ fields : [ 'key', 'value' ], - data : [ [ 'ISO6937', 'default' ], [ 'ISO6937', 'ISO6937' ], + data : [ [ null, 'auto' ], [ 'ISO6937', 'ISO6937' ], [ 'ISO8859-1', 'ISO8859-1' ], [ 'ISO8859-2', 'ISO8859-2' ], [ 'ISO8859-3', 'ISO8859-3' ], [ 'ISO8859-4', 'ISO8859-4' ], [ 'ISO8859-5', 'ISO8859-5' ], [ 'ISO8859-6', 'ISO8859-6' ], @@ -510,7 +510,7 @@ tvheadend.dvb_services = function(adapterId) { root : 'entries', fields : Ext.data.Record.create([ 'id', 'enabled', 'type', 'sid', 'pmt', 'pcr', 'svcname', 'network', 'provider', 'mux', 'channelname', - 'dvb_default_charset', 'dvb_eit_enable' ]), + 'dvb_charset', 'dvb_eit_enable' ]), url : "dvb/services/" + adapterId, autoLoad : true, id : 'id',