From: Jaroslav Kysela Date: Tue, 9 Feb 2016 13:10:38 +0000 (+0100) Subject: DVR: implement move between failed and finished in webui, fixes #3556 X-Git-Tag: v4.2.1~1051 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=31e958ca8e9a6f16dfbd4b6079c81bae039b873e;p=thirdparty%2Ftvheadend.git DVR: implement move between failed and finished in webui, fixes #3556 --- diff --git a/src/api/api_dvr.c b/src/api/api_dvr.c index 2b0ee5975..911965468 100644 --- a/src/api/api_dvr.c +++ b/src/api/api_dvr.c @@ -321,6 +321,32 @@ api_dvr_entry_cancel return api_idnode_handler(perm, args, resp, api_dvr_cancel, "cancel"); } +static void +api_dvr_move_finished(access_t *perm, idnode_t *self) +{ + dvr_entry_move((dvr_entry_t *)self, 0); +} + +static int +api_dvr_entry_move_finished + ( access_t *perm, void *opaque, const char *op, htsmsg_t *args, htsmsg_t **resp ) +{ + return api_idnode_handler(perm, args, resp, api_dvr_move_finished, "move finished"); +} + +static void +api_dvr_move_failed(access_t *perm, idnode_t *self) +{ + dvr_entry_move((dvr_entry_t *)self, 1); +} + +static int +api_dvr_entry_move_failed + ( access_t *perm, void *opaque, const char *op, htsmsg_t *args, htsmsg_t **resp ) +{ + return api_idnode_handler(perm, args, resp, api_dvr_move_failed, "move failed"); +} + static void api_dvr_autorec_grid ( access_t *perm, idnode_set_t *ins, api_idnode_grid_conf_t *conf, htsmsg_t *args ) @@ -471,6 +497,8 @@ void api_dvr_init ( void ) { "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 }, + { "dvr/entry/move/finished", ACCESS_RECORDER, api_dvr_entry_move_finished, NULL }, + { "dvr/entry/move/failed", ACCESS_RECORDER, api_dvr_entry_move_failed, NULL }, { "dvr/autorec/class", ACCESS_RECORDER, api_idnode_class, (void*)&dvr_autorec_entry_class }, { "dvr/autorec/grid", ACCESS_RECORDER, api_idnode_grid, api_dvr_autorec_grid }, diff --git a/src/dvr/dvr.h b/src/dvr/dvr.h index e8caa1a54..4d66b6889 100644 --- a/src/dvr/dvr.h +++ b/src/dvr/dvr.h @@ -573,6 +573,8 @@ int64_t dvr_entry_claenup(dvr_entry_t *de, int64_t requiredBytes); void dvr_entry_set_rerecord(dvr_entry_t *de, int cmd); +void dvr_entry_move(dvr_entry_t *de, int failed); + 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 95c437b6e..36e3701eb 100644 --- a/src/dvr/dvr_db.c +++ b/src/dvr/dvr_db.c @@ -3396,6 +3396,16 @@ dvr_entry_set_rerecord(dvr_entry_t *de, int cmd) } } +/** + * + */ +void +dvr_entry_move(dvr_entry_t *de, int failed) +{ + if(de->de_sched_state == DVR_COMPLETED) + dvr_entry_completed(de, failed ? SM_CODE_USER_REQUEST : SM_CODE_OK); +} + /** * */ diff --git a/src/streaming.c b/src/streaming.c index 2702ff328..319e92473 100644 --- a/src/streaming.c +++ b/src/streaming.c @@ -424,6 +424,8 @@ streaming_code2txt(int code) return N_("User limit reached"); case SM_CODE_WEAK_STREAM: return N_("Weak stream"); + case SM_CODE_USER_REQUEST: + return N_("User request"); case SM_CODE_NO_FREE_ADAPTER: return N_("No free adapter"); diff --git a/src/tvheadend.h b/src/tvheadend.h index f69f6f7c7..b1ae554ab 100644 --- a/src/tvheadend.h +++ b/src/tvheadend.h @@ -482,6 +482,7 @@ typedef enum { #define SM_CODE_USER_ACCESS 105 #define SM_CODE_USER_LIMIT 106 #define SM_CODE_WEAK_STREAM 107 +#define SM_CODE_USER_REQUEST 108 #define SM_CODE_NO_FREE_ADAPTER 200 #define SM_CODE_MUX_NOT_ENABLED 201 diff --git a/src/webui/static/app/dvr.js b/src/webui/static/app/dvr.js index 461ddcfcf..1ad2c975e 100644 --- a/src/webui/static/app/dvr.js +++ b/src/webui/static/app/dvr.js @@ -368,11 +368,41 @@ tvheadend.dvr_finished = function(panel, index) { } }; + var moveButton = { + name: 'move', + builder: function() { + return new Ext.Toolbar.Button({ + tooltip: _('Mark the selected recording as failed'), + iconCls: 'movetofailed', + text: _('Move to failed'), + 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/move/failed', + 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); + abuttons.move.setDisabled(!b); } tvheadend.idnode_grid(panel, { @@ -414,7 +444,7 @@ tvheadend.dvr_finished = function(panel, index) { '?title=' + encodeURIComponent(title) + '">' + _('Play') + ''; } }], - tbar: [downloadButton, rerecordButton], + tbar: [downloadButton, rerecordButton, moveButton], selected: selected, help: function() { new tvheadend.help(_('DVR - Finished Recordings'), 'dvr_finished.html'); @@ -479,11 +509,41 @@ tvheadend.dvr_failed = function(panel, index) { } }; + var moveButton = { + name: 'move', + builder: function() { + return new Ext.Toolbar.Button({ + tooltip: _('Mark the selected recording as finished'), + iconCls: 'movetofinished', + text: _('Move to finished'), + 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/move/finished', + 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); + abuttons.move.setDisabled(r.length <= 0); } tvheadend.idnode_grid(panel, { @@ -525,7 +585,7 @@ tvheadend.dvr_failed = function(panel, index) { '?title=' + encodeURIComponent(title) + '">' + _('Play') + ''; } }], - tbar: [downloadButton, rerecordButton], + tbar: [downloadButton, rerecordButton, moveButton], 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 67816ebe3..3f322a366 100644 --- a/src/webui/static/app/ext.css +++ b/src/webui/static/app/ext.css @@ -600,6 +600,14 @@ background-image: url(../icons/accept.png) !important; } +.movetofinished { + background-image: url(../icons/accept.png) !important; +} + +.movetofailed { + background-image: url(../icons/exclamation.png) !important; +} + .x-linked { display: inline-block; background-image: url(../icons/linked.gif) !important;