* EPG Grab Channel functions
* *************************************************************************/
-/* Check if channels match */
-int epggrab_channel_match ( epggrab_channel_t *ec, channel_t *ch )
+static inline int
+is_paired( epggrab_channel_t *ec )
{
- const char *chid, *s;
- htsmsg_field_t *f;
+ return !ec->only_one || !LIST_FIRST(&ec->channels);
+}
- if (!ec || !ch || !ch->ch_epgauto || !ch->ch_enabled || ch->ch_epg_parent ||
- !ec->enabled) return 0;
- if (ec->only_one && LIST_FIRST(&ec->channels)) return 0; // ignore already paired
+static inline int
+epggrab_channel_check ( epggrab_channel_t *ec, channel_t *ch )
+{
+ if (!ec || !ch || !ch->ch_epgauto || !ch->ch_enabled)
+ return 0;
+ if (ch->ch_epg_parent || !ec->enabled)
+ return 0;
+ if (is_paired(ec))
+ return 0; // ignore already paired
+ return 1;
+}
+/* Check if channels match by epgid */
+int epggrab_channel_match_epgid ( epggrab_channel_t *ec, channel_t *ch )
+{
+ const char *chid;
+
+ if (ec->id == NULL)
+ return 0;
+ if (!epggrab_channel_check(ec, ch))
+ return 0;
chid = channel_get_epgid(ch);
- if (ec->name && !strcmp(ec->name, chid)) return 1;
+ if (chid && !strcmp(ec->id, chid))
+ return 1;
+ return 0;
+}
+
+/* Check if channels match by name */
+int epggrab_channel_match_name ( epggrab_channel_t *ec, channel_t *ch )
+{
+ const char *name, *s;
+ htsmsg_field_t *f;
+
+ if (!epggrab_channel_check(ec, ch))
+ return 0;
+
+ name = channel_get_name(ch);
+ if (name == NULL)
+ return 0;
+
+ if (ec->name && !strcmp(ec->name, name))
+ return 1;
+
if (ec->names)
HTSMSG_FOREACH(f, ec->names)
if ((s = htsmsg_field_get_str(f)) != NULL)
- if (!strcmp(s, chid)) return 1;
+ if (!strcmp(s, name))
+ return 1;
+
+ return 0;
+}
+
+/* Check if channels match by number */
+int epggrab_channel_match_number ( epggrab_channel_t *ec, channel_t *ch )
+{
+ if (ec->lcn == 0)
+ return 0;
+
+ if (!epggrab_channel_check(ec, ch))
+ return 0;
+
if (ec->lcn && ec->lcn == channel_get_number(ch)) return 1;
return 0;
}
+
/* Destroy */
void
epggrab_channel_link_delete
return epggrab_channel_link((epggrab_channel_t *)ec, (channel_t *)ch, origin);
}
-/* Match and link (basically combines two funcs above for ease) */
-int epggrab_channel_match_and_link ( epggrab_channel_t *ec, channel_t *ch )
-{
- int r = epggrab_channel_match(ec, ch);
- if (r)
- epggrab_channel_link(ec, ch, NULL);
- return r;
-}
-
/* Set name */
int epggrab_channel_set_name ( epggrab_channel_t *ec, const char *name )
{
return save;
}
+/* Autolink EPG channel to channel */
+static int
+epggrab_channel_autolink_one( epggrab_channel_t *ec, channel_t *ch )
+{
+ if (epggrab_channel_match_epgid(ec, ch))
+ return epggrab_channel_link(ec, ch, NULL);
+ else if (epggrab_channel_match_name(ec, ch))
+ return epggrab_channel_link(ec, ch, NULL);
+ else if (epggrab_channel_match_number(ec, ch))
+ return epggrab_channel_link(ec, ch, NULL);
+ return 0;
+}
+
+/* Autolink EPG channel to channel */
+static int
+epggrab_channel_autolink( epggrab_channel_t *ec )
+{
+ channel_t *ch;
+
+ CHANNEL_FOREACH(ch)
+ if (epggrab_channel_match_epgid(ec, ch))
+ if (epggrab_channel_link(ec, ch, NULL))
+ return 1;
+ CHANNEL_FOREACH(ch)
+ if (epggrab_channel_match_name(ec, ch))
+ if (epggrab_channel_link(ec, ch, NULL))
+ return 1;
+ CHANNEL_FOREACH(ch)
+ if (epggrab_channel_match_number(ec, ch))
+ if (epggrab_channel_link(ec, ch, NULL))
+ return 1;
+ return 0;
+}
+
/* Channel settings updated */
void epggrab_channel_updated ( epggrab_channel_t *ec )
{
- channel_t *ch;
if (!ec) return;
/* Find a link */
- if (!ec->only_one || !LIST_FIRST(&ec->channels))
- CHANNEL_FOREACH(ch)
- if (epggrab_channel_match_and_link(ec, ch)) break;
+ if (!is_paired(ec))
+ epggrab_channel_autolink(ec);
/* Save */
epggrab_channel_save(ec);
void epggrab_channel_add ( channel_t *ch )
{
epggrab_module_t *mod;
- epggrab_channel_t *egc;
+ epggrab_channel_t *ec;
LIST_FOREACH(mod, &epggrab_modules, link)
- RB_FOREACH(egc, &mod->channels, link)
- if (epggrab_channel_match_and_link(egc, ch))
- break;
+ RB_FOREACH(ec, &mod->channels, link) {
+ if (!is_paired(ec))
+ if (epggrab_channel_autolink_one(ec, ch))
+ break;
+ }
}
void epggrab_channel_rem ( channel_t *ch )