Tvheadend's DVB service probe will now let the channel join tags based on the service type and DVB provider name.
This commit is contained in:
parent
4673252346
commit
d73ff68fae
8 changed files with 87 additions and 29 deletions
5
debian/changelog
vendored
5
debian/changelog
vendored
|
@ -1,3 +1,8 @@
|
|||
hts-tvheadend (2.6) hts; urgency=low
|
||||
|
||||
* Tvheadend's DVB service probe will now let the channel join tags based
|
||||
on the service type and DVB provider name.
|
||||
|
||||
hts-tvheadend (2.5) hts; urgency=low
|
||||
|
||||
* If a previosly detected DVB adapter was not present during startup,
|
||||
|
|
|
@ -46,8 +46,8 @@ struct channel_list channels_not_xmltv_mapped;
|
|||
struct channel_tree channel_name_tree;
|
||||
static struct channel_tree channel_identifier_tree;
|
||||
struct channel_tag_queue channel_tags;
|
||||
static dtable_t *channeltags_dtable;
|
||||
|
||||
static void channel_tag_map(channel_t *ch, channel_tag_t *ct, int check);
|
||||
static channel_tag_t *channel_tag_find(const char *id, int create);
|
||||
static void channel_tag_mapping_destroy(channel_tag_mapping_t *ctm,
|
||||
int flags);
|
||||
|
@ -307,7 +307,7 @@ channels_load(void)
|
|||
/**
|
||||
* Write out a config file for a channel
|
||||
*/
|
||||
static void
|
||||
void
|
||||
channel_save(channel_t *ch)
|
||||
{
|
||||
htsmsg_t *m = htsmsg_create_map();
|
||||
|
@ -477,6 +477,7 @@ channel_set_xmltv_source(channel_t *ch, xmltv_channel_t *xc)
|
|||
channel_save(ch);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
|
@ -541,7 +542,7 @@ channel_set_tags_from_list(channel_t *ch, const char *maplist)
|
|||
/**
|
||||
*
|
||||
*/
|
||||
static void
|
||||
int
|
||||
channel_tag_map(channel_t *ch, channel_tag_t *ct, int check)
|
||||
{
|
||||
channel_tag_mapping_t *ctm;
|
||||
|
@ -549,11 +550,11 @@ channel_tag_map(channel_t *ch, channel_tag_t *ct, int check)
|
|||
if(check) {
|
||||
LIST_FOREACH(ctm, &ch->ch_ctms, ctm_channel_link)
|
||||
if(ctm->ctm_tag == ct)
|
||||
return;
|
||||
return 0;
|
||||
|
||||
LIST_FOREACH(ctm, &ct->ct_ctms, ctm_tag_link)
|
||||
if(ctm->ctm_channel == ch)
|
||||
return;
|
||||
return 0;
|
||||
}
|
||||
|
||||
LIST_FOREACH(ctm, &ch->ch_ctms, ctm_channel_link)
|
||||
|
@ -576,6 +577,7 @@ channel_tag_map(channel_t *ch, channel_tag_t *ct, int check)
|
|||
htsp_tag_update(ct);
|
||||
htsp_channel_update(ch);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
@ -639,21 +641,6 @@ channel_tag_find(const char *id, int create)
|
|||
return ct;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
channel_tag_t *
|
||||
channel_tag_find_by_name(const char *name)
|
||||
{
|
||||
channel_tag_t *ct;
|
||||
|
||||
TAILQ_FOREACH(ct, &channel_tags, ct_link)
|
||||
if(!strcmp(ct->ct_name, name))
|
||||
break;
|
||||
return ct;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
|
@ -823,18 +810,46 @@ static const dtable_class_t channel_tags_dtc = {
|
|||
};
|
||||
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
channel_tag_t *
|
||||
channel_tag_find_by_name(const char *name, int create)
|
||||
{
|
||||
channel_tag_t *ct;
|
||||
char str[50];
|
||||
|
||||
TAILQ_FOREACH(ct, &channel_tags, ct_link)
|
||||
if(!strcmp(ct->ct_name, name))
|
||||
return ct;
|
||||
|
||||
if(!create)
|
||||
return NULL;
|
||||
|
||||
ct = channel_tag_find(NULL, 1);
|
||||
ct->ct_enabled = 1;
|
||||
tvh_str_update(&ct->ct_name, name);
|
||||
|
||||
snprintf(str, sizeof(str), "%d", ct->ct_identifier);
|
||||
dtable_record_store(channeltags_dtable, str, channel_tag_record_build(ct));
|
||||
|
||||
dtable_store_changed(channeltags_dtable);
|
||||
return ct;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
void
|
||||
channels_init(void)
|
||||
{
|
||||
dtable_t *dt;
|
||||
|
||||
TAILQ_INIT(&channel_tags);
|
||||
|
||||
dt = dtable_create(&channel_tags_dtc, "channeltags", NULL);
|
||||
dtable_load(dt);
|
||||
channeltags_dtable = dtable_create(&channel_tags_dtc, "channeltags", NULL);
|
||||
dtable_load(channeltags_dtable);
|
||||
|
||||
channels_load();
|
||||
}
|
||||
|
|
|
@ -120,7 +120,11 @@ void channel_set_xmltv_source(channel_t *ch, struct xmltv_channel *xc);
|
|||
|
||||
void channel_set_tags_from_list(channel_t *ch, const char *maplist);
|
||||
|
||||
channel_tag_t *channel_tag_find_by_name(const char *name);
|
||||
channel_tag_t *channel_tag_find_by_name(const char *name, int create);
|
||||
|
||||
int channel_tag_map(channel_t *ch, channel_tag_t *ct, int check);
|
||||
|
||||
void channel_save(channel_t *ch);
|
||||
|
||||
extern struct channel_list channels_not_xmltv_mapped;
|
||||
|
||||
|
|
|
@ -38,7 +38,7 @@ static LIST_HEAD(, dtable) dtables;
|
|||
/**
|
||||
*
|
||||
*/
|
||||
static void
|
||||
void
|
||||
dtable_store_changed(const dtable_t *dt)
|
||||
{
|
||||
htsmsg_t *m = htsmsg_create_map();
|
||||
|
|
|
@ -74,4 +74,6 @@ void dtable_record_store(dtable_t *dt, const char *id, htsmsg_t *r);
|
|||
|
||||
void dtable_record_erase(dtable_t *dt, const char *id);
|
||||
|
||||
void dtable_store_changed(const dtable_t *dt);
|
||||
|
||||
#endif /* DTABLE_H__ */
|
||||
|
|
|
@ -282,7 +282,7 @@ autorec_record_update(void *opaque, const char *id, htsmsg_t *values,
|
|||
LIST_REMOVE(dae, dae_channel_tag_link);
|
||||
dae->dae_channel_tag = NULL;
|
||||
}
|
||||
if((ct = channel_tag_find_by_name(s)) != NULL) {
|
||||
if((ct = channel_tag_find_by_name(s, 0)) != NULL) {
|
||||
LIST_INSERT_HEAD(&ct->ct_autorecs, dae, dae_channel_tag_link);
|
||||
dae->dae_channel_tag = ct;
|
||||
}
|
||||
|
@ -371,7 +371,7 @@ dvr_autorec_add(const char *title, const char *channel,
|
|||
dae->dae_title = strdup(title);
|
||||
}
|
||||
|
||||
if(tag != NULL && (ct = channel_tag_find_by_name(tag)) != NULL) {
|
||||
if(tag != NULL && (ct = channel_tag_find_by_name(tag, 0)) != NULL) {
|
||||
LIST_INSERT_HEAD(&ct->ct_autorecs, dae, dae_channel_tag_link);
|
||||
dae->dae_channel_tag = ct;
|
||||
}
|
||||
|
|
|
@ -535,7 +535,7 @@ epg_query(epg_query_result_t *eqr, const char *channel, const char *tag,
|
|||
const char *contentgroup, const char *title)
|
||||
{
|
||||
channel_t *ch = channel ? channel_find_by_name(channel, 0) : NULL;
|
||||
channel_tag_t *ct = tag ? channel_tag_find_by_name(tag) : NULL;
|
||||
channel_tag_t *ct = tag ? channel_tag_find_by_name(tag, 0) : NULL;
|
||||
epg_content_group_t *ecg = contentgroup ?
|
||||
epg_content_group_find_by_name(contentgroup) : NULL;
|
||||
channel_tag_mapping_t *ctm;
|
||||
|
|
|
@ -156,11 +156,43 @@ serviceprobe_thread(void *aux)
|
|||
tvhlog(LOG_INFO, "serviceprobe", "%20s: skipped: %s",
|
||||
t->tht_svcname, err);
|
||||
} else if(t->tht_ch == NULL) {
|
||||
const char *str;
|
||||
|
||||
ch = channel_find_by_name(t->tht_svcname, 1);
|
||||
transport_map_channel(t, ch, 1);
|
||||
|
||||
tvhlog(LOG_INFO, "serviceprobe", "%20s: mapped to channel \"%s\"",
|
||||
t->tht_svcname, t->tht_svcname);
|
||||
|
||||
channel_tag_map(ch, channel_tag_find_by_name("TV channels", 1), 1);
|
||||
tvhlog(LOG_INFO, "serviceprobe", "%20s: joined tag \"%s\"",
|
||||
t->tht_svcname, "TV channels");
|
||||
|
||||
switch(t->tht_servicetype) {
|
||||
case ST_SDTV:
|
||||
case ST_AC_SDTV:
|
||||
str = "SDTV";
|
||||
break;
|
||||
case ST_HDTV:
|
||||
case ST_AC_HDTV:
|
||||
str = "HDTV";
|
||||
break;
|
||||
default:
|
||||
str = NULL;
|
||||
}
|
||||
|
||||
if(str != NULL) {
|
||||
channel_tag_map(ch, channel_tag_find_by_name(str, 1), 1);
|
||||
tvhlog(LOG_INFO, "serviceprobe", "%20s: joined tag \"%s\"",
|
||||
t->tht_svcname, str);
|
||||
}
|
||||
|
||||
if(t->tht_provider != NULL) {
|
||||
channel_tag_map(ch, channel_tag_find_by_name(t->tht_provider, 1), 1);
|
||||
tvhlog(LOG_INFO, "serviceprobe", "%20s: joined tag \"%s\"",
|
||||
t->tht_svcname, t->tht_provider);
|
||||
}
|
||||
channel_save(ch);
|
||||
}
|
||||
|
||||
t->tht_sp_onqueue = 0;
|
||||
|
|
Loading…
Add table
Reference in a new issue