From: Jaroslav Kysela Date: Wed, 1 Nov 2017 19:07:05 +0000 (+0100) Subject: EPG: add dvr_entries list to epg_broadcast structure X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=6db98d3e44afa1a0075eab5203f3f5de2dc8f312;p=thirdparty%2Ftvheadend.git EPG: add dvr_entries list to epg_broadcast structure --- diff --git a/src/dvr/dvr.h b/src/dvr/dvr.h index e5f4a6c4a..3547d582a 100644 --- a/src/dvr/dvr.h +++ b/src/dvr/dvr.h @@ -228,6 +228,7 @@ typedef struct dvr_entry { /** * EPG information / links */ + LIST_ENTRY(dvr_entry) de_bcast_link; epg_broadcast_t *de_bcast; char *de_episode; diff --git a/src/dvr/dvr_db.c b/src/dvr/dvr_db.c index 23bde9c01..e591f46ee 100644 --- a/src/dvr/dvr_db.c +++ b/src/dvr/dvr_db.c @@ -231,6 +231,7 @@ dvr_entry_assign_broadcast(dvr_entry_t *de, epg_broadcast_t *bcast) if (de->de_bcast) { snprintf(id, sizeof(id), "%u", de->de_bcast->id); dvr_entry_trace(de, "unassign broadcast %s", id); + LIST_REMOVE(de, de_bcast_link); de->de_bcast->ops->putref((epg_object_t*)de->de_bcast); notify_delayed(id, "epg", "dvr_delete"); de->de_bcast = NULL; @@ -239,6 +240,7 @@ dvr_entry_assign_broadcast(dvr_entry_t *de, epg_broadcast_t *bcast) if (bcast) { bcast->ops->getref((epg_object_t*)bcast); de->de_bcast = bcast; + LIST_INSERT_HEAD(&bcast->dvr_entries, de, de_bcast_link); snprintf(id, sizeof(id), "%u", bcast->id); dvr_entry_trace(de, "assign broadcast %s", id); notify_delayed(id, "epg", "dvr_update"); @@ -2265,27 +2267,26 @@ void dvr_event_updated(epg_broadcast_t *e) if (e->channel == NULL) return; - LIST_FOREACH(de, &e->channel->ch_dvrs, de_channel_link) { - if (de->de_bcast != e) - continue; + LIST_FOREACH(de, &e->dvr_entries, de_bcast_link) { + assert(de->de_bcast == e); _dvr_entry_update(de, -1, NULL, e, NULL, NULL, NULL, NULL, NULL, 0, 0, 0, 0, DVR_PRIO_NOTSET, 0, 0, -1, -1); found++; } - if (found == 0) { - LIST_FOREACH(de, &e->channel->ch_dvrs, de_channel_link) { - if (de->de_sched_state != DVR_SCHEDULED) continue; - if (de->de_bcast) continue; - if (dvr_entry_fuzzy_match(de, e, e->dvb_eid, - de->de_config->dvr_update_window)) { - dvr_entry_trace_time2(de, "start", e->start, "stop", e->stop, - "link to event %s on %s", - epg_broadcast_get_title(e, NULL), - channel_get_name(e->channel, channel_blank_name)); - _dvr_entry_update(de, -1, NULL, e, NULL, NULL, NULL, NULL, - NULL, 0, 0, 0, 0, DVR_PRIO_NOTSET, 0, 0, -1, -1); - break; - } + if (found) + return; + LIST_FOREACH(de, &e->channel->ch_dvrs, de_channel_link) { + if (de->de_sched_state != DVR_SCHEDULED) continue; + if (de->de_bcast) continue; + if (dvr_entry_fuzzy_match(de, e, e->dvb_eid, + de->de_config->dvr_update_window)) { + dvr_entry_trace_time2(de, "start", e->start, "stop", e->stop, + "link to event %s on %s", + epg_broadcast_get_title(e, NULL), + channel_get_name(e->channel, channel_blank_name)); + _dvr_entry_update(de, -1, NULL, e, NULL, NULL, NULL, NULL, + NULL, 0, 0, 0, 0, DVR_PRIO_NOTSET, 0, 0, -1, -1); + break; } } } diff --git a/src/epg.c b/src/epg.c index d6ca56d70..c38f295b8 100644 --- a/src/epg.c +++ b/src/epg.c @@ -1906,6 +1906,7 @@ static void _epg_broadcast_destroy ( void *eo ) if (ebc->keyword) string_list_destroy(ebc->keyword); if (ebc->keyword_cached) lang_str_destroy(ebc->keyword_cached); _epg_object_destroy(eo, NULL); + assert(LIST_EMPTY(&ebc->dvr_entries)); free(ebc); } diff --git a/src/epg.h b/src/epg.h index 8fa15a9ba..add1ab089 100644 --- a/src/epg.h +++ b/src/epg.h @@ -29,6 +29,7 @@ */ struct channel; struct channel_tag; +struct dvr_entry; struct epggrab_module; struct string_list; @@ -537,6 +538,8 @@ struct epg_broadcast epg_serieslink_t *serieslink; ///< SeriesLink; struct channel *channel; ///< Channel being broadcast on + /* DVR */ + LIST_HEAD(, dvr_entry) dvr_entries; ///< Associated DVR entries }; /* Lookup */