]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
DVR: implement move between failed and finished in webui, fixes #3556
authorJaroslav Kysela <perex@perex.cz>
Tue, 9 Feb 2016 13:10:38 +0000 (14:10 +0100)
committerJaroslav Kysela <perex@perex.cz>
Tue, 9 Feb 2016 13:10:38 +0000 (14:10 +0100)
src/api/api_dvr.c
src/dvr/dvr.h
src/dvr/dvr_db.c
src/streaming.c
src/tvheadend.h
src/webui/static/app/dvr.js
src/webui/static/app/ext.css

index 2b0ee597597993e8bfef9adbb7bd0b4584e65765..911965468418c5be34c99ef65df99bf5efa0790b 100644 (file)
@@ -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 },
index e8caa1a54aad16c93404097f6f142676d2497852..4d66b6889ce2521ebef998700d86b9023b8c9954 100644 (file)
@@ -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);
index 95c437b6ea2d0c4cdfa2b8acc7411a390ecee6fb..36e3701eb00caebe25bd67dbb13a0ebc98ee630b 100644 (file)
@@ -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);
+}
+
 /**
  *
  */
index 2702ff32847fef21b3601bbb688f19a92af227a7..319e92473eb80f0c15fa1f6fb9bb6a234f0a3af1 100644 (file)
@@ -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");
index f69f6f7c759011f97453b127cf0c33fa7f64a69a..b1ae554ab67a4584d3dbc49e4e28ccc52865d96b 100644 (file)
@@ -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
index 461ddcfcf0179bed990d9c649b71993e6eba7c5b..1ad2c975e9cf508334894a3eb46ad9531e85b050 100644 (file)
@@ -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') + '</a>';
                 }
             }],
-        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') + '</a>';
                 }
             }],
-        tbar: [downloadButton, rerecordButton],
+        tbar: [downloadButton, rerecordButton, moveButton],
         selected: selected,
         help: function() {
             new tvheadend.help(_('DVR - Failed Recordings'), 'dvr_failed.html');
index 67816ebe371929aea17d722e96f454077298f46d..3f322a366e7d8d92ec2fe86665d80c5a48fad504 100644 (file)
     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;