diff --git a/src/dvr/dvr.h b/src/dvr/dvr.h index 169886dd..b91a1b90 100644 --- a/src/dvr/dvr.h +++ b/src/dvr/dvr.h @@ -254,7 +254,7 @@ void dvr_rec_subscribe(dvr_entry_t *de); void dvr_rec_unsubscribe(dvr_entry_t *de, int stopcode); -void dvr_event_cancelled(event_t *e); +void dvr_event_replaced(event_t *e, event_t *new_e); dvr_entry_t *dvr_entry_find_by_id(int id); diff --git a/src/dvr/dvr_db.c b/src/dvr/dvr_db.c index 84462f5f..5e5f4373 100644 --- a/src/dvr/dvr_db.c +++ b/src/dvr/dvr_db.c @@ -631,17 +631,20 @@ dvr_entry_update(dvr_entry_t *de, const char* de_title, int de_start, int de_sto } /** - * Used to notify the DVR that an event has been removed from the EPG + * Used to notify the DVR that an event has been replaced in the EPG */ void -dvr_event_cancelled(event_t *e) +dvr_event_replaced(event_t *e, event_t *new_e) { - dvr_entry_t *de; + dvr_entry_t *de, *ude; de = dvr_entry_find_by_event(e); if (de != NULL) { - if (de->de_sched_state == DVR_SCHEDULED) + ude = dvr_entry_find_by_event_fuzzy(new_e); + if (ude == NULL && de->de_sched_state == DVR_SCHEDULED) dvr_entry_cancel(de); + else + dvr_entry_update(de, new_e->e_title, new_e->e_start, new_e->e_stop); } diff --git a/src/epg.c b/src/epg.c index 40be0001..e15d7003 100644 --- a/src/epg.c +++ b/src/epg.c @@ -424,13 +424,13 @@ epg_erase_duplicates(event_t *e, channel_t *ch) { if(p->e_dvb_id == dvb_id || epg_event_cmp_overlap(p, e)) { tvhlog(LOG_DEBUG, "epg", "Removing overlapping event instance %s from EPG", p->e_title); - dvr_event_cancelled(p); + dvr_event_replaced(p, e); epg_remove_event_from_channel(ch, p); } else if((p = RB_PREV(p, e_channel_link)) != NULL) { if(p->e_dvb_id == dvb_id || epg_event_cmp_overlap(p, e)) { tvhlog(LOG_DEBUG, "epg", "Removing overlapping event instance %s from EPG", p->e_title); - dvr_event_cancelled(p); + dvr_event_replaced(p, e); epg_remove_event_from_channel(ch, p); } } @@ -440,13 +440,13 @@ epg_erase_duplicates(event_t *e, channel_t *ch) { if(n->e_dvb_id == dvb_id || epg_event_cmp_overlap(n, e)) { tvhlog(LOG_DEBUG, "epg", "Removing overlapping event instance %s from EPG", n->e_title); - dvr_event_cancelled(n); + dvr_event_replaced(n, e); epg_remove_event_from_channel(ch, n); } else if((n = RB_NEXT(n, e_channel_link)) != NULL) { if(n->e_dvb_id == dvb_id || epg_event_cmp_overlap(n, e)) { tvhlog(LOG_DEBUG, "epg", "Removing overlapping event instance %s from EPG", n->e_title); - dvr_event_cancelled(n); + dvr_event_replaced(n, e); epg_remove_event_from_channel(ch, n); } }