]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
channels: icons - implement 'service name picons' scheme, fixes #3525
authorJaroslav Kysela <perex@perex.cz>
Mon, 25 Jan 2016 16:54:54 +0000 (17:54 +0100)
committerJaroslav Kysela <perex@perex.cz>
Mon, 25 Jan 2016 16:54:54 +0000 (17:54 +0100)
src/channels.c
src/config.c
src/config.h
src/tvheadend.h

index 1508482b51c65a5b3d1dbf725e80fc9a395a1d56..a361737faab6d0ddc779d0fa69854faf7f4b61d3 100644 (file)
@@ -657,6 +657,41 @@ channel_set_number ( channel_t *ch, uint32_t major, uint32_t minor )
   return save;
 }
 
+static char *
+svcnamepicons(const char *svcname)
+{
+  const char *s;
+  char *r, *d;
+  int count;
+  char c;
+
+  for (s = svcname, count = 0; *s; s++) {
+    c = *s;
+    if (c == '&' || c == '+' || c == '*')
+      count++;
+  }
+  r = d = malloc(count * 4 + (s - svcname) + 1);
+  for (s = svcname; *s; s++) {
+    c = *s;
+    if (c == '&') {
+      d[0] = 'a'; d[1] = 'n'; d[2] = 'd'; d += 3;
+    } else if (c == '*') {
+      d[0] = 'p'; d[1] = 'l'; d[2] = 'u'; d[3] = 's'; d += 4;
+    } else if (c == '*') {
+      d[0] = 's'; d[1] = 't'; d[2] = 'a'; d[3] = 'r'; d += 4;
+    } else {
+      if (c >= 'a' && c <= 'z')
+        *d++ = c;
+      else if (c >= 'A' && c <= 'Z')
+        *d++ = c - 'A' + 'a';
+      else if (c >= '0' && c <= '9')
+        *d++ = c;
+    }
+  }
+  *d = '\0';
+  return r;
+}
+
 static int
 check_file( const char *url )
 {
@@ -675,6 +710,7 @@ channel_get_icon ( channel_t *ch )
              *icon   = ch->ch_icon,
              *chname, *icn;
   uint32_t id, i, pick, prefer = config.prefer_picon ? 1 : 0;
+  char c;
 
   if (icon && *icon == '\0')
     icon = NULL;
@@ -713,38 +749,54 @@ channel_get_icon ( channel_t *ch )
 
       /* Check for and replace placeholders */
       if ((send = strstr(chi, "%C"))) {
+
         sname = intlconv_utf8safestr(intlconv_charset_id("ASCII", 1, 1),
                                      chname, strlen(chname) * 2);
         if (sname == NULL)
           sname = strdup(chname);
 
         /* Remove problematic characters */
-        s = sname;
-        while (s && *s) {
-          if (*s <= ' ' || *s > 122 ||
-              strchr("/:\\<>|*?'\"", *s) != NULL)
-            *(char *)s = '_';
-          else if (config.chicon_lowercase && *s >= 'A' && *s <= 'Z')
-            *(char *)s = *s - 'A' + 'a';
-          s++;
+        if (config.chicon_scheme == CHICON_SVCNAME) {
+          s = svcnamepicons(sname);
+          free((char *)sname);
+          sname = s;
+        } else {
+          s = sname;
+          while (s && *s) {
+            c = *s;
+            if (c <= ' ' || c > 122 ||
+                strchr("/:\\<>|*?'\"", c) != NULL)
+              *(char *)s = '_';
+            else if (config.chicon_scheme == CHICON_LOWERCASE && c >= 'A' && c <= 'Z')
+              *(char *)s = c - 'A' + 'a';
+            s++;
+          }
         }
-      }
-      else if((send = strstr(chi, "%c"))) {
+
+      } else if((send = strstr(chi, "%c"))) {
+
         char *aname = intlconv_utf8safestr(intlconv_charset_id("ASCII", 1, 1),
                                      chname, strlen(chname) * 2);
 
         if (aname == NULL)
           aname = strdup(chname);
 
-        if (config.chicon_lowercase)
-          for (s = aname; *s; s++)
-            if (*s >= 'A' && *s <= 'Z')
-              *(char *)s = *s - 'A' + 'a';
+        if (config.chicon_scheme == CHICON_LOWERCASE) {
+          for (s = aname; *s; s++) {
+            c = *s;
+            if (c >= 'A' && c <= 'Z')
+              *(char *)s = c - 'A' + 'a';
+          }
+        } else if (config.chicon_scheme == CHICON_SVCNAME) {
+          s = svcnamepicons(aname);
+          free((char *)aname);
+          aname = (char *)s;
+        }
 
         sname = url_encode(aname);
         free((char *)aname);
-      }
-      else {
+
+      else {
         buf[0] = '\0';
         sname = "";
       }
index 223d5b92513561b26824048833db9343ddd964f7..53fe535c83a666e093226755268d82e321d4b98a 100644 (file)
@@ -1911,6 +1911,17 @@ config_class_uilevel ( void *o, const char *lang )
   return strtab2htsmsg(tab, 1, lang);
 }
 
+static htsmsg_t *
+config_class_chiconscheme_list ( void *o, const char *lang )
+{
+  static const struct strtab tab[] = {
+    { N_("No scheme"),           CHICON_NONE },
+    { N_("All lower-case"),      CHICON_LOWERCASE },
+    { N_("Service name picons"), CHICON_SVCNAME },
+  };
+  return strtab2htsmsg(tab, 1, lang);
+}
+
 const idclass_t config_class = {
   .ic_snode      = &config.idnode,
   .ic_class      = "config",
@@ -2163,11 +2174,13 @@ const idclass_t config_class = {
       .group  = 6,
     },
     {
-      .type   = PT_BOOL,
-      .id     = "chiconlowercase",
-      .name   = N_("Channel icon name lower-case"),
-      .desc   = N_("Use icons with lower-case filenames only."),
-      .off    = offsetof(config_t, chicon_lowercase),
+      .type   = PT_INT,
+      .id     = "chiconscheme",
+      .name   = N_("Channel icon name scheme"),
+      .desc   = N_("Select scheme to generathe the channel icon names "
+                   "(all lower-case, service name picons etc.)."),
+      .list   = config_class_chiconscheme_list,
+      .off    = offsetof(config_t, chicon_scheme),
       .opts   = PO_ADVANCED,
       .group  = 6,
     },
index b31b1ac8f94c11003a417b5799ea34d12c2f3354..e5d34e857c3cc1e5afa3a0b718ca6034d35b52e6 100644 (file)
@@ -42,7 +42,7 @@ typedef struct config {
   char *muxconf_path;
   int prefer_picon;
   char *chicon_path;
-  int chicon_lowercase;
+  int chicon_scheme;
   char *picon_path;
   int tvhtime_update_enabled;
   int tvhtime_ntp_enabled;
index 85ee7694da0bd1eeeb999bf21e4e047b21d6d24f..608fd799519e2ee07be4a6702da836eea247d27e 100644 (file)
@@ -131,6 +131,13 @@ typedef enum {
 #define UILEVEL_ADVANCED 1
 #define UILEVEL_EXPERT   2
 
+/*
+ *
+ */
+#define CHICON_NONE      0
+#define CHICON_LOWERCASE 1
+#define CHICON_SVCNAME   2
+
 /*
  * global timer
  */