]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
EPG: add dvr_entries list to epg_broadcast structure
authorJaroslav Kysela <perex@perex.cz>
Wed, 1 Nov 2017 19:07:05 +0000 (20:07 +0100)
committerJaroslav Kysela <perex@perex.cz>
Wed, 1 Nov 2017 19:07:05 +0000 (20:07 +0100)
src/dvr/dvr.h
src/dvr/dvr_db.c
src/epg.c
src/epg.h

index e5f4a6c4a8773e457ad3815bccd0e7bbb22cf2a5..3547d582a7addae5f23dc388a551d528c2a5d34a 100644 (file)
@@ -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;
 
index 23bde9c01a2c3a60b3cf02ab7bd44612adbc7f35..e591f46ee3569c2c573639f0fc67b7f457097212 100644 (file)
@@ -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;
     }
   }
 }
index d6ca56d702686fe4c64d04a4ff819d836887955d..c38f295b83ce1c54367aa503aa2f65bd2946eaf0 100644 (file)
--- 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);
 }
 
index 8fa15a9baec9a91522346f51253566fbeb09bc22..add1ab08968e0d592488b542685b4dfbe0cca8fe 100644 (file)
--- 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 */