From f1ad2dc1e7aeec667655451804805805f7221587 Mon Sep 17 00:00:00 2001 From: "E.Smith" <31170571+azlm8t@users.noreply.github.com> Date: Sat, 23 Sep 2017 12:31:55 +0100 Subject: [PATCH] xmltv: Parse atsc style numbers. (#4615) Previously we only parsed numbers of the format "445" and forced the minor number to be zero. However atsc numbers have a major and a minor so we now parse "39.1" as major=39 minor=1. Issue: #4615 --- src/epggrab/module/xmltv.c | 48 +++++++++++++++++++++++++++++++++------------- 1 file changed, 35 insertions(+), 13 deletions(-) diff --git a/src/epggrab/module/xmltv.c b/src/epggrab/module/xmltv.c index 0c58f1f8e..522f9698b 100644 --- a/src/epggrab/module/xmltv.c +++ b/src/epggrab/module/xmltv.c @@ -661,21 +661,43 @@ static int _xmltv_parse_channel HTSMSG_FOREACH(f, tags) { if (!(subtag = htsmsg_field_get_map(f))) continue; if (strcmp(f->hmf_name, "display-name") == 0) { - int n = 0; - name = htsmsg_get_str(subtag, "cdata"); - if (chnum && name) { - while (isdigit(*(name + n))) n++; - if (n > 0) { - if (*(name + n) == 0 || (*(name + n) == ' ' && chnum == 1)) { - save |= epggrab_channel_set_number(ch, atoi(name), 0); - name += n; - while (*name == ' ') name++; - } - } + int major = 0; + int minor = 0; + const char *cur = name; + + /* Some xmltv providers supply a display-name that is the + * channel number. So attempt to grab it. + */ + + /* Check and grab major part of channel number */ + while (isdigit(*cur)) + major = (major * 10) + *cur++ - '0'; + + /* If a period then it's an atsc-style number of major.minor. + * So skip the period and parse the minor. + */ + if (major && *cur == '.') { + ++cur; + while (isdigit(*cur)) + minor = (minor * 10) + *cur++ - '0'; } - if (name && *name) - htsmsg_add_str_exclusive(dnames, name); + + /* If we have a channel number and then either end of string + * or (if chnum is 'first words') a space, then save the channel. + * The space is necessary to avoid channels such as "4Music" + * being treated as channel number 4. + * + * We assume channel number has to be >0. + */ + if (major && (!*cur || (*cur == ' ' && chnum == 1))) { + save |= epggrab_channel_set_number(ch, major, minor); + /* Skip extra spaces between channel number and actual name */ + while (*cur == ' ') ++cur; + } + + if (cur && *cur) + htsmsg_add_str_exclusive(dnames, cur); } else if (strcmp(f->hmf_name, "icon") == 0) { if ((attribs = htsmsg_get_map(subtag, "attrib")) != NULL && -- 2.11.0