Combine updates to EPG so autorec does not need to scan that much

This commit is contained in:
Andreas Öman 2010-03-16 21:55:10 +00:00
parent 7d38bc1943
commit 653f9020d0
4 changed files with 85 additions and 47 deletions

View file

@ -573,6 +573,7 @@ dvb_eit_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
ptr += dllen;
continue;
}
int changed = 0;
ect = NULL;
*title = 0;
@ -591,8 +592,8 @@ dvb_eit_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
if(!dvb_desc_short_event(ptr, dlen,
title, sizeof(title),
desc, sizeof(desc))) {
epg_event_set_title(e, title);
epg_event_set_desc(e, desc);
changed |= epg_event_set_title(e, title);
changed |= epg_event_set_desc(e, desc);
}
break;
@ -600,7 +601,7 @@ dvb_eit_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
if(dlen >= 2) {
/* We only support one content type per event atm. */
ect = epg_content_type_find_by_dvbcode(*ptr);
epg_event_set_content_type(e, ect);
changed |= epg_event_set_content_type(e, ect);
}
break;
case DVB_DESC_EXT_EVENT:
@ -616,11 +617,11 @@ dvb_eit_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
//int desc_last = (ptr[0] & 0x0F);
if (strlen(extdesc))
epg_event_set_ext_desc(e, desc_number, extdesc);
changed |= epg_event_set_ext_desc(e, desc_number, extdesc);
if (strlen(extitem))
epg_event_set_ext_item(e, desc_number, extitem);
changed |= epg_event_set_ext_item(e, desc_number, extitem);
if (strlen(exttext))
epg_event_set_ext_text(e, desc_number, exttext);
changed |= epg_event_set_ext_text(e, desc_number, exttext);
}
break;
default:
@ -629,6 +630,9 @@ dvb_eit_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
len -= dlen; ptr += dlen; dllen -= dlen;
}
if(changed)
epg_event_updated(e);
}
return 0;
}

View file

@ -108,8 +108,8 @@ epg_ch_check_current_event(void *aux)
/**
*
*/
static void
epg_event_changed(event_t *e)
void
epg_event_updated(event_t *e)
{
dvr_autorec_check_event(e);
}
@ -118,21 +118,21 @@ epg_event_changed(event_t *e)
/**
*
*/
void
int
epg_event_set_title(event_t *e, const char *title)
{
if(e->e_title != NULL && !strcmp(e->e_title, title))
return;
return 0;
free(e->e_title);
e->e_title = strdup(title);
epg_event_changed(e);
return 1;
}
/**
*
*/
void
int
epg_event_set_desc(event_t *e, const char *desc)
{
if(e->e_desc != NULL && strlen(e->e_desc) >= strlen(desc)) {
@ -141,48 +141,48 @@ epg_event_set_desc(event_t *e, const char *desc)
* so we just bail out.
* Typically happens when the XMLTV and DVB EPG feed differs.
*/
return;
return 0;
}
free(e->e_desc);
e->e_desc = strdup(desc);
epg_event_changed(e);
return 1;
}
/**
*
*/
void epg_event_set_ext_desc(event_t *e, int ext_dn, const char *desc)
int
epg_event_set_ext_desc(event_t *e, int ext_dn, const char *desc)
{
if(e->e_ext_desc == NULL && ext_dn != 0)
return;
return 0;
if(e->e_ext_desc != NULL && strstr(e->e_ext_desc, desc))
return;
return 0;
int len = strlen(desc) + ( e->e_ext_desc ? strlen(e->e_ext_desc) : 0) + 1;
char *tmp = (char*)malloc(len);
if(e->e_ext_desc)
{
if(e->e_ext_desc) {
strcpy(tmp, e->e_ext_desc);
strcat(tmp, desc);
free(e->e_ext_desc);
}
else
} else
strcpy(tmp, desc);
e->e_ext_desc = tmp;
epg_event_changed(e);
return 1;
}
/**
*
*/
void epg_event_set_ext_item(event_t *e, int ext_dn, const char *item)
int
epg_event_set_ext_item(event_t *e, int ext_dn, const char *item)
{
if(e->e_ext_item == NULL && ext_dn != 0)
return;
return 0;
if(e->e_ext_item != NULL && strstr(e->e_ext_item, item))
return;
return 0;
int len = strlen(item) + ( e->e_ext_item ? strlen(e->e_ext_item) : 0) + 1;
char *tmp = (char*)malloc(len);
@ -195,18 +195,19 @@ void epg_event_set_ext_item(event_t *e, int ext_dn, const char *item)
strcpy(tmp, item);
e->e_ext_item = tmp;
epg_event_changed(e);
return 1;
}
/**
*
*/
void epg_event_set_ext_text(event_t *e, int ext_dn, const char *text)
int
epg_event_set_ext_text(event_t *e, int ext_dn, const char *text)
{
if(e->e_ext_text == NULL && ext_dn != 0)
return;
return 0;
if(e->e_ext_text != NULL && strstr(e->e_ext_text, text))
return;
return 0;
int len = strlen(text) + ( e->e_ext_text ? strlen(e->e_ext_text) : 0) + 1;
char *tmp = (char*)malloc(len);
@ -219,17 +220,17 @@ void epg_event_set_ext_text(event_t *e, int ext_dn, const char *text)
strcpy(tmp, text);
e->e_ext_text = tmp;
epg_event_changed(e);
return 1;
}
/**
*
*/
void
int
epg_event_set_content_type(event_t *e, epg_content_type_t *ect)
{
if(e->e_content_type == ect)
return;
return 0;
if(e->e_content_type != NULL)
LIST_REMOVE(e, e_content_type_link);
@ -237,22 +238,28 @@ epg_event_set_content_type(event_t *e, epg_content_type_t *ect)
e->e_content_type = ect;
if(ect != NULL)
LIST_INSERT_HEAD(&ect->ect_events, e, e_content_type_link);
epg_event_changed(e);
return 1;
}
/**
*
*/
void
int
epg_event_set_episode(event_t *e, epg_episode_t *ee)
{
if(e->e_episode.ee_season == ee->ee_season &&
e->e_episode.ee_episode == ee->ee_episode &&
e->e_episode.ee_part == ee->ee_part &&
!strcmp(e->e_episode.ee_onscreen ?: "", ee->ee_onscreen ?: ""))
return 0;
e->e_episode.ee_season = ee->ee_season;
e->e_episode.ee_episode = ee->ee_episode;
e->e_episode.ee_part = ee->ee_part;
tvh_str_set(&e->e_episode.ee_onscreen, ee->ee_onscreen);
return 1;
}
@ -362,7 +369,6 @@ epg_event_create(channel_t *ch, time_t start, time_t stop, int dvb_id,
e->e_refcount = 1;
e->e_channel = ch;
epg_event_changed(e);
if(e == RB_FIRST(&ch->ch_epg_events)) {
/* First in temporal order, arm expiration timer */
@ -391,7 +397,6 @@ epg_event_create(channel_t *ch, time_t start, time_t stop, int dvb_id,
printf(" New %s", ctime(&stop));
#endif
e->e_stop = stop;
epg_event_changed(e);
if(e == ch->ch_epg_current) {
gtimer_arm_abs(&ch->ch_epg_timer_current, epg_ch_check_current_event,

View file

@ -87,19 +87,39 @@ typedef struct event {
*/
void epg_init(void);
void epg_event_set_title(event_t *e, const char *title);
/**
* All the epg_event_set_ function return 1 if it actually changed
* the EPG records. otherwise it returns 0.
*
* If the caller detects that something has changed, it should call
* epg_event_updated().
*
* There reason to put the burden on the caller is that the caller
* can combine multiple set()'s into one update
*
*/
int epg_event_set_title(event_t *e, const char *title)
__attribute__ ((warn_unused_result));
void epg_event_set_desc(event_t *e, const char *desc);
int epg_event_set_desc(event_t *e, const char *desc)
__attribute__ ((warn_unused_result));
void epg_event_set_ext_desc(event_t *e, int ext_dn, const char *desc);
int epg_event_set_ext_desc(event_t *e, int ext_dn, const char *desc)
__attribute__ ((warn_unused_result));
void epg_event_set_ext_item(event_t *e, int ext_dn, const char *item);
int epg_event_set_ext_item(event_t *e, int ext_dn, const char *item)
__attribute__ ((warn_unused_result));
void epg_event_set_ext_text(event_t *e, int ext_dn, const char *text);
int epg_event_set_ext_text(event_t *e, int ext_dn, const char *text)
__attribute__ ((warn_unused_result));
void epg_event_set_content_type(event_t *e, epg_content_type_t *ect);
int epg_event_set_content_type(event_t *e, epg_content_type_t *ect)
__attribute__ ((warn_unused_result));
void epg_event_set_episode(event_t *e, epg_episode_t *ee);
int epg_event_set_episode(event_t *e, epg_episode_t *ee)
__attribute__ ((warn_unused_result));
void epg_event_updated(event_t *e);
event_t *epg_event_create(channel_t *ch, time_t start, time_t stop,
int dvb_id, int *created);

View file

@ -494,9 +494,18 @@ xmltv_parse_programme_tags(xmltv_channel_t *xc, htsmsg_t *tags,
if(created)
ps->ps_events_created++;
if(title != NULL) epg_event_set_title(e, title);
if(desc != NULL) epg_event_set_desc(e, desc);
epg_event_set_episode(e, &episode);
int changed = 0;
if(title != NULL)
changed |= epg_event_set_title(e, title);
if(desc != NULL)
changed |= epg_event_set_desc(e, desc);
changed |= epg_event_set_episode(e, &episode);
if(changed)
epg_event_updated(e);
}
free(episode.ee_onscreen);