]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
DVR: added re-record button to webui, fixes #3203
authorJaroslav Kysela <perex@perex.cz>
Mon, 26 Oct 2015 20:28:49 +0000 (21:28 +0100)
committerJaroslav Kysela <perex@perex.cz>
Mon, 26 Oct 2015 20:28:49 +0000 (21:28 +0100)
src/api/api_dvr.c
src/dvr/dvr.h
src/dvr/dvr_db.c
src/webui/static/app/dvr.js
src/webui/static/app/ext.css

index 6586cd22bd0ac2351d58730554df16fc88027db6..bfd2aef820cf6d9846acca4b286add977c9df309 100644 (file)
@@ -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 },
 
index 90e46bc9b5a629d9d0e0a162c2a399f59b5158f1..e1c2f289d1a00e3f0a398ecc2808617f620b2118 100644 (file)
@@ -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);
index c64b531728659c1b7138440f77f1d81fd6f563d6..fc18735bc8f1f75577fa8b0d46582c4aaad7dcda 100644 (file)
@@ -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;
 }
 
 /**
index 67757a44bdd208b45e0ad3f387990b9ec42c6f90..3de06541bf2d317c36f3d30ab81a828ba4dfb3ca 100644 (file)
@@ -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') + '</a>';
                 }
             }],
-        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') + '</a>';
                 }
             }],
-        tbar: [downloadButton],
+        tbar: [downloadButton, rerecordButton],
         selected: selected,
         help: function() {
             new tvheadend.help(_('DVR - Failed Recordings'), 'dvr_failed.html');
index d365c334e1fb41d8265ae0db55d3037632f6bd5c..eb9d083e07b95b53f01c0579a2fbbd6f531d55a2 100644 (file)
     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;
 }