From f6ee30c3c6a88953d5a17c330f6b257079801369 Mon Sep 17 00:00:00 2001 From: Kristofer Karlsson Date: Fri, 25 Jan 2013 09:00:28 +0100 Subject: [PATCH] Keep recordings when channel is deleted When a channel is deleted, don't delete all existing recordings. --- src/channels.c | 1 - src/dvr/dvr.h | 4 ++++ src/dvr/dvr_db.c | 23 +++++++++++++---------- src/dvr/dvr_rec.c | 4 ++-- src/htsp_server.c | 3 ++- src/webui/extjs.c | 2 +- src/webui/simpleui.c | 2 +- 7 files changed, 23 insertions(+), 16 deletions(-) diff --git a/src/channels.c b/src/channels.c index 970da8e6..bf085b0a 100644 --- a/src/channels.c +++ b/src/channels.c @@ -114,7 +114,6 @@ chidcmp(const channel_t *a, const channel_t *b) return a->ch_id - b->ch_id; } - /** * */ diff --git a/src/dvr/dvr.h b/src/dvr/dvr.h index 0e56c468..03d1d9ce 100644 --- a/src/dvr/dvr.h +++ b/src/dvr/dvr.h @@ -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 diff --git a/src/dvr/dvr_db.c b/src/dvr/dvr_db.c index b7c66d68..ff792556 100644 --- a/src/dvr/dvr_db.c +++ b/src/dvr/dvr_db.c @@ -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); + } } /** diff --git a/src/dvr/dvr_rec.c b/src/dvr/dvr_rec.c index 39b929e7..d1db2734 100644 --- a/src/dvr/dvr_rec.c +++ b/src/dvr/dvr_rec.c @@ -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 */ diff --git a/src/htsp_server.c b/src/htsp_server.c index a487a1d1..ad7bb1a3 100644 --- a/src/htsp_server.c +++ b/src/htsp_server.c @@ -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); diff --git a/src/webui/extjs.c b/src/webui/extjs.c index f6b33c7c..8f1be797 100644 --- a/src/webui/extjs.c +++ b/src/webui/extjs.c @@ -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); diff --git a/src/webui/simpleui.c b/src/webui/simpleui.c index faabaf8d..1601ab18 100644 --- a/src/webui/simpleui.c +++ b/src/webui/simpleui.c @@ -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, "
\"%s\": \"%s\"

", - 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
", rstatus);