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)
{
{ "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 },
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);
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";
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);
+ }
+}
+
/**
*
*/
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();
else
dvr_entry_rerecord(parent);
}
+
+ return de;
}
/**
}
};
+ 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, {
'?title=' + encodeURIComponent(title) + '">' + _('Play') + '</a>';
}
}],
- tbar: [downloadButton],
+ tbar: [downloadButton, rerecordButton],
selected: selected,
help: function() {
new tvheadend.help(_('DVR - Finished Recordings'), 'dvr_finished.html');
}
};
+ 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, {
'?title=' + encodeURIComponent(title) + '">' + _('Play') + '</a>';
}
}],
- tbar: [downloadButton],
+ tbar: [downloadButton, rerecordButton],
selected: selected,
help: function() {
new tvheadend.help(_('DVR - Failed Recordings'), 'dvr_failed.html');
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;
}