From: Jaroslav Kysela Date: Mon, 26 Oct 2015 20:28:49 +0000 (+0100) Subject: DVR: added re-record button to webui, fixes #3203 X-Git-Tag: v4.2.1~1761 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=c3681f1e87b252cf5498fe94affbfbed9fcfa7b4;p=thirdparty%2Ftvheadend.git DVR: added re-record button to webui, fixes #3203 --- diff --git a/src/api/api_dvr.c b/src/api/api_dvr.c index 6586cd22b..bfd2aef82 100644 --- a/src/api/api_dvr.c +++ b/src/api/api_dvr.c @@ -254,6 +254,45 @@ api_dvr_entry_create_by_event return !count ? EINVAL : 0; } +static void +api_dvr_rerecord_toggle(access_t *perm, idnode_t *self) +{ + dvr_entry_set_rerecord((dvr_entry_t *)self, -1); +} + +static int +api_dvr_entry_rerecord_toggle + ( access_t *perm, void *opaque, const char *op, htsmsg_t *args, htsmsg_t **resp ) +{ + return api_idnode_handler(perm, args, resp, api_dvr_rerecord_toggle, "rerecord"); +} + +static void +api_dvr_rerecord_deny(access_t *perm, idnode_t *self) +{ + dvr_entry_set_rerecord((dvr_entry_t *)self, 0); +} + +static int +api_dvr_entry_rerecord_deny + ( access_t *perm, void *opaque, const char *op, htsmsg_t *args, htsmsg_t **resp ) +{ + return api_idnode_handler(perm, args, resp, api_dvr_rerecord_deny, "rerecord"); +} + +static void +api_dvr_rerecord_allow(access_t *perm, idnode_t *self) +{ + dvr_entry_set_rerecord((dvr_entry_t *)self, 1); +} + +static int +api_dvr_entry_rerecord_allow + ( access_t *perm, void *opaque, const char *op, htsmsg_t *args, htsmsg_t **resp ) +{ + return api_idnode_handler(perm, args, resp, api_dvr_rerecord_allow, "rerecord"); +} + static void api_dvr_stop(access_t *perm, idnode_t *self) { @@ -424,6 +463,9 @@ void api_dvr_init ( void ) { "dvr/entry/grid_failed", ACCESS_RECORDER, api_idnode_grid, api_dvr_entry_grid_failed }, { "dvr/entry/create", ACCESS_RECORDER, api_dvr_entry_create, NULL }, { "dvr/entry/create_by_event", ACCESS_RECORDER, api_dvr_entry_create_by_event, NULL }, + { "dvr/entry/rerecord/toggle", ACCESS_RECORDER, api_dvr_entry_rerecord_toggle, NULL }, + { "dvr/entry/rerecord/deny", ACCESS_RECORDER, api_dvr_entry_rerecord_deny, NULL }, + { "dvr/entry/rerecord/allow", ACCESS_RECORDER, api_dvr_entry_rerecord_allow, NULL }, { "dvr/entry/stop", ACCESS_RECORDER, api_dvr_entry_stop, NULL }, { "dvr/entry/cancel", ACCESS_RECORDER, api_dvr_entry_cancel, NULL }, diff --git a/src/dvr/dvr.h b/src/dvr/dvr.h index 90e46bc9b..e1c2f289d 100644 --- a/src/dvr/dvr.h +++ b/src/dvr/dvr.h @@ -514,6 +514,8 @@ const char *dvr_get_filename(dvr_entry_t *de); int64_t dvr_get_filesize(dvr_entry_t *de); +void dvr_entry_set_rerecord(dvr_entry_t *de, int cmd); + dvr_entry_t *dvr_entry_stop(dvr_entry_t *de); dvr_entry_t *dvr_entry_cancel(dvr_entry_t *de, int rerecord); diff --git a/src/dvr/dvr_db.c b/src/dvr/dvr_db.c index c64b53172..fc18735bc 100644 --- a/src/dvr/dvr_db.c +++ b/src/dvr/dvr_db.c @@ -476,8 +476,12 @@ dvr_entry_schedstatus(dvr_entry_t *de) s = "completedRerecord"; break; case DVR_MISSED_TIME: - s = de->de_last_error == SM_CODE_SVC_NOT_ENABLED ? - "completedWarning" : "completedError"; + s = "completedError"; + if (de->de_last_error == SM_CODE_SVC_NOT_ENABLED) + s = "completedWarning"; + rerecord = de->de_dont_rerecord ? 0 : dvr_entry_get_rerecord_errors(de); + if(rerecord) + s = "completedRerecord"; break; default: s = "unknown"; @@ -2935,6 +2939,26 @@ dvr_entry_delete(dvr_entry_t *de, int no_missed_time_resched) dvr_entry_missed_time(de, de->de_last_error); } +/** + * + */ +void +dvr_entry_set_rerecord(dvr_entry_t *de, int cmd) +{ + if (cmd < 0) { /* toggle */ + if (de->de_parent) return; + cmd = de->de_dont_rerecord ? 1 : 0; + } + if (cmd == 0 && !de->de_dont_rerecord) { + de->de_dont_rerecord = 1; + if (de->de_child) + dvr_entry_cancel_delete(de->de_child, 0); + } else { + de->de_dont_rerecord = 0; + dvr_entry_rerecord(de); + } +} + /** * */ @@ -2962,14 +2986,15 @@ dvr_entry_cancel(dvr_entry_t *de, int rerecord) case DVR_RECORDING: de->de_dont_reschedule = 1; dvr_stop_recording(de, SM_CODE_ABORTED, 1, 0); - return de; + break; case DVR_SCHEDULED: case DVR_COMPLETED: case DVR_MISSED_TIME: case DVR_NOSTATE: dvr_entry_destroy(de, 1); - return NULL; + de = NULL; + break; default: abort(); @@ -2981,6 +3006,8 @@ dvr_entry_cancel(dvr_entry_t *de, int rerecord) else dvr_entry_rerecord(parent); } + + return de; } /** diff --git a/src/webui/static/app/dvr.js b/src/webui/static/app/dvr.js index 67757a44b..3de06541b 100644 --- a/src/webui/static/app/dvr.js +++ b/src/webui/static/app/dvr.js @@ -314,10 +314,40 @@ tvheadend.dvr_finished = function(panel, index) { } }; + var rerecordButton = { + name: 'rerecord', + builder: function() { + return new Ext.Toolbar.Button({ + tooltip: _('Toggle re-record functionality'), + iconCls: 'rerecord', + text: _('Re-record'), + disabled: true + }); + }, + callback: function(conf, e, store, select) { + var r = select.getSelections(); + if (r && r.length > 0) { + var uuids = []; + for (var i = 0; i < r.length; i++) + uuids.push(r[i].id); + tvheadend.Ajax({ + url: 'api/dvr/entry/rerecord/toggle', + params: { + uuid: Ext.encode(uuids) + }, + success: function(d) { + store.reload(); + } + }); + } + } + }; + function selected(s, abuttons) { var r = s.getSelections(); var b = r.length > 0 && r[0].data.filesize > 0; abuttons.download.setDisabled(!b); + abuttons.rerecord.setDisabled(!b); } tvheadend.idnode_grid(panel, { @@ -359,7 +389,7 @@ tvheadend.dvr_finished = function(panel, index) { '?title=' + encodeURIComponent(title) + '">' + _('Play') + ''; } }], - tbar: [downloadButton], + tbar: [downloadButton, rerecordButton], selected: selected, help: function() { new tvheadend.help(_('DVR - Finished Recordings'), 'dvr_finished.html'); @@ -395,10 +425,40 @@ tvheadend.dvr_failed = function(panel, index) { } }; + var rerecordButton = { + name: 'rerecord', + builder: function() { + return new Ext.Toolbar.Button({ + tooltip: _('Toggle re-record functionality'), + iconCls: 'rerecord', + text: _('Re-record'), + disabled: true + }); + }, + callback: function(conf, e, store, select) { + var r = select.getSelections(); + if (r && r.length > 0) { + var uuids = []; + for (var i = 0; i < r.length; i++) + uuids.push(r[i].id); + tvheadend.Ajax({ + url: 'api/dvr/entry/rerecord/toggle', + params: { + uuid: Ext.encode(uuids) + }, + success: function(d) { + store.reload(); + } + }); + } + } + }; + function selected(s, abuttons) { var r = s.getSelections(); var b = r.length > 0 && r[0].data.filesize > 0; abuttons.download.setDisabled(!b); + abuttons.rerecord.setDisabled(r.length <= 0); } tvheadend.idnode_grid(panel, { @@ -440,7 +500,7 @@ tvheadend.dvr_failed = function(panel, index) { '?title=' + encodeURIComponent(title) + '">' + _('Play') + ''; } }], - tbar: [downloadButton], + tbar: [downloadButton, rerecordButton], selected: selected, help: function() { new tvheadend.help(_('DVR - Failed Recordings'), 'dvr_failed.html'); diff --git a/src/webui/static/app/ext.css b/src/webui/static/app/ext.css index d365c334e..eb9d083e0 100644 --- a/src/webui/static/app/ext.css +++ b/src/webui/static/app/ext.css @@ -348,6 +348,10 @@ background-image: url(../icons/rec.png) !important; } +.rerecord { + background-image: url(../icons/arrow_branch.png) !important; +} + .bullet_add { background-image: url(../icons/bullet_add.png) !important; }