int dqr_alloced;
} dvr_query_result_t;
+typedef int (dvr_entry_filter)(dvr_entry_t *entry);
+
void dvr_query(dvr_query_result_t *dqr);
+void dvr_query_filter(dvr_query_result_t *dqr, dvr_entry_filter filter);
void dvr_query_free(dvr_query_result_t *dqr);
void dvr_query_sort(dvr_query_result_t *dqr);
dqr->dqr_array[dqr->dqr_entries++] = de;
}
-
-/**
- *
- */
void
-dvr_query(dvr_query_result_t *dqr)
+dvr_query_filter(dvr_query_result_t *dqr, dvr_entry_filter filter)
{
dvr_entry_t *de;
memset(dqr, 0, sizeof(dvr_query_result_t));
LIST_FOREACH(de, &dvrentries, de_global_link)
- dvr_query_add_entry(dqr, de);
+ if (filter(de))
+ dvr_query_add_entry(dqr, de);
+}
+
+static int all_filter(dvr_entry_t *entry)
+{
+ return 1;
}
+/**
+ *
+ */
+void
+dvr_query(dvr_query_result_t *dqr)
+{
+ return dvr_query_filter(dqr, all_filter);
+}
/**
*
*
*/
static int
-extjs_dvrlist(http_connection_t *hc, const char *remain, void *opaque)
+extjs_dvrlist(http_connection_t *hc, const char *remain, void *opaque, dvr_entry_filter filter)
{
htsbuf_queue_t *hq = &hc->hc_reply;
htsmsg_t *out, *array, *m;
array = htsmsg_create_list();
- dvr_query(&dqr);
+ dvr_query_filter(&dqr, filter);
dvr_query_sort(&dqr);
return 0;
}
+static int is_dvr_entry_old(dvr_entry_t *entry)
+{
+ dvr_entry_sched_state_t state = entry->de_sched_state;
+ switch (state) {
+ case DVR_COMPLETED: return 1;
+ case DVR_MISSED_TIME: return 1;
+ default: return 0;
+ }
+}
+
+static int is_dvr_entry_new(dvr_entry_t *entry)
+{
+ return !is_dvr_entry_old(entry);
+}
+
+static int
+extjs_dvrlist_old(http_connection_t *hc, const char *remain, void *opaque)
+{
+ return extjs_dvrlist(hc, remain, opaque, is_dvr_entry_old);
+}
+
+static int
+extjs_dvrlist_new(http_connection_t *hc, const char *remain, void *opaque)
+{
+ return extjs_dvrlist(hc, remain, opaque, is_dvr_entry_new);
+}
/**
*
http_path_add("/epgrelated", NULL, extjs_epgrelated, ACCESS_WEB_INTERFACE);
http_path_add("/epgobject", NULL, extjs_epgobject, ACCESS_WEB_INTERFACE);
http_path_add("/dvr", NULL, extjs_dvr, ACCESS_WEB_INTERFACE);
- http_path_add("/dvrlist", NULL, extjs_dvrlist, ACCESS_WEB_INTERFACE);
+ http_path_add("/dvrlist_new", NULL, extjs_dvrlist_new, ACCESS_WEB_INTERFACE);
+ http_path_add("/dvrlist_old", NULL, extjs_dvrlist_old, ACCESS_WEB_INTERFACE);
http_path_add("/subscriptions", NULL, extjs_subscriptions, ACCESS_WEB_INTERFACE);
http_path_add("/ecglist", NULL, extjs_ecglist, ACCESS_WEB_INTERFACE);
http_path_add("/config", NULL, extjs_config, ACCESS_WEB_INTERFACE);
/**
*
*/
-tvheadend.dvrschedule = function() {
+tvheadend.dvrschedule = function(title, dvrStore) {
var actions = new Ext.ux.grid.RowActions({
header : '',
loadMask : true,
stripeRows : true,
disableSelection : true,
- title : 'Recorder schedule',
+ title : title,
iconCls : 'clock',
- store : tvheadend.dvrStore,
+ store : dvrStore,
cm : dvrCm,
plugins : [ actions ],
viewConfig : {
}
} ],
bbar : new Ext.PagingToolbar({
- store : tvheadend.dvrStore,
+ store : dvrStore,
pageSize : 20,
displayInfo : true,
displayMsg : 'Programs {0} - {1} of {2}',
*/
tvheadend.dvr = function() {
- tvheadend.dvrStore = new Ext.data.JsonStore({
+ function datastoreBuilder(url) {
+ return new Ext.data.JsonStore({
root : 'entries',
totalProperty : 'totalCount',
fields : [ {
}, {
name : 'url'
} ],
- url : 'dvrlist',
+ url : url,
autoLoad : true,
id : 'id',
remoteSort : true
- });
+ });
+ }
+ tvheadend.dvrStoreNew = datastoreBuilder('dvrlist_new');
+ tvheadend.dvrStoreOld = datastoreBuilder('dvrlist_old');
+
+
+ function updateDvrStore(store, r, m) {
+ r.data.status = m.status;
+ r.data.schedstate = m.schedstate;
+
+ store.afterEdit(r);
+ store.fireEvent('updated', store, r,
+ Ext.data.Record.COMMIT);
+ }
tvheadend.comet.on('dvrdb', function(m) {
- if (m.reload != null) tvheadend.dvrStore.reload();
+ if (m.reload != null) {
+ tvheadend.dvrStoreOld.reload();
+ tvheadend.dvrStoreNew.reload();
+ }
if (m.updateEntry != null) {
- r = tvheadend.dvrStore.getById(m.id)
- if (typeof r === 'undefined') {
- tvheadend.dvrStore.reload();
+ r = tvheadend.dvrStoreNew.getById(m.id);
+ if (typeof r !== 'undefined') {
+ updateDvrStore(tvheadend.dvrStoreNew, r, m);
return;
}
- r.data.status = m.status;
- r.data.schedstate = m.schedstate;
-
- tvheadend.dvrStore.afterEdit(r);
- tvheadend.dvrStore.fireEvent('updated', tvheadend.dvrStore, r,
- Ext.data.Record.COMMIT);
+ r = tvheadend.dvrStoreOld.getById(m.id);
+ if (typeof r === 'undefined') {
+ updateDvrStore(tvheadend.dvrStoreOld, r, m);
+ return;
+ }
+
+ tvheadend.dvrStoreNew.reload();
+ tvheadend.dvrStoreOld.reload();
}
});
autoScroll : true,
title : 'Digital Video Recorder',
iconCls : 'drive',
- items : [ new tvheadend.dvrschedule, new tvheadend.autoreceditor ]
+ items : [ new tvheadend.dvrschedule('Finished recordings', tvheadend.dvrStoreOld),
+ new tvheadend.dvrschedule('Recorder schedule', tvheadend.dvrStoreNew),
+ new tvheadend.autoreceditor
+ ]
});
return panel;
}