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:
Andreas Öman 2009-08-26 20:34:13 +00:00
parent 4673252346
commit d73ff68fae
8 changed files with 87 additions and 29 deletions

5
debian/changelog vendored
View file

@ -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,

View file

@ -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();
}

View file

@ -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;

View file

@ -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();

View file

@ -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__ */

View file

@ -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;
}

View file

@ -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;

View file

@ -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;