diff --git a/docs/html/config_dvr.html b/docs/html/config_dvr.html
index 05d6b8cc..2b72e8a0 100644
--- a/docs/html/config_dvr.html
+++ b/docs/html/config_dvr.html
@@ -74,6 +74,10 @@
If checked, media containers that support metadata will be tagged with
the metadata associated with the event being recorded.
+ Skip commercials
+ If checked, commercials will be dropped from the recordings. At the
+ moment, commercial detection only works for the swedish channel TV4.
+
Post-processor command
Command to run after finishing a recording. The command will be
run in background and is executed even if a recording is aborted
diff --git a/src/dvr/dvr.h b/src/dvr/dvr.h
index 9cbfacf6..4c2174aa 100644
--- a/src/dvr/dvr.h
+++ b/src/dvr/dvr.h
@@ -65,6 +65,7 @@ extern struct dvr_entry_list dvrentries;
#define DVR_EPISODE_IN_TITLE 0x80
#define DVR_CLEAN_TITLE 0x100
#define DVR_TAG_FILES 0x200
+#define DVR_SKIP_COMMERCIALS 0x400
typedef enum {
DVR_PRIO_IMPORTANT,
diff --git a/src/dvr/dvr_db.c b/src/dvr/dvr_db.c
index 627ef426..1b4edf2d 100644
--- a/src/dvr/dvr_db.c
+++ b/src/dvr/dvr_db.c
@@ -1000,6 +1000,9 @@ dvr_init(void)
if(!htsmsg_get_u32(m, "tag-files", &u32) && !u32)
cfg->dvr_flags &= ~DVR_TAG_FILES;
+ if(!htsmsg_get_u32(m, "skip-commercials", &u32) && !u32)
+ cfg->dvr_flags &= ~DVR_SKIP_COMMERCIALS;
+
tvh_str_set(&cfg->dvr_postproc, htsmsg_get_str(m, "postproc"));
}
@@ -1095,7 +1098,7 @@ dvr_config_create(const char *name)
cfg->dvr_config_name = strdup(name);
cfg->dvr_retention_days = 31;
cfg->dvr_mc = MC_MATROSKA;
- cfg->dvr_flags = DVR_TAG_FILES;
+ cfg->dvr_flags = DVR_TAG_FILES | DVR_SKIP_COMMERCIALS;
/* series link support */
cfg->dvr_sl_brand_lock = 1; // use brand linking
@@ -1160,6 +1163,7 @@ dvr_save(dvr_config_t *cfg)
htsmsg_add_u32(m, "episode-in-title", !!(cfg->dvr_flags & DVR_EPISODE_IN_TITLE));
htsmsg_add_u32(m, "clean-title", !!(cfg->dvr_flags & DVR_CLEAN_TITLE));
htsmsg_add_u32(m, "tag-files", !!(cfg->dvr_flags & DVR_TAG_FILES));
+ htsmsg_add_u32(m, "skip-commercials", !!(cfg->dvr_flags & DVR_SKIP_COMMERCIALS));
if(cfg->dvr_postproc != NULL)
htsmsg_add_str(m, "postproc", cfg->dvr_postproc);
diff --git a/src/dvr/dvr_rec.c b/src/dvr/dvr_rec.c
index 2f30bfb2..d933c195 100755
--- a/src/dvr/dvr_rec.c
+++ b/src/dvr/dvr_rec.c
@@ -398,11 +398,13 @@ static void *
dvr_thread(void *aux)
{
dvr_entry_t *de = aux;
+ dvr_config_t *cfg = dvr_config_find_by_name_default(de->de_config_name);
streaming_queue_t *sq = &de->de_sq;
streaming_message_t *sm;
th_pkt_t *pkt;
int run = 1;
int started = 0;
+ int comm_skip = (cfg->dvr_flags & DVR_SKIP_COMMERCIALS);
pthread_mutex_lock(&sq->sq_mutex);
@@ -423,7 +425,7 @@ dvr_thread(void *aux)
pkt = sm->sm_data;
if(pkt->pkt_commercial == COMMERCIAL_YES) {
dvr_rec_set_state(de, DVR_RS_COMMERCIAL, 0);
- tsfix_set_comm_skip(de->de_tsfix, 1);
+ tsfix_set_comm_skip(de->de_tsfix, comm_skip);
} else {
dvr_rec_set_state(de, DVR_RS_RUNNING, 0);
tsfix_set_comm_skip(de->de_tsfix, 0);
diff --git a/src/webui/extjs.c b/src/webui/extjs.c
index deca304b..88496e6f 100644
--- a/src/webui/extjs.c
+++ b/src/webui/extjs.c
@@ -1211,6 +1211,7 @@ extjs_dvr(http_connection_t *hc, const char *remain, void *opaque)
htsmsg_add_u32(r, "episodeInTitle", !!(cfg->dvr_flags & DVR_EPISODE_IN_TITLE));
htsmsg_add_u32(r, "cleanTitle", !!(cfg->dvr_flags & DVR_CLEAN_TITLE));
htsmsg_add_u32(r, "tagFiles", !!(cfg->dvr_flags & DVR_TAG_FILES));
+ htsmsg_add_u32(r, "commSkip", !!(cfg->dvr_flags & DVR_SKIP_COMMERCIALS));
out = json_single_record(r, "dvrSettings");
@@ -1261,6 +1262,9 @@ extjs_dvr(http_connection_t *hc, const char *remain, void *opaque)
flags |= DVR_EPISODE_IN_TITLE;
if(http_arg_get(&hc->hc_req_args, "tagFiles") != NULL)
flags |= DVR_TAG_FILES;
+ if(http_arg_get(&hc->hc_req_args, "commSkip") != NULL)
+ flags |= DVR_SKIP_COMMERCIALS;
+
dvr_flags_set(cfg,flags);
diff --git a/src/webui/static/app/dvr.js b/src/webui/static/app/dvr.js
index 564eab3a..fa7d4041 100644
--- a/src/webui/static/app/dvr.js
+++ b/src/webui/static/app/dvr.js
@@ -703,7 +703,7 @@ tvheadend.dvrsettings = function() {
}, [ 'storage', 'postproc', 'retention', 'dayDirs', 'channelDirs',
'channelInTitle', 'container', 'dateInTitle', 'timeInTitle',
'preExtraTime', 'postExtraTime', 'whitespaceInTitle', 'titleDirs',
- 'episodeInTitle', 'cleanTitle', 'tagFiles' ]);
+ 'episodeInTitle', 'cleanTitle', 'tagFiles', 'commSkip' ]);
var confcombo = new Ext.form.ComboBox({
store : tvheadend.configNames,
@@ -793,6 +793,9 @@ tvheadend.dvrsettings = function() {
}), new Ext.form.Checkbox({
fieldLabel : 'Tag files with metadata',
name : 'tagFiles'
+ }), new Ext.form.Checkbox({
+ fieldLabel : 'Skip commercials',
+ name : 'commSkip'
}), {
width : 300,
fieldLabel : 'Post-processor command',