]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
Keep recordings when channel is deleted 236/head
authorKristofer Karlsson <kristofer.karlsson@gmail.com>
Fri, 25 Jan 2013 08:00:28 +0000 (09:00 +0100)
committerKristofer Karlsson <kristofer.karlsson@gmail.com>
Fri, 25 Jan 2013 08:04:50 +0000 (09:04 +0100)
When a channel is deleted, don't delete all existing recordings.

src/channels.c
src/dvr/dvr.h
src/dvr/dvr_db.c
src/dvr/dvr_rec.c
src/htsp_server.c
src/webui/extjs.c
src/webui/simpleui.c

index 970da8e64a432dbebc4d493f7a4e32d66c89de37..bf085b0a1c9def6f3305e434f0dd1dca814a14b5 100644 (file)
@@ -114,7 +114,6 @@ chidcmp(const channel_t *a, const channel_t *b)
   return a->ch_id - b->ch_id;
 }
 
-
 /**
  *
  */
index 0e56c46812ab278e32b7ad6c1e2d82c6f97b0f40..03d1d9ce318197edc4bfb9dc8081b344a89a85b4 100644 (file)
@@ -114,6 +114,8 @@ typedef struct dvr_entry {
   channel_t *de_channel;
   LIST_ENTRY(dvr_entry) de_channel_link;
 
+  char *de_channel_name;
+
   gtimer_t de_timer;
 
   /**
@@ -198,6 +200,8 @@ typedef struct dvr_entry {
 
 } dvr_entry_t;
 
+#define DVR_CH_NAME(e) ((e)->de_channel_name == NULL ? (e)-> de_channel->ch_name : (e)->de_channel_name)
+
 
 /**
  * Autorec entry
index b7c66d68b18cd1612171a3691ab6ba37d52074c0..ff792556d4b45f2b6fd8f620a4064e463136ba89 100644 (file)
@@ -174,7 +174,7 @@ dvr_make_title(char *output, size_t outlen, dvr_entry_t *de)
   dvr_config_t *cfg = dvr_config_find_by_name_default(de->de_config_name);
 
   if(cfg->dvr_flags & DVR_CHANNEL_IN_TITLE)
-    snprintf(output, outlen, "%s-", de->de_channel->ch_name);
+    snprintf(output, outlen, "%s-", DVR_CH_NAME(de));
   else
     output[0] = 0;
   
@@ -335,7 +335,7 @@ static dvr_entry_t *_dvr_entry_create (
 
   tvhlog(LOG_INFO, "dvr", "\"%s\" on \"%s\" starting at %s, "
         "scheduled for recording by \"%s\"",
-        lang_str_get(de->de_title, NULL), de->de_channel->ch_name, tbuf, creator);
+        lang_str_get(de->de_title, NULL), DVR_CH_NAME(de), tbuf, creator);
         
   dvrdb_changed();
   dvr_entry_save(de);
@@ -458,6 +458,7 @@ dvr_entry_remove(dvr_entry_t *de)
   LIST_REMOVE(de, de_channel_link);
   LIST_REMOVE(de, de_global_link);
   de->de_channel = NULL;
+  free(de->de_channel_name);
 
   dvrdb_changed();
 
@@ -486,7 +487,7 @@ dvr_db_load_one(htsmsg_t *c, int id)
 
   if((s = htsmsg_get_str(c, "channel")) == NULL)
     return;
-  if((ch = channel_find_by_name(s, 0, 0)) == NULL)
+  if((ch = channel_find_by_name(s, 0, 1)) == NULL)
     return;
 
   s = htsmsg_get_str(c, "config_name");
@@ -596,7 +597,7 @@ dvr_entry_save(dvr_entry_t *de)
 
   lock_assert(&global_lock);
 
-  htsmsg_add_str(m, "channel", de->de_channel->ch_name);
+  htsmsg_add_str(m, "channel", DVR_CH_NAME(de));
   htsmsg_add_u32(m, "start", de->de_start);
   htsmsg_add_u32(m, "stop", de->de_stop);
  
@@ -715,7 +716,7 @@ static dvr_entry_t *_dvr_entry_update
     htsp_dvr_entry_update(de);
     dvr_entry_notify(de);
     tvhlog(LOG_INFO, "dvr", "\"%s\" on \"%s\": Updated Timer",
-           lang_str_get(de->de_title, NULL), de->de_channel->ch_name);
+           lang_str_get(de->de_title, NULL), DVR_CH_NAME(de));
   }
 
   return de;
@@ -781,7 +782,7 @@ dvr_stop_recording(dvr_entry_t *de, int stopcode)
 
   tvhlog(LOG_INFO, "dvr", "\"%s\" on \"%s\": "
         "End of program: %s",
-        lang_str_get(de->de_title, NULL), de->de_channel->ch_name,
+        lang_str_get(de->de_title, NULL), DVR_CH_NAME(de),
         dvr_entry_status(de));
 
   dvr_entry_save(de);
@@ -816,7 +817,7 @@ dvr_timer_start_recording(void *aux)
   de->de_rec_state = DVR_RS_PENDING;
 
   tvhlog(LOG_INFO, "dvr", "\"%s\" on \"%s\" recorder starting",
-        lang_str_get(de->de_title, NULL), de->de_channel->ch_name);
+        lang_str_get(de->de_title, NULL), DVR_CH_NAME(de));
 
   dvr_entry_notify(de);
   htsp_dvr_entry_update(de);
@@ -929,8 +930,6 @@ dvr_entry_purge(dvr_entry_t *de)
 {
   if(de->de_sched_state == DVR_RECORDING)
     dvr_stop_recording(de, SM_CODE_SOURCE_DELETED);
-
-  dvr_entry_remove(de);
 }
 
 /**
@@ -941,8 +940,12 @@ dvr_destroy_by_channel(channel_t *ch)
 {
   dvr_entry_t *de;
 
-  while((de = LIST_FIRST(&ch->ch_dvrs)) != NULL)
+  while((de = LIST_FIRST(&ch->ch_dvrs)) != NULL) {
+    LIST_REMOVE(de, de_channel_link);
+    de->de_channel = NULL;
+    de->de_channel_name = strdup(ch->ch_name);
     dvr_entry_purge(de);
+  }
 }
 
 /**
index 39b929e79a93f61e8dffa45745a3aa59348543fe..d1db2734accf3b37a91af9267621626e1a8b142b 100644 (file)
@@ -176,7 +176,7 @@ pvr_generate_filename(dvr_entry_t *de, const streaming_start_t *ss)
 
   if(cfg->dvr_flags & DVR_DIR_PER_CHANNEL) {
 
-    char *chname = strdup(de->de_channel->ch_name);
+    char *chname = strdup(DVR_CH_NAME(de));
     cleanupfilename(chname,cfg->dvr_flags);
     snprintf(path + strlen(path), sizeof(path) - strlen(path), 
             "/%s", chname);
@@ -588,7 +588,7 @@ dvr_spawn_postproc(dvr_entry_t *de, const char *dvr_postproc)
   memset(fmap, 0, sizeof(fmap));
   fmap['f'] = de->de_filename; /* full path to recoding */
   fmap['b'] = basename(fbasename); /* basename of recoding */
-  fmap['c'] = de->de_channel->ch_name; /* channel name */
+  fmap['c'] = DVR_CH_NAME(de); /* channel name */
   fmap['C'] = de->de_creator; /* user who created this recording */
   fmap['t'] = lang_str_get(de->de_title, NULL); /* program title */
   fmap['d'] = lang_str_get(de->de_desc, NULL); /* program description */
index a487a1d1a9591be27516ef3d0b5804de76329da4..ad7bb1a3c72db2083dd5cfc1d01358628afe2639 100644 (file)
@@ -557,7 +557,8 @@ htsp_build_dvrentry(dvr_entry_t *de, const char *method)
   dvr_config_t *cfg;
 
   htsmsg_add_u32(out, "id", de->de_id);
-  htsmsg_add_u32(out, "channel", de->de_channel->ch_id);
+  if (de->de_channel)
+    htsmsg_add_u32(out, "channel", de->de_channel->ch_id);
 
   htsmsg_add_s64(out, "start", de->de_start);
   htsmsg_add_s64(out, "stop", de->de_stop);
index f6b33c7c150f9ba096f648be2262aa30f767fa2a..8f1be79797e6290555eea6c92b3856caa8b9536e 100644 (file)
@@ -1389,8 +1389,8 @@ extjs_dvrlist(http_connection_t *hc, const char *remain, void *opaque,
 
     m = htsmsg_create_map();
 
+    htsmsg_add_str(m, "channel", DVR_CH_NAME(de));
     if(de->de_channel != NULL) {
-      htsmsg_add_str(m, "channel", de->de_channel->ch_name);
       if (de->de_channel->ch_icon)
         htsmsg_add_imageurl(m, "chicon", "imagecache/%d",
                             de->de_channel->ch_icon);
index faabaf8d9bb425f674d689c2fa31c3e81e1a0eb3..1601ab18d327e63ac2bb22b90ea2d116ad3976b4 100644 (file)
@@ -322,7 +322,7 @@ page_pvrinfo(http_connection_t *hc, const char *remain, void *opaque)
              a.tm_hour, a.tm_min, b.tm_hour, b.tm_min);
 
   htsbuf_qprintf(hq, "<hr><b>\"%s\": \"%s\"</b><br><br>",
-             de->de_channel->ch_name, lang_str_get(de->de_title, NULL));
+             DVR_CH_NAME(de), lang_str_get(de->de_title, NULL));
   
   if((rstatus = val2str(de->de_sched_state, recstatustxt)) != NULL)
     htsbuf_qprintf(hq, "Recording status: %s<br>", rstatus);