From d73ff68faec4092ddc770bff4ad791f94654baf8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20=C3=96man?= Date: Wed, 26 Aug 2009 20:34:13 +0000 Subject: [PATCH] Tvheadend's DVB service probe will now let the channel join tags based on the service type and DVB provider name. --- debian/changelog | 5 ++++ src/channels.c | 63 ++++++++++++++++++++++++++----------------- src/channels.h | 6 ++++- src/dtable.c | 2 +- src/dtable.h | 2 ++ src/dvr/dvr_autorec.c | 4 +-- src/epg.c | 2 +- src/serviceprobe.c | 32 ++++++++++++++++++++++ 8 files changed, 87 insertions(+), 29 deletions(-) diff --git a/debian/changelog b/debian/changelog index 7ed27166..351feb9b 100644 --- a/debian/changelog +++ b/debian/changelog @@ -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, diff --git a/src/channels.c b/src/channels.c index f8cfaaa0..70a0e86d 100644 --- a/src/channels.c +++ b/src/channels.c @@ -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(); } diff --git a/src/channels.h b/src/channels.h index d72fc90d..314a7e2f 100644 --- a/src/channels.h +++ b/src/channels.h @@ -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; diff --git a/src/dtable.c b/src/dtable.c index 72dc9020..710033f5 100644 --- a/src/dtable.c +++ b/src/dtable.c @@ -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(); diff --git a/src/dtable.h b/src/dtable.h index 53ad64c0..fd0b422d 100644 --- a/src/dtable.h +++ b/src/dtable.h @@ -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__ */ diff --git a/src/dvr/dvr_autorec.c b/src/dvr/dvr_autorec.c index 933ebf9a..7d2db333 100644 --- a/src/dvr/dvr_autorec.c +++ b/src/dvr/dvr_autorec.c @@ -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; } diff --git a/src/epg.c b/src/epg.c index 3345a270..1a7dfb0e 100644 --- a/src/epg.c +++ b/src/epg.c @@ -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; diff --git a/src/serviceprobe.c b/src/serviceprobe.c index bfb12bbb..5a4d4bf4 100644 --- a/src/serviceprobe.c +++ b/src/serviceprobe.c @@ -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;