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',