diff --git a/src/channels.c b/src/channels.c
index 1d7e3341..dac123b8 100644
--- a/src/channels.c
+++ b/src/channels.c
@@ -42,6 +42,7 @@
#include "imagecache.h"
#include "service_mapper.h"
#include "htsbuf.h"
+#include "intlconv.h"
struct channel_tree channels;
@@ -292,6 +293,7 @@ const idclass_t channel_class = {
.name = "Name",
.off = offsetof(channel_t, ch_name),
.get = channel_class_get_name,
+ .notify = channel_class_icon_notify, /* try to re-render default icon path */
},
{
.type = PT_S64,
@@ -537,10 +539,47 @@ channel_get_icon ( channel_t *ch )
{
static char buf[512], buf2[512];
channel_service_mapping_t *csm;
- const char *picon = config_get_picon_path(),
- *icon = ch->ch_icon;
+ const char *chicon = config_get_chicon_path(),
+ *picon = config_get_picon_path(),
+ *icon = ch->ch_icon,
+ *chname;
uint32_t id;
+ if (icon && *icon == '\0')
+ icon = NULL;
+
+ /* No user icon - try to get the channel icon by name */
+ if (!icon && chicon && chicon[0] >= ' ' && chicon[0] <= 122 &&
+ (chname = channel_get_name(ch)) != NULL && chname[0]) {
+ const char *send, *sname, *s;
+ chicon = strdup(chicon);
+ send = strstr(chicon, "%C");
+ if (send == NULL) {
+ buf[0] = '\0';
+ sname = "";
+ } else {
+ *(char *)send = '\0';
+ send += 2;
+ sname = intlconv_utf8safestr(intlconv_charset_id("ASCII", 1, 1),
+ chname, strlen(chname) * 2);
+ /* Remove problematic characters */
+ s = sname;
+ while (*s) {
+ if (*s <= ' ' || *s > 122 ||
+ strchr("/:\\<>|*?'\"", *s) != NULL)
+ *(char *)s = '_';
+ s++;
+ }
+ }
+ snprintf(buf, sizeof(buf), "%s%s%s", chicon, sname, send);
+ if (send)
+ free((char *)sname);
+ free((char *)chicon);
+
+ icon = ch->ch_icon = strdup(buf);
+ channel_save(ch);
+ }
+
/* No user icon - try access from services */
if (!icon && picon) {
LIST_FOREACH(csm, &ch->ch_services, csm_chn_link) {
diff --git a/src/config.c b/src/config.c
index 735563ff..7f04a545 100644
--- a/src/config.c
+++ b/src/config.c
@@ -1400,6 +1400,16 @@ int config_set_muxconfpath ( const char *path )
return _config_set_str("muxconfpath", path);
}
+const char *config_get_chicon_path ( void )
+{
+ return htsmsg_get_str(config, "chiconpath");
+}
+
+int config_set_chicon_path ( const char *str )
+{
+ return _config_set_str("chiconpath", str);
+}
+
const char *config_get_picon_path ( void )
{
return htsmsg_get_str(config, "piconpath");
diff --git a/src/config.h b/src/config.h
index 76f054e4..303199ae 100644
--- a/src/config.h
+++ b/src/config.h
@@ -37,6 +37,10 @@ const char *config_get_language ( void );
int config_set_language ( const char *str )
__attribute__((warn_unused_result));
+const char *config_get_chicon_path ( void );
+int config_set_chicon_path ( const char *str )
+ __attribute__((warn_unused_result));
+
const char *config_get_picon_path ( void );
int config_set_picon_path ( const char *str )
__attribute__((warn_unused_result));
diff --git a/src/imagecache.c b/src/imagecache.c
index f1589c77..9713a317 100644
--- a/src/imagecache.c
+++ b/src/imagecache.c
@@ -433,7 +433,7 @@ imagecache_get_id ( const char *url )
lock_assert(&global_lock);
/* Invalid */
- if (!url || url[0] == '\0')
+ if (!url || url[0] == '\0' || !strstr(url, "://"))
return 0;
/* Disabled */
diff --git a/src/webui/extjs.c b/src/webui/extjs.c
index 9172368a..0a27493d 100755
--- a/src/webui/extjs.c
+++ b/src/webui/extjs.c
@@ -505,6 +505,8 @@ extjs_config(http_connection_t *hc, const char *remain, void *opaque)
save |= config_set_muxconfpath(str);
if ((str = http_arg_get(&hc->hc_req_args, "language")))
save |= config_set_language(str);
+ if ((str = http_arg_get(&hc->hc_req_args, "chiconpath")))
+ save |= config_set_chicon_path(str);
if ((str = http_arg_get(&hc->hc_req_args, "piconpath")))
save |= config_set_picon_path(str);
if (save)
diff --git a/src/webui/static/app/config.js b/src/webui/static/app/config.js
index 166dbd3f..aa780bcb 100644
--- a/src/webui/static/app/config.js
+++ b/src/webui/static/app/config.js
@@ -44,6 +44,7 @@ tvheadend.miscconf = function(panel, index) {
'muxconfpath', 'language',
'tvhtime_update_enabled', 'tvhtime_ntp_enabled',
'tvhtime_tolerance',
+ 'chiconpath',
'piconpath'
]);
@@ -131,9 +132,15 @@ tvheadend.miscconf = function(panel, index) {
* Picons
*/
+ var chiconPath = new Ext.form.TextField({
+ name: 'chiconpath',
+ fieldLabel: 'Channel icon path
(e.g. file:///tmp/icons/%C.png or http://...)',
+ width: 400
+ });
+
var piconPath = new Ext.form.TextField({
name: 'piconpath',
- fieldLabel: 'Picon path (e.g. file:///tmp/picons)',
+ fieldLabel: 'Picon path
(e.g. file:///tmp/picons or http://...)',
width: 400
});
@@ -143,7 +150,7 @@ tvheadend.miscconf = function(panel, index) {
autoHeight: true,
collapsible: true,
animCollapse: true,
- items: [piconPath]
+ items: [chiconPath, piconPath]
});
/*