]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
First stab at adding the DVR code back in. Very much WIP and no attempt to add clever...
authorAdam Sutton <dev@adamsutton.me.uk>
Fri, 25 May 2012 15:19:29 +0000 (16:19 +0100)
committerAdam Sutton <dev@adamsutton.me.uk>
Mon, 30 Jul 2012 14:47:20 +0000 (15:47 +0100)
src/dvb/dvb_tables.c
src/dvr/dvr.h
src/dvr/dvr_autorec.c
src/dvr/dvr_db.c
src/dvr/mkmux.c
src/dvr/mkmux.h
src/epg.c
src/epg.h
src/tvheadend.h
src/webui/extjs.c
src/webui/simpleui.c

index 7ab0568c25ffdc367c8f68e99353ba47b8188c1d..da08b54e0699bdcde8c45b0a04b2c26428646f3d 100644 (file)
@@ -448,7 +448,7 @@ static int
 dvb_eit_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
                 uint8_t tableid, void *opaque)
 {
-#if TODO
+#ifdef TODO_EIT_GRABBER
   service_t *t;
   channel_t *ch;
   th_dvb_adapter_t *tda = tdmi->tdmi_adapter;
@@ -469,8 +469,6 @@ dvb_eit_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
   char extitem[5000];
   char exttext[5000];
 
-  event_t *e;
-
   lock_assert(&global_lock);
 
   //  printf("EIT!, tid = %x\n", tableid);
index b91a1b90bbd855cd1c91e91725033842ad14b237..0db0c7b1f55fdcf4793fd859478ee5e4d9bfe504 100644 (file)
@@ -124,11 +124,13 @@ typedef struct dvr_entry {
 
   dvr_prio_t de_pri;
 
-  epg_episode_t de_episode;
-  uint8_t de_content_type;
-
   uint32_t de_dont_reschedule;
 
+  /**
+   * EPG information / links
+   */
+  epg_broadcast_t *de_bcast;
+
   /**
    * Major State
    */
@@ -188,6 +190,8 @@ typedef struct dvr_autorec_entry {
   char *dae_creator;
   char *dae_comment;
 
+// TODO: EPG linking for proper series recording
+
   char *dae_title;
   regex_t dae_title_preg;
   
@@ -228,10 +232,10 @@ const char *dvr_entry_status(dvr_entry_t *de);
 
 const char *dvr_entry_schedstatus(dvr_entry_t *de);
 
-void dvr_entry_create_by_autorec(event_t *e, dvr_autorec_entry_t *dae);
+void dvr_entry_create_by_autorec(epg_broadcast_t *e, dvr_autorec_entry_t *dae);
 
 dvr_entry_t *dvr_entry_create_by_event(const char *dvr_config_name,
-                                       event_t *e, const char *creator,
+                                       epg_broadcast_t *e, const char *creator,
                                       dvr_autorec_entry_t *dae,
                                       dvr_prio_t pri);
 
@@ -239,7 +243,6 @@ dvr_entry_t *dvr_entry_create(const char *dvr_config_name,
                               channel_t *ch, time_t start, time_t stop, 
                              const char *title, const char *description,
                              const char *creator, dvr_autorec_entry_t *dae,
-                             epg_episode_t *ee, uint8_t content_type,
                              dvr_prio_t pri);
 
 dvr_entry_t *dvr_entry_update(dvr_entry_t *de, const char* de_title, int de_start, int de_stop);
@@ -254,13 +257,13 @@ void dvr_rec_subscribe(dvr_entry_t *de);
 
 void dvr_rec_unsubscribe(dvr_entry_t *de, int stopcode);
 
-void dvr_event_replaced(event_t *e, event_t *new_e);
+void dvr_event_replaced(epg_broadcast_t *e, epg_broadcast_t *new_e);
 
 dvr_entry_t *dvr_entry_find_by_id(int id);
 
-dvr_entry_t *dvr_entry_find_by_event(event_t *e);
+dvr_entry_t *dvr_entry_find_by_event(epg_broadcast_t *e);
 
-dvr_entry_t *dvr_entry_find_by_event_fuzzy(event_t *e);
+dvr_entry_t *dvr_entry_find_by_event_fuzzy(epg_broadcast_t *e);
 
 off_t dvr_get_filesize(dvr_entry_t *de);
 
@@ -305,7 +308,7 @@ void dvr_autorec_add(const char *dvr_config_name,
                     const char *tag, uint8_t content_type,
                     const char *creator, const char *comment);
 
-void dvr_autorec_check_event(event_t *e);
+void dvr_autorec_check_event(epg_broadcast_t *e);
 
 void autorec_destroy_by_channel(channel_t *ch);
 
index 19d76576b2ff4c9c3ec1b75a64d89d1c27c633fa..549b2637b6d46aa44f4a00801dad66bbb9dca83c 100644 (file)
@@ -62,10 +62,11 @@ dvr_autorec_purge_spawns(dvr_autorec_entry_t *dae)
  * return 1 if the event 'e' is matched by the autorec rule 'dae'
  */
 static int
-autorec_cmp(dvr_autorec_entry_t *dae, event_t *e)
+autorec_cmp(dvr_autorec_entry_t *dae, epg_broadcast_t *e)
 {
   channel_tag_mapping_t *ctm;
 
+  if (!e->channel || !e->channel->channel) return 0;
   if(dae->dae_enabled == 0 || dae->dae_weekdays == 0)
     return 0;
 
@@ -76,33 +77,34 @@ autorec_cmp(dvr_autorec_entry_t *dae, event_t *e)
     return 0; // Avoid super wildcard match
 
   if(dae->dae_channel != NULL &&
-     dae->dae_channel != e->e_channel)
+     dae->dae_channel != e->channel->channel)
     return 0;
   
   if(dae->dae_channel_tag != NULL) {
     LIST_FOREACH(ctm, &dae->dae_channel_tag->ct_ctms, ctm_tag_link)
-      if(ctm->ctm_channel == e->e_channel)
+      if(ctm->ctm_channel == e->channel->channel)
        break;
     if(ctm == NULL)
       return 0;
   }
 
-
+#if TODO_GENRE_SUPPORT
   if(dae->dae_content_type != 0 &&
      dae->dae_content_type != e->e_content_type)
     return 0;
+#endif
   
   if(dae->dae_title != NULL) {
-    if(e->e_title == NULL ||
-       regexec(&dae->dae_title_preg, e->e_title, 0, NULL, 0))
+    if(e->episode->title == NULL ||
+       regexec(&dae->dae_title_preg, e->episode->title, 0, NULL, 0))
     return 0;
   }
 
   if(dae->dae_approx_time != 0) {
     struct tm a_time;
     struct tm ev_time;
-    localtime_r(&e->e_start, &a_time);
-    localtime_r(&e->e_start, &ev_time);
+    localtime_r(&e->start, &a_time);
+    localtime_r(&e->start, &ev_time);
     a_time.tm_min = dae->dae_approx_time % 60;
     a_time.tm_hour = dae->dae_approx_time / 60;
     if(abs(mktime(&a_time) - mktime(&ev_time)) > 900)
@@ -111,7 +113,7 @@ autorec_cmp(dvr_autorec_entry_t *dae, event_t *e)
 
   if(dae->dae_weekdays != 0x7f) {
     struct tm tm;
-    localtime_r(&e->e_start, &tm);
+    localtime_r(&e->start, &tm);
     if(!((1 << ((tm.tm_wday ?: 7) - 1)) & dae->dae_weekdays))
       return 0;
   }
@@ -489,7 +491,7 @@ dvr_autorec_add(const char *config_name,
  *
  */
 void
-dvr_autorec_check_event(event_t *e)
+dvr_autorec_check_event(epg_broadcast_t *e)
 {
   dvr_autorec_entry_t *dae;
   dvr_entry_t *existingde;
@@ -498,8 +500,8 @@ dvr_autorec_check_event(event_t *e)
     if(autorec_cmp(dae, e)) {
       existingde = dvr_entry_find_by_event_fuzzy(e);
       if (existingde != NULL) {
-        tvhlog(LOG_DEBUG, "dvr", "Updating existing DVR entry for %s", e->e_title);
-        dvr_entry_update(existingde, e->e_title, e->e_start, e->e_stop);
+        tvhlog(LOG_DEBUG, "dvr", "Updating existing DVR entry for %s", e->episode->title);
+        dvr_entry_update(existingde, e->episode->title, e->start, e->stop);
       } else
         dvr_entry_create_by_autorec(e, dae);
     }
@@ -511,7 +513,7 @@ dvr_autorec_check_event(event_t *e)
 static void
 dvr_autorec_changed(dvr_autorec_entry_t *dae)
 {
-#if TODO_DVR
+#if TODO_DVR_AUTOREC
   channel_t *ch;
   event_t *e;
 
index 76fc3bc11a49f6c1ec6a1f18997cf46488c49ea3..d3e261630886ee72af1cec3fc3932781fb91aeb5 100644 (file)
@@ -30,7 +30,7 @@
 #include "htsp.h"
 #include "streaming.h"
 
-//static int de_tally;
+static int de_tally;
 
 int dvr_iov_max;
 
@@ -40,9 +40,7 @@ struct dvr_entry_list dvrentries;
 static void dvr_entry_save(dvr_entry_t *de);
 
 static void dvr_timer_expire(void *aux);
-#if 0
 static void dvr_timer_start_recording(void *aux);
-#endif
 
 /**
  * Return printable status for a dvr entry
@@ -155,7 +153,6 @@ dvr_entry_notify(dvr_entry_t *de)
 /**
  *
  */
-#if TODO
 static void
 dvr_make_title(char *output, size_t outlen, dvr_entry_t *de)
 {
@@ -185,16 +182,11 @@ dvr_make_title(char *output, size_t outlen, dvr_entry_t *de)
   }
 
   if(cfg->dvr_flags & DVR_EPISODE_IN_TITLE) {
-
-    if(de->de_episode.ee_season && de->de_episode.ee_episode)
-      snprintf(output + strlen(output), outlen - strlen(output), 
-              ".S%02dE%02d",
-              de->de_episode.ee_season, de->de_episode.ee_episode);
-
-    else if(de->de_episode.ee_episode)
-      snprintf(output + strlen(output), outlen - strlen(output), 
-              ".E%02d",
-              de->de_episode.ee_episode);
+    if(de->de_bcast)  
+      epg_episode_number_format(de->de_bcast->episode,
+                                output + strlen(output),
+                                outlen - strlen(output),
+                                ".", "S%02d", NULL, "E%02d", NULL);
   }
 
   if(cfg->dvr_flags & DVR_CLEAN_TITLE) {
@@ -210,13 +202,10 @@ dvr_make_title(char *output, size_t outlen, dvr_entry_t *de)
         }
   }
 }
-#endif
-
 
 /**
  *
  */
-#if TODO
 static void
 dvr_entry_link(dvr_entry_t *de)
 {
@@ -251,20 +240,17 @@ dvr_entry_link(dvr_entry_t *de)
   }
   htsp_dvr_entry_add(de);
 }
-#endif
-
 
 /**
- *
+ * Create the event
  */
-dvr_entry_t *
-dvr_entry_create(const char *config_name,
-                 channel_t *ch, time_t start, time_t stop, 
-                const char *title, const char *description,
-                const char *creator, dvr_autorec_entry_t *dae,
-                epg_episode_t *ee, uint8_t content_type, dvr_prio_t pri)
+static dvr_entry_t *_dvr_entry_create (
+  const char *config_name, epg_broadcast_t *e,
+  channel_t *ch, time_t start, time_t stop, 
+       const char *title, const char *description,
+       const char *creator, dvr_autorec_entry_t *dae,
+       dvr_prio_t pri)
 {
-#if TODO
   dvr_entry_t *de;
   char tbuf[30];
   struct tm tm;
@@ -297,14 +283,9 @@ dvr_entry_create(const char *config_name,
   de->de_title   = strdup(title);
   de->de_desc    = description ? strdup(description) : NULL;
 
-  if(ee != NULL) {
-    de->de_episode.ee_season  = ee->ee_season;
-    de->de_episode.ee_episode = ee->ee_episode;
-    de->de_episode.ee_part    = ee->ee_part;
-    tvh_str_set(&de->de_episode.ee_onscreen, ee->ee_onscreen);
-  }
-
+#if TODO_GENRE_SUPPORT
   de->de_content_type = content_type;
+#endif
 
   dvr_entry_link(de);
 
@@ -324,52 +305,40 @@ dvr_entry_create(const char *config_name,
   dvrdb_changed();
   dvr_entry_save(de);
   return de;
-#endif
-  return NULL;
 }
 
 
 /**
  *
  */
-#if TODO
-static const char *
-longest_string(const char *a, const char *b)
+dvr_entry_t *
+dvr_entry_create(const char *config_name,
+                 channel_t *ch, time_t start, time_t stop, 
+                const char *title, const char *description,
+                const char *creator, dvr_autorec_entry_t *dae, dvr_prio_t pri)
 {
-  if(b == NULL)
-    return a;
-  if(a == NULL)
-    return b;
-  return strlen(a) > strlen(b) ? a : b;
+  return _dvr_entry_create(config_name, NULL,
+                           ch, start, stop, title, description,
+                           creator, dae, pri);
 }
-#endif
-
 
 /**
  *
  */
 dvr_entry_t *
 dvr_entry_create_by_event(const char *config_name,
-                          event_t *e, const char *creator, 
-                         dvr_autorec_entry_t *dae, dvr_prio_t pri)
+                          epg_broadcast_t *e, const char *creator, 
+                          dvr_autorec_entry_t *dae, dvr_prio_t pri)
 {
-#if TODO
-  const char *desc = NULL;
-  if(e->e_channel == NULL || e->e_title == NULL)
+  if(e->channel == NULL || e->channel->channel || e->episode->title == NULL)
     return NULL;
 
-  // Try to find best description
-
-  desc = longest_string(e->e_desc, e->e_ext_desc);
-  desc = longest_string(desc, e->e_ext_item);
-  desc = longest_string(desc, e->e_ext_text);
-
-  return dvr_entry_create(config_name,
-                          e->e_channel, e->e_start, e->e_stop, 
-                         e->e_title, desc, creator, dae, &e->e_episode,
-                         e->e_content_type, pri);
-#endif
-  return NULL;
+  return _dvr_entry_create(config_name, e,
+                           e->channel->channel, e->start, e->stop,
+                           e->episode->title,
+                           e->episode->description ? e->episode->description
+                                                   : e->episode->summary,
+                           creator, dae, pri);
 }
 
 
@@ -377,7 +346,7 @@ dvr_entry_create_by_event(const char *config_name,
  *
  */
 void
-dvr_entry_create_by_autorec(event_t *e, dvr_autorec_entry_t *dae)
+dvr_entry_create_by_autorec(epg_broadcast_t *e, dvr_autorec_entry_t *dae)
 {
   char buf[200];
 
@@ -396,7 +365,6 @@ dvr_entry_create_by_autorec(event_t *e, dvr_autorec_entry_t *dae)
 void
 dvr_entry_dec_ref(dvr_entry_t *de)
 {
-#if TODO
   lock_assert(&global_lock);
 
   if(de->de_refcnt > 1) {
@@ -413,10 +381,7 @@ dvr_entry_dec_ref(dvr_entry_t *de)
   free(de->de_ititle);
   free(de->de_desc);
 
-  free(de->de_episode.ee_onscreen);
-
   free(de);
-#endif
 }
 
 
@@ -653,19 +618,24 @@ 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 replaced in the EPG
+ *
+ * TODO: I think this will record the title slot event if its now a 
+ *       completely different episode etc...
  */
 void 
-dvr_event_replaced(event_t *e, event_t *new_e)
+dvr_event_replaced(epg_broadcast_t *e, epg_broadcast_t *new_e)
 {
   dvr_entry_t *de, *ude;
+  if ( e == new_e ) return;
 
   de = dvr_entry_find_by_event(e);
   if (de != NULL) {
     ude = dvr_entry_find_by_event_fuzzy(new_e);
     if (ude == NULL && de->de_sched_state == DVR_SCHEDULED)
       dvr_entry_cancel(de);
-    else if(new_e->e_title != NULL)
-      dvr_entry_update(de, new_e->e_title, new_e->e_start, new_e->e_stop);
+    else if(new_e->episode->title != NULL)
+      dvr_entry_update(de, new_e->episode->title, new_e->start, new_e->stop);
+      // TODO: need to actually replace the event?
   }
       
     
@@ -701,20 +671,17 @@ dvr_stop_recording(dvr_entry_t *de, int stopcode)
 /**
  *
  */
-#if TODO
 static void
 dvr_timer_stop_recording(void *aux)
 {
   dvr_stop_recording(aux, 0);
 }
-#endif
 
 
 
 /**
  *
  */
-#if 0
 static void
 dvr_timer_start_recording(void *aux)
 {
@@ -733,7 +700,6 @@ dvr_timer_start_recording(void *aux)
   gtimer_arm_abs(&de->de_timer, dvr_timer_stop_recording, de, 
                 de->de_stop + (60 * de->de_stop_extra));
 }
-#endif
 
 
 /**
@@ -754,14 +720,12 @@ dvr_entry_find_by_id(int id)
  *
  */
 dvr_entry_t *
-dvr_entry_find_by_event(event_t *e)
+dvr_entry_find_by_event(epg_broadcast_t *e)
 {
   dvr_entry_t *de;
 
-  LIST_FOREACH(de, &e->e_channel->ch_dvrs, de_channel_link)
-    if(de->de_start == e->e_start &&
-       de->de_stop  == e->e_stop)
-      return de;
+  LIST_FOREACH(de, &e->channel->channel->ch_dvrs, de_channel_link)
+    if(de->de_bcast == e) return de;
   return NULL;
 }
 
@@ -769,15 +733,15 @@ dvr_entry_find_by_event(event_t *e)
  * Find dvr entry using 'fuzzy' search
  */
 dvr_entry_t *
-dvr_entry_find_by_event_fuzzy(event_t *e)
+dvr_entry_find_by_event_fuzzy(epg_broadcast_t *e)
 {
   dvr_entry_t *de;
   
-  if (e->e_title == NULL)
+  if (e->episode->title == NULL)
     return NULL;
 
-  LIST_FOREACH(de, &e->e_channel->ch_dvrs, de_channel_link)
-    if ((abs(de->de_start - e->e_start) < 600) && (abs(de->de_stop - e->e_stop) < 600)) {
+  LIST_FOREACH(de, &e->channel->channel->ch_dvrs, de_channel_link)
+    if ((abs(de->de_start - e->start) < 600) && (abs(de->de_stop - e->stop) < 600)) {
         return de;
     }
   return NULL;
index 446eff3d8970fee75afb0914cbb4be85ec85a5e9..851f45f6843947bc5ff5e2e98f3e6cd0989e1843 100644 (file)
@@ -441,6 +441,7 @@ build_tag_string(const char *name, const char *value,
 /**
  *
  */
+#if TODO_EP_NUMBER
 static htsbuf_queue_t *
 build_tag_int(const char *name, int value,
              int targettype, const char *targettypename)
@@ -449,6 +450,7 @@ build_tag_int(const char *name, int value,
   snprintf(str, sizeof(str), "%d", value);
   return build_tag_string(name, str, targettype, targettypename);
 }
+#endif
 
 
 /**
@@ -470,7 +472,7 @@ mk_build_metadata(const dvr_entry_t *de)
   htsbuf_queue_t *q = htsbuf_queue_alloc(0);
   char datestr[64];
   struct tm tm;
-#if TODO
+#if TODO_GENRE_SUPPORT
   const char *ctype;
 #endif
   localtime_r(&de->de_start, &tm);
@@ -489,7 +491,7 @@ mk_build_metadata(const dvr_entry_t *de)
   addtag(q, build_tag_string("ORIGINAL_MEDIA_TYPE", "TV", 0, NULL));
 
   
-#if TODO
+#if TODO_GENRE_SUPPORT
   if(de->de_content_type) {
     ctype = epg_content_group_get_name(de->de_content_type);
     if(ctype != NULL)
@@ -500,7 +502,7 @@ mk_build_metadata(const dvr_entry_t *de)
   if(de->de_channel != NULL)
     addtag(q, build_tag_string("TVCHANNEL", de->de_channel->ch_name, 0, NULL));
 
-#if TODO
+#if TODO_EP_NUMBER
   if(de->de_episode.ee_onscreen)
     addtag(q, build_tag_string("SYNOPSIS", 
                               de->de_episode.ee_onscreen, 0, NULL));
@@ -509,7 +511,7 @@ mk_build_metadata(const dvr_entry_t *de)
   if(de->de_desc != NULL)
     addtag(q, build_tag_string("SUMMARY", de->de_desc, 0, NULL));
 
-#if TODO
+#if TODO_EP_NUMBER
   if(de->de_episode.ee_season)
     addtag(q, build_tag_int("PART_NUMBER", de->de_episode.ee_season,
                            60, "SEASON"));
@@ -528,15 +530,16 @@ mk_build_metadata(const dvr_entry_t *de)
 
 
 static htsbuf_queue_t *
-mk_build_metadata2(const event_t *e)
+mk_build_metadata2(const epg_broadcast_t *e)
 {
   htsbuf_queue_t *q = htsbuf_queue_alloc(0);
+  epg_episode_t *ee = e->episode;
   char datestr[64];
   struct tm tm;
-#if TODO
+#if TODO_GENRE_SUPPORT
   const char *ctype;
 #endif
-  localtime_r(&e->e_start, &tm);
+  localtime_r(&e->start, &tm);
 
   snprintf(datestr, sizeof(datestr),
           "%04d-%02d-%02d %02d:%02d:%02d",
@@ -552,7 +555,7 @@ mk_build_metadata2(const event_t *e)
   addtag(q, build_tag_string("ORIGINAL_MEDIA_TYPE", "TV", 0, NULL));
 
   
-#if TODO
+#if TODO_GENRE_SUPPORT
   if(e->e_content_type) {
     ctype = epg_content_group_get_name(e->e_content_type);
     if(ctype != NULL)
@@ -560,19 +563,22 @@ mk_build_metadata2(const event_t *e)
   }
 #endif
 
-  if(e->e_channel != NULL)
-    addtag(q, build_tag_string("TVCHANNEL", e->e_channel->ch_name, 0, NULL));
+  if(e->channel->channel != NULL)
+    addtag(q, build_tag_string("TVCHANNEL", e->channel->channel->ch_name, 0, NULL));
+
+  if(ee->title != NULL)
+    addtag(q, build_tag_string("TITLE", ee->title, 0, NULL));
 
-  if(e->e_title != NULL)
-    addtag(q, build_tag_string("TITLE", e->e_title, 0, NULL));
+  if(ee->description)
+    addtag(q, build_tag_string("SUMMARY", ee->description, 0, NULL));
+  else if(ee->summary)
+    addtag(q, build_tag_string("SUMMARY", ee->summary, 0, NULL));
 
+#if TODO_EP_NUMBER
   if(e->e_episode.ee_onscreen)
     addtag(q, build_tag_string("SYNOPSIS", 
                               e->e_episode.ee_onscreen, 0, NULL));
 
-  if(e->e_desc != NULL)
-    addtag(q, build_tag_string("SUMMARY", e->e_desc, 0, NULL));
-
   if(e->e_episode.ee_season)
     addtag(q, build_tag_int("PART_NUMBER", e->e_episode.ee_season,
                            60, "SEASON"));
@@ -584,6 +590,7 @@ mk_build_metadata2(const event_t *e)
   if(e->e_episode.ee_part)
     addtag(q, build_tag_int("PART_NUMBER", e->e_episode.ee_part,
                            40, "PART"));
+#endif
 
   return q;
 }
@@ -796,7 +803,7 @@ mk_close_cluster(mk_mux_t *mkm)
  *
  */
 int
-mk_mux_append_meta(mk_mux_t *mkm, event_t *e)
+mk_mux_append_meta(mk_mux_t *mkm, epg_broadcast_t *e)
 {
   htsbuf_queue_t q;
 
index f0304351621de73336628e85b8ed5b5bd33ba988..8e0c5912b0e2ed734995b40d599dbfe9d08d04c5 100644 (file)
@@ -38,7 +38,7 @@ mk_mux_t *mk_mux_stream_create(int fd,
 
 int mk_mux_write_pkt(mk_mux_t *mkm, struct th_pkt *pkt);
 
-int mk_mux_append_meta(mk_mux_t *mkm, struct event *e);
+int mk_mux_append_meta(mk_mux_t *mkm, struct epg_broadcast *e);
 
 void mk_mux_close(mk_mux_t *mk_mux);
 
index df519c18526bbee2ac0af6ca42b81673d5e7f8fd..e2a6bd14541e848563a856ef8515b92498628aca 100644 (file)
--- a/src/epg.c
+++ b/src/epg.c
@@ -815,17 +815,26 @@ static void _epg_episode_rem_broadcast
   RB_REMOVE(&episode->broadcasts, broadcast, elink);
 }
 
-int epg_episode_get_number_onscreen
-  ( epg_episode_t *episode, char *buf, int len )
+
+size_t epg_episode_number_format 
+  ( epg_episode_t *episode, char *buf, size_t len,
+    const char *pre,  const char *sfmt,
+    const char *sep,  const char *efmt,
+    const char *cfmt )
 {
-  int i = 0;
+  size_t i = 0;
   if ( episode->number ) {
-    // TODO: add counts
-    if ( episode->season && episode->season->number ) {
-      i += snprintf(&buf[i], len-i, "Season %d ",
-                    episode->season->number);
+    if (pre) i += snprintf(&buf[i], len-i, "%s", pre);
+    if ( sfmt && episode->season && episode->season->number ) {
+      i += snprintf(&buf[i], len-i, sfmt, episode->season->number);
+      if ( cfmt && episode->brand && episode->brand->season_count )
+        i += snprintf(&buf[i], len-i, cfmt,
+                      episode->brand->season_count);
+      if (sep) i += snprintf(&buf[i], len-i, "%s", sep);
     }
-    i += snprintf(&buf[i], len-i, "Episode %d", episode->number);
+    i += snprintf(&buf[i], len-i, efmt, episode->number);
+    if ( cfmt && episode->season && episode->season->episode_count)
+      i+= snprintf(&buf[i], len-i, cfmt, episode->season->episode_count);
   }
   return i;
 }
index a68acc607b2bc477099e6ebbe0c54c6a23ff37e2..0137852d610a7d00025140bc488718641ad69c4c 100644 (file)
--- a/src/epg.h
+++ b/src/epg.h
@@ -200,8 +200,21 @@ int epg_episode_set_brand        ( epg_episode_t *e, epg_brand_t *b )
 int epg_episode_set_season       ( epg_episode_t *e, epg_season_t *s )
   __attribute__((warn_unused_result));
 
-/* Acessors */
-int epg_episode_get_number_onscreen ( epg_episode_t *e, char *b, int c );
+/* EpNum format helper */
+// output string will be:
+// if (episode_num) 
+//   ret = pre
+//   if (season_num) ret += sprintf(sfmt, season_num)
+//   if (season_cnt && cnt) ret += sprintf(cnt, season_cnt)
+//   ret += sep
+//   ret += sprintf(efmt, episode_num)
+//   if (episode_cnt) ret += sprintf(cfmt, episode_cnt)
+// and will return num chars written
+size_t epg_episode_number_format 
+  ( epg_episode_t *e, char *buf, size_t len,
+    const char *pre,  const char *sfmt,
+    const char *sep,  const char *efmt,
+    const char *cfmt );
 
 /* Serialization */
 htsmsg_t      *epg_episode_serialize   ( epg_episode_t *b );
@@ -342,7 +355,8 @@ void epg_updated (void);
  * Compatibility code
  * ***********************************************************************/
 
-#ifndef TODO_REMOVE_EPG_COMPAT 
+//#define TODO_EPG_COMPAT
+#ifdef TODO_EPG_COMPAT
 
 typedef struct _epg_episode {
 
index a82feaeebc12b189efafd0bd2a596d6314c6de36..91211deb8821e8cd07fd76a92f87ee76e580c396 100644 (file)
@@ -104,8 +104,6 @@ LIST_HEAD(th_subscription_list, th_subscription);
 RB_HEAD(channel_tree, channel);
 TAILQ_HEAD(channel_queue, channel);
 LIST_HEAD(channel_list, channel);
-LIST_HEAD(event_list, event);
-RB_HEAD(event_tree, event);
 LIST_HEAD(dvr_config_list, dvr_config);
 LIST_HEAD(dvr_entry_list, dvr_entry);
 TAILQ_HEAD(ref_update_queue, ref_update);
index f1b07f032d1af771bb2b67a3ec7f04a2b6e6a355..7e87d59f53a8b659f4fe7b6edf3dd7b7081b531a 100644 (file)
@@ -728,19 +728,8 @@ extjs_epg(http_connection_t *hc, const char *remain, void *opaque)
     else if(ee->summary != NULL)
       htsmsg_add_str(m, "description", ee->summary);
 
-    if (epg_episode_get_number_onscreen(ee, buf, 100))
-      htsmsg_add_str(m, "episode", strdup(buf));
-
-#if TODO_REMOVE_THIS_QQ
-    if(e->e_ext_desc != NULL)
-      htsmsg_add_str(m, "ext_desc", e->e_ext_desc);
-
-    if(e->e_ext_item != NULL)
-      htsmsg_add_str(m, "ext_item", e->e_ext_item);
-
-    if(e->e_ext_text != NULL)
-      htsmsg_add_str(m, "ext_text", e->e_ext_text);
-#endif
+    if (epg_episode_number_format(ee, buf, 100, NULL, "Season %d", ".", "Episode %d", "/%d"))
+      htsmsg_add_str(m, "episode", buf);
 
     htsmsg_add_u32(m, "id", e->_.id);
     htsmsg_add_u32(m, "start", e->start);
@@ -752,11 +741,9 @@ extjs_epg(http_connection_t *hc, const char *remain, void *opaque)
       htsmsg_add_str(m, "contentgrp", s);
 #endif
 
-#if TODO_UPDATE_DVR_CODE
     dvr_entry_t *de;
     if((de = dvr_entry_find_by_event(e)) != NULL)
       htsmsg_add_str(m, "schedstate", dvr_entry_schedstatus(de));
-#endif
 
     htsmsg_add_msg(array, NULL, m);
   }
@@ -824,8 +811,8 @@ extjs_epgrelated(http_connection_t *hc, const char *remain, void *opaque)
             htsmsg_add_str(m, "uri", ee2->_.uri);
             htsmsg_add_str(m, "title", ee2->title);
             if (ee2->subtitle) htsmsg_add_str(m, "title", ee2->subtitle);
-            if (epg_episode_get_number_onscreen(ee2, buf, 100))
-              htsmsg_add_str(m, "episode", strdup(buf));
+            if (epg_episode_number_format(ee, buf, 100, NULL, "Season %d", ".", "Episode %d", "/%d"))
+              htsmsg_add_str(m, "episode", buf);
             htsmsg_add_msg(array, NULL, m);
           }
         } else if (ee->season) {
@@ -837,8 +824,8 @@ extjs_epgrelated(http_connection_t *hc, const char *remain, void *opaque)
             htsmsg_add_str(m, "uri", ee2->_.uri);
             htsmsg_add_str(m, "title", ee2->title);
             if (ee2->subtitle) htsmsg_add_str(m, "title", ee2->subtitle);
-            if (epg_episode_get_number_onscreen(ee2, buf, 100))
-              htsmsg_add_str(m, "episode", strdup(buf));
+            if (epg_episode_number_format(ee, buf, 100, NULL, "Season %d", ".", "Episode %d", "/%d"))
+              htsmsg_add_str(m, "episode", buf);
             htsmsg_add_msg(array, NULL, m);
           }
         }
@@ -864,11 +851,11 @@ extjs_dvr(http_connection_t *hc, const char *remain, void *opaque)
   htsbuf_queue_t *hq = &hc->hc_reply;
   const char *op = http_arg_get(&hc->hc_req_args, "op");
   htsmsg_t *out, *r;
-  //TODO:event_t *e;
   dvr_entry_t *de;
   const char *s;
   int flags = 0;
   dvr_config_t *cfg;
+  epg_broadcast_t *e;
 
   if(op == NULL)
     op = "loadSettings";
@@ -882,11 +869,10 @@ extjs_dvr(http_connection_t *hc, const char *remain, void *opaque)
 
   if(!strcmp(op, "recordEvent")) {
 
-#if TODO_DVR
     const char *config_name = http_arg_get(&hc->hc_req_args, "config_name");
 
     s = http_arg_get(&hc->hc_req_args, "eventId");
-    if((e = epg_event_find_by_id(atoi(s))) == NULL) {
+    if((e = epg_broadcast_find_by_id(atoi(s), NULL)) == NULL) {
       pthread_mutex_unlock(&global_lock);
       return HTTP_STATUS_BAD_REQUEST;
     }
@@ -906,7 +892,6 @@ extjs_dvr(http_connection_t *hc, const char *remain, void *opaque)
 
     dvr_entry_create_by_event(config_name,
                               e, hc->hc_representative, NULL, DVR_PRIO_NORMAL);
-#endif
 
     out = htsmsg_create_map();
     htsmsg_add_u32(out, "success", 1);
@@ -990,13 +975,13 @@ extjs_dvr(http_connection_t *hc, const char *remain, void *opaque)
 
     dvr_entry_create(config_name,
                      ch, start, stop, title, NULL, hc->hc_representative, 
-                    NULL, NULL, 0, dvr_pri2val(pri));
+                                NULL, dvr_pri2val(pri));
 
     out = htsmsg_create_map();
     htsmsg_add_u32(out, "success", 1);
 
   } else if(!strcmp(op, "createAutoRec")) {
-#if TODO_DVR
+#if TODO_DVR_AUTOREC
     const char *cgrp = http_arg_get(&hc->hc_req_args, "contentgrp");
 
     
index d43eadaa1cd7a9a6a3e8adc95a58ee3ed2730802..7733becc2813db91c48511a3d0f0eebf82d7747d 100644 (file)
@@ -209,7 +209,6 @@ page_einfo(http_connection_t *hc, const char *remain, void *opaque)
     return 404;
   }
 
-#if TODO_DVR
   de = dvr_entry_find_by_event(e);
 
   if((http_arg_get(&hc->hc_req_args, "rec")) != NULL) {
@@ -218,7 +217,6 @@ page_einfo(http_connection_t *hc, const char *remain, void *opaque)
   } else if(de != NULL && (http_arg_get(&hc->hc_req_args, "cancel")) != NULL) {
     de = dvr_entry_cancel(de);
   }
-#endif
 
   htsbuf_qprintf(hq, "<html>");
   htsbuf_qprintf(hq, "<body>");